HFS.txt
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:46k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1.   Macintosh HFS Filesystem for Linux
  2.   Paul H. Hargrove, hargrove@sccm.Stanford.EDU
  3.   version 0.95, 28 Apr 1997
  4.   This document describes version 0.95 of the Macintosh HFS filesystem
  5.   for Linux.  The most current versions of this document and the
  6.   software are kept at The HFS for Linux Page
  7.   <http://www-sccm.Stanford.EDU/~hargrove/HFS/>.
  8.   ______________________________________________________________________
  9.   Table of Contents:
  10.   1.      Introduction
  11.   2.      Mounting HFS Filesystems
  12.   2.1.    afpd
  13.   2.2.    case={asis, lower}
  14.   2.3.    conv={auto, binary, text}
  15.   2.4.    creator=cccc
  16.   2.5.    fork={cap, double, netatalk}
  17.   2.6.    gid=n
  18.   2.7.    names={7bit, 8bit, alpha, cap, latin, netatalk, trivial}
  19.   2.8.    part=n
  20.   2.9.    quiet
  21.   2.10.   type=cccc
  22.   2.11.   uid=n
  23.   2.12.   umask=n
  24.   3.      Writing to HFS Filesystems
  25.   3.1.    Writing with fork=cap
  26.   3.2.    Writing with fork=double
  27.   3.3.    Writing with fork=netatalk
  28.   4.      A Guide to Special File Formats
  29.   4.1.    CAP .finderinfo Files
  30.   4.2.    AppleDouble Header Files
  31.   5.      Reporting Bugs
  32.   5.1.    What Goes in a Bug Report
  33.   5.2.    How to Report a Kernel Oops or GPF
  34.   6.      Legal Notices
  35.   6.1.    This Document
  36.   6.2.    The Software
  37.   6.2.1.  The Columbia AppleTalk Package for UNIX
  38.   6.2.2.  Netatalk
  39.   6.3.    Trademarks
  40.   ______________________________________________________________________
  41.   11..  IInnttrroodduuccttiioonn
  42.   This software implements the Macintosh HFS filesystem under Linux.  It
  43.   allows you to read and write HFS filesystems on floppy disks, CDROMs,
  44.   hard drives, ZIP drives, etc.  It is _n_o_t an AppleShare client.
  45.   If you use this software, please send me a note telling of your
  46.   success or failure with it.  Your feedback lets me know that this
  47.   project is not a waste of my time.
  48.   This code is still experimental, so backup anything important before
  49.   you start playing.  I'd like you to know that I've never lost any
  50.   files while using this software, or I would not release it.  However,
  51.   a ``better safe than sorry'' attitude is probably best.
  52.   If, for instance, the buffer cache were to become corrupted you could
  53.   start losing things on other disks.  Because of this, if you get a
  54.   General Protection Fault, or a kernel Oops, I _s_t_r_o_n_g_l_y recommend that
  55.   you reboot before writing any files.
  56.   22..  MMoouunnttiinngg HHFFSS FFiilleessyysstteemmss
  57.   Once you have the HFS filesystem compiled into the kernel or installed
  58.   as a loadable module, you will be able to use hfs as a filesystem type
  59.   option to mount.  For instance, to mount a Macintosh floppy disk on
  60.   the directory /mnt using the default mount options you would execute
  61.   ``mount -t hfs /dev/fd0 /mnt''.
  62.   The remainder of this section describes the several mount options
  63.   available to control how the HFS filesystem is mapped onto a Linux
  64.   filesystem structure.  The values for the multiple-choice options
  65.   (case, conv, fork and names) can be abbreviated by their first
  66.   character.
  67.   22..11..  aaffppdd
  68.   If included in the options, then the behavior of the filesystem is
  69.   changed to make it fully read-write compatible with Netatalk's afpd.
  70.   In this mode you should not use normal user-level tools to modify the
  71.   filesystem, though reading from it is acceptable.  This is because the
  72.   return codes from some system calls are changed to fool afpd.  These
  73.   changes will confuse many user-level tools.  In particular ``rm -r''
  74.   will loop forever.
  75.   This option implies fork=netatalk, which in turn implies
  76.   names=netatalk.  If either of these options are explicitly set to
  77.   something else they will take precedence and will confuse afpd.  The
  78.   quiet option has no effect.  The case= option functions normally, but
  79.   afpd usually does the same thing for you.  The conv= and part= options
  80.   also function normally.
  81.   You will probably want to use the uid=, gid= and umask= mount options.
  82.   Note that because all the files on an HFS filesystem belong to a
  83.   single user and group and have a single umask, the full AppleShare
  84.   permission scheme will not work through Netatalk.
  85.   One additional limitation is that the Desktop database on the disk is
  86.   stored in afpd's format and is separate from any existing database
  87.   maintained by the Finder when the volume is used on a Macintosh.
  88.   Because of this mounting an HFS CDROM across the network to a
  89.   Macintosh may result in applications and documents showing up with
  90.   default application and document icons.  Additionally double clicking
  91.   on a document will fail to start the correct application.  Both of
  92.   these problems can be worked around by copying the application to a
  93.   local disk on the Macintosh.
  94.   This mode is known to be compatible with afpd from Netatalk versions
  95.   1.4b1 and 1.4b2, and known to be incompatible with the afpd from
  96.   version 1.3.3.  As of this writing Netatalk version 1.4 has not yet
  97.   been released.  However, it is expected that this mode will be
  98.   compatible with afpd from Netatalk version 1.4 when it is released.
  99.   22..22..  ccaassee=={{aassiiss,, lloowweerr}}
  100.   default value: asis
  101.   This option determines if Macintosh filenames are presented in their
  102.   original case or in all lowercase.  Filename lookup is always case
  103.   insensitive, so either way foo and Foo refer to the same file but ls
  104.   will list Foo with case=asis, and foo with case=lower.  (Same as for
  105.   the HPFS filesystem.)
  106.      aassiiss
  107.         Filenames are reported in the case they were created with.
  108.      lloowweerr
  109.         Filenames are reported in lowercase.
  110.   22..33..  ccoonnvv=={{aauuttoo,, bbiinnaarryy,, tteexxtt}}
  111.   default value: binary
  112.   This option controls CR<->NL conversion of Macintosh _d_a_t_a _f_o_r_k_s.  Any
  113.   translation takes place only for files accessed with the read() and
  114.   write() system calls (either directly or through the stdio functions).
  115.   Access through mmap() is unaffected.  (Similar to the conv= option for
  116.   the MS-DOS filesystem.)
  117.      aauuttoo
  118.         If the Finder's type for a file is TEXT or ttro, then CR
  119.         characters are converted to NL characters when read, and NL
  120.         characters are converted to CR characters when written.
  121.         Be warned that some Macintosh applications create files with
  122.         type TEXT even though the contents is clearly binary.
  123.      bbiinnaarryy
  124.         No CR<->NL conversion is done.
  125.      tteexxtt
  126.         In all data forks, regardless of the Finder's type for the file,
  127.         CR characters are converted to NL characters when read, and NL
  128.         characters are converted to CR characters when written.
  129.   22..44..  ccrreeaattoorr==cccccccc
  130.   default value: ``????''
  131.   Specifies the 4-character string specifying the Finder's Creator for
  132.   new files.
  133.   22..55..  ffoorrkk=={{ccaapp,, ddoouubbllee,, nneettaattaallkk}}
  134.   default value: cap
  135.   This option determines how resource forks and the Finder's metadata
  136.   are represented within the structure of the Linux filesystem.
  137.      ccaapp
  138.         The scheme used by the Columbia AppleTalk Package's AUFS.
  139.         Associated with each directory are two special directories and a
  140.         metadata file.  The directory ./bar is represented by:
  141.         ..//bbaarr
  142.            The directory itself, containing subdirectories, the data
  143.            forks of files, and the following two special directories.
  144.         ..//bbaarr//..rreessoouurrccee
  145.            A special directory holding resource forks of the files in
  146.            ./bar.
  147.         ..//bbaarr//..ffiinnddeerriinnffoo
  148.            A special directory holding metadata files for the files and
  149.            subdirectories in ./bar.
  150.         ..//..ffiinnddeerriinnffoo//bbaarr
  151.            The metadata file for the directory ./bar.
  152.         The files in a directory are represented as three files:
  153.         ..//ffoooo
  154.            The data fork of the file ./foo.
  155.         ..//..rreessoouurrccee//ffoooo
  156.            The resource fork of the file ./foo.
  157.         ..//..ffiinnddeerriinnffoo//ffoooo
  158.            The metadata file for the file ./foo.
  159.         Additionally, the file .rootinfo in the root directory of the
  160.         HFS filesystem is a metadata file for the root directory.
  161.         Brief documentation on the format of file containing the
  162.         Finder's metadata is included in the section ``A Guide to
  163.         Special File Formats'' in this document.  More detailed
  164.         information is available in the Columbia AppleTalk Package.
  165.      ddoouubbllee
  166.         The ``AppleDouble'' format recommended by Apple.  (Apple's other
  167.         recommended format, ``AppleSingle'', is not yet implemented.)
  168.         Associated with each directory is an AppleDouble ``header
  169.         file''.  The directory ./bar is represented by:
  170.         ..//bbaarr
  171.            The directory itself, containing subdirectories, the data
  172.            forks for files, and the header files for files and
  173.            subdirectories.
  174.         ..//%%bbaarr
  175.            The header file for the directory ./bar, containing the
  176.            Finder's metadata for the directory.
  177.         The files in a directory are represented as two files:
  178.         ..//ffoooo
  179.            The data fork of the file ./foo.
  180.         ..//%%ffoooo
  181.            The header file for the file ./foo, containing the resource
  182.            fork and the Finder's metadata for the file.
  183.         Additionally, the file %RootInfo in the root directory of the
  184.         HFS filesystem is a header file for the root directory.  This is
  185.         not quite the %RootInfo file referred to in the AppleDouble
  186.         specification.
  187.         The header files used in this scheme are version 2 AppleDouble
  188.         header files.  Their format is described briefly in the section
  189.         ``A Guide to Special File Formats'' in this document.  They are
  190.         documented in detail in ``AppleSingle/AppleDouble Formats:
  191.         Developer's Note (9/94)'', available from Apple's Developer
  192.         Services Page <http://devworld.apple.com>.
  193.         Note that the naming convention for the header file can cause
  194.         name conflicts.  For instance, using Apple's 7-bit ASCII name
  195.         conversion (see the names mount option) the name %Desktop could
  196.         be interpreted either as the header file for the file Desktop or
  197.         as the file with 0xDE as the hexadecimal representation of its
  198.         first character, and "sktop" as the remaining 5 characters.  The
  199.         problem arises when both files exist, since only one will be
  200.         accessible.  The behavior of the HFS filesystem in the case of
  201.         such a conflict is undefined, and may change in future releases.
  202.         (If this causes problems for you, please don't report it as a
  203.         bug; I didn't design this ``standard'', Apple did.)
  204.      nneettaattaallkk
  205.         The scheme used by the Netatalk afpd.
  206.         Associated with each directory is a special directory and a
  207.         metadata file.  The directory ./bar is represented by:
  208.         ..//bbaarr
  209.            The directory itself, containing subdirectories, the data
  210.            forks of files, and the following special directory.
  211.         ..//bbaarr//..AApppplleeDDoouubbllee
  212.            A special directory holding AppleDouble header files for
  213.            ./bar and the files it contains, but not for the
  214.            subdirectories it contains.
  215.         ..//bbaarr//..AApppplleeDDoouubbllee//..PPaarreenntt
  216.            The header file for the directory ./bar, containing the
  217.            Finder's metadata for the directory.
  218.         The files in a directory are represented as two files:
  219.         ..//ffoooo
  220.            The data fork of the file ./foo.
  221.         ..//..AApppplleeDDoouubbllee//ffoooo
  222.            The header file for file ./foo, containing the resource fork
  223.            and the Finder's metadata.
  224.         The header files used in this scheme are version 1 AppleDouble
  225.         header files.  They are described briefly in the section ``A
  226.         Guide to Special File Formats'' in this document.  The format is
  227.         documented in detail in the ``Apple II File Type Notes'' under
  228.         the type ``$E0.0002/$E0.0003-AppleDouble'', and in Appendix B of
  229.         the ``A/UX Toolbox: Macintosh ROM Interface'' manual.
  230.   22..66..  ggiidd==nn
  231.   default value: gid of the mounting process
  232.   Specifies the group that owns all files and directories on the
  233.   filesystem.  (Same as for the MS-DOS and HPFS filesystems.)
  234.   22..77..  nnaammeess=={{77bbiitt,, 88bbiitt,, aallpphhaa,, ccaapp,, llaattiinn,, nneettaattaallkk,, ttrriivviiaall}}
  235.   default value: varies as follows
  236.   +o  If the fork option is set to double, then names defaults to alpha.
  237.   +o  If the fork option is set to netatalk, then names defaults to
  238.      netatalk.
  239.   +o  If the fork option is set to cap (or has taken that value by
  240.      default), then names defaults to cap.
  241.   This option determines how to convert between valid Macintosh
  242.   filenames and valid Linux filenames.  The 7bit, 8bit and alpha options
  243.   correspond to Apple's recommended conventions named ``7-bit ASCII'',
  244.   ``8-bit'' and ``7-bit alphanumeric''.
  245.      77bbiitt
  246.         When converting from Macintosh filenames to Linux filenames the
  247.         NULL (0x00), slash (/) and percent (%) characters and the
  248.         extended 8-bit characters (hexadecimal codes 0x80-0xff) are
  249.         replaced by a percent character (%) followed by the two-digit
  250.         hexadecimal code for the character.
  251.         When converting from Linux filenames to Macintosh filenames the
  252.         string "%YZ" is replaced by the character with hexadecimal code
  253.         0xYZ.  If 0xYZ is not a valid hexadecimal number or is the code
  254.         for NULL or colon (:) then the string "%YZ" is unchanged.  A
  255.         colon (:) is replaced by a pipe character (|).
  256.      88bbiitt
  257.         When converting from Macintosh filenames to Linux filenames the
  258.         NULL (0x00), slash (/) and percent (%) characters are replaced
  259.         by a percent character (%) followed by the two-digit hexadecimal
  260.         code for the character.
  261.         When converting from Linux filenames to Macintosh filenames the
  262.         string "%YZ" is replaced by the character with hexadecimal code
  263.         0xYZ.  If 0xYZ is not a valid hexadecimal number or is the code
  264.         for NULL or colon (:) then the string "%YZ" is unchanged.  A
  265.         colon (:) is replaced by a pipe character (|).
  266.      aallpphhaa
  267.         When converting from Macintosh filenames to Linux filenames only
  268.         the alphanumeric characters (a-z, A-Z and 0-9), the underscore
  269.         (_) and the last period (.) in the filename are unchanged.  The
  270.         remaining characters are replaced by a percent character (%)
  271.         followed by the two-digit hexadecimal code for the character.
  272.         When converting from Linux filenames to Macintosh filenames the
  273.         string "%YZ" is replaced by the character with hexadecimal code
  274.         0xYZ.  If 0xYZ is not a valid hexadecimal number or is the code
  275.         for NULL or colon (:) then the string "%YZ" is unchanged.  A
  276.         colon (:) is replaced by a pipe character (|).
  277.      ccaapp
  278.         The convention used by the Columbia AppleTalk Package's AUFS.
  279.         When converting from Macintosh filenames to Linux filenames the
  280.         characters from space ( ) through tilde (~) (ASCII 32-126) are
  281.         unchanged, with the exception of slash (/).  The slash (/) and
  282.         all characters outside the range 32-126 are replaced by a colon
  283.         (:) followed by the two-digit hexadecimal code for the
  284.         character.
  285.         When converting from Linux filenames to Macintosh filenames the
  286.         string ":YZ" is replaced by the character with hexadecimal code
  287.         0xYZ.  If 0xYZ is not a valid hexadecimal number or is the code
  288.         for NULL or colon (:) then the colon is replaced by a pipe
  289.         character (|).
  290.      llaattiinn
  291.         When converting from Macintosh filenames to Linux filenames the
  292.         characters from space ( ) through tilde (~) (ASCII 32-126) are
  293.         unchanged, with the exception of slash (/) and percent (%).  The
  294.         extended 8-bit Macintosh characters with equivalents in the
  295.         Latin-1 character set are replaced by those equivalents.  The
  296.         remaining characters are replaced by a percent character (%)
  297.         followed by the two-digit hexadecimal code for the character.
  298.         When converting from Linux filenames to Macintosh filenames the
  299.         string "%YZ" is replaced by the character with hexadecimal code
  300.         0xYZ.  If 0xYZ is not a valid hexadecimal number or is the code
  301.         for NULL or colon (:) then the string "%YZ" is unchanged. The
  302.         Latin-1 characters with equivalents in the extended 8-bit
  303.         Macintosh character set are replaced by those equivalents.  A
  304.         colon (:) is replaced by a pipe character (|).
  305.         Thanks to Holger Schemel (aeglos@valinor.owl.de) for
  306.         contributing this conversion mode.
  307.      nneettaattaallkk
  308.         The convention used by the Netatalk afpd.
  309.         When converting from Macintosh filenames to Linux filenames the
  310.         characters from space ( ) through tilde (~) (ASCII 32-126) are
  311.         unchanged, with the exception of slash (/) and any initial
  312.         period (.).  The slash (/) and any initial period (.)  and all
  313.         characters outside the range 32-126 are replaced by a colon (:)
  314.         followed by the two-digit hexadecimal code for the character.
  315.         When converting from Linux filenames to Macintosh filenames the
  316.         string ":YZ" is replaced by the character with hexadecimal code
  317.         0xYZ.  If 0xYZ is not a valid hexadecimal number or is the code
  318.         for NULL or colon (:) then the colon is replaced by a pipe
  319.         character (|).
  320.      ttrriivviiaall
  321.         When converting from Macintosh filenames to Linux filenames a
  322.         slash character (/) is replaced by a colon (:).
  323.         When converting from Linux filenames to Macintosh filenames a
  324.         colon (:) is replaced by a slash character (/).
  325.   22..88..  ppaarrtt==nn
  326.   default value: 0
  327.   Specifies which HFS partition to mount from a Macintosh CDROM or hard
  328.   drive.  Partitions are numbered from 0 and count only those identified
  329.   in the partition table as containing HFS filesystems.  This option is
  330.   only useful when the Linux platform doesn't fully support Macintosh
  331.   partition tables.  In particular on MkLinux and Linux-Pmac this option
  332.   is useless.
  333.   Note that in versions before 0.8.3 partitions were numbered from 1.
  334.   22..99..  qquuiieett
  335.   If included in the options, then chown and chmod operations will not
  336.   return errors, but will instead fail silently.  (Same as for the MS-
  337.   DOS and HPFS filesystems.)
  338.   22..1100..  ttyyppee==cccccccc
  339.   default value: ``????''
  340.   Specifies the 4-character string specifying the Finder's Type for new
  341.   files.
  342.   22..1111..  uuiidd==nn
  343.   default value: uid of the mounting process
  344.   Specifies the user that owns all files and directories on the
  345.   filesystem.  (Same as for the MS-DOS and HPFS filesystems.)
  346.   22..1122..  uummaasskk==nn
  347.   default value: umask of the mounting process
  348.   Specifies (in octal) the umask used for all files and directories.
  349.   (Same as for the MS-DOS and HPFS filesystems.)
  350.   33..  WWrriittiinngg ttoo HHFFSS FFiilleessyysstteemmss
  351.   Each of the values of the fork mount option yields a different
  352.   representation of the Macintosh-specific parts of a file within the
  353.   structure of the Linux filesystem.  There are, therefore, slightly
  354.   different steps involved in copying files if you want to preserve the
  355.   resource forks and the Finder's metadata.
  356.   It is important to remember not to use normal user-level tools to
  357.   modify a filesystem mounted with the afpd mount option.
  358.   Regardless of the value of the fork mount option you can do virtually
  359.   everything to the data fork of a file that you can to a file on any
  360.   other filesystem.  The limitations are essentially the same as those
  361.   imposed by the MS-DOS filesystem:
  362.   +o  You can't change the uid or gid of files.
  363.   +o  You can't set the set-uid, set-gid or sticky permission bits.
  364.   +o  You can't clear the execute permission bits.
  365.   Likewise you can do virtually everything to a directory that you can
  366.   to a directory on another file system with the following exceptions:
  367.   +o  You can't create, delete or rename resource forks of files or the
  368.      Finder's metadata.  Note, however, that they are created (with
  369.      defaults values), deleted and renamed along with the corresponding
  370.      data fork or directory.
  371.   +o  You can't change permissions on directories.
  372.   +o  You can't change the uid or gid of directories.
  373.   +o  You can't create multiple links to files.
  374.   +o  You can't create symlinks, device files, sockets or FIFOs.
  375.   33..11..  WWrriittiinngg wwiitthh ffoorrkk==ccaapp
  376.   Unlike the other schemes for representing forked files, the CAP scheme
  377.   presents the resource fork as an independent file; the resource fork
  378.   of ./foo is ./.resource/foo.  Therefore, you can treat it as a normal
  379.   file.  You can do anything to a resource fork that you can do to a
  380.   data fork, except that you cannot enable execute permissions on a
  381.   resource fork.  Therefore, resource forks are not suitable for holding
  382.   Linux executables or shared libraries.
  383.   If you plan to use the resource fork on a Macintosh then you must obey
  384.   the format of a valid resource fork.  This format is documented in
  385.   Chapter 1 of Apple's _I_n_s_i_d_e _M_a_c_i_n_t_o_s_h_: _M_o_r_e _M_a_c_i_n_t_o_s_h _T_o_o_l_b_o_x.  The
  386.   filesystem knows nothing about this format and so does nothing to
  387.   enforce it.
  388.   The current support for reading and writing is sufficient to allow
  389.   copying of entire directories with tar, as long as both the source and
  390.   destination are mounted with fork=cap.  tar may complain about being
  391.   unable to change the uid, gid or mode of files.  This is normal and is
  392.   an unavoidable side effect of the having a single uid, gid and umask
  393.   for the entire filesystem.
  394.   It is impossible to create a resource fork or a Finder metadata file.
  395.   However, they are created automatically when the data fork is created.
  396.   Therefore, if you wish to copy a single file including both forks and
  397.   the Finder's metadata then you must create the data fork first.  Then
  398.   you can copy the resource fork and the Finder's metadata.  For
  399.   instance to copy the file foo to dir/bar you should do the following:
  400.   1. cp foo dir/bar
  401.   2. cp .resource/foo dir/.resource/bar
  402.   3. cp .finderinfo/foo dir/.finderinfo/bar
  403.   You may get ``Operation not permitted'' errors from cp when it tries
  404.   to change the permissions on files.  These errors can safely be
  405.   ignored.  This method will work even if the file dir/bar exists.
  406.   If you wish to move foo to dir/bar and foo and dir are on the same
  407.   filesystem then you only need to execute ``mv foo dir/bar'' and the
  408.   resource fork and the Finder's metadata will move too.  However, if
  409.   foo and dir are on different filesystem then this will lose the
  410.   resource fork and metadata.  Therefore, it is safest to always move
  411.   files as follows:
  412.   1. cp foo dir/bar
  413.   2. cp .resource/foo dir/.resource/bar
  414.   3. cp .finderinfo/foo dir/.finderinfo/bar
  415.   4. rm foo
  416.   You may get ``Operation not permitted'' errors from cp when it tries
  417.   to change the permissions on files.  These errors can safely be
  418.   ignored.  This method will work even if the file dir/bar exists.
  419.   Directories have no resource fork but you may wish to create a
  420.   directory which has the same location and view on the Finder's screen
  421.   as an existing one.  This can be done by copying the Finder metadata
  422.   file.  To give the directory bar the same location, layout, creation
  423.   date and modify date as foo you simply execute ``cp .finderinfo/foo
  424.   .finderinfo/bar''.
  425.   When copying an entire directory with ``cp -R'' you may also wish to
  426.   copy the metadata for the directory:
  427.   1. cp -R foo bar
  428.   2. cp .finderinfo/foo .finderinfo/bar
  429.   You may get ``Operation not permitted'' errors from cp when it tries
  430.   to change the permissions on files.  These errors can safely be
  431.   ignored.
  432.   33..22..  WWrriittiinngg wwiitthh ffoorrkk==ddoouubbllee
  433.   The current support for reading and writing header files is sufficient
  434.   to allow copying of entire directories with tar, as long as both the
  435.   source and destination are mounted with fork=double.  tar may complain
  436.   about being unable to change the uid, gid or mode of files.  This is
  437.   normal and is an unavoidable side effect of the having a single uid,
  438.   gid and umask for the entire filesystem.
  439.   It is impossible to create a header file.  However, they are created
  440.   automatically when the data fork is created.  Therefore, if you wish
  441.   to copy a single file including both forks and the Finder's metadata
  442.   then you must create the data fork first.  Then you can copy the
  443.   header file.  instance to copy the file foo to dir/bar you should do
  444.   the following:
  445.   1. cp foo dir/bar
  446.   2. cp %foo dir/%bar
  447.   You may get ``Operation not permitted'' errors from cp when it tries
  448.   to change the permissions on files.  These errors can safely be
  449.   ignored.  This method will work even if the file dir/bar exists.
  450.   If you wish to move foo to dir/bar and foo and dir are on the same
  451.   filesystem then you only need to execute ``mv foo dir/bar'' and the
  452.   header file will move too.  However, if foo and dir are on different
  453.   filesystem then this will lose the header file.  Therefore, it is
  454.   safest to always move files as follows:
  455.   1. cp foo dir/bar
  456.   2. cp %foo dir/%bar
  457.   3. rm foo
  458.   You may get ``Operation not permitted'' errors from cp when it tries
  459.   to change the permissions on files.  These errors can safely be
  460.   ignored.  This method will work even if the file dir/bar exists.
  461.   Directories have no resource fork but you may wish to create a
  462.   directory which has the same location and view on the Finder's screen
  463.   as an existing one.  This can be done by copying the corresponding
  464.   header file.  To give the directory bar the same location, layout,
  465.   creation date and modify date as foo simply execute ``cp %foo %bar''.
  466.   When copying an entire directory with ``cp -R'' you may also wish to
  467.   copy the header file for the directory as well:
  468.   1. cp -R foo bar
  469.   2. cp %foo %bar
  470.   You may get ``Operation not permitted'' errors from cp when it tries
  471.   to change the permissions on files.  These errors can safely be
  472.   ignored.
  473.   33..33..  WWrriittiinngg wwiitthh ffoorrkk==nneettaattaallkk
  474.   The current support for reading and writing header files is sufficient
  475.   to allow copying of entire directories with tar, as long as both the
  476.   source and destination are mounted fork=netatalk.  tar may complain
  477.   about being unable to change the uid, gid or mode of files.  This is
  478.   normal and is an unavoidable side effect of the having a single uid,
  479.   gid and umask for the entire filesystem.
  480.   It is impossible to create a header file.  However, they are created
  481.   automatically when the data fork is created.  Therefore, if you wish
  482.   to copy a single file including both forks and the Finder's metadata
  483.   then you must create the data fork first.  Then you can copy the
  484.   header file.  instance to copy the file foo to dir/bar you should do
  485.   the following:
  486.   1. cp foo dir/bar
  487.   2. cp .AppleDouble/foo dir/.AppleDouble/bar
  488.   You may get ``Operation not permitted'' errors from cp when it tries
  489.   to change the permissions on files.  These errors can safely be
  490.   ignored.  This method will work even if the file dir/bar exists.
  491.   If you wish to move foo to dir/bar and foo and dir are on the same
  492.   filesystem then you only need to execute ``mv foo dir/bar'' and the
  493.   header file will move too.  However, if foo and dir are on different
  494.   filesystem then this will lose the header file.  Therefore, it is
  495.   safest to always move files as follows:
  496.   1. cp foo dir/bar
  497.   2. cp .AppleDouble/foo dir/.AppleDouble/bar
  498.   3. rm foo
  499.   You may get ``Operation not permitted'' errors from cp when it tries
  500.   to change the permissions on files.  These errors can safely be
  501.   ignored.  This method will work even if the file dir/bar exists.
  502.   Directories have no resource fork but you may wish to create a
  503.   directory which has the same location and view on the Finder's screen
  504.   as an existing one.  This can be done by copying the corresponding
  505.   header file.  To give the directory bar the same location, layout,
  506.   creation date and modify date as foo you simply execute ``cp
  507.   foo/.AppleDouble/.Parent bar/.AppleDouble/.Parent''.
  508.   Because the fork=netatalk scheme holds the header file for a directory
  509.   within that directory, directories can safely be copied with ``cp -R
  510.   foo bar'' with no loss of information.  However, you may get
  511.   ``Operation not permitted'' errors from cp when it tries to change the
  512.   permissions on files.  These errors can safely be ignored.
  513.   44..  AA GGuuiiddee ttoo SSppeecciiaall FFiillee FFoorrmmaattss
  514.   Each of the values of the fork mount option yields different special
  515.   files to represent the Macintosh-specific parts of a file within the
  516.   structure of the Linux filesystem.  You can write to these special
  517.   files to change things such as the Creator and Type of a file.
  518.   However, to do so safely you must follow certain rules to avoid
  519.   corrupting the data.  Additionally, there are certain fields in the
  520.   special files that you can't change (writes to them will fail
  521.   silently).
  522.   44..11..  CCAAPP ..ffiinnddeerriinnffoo FFiilleess
  523.   The Finder's metadata for the file ./foo in held in the file
  524.   ./.finderinfo/foo.  The file has a fixed format defined in hfs_fs.h as
  525.   follows:
  526.        ______________________________________________________________________
  527.        struct hfs_cap_info {
  528.                __u8    fi_fndr[32];            /* Finder's info */
  529.                __u16   fi_attr;                /* AFP attributes */
  530.                __u8    fi_magic1;              /* Magic number: */
  531.        #define HFS_CAP_MAGIC1          0xFF
  532.                __u8    fi_version;             /* Version of this structure: */
  533.        #define HFS_CAP_VERSION         0x10
  534.                __u8    fi_magic;               /* Another magic number: */
  535.        #define HFS_CAP_MAGIC           0xDA
  536.                __u8    fi_bitmap;              /* Bitmap of which names are valid: */
  537.        #define HFS_CAP_SHORTNAME       0x01
  538.        #define HFS_CAP_LONGNAME        0x02
  539.                __u8    fi_shortfilename[12+1]; /* "short name" (unused) */
  540.                __u8    fi_macfilename[32+1];   /* Original (Macintosh) name */
  541.                __u8    fi_comln;               /* Length of comment (always 0) */
  542.                __u8    fi_comnt[200];          /* Finder comment (unused) */
  543.                /* optional:    used by aufs only if compiled with USE_MAC_DATES */
  544.                __u8    fi_datemagic;           /* Magic number for dates extension: */
  545.        #define HFS_CAP_DMAGIC          0xDA
  546.                __u8    fi_datevalid;           /* Bitmap of which dates are valid: */
  547.        #define HFS_CAP_MDATE           0x01
  548.        #define HFS_CAP_CDATE           0x02
  549.                __u8    fi_ctime[4];            /* Creation date (in AFP format) */
  550.                __u8    fi_mtime[4];            /* Modify date (in AFP format) */
  551.                __u8    fi_utime[4];            /* Un*x time of last mtime change */
  552.        };
  553.        ______________________________________________________________________
  554.   The type __u8 is an unsigned character, and __u16 is an unsigned
  555.   16-bit integer.
  556.   Currently only the fields fi_fndr, fi_attr, fi_ctime and fi_mtime can
  557.   be changed.  Writes to the other fields are silently ignored.
  558.   However, you shouldn't write random bytes to the other fields, since
  559.   they may be writable in the future.
  560.   The fi_fndr field is the ``Finder info'' and ``Extended Finder info''
  561.   for a file or directory.  These structures are described in various
  562.   books on Macintosh programming.  The portion of the most interest is
  563.   probably the first 8 bytes which, for a file, give the 4-byte Type
  564.   followed by the 4-byte Creator.
  565.   The fi_attr field is the AFP attributes of the file or directory.
  566.   While you can write any value to this field, only the ``write-
  567.   inhibit'' bit is significant.  Setting or clearing this bit will clear
  568.   or set the write bits in the file's permissions.  When you read from
  569.   this field anything you may have written is lost.  If the file has
  570.   write permissions enabled then you will read zero from this field.
  571.   With write permission disabled you will read back 0x01 0xA0, which
  572.   corresponds to setting the ``write-inhibit'', ``rename-inhibit'' and
  573.   ``delete-inhibit'' bits.
  574.   The fi_ctime and fi_mtime are the Macintosh created and modified time
  575.   for the file or directory, and are 32-bit signed integers in network
  576.   byteorder giving seconds from 00:00 GMT Jan. 1, 2000.
  577.   44..22..  AApppplleeDDoouubbllee HHeeaaddeerr FFiilleess
  578.   Both the fork=double and fork=netatalk schemes for representing forked
  579.   files use AppleDouble header files to contain the resource fork and
  580.   the Finder's metadata together in a single file.
  581.   The AppleDouble format specifies a fixed-format header which describes
  582.   which fields are contained in the remainder of the file, where they
  583.   are located in the file and how long they are.  A full description of
  584.   the version 1 format used when fork=netatalk is available from ??????.
  585.   The version 2 format used when fork=double is documented in ??????.
  586.   The discussion that follows assumes you have read and understood these
  587.   documents, which may be difficult until I've replaced the ``??????''s
  588.   above with something more informative :-).
  589.   Due to the variable structure of an AppleDouble header file you must
  590.   not use buffered I/O when reading or writing them; you should only use
  591.   the read() and write() system calls.  It is also important that you
  592.   make some effort to coordinate processes that are reading and writing
  593.   the same header file, since a reader will receive the wrong data if
  594.   the location of a given entry has changed since it read the descriptor
  595.   for the entry.  If a process tries to read the descriptor table while
  596.   it is changing then it is possible to read totally meaningless data.
  597.   When a header file is opened it is initially presented with a default
  598.   header layout.  You may write to the header to change the layout, but
  599.   when all file descriptors for the file or directory have been closed
  600.   the change in format is lost and subsequent opens will yield the
  601.   default layout.  Changes to supported entries are made directly to the
  602.   filesystem and are thus preserved when the file is closed and
  603.   reopened.
  604.   The HFS filesystem currently uses a fixed-size table to hold the
  605.   descriptors.  Therefore you are limited to HFS_HDR_MAX (currently 10)
  606.   descriptors.  In the unlikely event that you try to write a header
  607.   with more descriptors, a warning will be issued by the kernel, and
  608.   extra descriptors will be ignored.  This should be considered a bug
  609.   and will hopefully change sooner rather than later.
  610.   The results of specifying overlapping entries is undefined and should
  611.   not be relied upon to remain unchanged from one version of the HFS
  612.   filesystem to the next.  There is no valid reason to define
  613.   overlapping entries, so just don't do it!
  614.   Changes to the magic number and version fields are preserved until all
  615.   file descriptors are closed, however the only significance given to
  616.   them internally is that the 16 bytes following the version changes
  617.   meaning according to the version.  For version 1 header files these 16
  618.   bytes contain the string ``Macintosh'' followed by 7 spaces.  For any
  619.   other value of the version field these 16 bytes are all zeros.  In
  620.   either case writes to these 16 bytes are silently ignored.
  621.   Since the magic number and version are given no other significance
  622.   internally, you are free to do many things that violate the official
  623.   formats.  For instance you can create an entry for the data fork in a
  624.   header file with an AppleDouble magic number or create ``File Info''
  625.   (id=7) entries in version 2 header files and ``File Dates Info''
  626.   (id=8) entries in version 1 header files.  However, future versions of
  627.   the filesystem may enforce the format more strictly.
  628.   Entry id 1 (``Data Fork'') is read-only.  You should use the data file
  629.   to modify the data fork.  The data fork is, of course, not supported
  630.   for directories.
  631.   Entry ids 2, 7, 8, 9 and 10 (``Resource Fork'', ``File Info'', ``File
  632.   Dates Info'', ``Finder Info'' and ``Macintosh File Info'') are fully
  633.   supported, meaning that their contents may be read and written and
  634.   that data written is preserved when the file is closed and reopened.
  635.   The resource fork is, of course, not supported for directories.
  636.   Entry id 7 specifies some of the same data given by ids 8 and 10.  If
  637.   you create a header file with an entry for id 7 and for ids 8 or 10,
  638.   then the behavior with respect to their interaction is undefined.  A
  639.   header that contains an entry for id 7 and for ids 8 or 10 is not
  640.   valid as either a version 1 or a version 2 header file, so there is no
  641.   reason to do this and future versions may prevent it.
  642.   Entry id 3 (``Real Name'') is read-only, since it will change
  643.   automatically when a file is renamed.  Writes to the corresponding
  644.   entry are silently ignored.
  645.   All other entry ids are ignored.  You may create descriptors for them;
  646.   in fact the default header layout when fork=netatalk includes a
  647.   descriptor for id 4 (``Comment'').  However writes to the entries
  648.   corresponding to the ignored ids fail silently and reads from the
  649.   entries always return zeros.  However, you shouldn't write random
  650.   bytes to unsupported entries, since they may be supported in the
  651.   future.
  652.   All of the supported entry types except the data and resource forks
  653.   have a fixed length.  If you give them a smaller length in the
  654.   descriptor then you are unable to access part of the corresponding
  655.   entry.  If you give them a larger length in the descriptor, then the
  656.   corresponding entry is padded with zeros and writes to the extra space
  657.   are silently ignored.
  658.   Writes to the length field of descriptors for the data and resource
  659.   forks will cause the corresponding fork to grow (with zero padding) or
  660.   shrink to the indicated length.
  661.   If you have an entry for the data fork then the descriptor's length
  662.   field does not change automatically to reflect any modification of the
  663.   data fork directly (the data does change however).  If the data fork
  664.   is longer than the descriptor indicates, then a portion of it is
  665.   inaccessible.  If the data fork is shorter than the descriptor
  666.   indicates then reads will be padded with zeros.
  667.   Writes beyond the end of the resource fork that extend into empty
  668.   space between entries or beyond the end of the file will extend the
  669.   fork, automatically changing the length field of the corresponding
  670.   descriptor.  Writes to any other space between entries are silently
  671.   ignored and read of such spaces always return zeros.
  672.   Calling truncate() on a header file can change the length of the
  673.   resource fork and such a change will automatically be reflected in the
  674.   length field of the corresponding descriptor.  If truncate() shortens
  675.   the file so that the entry for the resource fork would extend beyond
  676.   the new end of the file then the fork is shortened to fit in the space
  677.   that remains, or to zero bytes if the entry is now entirely beyond the
  678.   end of the file.  If the last entry in a header file is the resource
  679.   fork then a call to truncate() that extends the header file will
  680.   extend the fork with zeros.  Note that this happens even if there was
  681.   previously space between the end of the fork and the end of the file.
  682.   55..  RReeppoorrttiinngg BBuuggss
  683.   If you'd like any problems you encounter fixed, you'll need to provide
  684.   a detailed bug report.  However, you should check the FAQ (available
  685.   from the HFS for Linux Page <http://www-sccm.Stanford.EDU/~hargrove/HFS/>)
  686.   first to be certain that your problem is not a known limitation of the
  687.   filesystem.  If your bug doesn't appear in the FAQ then you should e-mail
  688.   me at hargrove@sccm.Stanford.EDU.
  689.   55..11..  WWhhaatt GGooeess iinn aa BBuugg RReeppoorrtt
  690.   When writing your bug report, include any facts you think might be
  691.   relevant; I'd much rather have a bunch of extra facts than need to
  692.   e-mail you to get the information.  At a minimum the following
  693.   information should be included:
  694.   +o  The version of the HFS filesystem you are using (see
  695.      linux/fs/hfs/version.h).
  696.   +o  The kernel version you are using.
  697.   +o  Any unofficial kernel patches or loadable modules you are using.
  698.   +o  If you are loading the HFS filesystem as a module, then version of
  699.      the module utilities used to load hfs.o.
  700.   +o  The type of media you are working with (floppy, CDROM, ZIP Drive,
  701.      etc.).
  702.   +o  The steps required to reproduce the bug, including mount options
  703.      used.  (If you can't reproduce the bug tell me everything you did
  704.      the one time it did occur, but be warned that non-reproducible bugs
  705.      can only rarely be fixed.)
  706.   55..22..  HHooww ttoo RReeppoorrtt aa KKeerrnneell OOooppss oorr GGPPFF
  707.   If you encounter a bug that causes a kernel Oops or a General
  708.   Protection Fault then you'll need to collect some additional
  709.   information for the bug report.  If you are loading the HFS filesystem
  710.   as a module, then is important that you do this before rebooting,
  711.   since the module is unlikely to be loaded at the same address after
  712.   the reboot.
  713.   You should include all the information that the kernel prints to the
  714.   console or to the system logs.  However, the EIP and Stack Trace are
  715.   addresses in _y_o_u_r kernel and mean nothing to me without more
  716.   information.  Using your System.map file (or either ksymoops or klogd)
  717.   determine which functions the EIP and Stack Trace are in.  If you do
  718.   this by hand using your System.map file then the correct symbol is the
  719.   one of type t or T with the largest address less than or equal to the
  720.   one you are resolving.
  721.   If you are loading the HFS filesystem as a module and the Oops or GPF
  722.   was in the HFS code then the EIP and the top levels of the Stack Trace
  723.   will be in a loadable module, rather than in the kernel proper.  So,
  724.   their symbols will not be in the file System.map.  Therefore, you will
  725.   need to use /proc/ksyms, or a loadmap produced by passing the -m
  726.   option to insmod, to locate those symbols.
  727.   66..  LLeeggaall NNoottiicceess
  728.   66..11..  TThhiiss DDooccuummeenntt
  729.   This document is Copyright (c) 1996, 1997 by Paul H. Hargrove.
  730.   Permission is granted to make and distribute verbatim copies of this
  731.   document provided the copyright notice and this permission notice are
  732.   preserved on all copies.
  733.   Permission is granted to copy and distribute modified versions of this
  734.   document under the conditions for verbatim copies above, provided a
  735.   notice clearly stating that the document is a modified version is also
  736.   included in the modified document.
  737.   Permission is granted to copy and distribute translations of this
  738.   document into another language, under the conditions specified above
  739.   for modified versions.
  740.   Permission is granted to convert this document into another media
  741.   under the conditions specified above for modified versions provided
  742.   the requirement to acknowledge the source document is fulfilled by
  743.   inclusion of an obvious reference to the source document in the new
  744.   media. Where there is any doubt as to what defines ``obvious'' the
  745.   copyright owner reserves the right to decide.
  746.   66..22..  TThhee SSooffttwwaarree
  747.   The HFS filesystem for Linux is Copyright (c) 1994-1997 by Paul H.
  748.   Hargrove.
  749.   This software is free software; you can redistribute it and/or modify
  750.   it under the terms of the GNU General Public License as published by
  751.   the Free Software Foundation; either version 2, or (at your option)
  752.   any later version.
  753.   This software is distributed in the hope that it will be useful, but
  754.   WITHOUT ANY WARRANTY; without even the implied warranty of
  755.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  756.   General Public License for more details.
  757.   You should have received a copy of the GNU General Public License
  758.   along with this software in the file ``COPYING''; if not, write to the
  759.   Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
  760.   USA.
  761.   66..22..11..  TThhee CCoolluummbbiiaa AApppplleeTTaallkk PPaacckkaaggee ffoorr UUNNIIXX
  762.   The source code distribution of the Columbia AppleTalk Package for
  763.   UNIX, version 6.0, (CAP) was used as a _s_p_e_c_i_f_i_c_a_t_i_o_n of the location
  764.   and format of files used by CAP's Aufs.  No code from CAP appears in
  765.   the HFS filesystem. The HFS filesystem is not a work ``derived'' from
  766.   CAP in the sense of intellectual property law.
  767.   66..22..22..  NNeettaattaallkk
  768.   The source code distributions of Netatalk, versions 1.3.3b2 and 1.4b2,
  769.   were used as a _s_p_e_c_i_f_i_c_a_t_i_o_n of the location and format of files used
  770.   by Netatalk's afpd.  No code from Netatalk appears in the HFS
  771.   filesystem.  The HFS filesystem is not a work ``derived'' from
  772.   Netatalk in the sense of intellectual property law.
  773.   66..33..  TTrraaddeemmaarrkkss
  774.   +o  ``Finder'' is a trademarks of Apple Computer, Inc.
  775.   +o  ``Apple'', ``AppleShare'', ``AppleTalk'' and ``Macintosh'' are
  776.      registered trademarks of Apple Computer, Inc.
  777.   +o  ``Microsoft'' and ``MS-DOS'' are registered trademarks of Microsoft
  778.      Corporation.
  779.   +o  All other trademarks are the property of their respective owners.