home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / misc / emu / AROSdev.lha / AROS / docs / html / filesystems.doc < prev    next >
Text File  |  1996-11-18  |  10KB  |  389 lines

  1.         the AROS filesystem interface
  2.         -----------------------------
  3.  
  4. Normally you don't have to care about the interface between DOS and
  5. the filesystem code because everything that can be done with direct
  6. interface methods can easily be done with simple DOS calls.
  7. Nevertheless as soon as you want to write your own FS you will need to
  8. know how to do it.
  9. The AROS filesystem interface is different from the normal AmigaOS
  10. filesystem interface in many respects:
  11. * filesystems are exec devices not process's message ports - it's possible
  12.   to do the work on the callers schedule. This helps save context switches
  13.   and is a cheap and simple way to multithread the FS. Another side effect
  14.   is that the new FS interface includes a method to abort a request (an
  15.   important feature for network interfacing).
  16. * There is no difference between locks and filehandles anymore. This avoids
  17.   redundant methods like e.g ACTION_FH_FROM_LOCK.
  18. * There are only C pointers and strings, no BCPL stuff. As as side effect
  19.   there is no limit on the size of strings any more.
  20. The disadvantage is that it's simply incompatible to the old one. OTOH
  21. since you don't _have_ to use it for normal application programming this
  22. incompatibility can be avoided easily.
  23.  
  24. AROS filesystems are like exec devices, i.e. they are used with the normal
  25. exec.library functions for devices (DoIO(), BeginIO(), AbortIO()). The
  26. I/O request structure is defined in dos/filesystem.h:
  27.  
  28. struct IORequest
  29. {
  30.     struct Message io_Message;
  31.     struct Device *io_Device;/* Filesystem base pointer */
  32.     struct Unit *io_Unit;    /* File- or directory handle */
  33.     UWORD io_Command;    /* Action to do */
  34.     UBYTE io_Flags;        /* e.g. IOF_QUICK */
  35.     BYTE io_Error;        /* unused - replaced by the io_DosError
  36.                    field below because the DOS error codes
  37.                    go beyond the -128..127 range */
  38. };
  39.  
  40. struct IOFileSys
  41. {
  42.     struct IORequest IOFS;
  43.     LONG io_DosError;    /* replacement for io_Error */
  44.     IPTR io_Args[4];    /* Parameters (see rest of this file) */
  45. };
  46.  
  47. NAME
  48.     OpenDevice("*.handler",0,iorequest,0)
  49.  
  50. FUNCTION
  51.     Mount a new filesystem. The I/O request given to OpenDevice()
  52.     contains the information needed by the FS. If there are any
  53.     volumes in the mounted drive the FS is allowed to add the
  54.     required volume nodes to the DOS list before returning to the
  55.     caller, i.e. the DOS list must not be locked (the device loader
  56.     demon will need a free DOS list anyway so this is no real
  57.     restriction). The device node must not be handled by the
  58.     FS - this is the responsibility of the caller. All the FS has
  59.     to do is to return a handle to the drive in the io_Unit field.
  60.     The io_Error field must be set to a useful value so that exec
  61.     knows whether the filesystem was opened successfully.
  62.  
  63. INPUT
  64.     io_Args[0]    name of the exec device to mount the filesystem on
  65.     io_Args[1]    Unit number for the exec device
  66.     io_Args[2]    dos environment vector
  67.  
  68. RESULT
  69.     io_Device    device base pointer
  70.     io_Unit        logical device handle
  71.     io_Error    IOERR_OPENFAIL or 0
  72.     io_DosError    dos error code or 0
  73.  
  74. NAME
  75.     CloseDevice(iorequest)
  76.  
  77. FUNCTION
  78.     Try to dismount dos device. If there are any unused volumes in
  79.     the mounted drive the filesystem has to remove them from the DOS
  80.     list, i.e. the DOS list must not be locked. The device node must
  81.     not be handled by the FS - this is the caller's responsibility.
  82.     If the dismount fails (e.g. if there were any locks on a mounted
  83.     volume) the device will still be opened.
  84.  
  85. INPUT
  86.     io_Unit        logical device handle
  87.  
  88. RESULT
  89.     io_DosError    dos error code or 0
  90.  
  91. NAME
  92.     FSA_OPEN
  93.  
  94. FUNCTION
  95.     Build a handle to an already existing file or directory.
  96.     Handles may be used to read directories and to read or write
  97.     files.
  98.  
  99. INPUT
  100.     io_Unit        handle to current directory
  101.     io_Args[0]    relative file- or directoryname
  102.     io_Args[1]    mode    FMF_LOCK    - lock exclusively
  103.                 FMF_READ    - open for reading
  104.                 FMF_WRITE   - open for writing
  105.                 FMF_EXECUTE - open to execute
  106.  
  107. RESULT
  108.     io_Unit        freshly created handle
  109.     io_DosError    one of the dos error codes or 0
  110.  
  111. NAME
  112.     FSA_OPEN_FILE
  113.  
  114. FUNCTION
  115.     Open an old file or create a new one and return a handle on it.
  116.     Works only on files - directories will be refused.
  117.  
  118. INPUT
  119.     io_Unit        handle to current directory
  120.     io_Args[0]    relative filename
  121.     io_Args[1]    mode    FMF_LOCK    - lock exclusively
  122.                 FMF_READ    - open for reading
  123.                 FMF_WRITE   - open for writing
  124.                 FMF_EXECUTE - open to execute
  125.                 FMF_CREATE  - create file if it doesn't exist
  126.                 FMF_CLEAR   - delete file before opening
  127.                 FMF_RAW     - open cooked console in raw
  128.                           mode (and vice versa)
  129.  
  130. RESULT
  131.     io_Unit        freshly created filehandle
  132.     io_DosError    one of the dos error codes or 0
  133.  
  134. NAME
  135.     FSA_READ
  136.  
  137. FUNCTION
  138.     Try to read the requested number of bytes from the filehandle.
  139.     Normally a handler will try to fulfill the request completely
  140.     but special handlers such as console windows may return less
  141.     than the requested number of bytes.
  142.  
  143. INPUT
  144.     io_Unit        filehandle
  145.     io_Args[0]    pointer to byte buffer
  146.     io_Args[1]    number of bytes to read from the file
  147.  
  148. RESULT
  149.     io_Args[1]    number of bytes read
  150.     io_DosError    one of the dos error codes or 0
  151.  
  152. NAME
  153.     FSA_WRITE
  154.  
  155. FUNCTION
  156.     Try to write the requested number of bytes to the filehandle.
  157.     Normally a handler will try to fulfill the request completely
  158.     but special handlers may write less than the requested number
  159.     of bytes.
  160.  
  161. INPUT
  162.     io_Unit        filehandle
  163.     io_Args[0]    pointer to byte buffer
  164.     io_Args[1]    number of bytes to write to the file
  165.  
  166. RESULT
  167.     io_Args[1]    number of bytes written
  168.     io_DosError    one of the dos error codes or 0
  169.  
  170. NAME
  171.     FSA_SEEK
  172.  
  173. FUNCTION
  174.     Read and change the actual position in the file.
  175.  
  176. INPUT
  177.     io_Unit        filehandle
  178.     io_Args[0]    upper half of offset
  179.     io_Args[1]    lower half of offset
  180.     io_Args[2]    mode    OFFSET_BEGINNING - offset is relative to the
  181.                            start of the file
  182.                 OFFSET_CURRENT   - offset is relative to the
  183.                            current position
  184.                 OFFSET_END       - offset is relative to the
  185.                            end of the file
  186.  
  187. RESULT
  188.     io_Args[0]    upper half of old position
  189.     io_Args[1]    lower half of old position
  190.     io_DosError    one of the dos error codes or 0
  191.  
  192. NAME
  193.     FSA_CLOSE
  194.  
  195. FUNCTION
  196.     Close a file- or directory handle.
  197.  
  198. INPUT
  199.     io_Unit        handle to file or directory
  200.  
  201. RESULT
  202.     io_DosError    0
  203.  
  204. NAME
  205.     FSA_EXAMINE
  206.  
  207. FUNCTION
  208.     Get information about the current object, i.e. name, protection
  209.     bits, etc.
  210.  
  211. INPUT
  212.     io_Unit        handle to file or directory
  213.     io_Args[0]    struct ExAllData buffer to be filled
  214.     io_Args[1]    size of the buffer in bytes
  215.     io_Args[2]    type of information to get
  216.  
  217. RESULT
  218.     io_DosError    one of the dos error codes or 0
  219.  
  220. NAME
  221.     FSA_EXAMINE_ALL
  222.  
  223. FUNCTION
  224.     Read the current directory. The bigger the buffer the more entries
  225.     can be read at once. The last entry has a ed_Next field of NULL.
  226.     If io_DosError is !=0 the contents of the buffer are undefined.
  227.  
  228. INPUT
  229.     io_Unit        handle to directory
  230.     io_Args[0]    struct ExAllData buffer to be filled
  231.     io_Args[1]    size of the buffer in bytes
  232.     io_Args[2]    type of information to get
  233.  
  234. RESULT
  235.     io_DosError    one of the dos error codes or 0
  236.  
  237. NAME
  238.     FSA_CREATE_DIR
  239.  
  240. FUNCTION
  241.     Create a new directory lock it and return a handle to it.
  242.  
  243. INPUT
  244.     io_Unit        handle to current directory
  245.     io_Args[0]    relative name of the directory to create
  246.     io_Args[1]    protection flags for the new directory
  247.  
  248. RESULT
  249.     io_Unit        handle to new directory
  250.     io_DosError    one of the dos error codes or 0
  251.  
  252. NAME
  253.     FSA_DELETE_OBJECT
  254.  
  255. FUNCTION
  256.     Delete a given file or directory. Directories must be empty
  257.     to be deleted. Objects with an open handle on them may not
  258.     be deleted either
  259.  
  260. INPUT
  261.     io_Unit        handle to current directory
  262.     io_Args[0]    relative filename
  263.  
  264. RESULT
  265.     io_DosError    one of the dos error codes or 0
  266.  
  267. NAME
  268.     FSA_SET_PROTECT
  269.  
  270. FUNCTION
  271.     Set protection bits for a certain file or directory.
  272.  
  273. INPUT
  274.     io_Unit        handle to current directory
  275.     io_Args[0]    relative filename
  276.     io_Args[1]    new protection bits
  277.  
  278. RESULT
  279.     io_DosError    one of the dos error codes or 0
  280.  
  281. NAME
  282.     FSA_SET_OWNER
  283.  
  284. FUNCTION
  285.     Set owner and group for the file or directory.
  286.  
  287. INPUT
  288.     io_Unit        handle to current directory
  289.     io_Args[0]    relative filename
  290.     io_Args[1]    new user ID
  291.     io_Args[2]    new group ID
  292.  
  293. RESULT
  294.     io_DosError    one of the dos error codes or 0
  295.  
  296. NAME
  297.     FSA_SET_DATE
  298.  
  299. FUNCTION
  300.     Set modification date of the file or directory.
  301.  
  302. INPUT
  303.     io_Unit        handle to current directory
  304.     io_Args[0]    relative filename
  305.     io_Args[1]    days since 1 jan 1978
  306.     io_Args[2]    mins since midnight
  307.     io_Args[3]    ticks since the last full minute
  308.  
  309. RESULT
  310.     io_DosError    one of the dos error codes or 0
  311.  
  312. NAME
  313.     FSA_SET_COMMENT
  314.  
  315. FUNCTION
  316.     Set a new comment for the file or directory.
  317.  
  318. INPUT
  319.     io_Unit        handle to current directory
  320.     io_Args[0]    relative filename
  321.     io_Args[1]    comment or NULL
  322.  
  323. RESULT
  324.     io_DosError    one of the dos error codes or 0
  325.  
  326. NAME
  327.     FSA_SET_FILE_SIZE
  328.  
  329. FUNCTION
  330.     Change the size of the file.
  331.  
  332. INPUT
  333.     io_Unit        filehandle
  334.     io_Args[0]    upper half of offset
  335.     io_Args[1]    lower half of offset
  336.     io_Args[2]    mode    OFFSET_BEGINNING - offset is relative to the
  337.                            start of the file
  338.                 OFFSET_CURRENT   - offset is relative to the
  339.                            current position
  340.                 OFFSET_END       - offset is relative to the
  341.                            end of the file
  342.  
  343. RESULT
  344.     io_DosError    one of the dos error codes or 0
  345.  
  346.   FSA_FILE_MODE
  347.     Change or read the mode of a single filehandle
  348.     Unit *current; filehandle to change
  349.     ULONG newmode; new mode/old mode on return
  350.     ULONG mask;    bits affected
  351.  
  352.   FSA_MOUNT_MODE
  353.     Change or read the mode of the filesystem
  354.     Unit *current; filesystem to change
  355.     ULONG newmode; new mode/old mode on return
  356.     ULONG mask;    bits affected
  357.     STRPTR passwd; password for MMF_LOCKED
  358.  
  359.   FSA_MAKE_HARDLINK
  360.     Create a hard link on a file, directory or soft link
  361.     Unit *current; current directory
  362.     STRPTR name;   hardlink name
  363.     Unit *target;  target handle
  364.  
  365.   FSA_MAKE_SOFTLINK
  366.     Create a soft link to another object
  367.     Unit *current; current directory
  368.     STRPTR name;   softlink name
  369.     STRPTR target; target name
  370.  
  371.   FSA_RENAME
  372.   FSA_READ_LINK
  373.   FSA_DISK_INFO
  374.   FSA_SERIALIZE_DISK
  375.   FSA_WAIT_CHAR
  376.   FSA_INFO
  377.   FSA_TIMER
  378.   FSA_DISK_TYPE
  379.   FSA_DISK_CHANGE
  380.   FSA_SAME_LOCK
  381.   FSA_CHANGE_SIGNAL
  382.   FSA_FORMAT
  383.   FSA_IS_FILESYSTEM
  384.   FSA_EXAMINE_ALL
  385.   FSA_EXAMINE_FH
  386.   FSA_ADD_NOTIFY
  387.   FSA_REMOVE_NOTIFY
  388.   FSA_EXAMINE_ALL_END
  389.