|
|
1.1 root 1: This is documentation for the dmsdos library. 22Apr1998
2:
3:
4: The dmsdos library, libdmsdos.a, provides the dmsdos interface that is known
5: from the kernel to a user-level process. This is acchieved by compiling the
6: dmsdos code simply in a different way (well, with some rather dirty tricks).
7:
8: The library is intended to export the following functions:
9:
10: open_cvf
11: close_cvf
12:
13: Well, these two ones above are new, but the rest should be well known to
14: you:
15:
16: dbl_bitfat_value
17: dbl_fat_nextcluster
18: dbl_mdfat_value
19: dmsdos_read_cluster
20: dmsdos_write_cluster
21: raw_bread
22: raw_brelse
23: raw_getblk
24: raw_mark_buffer_dirty
25: raw_set_uptodate
26: simple_check
27: stac_bitfat_state
28:
29: In fact, it exports much more, but only these listed here are guaranteed
30: to be kept in future versions. Well, one thing should be important to know:
31: The library does NOT export virtual sector management. It will never do.
32:
33: The functions are just used like in the kernel. For prototypes, see file
34: dmsdos.h. How to use them see the sources. :) Seriously, if you aren't
35: a dmsdos hacker forget about the library.
36:
37: The first two, open_cvf and close_cvf, are special. They are called instead
38: of mounting and unmounting the CVF.
39:
40: How to "mount" a CVF (example code):
41:
42: struct super_block*sb;
43: sb=open_cvf("CVF_Filename",rwflag /*0=RDONLY or 1=RDWR*/);
44: if(sb==NULL)
45: { fprintf(stderr,"open CVF failed\n");
46: exit(1);
47: }
48:
49: Keep the sb pointer. It must be passed to a lot of functions. It can be used
50: in the same way as in the kernel. The sb pointer is used to distinguish
51: between several open CVFs (in fact, in sb->s_dev the file descriptor is
52: stored).
53:
54: After use, the CVF must be "unmounted" again:
55:
56: close_cvf(sb);
57:
58: If you want to see more example code, look at the dcread utility source
59: (file dcread.c in the src directory).
60:
61: Notes:
62: * The user-level functions are single-threaded. You cannot run several
63: processes on the same CVF unless all are only reading. The library
64: uses flock in order to detect such situations and just denies access
65: in that case. You can however use different CVFs in parallel, even
66: read-write, even in one program.
67: * You should use this library only to access a CVF that is currently not
68: mounted. You *cannot* use it on a CVF that is mounted read-write. If
69: the CVF is currently mounted read-only, the library allows read-only
70: access to the CVF. The library scans /etc/mtab in order to check this.
71: This check is not perfect, though. It also does not prevent mount
72: from mounting a CVF that is used by the library. So just be careful.
73: * You must not touch CVFs that are currently used by dosemu with
74: wholedisk or partition access. I don't know how to test for that
75: situation, so the library doesn't check for this. Well, as dosemu
76: refuses to run if the underlying dos partition is mounted, that
77: situation should never occur :)
78: * If you do not intend to write to the CVF, open it in read-only mode.
79: Then the CVF is not locked exclusively and other processes are allowed
80: to read the CVF at the same time.
81: * The library prints the "kernel" messages to stderr. It obeys the
82: loglevel variable.
83: * The first call of open_cvf initializes the library and prints some
84: version information to stderr.
85: * open_cvf does not do a filesystem check. If you do want the same
86: simple filesystem check that dmsdos usually does when mounting, call
87: simple_check afterwards.
88: * open_cvf may open the filesystem read-only though you request
89: read-write access. This happens if write access is denied or if the
90: dmsdos subsystem detects unexpected problems with the CVF. You may
91: not like this behaviour, but it's best for long life of your CVFs :)
92: Programmers please check sb->s_flags for the MS_RDONLY flag after
93: calling open_cvf to be sure.
94: * To compile your application using the dmsdos library you should under
95: no cirumstances define the macro __KERNEL__ for the whole program.
96: It causes problems with libc6. Just define __KERNEL__ for those
97: include files that don't work without and undefine it afterwards.
98:
99: As an idea what the dmsdos library might be good for:
100:
101: * A mtools clone for CVFs, for example called dtools.
102: * A fsck.dmsdos.
103: * A defragmentation program.
104: * For debugging dmsdos at user level (it's the same source code).
105: * An external fs for midnight commander.
106: * ... add your favourite idea here :)
107:
108: Support for a shared dmsdos library
109: -----------------------------------
110:
111: libdmsdos can now be compiled as a shared library. Just enter a
112: 'make libdmsdos.so' in the src directory. Note that the default installation
113: does not compile the shared library. This is intended. If you are not
114: an experienced shared library hacker please be careful. It's easy to screw
115: up some binaries with shared libraries :)
116:
117: You should not use the dmsdos shared library for now as there's currently no
118: standard that ensures that future versions will be backwards compatible.
119: Link statically with libdmsdos.a unless disk space or memory is very critical.
120:
121: WARNING: If there's a shared dmsdos library lying around, gcc defaults to
122: link *dynamically* all programs that need this library. For example, if
123: libdmsdos.so is present and you recompile dmsdosfsck, the binary will be
124: dynamically linked with that library. This can be very confusing :(
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.