hfsplus-1.0.4/0040755000000000000000000000000007450157145011712 5ustar rootroothfsplus-1.0.4/doc/0040755000000000000000000000000007450157144012456 5ustar rootroothfsplus-1.0.4/doc/man/0040755000000000000000000000000007450157145013232 5ustar rootroothfsplus-1.0.4/doc/man/hfsp.man0100644000000000000000000000403207441220604014652 0ustar rootroot.if n .ds Q \&" .if t .ds Q `` .if n .ds U \&" .if t .ds U '' .TH "HFSP" 1 .tr \& .nr bi 0 .nr ll 0 .nr el 0 .de DS .. .de DE .. .de Pp .ie \\n(ll>0 \{\ .ie \\n(bi=1 \{\ .nr bi 0 .if \\n(t\\n(ll=0 \{.IP \\(bu\} .if \\n(t\\n(ll=1 \{.IP \\n+(e\\n(el.\} .\} .el .sp .\} .el \{\ .ie \\nh=1 \{\ .LP .nr h 0 .\} .el .PP .\} .. NAME .Pp \fBhfsp\fP \fBhfsplus\fP - Collection of tools to acces HFS+ volumes. .Pp DESCRIPTION .Pp The hfsplus collection cotains tools to read and display the files found on an HFS+ formatted volume. HFS+ is the volume format intodruced by Apple Computer inc. around MacOS 8. The HFS+ format uses a better approach to acces large volumes and allows files with a size up to 2[circ ]64 bytes. In Addition filenames are saved as two-byte unicode with a length upto 255 (unicode) characters. .Pp In contrast to its sucessor, the hfs-tools hfsplus does not use the volume/directory/file/ syntax using ':' as delimiter but uses the standard unix '/', '..' and '.' notation. Since this concept is not fully supported my HFS+ not all combinations will be understood. .Pp EXAMPLES .Pp This example mounts my main HFS+ volume, shows some files and copies one to the linux side: .DS .sp .ft RR .nf > hpmount /dev/hda13 > hpls Apple Extras Desktop Folder MP3 Systemordner Benutzer Develop Programme Temporary Items Bibel Dokumente Spiele VM Storage > hpcd Develop > hpcd Test > hppwd /Aida/Develop/Test hpcopy -t Test.cp . > hpumount .DE .fi .ec .ft P .sp .Pp FILES .Pp \fB$HOME/.hfsplusvolume\fP This file is created by hpmount and removed by hpunmount. It contains the volume name and the current directory id. .Pp BUGS .Pp There are some bugs related to uniocde handling and the large file sizes not supported by some older formats (binhex, macbinary). See the developer documenatation for details .Pp SEE ALSO .Pp hpmount(1), hpumount(1), hpls(1), hpcd(1), hppwd(1), hpcopy(1), hfsutils(1), .Pp .SH AUTHORS .Pp Klaus Halfmann \f(CR[lt ]halfmann@libra.de[gt ]\fP .Pp hfsplus-1.0.4/doc/man/hfsp.sgml0100644000000000000000000000354707441220604015053 0ustar rootroot NAME

hfsp hfsplus - Collection of tools to acces HFS+ volumes. DESCRIPTION

The hfsplus collection cotains tools to read and display the files found on an HFS+ formatted volume. HFS+ is the volume format intodruced by Apple Computer inc. around MacOS 8. The HFS+ format uses a better approach to acces large volumes and allows files with a size up to 2^64 bytes. In Addition filenames are saved as two-byte unicode with a length upto 255 (unicode) characters.

In contrast to its sucessor, the hfs-tools hfsplus does not use the volume/directory/file/ syntax using ':' as delimiter but uses the standard unix '/', '..' and '.' notation. Since this concept is not fully supported my HFS+ not all combinations will be understood. EXAMPLES

This example mounts my main HFS+ volume, shows some files and copies one to the linux side: > hpmount /dev/hda13 > hpls Apple Extras Desktop Folder MP3 Systemordner Benutzer Develop Programme Temporary Items Bibel Dokumente Spiele VM Storage > hpcd Develop > hpcd Test > hppwd /Aida/Develop/Test hpcopy -t Test.cp . > hpumount FILES

$HOME/.hfsplusvolume This file is created by hpmount and removed by hpunmount. It contains the volume name and the current directory id. BUGS

There are some bugs related to uniocde handling and the large file sizes not supported by some older formats (binhex, macbinary). See the developer documenatation for details SEE ALSO

hpmount(1), hpumount(1), hpls(1), hpcd(1), hppwd(1), hpcopy(1), hfsutils(1), AUTHORS

Klaus Halfmann <halfmann@libra.de> hfsplus-1.0.4/doc/man/hfsp.txt0100644000000000000000000000367707441220604014734 0ustar rootroot 00..11.. NNAAMMEE hhffsspp hhffsspplluuss - Collection of tools to acces HFS+ volumes. 00..22.. DDEESSCCRRIIPPTTIIOONN The hfsplus collection cotains tools to read and display the files found on an HFS+ formatted volume. HFS+ is the volume format intodruced by Apple Computer inc. around MacOS 8. The HFS+ format uses a better approach to acces large volumes and allows files with a size up to 2^64 bytes. In Addition filenames are saved as two-byte unicode with a length upto 255 (unicode) characters. In contrast to its sucessor, the hfs-tools hfsplus does not use the volume/directory/file/ syntax using ':' as delimiter but uses the standard unix '/', '..' and '.' notation. Since this concept is not fully supported my HFS+ not all combinations will be understood. 00..33.. EEXXAAMMPPLLEESS This example mounts my main HFS+ volume shows some files and copies one to the linux side: > hpmount /dev/hda13 > hpls Apple Extras Desktop Folder MP3 Systemordner Benutzer Develop Programme Temporary Items Bibel Dokumente Spiele VM Storage > hpcd Develop > hpcd Test > hppwd /Aida/Develop/Test hpcopy -t Test.cp . > hpumount 00..44.. FFIILLEESS $$HHOOMMEE//..hhffsspplluussvvoolluummee This file is created by hpmount and removed by hpunmount. It contains the volume name and the current directory id. 00..55.. BBUUGGSS There are some bugs related to uniocde handling and the large file sizes not supported by some older formats (binhex, macbinary). See the developer documenatation for details 00..66.. SSEEEE AALLSSOO hpmount(1), hpumount(1), hpls(1), hpcd(1), hppwd(1), hpcopy(1) 00..77.. AAUUTTHHOORRSS Klaus Halfmann hfsplus-1.0.4/doc/.cvsignore0100644000000000000000000000002607441220604014441 0ustar rootrootMakefile Makefile.in hfsplus-1.0.4/doc/Makefile.am0100644000000000000000000000016707441220604014503 0ustar rootroot# # Makefile.am for hfsplus/doc # htmldir = $(DOCDIR)/hfsplus html_DATA = \ bugs.html EXTRA_DIST = $(html_DATA) hfsplus-1.0.4/doc/bugs.html0100644000000000000000000001006707450157136014306 0ustar rootroot HFS+ Utilities, BUGS

HFS+ Utilities, BUGS

 $Id: bugs.html,v 1.3 2002/03/26 20:47:26 klaus Exp $
hfsplus-1.0.4/doc/faq.html0100644000000000000000000000070007441220604014075 0ustar rootroot HFS+ Utilities, FAQ

HFS+ Utilities, Frequently Asked Questions

Did I (Klaus Halfmann) use any code from Darwin (MacOSX)
No, due to space and time constraints I did not yet do anything with Darwin.
$Id: faq.html,v 1.1.1.1 2002/03/05 19:50:28 klaus Exp $ hfsplus-1.0.4/doc/hfsp.html0100644000000000000000000000447307441220604014301 0ustar rootroot What is HFS+

What is HFS+

HFS+ is the new Filesystem intodruced my Apple around MacOS8. It became necessary because its predecessor, HFS, had a fixed numer of blocks (2^16), and on large volumes theses block became very large, wasting a lot of space. HFS+ solves this problem and intodruces some new concepts like Unicode file names.

Detailed Documentation can be found in Technote 1150 HFS+ Volume format and in File Manager.

In contrast to unix-like file Systems, HFS+ (and HFS+) work like indexes in a database. As with databases The index is composed of keys structered in a B*-Tree. (A B*Tree is basically a n-ary tree located in nodes on a volume. This way acces to any file is pretty fast at the price of a complex insert / delete management. I migt provide some O(..) notation here but dont want to get blamed by some Theoritican :) . The B*-tree is composed of index nodes and leaf nodes. Index nodes contain ordered keys that point to deeper index- or leaf-nodes. Leaf nodes contain keys and associated file or folder records. The keys and records have variable length but an additional index at the end of every node allows indexed acces.

Apple places additional restrictions on the B*-Tree:

The keys are composed of the unique id of the parent folder and the (specially encoded) unicode name of the file. The folder THREADS are needed to retrive the parent folder for a given folder id. Theese use an empty name and are simliar to the '.' directory in unix.

Files and the B*Trees themselfes are stored in forks. For files these are the Apple-like data- and resource-fork. With HFS+ every files may have up to 8 not continuos parts until the additional parts are found in the Extends record. This Extends record is used for the catalog file (fork) and other forks, too. So that theese have fixed record ids, too.

    $Id: hfsp.html,v 1.1.1.1 2002/03/05 19:50:28 klaus Exp $
hfsplus-1.0.4/doc/libhfsp.html0100644000000000000000000000575507441220604014774 0ustar rootroot libhfsp

libhfsp

This library can be used to prorammatically acces HFS+ volumes. The library in turn is used by utilities allowing user access to the volume.

objects exposed

The library has some top level objects that are to be used by other programs:

Design principles

In contrast to the original library by Robert Leslie this libray rarely uses malloc/free. This impoes, that all memory is contained in the objects shown above. As of now only the current two blocks are "cached". Performance may be poor when doing large transactions. function returning int return 0 on success and any other value (normally -1) on failure unless stated otherwise. functions returning pointers return NULL on error. In most cases hfsp_error and errno should be set. Byte swapping happens when reading structure from raw memory, this avoids any alignment problems. (In contrast to Brad Boyers aproach wich needs to swap (and assemble) the bytes on every acces.) The contentes of the raw HFS+ structures is usually not copied to other structures and remains embedded in the high level strcutures. In case you need such a value acces it directly (e.G. volume->vol.create_date - HFSPTIMEDIFF )

volume

Call volume_open() to open a volume. You must call volume_close() to close the volume. all other volume_ functions are used internally only use them when you really know what you are doing.

btree

The btree as of now is the catalog-file btree, althoug there are other btrees like the extends-file btree. I intend to make the btree a (more or less) private member of the volume. This will be done together with implementing a catalog-node cache superseeding the simple block cache at the volume.

record

The record is used whenever a file or folder is needed. There is a sufficient set of methods to navigate around with records. Folders and FolderThreads can both be used when acces to the files of a folder is needed. File Threads are supported, althoug Apple does not use them. (The utility functions like hpls however suppress then since I dont know what to do with them.) As of now there is no concept of "opening" a record, for readonlny acces just take one of the forks and use the fork functkions found at the volume to acces the raw data. See hpcopy for examples how to do that.

This is work in progress, either be patient or provide help.

$Id: libhfsp.html,v 1.1.1.1 2002/03/05 19:50:28 klaus Exp $ hfsplus-1.0.4/.cvsignore0100644000000000000000000000025307441220604013676 0ustar rootrootMakefile Makefile.in configure config.h.in config.h config.cache config.status config.sub config.guess ltconfig ltmain.sh stamp-h stamp-h.in libtool config.log aclocal.m4 hfsplus-1.0.4/AUTHORS0100644000000000000000000000220707442226174012760 0ustar rootrootThe following people contributed to the hfsplus package: Klaus Halfmann Did most of the programming and sometimes tries to push the project foreward. Michael Schulze appeard in Winter 2002 and gave new drive to the dormant project Brad Boyer (flar@allandria.com) Wrote (parts of) a kernel module for linux ppc 2.2 which where used by Klaus as a starting point. Commented at the code. R. Shapiro (rshapiro@bbn.com) Create src and binary rpms for easier distribution Olaf Hering (olh@suse.de) Supplied us with the CVS access at Suse Klaus Kämpf (kkaempf@suse.de) set up the initial structure to use all those nifty auto... tools Some people at the linuxppc-kernel mailing list. Some people at the #mklinux channel on efnet/openrojects * You * if you want to help ... I (Klaus Halfmann) would like to mention my father - Peter Heck - at this place. He died at the 16th of September 2000 after figthing a long fight against his cancer. Some parts of this code where written on my iBook traveling back and forth by train, visting and attending him. $Id: AUTHORS,v 1.2 2002/03/08 21:26:20 klaus Exp $ hfsplus-1.0.4/COPYING0100644000000000000000000003563107441220604012741 0ustar rootrootThe hfsplus package if fully covered by the GNU GENERAL PUBLIC LICENCE. GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS $Id: COPYING,v 1.1.1.1 2002/03/05 19:50:28 klaus Exp $ hfsplus-1.0.4/ChangeLog0100644000000000000000000000077207450157136013467 0ustar rootroot Added blockiterator to volume.c Added ChangeLog to CVS :) 2000-09-29: Version 1.0.1 is considered a stable, readonly implementation 2000-10-19: Version 1.0.2 is faster and fixes a bug for volume > 2Gb 2000-10-XX: Fixed a bug when accessing fragmented files on larger volumes 2000-11-XX: Fixed a display bug when doing ls -la for '.' 2000-11-06: hpfsck is ok for the most purposes 2002-03-25: Added (Thanks To Michael Schulze) Partition support $Id: ChangeLog,v 1.2 2002/03/26 20:47:26 klaus Exp $ hfsplus-1.0.4/INSTALL0100644000000000000000000002000307441220604012722 0ustar rootrootQuick Build instructions ======================== make -f makefile.cvs make This assumes, that several auto-tools are availeable. Those should be part fo almost any Linux-distributon. The rest of this document is the generic one since Im still not familiar with all the option the build process allows: Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.in' is used to create `configure' by a program called `autoconf'. You only need `configure.in' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not supports the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' can not figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it can not guess the host type, give it the `--host=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the host type. If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will produce code for and the `--build=TYPE' option to select the type of system on which you are compiling the package. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Operation Controls ================== `configure' recognizes the following options to control how it operates. `--cache-file=FILE' Use and save the results of the tests in FILE instead of `./config.cache'. Set FILE to `/dev/null' to disable caching, for debugging `configure'. `--help' Print a summary of the options to `configure', and exit. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--version' Print the version of Autoconf used to generate the `configure' script, and exit. `configure' also accepts some other, not widely useful, options. $Id: INSTALL,v 1.1.1.1 2002/03/05 19:50:28 klaus Exp $ hfsplus-1.0.4/Makefile.am0100644000000000000000000000071207442720755013747 0ustar rootroot# # Makefile.am for hfsplus # # Created by Klaus Kaempf and # Klaus Halfmann # # $Id: Makefile.am,v 1.2 2002/03/10 18:11:57 klaus Exp $ SUBDIRS = libhfsp src EXTRA_DIST = index.html AUTOMAKE_OPTIONS = foreign gnu CLEANFILES = config.cache config.log MAINTAINERCLEANFILES = Makefile Makefile.in \ configure config.h config.sub config.guess \ ltconfig ltmain.sh stamp-h stamp-h.in libtool aclocal.m4 hfsplus-1.0.4/Makefile.cvs0100644000000000000000000000031507441220604014127 0ustar rootroot# # Makefile.cvs for libycp # configure: all ./configure all: aclocal autoconf autoheader automake -a install: configure make make install reconf: all ./config.status --recheck ./config.status hfsplus-1.0.4/NEWS0100644000000000000000000000030107450157136012400 0ustar rootrootV 1.0.1 should be stable, performance on highly fragmented files may be poor V 1.0.4 Adds Partition support and will work on x86 Linux, too $Id: NEWS,v 1.2 2002/03/26 20:47:26 klaus Exp $ hfsplus-1.0.4/README0100644000000000000000000000076507441220604012566 0ustar rootroot This package is a set of tools that allow acces to HFS+ fomatted volumes. HFS+ is a modernized version of Apple Computers HFS Filesystem. In addition in contains the library "libhfsp" which you may use for your own experiments, all the tools are based on this library. (A bit of understanding is still needed however). Feel free to contact me (Klaus Halfmann, ) Thanks to Suse which supplied me with a CVS Server. $Id: README,v 1.1.1.1 2002/03/05 19:50:28 klaus Exp $ hfsplus-1.0.4/VERSION0100644000000000000000000000023507450157136012757 0ustar rootroot1.0.4 Please keep in sync with HPUTILS_VERS in libhfsp/src/libhfsp.h *** Version number must be on line 1 *** (configure.in uses "head -1" to extract it) hfsplus-1.0.4/configure.in0100644000000000000000000000363507441221437014223 0ustar rootrootdnl -*- shell-script -*- dnl dnl Process this file with autoconf to produce a configure script. dnl dnl libhfs - library for reading and writing Macintosh HFS volumes dnl Copyright (C) 1996-1998 Robert Leslie dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. dnl dnl $Id: configure.in,v 1.1 2002/03/05 19:57:19 klaus Exp $ dnl AC_INIT(src/hfsputil.c) AM_CONFIG_HEADER(config.h) AC_CANONICAL_SYSTEM AC_ARG_PROGRAM VERSION=`head -1 ${srcdir}/VERSION` PACKAGE=hfsplus AM_INIT_AUTOMAKE($PACKAGE, $VERSION) AC_ARG_ENABLE(debug, [ --enable-debug enable diagnostic debugging support]) if test "x$enable_debug" = xyes then AC_DEFINE(DEBUG,1,'enable diagnostic debugging support') fi dnl Checks for programs. AC_PROG_MAKE_SET AC_PROG_CC AC_PROG_INSTALL AC_PROG_RANLIB AC_PROG_LN_S AC_PROG_GCC_TRADITIONAL dnl Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS(unistd.h fcntl.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_TYPE_SIZE_T AC_STRUCT_TM AC_C_CONST dnl Checks for library functions. AC_FUNC_MEMCMP AC_CHECK_FUNCS(mktime) dnl Tool for creating libraries AM_PROG_LIBTOOL dnl Create output files. AC_OUTPUT(Makefile src/Makefile doc/Makefile libhfsp/Makefile libhfsp/src/Makefile libhfsp/test/Makefile) hfsplus-1.0.4/index.html0100644000000000000000000000541407441220604013677 0ustar rootroot HFS+ Utilities

HFS+ Utilities

This directory is a work in progress. It is maintained by Klaus Halfmann <klaus.halfmann@t-online.de> please contact me for any questions.

Parts of this project

What is HFS+
libhfsp
bugs
FAQ

Current Status

Klaus Halfmann
I decided to recreate the parts of the original hfsutils and keep theire names but remame "hfs" to "hfsp" reso. "h" to "hp" wherever needed. I started working on libhfsp. Im used to OO-Programming, so I recreated the code with objects in mind. See documenation for libhfsp.

The libhfsp part works for (most) readonly purposes. Im currently working on user-useable tools like hpmount hpcd and hpls.

Other...
Ask me (Klaus Hafmann <klaus.halfmann@t-online.de> where you might help.

To Do:

  • create a working libhfsp (readonly)
  • create a working libhfsp (writing)
    • Create a hpfscheck to find at least maximum node Id
      • Recreate commandline tools
      • (Re-)create kernel module
      • optimize libhfsp (caching, etc)
        • optimize key search for fixed length keys (extends tree...)
        • Make the address of the FSF correctly everywhere
      • create mkfs / chkfs
      • Recreate UI/X-Tools

      Copyright (C) 2000 Klaus Halfmann <klaus.halfmann@t-online.de>
      Original code 1996-1998 by Robert Leslie <rob@mars.rog>
      other work 2000 from Brad Boyer <flar@pants.nu>
      
      All files found in this directory and subdirectory are free software;
      you can redistribute it and/or modify them
      under the terms of the GNU General Public License as published by
      the Free Software Foundation; either version 2 of the License, or
      (at your option) any later version.
      
      This program is distributed in the hope that it will be useful,
      but WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      GNU General Public License for more details.
      
      You should have received a copy of the GNU General Public License
      along with this program; if not, write to the Free Software
      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
      
      $Id: index.html,v 1.1.1.1 2002/03/05 19:50:28 klaus Exp $                                                                         
      
      hfsplus-1.0.4/libhfsp/0040755000000000000000000000000007450157145013341 5ustar rootroothfsplus-1.0.4/libhfsp/src/0040755000000000000000000000000007450157145014130 5ustar rootroothfsplus-1.0.4/libhfsp/src/.cvsignore0100644000000000000000000000006407441220604016114 0ustar rootrootMakefile Makefile.in *.o *.lo .deps .libs *.a *.la hfsplus-1.0.4/libhfsp/src/FastUnicodeCompare.c0100644000000000000000000007545607441220604020014 0ustar rootroot// FastUnicodeCompare - Compare two Unicode strings; produce a relative ordering // // IF RESULT // -------------------------- // str1 < str2 => -1 // str1 = str2 => 0 // str1 > str2 => +1 // // The lower case table starts with 256 entries (one for each of the upper bytes // of the original Unicode char). If that entry is zero, then all characters with // that upper byte are already case folded. If the entry is non-zero, then it is // the _index_ (not byte offset) of the start of the sub-table for the characters // with that upper byte. All ignorable characters are folded to the value zero. // // In pseudocode: // // Let c = source Unicode character // Let table[] = lower case table // // lower = table[highbyte(c)] // if (lower == 0) // lower = c // else // lower = table[lower+lowbyte(c)] // // if (lower == 0) // ignore this character // // To handle ignorable characters, we now need a loop to find the next valid // character. Also, we can't pre-compute the number of characters to compare; // the string length might be larger than the number of non-ignorable characters. // Further, we must be able to handle ignorable characters at any point in the // string, including as the first or last characters. We use a zero value as a // sentinel to detect both end-of-string and ignorable characters. Since the File // Manager doesn't prevent the NUL character (value zero) as part of a filename, // the case mapping table is assumed to map u+0000 to some non-zero value (like // 0xFFFF, which is an invalid Unicode character). // // Pseudocode: // // while (1) { // c1 = GetNextValidChar(str1) // returns zero if at end of string // c2 = GetNextValidChar(str2) // // if (c1 != c2) break // found a difference // // if (c1 == 0) // reached end of string on both // // strings at once? // return 0; // yes, so strings are equal // } // // // When we get here, c1 != c2. So, we just need to determine which one is // // less. // if (c1 < c2) // return -1; // else // return 1; // SInt32 FastUnicodeCompare ( register ConstUniCharArrayPtr str1, register ItemCount length1, register ConstUniCharArrayPtr str2, register ItemCount length2) { register UInt16 c1,c2; register UInt16 temp; register UInt16* lowerCaseTable; lowerCaseTable = gLowerCaseTable; while (1) { // Set default values for c1, c2 in case there are no more valid chars c1 = 0; c2 = 0; // Find next non-ignorable char from str1, or zero if no more while (length1 && c1 == 0) { c1 = *(str1++); --length1; if ((temp = lowerCaseTable[c1>>8]) != 0) // is there a subtable // for this upper byte? c1 = lowerCaseTable[temp + (c1 & 0x00FF)]; // yes, so fold the char } // Find next non-ignorable char from str2, or zero if no more while (length2 && c2 == 0) { c2 = *(str2++); --length2; if ((temp = lowerCaseTable[c2>>8]) != 0) // is there a subtable // for this upper byte? c2 = lowerCaseTable[temp + (c2 & 0x00FF)]; // yes, so fold the char } if (c1 != c2) // found a difference, so stop looping break; if (c1 == 0) // did we reach the end of both strings at the same time? return 0; // yes, so strings are equal } if (c1 < c2) return -1; else return 1; } /* The lower case table consists of a 256-entry high-byte table followed by some number of 256-entry subtables. The high-byte table contains either an offset to the subtable for characters with that high byte or zero, which means that there are no case mappings or ignored characters in that block. Ignored characters are mapped to zero. */ UInt16 gLowerCaseTable[] = { // High-byte indices ( == 0 iff no case mapping and no ignorables ) /* 0 */ 0x0100, 0x0200, 0x0000, 0x0300, 0x0400, 0x0500, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 1 */ 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 2 */ 0x0700, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 4 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 5 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 6 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 9 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* A */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* B */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* C */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* D */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* E */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* F */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0900, 0x0A00, // Table 1 (for high byte 0x00) /* 0 */ 0xFFFF, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, /* 1 */ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, /* 2 */ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, /* 3 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, /* 4 */ 0x0040, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, /* 5 */ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, /* 6 */ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, /* 7 */ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, /* 8 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, /* 9 */ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, /* A */ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, /* B */ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, /* C */ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00E6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, /* D */ 0x00F0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00F8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00FE, 0x00DF, /* E */ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, /* F */ 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, // Table 2 (for high byte 0x01) /* 0 */ 0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0109, 0x010A, 0x010B, 0x010C, 0x010D, 0x010E, 0x010F, /* 1 */ 0x0111, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117, 0x0118, 0x0119, 0x011A, 0x011B, 0x011C, 0x011D, 0x011E, 0x011F, /* 2 */ 0x0120, 0x0121, 0x0122, 0x0123, 0x0124, 0x0125, 0x0127, 0x0127, 0x0128, 0x0129, 0x012A, 0x012B, 0x012C, 0x012D, 0x012E, 0x012F, /* 3 */ 0x0130, 0x0131, 0x0133, 0x0133, 0x0134, 0x0135, 0x0136, 0x0137, 0x0138, 0x0139, 0x013A, 0x013B, 0x013C, 0x013D, 0x013E, 0x0140, /* 4 */ 0x0140, 0x0142, 0x0142, 0x0143, 0x0144, 0x0145, 0x0146, 0x0147, 0x0148, 0x0149, 0x014B, 0x014B, 0x014C, 0x014D, 0x014E, 0x014F, /* 5 */ 0x0150, 0x0151, 0x0153, 0x0153, 0x0154, 0x0155, 0x0156, 0x0157, 0x0158, 0x0159, 0x015A, 0x015B, 0x015C, 0x015D, 0x015E, 0x015F, /* 6 */ 0x0160, 0x0161, 0x0162, 0x0163, 0x0164, 0x0165, 0x0167, 0x0167, 0x0168, 0x0169, 0x016A, 0x016B, 0x016C, 0x016D, 0x016E, 0x016F, /* 7 */ 0x0170, 0x0171, 0x0172, 0x0173, 0x0174, 0x0175, 0x0176, 0x0177, 0x0178, 0x0179, 0x017A, 0x017B, 0x017C, 0x017D, 0x017E, 0x017F, /* 8 */ 0x0180, 0x0253, 0x0183, 0x0183, 0x0185, 0x0185, 0x0254, 0x0188, 0x0188, 0x0256, 0x0257, 0x018C, 0x018C, 0x018D, 0x01DD, 0x0259, /* 9 */ 0x025B, 0x0192, 0x0192, 0x0260, 0x0263, 0x0195, 0x0269, 0x0268, 0x0199, 0x0199, 0x019A, 0x019B, 0x026F, 0x0272, 0x019E, 0x0275, /* A */ 0x01A0, 0x01A1, 0x01A3, 0x01A3, 0x01A5, 0x01A5, 0x01A6, 0x01A8, 0x01A8, 0x0283, 0x01AA, 0x01AB, 0x01AD, 0x01AD, 0x0288, 0x01AF, /* B */ 0x01B0, 0x028A, 0x028B, 0x01B4, 0x01B4, 0x01B6, 0x01B6, 0x0292, 0x01B9, 0x01B9, 0x01BA, 0x01BB, 0x01BD, 0x01BD, 0x01BE, 0x01BF, /* C */ 0x01C0, 0x01C1, 0x01C2, 0x01C3, 0x01C6, 0x01C6, 0x01C6, 0x01C9, 0x01C9, 0x01C9, 0x01CC, 0x01CC, 0x01CC, 0x01CD, 0x01CE, 0x01CF, /* D */ 0x01D0, 0x01D1, 0x01D2, 0x01D3, 0x01D4, 0x01D5, 0x01D6, 0x01D7, 0x01D8, 0x01D9, 0x01DA, 0x01DB, 0x01DC, 0x01DD, 0x01DE, 0x01DF, /* E */ 0x01E0, 0x01E1, 0x01E2, 0x01E3, 0x01E5, 0x01E5, 0x01E6, 0x01E7, 0x01E8, 0x01E9, 0x01EA, 0x01EB, 0x01EC, 0x01ED, 0x01EE, 0x01EF, /* F */ 0x01F0, 0x01F3, 0x01F3, 0x01F3, 0x01F4, 0x01F5, 0x01F6, 0x01F7, 0x01F8, 0x01F9, 0x01FA, 0x01FB, 0x01FC, 0x01FD, 0x01FE, 0x01FF, // Table 3 (for high byte 0x03) /* 0 */ 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, 0x0308, 0x0309, 0x030A, 0x030B, 0x030C, 0x030D, 0x030E, 0x030F, /* 1 */ 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, 0x0318, 0x0319, 0x031A, 0x031B, 0x031C, 0x031D, 0x031E, 0x031F, /* 2 */ 0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 0x0327, 0x0328, 0x0329, 0x032A, 0x032B, 0x032C, 0x032D, 0x032E, 0x032F, /* 3 */ 0x0330, 0x0331, 0x0332, 0x0333, 0x0334, 0x0335, 0x0336, 0x0337, 0x0338, 0x0339, 0x033A, 0x033B, 0x033C, 0x033D, 0x033E, 0x033F, /* 4 */ 0x0340, 0x0341, 0x0342, 0x0343, 0x0344, 0x0345, 0x0346, 0x0347, 0x0348, 0x0349, 0x034A, 0x034B, 0x034C, 0x034D, 0x034E, 0x034F, /* 5 */ 0x0350, 0x0351, 0x0352, 0x0353, 0x0354, 0x0355, 0x0356, 0x0357, 0x0358, 0x0359, 0x035A, 0x035B, 0x035C, 0x035D, 0x035E, 0x035F, /* 6 */ 0x0360, 0x0361, 0x0362, 0x0363, 0x0364, 0x0365, 0x0366, 0x0367, 0x0368, 0x0369, 0x036A, 0x036B, 0x036C, 0x036D, 0x036E, 0x036F, /* 7 */ 0x0370, 0x0371, 0x0372, 0x0373, 0x0374, 0x0375, 0x0376, 0x0377, 0x0378, 0x0379, 0x037A, 0x037B, 0x037C, 0x037D, 0x037E, 0x037F, /* 8 */ 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0386, 0x0387, 0x0388, 0x0389, 0x038A, 0x038B, 0x038C, 0x038D, 0x038E, 0x038F, /* 9 */ 0x0390, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, /* A */ 0x03C0, 0x03C1, 0x03A2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, /* B */ 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, /* C */ 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x03CF, /* D */ 0x03D0, 0x03D1, 0x03D2, 0x03D3, 0x03D4, 0x03D5, 0x03D6, 0x03D7, 0x03D8, 0x03D9, 0x03DA, 0x03DB, 0x03DC, 0x03DD, 0x03DE, 0x03DF, /* E */ 0x03E0, 0x03E1, 0x03E3, 0x03E3, 0x03E5, 0x03E5, 0x03E7, 0x03E7, 0x03E9, 0x03E9, 0x03EB, 0x03EB, 0x03ED, 0x03ED, 0x03EF, 0x03EF, /* F */ 0x03F0, 0x03F1, 0x03F2, 0x03F3, 0x03F4, 0x03F5, 0x03F6, 0x03F7, 0x03F8, 0x03F9, 0x03FA, 0x03FB, 0x03FC, 0x03FD, 0x03FE, 0x03FF, // Table 4 (for high byte 0x04) /* 0 */ 0x0400, 0x0401, 0x0452, 0x0403, 0x0454, 0x0455, 0x0456, 0x0407, 0x0458, 0x0459, 0x045A, 0x045B, 0x040C, 0x040D, 0x040E, 0x045F, /* 1 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0419, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, /* 2 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, /* 3 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, /* 4 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, /* 5 */ 0x0450, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x045D, 0x045E, 0x045F, /* 6 */ 0x0461, 0x0461, 0x0463, 0x0463, 0x0465, 0x0465, 0x0467, 0x0467, 0x0469, 0x0469, 0x046B, 0x046B, 0x046D, 0x046D, 0x046F, 0x046F, /* 7 */ 0x0471, 0x0471, 0x0473, 0x0473, 0x0475, 0x0475, 0x0476, 0x0477, 0x0479, 0x0479, 0x047B, 0x047B, 0x047D, 0x047D, 0x047F, 0x047F, /* 8 */ 0x0481, 0x0481, 0x0482, 0x0483, 0x0484, 0x0485, 0x0486, 0x0487, 0x0488, 0x0489, 0x048A, 0x048B, 0x048C, 0x048D, 0x048E, 0x048F, /* 9 */ 0x0491, 0x0491, 0x0493, 0x0493, 0x0495, 0x0495, 0x0497, 0x0497, 0x0499, 0x0499, 0x049B, 0x049B, 0x049D, 0x049D, 0x049F, 0x049F, /* A */ 0x04A1, 0x04A1, 0x04A3, 0x04A3, 0x04A5, 0x04A5, 0x04A7, 0x04A7, 0x04A9, 0x04A9, 0x04AB, 0x04AB, 0x04AD, 0x04AD, 0x04AF, 0x04AF, /* B */ 0x04B1, 0x04B1, 0x04B3, 0x04B3, 0x04B5, 0x04B5, 0x04B7, 0x04B7, 0x04B9, 0x04B9, 0x04BB, 0x04BB, 0x04BD, 0x04BD, 0x04BF, 0x04BF, /* C */ 0x04C0, 0x04C1, 0x04C2, 0x04C4, 0x04C4, 0x04C5, 0x04C6, 0x04C8, 0x04C8, 0x04C9, 0x04CA, 0x04CC, 0x04CC, 0x04CD, 0x04CE, 0x04CF, /* D */ 0x04D0, 0x04D1, 0x04D2, 0x04D3, 0x04D4, 0x04D5, 0x04D6, 0x04D7, 0x04D8, 0x04D9, 0x04DA, 0x04DB, 0x04DC, 0x04DD, 0x04DE, 0x04DF, /* E */ 0x04E0, 0x04E1, 0x04E2, 0x04E3, 0x04E4, 0x04E5, 0x04E6, 0x04E7, 0x04E8, 0x04E9, 0x04EA, 0x04EB, 0x04EC, 0x04ED, 0x04EE, 0x04EF, /* F */ 0x04F0, 0x04F1, 0x04F2, 0x04F3, 0x04F4, 0x04F5, 0x04F6, 0x04F7, 0x04F8, 0x04F9, 0x04FA, 0x04FB, 0x04FC, 0x04FD, 0x04FE, 0x04FF, // Table 5 (for high byte 0x05) /* 0 */ 0x0500, 0x0501, 0x0502, 0x0503, 0x0504, 0x0505, 0x0506, 0x0507, 0x0508, 0x0509, 0x050A, 0x050B, 0x050C, 0x050D, 0x050E, 0x050F, /* 1 */ 0x0510, 0x0511, 0x0512, 0x0513, 0x0514, 0x0515, 0x0516, 0x0517, 0x0518, 0x0519, 0x051A, 0x051B, 0x051C, 0x051D, 0x051E, 0x051F, /* 2 */ 0x0520, 0x0521, 0x0522, 0x0523, 0x0524, 0x0525, 0x0526, 0x0527, 0x0528, 0x0529, 0x052A, 0x052B, 0x052C, 0x052D, 0x052E, 0x052F, /* 3 */ 0x0530, 0x0561, 0x0562, 0x0563, 0x0564, 0x0565, 0x0566, 0x0567, 0x0568, 0x0569, 0x056A, 0x056B, 0x056C, 0x056D, 0x056E, 0x056F, /* 4 */ 0x0570, 0x0571, 0x0572, 0x0573, 0x0574, 0x0575, 0x0576, 0x0577, 0x0578, 0x0579, 0x057A, 0x057B, 0x057C, 0x057D, 0x057E, 0x057F, /* 5 */ 0x0580, 0x0581, 0x0582, 0x0583, 0x0584, 0x0585, 0x0586, 0x0557, 0x0558, 0x0559, 0x055A, 0x055B, 0x055C, 0x055D, 0x055E, 0x055F, /* 6 */ 0x0560, 0x0561, 0x0562, 0x0563, 0x0564, 0x0565, 0x0566, 0x0567, 0x0568, 0x0569, 0x056A, 0x056B, 0x056C, 0x056D, 0x056E, 0x056F, /* 7 */ 0x0570, 0x0571, 0x0572, 0x0573, 0x0574, 0x0575, 0x0576, 0x0577, 0x0578, 0x0579, 0x057A, 0x057B, 0x057C, 0x057D, 0x057E, 0x057F, /* 8 */ 0x0580, 0x0581, 0x0582, 0x0583, 0x0584, 0x0585, 0x0586, 0x0587, 0x0588, 0x0589, 0x058A, 0x058B, 0x058C, 0x058D, 0x058E, 0x058F, /* 9 */ 0x0590, 0x0591, 0x0592, 0x0593, 0x0594, 0x0595, 0x0596, 0x0597, 0x0598, 0x0599, 0x059A, 0x059B, 0x059C, 0x059D, 0x059E, 0x059F, /* A */ 0x05A0, 0x05A1, 0x05A2, 0x05A3, 0x05A4, 0x05A5, 0x05A6, 0x05A7, 0x05A8, 0x05A9, 0x05AA, 0x05AB, 0x05AC, 0x05AD, 0x05AE, 0x05AF, /* B */ 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, 0x05B8, 0x05B9, 0x05BA, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF, /* C */ 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05C4, 0x05C5, 0x05C6, 0x05C7, 0x05C8, 0x05C9, 0x05CA, 0x05CB, 0x05CC, 0x05CD, 0x05CE, 0x05CF, /* D */ 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, /* E */ 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x05EB, 0x05EC, 0x05ED, 0x05EE, 0x05EF, /* F */ 0x05F0, 0x05F1, 0x05F2, 0x05F3, 0x05F4, 0x05F5, 0x05F6, 0x05F7, 0x05F8, 0x05F9, 0x05FA, 0x05FB, 0x05FC, 0x05FD, 0x05FE, 0x05FF, // Table 6 (for high byte 0x10) /* 0 */ 0x1000, 0x1001, 0x1002, 0x1003, 0x1004, 0x1005, 0x1006, 0x1007, 0x1008, 0x1009, 0x100A, 0x100B, 0x100C, 0x100D, 0x100E, 0x100F, /* 1 */ 0x1010, 0x1011, 0x1012, 0x1013, 0x1014, 0x1015, 0x1016, 0x1017, 0x1018, 0x1019, 0x101A, 0x101B, 0x101C, 0x101D, 0x101E, 0x101F, /* 2 */ 0x1020, 0x1021, 0x1022, 0x1023, 0x1024, 0x1025, 0x1026, 0x1027, 0x1028, 0x1029, 0x102A, 0x102B, 0x102C, 0x102D, 0x102E, 0x102F, /* 3 */ 0x1030, 0x1031, 0x1032, 0x1033, 0x1034, 0x1035, 0x1036, 0x1037, 0x1038, 0x1039, 0x103A, 0x103B, 0x103C, 0x103D, 0x103E, 0x103F, /* 4 */ 0x1040, 0x1041, 0x1042, 0x1043, 0x1044, 0x1045, 0x1046, 0x1047, 0x1048, 0x1049, 0x104A, 0x104B, 0x104C, 0x104D, 0x104E, 0x104F, /* 5 */ 0x1050, 0x1051, 0x1052, 0x1053, 0x1054, 0x1055, 0x1056, 0x1057, 0x1058, 0x1059, 0x105A, 0x105B, 0x105C, 0x105D, 0x105E, 0x105F, /* 6 */ 0x1060, 0x1061, 0x1062, 0x1063, 0x1064, 0x1065, 0x1066, 0x1067, 0x1068, 0x1069, 0x106A, 0x106B, 0x106C, 0x106D, 0x106E, 0x106F, /* 7 */ 0x1070, 0x1071, 0x1072, 0x1073, 0x1074, 0x1075, 0x1076, 0x1077, 0x1078, 0x1079, 0x107A, 0x107B, 0x107C, 0x107D, 0x107E, 0x107F, /* 8 */ 0x1080, 0x1081, 0x1082, 0x1083, 0x1084, 0x1085, 0x1086, 0x1087, 0x1088, 0x1089, 0x108A, 0x108B, 0x108C, 0x108D, 0x108E, 0x108F, /* 9 */ 0x1090, 0x1091, 0x1092, 0x1093, 0x1094, 0x1095, 0x1096, 0x1097, 0x1098, 0x1099, 0x109A, 0x109B, 0x109C, 0x109D, 0x109E, 0x109F, /* A */ 0x10D0, 0x10D1, 0x10D2, 0x10D3, 0x10D4, 0x10D5, 0x10D6, 0x10D7, 0x10D8, 0x10D9, 0x10DA, 0x10DB, 0x10DC, 0x10DD, 0x10DE, 0x10DF, /* B */ 0x10E0, 0x10E1, 0x10E2, 0x10E3, 0x10E4, 0x10E5, 0x10E6, 0x10E7, 0x10E8, 0x10E9, 0x10EA, 0x10EB, 0x10EC, 0x10ED, 0x10EE, 0x10EF, /* C */ 0x10F0, 0x10F1, 0x10F2, 0x10F3, 0x10F4, 0x10F5, 0x10C6, 0x10C7, 0x10C8, 0x10C9, 0x10CA, 0x10CB, 0x10CC, 0x10CD, 0x10CE, 0x10CF, /* D */ 0x10D0, 0x10D1, 0x10D2, 0x10D3, 0x10D4, 0x10D5, 0x10D6, 0x10D7, 0x10D8, 0x10D9, 0x10DA, 0x10DB, 0x10DC, 0x10DD, 0x10DE, 0x10DF, /* E */ 0x10E0, 0x10E1, 0x10E2, 0x10E3, 0x10E4, 0x10E5, 0x10E6, 0x10E7, 0x10E8, 0x10E9, 0x10EA, 0x10EB, 0x10EC, 0x10ED, 0x10EE, 0x10EF, /* F */ 0x10F0, 0x10F1, 0x10F2, 0x10F3, 0x10F4, 0x10F5, 0x10F6, 0x10F7, 0x10F8, 0x10F9, 0x10FA, 0x10FB, 0x10FC, 0x10FD, 0x10FE, 0x10FF, // Table 7 (for high byte 0x20) /* 0 */ 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x200B, 0x0000, 0x0000, 0x0000, 0x0000, /* 1 */ 0x2010, 0x2011, 0x2012, 0x2013, 0x2014, 0x2015, 0x2016, 0x2017, 0x2018, 0x2019, 0x201A, 0x201B, 0x201C, 0x201D, 0x201E, 0x201F, /* 2 */ 0x2020, 0x2021, 0x2022, 0x2023, 0x2024, 0x2025, 0x2026, 0x2027, 0x2028, 0x2029, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x202F, /* 3 */ 0x2030, 0x2031, 0x2032, 0x2033, 0x2034, 0x2035, 0x2036, 0x2037, 0x2038, 0x2039, 0x203A, 0x203B, 0x203C, 0x203D, 0x203E, 0x203F, /* 4 */ 0x2040, 0x2041, 0x2042, 0x2043, 0x2044, 0x2045, 0x2046, 0x2047, 0x2048, 0x2049, 0x204A, 0x204B, 0x204C, 0x204D, 0x204E, 0x204F, /* 5 */ 0x2050, 0x2051, 0x2052, 0x2053, 0x2054, 0x2055, 0x2056, 0x2057, 0x2058, 0x2059, 0x205A, 0x205B, 0x205C, 0x205D, 0x205E, 0x205F, /* 6 */ 0x2060, 0x2061, 0x2062, 0x2063, 0x2064, 0x2065, 0x2066, 0x2067, 0x2068, 0x2069, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7 */ 0x2070, 0x2071, 0x2072, 0x2073, 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079, 0x207A, 0x207B, 0x207C, 0x207D, 0x207E, 0x207F, /* 8 */ 0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087, 0x2088, 0x2089, 0x208A, 0x208B, 0x208C, 0x208D, 0x208E, 0x208F, /* 9 */ 0x2090, 0x2091, 0x2092, 0x2093, 0x2094, 0x2095, 0x2096, 0x2097, 0x2098, 0x2099, 0x209A, 0x209B, 0x209C, 0x209D, 0x209E, 0x209F, /* A */ 0x20A0, 0x20A1, 0x20A2, 0x20A3, 0x20A4, 0x20A5, 0x20A6, 0x20A7, 0x20A8, 0x20A9, 0x20AA, 0x20AB, 0x20AC, 0x20AD, 0x20AE, 0x20AF, /* B */ 0x20B0, 0x20B1, 0x20B2, 0x20B3, 0x20B4, 0x20B5, 0x20B6, 0x20B7, 0x20B8, 0x20B9, 0x20BA, 0x20BB, 0x20BC, 0x20BD, 0x20BE, 0x20BF, /* C */ 0x20C0, 0x20C1, 0x20C2, 0x20C3, 0x20C4, 0x20C5, 0x20C6, 0x20C7, 0x20C8, 0x20C9, 0x20CA, 0x20CB, 0x20CC, 0x20CD, 0x20CE, 0x20CF, /* D */ 0x20D0, 0x20D1, 0x20D2, 0x20D3, 0x20D4, 0x20D5, 0x20D6, 0x20D7, 0x20D8, 0x20D9, 0x20DA, 0x20DB, 0x20DC, 0x20DD, 0x20DE, 0x20DF, /* E */ 0x20E0, 0x20E1, 0x20E2, 0x20E3, 0x20E4, 0x20E5, 0x20E6, 0x20E7, 0x20E8, 0x20E9, 0x20EA, 0x20EB, 0x20EC, 0x20ED, 0x20EE, 0x20EF, /* F */ 0x20F0, 0x20F1, 0x20F2, 0x20F3, 0x20F4, 0x20F5, 0x20F6, 0x20F7, 0x20F8, 0x20F9, 0x20FA, 0x20FB, 0x20FC, 0x20FD, 0x20FE, 0x20FF, // Table 8 (for high byte 0x21) /* 0 */ 0x2100, 0x2101, 0x2102, 0x2103, 0x2104, 0x2105, 0x2106, 0x2107, 0x2108, 0x2109, 0x210A, 0x210B, 0x210C, 0x210D, 0x210E, 0x210F, /* 1 */ 0x2110, 0x2111, 0x2112, 0x2113, 0x2114, 0x2115, 0x2116, 0x2117, 0x2118, 0x2119, 0x211A, 0x211B, 0x211C, 0x211D, 0x211E, 0x211F, /* 2 */ 0x2120, 0x2121, 0x2122, 0x2123, 0x2124, 0x2125, 0x2126, 0x2127, 0x2128, 0x2129, 0x212A, 0x212B, 0x212C, 0x212D, 0x212E, 0x212F, /* 3 */ 0x2130, 0x2131, 0x2132, 0x2133, 0x2134, 0x2135, 0x2136, 0x2137, 0x2138, 0x2139, 0x213A, 0x213B, 0x213C, 0x213D, 0x213E, 0x213F, /* 4 */ 0x2140, 0x2141, 0x2142, 0x2143, 0x2144, 0x2145, 0x2146, 0x2147, 0x2148, 0x2149, 0x214A, 0x214B, 0x214C, 0x214D, 0x214E, 0x214F, /* 5 */ 0x2150, 0x2151, 0x2152, 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215A, 0x215B, 0x215C, 0x215D, 0x215E, 0x215F, /* 6 */ 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, /* 7 */ 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, /* 8 */ 0x2180, 0x2181, 0x2182, 0x2183, 0x2184, 0x2185, 0x2186, 0x2187, 0x2188, 0x2189, 0x218A, 0x218B, 0x218C, 0x218D, 0x218E, 0x218F, /* 9 */ 0x2190, 0x2191, 0x2192, 0x2193, 0x2194, 0x2195, 0x2196, 0x2197, 0x2198, 0x2199, 0x219A, 0x219B, 0x219C, 0x219D, 0x219E, 0x219F, /* A */ 0x21A0, 0x21A1, 0x21A2, 0x21A3, 0x21A4, 0x21A5, 0x21A6, 0x21A7, 0x21A8, 0x21A9, 0x21AA, 0x21AB, 0x21AC, 0x21AD, 0x21AE, 0x21AF, /* B */ 0x21B0, 0x21B1, 0x21B2, 0x21B3, 0x21B4, 0x21B5, 0x21B6, 0x21B7, 0x21B8, 0x21B9, 0x21BA, 0x21BB, 0x21BC, 0x21BD, 0x21BE, 0x21BF, /* C */ 0x21C0, 0x21C1, 0x21C2, 0x21C3, 0x21C4, 0x21C5, 0x21C6, 0x21C7, 0x21C8, 0x21C9, 0x21CA, 0x21CB, 0x21CC, 0x21CD, 0x21CE, 0x21CF, /* D */ 0x21D0, 0x21D1, 0x21D2, 0x21D3, 0x21D4, 0x21D5, 0x21D6, 0x21D7, 0x21D8, 0x21D9, 0x21DA, 0x21DB, 0x21DC, 0x21DD, 0x21DE, 0x21DF, /* E */ 0x21E0, 0x21E1, 0x21E2, 0x21E3, 0x21E4, 0x21E5, 0x21E6, 0x21E7, 0x21E8, 0x21E9, 0x21EA, 0x21EB, 0x21EC, 0x21ED, 0x21EE, 0x21EF, /* F */ 0x21F0, 0x21F1, 0x21F2, 0x21F3, 0x21F4, 0x21F5, 0x21F6, 0x21F7, 0x21F8, 0x21F9, 0x21FA, 0x21FB, 0x21FC, 0x21FD, 0x21FE, 0x21FF, // Table 9 (for high byte 0xFE) /* 0 */ 0xFE00, 0xFE01, 0xFE02, 0xFE03, 0xFE04, 0xFE05, 0xFE06, 0xFE07, 0xFE08, 0xFE09, 0xFE0A, 0xFE0B, 0xFE0C, 0xFE0D, 0xFE0E, 0xFE0F, /* 1 */ 0xFE10, 0xFE11, 0xFE12, 0xFE13, 0xFE14, 0xFE15, 0xFE16, 0xFE17, 0xFE18, 0xFE19, 0xFE1A, 0xFE1B, 0xFE1C, 0xFE1D, 0xFE1E, 0xFE1F, /* 2 */ 0xFE20, 0xFE21, 0xFE22, 0xFE23, 0xFE24, 0xFE25, 0xFE26, 0xFE27, 0xFE28, 0xFE29, 0xFE2A, 0xFE2B, 0xFE2C, 0xFE2D, 0xFE2E, 0xFE2F, /* 3 */ 0xFE30, 0xFE31, 0xFE32, 0xFE33, 0xFE34, 0xFE35, 0xFE36, 0xFE37, 0xFE38, 0xFE39, 0xFE3A, 0xFE3B, 0xFE3C, 0xFE3D, 0xFE3E, 0xFE3F, /* 4 */ 0xFE40, 0xFE41, 0xFE42, 0xFE43, 0xFE44, 0xFE45, 0xFE46, 0xFE47, 0xFE48, 0xFE49, 0xFE4A, 0xFE4B, 0xFE4C, 0xFE4D, 0xFE4E, 0xFE4F, /* 5 */ 0xFE50, 0xFE51, 0xFE52, 0xFE53, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFE58, 0xFE59, 0xFE5A, 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0xFE5F, /* 6 */ 0xFE60, 0xFE61, 0xFE62, 0xFE63, 0xFE64, 0xFE65, 0xFE66, 0xFE67, 0xFE68, 0xFE69, 0xFE6A, 0xFE6B, 0xFE6C, 0xFE6D, 0xFE6E, 0xFE6F, /* 7 */ 0xFE70, 0xFE71, 0xFE72, 0xFE73, 0xFE74, 0xFE75, 0xFE76, 0xFE77, 0xFE78, 0xFE79, 0xFE7A, 0xFE7B, 0xFE7C, 0xFE7D, 0xFE7E, 0xFE7F, /* 8 */ 0xFE80, 0xFE81, 0xFE82, 0xFE83, 0xFE84, 0xFE85, 0xFE86, 0xFE87, 0xFE88, 0xFE89, 0xFE8A, 0xFE8B, 0xFE8C, 0xFE8D, 0xFE8E, 0xFE8F, /* 9 */ 0xFE90, 0xFE91, 0xFE92, 0xFE93, 0xFE94, 0xFE95, 0xFE96, 0xFE97, 0xFE98, 0xFE99, 0xFE9A, 0xFE9B, 0xFE9C, 0xFE9D, 0xFE9E, 0xFE9F, /* A */ 0xFEA0, 0xFEA1, 0xFEA2, 0xFEA3, 0xFEA4, 0xFEA5, 0xFEA6, 0xFEA7, 0xFEA8, 0xFEA9, 0xFEAA, 0xFEAB, 0xFEAC, 0xFEAD, 0xFEAE, 0xFEAF, /* B */ 0xFEB0, 0xFEB1, 0xFEB2, 0xFEB3, 0xFEB4, 0xFEB5, 0xFEB6, 0xFEB7, 0xFEB8, 0xFEB9, 0xFEBA, 0xFEBB, 0xFEBC, 0xFEBD, 0xFEBE, 0xFEBF, /* C */ 0xFEC0, 0xFEC1, 0xFEC2, 0xFEC3, 0xFEC4, 0xFEC5, 0xFEC6, 0xFEC7, 0xFEC8, 0xFEC9, 0xFECA, 0xFECB, 0xFECC, 0xFECD, 0xFECE, 0xFECF, /* D */ 0xFED0, 0xFED1, 0xFED2, 0xFED3, 0xFED4, 0xFED5, 0xFED6, 0xFED7, 0xFED8, 0xFED9, 0xFEDA, 0xFEDB, 0xFEDC, 0xFEDD, 0xFEDE, 0xFEDF, /* E */ 0xFEE0, 0xFEE1, 0xFEE2, 0xFEE3, 0xFEE4, 0xFEE5, 0xFEE6, 0xFEE7, 0xFEE8, 0xFEE9, 0xFEEA, 0xFEEB, 0xFEEC, 0xFEED, 0xFEEE, 0xFEEF, /* F */ 0xFEF0, 0xFEF1, 0xFEF2, 0xFEF3, 0xFEF4, 0xFEF5, 0xFEF6, 0xFEF7, 0xFEF8, 0xFEF9, 0xFEFA, 0xFEFB, 0xFEFC, 0xFEFD, 0xFEFE, 0x0000, // Table 10 (for high byte 0xFF) /* 0 */ 0xFF00, 0xFF01, 0xFF02, 0xFF03, 0xFF04, 0xFF05, 0xFF06, 0xFF07, 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, /* 1 */ 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, /* 2 */ 0xFF20, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, /* 3 */ 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0xFF3B, 0xFF3C, 0xFF3D, 0xFF3E, 0xFF3F, /* 4 */ 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, /* 5 */ 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFF5E, 0xFF5F, /* 6 */ 0xFF60, 0xFF61, 0xFF62, 0xFF63, 0xFF64, 0xFF65, 0xFF66, 0xFF67, 0xFF68, 0xFF69, 0xFF6A, 0xFF6B, 0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F, /* 7 */ 0xFF70, 0xFF71, 0xFF72, 0xFF73, 0xFF74, 0xFF75, 0xFF76, 0xFF77, 0xFF78, 0xFF79, 0xFF7A, 0xFF7B, 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, /* 8 */ 0xFF80, 0xFF81, 0xFF82, 0xFF83, 0xFF84, 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0xFF89, 0xFF8A, 0xFF8B, 0xFF8C, 0xFF8D, 0xFF8E, 0xFF8F, /* 9 */ 0xFF90, 0xFF91, 0xFF92, 0xFF93, 0xFF94, 0xFF95, 0xFF96, 0xFF97, 0xFF98, 0xFF99, 0xFF9A, 0xFF9B, 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F, /* A */ 0xFFA0, 0xFFA1, 0xFFA2, 0xFFA3, 0xFFA4, 0xFFA5, 0xFFA6, 0xFFA7, 0xFFA8, 0xFFA9, 0xFFAA, 0xFFAB, 0xFFAC, 0xFFAD, 0xFFAE, 0xFFAF, /* B */ 0xFFB0, 0xFFB1, 0xFFB2, 0xFFB3, 0xFFB4, 0xFFB5, 0xFFB6, 0xFFB7, 0xFFB8, 0xFFB9, 0xFFBA, 0xFFBB, 0xFFBC, 0xFFBD, 0xFFBE, 0xFFBF, /* C */ 0xFFC0, 0xFFC1, 0xFFC2, 0xFFC3, 0xFFC4, 0xFFC5, 0xFFC6, 0xFFC7, 0xFFC8, 0xFFC9, 0xFFCA, 0xFFCB, 0xFFCC, 0xFFCD, 0xFFCE, 0xFFCF, /* D */ 0xFFD0, 0xFFD1, 0xFFD2, 0xFFD3, 0xFFD4, 0xFFD5, 0xFFD6, 0xFFD7, 0xFFD8, 0xFFD9, 0xFFDA, 0xFFDB, 0xFFDC, 0xFFDD, 0xFFDE, 0xFFDF, /* E */ 0xFFE0, 0xFFE1, 0xFFE2, 0xFFE3, 0xFFE4, 0xFFE5, 0xFFE6, 0xFFE7, 0xFFE8, 0xFFE9, 0xFFEA, 0xFFEB, 0xFFEC, 0xFFED, 0xFFEE, 0xFFEF, /* F */ 0xFFF0, 0xFFF1, 0xFFF2, 0xFFF3, 0xFFF4, 0xFFF5, 0xFFF6, 0xFFF7, 0xFFF8, 0xFFF9, 0xFFFA, 0xFFFB, 0xFFFC, 0xFFFD, 0xFFFE, 0xFFFF, }; hfsplus-1.0.4/libhfsp/src/Makefile.am0100644000000000000000000000246607442225010016155 0ustar rootroot# Makefile.am for libhfsp/src, used by automake # Created by Klaus Kaempf # # Copyright (C) 2000 Klaus Halfmann # Original code 1996-1998 by Robert Leslie # other work 2000 from Brad Boyer (flar@pants.nu) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # $Id: Makefile.am,v 1.2 2002/03/08 21:15:52 klaus Exp $ # lib_LTLIBRARIES = libhfsp.la libhfsp_la_SOURCES = \ blockiter.c btree.c btreecheck.c fscheck.c hfstime.c libhfsp.c os.c unicode.c \ record.c volume.c partitions.c CFLAGS = -O2 -Wall # I need to clean up these headers first before i can distribute them ... # include_HEADERS = apple.h hfs.h hfsp.h libhfsp.h hfsplus-1.0.4/libhfsp/src/apple.h0100644000000000000000000001124207442744341015400 0ustar rootroot/* * libhfsp - library for reading and writing Macintosh HFS+ volumes * * This file contains defintions that are special for Apple. * The names match the defintions found in Apple Header files. * * Copyright (C) 2000 Klaus Halfmann * Original code 1996-1998 by Robert Leslie * other work 2000 from Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: apple.h,v 1.3 2002/03/10 20:58:09 klaus Exp $ */ #define APPLE_H typedef signed char Char; typedef unsigned char UChar; typedef signed char SInt8; typedef unsigned char UInt8; typedef signed short SInt16; typedef unsigned short UInt16; typedef signed long SInt32; typedef unsigned long UInt32; typedef unsigned long OSType; typedef unsigned long long UInt64; #define PARTITION_SIG 0x504d /* 'PM' */ typedef struct { UInt16 pmSig; /* partition signature: should be 'PM' */ UInt16 pmSigPad; /* reserved stuff */ UInt32 pmMapBlkCnt; /* number of blocks in partition map */ UInt32 pmPyPartStart; /* startblock of the partition */ UInt32 pmPartBlkCnt; /* number of blocks in partition */ char pmPartName[ 32]; /* partition name */ char pmPartType[ 32]; /* partition type */ UInt32 pmLgDataStart; /* first logical block of data area */ UInt32 pmDataCnt; /* number of blocks in data area */ UInt32 pmPartStatus; /* partition status information */ UInt32 pmLgBootStart; /* first logical block of boot code */ UInt32 pmBootSize; /* size of boot code, in bytes */ UInt32 pmBootAddr; /* boot code load address */ UInt32 pmBootAddr2; /* reserved */ UInt32 pmBootEntry; /* boot code entry point */ UInt32 pmBootEntry2; /* reserved */ UInt32 pmBootCksum; /* boot code checksum */ char pmProcessor[ 16]; /* processor type */ UInt16 pmPad[ 188]; /* reserved, sums up with the rest to 512 */ } Partition; /* A point, normally used by Quickdraw, * but found in Finderinformation, too */ typedef struct { SInt16 v; /* vertical coordinate */ SInt16 h; /* horizontal coordinate */ } Point; /* A rectancle, normally used by Quickdraw, * but found in Finderinformation, too. */ typedef struct { SInt16 top; /* top edge of rectangle */ SInt16 left; /* left edge */ SInt16 bottom; /* bottom edge */ SInt16 right; /* right edge */ } Rect; /* Information about the location and size of a folder * used by the Finder. */ typedef struct { Rect frRect; /* folder's rectangle */ SInt16 frFlags; /* flags */ Point frLocation; /* folder's location */ SInt16 frView; /* folder's view */ } DInfo; /* Extended folder information used by the Finder ... */ typedef struct { Point frScroll; /* scroll position */ SInt32 frOpenChain; /* directory ID chain of open folders */ SInt16 frUnused; /* reserved */ SInt16 frComment; /* comment ID */ SInt32 frPutAway; /* directory ID */ } DXInfo; /* Finder information for a File */ typedef struct { OSType fdType; /* file type */ OSType fdCreator; /* file's creator */ SInt16 fdFlags; /* flags */ Point fdLocation; /* file's location */ SInt16 fdFldr; /* file's window */ } FInfo; /* Extendend Finder Information for a file */ typedef struct { SInt16 fdIconID; /* icon ID */ SInt16 fdUnused[4]; /* reserved */ SInt16 fdComment; /* comment ID */ SInt32 fdPutAway; /* home directory ID */ } FXInfo; /* Flagvalues for FInfo and DInfo */ # define HFS_FNDR_ISONDESK (1 << 0) # define HFS_FNDR_COLOR 0x0e # define HFS_FNDR_COLORRESERVED (1 << 4) # define HFS_FNDR_REQUIRESSWITCHLAUNCH (1 << 5) # define HFS_FNDR_ISSHARED (1 << 6) # define HFS_FNDR_HASNOINITS (1 << 7) # define HFS_FNDR_HASBEENINITED (1 << 8) # define HFS_FNDR_RESERVED (1 << 9) # define HFS_FNDR_HASCUSTOMICON (1 << 10) # define HFS_FNDR_ISSTATIONERY (1 << 11) # define HFS_FNDR_NAMELOCKED (1 << 12) # define HFS_FNDR_HASBUNDLE (1 << 13) # define HFS_FNDR_ISINVISIBLE (1 << 14) # define HFS_FNDR_ISALIAS (1 << 15) hfsplus-1.0.4/libhfsp/src/blockiter.c0100644000000000000000000000750007441220604016240 0ustar rootroot/* * libhfs - library for reading and writing Macintosh HFS volumes * * The iterator shown here iterates over the blocks of a fork. * * Copyright (C) 2000 Klaus Halfmann * Original work by 1996-1998 Robert Leslie * other work 2000 from Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: blockiter.c,v 1.1.1.1 2002/03/05 19:50:28 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # include # include # include # include # include # include "libhfsp.h" # include "blockiter.h" # include "volume.h" # include "record.h" # include "btree.h" # include "os.h" # include "swab.h" # include "hfstime.h" /* Initialize iterator for a given fork */ void blockiter_init(blockiter* b, volume* vol, hfsp_fork_raw* f, UInt8 forktype, UInt32 fileId) { b->vol = vol; b->curr_block = 0; b->block = 0; b->max_block = f->total_blocks; b->fileId = fileId; b->index = 0; b->file = f->extents; b->e = f->extents; b->forktype = forktype; b->in_extent = 0; } /* get next extent record when needed */ static int blockiter_next_extent(blockiter *b) { btree* extents_tree = volume_get_extents_tree(b->vol); int err; b->index = 0; if (b->in_extent) // already using extents record ? { err = record_next_extent(&b->er); // Hope there is no need to check this ... // if (b->er.key.start_block != b->curr_block) // HFSP_ERROR(ENOENT, // "Extents record inconistent"); } else { err = record_init_file(&b->er, extents_tree, b->forktype, b->fileId, b->curr_block); b->in_extent = -1; // true } b->e = b->er.extent; return err; } /* find next block of the fork iterating over */ int blockiter_next(blockiter *b) { b->curr_block ++; b->block ++; if (b->curr_block >= b->max_block) return -1; // end of Blocks, but no error // in current part of extent ? if (b->block >= b->e->block_count) { b->index++; b->block = 0; // reset relative position b->e++; if (b -> index >= 8) // need to fetch another extent { if (blockiter_next_extent(b)) HFSP_ERROR(ENOENT, "Extends record not found."); } } return 0; fail: return -1; } /* skip the indicated number of blocks */ int blockiter_skip(blockiter *b, UInt32 skip) { while (skip > 0) { // Skip to skip or end of current extent UInt32 diff = b->e->block_count - b->block; if (skip < diff) { diff = skip; skip = 0; } else skip -= diff; b->curr_block += diff; b->block += diff; if (b->curr_block >= b->max_block) return -1; // end of Blocks, but no error if (b->block >= b->e->block_count) { b->index++; b->block = 0; // reset relative position b->e++; if (b -> index >= 8) // need to fetch another extent { if (blockiter_next_extent(b)) HFSP_ERROR(ENOENT, "Extends record not found."); } } } // we are here when skip was null, thats ok return 0; fail: return -1; } /* return current block */ UInt32 blockiter_curr(blockiter *b) /* inline */ { return b->e->start_block + b->block; } hfsplus-1.0.4/libhfsp/src/blockiter.h0100644000000000000000000000433007441220604016243 0ustar rootroot/* * libhfs - library for reading and writing Macintosh HFS volumes * * The iterator shown here iterates over the blocks of a fork. * * Copyright (C) 2000 Klaus Halfmann * Original work by 1996-1998 Robert Leslie * other work 2000 from Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: blockiter.h,v 1.1.1.1 2002/03/05 19:50:28 klaus Exp $ */ /* Structure of the blockiterator */ typedef struct { volume* vol; // volume we iterate over UInt32 curr_block; // current, absolute block UInt32 block; // relative block in current extent UInt32 max_block; // Maximum allowed block UInt32 fileId; // id of file we iterate over int index; // 0 .. 7 in current extent hfsp_extent* file; // original extent record from file hfsp_extent* e; // current extentent under examination UInt8 forktype; // type of fork we iterate over UInt8 in_extent; // boolean 0 - in file extent // 1 - in extents file extent_record er; // record to iterate in extents file. } blockiter; /* Initialize iterator for a given fork */ extern void blockiter_init(blockiter* b, volume* vol, hfsp_fork_raw* f, UInt8 forktype, UInt32 fileId); /* find next block of the fork iterating over */ extern int blockiter_next(blockiter *b); /* skip the indicated number of blocks */ extern int blockiter_skip(blockiter *b, UInt32 skip); /* return current block */ extern inline UInt32 blockiter_curr(blockiter *b) { return b->e->start_block + b->block; } hfsplus-1.0.4/libhfsp/src/btree.c0100644000000000000000000004635707441220604015400 0ustar rootroot/* * libhfs - library for reading and writing Macintosh HFS volumes * The fucntions are used to handle the various forms of btrees * found on HFS+ volumes. * * The functions are used to handle the various forms of btrees * found on HFS+ volumes. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: btree.c,v 1.1.1.1 2002/03/05 19:50:28 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # include # include # include # include # include # include "libhfsp.h" # include "volume.h" # include "btree.h" # include "record.h" # include "swab.h" /* Read the node from the given buffer and swap the bytes. * * return pointer after reading the structure */ void* btree_readnode(btree_node_desc* node, void *p) { node->next = bswabU32_inc(p); node->prev = bswabU32_inc(p); node->kind = bswabU8_inc(p); node->height = bswabU8_inc(p); node->num_rec = bswabU16_inc(p); node->reserved = bswabU16_inc(p); return p; } /* Write the node to the given buffer and swap the bytes. * * return pointer after writing the structure */ void* btree_writenode(btree_node_desc* node, void *p) { bstoreU32_inc(p, node->next); bstoreU32_inc(p, node->prev); bstoreU8_inc (p, node->kind); bstoreU8_inc (p, node->height); bstoreU16_inc(p, node->num_rec); bstoreU16_inc(p, node->reserved); return p; } /* read a btree header from the given buffer and swap the bytes. * * return pointer after reading the structure */ void* btree_readhead(btree_head* head, void *p) { int i; head->depth = bswabU16_inc(p); head->root = bswabU32_inc(p); head->leaf_count = bswabU32_inc(p); head->leaf_head = bswabU32_inc(p); head->leaf_tail = bswabU32_inc(p); head->node_size = bswabU16_inc(p); head->max_key_len = bswabU16_inc(p); head->node_count = bswabU32_inc(p); head->free_nodes = bswabU32_inc(p); head->reserved1 = bswabU16_inc(p); head->clump_size = bswabU32_inc(p); head->btree_type = bswabU8_inc(p); head->reserved2 = bswabU8_inc(p); head->attributes = bswabU32_inc(p); for (i=0; i < 16; i++) head->reserved3[i] = bswabU32_inc(p); return p; } /* read a btree header from the given buffer and swap the bytes. * * return pointer after reading the structure */ void* btree_writehead(btree_head* head, void *p) { int i; bstoreU16_inc(p, head->depth); bstoreU32_inc(p, head->root); bstoreU32_inc(p, head->leaf_count); bstoreU32_inc(p, head->leaf_head); bstoreU32_inc(p, head->leaf_tail); bstoreU16_inc(p, head->node_size); bstoreU16_inc(p, head->max_key_len); bstoreU32_inc(p, head->node_count); bstoreU32_inc(p, head->free_nodes); bstoreU16_inc(p, head->reserved1); bstoreU32_inc(p, head->clump_size); bstoreU8_inc (p, head->btree_type); bstoreU8_inc (p, head->reserved2); bstoreU32_inc(p, head->attributes); for (i=0; i < 16; i++) bstoreU32_inc(p, head->reserved3[i]); return p; } /* Intialize cache with default cache Size, * must call node_cache_close to deallocate memory */ int node_cache_init(node_cache* cache, btree* tree, int size) { int nodebufsize; char * buf; cache->size = size; cache->currindex = 0; nodebufsize = tree->head.node_size + sizeof(node_buf); buf = malloc(size *(sizeof(node_entry) + nodebufsize)); if (!buf) return -1; cache -> nodebufsize = nodebufsize; cache -> entries = (node_entry*) buf; cache -> buffers = (char*) &cache->entries[size]; bzero(cache->entries, size*sizeof(node_entry)); return 0; } /* Like cache->buffers[i], since size of node_buf is variable */ static inline node_buf* node_buf_get(node_cache* cache, int i) { return (node_buf*) (cache->buffers + (i * cache->nodebufsize)); } /* write back a node at given node in fork with nodebuf */ static int btree_write_node(btree* bt, int index, char* nodebuf) { UInt16 blkpernode = bt->blkpernode; UInt16 nodeperblk = bt->nodeperblk; if (blkpernode) { return volume_writetofork(bt->vol, nodebuf, bt->fork, index * blkpernode, blkpernode, HFSP_EXTENT_DATA, bt->cnid); } else // use nodeperblk, must reread other blocks, too { char buf[bt->vol->blksize]; UInt16 node_size = bt->head.node_size; UInt16 offset = (index % nodeperblk) * node_size; int block = index / nodeperblk; // read block including this one void* p = volume_readfromfork(bt->vol, buf, bt->fork, block, 1, HFSP_EXTENT_DATA, bt->cnid); if (p != buf) // usually NULL return -1; // evil ... p = &nodebuf[offset]; // node is found at that offset memcpy(p, nodebuf, node_size); if (volume_writetofork(bt->vol, buf, bt->fork, block, 1, HFSP_EXTENT_DATA, bt->cnid)) return -1; // evil ... } return 0; // all is fine } /* flush the node at cache index */ static int node_cache_flush_node(btree* bt, int index) { node_entry *e = &bt->cache.entries[index]; int result = 0; int node_index = e->index; // Only write back valid, dirty nodes if(e->index && (e->flags & NODE_DIRTY)) { node_buf* b = node_buf_get(&bt->cache, index); if (!b->index) { hfsp_error = "cache inconsistency in node_cache_flush_node"; return -1; } // Write back node header to cached memory btree_writenode(&b->desc, b->node); result = btree_write_node(bt, node_index, b->node); b->index = 0; // invalidate block entry } e->index = 0; // invalidate cache entry return result; // all is fine } /* flush the cache */ static int node_cache_flush(btree* bt) { int i, size = bt->cache.size; int result = 0; for (i=0; i < size; i++) { node_entry* e = &bt->cache.entries[i]; if(e->index && (e->flags & NODE_DIRTY)) if (node_cache_flush_node(bt, i)) result = -1; } return result; } static int node_cache_close(btree* bt) { int result = 0; if (!bt->cache.entries) // not (fully) intialized ? return result; result = node_cache_flush(bt); free(bt->cache.entries); return result; } /* Load the cach node indentified by index with * the node identified by node_index. * * Set the inital flags as given. */ static node_buf* node_cache_load_buf (btree* bt, node_cache* cache, int index, UInt16 node_index, int flags) { node_buf *result = node_buf_get(cache ,index); UInt16 blkpernode = bt->blkpernode; UInt16 nodeperblk = bt->nodeperblk; node_entry *e = &cache->entries[index]; UInt32 block; void *p; if (blkpernode) { block = node_index * blkpernode; p = volume_readfromfork(bt->vol, result->node, bt->fork, block, blkpernode, HFSP_EXTENT_DATA, bt->cnid); if (!p) return NULL; // evil ... btree_readnode(&result->desc, p); } else // use nodeperblk { char buf[bt->vol->blksize]; UInt16 node_size = bt->head.node_size; UInt16 offset = node_index % nodeperblk * node_size; block = node_index / nodeperblk; p = volume_readfromfork(bt->vol, buf, bt->fork, block, 1, HFSP_EXTENT_DATA, bt->cnid); if (p != buf) // usually NULL return NULL; // evil ... p = &buf[offset]; // node is found at that offset memcpy(&result->node, p , node_size); btree_readnode(&result->desc, p); } result->index = node_index; e -> priority = result->desc.height * DEPTH_FACTOR; e -> index = node_index; e -> flags = flags; return result; } /* Mark node at given index dirty in cache. */ inline static void btree_dirty_node(btree* bt, UInt16 index) { node_cache* cache = &bt->cache; node_entry *e = &cache->entries[index]; e->flags |= NODE_DIRTY; } /* Read node at given index, using cache. * * Make node with given flag, usually NODE_CLEAN/NODE_DIRTY */ node_buf* btree_node_by_index(btree* bt, UInt16 index, int flags) { node_cache* cache = &bt->cache; int oldindex, lruindex; int currindex = cache->currindex; UInt32 prio; node_entry *e; // Shortcut acces to current node, will not change priorities if (cache->entries[currindex].index == index) { cache->entries[currindex].flags |= flags; return node_buf_get(cache ,currindex); } oldindex = currindex; if (currindex == 0) currindex = cache->size; currindex--; lruindex = oldindex; // entry to be flushed when needed prio = 0; // current priority while (currindex != oldindex) // round robin { e = &cache->entries[currindex]; if (e->index == index) // got it { if (e->priority != 0) // already top, uuh e->priority--; cache->currindex = currindex; e -> flags |= flags; return node_buf_get(cache ,currindex); } else { if (!e->index) // free entry, well { lruindex = currindex; prio = UINT_MAX; // remember empty entry } if (e->priority != UINT_MAX) // already least, uuh e->priority++; } if (prio < e->priority) { lruindex = currindex; prio = e->priority; } if (currindex == 0) currindex = cache->size; currindex--; } e = &cache->entries[lruindex]; cache->currindex = lruindex; if (e->flags & NODE_DIRTY) node_cache_flush_node(bt, lruindex); return node_cache_load_buf (bt, cache, lruindex, index, flags); } /** intialize the btree with the first entry in the fork */ static int btree_init(btree* bt, volume* vol, hfsp_fork_raw* fork) { void *p; char buf[vol->blksize]; UInt16 node_size; btree_node_desc* node = &bt->head_node; int alloc_size; bt->vol = vol; bt->fork = fork; p = volume_readfromfork(vol, buf, fork, 0, 1, HFSP_EXTENT_DATA, bt->cnid); if (!p) return -1; p = btree_readnode(node, p); if (node->kind != HFSP_NODE_HEAD) return -1; // should not happen ? p = btree_readhead(&bt->head, p); node_size = bt->head.node_size; bt->blkpernode = node_size / vol->blksize; if (bt->blkpernode == 0) // maybe the other way round ? bt->nodeperblk = vol->blksize / node_size; alloc_size = node_size - HEADER_RESERVEDOFFSET; // sizeof(node_desc) + sizeof(header) /* Sometimes the node_size is bigger than the volume-blocksize * so here I reread the node when needed */ { // need new block for allocation char nodebuf[node_size]; if (bt->blkpernode > 1) { p = volume_readfromfork(vol, nodebuf, fork, 0, bt->blkpernode, HFSP_EXTENT_DATA, bt->cnid); ((char*) p) += HEADER_RESERVEDOFFSET; // skip header } bt->alloc_bits = malloc(alloc_size); if (!bt->alloc_bits) return ENOMEM; memcpy(bt->alloc_bits, p, alloc_size); } /*** for debugging ***/ // bt->attributes |= BTREE_HEADDIRTY; if (node_cache_init(&bt->cache, bt, bt->head.depth + EXTRA_CACHESIZE)) return -1; return 0; } /** Intialize catalog btree, so that btree_close can safely be called. */ void btree_reset(btree* bt) { bt->alloc_bits = NULL; bt->cache.entries = NULL; } /** Intialize catalog btree */ int btree_init_cat(btree* bt, volume* vol, hfsp_fork_raw* fork) { int result = btree_init(bt,vol,fork); // super (...) bt->cnid = HFSP_CAT_CNID; bt->kcomp = record_key_compare; bt->kread = record_readkey; bt->rread = record_readentry; bt->max_rec_size = sizeof(hfsp_cat_entry); // this is a bit too large due to alignment/padding return result; } /** Intialize catalog btree */ int btree_init_extent(btree* bt, volume* vol, hfsp_fork_raw* fork) { int result = btree_init(bt,vol,fork); // super (...) bt->cnid = HFSP_EXT_CNID; bt->kcomp = record_extent_key_compare; bt->kread = record_extent_readkey; bt->rread = record_extent_readrecord; bt->max_rec_size = sizeof(hfsp_extent); return result; } /** close the btree and free any resources */ int btree_close(btree* bt) { int result = 0; node_cache_close(bt); // a dirty header without alloc_bits must not happen, mmh if ((bt->attributes & BTREE_HEADDIRTY) && bt->alloc_bits) { btree_head* head = &bt->head; btree_node_desc* node = &bt->head_node; UInt16 node_size = head->node_size; UInt16 alloc_size = node_size - HEADER_RESERVEDOFFSET; char buf[node_size]; void *p; p = btree_writenode(node, buf); p = btree_writehead(head, p); memcpy(p, bt->alloc_bits, alloc_size); result = btree_write_node(bt, 0, buf); } if (bt->alloc_bits) free(bt->alloc_bits); return result; } /* returns pointer to key given by index in current node. * * Assumes that current node is not NODE_HEAD ... * index may be == num_rec in whcih case a pointer * to the first free byte is returned ... */ void* btree_key_by_index(btree* bt, node_buf* buf, UInt16 index) { UInt16 node_size, off_pos; btree_record_offset offset; if (index > buf->desc.num_rec) // oops out of range { hfsp_error = "btree_key_by_index: index out of range"; return NULL; } node_size = bt->head.node_size; // The offsets are found at the end of the node ... off_pos = node_size - (index +1) * sizeof(btree_record_offset); // position of offset at end of node if (off_pos >= node_size) // oops out of range { hfsp_error = "btree_key_by_index: off_pos out of range"; return NULL; } offset = bswabU16(*((btree_record_offset*) (buf->node + off_pos))); if (offset >= node_size) // oops out of range { hfsp_error = "btree_key_by_index: offset out of range"; return NULL; } // now we have the offset and can read the key ... return buf->node + offset; } /** return allocation status of node given by index in btree */ int btree_check_nodealloc(btree* bt, UInt16 node) { btree_head* head = &bt->head; btree_node_desc* desc = &bt->head_node; UInt16 node_size = head->node_size; UInt16 node_num = desc->next; UInt32 node_count = head->node_count; char* alloc_bits = bt->alloc_bits + 128; // skip reserved node int bit = node & 0x07; int alloc_size = node_size - 256; // sizeof(node_desc) + sizeof(header) + 128 - 8 node_buf* nbuf = NULL; if (node >= node_count) HFSP_ERROR(-1, "Node index out of range."); node >>= 3; // First must check bits in saved allocation bits from node header if (node < alloc_size) return (alloc_bits[node] & (0x80 >> bit)); /* Bit one is 0x80 ! */ // Now load matching node by iterating over MAP-Nodes node -= alloc_size; while (node_num && node >= node_size) { nbuf = btree_node_by_index(bt, node_num, NODE_CLEAN); if (!nbuf) HFSP_ERROR(-1, "Unable to fetch map node"); desc = &nbuf->desc; if (desc->kind != HFSP_NODE_MAP) HFSP_ERROR(-1, "Invalid chain of map nodes"); node -= node_size; node = desc->next; } if (!nbuf) HFSP_ERROR(-1, "Oops this code is wrong"); // Should not happen, oops return (nbuf->node[node] & (0x80 >> bit)); /* Bit one is 0x80 ! */ fail: return -1; } /* Remove the key and an (eventual) record from the btree. * Warning, you must WRITELOCK the btree before calling this */ int btree_remove_record(btree* bt, UInt16 node_index, UInt16 keyind) { node_buf* node = btree_node_by_index(bt, node_index, NODE_DIRTY); btree_node_desc* desc = &node->desc; int num_rec = desc->num_rec; void* curr = btree_key_by_index(bt, node, keyind); if (keyind != num_rec) // Last record needs no special action { void *next = btree_key_by_index(bt, node, keyind+1); void *last = btree_key_by_index(bt, node, num_rec); // difference needed to update the backpointers int diff = ((char*) next) - ((char*) curr); // hfsp_key* key = (hfsp_key*) curr; // UInt16 help = key->key_length; // size of the block to move "down" int size = ((char*) last) - ((char*) next); UInt16 node_size = bt->head.node_size; int i,n, off_pos; btree_record_offset* offsets; btree_record_offset old; memmove(curr, next, size); // Now care about the backpointers, off_pos = node_size - (num_rec + 1) * sizeof(btree_record_offset); offsets = (btree_record_offset*) (node->node + off_pos); // fprintf(stderr, // "moving backpointers in node %d by %4x (%d)\n", // node_index, diff, help); // The backpointer at keyind is already correct n = num_rec - keyind; old = 0xffff; // will override former index to free area, thats ok for (i=0; i <= n; i++) { btree_record_offset off = offsets[i]; // fprintf(stderr, "moving backpointers %4x, %4x\n", off, old); offsets[i] = old; old = off - diff; // adjust the backpointer } } desc->num_rec = num_rec - 1; if (desc->kind == HFSP_NODE_LEAF) { bt->head.leaf_count --; bt->attributes |= BTREE_HEADDIRTY; } return 0; } /* insert a key and an (eventual) record into the btree. * Warning, you must WRITELOCK the btree before calling this. * keyind may well be == num_rec indicating an append. * * node_index number of the node in the tree. * keyind the index where the key/record should be insert in the node * key the key (+ record) to append * len the lenght of the key or key + record */ int btree_insert_record(btree* bt, UInt16 node_index, UInt16 keyind, void* key, int len) { node_buf* node = btree_node_by_index(bt, node_index, NODE_DIRTY); btree_node_desc* desc = &node->desc; int num_rec = desc->num_rec; UInt16 node_size= bt->head.node_size; void *curr,*last; // Pointer for calculations int size, total; int i,n,off_pos; btree_record_offset* offsets; curr = btree_key_by_index(bt, node, keyind); last = btree_key_by_index(bt, node, num_rec); // size of the block to move "up" size = ((char*) last) - ((char*) curr); total = ((char*) last) - node->node; // account for backpointers, too if ((total + len) > (node_size - num_rec * sizeof(btree_record_offset))) return -1; // need to split/repartition node first, NYI memmove(curr + len, curr, size); // printf("Moving to [%p %p]\n", curr+len, curr+len+size); memcpy (curr , key , len); // Copy the key / record num_rec ++; // Now care about the backpointers, off_pos = node_size - (num_rec + 1) * sizeof(btree_record_offset); offsets = (btree_record_offset*) (node->node + off_pos); // Recalculate backpointers n = num_rec - keyind; // printf("Copying to [%p %p]\n", offsets, &offsets[n]); for (i=0; i < n; i++) offsets[i] = offsets[i+1] + len; desc->num_rec = num_rec; // Adjust node descriptor if (desc->kind == HFSP_NODE_LEAF) { bt->head.leaf_count ++; bt->attributes |= BTREE_HEADDIRTY; } return 0; } hfsplus-1.0.4/libhfsp/src/btree.h0100644000000000000000000000635307441220604015375 0ustar rootroot/* * libhfs - library for reading and writing Macintosh HFS volumes. * * The fucntions are used to handle the various forms of btrees * found on HFS+ volumes. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: btree.h,v 1.1.1.1 2002/03/05 19:50:28 klaus Exp $ */ /* Read the node from the given buffer and swap the bytes. * * return pointer after reading the structure */ void* btree_readnode(btree_node_desc* node, void *p); /* read a btree header from the given buffer and swap the bytes. * * return pointer after reading the structure */ void* btree_readhead(btree_head* head, void *p); /** Intialize catalog btree, so that btree_close can safely be called. */ extern void btree_reset(btree* bt); /** Intialize catalog btree */ extern int btree_init_cat(btree* bt, volume* vol, hfsp_fork_raw* fork); /** Intialize extents btree */ extern int btree_init_extent(btree* bt, volume* vol, hfsp_fork_raw* fork); /** close the btree and free any resources */ extern int btree_close(btree* bt); /* Read node at given index. * * Make node with given flag, usually NODE_CLEAN/NODE_DIRTY */ extern node_buf* btree_node_by_index(btree* bt, UInt16 index, int flags); /* returns pointer to key given by index in current node */ extern void* btree_key_by_index(btree* bt, node_buf* buf, UInt16 index); /* remove the key and record from the btree. * Warning, you must WRITELOCK the btree before calling this */ extern int btree_remove_record(btree* bt, UInt16 node_index, UInt16 recind); /* insert a key and an (eventual) record into the btree. * Warning, you must WRITELOCK the btree before calling this */ extern int btree_insert_record(btree* bt, UInt16 node_index, UInt16 keyind, void* key, int len); // --------------- Cache Handling ------------ /* Priority of the depth of the node compared to LRU value. * Should be the average number of keys per node but these vary. */ #define DEPTH_FACTOR 1000 /* Cache size is height of tree + this value * Really big numbers wont help in case of ls -R * Must be enough to cache all nodes (+ Map nodes !) * used during tree reorganizations to avoid * inconsistent states before flush */ #define EXTRA_CACHESIZE 3 /* Intialize cache with default cache Size, * must call node_cache_close to deallocate memory */ extern int node_cache_init(node_cache* cache, btree* tree, int size); /** return allocation status of node given by index in btree */ extern int btree_check_nodealloc(btree* bt, UInt16 node); hfsplus-1.0.4/libhfsp/src/btreecheck.c0100644000000000000000000007211107441220605016362 0ustar rootroot/* * libhfs - library for reading and writing Macintosh HFS volumes * * This code checks the btreee structures of a HFS+ volume for correctnes. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: btreecheck.c,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # include # include # include # include # include # include # include "libhfsp.h" # include "volume.h" # include "fscheck.h" # include "btree.h" # include "record.h" # include "hfstime.h" # include "unicode.h" # include "swab.h" /** helper function to print those Apple 4 byte Signatures */ static inline void print_sig(UInt32 sig) { printf("%c%c%c%c" , ((char*)&sig)[0], ((char*)&sig)[1], ((char*)&sig)[2], ((char*)&sig)[3]); } /* print the key of a record */ static void record_print_key(hfsp_cat_key* key) { char buf[255]; // mh this _might_ overflow unicode_uni2asc(buf, &key->name, 255); printf("parent cnid : %ld\n", key->parent_cnid); printf("name : %s\n", buf); } /* Check the btree header as far as possible. */ static int fscheck_checkbtree(btree* bt) { int result = 0; btree_head* head = &bt->head; UInt16 node_size = head->node_size; UInt32 node_count = head->node_count; UInt32 blocksize = bt->vol->vol.blocksize; // head->depth to be checked later if (node_size % HFSP_BLOCKSZ) { printf("node_size %d not a multiple of HFSP_BLOCKSZ %d\n", node_size, HFSP_BLOCKSZ); result |= FSCK_ERR; // dont know how to fix that by now } /* This is quite ok for a newly created extends-tree if (!head->root) { printf("root node must not be 0\n"); result |= FSCK_ERR; // dont know how to fix that by now } */ if (head->root >= node_count) { printf("root node out of range %lX >= %lX\n", head->root, node_count); result |= FSCK_ERR; // This is really evil } if (head->leaf_head >= node_count) { printf("leaf_head out of range %lX >= %lX\n", head->leaf_head, node_count); result |= FSCK_ERR; // dont know how to fix that by now } if (head->leaf_tail >= node_count) { printf("leaf_head out of range %lX >= %lX\n", head->leaf_tail, node_count); result |= FSCK_ERR; // dont know how to fix that by now } if (head->max_key_len < HFSP_CAT_KEY_MIN_LEN) { printf("max key len small %d < %d\n", head->max_key_len, HFSP_CAT_KEY_MIN_LEN); result |= FSCK_ERR; // dont know how to fix that by now } if (head->max_key_len > HFSP_CAT_KEY_MAX_LEN) { printf("max key to large %d > %d\n", head->max_key_len, HFSP_CAT_KEY_MAX_LEN); result |= FSCK_ERR; // dont know how to fix that by now } if (head->free_nodes >= node_count) { printf("free_nodes out of range %lX >= %lX\n", head->free_nodes, node_count); result |= FSCK_ERR; // dont know how to fix that by now } // head->reserved1 nothing to check here if (head->clump_size % blocksize) { printf("clump_size %ld not a multiple of blocksize %ld\n", head->free_nodes, blocksize); result |= FSCK_ERR; // dont know how to fix that by now } if (head->btree_type != 0) { printf("Unexpected btree_type %d\n" , head->btree_type); result |= FSCK_ERR; // dont know how to fix that by now } // head->reserved2 nothing to check here if (head->attributes & HFSPLUS_TREE_RESERVED) { printf("Unexpected bits in btree header node attributes %lX\n", head->attributes); result |= FSCK_ERR; // dont know how to fix that by now } return result; } /* print btree header node information */ static void btree_printhead(btree_head* head) { UInt32 attr; printf(" depth : %#X\n", head->depth); printf(" root : %#lX\n", head->root); printf(" leaf_count : %#lX\n", head->leaf_count); printf(" leaf_head : %#lX\n", head->leaf_head); printf(" leaf_tail : %#lX\n", head->leaf_tail); printf(" node_size : %#X\n", head->node_size); printf(" max_key_len : %#X\n", head->max_key_len); printf(" node_count : %#lX\n", head->node_count); printf(" free_nodes : %#lX\n", head->free_nodes); printf(" reserved1 : %#X\n", head->reserved1); printf(" clump_size : %#lX\n", head->clump_size); printf(" btree_type : %#X\n", head->btree_type); attr = head->attributes; printf(" reserved2 : %#X\n", head->reserved2); if (attr & HFSPLUS_BAD_CLOSE) printf(" HFSPLUS_BAD_CLOSE *** "); else printf(" !HFSPLUS_BAD_CLOSE"); if (attr & HFSPLUS_TREE_BIGKEYS) printf(" HFSPLUS_TREE_BIGKEYS "); else printf(" !HFSPLUS_TREE_BIGKEYS"); if (attr & HFSPLUS_TREE_VAR_NDXKEY_SIZE) printf(" HFSPLUS_TREE_VAR_NDXKEY_SIZE"); else printf(" !HFSPLUS_TREE_VAR_NDXKEY_SIZE"); if (attr & HFSPLUS_TREE_UNUSED) printf(" HFSPLUS_TREE_UNUSED ***\n"); printf("\n"); } /* Dump a node descriptor to stdout */ static void print_node_desc(UInt32 nodeIndex, btree_node_desc* node) { printf("Node descriptor for Node %ld\n", nodeIndex); printf("next : %#lX\n", node->next); printf("prev : %#lX\n", node->prev); printf("height : %#X\n", node->height); printf("num_rec : %d\n", node->num_rec); printf("reserved : %#X\n", node->reserved); printf("height : %#X\n", node->height); switch(node->kind) { case HFSP_NODE_NDX : printf("HFSP_NODE_NDX\n"); break; case HFSP_NODE_HEAD : printf("HFSP_NODE_HEAD\n"); break; case HFSP_NODE_MAP : printf("HFSP_NODE_MAP\n"); break; case HFSP_NODE_LEAF : printf("HFSP_NODE_LEAF\n"); break; default: printf("*** Unknown Node type ***\n"); } } /** intialize the btree with the first entry in the fork */ static int fscheck_btree_init(btree* bt, volume* vol, hfsp_fork_raw* fork) { void *p; char buf[vol->blksize]; UInt16 node_size; btree_node_desc* node = &bt->head_node; int result; int alloc_size; bt->vol = vol; bt->fork = fork; p = volume_readfromfork(vol, buf, fork, 0, 1, HFSP_EXTENT_DATA, bt->cnid); if (!p) { printf("Unable to read block 1 of b*tree for cnid:%ld\n", bt->cnid); return FSCK_ERR; } p = btree_readnode(node, p); if (node->prev != 0) { printf("Backlink of header node is not zero (%lX) \n", node->prev); return FSCK_ERR; // ToDo: We might ignore it but ??? } if (node->kind != HFSP_NODE_HEAD) { printf("Unexpected node kind (%d) for node Header\n", node->kind); return FSCK_ERR; // ToDo: We might ignore it but ??? } p = btree_readhead(&bt->head, p); node_size = bt->head.node_size; bt->blkpernode = node_size / vol->blksize; if (bt->blkpernode == 0) // maybe the other way round ? bt->nodeperblk = vol->blksize / node_size; else { if (bt->blkpernode * vol->blksize != node_size) { printf("node_size (%X) is no multiple of block size (%X)\n", node_size, bt->blkpernode); return FSCK_ERR; // Thats fatal as of now } } alloc_size = node_size - HEADER_RESERVEDOFFSET; // sizeof(node_desc) + sizeof(header) /* Sometimes the node_size is bigger than the volume-blocksize * so here I reread the node when needed */ { // need new block for allocation char nodebuf[node_size]; if (bt->blkpernode > 1) { p = volume_readfromfork(vol, nodebuf, fork, 0, bt->blkpernode, HFSP_EXTENT_DATA, bt->cnid); ((char*) p) += HEADER_RESERVEDOFFSET; // skip header } bt->alloc_bits = malloc(alloc_size); if (!bt->alloc_bits) return ENOMEM; memcpy(bt->alloc_bits, p, alloc_size); } result = fscheck_checkbtree(bt); if (fsck_data.verbose) btree_printhead(&bt->head); node_cache_init(&bt->cache, bt, bt->head.depth + EXTRA_CACHESIZE); return result; } /** Intialize catalog btree */ int fscheck_init_cat(btree* bt, volume* vol, hfsp_fork_raw* fork) { int result = fscheck_btree_init(bt,vol,fork); // super (...) bt->cnid = HFSP_CAT_CNID; bt->kcomp = record_key_compare; bt->kread = record_readkey; bt->rread = record_readentry; bt->max_rec_size = sizeof(hfsp_cat_entry); return result; } /** Intialize catalog btree */ int fscheck_init_extent(btree* bt, volume* vol, hfsp_fork_raw* fork) { int result = fscheck_btree_init(bt,vol,fork); // super (...) bt->cnid = HFSP_EXT_CNID; bt->kcomp = record_extent_key_compare; bt->kread = record_extent_readkey; bt->rread = record_extent_readrecord; bt->max_rec_size = sizeof(hfsp_extent); return result; } /* Used to create the extents btree */ int fscheck_create_extents_tree(volume* vol) { btree* result = (btree*) ALLOC(btree*, sizeof(btree)); int retval = 0; if (!result) { printf("No memory for extents btree\n"); return FSCK_ERR; } if (FSCK_FATAL & (retval = fscheck_init_extent(result, vol, &vol->vol.ext_file))) { vol->extents = NULL; return retval; } vol->extents = result; return retval; } /* returns pointer to key given by index in current node. * Same as btree_key_by_index, but with more checks etc. * * Assumes that current node is not NODE_HEAD ... * index may be == num_rec in whcih case a pointer * to the first free byte is returned ... */ static void* checkbtree_key_by_index(btree* bt, UInt32 node, node_buf* buf, UInt16 index) { UInt16 node_size, off_pos; btree_record_offset offset; if (index > buf->desc.num_rec) // oops out of range { fprintf(stderr,"checkbtree_key_by_index: index out of range %u > %u\n", index, buf->desc.num_rec); return NULL; } node_size = bt->head.node_size; // The offsets are found at the end of the node ... off_pos = node_size - (index +1) * sizeof(btree_record_offset); // position of offset at end of node if (off_pos >= node_size) // oops out of range { fprintf(stderr,"checkbtree_key_by_index: off_pos out of range " "%X >= %X\n", off_pos, node_size); return NULL; } offset = *((btree_record_offset*) (buf->node + off_pos)); if (offset >= node_size) // oops out of range { fprintf (stderr, "checkbtree_key_by_index: offset out of range %X >= %X\n", offset, node_size); return NULL; } if (fsck_data.verbose) { printf("Node %4ld, Record %2d is at pos %04X," "Backptr is at offset %04X\n", node, index, offset, off_pos); } // now we have the offset and can read the key ... #if BYTE_ORDER == LITTLE_ENDIAN return buf->node + bswap_16(offset); #else return buf->node + offset; #endif } /* Try to fix a node when the backpointers are broken. * * This is done by crawling forward as long as the keys * are valid and checking/adjusting the backpointers. * This may result in the loss of records in case a * key (or record) is damaged. */ static int fscheck_fix_node(btree* bt, UInt32 nodeIndex) { int result = FSCK_NOERR; node_buf* node = btree_node_by_index(bt, nodeIndex, NODE_CLEAN); btree_node_desc* desc = &node->desc; UInt16 num_rec = desc->num_rec; UInt16 i; int isindex = desc->kind == HFSP_NODE_NDX; void* current = node->node + 0x0E; // sizeof (btree_node_desc) char kbuf[bt->head.max_key_len]; // dummy key to skip over char buf[bt->max_rec_size]; fprintf(stderr, "Node %lu with %u records is damaged trying to fix ***\n", nodeIndex, num_rec); for (i=0; i < num_rec; i++) { void *p = checkbtree_key_by_index(bt, nodeIndex, node, i); if (!p) return result | FSCK_ERR; if (p != current) { fprintf(stderr, "Key %u in Node %lu is damaged " "rest of keys will be droppend ***\n", i,nodeIndex); break; } p = bt->kread(p, kbuf); // Read the key if (!isindex) p = bt->rread(p, buf); } if (i < num_rec) { fprintf(stderr, "Code to drop damaged record not yet implemented ***.\n"); } // ToDo: check for pointer to free area, too return result; } /* recursive function to check a node (given by its index). * * In case of an index node is descends into the subnodes. */ static int fscheck_btree_node(btree* bt, UInt32 nodeIndex, hfsp_key** key1, hfsp_key** key2) { int result = FSCK_NOERR; node_buf* node = btree_node_by_index(bt, nodeIndex, NODE_CLEAN); btree_node_desc* desc = &node->desc; UInt16 num_rec = desc->num_rec; UInt16 i; int isindex = desc->kind == HFSP_NODE_NDX; hfsp_key* tmp; void* previous = ((char*)node) + 0x0E; // sizeof btree_node_desc if (fsck_data.verbose) print_node_desc(nodeIndex, desc); for (i=0; i= %p)\n", nodeIndex, i, p, previous); result |= FSCK_FSCORR; // Hope we can correct that later } previous = p; p = bt->kread(p, *key1); // Read the key if (!p) { result |= FSCK_ERR; // Lets try to fix that Error .... fscheck_fix_node(bt, nodeIndex); if (fsck_data.ignoreErr) continue; // Hope this will work return result; } if ((*key2)->key_length) { int comp = bt->kcomp(*key1, *key2); if (comp > 0) { printf("Invalid key order in node %ld record %d\n key1=", nodeIndex, i); record_print_key((hfsp_cat_key*) *key1); printf("Invalid key order key2=\n"); record_print_key((hfsp_cat_key*) *key2); result |= FSCK_FSCORR; // Hope we can correct that later } if (comp == 0 && i > 0) // equal to key in parent node is ok { printf("Duplicate key in node %ld record %d key1=\n", nodeIndex, i); record_print_key((hfsp_cat_key*) *key1); printf("Duplicate key key2=\n"); record_print_key((hfsp_cat_key*) *key2); result |= FSCK_FSCORR; // Hope we can correct that later } } tmp = *key1; // Swap buffers for next compare *key1 = *key2; *key2 = tmp; if (isindex) { index = bswabU32_inc(p); result |= fscheck_btree_node(bt, index, key1, key2); } if (result & FSCK_FATAL) break; } return result; } /** Check a complete btree by traversing it in-oder */ int fscheck_btree(btree *bt) { UInt16 maxkeylen = bt->head.max_key_len; int result = FSCK_NOERR; char keybuf1[maxkeylen]; char keybuf2[maxkeylen]; hfsp_key* key1 = (hfsp_key*) keybuf1; // Alternating buffers hfsp_key* key2 = (hfsp_key*) keybuf2; // for key Compare key2->key_length = 0; // So first compare can be skipped result = fscheck_btree_node(bt, bt->head.root, &key1, &key2); return result; } /* print Quickdraw Point */ static void record_print_Point(Point* p) { printf("[ v=%d, h=%d ]", p->v, p->h); } /* print Quickdraw Rect */ static void record_print_Rect(Rect* r) { printf("[ top=%d, left=%d, bottom=%d, right=%d ]", r->top, r->left, r->bottom, r->right); } /* print permissions */ static void record_print_perm(hfsp_perm* perm) { printf("owner : %ld\n", perm->owner); printf("group : %ld\n", perm->group); printf("perm : 0x%lX\n",perm->mode); printf("dev : %ld\n", perm->dev); } /* print Directory info */ static void record_print_DInfo(DInfo* dinfo) { printf( "frRect : "); record_print_Rect(&dinfo->frRect); printf("\nfrFlags : 0X%X\n", dinfo->frFlags); printf( "frLocation : "); record_print_Point(&dinfo->frLocation); printf("\nfrView : 0X%X\n", dinfo->frView); } /* print extended Directory info */ static void record_print_DXInfo(DXInfo* xinfo) { printf( "frScroll : "); record_print_Point(&xinfo->frScroll); printf("\nfrOpenChain : %ld\n", xinfo->frOpenChain); printf( "frUnused : %d\n", xinfo->frUnused); printf( "frComment : %d\n", xinfo->frComment); printf( "frPutAway : %ld\n", xinfo->frPutAway); } static void record_print_folder(hfsp_cat_folder* folder) { printf("flags : 0x%X\n", folder->flags); printf("valence : 0x%lX\n", folder->valence); printf("id : %ld\n", folder->id); printf("create_date : %s", get_atime(folder->create_date)); printf("content_mod_date : %s", get_atime(folder->content_mod_date)); printf("attribute_mod_date : %s", get_atime(folder->attribute_mod_date)); printf("access_date : %s", get_atime(folder->access_date)); printf("backup_date : %s", get_atime(folder->backup_date)); record_print_perm (&folder->permissions); record_print_DInfo (&folder->user_info); record_print_DXInfo (&folder->finder_info); printf("text_encoding : 0x%lX\n", folder->text_encoding); printf("reserved : 0x%lX\n", folder->reserved); } /* print File info */ static void record_print_FInfo(FInfo* finfo) { printf( "fdType : %4.4s\n", (char*) &finfo->fdType); printf( "fdCreator : %4.4s\n", (char*) &finfo->fdCreator); printf( "fdFlags : 0X%X\n", finfo->fdFlags); printf( "fdLocation : "); record_print_Point(&finfo->fdLocation); printf("\nfdFldr : %d\n", finfo->fdFldr); } /* print extended File info */ static void record_print_FXInfo(FXInfo* xinfo) { printf( "fdIconID : %d\n", xinfo->fdIconID); // xinfo -> fdUnused; printf( "fdComment : %d\n", xinfo->fdComment); printf( "fdPutAway : %ld\n", xinfo->fdPutAway); } /* print file entry */ static void record_print_file(hfsp_cat_file* file) { printf("flags : 0x%X\n", file->flags); printf("reserved1 : 0x%lX\n", file->reserved1); printf("id : %ld\n", file->id); printf("create_date : %s", get_atime(file->create_date)); printf("content_mod_date : %s", get_atime(file->content_mod_date)); printf("attribute_mod_date : %s", get_atime(file->attribute_mod_date)); printf("access_date : %s", get_atime(file->access_date)); printf("backup_date : %s", get_atime(file->backup_date)); record_print_perm (&file->permissions); record_print_FInfo (&file->user_info); record_print_FXInfo (&file->finder_info); printf("text_encoding : 0x%lX\n", file->text_encoding); printf("reserved : 0x%lX\n", file->reserved2); printf("Datafork:\n"); print_fork (&file->data_fork); printf("Rsrcfork:\n"); print_fork (&file->res_fork); } /* print info for a file or folder thread */ static void record_print_thread(hfsp_cat_thread* entry) { char buf[255]; // mh this _might_ overflow unicode_uni2asc(buf, &entry->nodeName, 255); printf("parent cnid : %ld\n", entry->parentID); printf("name : %s\n" , buf); } /* print the information for a record */ static void record_print_entry(hfsp_cat_entry* entry) { switch (entry->type) { case HFSP_FOLDER: printf("=== Folder ===\n"); return record_print_folder(&entry->u.folder); case HFSP_FILE: printf("=== File ===\n"); return record_print_file (&entry->u.file); case HFSP_FOLDER_THREAD: printf("=== Folder Thread ===\n"); return record_print_thread(&entry->u.thread); case HFSP_FILE_THREAD: printf("=== File Thread ==\n"); return record_print_thread(&entry->u.thread); default: printf("=== Unknown Record Type ===\n"); }; } /* Dump all the record information to stdout */ void record_print(record* r) { printf ("*** Key index : %u\n", r->keyind); record_print_key (&r->key); record_print_entry(&r->record); } /** Check the key of a catalog record */ static int fscheck_unistr255(hfsp_unistr255* name) { int result = FSCK_NOERR; if (name->strlen > 255) { printf("strlen in name %d > 255\n", name->strlen); result |= FSCK_FSCORR; // hope we can fix that some time } return result; } /** Check the key of a catalog record */ static int fscheck_cat_key(record* r) { int result = FSCK_NOERR; hfsp_cat_key* key = &r->key; hfsp_unistr255* name = &key->name; volume* vol = r->tree->vol; UInt32 cnid = vol->vol.next_cnid; result |= fscheck_unistr255(name); if (key->key_length != ((name->strlen << 1) + 6)) { printf("key_length in key %3d does not match %3d name\n", key->key_length, name->strlen); result |= FSCK_FSCORR; // hope we can fix that some time } if (key->parent_cnid >= cnid) { printf("parent_cnid %ld >= volume next cnid %ld\n", key->parent_cnid, cnid); result |= FSCK_FSCORR; // hope we can fix that some time } return result; } /** Check a macintosh time * * errname is the anem of the field to show on errror */ static int fscheck_mactime(UInt32 time, char* errname) { /* This happens so often that be better ignore it if (!time) printf("Warning %s is 0\n", errname); */ if (time > fsck_data.macNow) printf("Warning %21.21s is in the future: (%lX) %s", errname, time, get_atime(time)); return FSCK_NOERR; // Those are not really bad, just annoying } /** Check the file part of a catalog record */ static int fscheck_file(btree* tree, hfsp_cat_file* file) { volume* vol = tree->vol; int result = FSCK_NOERR; UInt32 cnid = vol->vol.next_cnid; if (file->flags & HFSP_FILE_RESERVED) printf("Warning unknown file flags: %X\n", file->flags); if (fsck_data.maxCnid < file->id) fsck_data.maxCnid = file->id; // file->reserved1 // Nothing to check here if (file->id >= cnid) { printf("file id %ld >= volume next cnid %ld\n", file->id, cnid); result |= FSCK_FSCORR; // hope we can fix that some time } result |= fscheck_mactime(file->create_date, "file create_date"); result |= fscheck_mactime(file->content_mod_date, "file content_mod_date"); result |= fscheck_mactime(file->attribute_mod_date, "file attribute_mod_date"); result |= fscheck_mactime(file->access_date, "file access_date"); result |= fscheck_mactime(file->backup_date, "file backup_date"); /* // folder->permissions // dont know how tho check these Nothing to be checked here (but finder may become confused, hmm) file->user_info; file->finder_info; file->text_encoding; file->reserved; */ result |= check_forkalloc(vol, &file->data_fork); result |= check_forkalloc(vol, &file->res_fork); return result; } /** Check the folder part of a catalog record */ static int fscheck_folder(btree* tree, hfsp_cat_folder* folder) { UInt32 cnid = tree->vol->vol.next_cnid; int result = FSCK_NOERR; if (folder->flags & HFSP_FOLDER_RESERVED) printf("Warning unknown folder flags: %X\n", folder->flags); if (fsck_data.maxCnid < folder->id) fsck_data.maxCnid = folder->id; // folder->valence // to be checked later if (folder->id >= cnid) { printf("Folder id %ld >= volume next cnid %ld\n", folder->id, cnid); result |= FSCK_FSCORR; // hope we can fix that some time } result |= fscheck_mactime(folder->create_date, "folder create_date"); result |= fscheck_mactime(folder->content_mod_date, "folder content_mod_date"); result |= fscheck_mactime(folder->attribute_mod_date,"folder attribute_mod_date"); result |= fscheck_mactime(folder->access_date, "folder access_date"); result |= fscheck_mactime(folder->backup_date, "folder backup_date"); /* // folder->permissions // dont know how tho check these Nothing to be checked here (but finder may become confused, hmm) folder->user_info; folder->finder_info; folder->text_encoding; folder->reserved; */ return result; } /** Check the entry part of a catalog record */ static int fscheck_thread(btree* tree, hfsp_cat_thread* thread) { UInt32 cnid = tree->vol->vol.next_cnid; int result = fscheck_unistr255(&thread->nodeName); if (thread->parentID >= cnid) { printf("Thread parentID %ld >= volume next cnid %ld\n", thread->parentID, cnid); result |= FSCK_FSCORR; // hope we can fix that some time } return result; } /** Check the entry part of a catalog record */ static int fscheck_entry(record* r) { hfsp_cat_entry *entry = &r->record; btree *tree = r->tree; switch (entry->type) { case HFSP_FOLDER: return fscheck_folder(tree, &entry->u.folder); case HFSP_FILE: return fscheck_file (tree, &entry->u.file); case HFSP_FOLDER_THREAD: return fscheck_thread(tree, &entry->u.thread); case HFSP_FILE_THREAD: return fscheck_thread(tree, &entry->u.thread); default: printf("Unknown Record Type %X\n", entry->type); return FSCK_FSCORR; // Hope we can fix it some time } } /** Check a record as a directory, file, extent_node etc. */ static int fscheck_record(record* r) { int result = fscheck_cat_key(r); result |= fscheck_entry(r); if (fsck_data.verbose) record_print(r); return result; } /* find correct node record for given node and *pindex. * * index of record in this (or next) node */ static node_buf* fscheck_prepare_next(btree* tree, UInt16 node_index, UInt16* pindex, int* fsckerr) { node_buf* buf = btree_node_by_index(tree, node_index, NODE_CLEAN); btree_node_desc* desc; UInt32 numrec; if (!buf) return buf; desc = &buf->desc; numrec = desc->num_rec; if (*pindex >= numrec) // move on to next node { UInt16 next = desc->next; *pindex = 0; if (!next /* is there a next node ? */ || !( buf = btree_node_by_index(tree, next, NODE_CLEAN))) return NULL; if (!btree_check_nodealloc(tree, next)) { printf("node %d not allocated in node Map\n", next); *fsckerr = *fsckerr | FSCK_FSCORR; /* Maybe we can correct that one time */ } } return buf; } /* intialize the catalog record with the given index entry in the btree. * * Special version to check for consistency of backpointers. * * r the record used as read buffer. * bt the btree we care for */ int fscheck_record_init(record* r, btree* bt, node_buf* buf, UInt16 index) { void *p,*p1,*p2; int diff; r-> tree = bt; p = p1 = checkbtree_key_by_index(bt,r->node_index,buf,index); if (!p) return -1; p = record_readkey (p, &r->key); if (!p) return -1; p = record_readentry(p, &r->record); if (!p) return -1; r->node_index = buf->index; r-> keyind = index; p2 = checkbtree_key_by_index(bt,r->node_index,buf,index+1); diff = (int) (p2 - p); if (diff) // The difference may still be correct in case of a hole in the { // structure (should happen while debugging only) fprintf(stderr, "Unexpected difference in Node %d, Record %d " ": %d (%d/%d) (%p,%p)\n", r->node_index, index, diff , p - p1, p2 - p1, p, p2); record_print(r); } return 0; } /* move record foreward to next entry in leaf nodes. * * In case of an error the value of *r is undefined ! */ int fscheck_record_next(record* r, int* fsckerr) { btree* tree = r->tree; UInt16 index = r->keyind +1; UInt32 parent; node_buf* buf = fscheck_prepare_next( tree, r->node_index, &index, fsckerr); if (!buf) return ENOENT; // No (more) such file or directory parent = r->key.parent_cnid; if (fscheck_record_init(r, tree, buf, index)) { printf("Unable to read record %d in node %d" ,index, r->node_index); return -1; } return 0; } /** Check all files in leaf nodes */ int fscheck_files(volume* vol) { int result = FSCK_NOERR; btree* catalog = &vol->catalog; node_buf* buf = btree_node_by_index(catalog,catalog->head.leaf_head, NODE_CLEAN); // void* p = btree_key_by_index(catalog,buf,0); record r; if (!btree_check_nodealloc(catalog, catalog->head.leaf_head)) { printf("leaf_head %ld not allocated in node Map\n", catalog->head.leaf_head); result |= FSCK_FSCORR; /* Maybe we can correct that one time */ } if (fscheck_record_init(&r, catalog, buf, 0)) { printf("Unable to read initial leaf record\n"); return FSCK_ERR; } do { result |= fscheck_record(&r); if (result & FSCK_FATAL) return result; } while (!fscheck_record_next(&r, &result)); return result; } hfsplus-1.0.4/libhfsp/src/debug.txt0100644000000000000000000000010107441220605015734 0ustar rootroot18725ae 25ce < perm 25de < Dinfo 25ee < DXinfo 2606 hfsplus-1.0.4/libhfsp/src/fscheck.c0100644000000000000000000004257007447643325015715 0ustar rootroot/* * libhfs - library for reading and writing Macintosh HFS volumes * * This code checks the structures of a HFS+ volume for correctnes. * * ToDo: care come about HPFSCHK_IGNOREERR * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: fscheck.c,v 1.2 2002/03/25 15:48:37 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # include # include # include # include # include # include # include "libhfsp.h" # include "fscheck.h" # include "volume.h" # include "btree.h" # include "record.h" # include "hfstime.h" # include "unicode.h" # include "os.h" # include "swab.h" /* Dump all raw fork information to stdout */ void print_fork(hfsp_fork_raw* f) { int i; hfsp_extent* e; printf("total_size : %#LX\n" , f->total_size); printf("clump_size : %#lX\n" , f->clump_size); printf("total_blocks : %#lX\n" , f->total_blocks); printf("extents : "); for (i=0; i < 8; i++) { e = &f->extents[i]; printf("(%#lX+%#lX) " , e->start_block,e->block_count); } printf("\n"); } /** helper function to print those Apple 4 byte Signatures */ static inline void print_sig(UInt32 sig) { printf("%c%c%c%c" , ((char*)&sig)[0], ((char*)&sig)[1], ((char*)&sig)[2], ((char*)&sig)[3]); } /* Dump all the volume information to stdout */ void volume_print(hfsp_vh* vh) { printf("signature : %c%c\n" , ((char*)&vh->signature)[0], ((char*)&vh->signature)[1]); printf("version : %u\n" , vh->version); printf("attributes : %#lX\n" , vh->attributes); printf("last_mount_vers : "); print_sig(vh->last_mount_vers); printf("\nreserved : %lu\n" , vh->reserved); /* Hmm this is in local, apple time ... */ printf("create_date : %s" , get_atime(vh->create_date)); printf("modify_date : %s" , get_atime(vh->modify_date)); printf("backup_date : %s" , get_atime(vh->backup_date)); printf("checked_date : %s" , get_atime(vh->checked_date)); printf("file_count : %lu\n" , vh->file_count); printf("folder_count : %lu\n" , vh->folder_count); printf("blocksize : %lX\n" , vh->blocksize); printf("total_blocks : %lu\n" , vh->total_blocks); printf("free_blocks : %lu\n" , vh->free_blocks); printf("next_alloc : %lu\n" , vh->next_alloc); printf("rsrc_clump_sz : %lu\n" , vh->rsrc_clump_sz); printf("data_clump_sz : %lu\n" , vh->data_clump_sz); printf("next_cnid : %lu\n" , vh->next_cnid); printf("write_count : %lu\n" , vh->write_count); printf("encodings_bmp : %#LX\n" , vh->encodings_bmp); /* vv->finder_info, p, 32); */ printf(" Allocation file\n"); print_fork(&vh->alloc_file); printf(" Extension file\n"); print_fork(&vh->ext_file); printf(" Catalog file\n"); print_fork(&vh->cat_file); printf(" Attribute file\n"); print_fork(&vh->attr_file); printf(" Start file\n"); print_fork(&vh->start_file); } /* Check all fields of the volume header. */ static int fscheck_volume_header(volume * vol, hfsp_vh* vh) { UInt32 attributes = vh->attributes; int result = 0; // vh->signature // already checked in read // vh->version // Current is 4 but I wont check that if (attributes & HFSPLUS_VOL_RESERVED1) printf("Reserved attribute in use: %lX\n", vh->attributes & HFSPLUS_VOL_RESERVED1); if (! (attributes & HFSPLUS_VOL_UNMNT)) printf("Volume was not cleanly unmounted\n"); if (fsck_data.verbose && (attributes & HFSPLUS_VOL_SPARE_BLK)) printf("Volume has spare (bad) blocks\n"); if (fsck_data.verbose && (attributes & HFSPLUS_VOL_NOCACHE)) printf("Volume should not be cached (ignored)\n"); if (attributes & HFSPLUS_VOL_INCNSTNT) printf("Volume is inconsistent\n"); if (attributes & HFSPLUS_VOL_RESERVED2) printf("Reserved attribute in use: %lX\n", vh->attributes & HFSPLUS_VOL_RESERVED2); if (fsck_data.verbose && (attributes & HFSPLUS_VOL_SOFTLOCK)) printf("Volume is soft locked"); if (attributes & HFSPLUS_VOL_RESERVED3) printf("Reserved attribute in use: %lX\n", vh->attributes & HFSPLUS_VOL_RESERVED3); switch (vh->last_mount_vers) { case HPAPPLE_SIGNATURE: if (fsck_data.verbose) { printf("Volume was last Mounted by Apple:\n"); print_sig(vh->last_mount_vers); } break; case HPLS_SIGNATURE: if (fsck_data.verbose) { printf("Volume was last Mounted by hfsplusutils: \n"); print_sig(vh->last_mount_vers); } break; case HPLS_SIGRES1: if (fsck_data.verbose) { printf("Volume was last Mounted by hfsplus kernel module: \n"); print_sig(vh->last_mount_vers); } break; default: printf("Volume was last Mounted by unknnown implemenatation: \n"); print_sig(vh->last_mount_vers); } // vh->reserved // not checked // vh->file_count // To be checked later // vh->folder_count // To be checked later if (0 != (vh->blocksize % HFSP_BLOCKSZ)) // must be multiple of BLKSZ { printf("Invalid Blocksize %lX\n", vh->blocksize); result = FSCK_ERR; // Wont try to correct that, yet. } { UInt64 totalbytes = vh->total_blocks * vh->blocksize; UInt64 expectedbytes = vol->maxblocks << vol->blksize_bits; if (totalbytes > expectedbytes) printf("\nInvalid total blocks %lX, expected %lX", vh->total_blocks, (UInt32)(expectedbytes / vh->blocksize)); } if (vh->free_blocks > vh->total_blocks) printf("More free blocks (%lX) than total (%lX) ?\n", vh->free_blocks, vh->total_blocks); // Check more later // vh->next_alloc // to be checked later // vh->rsrc_clump_sz // no check needed, is a hint only // vh->data_clump_sz // no check needed, is a hint only if (vh->next_cnid <= HFSP_MIN_CNID) // wil hopefully be fixed later printf("Invalid next_cnid: %ld\n", vh->next_cnid); // Check more later // vh->write_count // no check possible // vh->encodings_bmp // no check needed, is a hint only // vh->finder_info // not checked (why should I?) // vh->alloc_file // to be checked later // vh->ext_file // to be checked later // vh->cat_file // to be checked later // vh->attr_file // to be checked later // vh->start_file // to be checked later return result; } /* Read the volume from the given buffer and swap the bytes. */ static int fscheck_volume_readbuf(volume * vol, hfsp_vh* vh, void* p) { if ( (vh->signature = bswabU16_inc(p)) != HFSP_VOLHEAD_SIG) { printf("Unexpected Volume signature '%2s' expected 'H+'\n", (char*) &vh->signature); HFSP_ERROR(-1, "This is not a HFS+ volume"); } vh->version = bswabU16_inc(p); vh->attributes = bswabU32_inc(p); vh->last_mount_vers = bswabU32_inc(p); vh->reserved = bswabU32_inc(p); vh->create_date = bswabU32_inc(p); vh->modify_date = bswabU32_inc(p); vh->backup_date = bswabU32_inc(p); vh->checked_date = bswabU32_inc(p); vh->file_count = bswabU32_inc(p); vh->folder_count = bswabU32_inc(p); vh->blocksize = bswabU32_inc(p); vh->total_blocks = bswabU32_inc(p); vh->free_blocks = bswabU32_inc(p); vh->next_alloc = bswabU32_inc(p); vh->rsrc_clump_sz = bswabU32_inc(p); vh->data_clump_sz = bswabU32_inc(p); vh->next_cnid = bswabU32_inc(p); vh->write_count = bswabU32_inc(p); vh->encodings_bmp = bswabU64_inc(p); memcpy(vh->finder_info, p, 32); ((char*) p) += 32; // So finderinfo must be swapped later, *** p = volume_readfork(p, &vh->alloc_file ); p = volume_readfork(p, &vh->ext_file ); p = volume_readfork(p, &vh->cat_file ); p = volume_readfork(p, &vh->attr_file ); p = volume_readfork(p, &vh->start_file ); if (fsck_data.verbose) volume_print(vh); return 0; fail: return -1; } /* Read the volume from the given block */ static int fscheck_volume_read(volume * vol, hfsp_vh* vh, UInt32 block) { char buf[vol->blksize]; if (volume_readinbuf(vol, buf, block)) return -1; return fscheck_volume_readbuf(vol, vh, buf); } /* Find out wether the volume is wrapped and unwrap it eventually */ static int fscheck_read_wrapper(volume * vol, hfsp_vh* vh) { UInt16 signature; char buf[vol->blksize]; void *p = buf; if( volume_readinbuf(vol, buf, 2) ) // Wrapper or volume header starts here return -1; signature = bswabU16_inc(p); if (signature == HFS_VOLHEAD_SIG) /* Wrapper */ { UInt32 drAlBlkSiz; /* size (in bytes) of allocation blocks */ UInt32 sect_per_block; /* how may block build an hfs sector */ UInt16 drAlBlSt; /* first allocation block in volume */ UInt16 embeds, embedl; /* Start/lenght of embedded area in blocks */ if (fsck_data.verbose) printf("Volume is wrapped in HFS volume " " (use hfsck to check this)\n"); ((char*) p) += 0x12; /* skip unneded HFS vol fields */ drAlBlkSiz = bswabU32_inc(p); /* offset 0x14 */ ((char*) p) += 0x4; /* skip unneded HFS vol fields */ drAlBlSt = bswabU16_inc(p); /* offset 0x1C */ ((char*) p) += 0x5E; /* skip unneded HFS vol fields */ signature = bswabU16_inc(p); /* offset 0x7C, drEmbedSigWord */ if (signature != HFSP_VOLHEAD_SIG) HFSP_ERROR(-1, "This looks like a normal HFS volume"); embeds = bswabU16_inc(p); embedl = bswabU16_inc(p); sect_per_block = (drAlBlkSiz / HFSP_BLOCKSZ); if ((sect_per_block * HFSP_BLOCKSZ) != drAlBlkSiz) { printf("HFS Blocksize %lX is not multiple of %X\n", drAlBlkSiz, HFSP_BLOCKSZ); return FSCK_ERR; // Cant help it (for now) } // end is absolute (not relative to HFS+ start) vol->maxblocks = embedl * sect_per_block; os_offset = ((UInt64) (drAlBlSt + embeds * sect_per_block)) << HFS_BLOCKSZ_BITS; /* Now we can try to read the embedded HFS+ volume header */ if (fsck_data.verbose) printf("Embedded HFS+ volume at 0x%LX (0x%lX) of 0x%X sized Blocks\n", os_offset, vol->maxblocks, HFSP_BLOCKSZ); return fscheck_volume_read(vol,vh,2); } else if (signature == HFSP_VOLHEAD_SIG) /* Native HFS+ volume */ { if (fsck_data.verbose) printf("This HFS+ volume is not wrapped.\n"); p = buf; // Restore to begin of block return fscheck_volume_readbuf(vol, vh, p); } else HFSP_ERROR(-1, "Neither Wrapper nor native HFS+ volume header found"); fail: return FSCK_ERR; } /* Check wether all blocks of a fork are marked as allocated. * * returns number of errors found. */ int check_forkalloc(volume* vol, hfsp_fork_raw* fork) { int i; hfsp_extent* e; UInt32 block, count; int errcount = 0; for (i=0; i < 8; i++) { e = &fork->extents[i]; block = e->start_block; count = e->block_count; while (count > 0) { if (!volume_allocated(vol, block)) { printf("Warning block %lX not marked as allocated\n",block); errcount++; } count --; block ++; } } // Hope we can correct that some time return errcount > 0 ? FSCK_FSCORR : FSCK_NOERR; } /* Check allocation of the volume (part1). The raw blocks in the voume header are checked. */ static int check_alloc1(volume* vol) { hfsp_vh* vh = &vol->vol; int result = 0; result |= check_forkalloc(vol, &vh->alloc_file); result |= check_forkalloc(vol, &vh->ext_file); result |= check_forkalloc(vol, &vh->cat_file); result |= check_forkalloc(vol, &vh->attr_file); result |= check_forkalloc(vol, &vh->start_file); return result; } /* internal function used to create the extents btree */ static int fscheck_create_extents_tree(volume* vol) { btree* result = (btree*) ALLOC(btree*, sizeof(btree)); int retval = 0; if (!result) { printf("No memory for extents btree\n"); return FSCK_ERR; } if (FSCK_FATAL & (retval = fscheck_init_extent(result, vol, &vol->vol.ext_file))) { vol->extents = NULL; return retval; } vol->extents = result; return retval; } /* Open the device, read and verify the volume header, * check the extents and catalog b-tree. */ int fscheck_volume_open(volume* vol, char* devname, int rw) { hfsp_vh backup; /* backup volume found at second to last block */ long sect_per_block; int shift; int result = 0; vol->blksize_bits = HFSP_BLOCKSZ_BITS; vol->blksize = HFSP_BLOCKSZ; vol->extents = NULL; /* Thanks to Jeremias Sauceda */ /* vol->maxblocks = os_seek(&vol->fd, -1, HFSP_BLOCKSZ_BITS); */ /* This wont work for /dev/... but we do not really need it */ vol->maxblocks = 3; btree_reset(&vol->catalog); if (os_open(&vol->fd, devname, rw)) return FSCK_ERR | result; printf("*** Checking Volume Header:\n"); if (fscheck_read_wrapper(vol, &vol->vol)) return FSCK_ERR | result; result |= fscheck_volume_header(vol, &vol->vol); printf("\t\t\t\t\t\tDone ***\n"); printf("*** Checking Backup Volume Header:\n"); if (fscheck_volume_read(vol, &backup, vol->maxblocks - 2)) return FSCK_ERR | result; result |= fscheck_volume_header(vol, &backup); printf("\t\t\t\t\t\tDone ***\n"); if (result & FSCK_FATAL) { printf("\t\t\t\t*** Check stopped ***\n"); return result; // Further checking impossible } /* Now switch blksize from HFSP_BLOCKSZ (512) to value given in header and adjust depend values accordingly, after that a block always means a HFS+ allocation size */ /* Usually 4096 / 512 == 8 */ sect_per_block = vol->vol.blocksize / HFSP_BLOCKSZ; shift = 0; if (sect_per_block > 1) { shift = 1; while (sect_per_block > 2) { sect_per_block >>=1; shift++; } /* shift = 3 */ } vol -> blksize_bits += shift; vol -> blksize = 1 << vol->blksize_bits; vol -> maxblocks = vol->vol.total_blocks; /* cant calculate via shift ? */ result |= check_alloc1(vol); // This should not be fatal .. // For fschek the extents tree is created first printf("*** Checking Extents Btree:\n"); result |= fscheck_create_extents_tree(vol); if ( !(result & FSCK_FATAL)) result |= fscheck_btree(vol->extents); if ((result & FSCK_FATAL) && !fsck_data.ignoreErr) { printf("\t\t\t\t*** Check stopped ***\n"); return result; // Further checking impossible } printf("\t\t\t\t\t\tDone ***\n"); printf("*** Checking Catalog Btree:\n"); result |= fscheck_init_cat(&vol->catalog, vol, &vol->vol.cat_file); if ( !(result & FSCK_FATAL) || !fsck_data.ignoreErr) result |= fscheck_btree(&vol->catalog); if ((result & FSCK_FATAL) && !fsck_data.ignoreErr) { printf("\t\t\t\t*** Check stopped ***\n"); return result; // Further checking impossible } printf("\t\t\t\t\t\tDone ***\n"); return result; } /* Initialize fsck_data to some default values */ static void fsck_init() { fsck_data.maxCnid = 0; fsck_data.verbose = 0; fsck_data.ignoreErr = 0; } /* Do the minimal check required after an unclean mount. * * The volume should be mounted readonly. * * returns the highest cnid found. 0 denotes an error. * In case of error the volume should not be used at all. */ UInt32 minimal_check(volume* vol) { fsck_init(); // minimal check is not verbose // An additional check for allocation wont hurt if (fscheck_files(vol)) fsck_data.maxCnid = 0; return fsck_data.maxCnid; } /* Do usefull checks, practice will tell what this is. * * returns the highest cnid found. 0 denotes an error. * In case of error the volume may still be useable. */ int hfsplus_check(char* device, int flags) { volume vol; int result; fsck_init(); fsck_data.verbose = 0 != (flags & HFSPCHECK_VERBOSE); fsck_data.ignoreErr = 0 != (flags & HFSPCHECK_IGNOREERR); fsck_data.macNow = HFSPTIMEDIFF + time(NULL); result = fscheck_volume_open(&vol, device, HFSP_MODE_RDONLY); if (! (result & FSCK_FATAL)) { printf("*** Checking files and directories in catalog:\n"); result |= fscheck_files(&vol); } volume_close(&vol); return result; } /* Do every check that can be imagined (or more :) * * returns the highest cnid found. 0 denotes an error. * In case of error the volume may still be useable. */ int maximum_check(char* device, int flags) { volume vol; int result; fsck_init(); fsck_data.verbose = 0 != (flags & HFSPCHECK_VERBOSE); fsck_data.macNow = HFSPTIMEDIFF + time(NULL); result = fscheck_volume_open(&vol, device, HFSP_MODE_RDONLY); if (! (result & FSCK_FATAL)) { printf("*** Checking files and directories in catalog:\n"); result |= fscheck_files(&vol); } volume_close(&vol); return result; } hfsplus-1.0.4/libhfsp/src/fscheck.h0100644000000000000000000000710007441220604015671 0ustar rootroot/* * libhfs - library for reading and writing Macintosh HFS volumes. * * This code checks the structures of a HFS+ volume for correctnes * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: fscheck.h,v 1.1.1.1 2002/03/05 19:50:28 klaus Exp $ */ /* Bitflags for check operations */ /* Show normal output only */ #define HFSPCHECK_NORMAL 0x0000 /* Try to fix any error autmatically (but not yet ...) */ #define HFSPCHECK_AUTO 0x0001 /* verbose, show more output about almost everything */ #define HFSPCHECK_VERBOSE 0x0002 /* ignore errros (if possible) default stop after first error */ #define HFSPCHECK_IGNOREERR 0x0004 /* On return this variable is set to a * combination of the flags below */ extern int hfspcheck_error; /* Id like to include those but found no definitions */ #define FSCK_NOERR 0 // No errors #define FSCK_FSCORR 1 // File system errors corrected #define FSCK_REBOOT 2 // System should be rebooted #define FSCK_ERR 4 // File system errors left uncorrected #define FSCK_ERROPR 8 // Operational error #define FSCK_USAGE 16 // Usage or syntax error #define FSCK_SHARED 128 // Shared library error #define FSCK_FATAL (FSCK_ERR | FSCK_ERROPR | FSCK_USAGE | FSCK_SHARED) // Will not continue checking when one of these is found /* Do the minimal check required after an unclean mount. * * The volume should be mounted readonly. * * returns the highest cnid found. 0 denotes an error. * In case of error the volume should not be used at all. */ extern UInt32 minimal_check(volume* vol); /* Do every check that can be imagined (or more :) * * returns the highest cnid found. 0 denotes an error. * In case of error the volume may still be useable. */ extern int maximum_check(char* path, int flags); /* Do usefull checks, practice will tell what this is. * * returns the highest cnid found. 0 denotes an error. * In case of error the volume may still be useable. */ extern int hfsplus_check(char* path, int flags); /* Dump all raw fork information to stdout */ extern void print_fork(hfsp_fork_raw* f); /* Check wether all blocks of a fork are marked as allocated. * * returns number of errors found. */ extern int check_forkalloc(volume* vol, hfsp_fork_raw* fork); /**** Defined in btreecheck.c ****/ /** Intialize catalog btree */ int fscheck_init_cat(btree* bt, volume* vol, hfsp_fork_raw* fork); /** Intialize catalog btree */ int fscheck_init_extent(btree* bt, volume* vol, hfsp_fork_raw* fork); /** Check a complete btree by traversing it in-oder */ int fscheck_btree(btree *bt); /** Check all files in leaf nodes */ int fscheck_files(volume* vol); /** global data used during fsck */ struct { UInt32 maxCnid; UInt32 macNow; // current date in mac-offset int verbose; int ignoreErr; } fsck_data; hfsplus-1.0.4/libhfsp/src/hfs.h0100644000000000000000000000233607441220604015051 0ustar rootroot/* * libhfsp - library for reading and writing Macintosh HFS+ volumes * * This file includes definitions for access to old HFS structures. * * Copyright (C) 2000 Klaus Halfmann * Original code 1996-1998 by Robert Leslie * other work 2000 from Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: hfs.h,v 1.1.1.1 2002/03/05 19:50:28 klaus Exp $ */ #define HFS_BLOCKSZ 512 /* A sector for Apple is always 512 bytes */ #define HFS_BLOCKSZ_BITS 9 /* 1<<9 == 512 */ #define HFS_VOLHEAD_SIG 0x4244 /* 'BD' */ hfsplus-1.0.4/libhfsp/src/hfsp.h0100644000000000000000000002621007441220604015226 0ustar rootroot/* * libhfsp - library for reading and writing Macintosh HFS+ volumes * * This file includes definitions for the structures found on * HFS+ Volumes. The structures are further wrapped by struct * found in libhfsp.h. fucntions on those enhanced structures * are found in files mentioned in comments below. * * Copyright (C) 2000 Klaus Halfmann * Original code 1996-1998 by Robert Leslie * other work 2000 from Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: hfsp.h,v 1.1.1.1 2002/03/05 19:50:28 klaus Exp $ */ /* # include */ #define HFSP_BLOCKSZ 512 /* A sector for Apple is always 512 bytes */ #define HFSP_BLOCKSZ_BITS 9 /* 1<<9 == 512 */ #define HFSP_VOLHEAD_SIG 0x482B /* 'H+' */ // Minimum Key size for all btrees #define HFSP_CAT_KEY_MIN_LEN 6 // Maximum Key size for all btrees #define HFSP_CAT_KEY_MAX_LEN 516 /* HFS+ includes POSIX permissions , although marked as reserved they will be * used as such. Is ignored by MacOS 8-9 but probably not by MacOS X. */ typedef struct { UInt32 owner; UInt32 group; UInt32 mode; UInt32 dev; } hfsp_perm; /* A single contiguous area (fragment) of a file */ typedef struct { UInt32 start_block; UInt32 block_count; } hfsp_extent; /* A file may contain up to 8 normale extents, all other are found in some extra extent area */ typedef hfsp_extent hfsp_extent_rec[8]; /* Information for a "Fork" in a file * Forks are the "usual" DATA and RSRC forks or special files * (e.g. the Volume Bitmap) */ typedef struct { UInt64 total_size; // logical size UInt32 clump_size; // number of bytes to preallocate UInt32 total_blocks; hfsp_extent_rec extents; // initial (8) extents } hfsp_fork_raw; /* HFS+ Volume Header * Always found at block 2 of the disk, a copy is stored * at the second to last block of the disk. */ typedef struct hfsp_vh { UInt16 signature; // must be HFSPLUS_VOLHEAD_SIG 'H+' UInt16 version; // currently 4, ignored UInt32 attributes; // See bit constants below UInt32 last_mount_vers; // Use a registered creator code here (See libhfsp.h) // Mac OS uses '8.10' well UInt32 reserved; UInt32 create_date; // local time ! UInt32 modify_date; // GMT (?) UInt32 backup_date; // GMT (?) UInt32 checked_date; // GMT (?) fsck ? UInt32 file_count; // not including special files but including DATA and RSRC forks UInt32 folder_count; // excluding the root folder UInt32 blocksize; // must be multiple of HFSPLUS_SECTOR_SIZE, // should be a multiple of 4k for harddisk UInt32 total_blocks; UInt32 free_blocks; // The total number of unused allocation blocks on the disk. UInt32 next_alloc; // hint where to search for next allocation blocks UInt32 rsrc_clump_sz; // default clump size for rsrc forks UInt32 data_clump_sz; // default clump size for data forks UInt32 next_cnid; // next unused catalog id UInt32 write_count; // increment on every mount (and write ?) UInt64 encodings_bmp; // for every encoding used on the disk a bit is set // ignored but eventually must be cared for Char finder_info[32]; hfsp_fork_raw alloc_file; // stores bitmap of use/free blocks hfsp_fork_raw ext_file; // stores oferflow extents hfsp_fork_raw cat_file; // This contains the root directory hfsp_fork_raw attr_file; hfsp_fork_raw start_file; // a special startup file may be described here (used by ?) } hfsp_vh; /* HFS+ volume attributes */ /* 0-6 reserved, may be used in memory only */ #define HFSPLUS_VOL_RESERVED1 0x000000FF #define HFSPLUS_VOL_HARDLOCK 0x00000080 // Used in Memory by finder only #define HFSPLUS_VOL_UNMNT 0x00000100 // clear this bit when mounting, set as last step of unmounting // This is checked by (slower) ROM code #define HFSPLUS_VOL_SPARE_BLK 0x00000200 #define HFSPLUS_VOL_NOCACHE 0x00000400 // in case of RAM or ROM disk (try a HFS+ Ramdisk :) #define HFSPLUS_VOL_INCNSTNT 0x00000800 // Reverse meaning as of HFSPLUS_VOL_UNMNT // This is checked by (faster) Mac OS code /* 12-14 reserved */ #define HFSPLUS_VOL_RESERVED2 0x00007000 #define HFSPLUS_VOL_SOFTLOCK 0x00008000 #define HFSPLUS_VOL_RESERVED3 0xFFFF0000 /* HFS+ Btree node descriptor */ typedef struct { UInt32 next; /* pointer to next node of this kind, or 0 */ /* Header Node points to first MAP node */ UInt32 prev; /* pointer to previous node of this kind, or 0 */ UInt8 kind; /* see below */ UInt8 height; /* root node starts with 0 */ UInt16 num_rec; /* number of records in this node */ UInt16 reserved; /* fill up to 4 byte alignment */ } btree_node_desc; /* HFS+ Btree Node types */ #define HFSP_NODE_NDX 0x00 #define HFSP_NODE_HEAD 0x01 #define HFSP_NODE_MAP 0x02 #define HFSP_NODE_LEAF 0xFF #define HFSP_CATALOG_MIN_NODE_SIZE 0x1000 #define HFSP_ATTRMIN_DOE_SIZE 0x1000 /* The record offsets are found at the end of the fork * containing the Btree */ typedef UInt16 btree_record_offset; typedef struct { UInt16 depth; // equal to height of btree_node_desc UInt32 root; // root node of the hierarchy UInt32 leaf_count; // number of leaf Records (not nodes) UInt32 leaf_head; // first leaf node UInt32 leaf_tail; // last leaf node UInt16 node_size; // node size of _all_ nodes in this fork UInt16 max_key_len; // maximum (or fixed) length of keys in this btree UInt32 node_count; // count of all (free and used) nodes in tree UInt32 free_nodes; UInt16 reserved1; UInt32 clump_size; // ignored my MacOS used by ? UInt8 btree_type; // always 0 for HFS+ UInt8 reserved2; UInt32 attributes; // see below UInt32 reserved3[16]; } btree_head; /* BTree attributes */ #define HFSPLUS_BAD_CLOSE 0x01 // Btree was not properly closed and should be checked // not used for HFS+ but reserved #define HFSPLUS_TREE_BIGKEYS 0x02 // always set for HFS+ #define HFSPLUS_TREE_VAR_NDXKEY_SIZE 0x04 // use variable length index nodes, always set for catalog btree, // always cleared for extents btree. #define HFSPLUS_TREE_RESERVED 0xFFFFFFF8 // Reserved bits in Attributes #define HFSPLUS_TREE_UNUSED 0xFFFFFFF8 /* Some special File ID numbers */ #define HFSP_POR_CNID 1 /* Parent Of the Root */ #define HFSP_ROOT_CNID 2 /* ROOT directory */ #define HFSP_EXT_CNID 3 /* EXTents B-tree */ #define HFSP_CAT_CNID 4 /* CATalog B-tree */ #define HFSP_BAD_CNID 5 /* BAD blocks file */ #define HFSP_ALLOC_CNID 6 /* ALLOCation file */ #define HFSP_START_CNID 7 /* STARTup file */ #define HFSP_ATTR_CNID 8 /* ATTRibutes file */ #define HFSP_EXCH_CNID 15 /* ExchangeFiles temp id */ #define HFSP_MIN_CNID 15 /* Minimum expected value */ /* Unicode String */ typedef struct { UInt16 strlen; UInt16 name[255]; // unicode characters } hfsp_unistr255; /* HFS+ key "superclass" for follwoing keys ...*/ typedef struct { UInt16 key_length; /* excluding length */ char data[0]; } hfsp_key; /* HFS+ catalog entry key */ typedef struct { UInt16 key_length; /* excluding length */ UInt32 parent_cnid; hfsp_unistr255 name; } hfsp_cat_key; /* HFS+ extends entry key */ typedef struct { UInt16 key_length; /* excluding length */ UInt8 fork_type; /* Seee below */ UInt8 filler; UInt32 file_id; UInt32 start_block; } hfsp_extent_key; #define HFSP_EXTENT_DATA 0x00 #define HFSP_EXTENT_RSRC 0xFF /* The key is followed by a record, an index or some other data */ /* The types of these records are defined as follows */ #define HFSP_FOLDER 0x0001 // entry fo a Folder #define HFSP_FILE 0x0002 // entry for a File #define HFSP_FOLDER_THREAD 0x0003 // Like '.' in unix, identifies the folder by its id, only #define HFSP_FILE_THREAD 0x0004 #define HFSP_THREAD_OFFSET 0x0002 // add to create a thread type from a simple type /* HFS+ folder data (part of an hfsp_cat_entry) */ typedef struct { UInt16 flags; /* no flags defined yet */ UInt32 valence; /* Numer of files and folders contained in folder */ UInt32 id; UInt32 create_date; // GMT UInt32 content_mod_date; // GMT UInt32 attribute_mod_date; // GMT UInt32 access_date; // GMT UInt32 backup_date; // GMT hfsp_perm permissions; DInfo user_info; DXInfo finder_info; UInt32 text_encoding; // hint fo the finder what encoding to use, unused here UInt32 reserved; } hfsp_cat_folder; #define HFSP_FOLDER_RESERVED 0xFFFF // all are reserved :) /* HFS+ file data (part of a cat_entry) */ typedef struct { UInt16 flags; /* See below */ UInt32 reserved1; UInt32 id; UInt32 create_date; UInt32 content_mod_date; UInt32 attribute_mod_date; UInt32 access_date; UInt32 backup_date; hfsp_perm permissions; FInfo user_info; FXInfo finder_info; UInt32 text_encoding; UInt32 reserved2; hfsp_fork_raw data_fork; hfsp_fork_raw res_fork; } hfsp_cat_file; /* File attribute bits */ #define HFSP_FILE_LOCKED 0x0001 #define HFSP_THREAD_EXISTS 0x0002 /* Always set in HFS+ */ #define HFSP_FILE_RESERVED 0xFFFC /* HFS+ catalog thread (part of a cat_entry) */ /* In fact this is a almost a hfsp_cat_key */ typedef struct { UInt16 reserved; UInt32 parentID; hfsp_unistr255 nodeName; } hfsp_cat_thread; /* A data record in the catalog tree */ typedef struct { UInt16 type; union { hfsp_cat_folder folder; hfsp_cat_file file; hfsp_cat_thread thread; } u; } hfsp_cat_entry; hfsplus-1.0.4/libhfsp/src/hfstime.c0100644000000000000000000000302207441220604015714 0ustar rootroot/* * libhfs - library for reading and writing Macintosh HFS volumes * Copyright (C) 2000 Klaus Halfmann ^ * Original 1996-1998 Robert Leslie * other work 2000 from Brad Boyer (flar@pants.nu) * * The HFS+ dates are stored as UInt32 containing the number of seconds since * midnight, January 1, 1904, GMT. This is slightly different from HFS, * where the value represents local time. A notable exception is the * creationdate !. Linux uses times in GMT starting at January 1, 1970 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: hfstime.c,v 1.1.1.1 2002/03/05 19:50:28 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif #include "apple.h" #include "hfstime.h" /* return the given apple time as printable UNIX time */ char* get_atime(UInt32 atime) { time_t t = atime; t -= HFSPTIMEDIFF; return ctime(&t); } hfsplus-1.0.4/libhfsp/src/hfstime.h0100644000000000000000000000274007441220604015727 0ustar rootroot/* * libhfs - library for reading and writing Macintosh HFS volumes * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * other work 2000 from Brad Boyer (flar@pants.nu) * * The HFS+ dates are stored as UInt32 containing the number of seconds since * midnight, January 1, 1904, GMT. This is slightly different from HFS, * where the value represents local time. A notable exception is the * creationdate !. Linux uses times in GMT starting at January 1, 1970 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: hfstime.h,v 1.1.1.1 2002/03/05 19:50:28 klaus Exp $ */ #include /* The number of seconds between 1.1.1904 and 1.1.1970 */ #define HFSPTIMEDIFF 2082844800U /* return the given apple time as UNIX time */ extern char* get_atime(UInt32 atime); hfsplus-1.0.4/libhfsp/src/libhfsp.c0100644000000000000000000000264407441220604015715 0ustar rootroot/* * libhfsp - library for reading and writing Macintosh HFS+ volumes * * Copyright (C) 2000-2001 Klaus Halfmann * Original 1996-1998 Robert Leslie * * Thi file contains utitlity functions to manage the features of * the hfs+ library. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: libhfsp.c,v 1.1.1.1 2002/03/05 19:50:28 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # include "libhfsp.h" const char *hfsp_error = "no error"; /* static error string */ /** helper function to create those Apple 4 byte Signatures */ UInt32 sig(char c0, char c1, char c2, char c3) { UInt32 sig; ((char*)&sig)[0] = c0; ((char*)&sig)[1] = c1; ((char*)&sig)[2] = c2; ((char*)&sig)[3] = c3; return sig; } hfsplus-1.0.4/libhfsp/src/libhfsp.h0100644000000000000000000002126207447643325015736 0ustar rootroot/* * libhfs - library for reading and writing Macintosh HFS volumes * * Copyright (C) 2000 Klaus Halfmann (klaus.halfmann@feri.de) * Original work by 1996-1998 Robert Leslie (rob@mars.org) * * This file defines constants,structs etc needed for this library. * Everything found here is usually not related to Apple defintions. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: libhfsp.h,v 1.3 2002/03/25 15:48:37 klaus Exp $ */ #ifndef APPLE_H # include "apple.h" #endif # include "hfs.h" # include "hfsp.h" extern int errno; /* Last error is eventually found here */ extern const char *hfsp_error; # define HFSP_ERROR(code, str) \ do { hfsp_error = (str), errno = (code); goto fail; } while (0) # ifdef DEBUG # define ASSERT(cond) do { if (! (cond)) abort(); } while (0) # else # define ASSERT(cond) /* nothing */ # endif # define SIZE(type, n) ((size_t) (sizeof(type) * (n))) # define ALLOC(type, n) ((type *) malloc(SIZE(type, n))) # define ALLOCX(type, n) ((n) ? ALLOC(type, n) : (type *) 0) # define FREE(ptr) ((ptr) ? (void) free((void *) ptr) : (void) 0) # define REALLOC(ptr, type, n) \ ((type *) ((ptr) ? realloc(ptr, SIZE(type, n)) : malloc(SIZE(type, n)))) # define REALLOCX(ptr, type, n) \ ((n) ? REALLOC(ptr, type, n) : (FREE(ptr), (type *) 0)) # define STRINGIZE(x) #x # define STR(x) STRINGIZE(x) /* These macros will eventually be filled for a kernel-module or * a multithreaded environement */ #define HFSP_READLOCK 1 #define HFSP_WRITELOCK 2 #define HFSP_SYNC_START(mode, whatever) /* to be filled */ #define HFSP_SYNC_END(mode, whatever) /* to be filled */ /* Flags for volume header */ /* used by internal routines to specify the open modes */ # define HFSP_MODE_RDONLY 0x00 # define HFSP_MODE_RDWR 0x01 /** need to write backup volume header, due to significant change */ # define HFSP_BACKUP_DIRTY 0x02 /* Signatures registered with Apple to identify this driver */ /* Identifies the userland implementation */ # define HPLS_SIGNATURE 0x482B4C58 // 'H+LX' # define HFSPLUS_VERS 0x0004 // Current version of HFS+ Specification /* Identifies the kernel module by Brad Boyer (flar@pants.nu) */ # define HPLS_SIGRES1 0x482B4C78 // 'H+Lx' /* not jet in use ... */ # define HPLS_SIGRES2 0x482B6C78 // 'H+lx' /* Signature used by Apple */ # define HPAPPLE_SIGNATURE 0x382e3130 // '8.10' /* Version used for this implementation of HFS+. This is not related * to the VERSION file found at the top-level of this package, * but designates the version of the low level code */ #define HPLS_VERSION 1 /* must fit in a short */ /** helper function to create those Apple 4 byte Signatures */ extern inline UInt32 sig(char c0, char c1, char c2, char c3) { UInt32 sig; ((char*)&sig)[0] = c0; ((char*)&sig)[1] = c1; ((char*)&sig)[2] = c2; ((char*)&sig)[3] = c3; return sig; } /* Other Signatures may follow for informational purposes */ /* prototype for key comparing functions. */ typedef int (*hfsp_key_compare) (void* key1, void* key2); /* The read functions alaways retur the positiion right after * reading (and swapping) the variable amount of bytes needed * prototype for key reading (necessary for byte swapping) */ typedef void* (*hfsp_key_read) (void* p, void* key); /* prototype for record reading (including byte swapping) */ typedef void* (*hfsp_rec_read) (void* p, void* key); struct volume; /* foreward declaration for btree needed */ /* Structures for a node cache. The cache is an array * with linear search. (So making it to big may make * things slower). It is searched in a round robin * fashion. */ typedef struct { UInt32 priority; // as lower this number as higher the priority. // decremetned on any sucessfull usage // incremented else, intial value height*DEPTHFACTOR UInt16 index; // of node in fork // 0 means empty, since first node is node header UInt16 flags; // like DIRTY etc. } node_entry; /* an Entry is dirty and must be written back */ #define NODE_DIRTY 0x0001 /* opposite of dirty */ #define NODE_CLEAN 0x0000 typedef struct { UInt32 index; // duplicate of above btree_node_desc desc; // header of node char node[0]; // size is actual node_size // contents of node in original byte order } node_buf; typedef struct { int size; // number of nodes in the cache int currindex; // round robin index int nodebufsize; // size of complete node_buf, including node node_entry *entries; char *buffers; // actually *node_buf } node_cache; typedef struct { // "virtual" member functions hfsp_key_compare kcomp; /* function used for key compare in _this_ btree */ hfsp_key_read kread; /* function used to read a key in _this_ btree */ hfsp_rec_read rread; /* function used to read a record in _this_ btree */ btree_node_desc head_node; /* Node descriptor for header node */ btree_head head; struct volume* vol; /* pointer to volume this tree is part of */ hfsp_fork_raw* fork; /* pointer to fork this tree is part of */ UInt32 cnid; /* (pseudo) file id for the fork */ UInt32 attributes; /* see bits below */ /* Header node (contains most important parts of btree) */ char* alloc_bits; /* All the rest of node 0 including the reserved area, * the first part of the allocation bit-map found in Map Nodes * and the two bakpointers needed for the header node, so this * memory + head represent the header node */ UInt16 blkpernode; /* Number of volume blocks per node (usually 0-4) 0 indicates, that nodeperblk should be used */ UInt16 nodeperblk; /* Sometimes a block may contain more than one node */ UInt16 max_rec_size; /* Maximum Size of a leaf record */ UInt16 filler; node_cache cache; } btree; /* The Btree header is dirty and must be written back */ #define BTREE_HEADDIRTY 0x0001 /* The reserved Record starts at this offset in the header header node */ #define HEADER_RESERVEDOFFSET 120 /* The first map node eventually starts at this offset in the * header node */ #define HEADER_MAPOFFSET 248 /* Function on btrees are defined in btree.h */ /* A Wrapper around the raw hfs+ volume header for additional information * needed by this library. */ typedef struct volume { void *fd; /* OS dependend reference to device */ UInt16 blksize_bits; /* blocksize of device = 1 << blksize_bits */ UInt16 flags; /* as of now only HFSP_MODE_RDWR */ UInt32 blksize; /* always 1 << blksize_bits */ UInt32 maxblocks; /* maximum number of blocks in device */ hfsp_vh vol; /* raw volume data */ btree* extents; /* is NULL by default and intialized when needed */ btree catalog; /* This is always neeeded */ } volume; /* Functions on volumes are defined in volume.h */ typedef struct { // may not be used as found here btree* tree; // tree where this record is contained in. UInt16 node_index; /* index of node in btree */ UInt16 keyind; /* index of current key in node */ /* Warning node_index and keyind are private. They can become * invalid when the btree changes */ hfsp_cat_key key; /* current key */ UInt32 child; /* child node belonging to this key */ } index_record; typedef struct { btree* tree; // tree where this record is contained in. UInt16 node_index; /* index of node in btree */ UInt16 keyind; /* index of current key in node */ /* Warning node_index and keyind are private. They can become * invalid when the btree changes */ hfsp_extent_key key; /* current key */ hfsp_extent_rec extent; /* The payload carried around */ } extent_record; typedef struct { btree* tree; // tree where this record is contained in. UInt16 node_index; /* index of node in btree */ UInt16 keyind; /* index of current key in node */ /* Warning node_index and keyind are private. They can become * invalid when the btree changes */ hfsp_cat_key key; /* current key */ hfsp_cat_entry record; /* current record */ } record; /* Functions on records are defined in record.h */ hfsplus-1.0.4/libhfsp/src/os.c0100644000000000000000000001206107447643325014720 0ustar rootroot/* * libhfsp - library for reading and writing Macintosh HFS+ volumes * * Copyright (C) 2000-2001 Klaus Halfmann * Original Copyright (C) 1996-1998 Robert Leslie * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: os.c,v 1.2 2002/03/25 15:48:37 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif #define _FILE_OFFSET_BITS 64 # ifdef HAVE_FCNTL_H # include # else int open(const char *, int, ...); int fcntl(int, int, ...); # endif # ifdef HAVE_UNISTD_H # include # else int close(int); off_t lseek(int, off_t, int); size_t read(int, void *, size_t); size_t write(int, const char *, size_t); int stat(const char *, struct stat *); int fstat(int, struct stat *); # endif # include # include # include // need BLKGETSIZE ioctl call // # include # include "libhfsp.h" # include "os.h" /** Offset that is silently used by os_seek. * Nedded to transparaently support things like partitions */ UInt64 os_offset; /* * NAME: os->open() * DESCRIPTION: open and lock a new descriptor from the given path and mode */ int os_open(void **priv, const char *path, int mode) { int fd; struct flock lock; int c; switch (mode) { case HFSP_MODE_RDONLY: mode = O_RDONLY; break; case HFSP_MODE_RDWR: default: fprintf(stderr,"*** Warning: You are about to open '%s' " "for writing ***\n", path); fprintf(stderr,"*** Do you really want to do that ? (y/n) ***\n"); do c = getchar(); while (c != 'y' && c != 'n'); if (c != 'y') exit(1); mode = O_RDWR; break; } fd = open(path, mode); if (fd == -1) HFSP_ERROR(errno, "error opening medium"); /* lock descriptor against concurrent access */ lock.l_type = (mode == O_RDONLY) ? F_RDLCK : F_WRLCK; lock.l_start = 0; lock.l_whence = SEEK_SET; lock.l_len = 0; if (fcntl(fd, F_SETLK, &lock) == -1 && (errno == EACCES || errno == EAGAIN)) HFSP_ERROR(EAGAIN, "unable to obtain lock for medium"); *priv = (void *) fd; return 0; fail: if (fd != -1) close(fd); return -1; } /* * NAME: os->close() * DESCRIPTION: close an open descriptor */ int os_close(void **priv) { int fd = (int) *priv; *priv = (void *) -1; if (close(fd) == -1) HFSP_ERROR(errno, "error closing medium"); return 0; fail: return -1; } /* * NAME: os->same() * DESCRIPTION: return 1 iff path is same as the open descriptor */ int os_same(void **priv, const char *path) { int fd = (int) *priv; struct stat fdev, dev; if (fstat(fd, &fdev) == -1 || stat(path, &dev) == -1) HFSP_ERROR(errno, "can't get path information"); return fdev.st_dev == dev.st_dev && fdev.st_ino == dev.st_ino; fail: return -1; } /* * NAME: os->seek() * DESCRIPTION: set a descriptor's seek pointer (offset in blocks) and returns * this offset if everything went well */ unsigned long os_seek(void **priv, unsigned long offset, int blksize_bits) { int fd = (int) *priv; off_t result, where = offset; where = os_offset + (where << blksize_bits); result = lseek(fd, where, SEEK_SET) - os_offset; result = result >> blksize_bits; return (unsigned long) result; } /* * NAME: os->read() * DESCRIPTION: read blocks from an open descriptor * * @param **priv is a pointer to the file descriptor * @param *buf buffer to put the content in * @param len number of buffers to read * @param blksize_bits blocksize as a power of 2 (e.g. 9 for 512) * * @return number of read blocks or -1 on error */ unsigned long os_read(void **priv, void *buf, unsigned long len, int blksize_bits) { int fd = (int) *priv; size_t result= 0; int num= len << blksize_bits; while( result< num) { size_t size = read(fd, &((char *)buf)[ result], num- result); if (size <= 0) /* EOF == 0 should not happen, too */ HFSP_ERROR(errno, "error reading from medium"); result += size; } return (unsigned long) result >> blksize_bits; fail: return -1; } /* * NAME: os->write() * DESCRIPTION: write blocks to an open descriptor */ unsigned long os_write(void **priv, const void *buf, unsigned long len, int blksize_bits) { int fd = (int) *priv; size_t result; result = write(fd, buf, len << blksize_bits); if (result == -1) HFSP_ERROR(errno, "error writing to medium"); return (unsigned long) result >> blksize_bits; fail: return -1; } hfsplus-1.0.4/libhfsp/src/os.h0100644000000000000000000000355507447643325014735 0ustar rootroot/* * libhfs - library for reading and writing Macintosh HFS volumes * Copyright (C) 1996-1998 Robert Leslie * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: os.h,v 1.2 2002/03/25 15:48:37 klaus Exp $ */ /* * NAME: os->open() * DESCRIPTION: open and lock a new descriptor from the given path and mode */ int os_open(void **priv, const char *path, int mode); /* * NAME: os->close() * DESCRIPTION: close an open descriptor */ int os_close(void **priv); /* * NAME: os->same() * DESCRIPTION: return 1 iff path is same as the open descriptor */ int os_same(void **priv, const char *path); /** Offset that is silently used by os_seek. * Needed to transparaently support things like partitions */ extern UInt64 os_offset; /* * NAME: os->seek() * DESCRIPTION: set a descriptor's seek pointer (offset in blocks) */ unsigned long os_seek(void **priv, unsigned long offset, int blksize_bits); /* * NAME: os->read() * DESCRIPTION: read blocks from an open descriptor */ unsigned long os_read(void **priv, void *buf, unsigned long len, int blksize_bits); /* * NAME: os->write() * DESCRIPTION: write blocks to an open descriptor */ unsigned long os_write(void **priv, const void *buf, unsigned long len, int blksize_bits); hfsplus-1.0.4/libhfsp/src/partitions.c0100644000000000000000000001247607450133475016477 0ustar rootroot/* * hfsutils - tools for reading and writing Macintosh HFS volumes * Copyright (C) 2000 Klaus Halfmann * * Structures and Functions for accessing the mac partition map * Copyright (C) 2002 Michael Schulze * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: partitions.c,v 1.7 2002/03/26 18:00:29 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif #include "swab.h" #include "partitions.h" #include "os.h" #include "libhfsp.h" #include /* * Returns the number of partitions in the given partition map. * probably we don't need this since we have map->numparts */ int partition_getnparts( partition_map *map) { return map->partitions[ 0]->pmMapBlkCnt; } /* * Copies bytes from the beginning of source to dest. * source will be incrementet to the byte after length. */ static int splitCharArray( char **source, char *dest, int length) { memcpy( dest, *source, length); dest[ length- 1]= 0; /* force last byte to null */ (*source)+= length; return 0; } int partition_fillstruct( Partition *p, char *buf) { p->pmSig = bswabU16_inc( buf); p->pmSigPad = bswabU16_inc( buf); p->pmMapBlkCnt = bswabU32_inc( buf); p->pmPyPartStart = bswabU32_inc( buf); p->pmPartBlkCnt = bswabU32_inc( buf); splitCharArray( &buf, p->pmPartName, 32); splitCharArray( &buf, p->pmPartType, 32); p->pmLgDataStart = bswabU32_inc( buf); p->pmDataCnt = bswabU32_inc( buf); p->pmPartStatus = bswabU32_inc( buf); p->pmLgBootStart = bswabU32_inc( buf); p->pmBootSize = bswabU32_inc( buf); p->pmBootAddr = bswabU32_inc( buf); p->pmBootAddr2 = bswabU32_inc( buf); p->pmBootEntry = bswabU32_inc( buf); p->pmBootEntry2 = bswabU32_inc( buf); p->pmBootCksum = bswabU32_inc( buf); return 0; } /* sort the partitions according to their occurance on disc * hasi: we'd better use qsort instead of reinventing the wheel ....*/ void partition_sort( partition_map *map) { Partition **partitions = map->partitions; Partition *min; int i, j, numparts= map->numparts; for( i= 0; i < numparts; i++) { for( j= i+ 1; j< numparts; j++) { if( partitions[ j]->pmPyPartStart< partitions[ i]->pmPyPartStart) { min= partitions[ j]; partitions[ j]= partitions[ i]; partitions[ i]= min; } } } } /* * Returns the partition map of the given device * * @param fd filedescripator (see os.h) must already be opened. */ int partition_getPartitionMap( partition_map *map, void *fd) { char buf[ HFSP_BLOCKSZ]; Partition first; /* we use that to get the number of partitions in the map */ int i, numparts; if( os_seek( &fd, 1, HFSP_BLOCKSZ_BITS)!= 1) return -1; /* read the first partition info from the map */ if( os_read( &fd, buf, 1, HFSP_BLOCKSZ_BITS)!= 1) return -1; if( partition_fillstruct( &first, buf)) return -1; /* check if this is a partition map */ if( first.pmSig!= PARTITION_SIG) { map->numparts= 0; return 0; } /* set the number of partitions and allocate memory */ map->numparts = numparts = first.pmMapBlkCnt; map->parray = ( Partition *)malloc( numparts* sizeof( Partition)); map->partitions = ( Partition **)malloc( numparts* sizeof( void *)); /* copy the first partition info to map */ memcpy( map->parray, &first, sizeof( Partition)); map->partitions[ 0]= map->parray; for( i= 1; i < numparts; i++) { if( ( os_read( &fd, buf, 1, HFSP_BLOCKSZ_BITS)!= 1) || ( partition_fillstruct( &( map->parray[ i]), buf))) { free( map->partitions); free( map->parray); map->numparts = 0; // so partition_release() will work correctly return -1; } map->partitions[ i]= &( map->parray[ i]); } partition_sort( map); return numparts; } /* * Returns the startblock of the th partition of the given type from the given * Partition Map. * @param map Partition map to get the information from * @param type type of the desired partition * @param num number of the desired partition (starting with 1) * @return the start block of the partition or 0 if no such partition could be found */ UInt32 partition_getStartBlock( partition_map *map, const char *type, int num) { int i, startblock = 0; Partition **partitions = map->partitions; for( i= 0; i< map->numparts && num> 0; i++) { if( !strcmp( partitions[ i]->pmPartType, type)) { startblock= partitions[ i]->pmPyPartStart; num--; } } return num ? 0 : startblock; } /* * cleanup and free allocated memory. */ void partition_release( partition_map *map) { if( map->numparts > 0) { free( map->partitions); free( map->parray); map->numparts = 0; } } hfsplus-1.0.4/libhfsp/src/partitions.h0100644000000000000000000000411307450133475016471 0ustar rootroot/* * hfsutils - tools for reading and writing Macintosh HFS volumes * Copyright (C) 2000 Klaus Halfmann * * Structures and Functions for accessing the mac partition map * Copyright (C) 2002 Michael Schulze * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: partitions.h,v 1.5 2002/03/26 18:00:29 klaus Exp $ */ #ifndef APPLE_H #include "apple.h" #endif typedef struct { int numparts; /* number of partitions found */ Partition *parray; /* only used for mem mngmnt */ Partition **partitions; /* partition descriptions */ } partition_map; /* * Returns the number of partitions in the given partition map or 0 if no partitions were found * @param map Partition map to get the information from. */ int partition_getnparts( partition_map *map); /* * Returns the startblock of the th partition of the given type from the given * Partition Map. * * @param map Partition map to get the information from * @param type type of the desired partition * @param num number of the desired partition (starting with 1) * * @return the start block of the partition or 0 if no such partition could be found */ UInt32 partition_getStartBlock( partition_map *map, const char *type, int num); /* * Returns the partition map of the given device */ int partition_getPartitionMap( partition_map *map, void *fd); /* * cleanup and free allocated memory. */ void partition_release( partition_map *map); hfsplus-1.0.4/libhfsp/src/record.c0100644000000000000000000011060507445150101015537 0ustar rootroot/* * libhfsp - library for reading and writing Macintosh HFS+ volumes. * * a record contains a key and a folder or file and is part * of a btree. This file conatins various methods to read and * write the record related HFS+ structures from/to memory. * * Copyright (C) 2000-2001 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: record.c,v 1.2 2002/03/17 17:20:01 klaus Exp $ */ #ifdef HAVE_CONFIG_H # include "config.h" # endif #include #include #include "libhfsp.h" #include "hfstime.h" #include "record.h" #include "volume.h" #include "btree.h" #include "unicode.h" #include "swab.h" /* read a hfsp_cat_key from memory, check for correct length * * @param p buffer in memory to read from * @param buf buffer containing the correctly swapped structure * * @return pointer to next byte after structure, NULL on failure */ void* record_readkey(void* p, void* buf) { hfsp_cat_key* key = (hfsp_cat_key*) buf; const void* check; UInt16 key_length, len,i; UInt16* cp; key->key_length = key_length = bswabU16_inc(p); check = p; key->parent_cnid = bswabU32_inc(p); key->name.strlen = len = bswabU16_inc(p); cp = key->name.name; for (i=0; i < len; i++, cp++) *cp = bswabU16_inc(p); /* check if keylenght was correct */ if (key_length != ((char*) p) - ((char*) check)) HFSP_ERROR(EINVAL, "Invalid key length in record_readkey"); return p; fail: return NULL; } /* write a hfsp_cat_key back to memory, check for correct length. * * @param p buffer in memory to write to * @param buf memory containing the (swapped) key. * * @return pointer to byte after the structure or NULL on failure. * */ void* record_writekey(void* p, void* buf) { hfsp_cat_key* key = (hfsp_cat_key*) buf; UInt16 key_length, len,i; UInt16* cp; key_length = key->key_length; len = key->name.strlen; cp = key->name.name; if (key_length != (6 + len * 2)) HFSP_ERROR(EINVAL, "Invalid key length in record_writekey"); bstoreU16_inc(p, key_length); bstoreU32_inc(p, key->parent_cnid); bstoreU16_inc(p, len); for (i=0; i < len; i++, cp++) bstoreU16_inc(p, *cp); return p; fail: return NULL; } /* read a hfsp_extent_key from memory */ void* record_extent_readkey(void* p, void* buf) { hfsp_extent_key* key = (hfsp_extent_key*) buf; UInt16 key_length; key->key_length = key_length = bswabU16_inc(p); key->fork_type = bswabU8_inc(p); key->filler = bswabU8_inc(p); if (key_length != 10) HFSP_ERROR(-1, "Invalid key length in record_extent_readkey"); key->file_id = bswabU32_inc(p); key->start_block = bswabU32_inc(p); return p; fail: return NULL; } /* write a hfsp_extent_key to memory */ void* record_extent_writekey(void* p, void* buf) { hfsp_extent_key* key = (hfsp_extent_key*) buf; UInt16 key_length = key->key_length; if (key_length != 10) HFSP_ERROR(-1, "Invalid key length in record_extent_writekey"); bstoreU16_inc (p, key_length); bstoreU8_inc (p, key->fork_type); bstoreU8_inc (p, key->filler); bstoreU32_inc (p, key->file_id); bstoreU32_inc (p, key->start_block); return p; fail: return NULL; } /* read posix permission from memory */ static inline void* record_readperm(void *p, hfsp_perm* perm) { perm->owner= bswabU32_inc(p); perm->group= bswabU32_inc(p); perm->mode = bswabU32_inc(p); perm->dev = bswabU32_inc(p); return p; } /* write posix permission to memory */ static inline void* record_writeperm(void *p, hfsp_perm* perm) { bstoreU32_inc (p, perm->owner); bstoreU32_inc (p, perm->group); bstoreU32_inc (p, perm->mode ); bstoreU32_inc (p, perm->dev ); return p; } /* intialize posix permission from memory. * * TODO use current umask, user, group, etc. */ static inline void record_initperm(hfsp_perm* perm) { perm->owner= 0; perm->group= 0; perm->mode = 0; perm->dev = 0; } /* read directory info */ static inline void* record_readDInfo(void *p, DInfo* info) { info->frRect.top = bswabU16_inc(p); info->frRect.left = bswabU16_inc(p); info->frRect.bottom = bswabU16_inc(p); info->frRect.right = bswabU16_inc(p); info->frFlags = bswabU16_inc(p); info->frLocation.v = bswabU16_inc(p); info->frLocation.h = bswabU16_inc(p); info->frView = bswabU16_inc(p); return p; } /* write directory info */ static inline void* record_writeDInfo(void *p, DInfo* info) { bstoreU16_inc (p, info->frRect.top ); bstoreU16_inc (p, info->frRect.left ); bstoreU16_inc (p, info->frRect.bottom); bstoreU16_inc (p, info->frRect.right); bstoreU16_inc (p, info->frFlags ); bstoreU16_inc (p, info->frLocation.v); bstoreU16_inc (p, info->frLocation.h); bstoreU16_inc (p, info->frView ); return p; } /* initialize directory info */ static inline void record_initDInfo(DInfo* info) { // Hope the finder will not choke on these values memset(info, 0, sizeof(DInfo)); /* info->frRect.top = 0; info->frRect.left = 0; info->frRect.bottom = 0; info->frRect.right = 0; info->frFlags = 0; info->frLocation.v = 0; info->frLocation.h = 0; info->frView = 0; */ } /* read extra Directory info */ static inline void* record_readDXInfo(void *p, DXInfo* xinfo) { xinfo->frScroll.v = bswabU16_inc(p); xinfo->frScroll.h = bswabU16_inc(p); xinfo->frOpenChain = bswabU32_inc(p); xinfo->frUnused = bswabU16_inc(p); xinfo->frComment = bswabU16_inc(p); xinfo->frPutAway = bswabU32_inc(p); return p; } /* write extra Directory info */ static inline void* record_writeDXInfo(void *p, DXInfo* xinfo) { bstoreU16_inc (p, xinfo->frScroll.v ); bstoreU16_inc (p, xinfo->frScroll.h ); bstoreU32_inc (p, xinfo->frOpenChain); bstoreU16_inc (p, xinfo->frUnused ); bstoreU16_inc (p, xinfo->frComment ); bstoreU32_inc (p, xinfo->frPutAway ); return p; } /* initialize extra Directory info */ static inline void record_initDXInfo(DXInfo* xinfo) { // Hope the finder will not choke on these values memset(xinfo, 0, sizeof(DXInfo)); /* xinfo->frScroll.v = 0; xinfo->frScroll.h = 0; xinfo->frOpenChain= 0; xinfo->frUnused = 0; xinfo->frComment = 0; xinfo->frPutAway = 0; */ } /* read a hfsp_cat_folder from memory */ static void* record_readfolder(void *p, hfsp_cat_folder* folder) { folder->flags = bswabU16_inc(p); folder->valence = bswabU32_inc(p); folder->id = bswabU32_inc(p); folder->create_date = bswabU32_inc(p); folder->content_mod_date = bswabU32_inc(p); folder->attribute_mod_date = bswabU32_inc(p); folder->access_date = bswabU32_inc(p); folder->backup_date = bswabU32_inc(p); p = record_readperm (p, &folder->permissions); p = record_readDInfo (p, &folder->user_info); p = record_readDXInfo (p, &folder->finder_info); folder->text_encoding = bswabU32_inc(p); folder->reserved = bswabU32_inc(p); return p; } /* write a hfsp_cat_folder to memory */ static void* record_writefolder(void *p, hfsp_cat_folder* folder) { bstoreU16_inc (p, folder->flags ); bstoreU32_inc (p, folder->valence ); bstoreU32_inc (p, folder->id ); bstoreU32_inc (p, folder->create_date ); bstoreU32_inc (p, folder->content_mod_date ); bstoreU32_inc (p, folder->attribute_mod_date); bstoreU32_inc (p, folder->access_date ); bstoreU32_inc (p, folder->backup_date ); p = record_writeperm (p, &folder->permissions); p = record_writeDInfo (p, &folder->user_info); p = record_writeDXInfo (p, &folder->finder_info); bstoreU32_inc (p, folder->text_encoding ); bstoreU32_inc (p, folder->reserved ); return p; } /* initialize a hfsp_cat_folder with given values. * * @vol is needed to create a new record Id. * @return 0 on sucess anything else on error. */ static int record_initfolder(volume* vol, hfsp_cat_folder* folder) { UInt32 macNow = HFSPTIMEDIFF + time(NULL); folder->flags = 0; folder->valence = 0; // no subfiles/folders yet if (! (folder->id = volume_get_nextid(vol))) // oops possible wrap around overflow return -1; folder->create_date = macNow; folder->content_mod_date = macNow; folder->attribute_mod_date = macNow; folder->access_date = macNow; folder->backup_date = 0; record_initperm (&folder->permissions); record_initDInfo (&folder->user_info); record_initDXInfo (&folder->finder_info); folder->text_encoding = 0; // Not supported, sorry folder->reserved = 0; return 0; } /* read file info */ static inline void* record_readFInfo(void *p, FInfo* info) { info->fdType = bswabU32_inc(p); info->fdCreator = bswabU32_inc(p); info->fdFlags = bswabU16_inc(p); info->fdLocation.v = bswabU16_inc(p); info->fdLocation.h = bswabU16_inc(p); info->fdFldr = bswabU16_inc(p); return p; } /* write file info */ static inline void* record_writeFInfo(void *p, FInfo* info) { bstoreU32_inc (p, info->fdType ); bstoreU32_inc (p, info->fdCreator ); bstoreU16_inc (p, info->fdFlags ); bstoreU16_inc (p, info->fdLocation.v); bstoreU16_inc (p, info->fdLocation.h); bstoreU16_inc (p, info->fdFldr ); return p; } /* initialize file info */ static inline void record_initFInfo(FInfo* info) { // should use something better somehow info->fdType = sig('T','E','X','T'); info->fdCreator = HPLS_SIGNATURE; info->fdFlags = 0; // dunno any finder flags info->fdLocation.v = 0; info->fdLocation.h = 0; info->fdFldr = 0; } /* read extra File info */ static inline void* record_readFXInfo(void *p, FXInfo* xinfo) { xinfo->fdIconID = bswabU16_inc(p); xinfo->fdUnused[0] = bswabU16_inc(p); xinfo->fdUnused[1] = bswabU16_inc(p); xinfo->fdUnused[2] = bswabU16_inc(p); xinfo->fdUnused[3] = bswabU16_inc(p); xinfo->fdComment = bswabU16_inc(p); xinfo->fdPutAway = bswabU32_inc(p); return p; } /* write extra File info */ static inline void* record_writeFXInfo(void *p, FXInfo* xinfo) { bstoreU16_inc (p, xinfo->fdIconID); bstoreU16_inc (p, xinfo->fdUnused[0]); bstoreU16_inc (p, xinfo->fdUnused[1]); bstoreU16_inc (p, xinfo->fdUnused[2]); bstoreU16_inc (p, xinfo->fdUnused[3]); bstoreU16_inc (p, xinfo->fdComment); bstoreU16_inc (p, xinfo->fdPutAway); return p; } /* initialize extra File info */ static inline void record_initFXInfo(FXInfo* xinfo) { // Hope the finder will not choke on these values memset(xinfo, 0, sizeof(FXInfo)); /* xinfo->fdIconID = 0; xinfo->fdUnused[0] = 0; xinfo->fdUnused[1] = 0; xinfo->fdUnused[2] = 0; xinfo->fdUnused[3] = 0; xinfo->fdComment = 0; xinfo->fdPutAway = 0; */ } /* read a hfsp_cat_file from memory */ static void* record_readfile(void *p, hfsp_cat_file* file) { file->flags = bswabU16_inc(p); file->reserved1 = bswabU32_inc(p); file->id = bswabU32_inc(p); file->create_date = bswabU32_inc(p); file->content_mod_date = bswabU32_inc(p); file->attribute_mod_date = bswabU32_inc(p); file->access_date = bswabU32_inc(p); file->backup_date = bswabU32_inc(p); p = record_readperm (p, &file->permissions); p = record_readFInfo (p, &file->user_info); p = record_readFXInfo (p, &file->finder_info); file->text_encoding = bswabU32_inc(p); file->reserved2 = bswabU32_inc(p); p = volume_readfork (p, &file->data_fork); return volume_readfork (p, &file->res_fork); } /* write a hfsp_cat_file to memory */ static void* record_writefile(void *p, hfsp_cat_file* file) { bstoreU16_inc(p, file->flags); bstoreU16_inc(p, file->reserved1); bstoreU16_inc(p, file->id); bstoreU16_inc(p, file->create_date); bstoreU16_inc(p, file->content_mod_date); bstoreU16_inc(p, file->attribute_mod_date); bstoreU16_inc(p, file->access_date); bstoreU16_inc(p, file->backup_date); p = record_writeperm (p, &file->permissions); p = record_writeFInfo (p, &file->user_info); p = record_writeFXInfo (p, &file->finder_info); bstoreU16_inc(p, file->text_encoding); bstoreU16_inc(p, file->reserved2 ); p = volume_writefork (p, &file->data_fork); return volume_writefork (p, &file->res_fork); } /* initialize a hfsp_cat_file with given values. * * vol needed to create new Id */ static int record_initfile(volume* vol, hfsp_cat_file* file) { UInt32 macNow = HFSPTIMEDIFF + time(NULL); file->flags = 0; file->reserved1 = 0; // no subfiles/folders yet if (! (file->id = volume_get_nextid(vol))) // oops possible wrap around overflow return -1; file->create_date = macNow; file->content_mod_date = macNow; file->attribute_mod_date = macNow; file->access_date = macNow; file->backup_date = 0; record_initperm (&file->permissions); record_initFInfo (&file->user_info); record_initFXInfo (&file->finder_info); file->text_encoding = 0; // Not supported, sorry file->reserved2 = 0; volume_initfork(vol,&file->data_fork, HFSP_EXTENT_DATA); volume_initfork(vol,&file->res_fork, HFSP_EXTENT_RSRC); return 0; } /* read a hfsp_cat_thread from memory */ static void* record_readthread(void *p, hfsp_cat_thread* entry) { int i; UInt16 len; UInt16* cp; entry-> reserved = bswabU16_inc(p); entry-> parentID = bswabU32_inc(p); entry->nodeName.strlen = len= bswabU16_inc(p); cp = entry->nodeName.name; if (len > 255) HFSP_ERROR(-1, "Invalid key length in record_thread"); for (i=0; i < len; i++, cp++) *cp = bswabU16_inc(p); return p; fail: return NULL; } /* write a hfsp_cat_thread to memory */ static void* record_writethread(void *p, hfsp_cat_thread* entry) { int i; UInt16 len; UInt16* cp; bstoreU16_inc(p, entry->reserved); bstoreU32_inc(p, entry->parentID); bstoreU16_inc(p, len = entry->nodeName.strlen); cp = entry->nodeName.name; if (len > 255) HFSP_ERROR(-1, "Invalid key length in record_thread"); for (i=0; i < len; i++, cp++) bstoreU16_inc(p, *cp); return p; fail: return NULL; } /* read a hfsp_cat_entry from memory */ void* record_readentry(void *p, void* entry) { UInt16 type = bswabU16_inc(p); hfsp_cat_entry* e = (hfsp_cat_entry*) entry; e->type = type; switch (type) { case HFSP_FOLDER: return record_readfolder(p, &e->u.folder); case HFSP_FILE: return record_readfile (p, &e->u.file); case HFSP_FOLDER_THREAD: case HFSP_FILE_THREAD: return record_readthread(p, &e->u.thread); default: HFSP_ERROR(-1, "Unexpected record type in record_readentry"); } ; fail: return NULL; } /* write a hfsp_cat_entry to memory */ void* record_writeentry(void *p, hfsp_cat_entry* entry) { UInt16 type = entry->type; bstoreU16_inc(p, type); switch (type) { case HFSP_FOLDER: return record_writefolder(p, &entry->u.folder); case HFSP_FILE: return record_writefile (p, &entry->u.file); case HFSP_FOLDER_THREAD: case HFSP_FILE_THREAD: return record_writethread(p, &entry->u.thread); default: HFSP_ERROR(-1, "Unexpected record type in record_writeentry"); } ; fail: return NULL; } /* read an extent record from memory */ // For dependency reasons this actually is found in volume.h void* record_extent_readrecord(void *p, void* entry) { return volume_readextent(p, (hfsp_extent*) entry); } /* intialize the record with the given index entry in the btree. */ int record_init(record* r, btree* bt, node_buf* buf, UInt16 index) { void *p; r-> tree = bt; p = btree_key_by_index(bt,buf,index); if (!p) return -1; p = record_readkey (p, &r->key); if (!p) return -1; /* void *help = p; // se comment below */ p = record_readentry(p, &r->record); /* This was for testing write cache only void * help; help = record_writeentry(help, &r->record); if (p != help) HFSP_ERROR(-1, "Error in write entry"); */ if (!p) return -1; r->node_index = buf->index; r-> keyind = index; return 0; /* fail: return -1; */ } /* Update the record using its node- and key-index. * * Only use this function with a write lock, directly * after reading the record, otherwise use update_bykey(). */ int record_update(record* r) { btree *tree= r->tree; node_buf *buf = btree_node_by_index(tree, r->node_index, NODE_DIRTY); void *p = btree_key_by_index (tree, buf, r->keyind); if (!p) return -1; p = record_writekey (p, &r->key); if (!p) return -1; p = record_writeentry(p, &r->record); if (!p) return -1; return 0; } /* intialize the record with the given index entry in the btree. */ static int record_init_extent(extent_record* r, btree* bt, node_buf* buf, UInt16 index) { void *p; r-> tree = bt; p = btree_key_by_index(bt, buf,index); if (!p) return -1; p = record_extent_readkey(p, &r->key); if (!p) return -1; p = volume_readextent(p, r->extent); if (!p) return -1; r->node_index = buf->index; r-> keyind = index; return 0; } /* intialize the record to the first record of the tree * which is (per design) the root node. */ int record_init_root(record* r, btree* tree) { // Position to first leaf node ... UInt32 leaf_head = tree->head.leaf_head; node_buf* buf = btree_node_by_index(tree, leaf_head, NODE_CLEAN); if (!buf) return -1; return record_init(r, tree, buf, 0); } /* initialize a (catalog) record with given type and (ascii) name. * parent must be a HFSP_FOLDER or FOLDER_THREAD * You should normally call record_insert afterwards. */ int record_init_string(record* r, UInt16 type, char* name, record* parent) { int result = 0; hfsp_cat_key* key = &r->key; hfsp_cat_entry* entry = &r->record; UInt16 ptype = parent->record.type; memset(r, sizeof(record), 0); // **** Debugging only r->tree = parent->tree; r->node_index = 0; r->keyind = 0; key->key_length = 6 + 2 * unicode_asc2uni(&key->name,name); // 6 for minumum size if (ptype == HFSP_FOLDER) key->parent_cnid= parent->record.u.folder.id; else if (ptype == HFSP_FOLDER_THREAD) key->parent_cnid= parent->key.parent_cnid; else // no kind of folder ?? { hfsp_error = "parent for record_init_string is not a folder."; return EINVAL; } switch(type) { case HFSP_FOLDER : entry->type = type; record_initfolder(parent->tree->vol, &entry->u.folder); break; case HFSP_FILE : entry->type = type; record_initfile(parent->tree->vol, &entry->u.file); break; // Those are unsupported use the types above instead // record_init will care about the threads case HFSP_FOLDER_THREAD : case HFSP_FILE_THREAD : default: hfsp_error = "Unsupported type for record_init_string()"; result = -1; } return result; } /* initialize a (catalog) record thread by its original record * used internally by record_insert. */ static int record_init_thread(record* r, record* template) { int result = 0; hfsp_cat_key* key = &r->key; hfsp_cat_entry* entry = &r->record; UInt16 type = template->record.type; hfsp_cat_thread* thread; r->tree = template->tree; r->node_index = 0; r->keyind = 0; key->key_length = 6; // empty name is ok for a thread key->parent_cnid= template->record.u.folder.id; thread = &entry->u.thread; switch(type) { case HFSP_FOLDER : case HFSP_FILE : entry->type = type + HFSP_THREAD_OFFSET; thread->reserved = 0; thread->parentID = template->key.parent_cnid; thread->nodeName = template->key.name; break; case HFSP_FOLDER_THREAD : case HFSP_FILE_THREAD : default: hfsp_error = "Cannot create a thread for a thread"; result = -1; } return result; } /* Compare two cat_keys ... */ int record_key_compare(void* k1, void* k2) { hfsp_cat_key* key1 = (hfsp_cat_key*) k1; hfsp_cat_key* key2 = (hfsp_cat_key*) k2; int diff = key2->parent_cnid - key1->parent_cnid; if (!diff) // same parent diff = fast_unicode_compare(&key1->name, &key2->name); return diff; } /* Compare two extent_keys ... */ int record_extent_key_compare(void* k1, void* k2) { hfsp_extent_key* key1 = (hfsp_extent_key*) k1; hfsp_extent_key* key2 = (hfsp_extent_key*) k2; int diff = key2->fork_type - key1->fork_type; if (!diff) // same type { diff = key2->file_id - key1->file_id; if (!diff) // same file diff = key2->start_block - key1->start_block; } return diff; } /* Position node in btree so that key might be inside */ static node_buf* record_find_node(btree* tree, void *key) { int start, end, mid, comp; // components of a binary search void *p = NULL; char curr_key[tree->head.max_key_len]; // The current key under examination hfsp_key_read readkey = tree->kread; hfsp_key_compare key_compare = tree->kcomp; UInt32 index; node_buf* node = btree_node_by_index(tree, tree->head.root, NODE_CLEAN); HFSP_SYNC_START(HFSP_READLOCK, node); if (!node) HFSP_ERROR(-1, "record_find_node: Cant position to root node"); while (node->desc.kind == HFSP_NODE_NDX) { mid = start = 0; end = node->desc.num_rec; comp = -1; while (start < end) { mid = (start + end) >> 1; p = btree_key_by_index(tree, node, mid); if (!p) HFSP_ERROR(-1, "record_find_node: unexpected error"); p = readkey (p, curr_key); if (!p) HFSP_ERROR(-1, "record_find_node: unexpected error"); comp = key_compare(curr_key, key); if (comp > 0) start = mid + 1; else if (comp < 0) end = mid; else break; } if (!p) // Empty tree, fascinating ... HFSP_ERROR(-1, "record_find_node: unexpected empty node"); if (comp < 0) // mmh interesting key is before this key ... { if (mid == 0) return NULL; // nothing before this key .. p = btree_key_by_index(tree, node, mid-1); if (!p) HFSP_ERROR(-1, "record_find_node: unexpected error"); p = readkey (p, curr_key); if (!p) HFSP_ERROR(-1, "record_find_node: unexpected error"); } index = bswabU32_inc(p); node = btree_node_by_index(tree, index, NODE_CLEAN); } HFSP_SYNC_END(HFSP_READLOCK, node); return node; // go on and use the found node fail: HFSP_SYNC_END(HFSP_READLOCK, node); return NULL; } /* search for the given key in the btree. * * returns pointer to memory just after key or NULL. * * *keyind recives the index where the key was found * (or could be inserted.) * *node_index is the index of the node where key was found/might * be inserted before */ void* record_find_key(btree* tree, void* key, int* keyind, UInt16* node_index) { node_buf* buf = record_find_node(tree, key); if (buf) { int comp = -1; int start = 0; // components of a binary search int end = buf->desc.num_rec; int mid = -1; void *p = NULL; char curr_key[tree->head.max_key_len]; hfsp_key_read readkey = tree->kread; hfsp_key_compare key_compare = tree->kcomp; HFSP_SYNC_START(HFSP_READLOCK, node); while (start < end) { mid = (start + end) >> 1; p = btree_key_by_index(tree, buf, mid); if (!p) HFSP_ERROR(-1, "record_find_key: unexpected error"); p = readkey (p, curr_key); if (!p) goto fail; comp = key_compare(curr_key, key); if (comp > 0) start = mid + 1; else if (comp < 0) end = mid; else break; } if (!p) // Empty tree, fascinating ... HFSP_ERROR(ENOENT, "record_find_key: unexpected empty node"); *node_index = buf->index; if (!comp) // found something ... { *keyind = mid; // Thats where we found it HFSP_SYNC_END(HFSP_READLOCK, node); return p; } *keyind = end; // Here we can insert a new key } HFSP_ERROR(ENOENT, NULL); fail: HFSP_SYNC_END(HFSP_READLOCK, node); return NULL; } /* intialize the record by searching for the given key in the btree. * * r is umodified on error. */ int record_init_key(record* r, btree* tree, hfsp_cat_key* key) { int keyind; UInt16 node_index; void *p = record_find_key(tree, key, &keyind, &node_index); if (p) { r -> tree = tree; r -> node_index= node_index; r -> keyind = keyind; r -> key = *key; // Better use a record_key_copy ... p = record_readentry(p, &r->record); if (!p) HFSP_ERROR(-1, "record_init_key: unexpected error"); return 0; } fail: return -1; } /* intialize the extent_record to the extent identified by the * (first) blockindex. * * forktype: either HFSP_EXTEND_DATA or HFSP_EXTEND_RSRC */ int record_init_file(extent_record* r, btree* tree, UInt8 forktype, UInt32 fileId, UInt32 blockindex) { int keyind; UInt16 node_index; hfsp_extent_key key = { 10, forktype, 0, fileId, blockindex }; void *p = record_find_key(tree, &key, &keyind, &node_index); if (p) { r -> tree = tree; r -> node_index= node_index; r -> keyind = keyind; r -> key = key; // Better use a record_key_copy ... p = volume_readextent(p, r->extent); if (!p) HFSP_ERROR(-1, "record_init_file: unexpected error"); return 0; } fail: return -1; } /* intialize the record to the folder identified by cnid */ int record_init_cnid(record* r, btree* tree, UInt32 cnid) { hfsp_cat_key thread_key; // the thread is the first record thread_key.key_length = 6; // null name (like '.' in unix ) thread_key.parent_cnid = cnid; thread_key.name.strlen = 0; return record_init_key(r, tree, &thread_key); } /* intialize the record to the first record of the parent. */ int record_init_parent(record* r, record* parent) { if (parent->record.type == HFSP_FOLDER) return record_init_cnid(r, parent->tree, parent->record.u.folder.id); else if(parent->record.type == HFSP_FOLDER_THREAD) { if (r != parent) *r = *parent; // The folder thread is in fact the first entry, like '.' return 0; } HFSP_ERROR(EINVAL, "record_init_parent: parent is neither folder nor folder thread."); fail: return EINVAL; } /* intialize the record to the parent directory of the given record. */ int record_find_parent(record* r, record* from) { UInt16 type = from->record.type; btree* bt = from->tree; hfsp_cat_key parentKey; if (type == HFSP_FOLDER || type == HFSP_FILE) if (record_init_cnid(r, bt, from->key.parent_cnid)) goto fail; // r now is the folder thread, position to the real folder parentKey.key_length = 6 + r->record.u.thread.nodeName.strlen * 2; parentKey.parent_cnid = r->record.u.thread.parentID; parentKey.name = r->record.u.thread.nodeName; if (record_init_key(r, bt, &parentKey)) goto fail; return 0; fail: return -1; } /* find correct node record for given node and *pindex. * * index of record in this (or next) node */ static node_buf* prepare_next(btree* tree, UInt16 node_index, UInt16* pindex) { node_buf* buf = btree_node_by_index(tree, node_index, NODE_CLEAN); btree_node_desc* desc = &buf->desc; UInt32 numrec = desc->num_rec; if (*pindex >= numrec) // move on to next node { UInt16 next = desc->next; *pindex = 0; if (!next /* is there a next node ? */ || !( buf = btree_node_by_index(tree, next, NODE_CLEAN))) return NULL; } return buf; } /* move record foreward to next entry. * * In case of an error the value of *r is undefined ! */ int record_next(record* r) { btree* tree = r->tree; UInt16 index = r->keyind +1; UInt32 parent; node_buf* buf = prepare_next(tree, r->node_index, &index); if (!buf) return ENOENT; // No (more) such file or directory parent = r->key.parent_cnid; if (record_init(r, tree, buf, index)) return -1; if (r->key.parent_cnid != parent || // end of current directory index != r->keyind) // internal error ? return ENOENT; // No (more) such file or directory return 0; } /* move record foreward to next extent record. * * In case of an error the value of *r is undefined ! */ int record_next_extent(extent_record* r) { btree* tree = r->tree; UInt16 index = r->keyind +1; UInt32 file_id; UInt8 fork_type; node_buf* buf = prepare_next(tree, r->node_index, &index); if (!buf) return ENOENT; // No (more) such file or directory file_id = r->key.file_id; fork_type = r->key.fork_type; if (record_init_extent(r, tree, buf, index)) return -1; if (r->key.file_id != file_id || // end of current file r->key.fork_type != fork_type || // end of current fork index != r->keyind) // internal error ? return ENOENT; // No (more) such file or directory return 0; } /* intialize the record by searching for the given string in the given folder. * * parent and r may be the same. */ int record_init_string_parent(record* r, record* parent, char* name) { hfsp_cat_key key; if (parent->record.type == HFSP_FOLDER) key.parent_cnid = parent->record.u.folder.id; else if(parent->record.type == HFSP_FOLDER_THREAD) key.parent_cnid = parent->key.parent_cnid; else HFSP_ERROR(-1, "record_init_string_parent: parent is not a folder."); key.key_length = 6 + unicode_asc2uni(&key.name,name); // 6 for minumum size return record_init_key(r, parent->tree, &key); fail: return -1; } /* move record up in folder hierarchy (if possible) */ int record_up(record* r) { if (r->record.type == HFSP_FOLDER) { // locate folder thread if (record_init_cnid(r, r->tree, r->record.u.folder.id)) return -1; } else if(r->record.type == HFSP_FOLDER_THREAD) { // do nothing were are already where we want to be } else HFSP_ERROR(-1, "record_up: record is neither folder nor folder thread."); if(r->record.type != HFSP_FOLDER_THREAD) HFSP_ERROR(-1, "record_up: unable to locate parent"); return record_init_cnid(r, r->tree, r->record.u.thread.parentID); fail: return -1; } /* Delete the record from the tree but dont care about its type. * helper function for record_delete */ static int record_delete_direct(record *r) { btree *bt = r->tree; record parent; // Parent folder of the deleted record UInt16 type = r->record.type; hfsp_vh *volheader; HFSP_SYNC_START(HFSP_WRITELOCK, bt); // Must reload record it may bave become invalid.. if (record_init_key(r, bt, &r->key)) goto fail; btree_remove_record(bt, r->node_index, r->keyind); // Care about valence only when not using threads ... if (type <= HFSP_THREAD_OFFSET) { if (record_find_parent(&parent, r)) goto fail; if (parent.record.u.folder.valence == 0) fprintf(stderr, "Deleting item from folder with 0 items !?\n"); else { parent.record.u.folder.valence --; parent.record.u.folder.content_mod_date = HFSPTIMEDIFF + time(NULL); // write back that folder ... record_update(&parent); } } volheader = &bt->vol->vol; HFSP_SYNC_END(HFSP_WRITELOCK, bt); // Update header depending on type if (type == HFSP_FOLDER_THREAD) volheader->folder_count--; else if (type == HFSP_FILE) volheader->file_count--; return 0; fail: HFSP_SYNC_END(HFSP_WRITELOCK, bt); return -1; } /* recursivly remove contents of folder from btree * * r must be a folder thread. */ static int record_delete_recurse(record* r, int flags) { record iter = *r; // iterator for entries int result = 0; if (r->record.type != HFSP_FOLDER_THREAD) return -1; // should not happen ! while (!result && !record_next(&iter)) { if (flags & RECORD_DELETE_RECURSE) result = record_delete(&iter, flags); // Mmh, this will fail as soon as the b*tree is reorganized :( else return ENOTEMPTY; // must not delete non-empty directory iter = *r; // reset iterator } return 0; } /* remove record from btree, It does not care about any * forks associated with a file (yet) */ int record_delete(record* r, int flags) { btree *bt = r->tree; record parent; // Parent folder of the deleted record hfsp_cat_key parentKey; UInt16 type = r->record.type; int result = 0; if (type == HFSP_FOLDER && !(flags & RECORD_DELETE_DIRECT)) { record thread; // locate folder thread and delete it result = record_init_cnid(&thread, bt, r->record.u.folder.id); if (!result) result = record_delete(&thread, flags | RECORD_DELETE_DIRECT); // failing to delete the folder now will leave the // btree inconsistant, but this should not happen any more } if (type == HFSP_FOLDER_THREAD) { // will result in error in case folder is not empty result = record_delete_recurse(r, flags & ~RECORD_DELETE_DIRECT); if (!result && !(flags & RECORD_DELETE_DIRECT)) { record folder; hfsp_cat_key folderKey; // locate folder for thread folderKey.key_length = 6 + r->record.u.thread.nodeName.strlen * 2; folderKey.parent_cnid = r->record.u.thread.parentID; folderKey.name = r->record.u.thread.nodeName; result = record_init_key(&parent, bt, &parentKey); if (!result) // shortcut recursive call result = record_delete_direct(&folder); // failing to delete the folder thread now will leave the // btree inconsistant, but this should not happen any more } } if (!result) result = record_delete_direct(r); return result; } /* insert record into btree, It does not care about any * forks associated with a file (yet) * ToDo: Care about parent and header counts * */ int record_insert(record* r) { btree *bt = r->tree; record parent; // Parent folder of the new record UInt16 type = r->record.type; int result = 0; char buf[sizeof(record)]; // a bit too long, well char* p = buf; int len; // actual len of buffer used int keyind; // index where key should be inserted UInt16 nodeind; // node where record should be inserted hfsp_vh *volheader; // now insert thread for file/folder if (type == HFSP_FOLDER || type == HFSP_FILE) { record thread; // create folder thread and insert it result = record_init_thread(&thread, r); if (!result) result = record_insert(&thread); } HFSP_SYNC_START(HFSP_WRITELOCK, bt); // Find out where to insert the record if (record_find_key(bt, &r->key, &keyind, &nodeind)) HFSP_ERROR(EEXIST, hfsp_error = "File/Folder already exists"); // Create memory image p = record_writekey (p, &r->key); if (!p) return -1; // ???? p = record_writeentry(p, &r->record); if (!p) return -1; // ???? // Insert the buffer len = p - buf; if (len > bt->max_rec_size) // Emergency bail out, sorry { fprintf(stderr,"Unexpected Buffer overflow in record_insert %d > %d", len, sizeof(bt->max_rec_size)); exit(-1); } if (btree_insert_record(bt,nodeind,keyind,buf,len)) HFSP_ERROR(ENOSPC, "Unable to insert record into tree (volume full ?)"); // Ignore threads for valence and file/folder counts if (type == HFSP_FOLDER || type == HFSP_FILE) { // Update parent valence if (record_find_parent(&parent, r)) goto fail; parent.record.u.folder.valence ++; parent.record.u.folder.content_mod_date = HFSPTIMEDIFF + time(NULL); // write back that folder ... record_update(&parent); volheader = &bt->vol->vol; // Update header depending on type if (type == HFSP_FOLDER) volheader->folder_count++; else if (type == HFSP_FILE) volheader->file_count++; } HFSP_SYNC_END(HFSP_WRITELOCK, bt); return result; fail: HFSP_SYNC_END(HFSP_WRITELOCK, bt); return -1; } hfsplus-1.0.4/libhfsp/src/record.h0100644000000000000000000000777107441220605015560 0ustar rootroot/* * libhfs - library for reading and writing Macintosh HFS volumes. * * a record contains a key and a folder or file and is part * of a btree. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: record.h,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ /* Compare two cat_keys ... */ extern int record_key_compare(void* k1, void* k2); /* Compare two extent_keys ... */ extern int record_extent_key_compare(void* k1, void* k2); /* read a catalog key into a given buffer */ extern void* record_readkey(void* p, void* buf); /* read an extent key into a given buffer */ extern void* record_extent_readkey(void* p, void* buf); /* read a hfsp_cat_entry (catalog record) from memory */ extern void* record_readentry(void *p, void* entry); /* read an extent record from memory */ // For dependency reasons this actually is found in volume.c extern void* record_extent_readrecord(void *p, void* entry); /* intialize the record to the first record of the tree * which is (per design) the root node. */ extern int record_init_root(record* r, btree* tree); /* intialize the record to the folder given by cnid. */ extern int record_init_cnid(record* r, btree* tree, UInt32 cnid); /* intialize the record to the first record of the parent. */ extern int record_init_parent(record* r, record* parent); /* intialize the record to the parent directory of the given record. */ extern int record_find_parent(record* r, record* from); /* intialize the record by searching for the given string in the given folder. * * parent and r may be the same. */ extern int record_init_string_parent(record* r, record* parent, char* key); /* initialize a new (catalog) record with given type and (ascii) name. * parent must be a HFSP_FOLDER or FOLDER_THREAD * You should normally call record_insert afterwards. */ extern int record_init_string(record* r, UInt16 type, char* name, record* parent); /* move record up in folder hierarchy (if possible) */ extern int record_up(record* r); /* move record foreward to next entry. * * In case of an error the value of *r is undefined ! */ extern int record_next(record* r); /* intialize the extent_record to the extent identified by * a given file */ extern int record_init_file(extent_record* r, btree* tree, UInt8 forktype, UInt32 fileId, UInt32 blockindex); /* move foreward to next entent record. */ extern int record_next_extent(extent_record *r); /* intialize the record with the given index entry in the btree. * * needed by fscheck, do not use in normal code. */ extern int record_init(record* r, btree* bt, node_buf* buf, UInt16 index); /* remove record from btree, It does not (yet) care about any * forks associated with a file, see below for flags */ extern int record_delete(record* r, int flags); /* insert record into btree, It does not care about any * forks associated with a file (yet) */ extern int record_insert(record* r); /* Do not care about files/folders/threads, needed internally */ #define RECORD_DELETE_DIRECT 0x0001 /* Similar to the rm -f flag, may not be supported */ #define RECORD_DELETE_FORCE 0x0002 /* Descend recursivly in directories and delete them (like rm -R) * Non-empty directories can not be deleted otherwise */ #define RECORD_DELETE_RECURSE 0x0004 hfsplus-1.0.4/libhfsp/src/swab.h0100644000000000000000000000425207441220605015225 0ustar rootroot/* * libhfs - library for reading and writing Macintosh HFS volumes * * Copyright (C) 2000 Klaus Halfmann * Original work 1996-1998 Robert Leslie * * This file defines some byte swapping function. I did not find this * in any standard or linux way. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: swab.h,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ #include #include /* basic fuction: value = swab_inc(ptr); ptr is afterwards incremented by sizeof(value) */ #if BYTE_ORDER == LITTLE_ENDIAN #define bswabU16(val) bswap_16(val) #define bswabU16_inc(ptr) bswap_16(*((UInt16*) (ptr))++) #define bswabU32_inc(ptr) bswap_32(*((UInt32*) (ptr))++) #define bswabU64_inc(ptr) bswap_64(*((UInt64*) (ptr))++) #define bstoreU16_inc(ptr, val) (*((UInt16*) (ptr))++) = bswap_16(val) #define bstoreU32_inc(ptr, val) (*((UInt32*) (ptr))++) = bswap_32(val) #define bstoreU64_inc(ptr, val) (*((UInt64*) (ptr))++) = bswap_64(val) #else // BYTE_ORDER == BIG_ENDIAN #define bswabU16(val) val #define bswabU16_inc(ptr) (*((UInt16*) (ptr))++) #define bswabU32_inc(ptr) (*((UInt32*) (ptr))++) #define bswabU64_inc(ptr) (*((UInt64*) (ptr))++) #define bstoreU16_inc(ptr, val) (*((UInt16*) (ptr))++) = val #define bstoreU32_inc(ptr, val) (*((UInt32*) (ptr))++) = val #define bstoreU64_inc(ptr, val) (*((UInt64*) (ptr))++) = val #endif /* for the sake of compleetness and readability */ #define bswabU8_inc(ptr) (*((UInt8*) (ptr))++) #define bstoreU8_inc(ptr,val) (*((UInt8*) (ptr))++) = val hfsplus-1.0.4/libhfsp/src/unicode.c0100644000000000000000000007540307441220605015720 0ustar rootroot/* * linux/fs/hfsplus/unicode.c * * Copyright (C) 1999-2000 Brad Boyer (flar@pants.nu) * This file may be distributed under the terms of the GNU Public License. * * The routines found here convert hfs-unicode string into ascii Strings * and vice versa. And the correct comparison between Strings. */ # ifdef HAVE_CONFIG_H # include "config.h" # endif #include #include #include #include #define __USE_GNU /* need wcsrtomb */ #include #include "libhfsp.h" #include "unicode.h" /* convert the asci string astr into a unicode string given by ustr. * * ToDo: Think about better error handling ? */ int unicode_asc2uni(hfsp_unistr255 *ustr, const char* astr) { mbstate_t mbstate = { 0 }; /* Multibyte state */ UInt16* name = ustr->name; int total = 0; wchar_t wc; int len; while (*astr && total < 255) { len = mbrtowc(&wc, astr, MB_CUR_MAX, &mbstate); if (!len) // eof break; if (len < 0) // error continue; astr ++; total += len; *name ++= wc; } return ustr->strlen = total; } /* Convert an unicode string ustr to a ascii string astr of given maximum len. * * returns actual length of convertet string. * Eventual conversion errors are ignored. */ int unicode_uni2asc(char *astr, const hfsp_unistr255 *ustr, int maxlen) { mbstate_t mbstate = { 0 }; /* Multibyte state */ int strlen = ustr->strlen; const UInt16* name = ustr->name; int len; int total; maxlen -= (MB_CUR_MAX + 1); // leave space for a '\0' and overflow total = 0; while ((strlen > 0) && (maxlen > 0)) { wchar_t wc = *name++; len = wcrtomb(astr, wc, &mbstate); strlen--; if (len < 0) // ignore error ... continue; maxlen -= len; astr += len; total += len; } wcrtomb(astr, 0, &mbstate); // care about rest of state *astr ='\0'; return total; } /* The following code is almost as published by Apple, only small modifications where made to match some linux styles ... fastUnicodeCompare - Compare two Unicode strings; produce a relative ordering */ static UInt16 gLowerCaseTable[]; SInt32 fast_unicode_compare ( const hfsp_unistr255 *ustr1, const hfsp_unistr255 *ustr2) { register UInt16 c1,c2; register SInt32 diff; register UInt16 temp; register UInt16 length1 = ustr1->strlen; register UInt16 length2 = ustr2->strlen; register UInt16* lowerCaseTable = gLowerCaseTable; register UInt16* str1 = ustr1->name; register UInt16* str2 = ustr2->name; while (1) { // Set default values for c1, c2 in case there are no more valid chars c1 = c2 = 0; // Find next non-ignorable char from str1, or zero if no more while (length1 && c1 == 0) { c1 = *(str1++); --length1; if ((temp = lowerCaseTable[c1>>8]) != 0) // is there a subtable // for this upper byte? c1 = lowerCaseTable[temp + (c1 & 0x00FF)]; // yes, so fold the char } // Find next non-ignorable char from str2, or zero if no more while (length2 && c2 == 0) { c2 = *(str2++); --length2; if ((temp = lowerCaseTable[c2>>8]) != 0) // is there a subtable // for this upper byte? c2 = lowerCaseTable[temp + (c2 & 0x00FF)]; // yes, so fold the char } diff = c2-c1; if (diff) // found a difference, so stop looping break; if (c1 == 0) // did we reach the end of both strings at the same time? return 0; // yes, so strings are equal } return diff; } /* The lower case table consists of a 256-entry high-byte table followed by some number of 256-entry subtables. The high-byte table contains either an offset to the subtable for characters with that high byte or zero, which means that there are no case mappings or ignored characters in that block. Ignored characters are mapped to zero. */ static UInt16 gLowerCaseTable[] = { // High-byte indices ( == 0 iff no case mapping and no ignorables ) /* 0 */ 0x0100, 0x0200, 0x0000, 0x0300, 0x0400, 0x0500, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 1 */ 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 2 */ 0x0700, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 4 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 5 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 6 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 9 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* A */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* B */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* C */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* D */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* E */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* F */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0900, 0x0A00, // Table 1 (for high byte 0x00) /* 0 */ 0xFFFF, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, /* 1 */ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, /* 2 */ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, /* 3 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, /* 4 */ 0x0040, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, /* 5 */ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, /* 6 */ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, /* 7 */ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, /* 8 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, /* 9 */ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, /* A */ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, /* B */ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, /* C */ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00E6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, /* D */ 0x00F0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00F8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00FE, 0x00DF, /* E */ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, /* F */ 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, // Table 2 (for high byte 0x01) /* 0 */ 0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0109, 0x010A, 0x010B, 0x010C, 0x010D, 0x010E, 0x010F, /* 1 */ 0x0111, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117, 0x0118, 0x0119, 0x011A, 0x011B, 0x011C, 0x011D, 0x011E, 0x011F, /* 2 */ 0x0120, 0x0121, 0x0122, 0x0123, 0x0124, 0x0125, 0x0127, 0x0127, 0x0128, 0x0129, 0x012A, 0x012B, 0x012C, 0x012D, 0x012E, 0x012F, /* 3 */ 0x0130, 0x0131, 0x0133, 0x0133, 0x0134, 0x0135, 0x0136, 0x0137, 0x0138, 0x0139, 0x013A, 0x013B, 0x013C, 0x013D, 0x013E, 0x0140, /* 4 */ 0x0140, 0x0142, 0x0142, 0x0143, 0x0144, 0x0145, 0x0146, 0x0147, 0x0148, 0x0149, 0x014B, 0x014B, 0x014C, 0x014D, 0x014E, 0x014F, /* 5 */ 0x0150, 0x0151, 0x0153, 0x0153, 0x0154, 0x0155, 0x0156, 0x0157, 0x0158, 0x0159, 0x015A, 0x015B, 0x015C, 0x015D, 0x015E, 0x015F, /* 6 */ 0x0160, 0x0161, 0x0162, 0x0163, 0x0164, 0x0165, 0x0167, 0x0167, 0x0168, 0x0169, 0x016A, 0x016B, 0x016C, 0x016D, 0x016E, 0x016F, /* 7 */ 0x0170, 0x0171, 0x0172, 0x0173, 0x0174, 0x0175, 0x0176, 0x0177, 0x0178, 0x0179, 0x017A, 0x017B, 0x017C, 0x017D, 0x017E, 0x017F, /* 8 */ 0x0180, 0x0253, 0x0183, 0x0183, 0x0185, 0x0185, 0x0254, 0x0188, 0x0188, 0x0256, 0x0257, 0x018C, 0x018C, 0x018D, 0x01DD, 0x0259, /* 9 */ 0x025B, 0x0192, 0x0192, 0x0260, 0x0263, 0x0195, 0x0269, 0x0268, 0x0199, 0x0199, 0x019A, 0x019B, 0x026F, 0x0272, 0x019E, 0x0275, /* A */ 0x01A0, 0x01A1, 0x01A3, 0x01A3, 0x01A5, 0x01A5, 0x01A6, 0x01A8, 0x01A8, 0x0283, 0x01AA, 0x01AB, 0x01AD, 0x01AD, 0x0288, 0x01AF, /* B */ 0x01B0, 0x028A, 0x028B, 0x01B4, 0x01B4, 0x01B6, 0x01B6, 0x0292, 0x01B9, 0x01B9, 0x01BA, 0x01BB, 0x01BD, 0x01BD, 0x01BE, 0x01BF, /* C */ 0x01C0, 0x01C1, 0x01C2, 0x01C3, 0x01C6, 0x01C6, 0x01C6, 0x01C9, 0x01C9, 0x01C9, 0x01CC, 0x01CC, 0x01CC, 0x01CD, 0x01CE, 0x01CF, /* D */ 0x01D0, 0x01D1, 0x01D2, 0x01D3, 0x01D4, 0x01D5, 0x01D6, 0x01D7, 0x01D8, 0x01D9, 0x01DA, 0x01DB, 0x01DC, 0x01DD, 0x01DE, 0x01DF, /* E */ 0x01E0, 0x01E1, 0x01E2, 0x01E3, 0x01E5, 0x01E5, 0x01E6, 0x01E7, 0x01E8, 0x01E9, 0x01EA, 0x01EB, 0x01EC, 0x01ED, 0x01EE, 0x01EF, /* F */ 0x01F0, 0x01F3, 0x01F3, 0x01F3, 0x01F4, 0x01F5, 0x01F6, 0x01F7, 0x01F8, 0x01F9, 0x01FA, 0x01FB, 0x01FC, 0x01FD, 0x01FE, 0x01FF, // Table 3 (for high byte 0x03) /* 0 */ 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, 0x0308, 0x0309, 0x030A, 0x030B, 0x030C, 0x030D, 0x030E, 0x030F, /* 1 */ 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, 0x0318, 0x0319, 0x031A, 0x031B, 0x031C, 0x031D, 0x031E, 0x031F, /* 2 */ 0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 0x0327, 0x0328, 0x0329, 0x032A, 0x032B, 0x032C, 0x032D, 0x032E, 0x032F, /* 3 */ 0x0330, 0x0331, 0x0332, 0x0333, 0x0334, 0x0335, 0x0336, 0x0337, 0x0338, 0x0339, 0x033A, 0x033B, 0x033C, 0x033D, 0x033E, 0x033F, /* 4 */ 0x0340, 0x0341, 0x0342, 0x0343, 0x0344, 0x0345, 0x0346, 0x0347, 0x0348, 0x0349, 0x034A, 0x034B, 0x034C, 0x034D, 0x034E, 0x034F, /* 5 */ 0x0350, 0x0351, 0x0352, 0x0353, 0x0354, 0x0355, 0x0356, 0x0357, 0x0358, 0x0359, 0x035A, 0x035B, 0x035C, 0x035D, 0x035E, 0x035F, /* 6 */ 0x0360, 0x0361, 0x0362, 0x0363, 0x0364, 0x0365, 0x0366, 0x0367, 0x0368, 0x0369, 0x036A, 0x036B, 0x036C, 0x036D, 0x036E, 0x036F, /* 7 */ 0x0370, 0x0371, 0x0372, 0x0373, 0x0374, 0x0375, 0x0376, 0x0377, 0x0378, 0x0379, 0x037A, 0x037B, 0x037C, 0x037D, 0x037E, 0x037F, /* 8 */ 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0386, 0x0387, 0x0388, 0x0389, 0x038A, 0x038B, 0x038C, 0x038D, 0x038E, 0x038F, /* 9 */ 0x0390, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, /* A */ 0x03C0, 0x03C1, 0x03A2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, /* B */ 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, /* C */ 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x03CF, /* D */ 0x03D0, 0x03D1, 0x03D2, 0x03D3, 0x03D4, 0x03D5, 0x03D6, 0x03D7, 0x03D8, 0x03D9, 0x03DA, 0x03DB, 0x03DC, 0x03DD, 0x03DE, 0x03DF, /* E */ 0x03E0, 0x03E1, 0x03E3, 0x03E3, 0x03E5, 0x03E5, 0x03E7, 0x03E7, 0x03E9, 0x03E9, 0x03EB, 0x03EB, 0x03ED, 0x03ED, 0x03EF, 0x03EF, /* F */ 0x03F0, 0x03F1, 0x03F2, 0x03F3, 0x03F4, 0x03F5, 0x03F6, 0x03F7, 0x03F8, 0x03F9, 0x03FA, 0x03FB, 0x03FC, 0x03FD, 0x03FE, 0x03FF, // Table 4 (for high byte 0x04) /* 0 */ 0x0400, 0x0401, 0x0452, 0x0403, 0x0454, 0x0455, 0x0456, 0x0407, 0x0458, 0x0459, 0x045A, 0x045B, 0x040C, 0x040D, 0x040E, 0x045F, /* 1 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0419, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, /* 2 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, /* 3 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, /* 4 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, /* 5 */ 0x0450, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x045D, 0x045E, 0x045F, /* 6 */ 0x0461, 0x0461, 0x0463, 0x0463, 0x0465, 0x0465, 0x0467, 0x0467, 0x0469, 0x0469, 0x046B, 0x046B, 0x046D, 0x046D, 0x046F, 0x046F, /* 7 */ 0x0471, 0x0471, 0x0473, 0x0473, 0x0475, 0x0475, 0x0476, 0x0477, 0x0479, 0x0479, 0x047B, 0x047B, 0x047D, 0x047D, 0x047F, 0x047F, /* 8 */ 0x0481, 0x0481, 0x0482, 0x0483, 0x0484, 0x0485, 0x0486, 0x0487, 0x0488, 0x0489, 0x048A, 0x048B, 0x048C, 0x048D, 0x048E, 0x048F, /* 9 */ 0x0491, 0x0491, 0x0493, 0x0493, 0x0495, 0x0495, 0x0497, 0x0497, 0x0499, 0x0499, 0x049B, 0x049B, 0x049D, 0x049D, 0x049F, 0x049F, /* A */ 0x04A1, 0x04A1, 0x04A3, 0x04A3, 0x04A5, 0x04A5, 0x04A7, 0x04A7, 0x04A9, 0x04A9, 0x04AB, 0x04AB, 0x04AD, 0x04AD, 0x04AF, 0x04AF, /* B */ 0x04B1, 0x04B1, 0x04B3, 0x04B3, 0x04B5, 0x04B5, 0x04B7, 0x04B7, 0x04B9, 0x04B9, 0x04BB, 0x04BB, 0x04BD, 0x04BD, 0x04BF, 0x04BF, /* C */ 0x04C0, 0x04C1, 0x04C2, 0x04C4, 0x04C4, 0x04C5, 0x04C6, 0x04C8, 0x04C8, 0x04C9, 0x04CA, 0x04CC, 0x04CC, 0x04CD, 0x04CE, 0x04CF, /* D */ 0x04D0, 0x04D1, 0x04D2, 0x04D3, 0x04D4, 0x04D5, 0x04D6, 0x04D7, 0x04D8, 0x04D9, 0x04DA, 0x04DB, 0x04DC, 0x04DD, 0x04DE, 0x04DF, /* E */ 0x04E0, 0x04E1, 0x04E2, 0x04E3, 0x04E4, 0x04E5, 0x04E6, 0x04E7, 0x04E8, 0x04E9, 0x04EA, 0x04EB, 0x04EC, 0x04ED, 0x04EE, 0x04EF, /* F */ 0x04F0, 0x04F1, 0x04F2, 0x04F3, 0x04F4, 0x04F5, 0x04F6, 0x04F7, 0x04F8, 0x04F9, 0x04FA, 0x04FB, 0x04FC, 0x04FD, 0x04FE, 0x04FF, // Table 5 (for high byte 0x05) /* 0 */ 0x0500, 0x0501, 0x0502, 0x0503, 0x0504, 0x0505, 0x0506, 0x0507, 0x0508, 0x0509, 0x050A, 0x050B, 0x050C, 0x050D, 0x050E, 0x050F, /* 1 */ 0x0510, 0x0511, 0x0512, 0x0513, 0x0514, 0x0515, 0x0516, 0x0517, 0x0518, 0x0519, 0x051A, 0x051B, 0x051C, 0x051D, 0x051E, 0x051F, /* 2 */ 0x0520, 0x0521, 0x0522, 0x0523, 0x0524, 0x0525, 0x0526, 0x0527, 0x0528, 0x0529, 0x052A, 0x052B, 0x052C, 0x052D, 0x052E, 0x052F, /* 3 */ 0x0530, 0x0561, 0x0562, 0x0563, 0x0564, 0x0565, 0x0566, 0x0567, 0x0568, 0x0569, 0x056A, 0x056B, 0x056C, 0x056D, 0x056E, 0x056F, /* 4 */ 0x0570, 0x0571, 0x0572, 0x0573, 0x0574, 0x0575, 0x0576, 0x0577, 0x0578, 0x0579, 0x057A, 0x057B, 0x057C, 0x057D, 0x057E, 0x057F, /* 5 */ 0x0580, 0x0581, 0x0582, 0x0583, 0x0584, 0x0585, 0x0586, 0x0557, 0x0558, 0x0559, 0x055A, 0x055B, 0x055C, 0x055D, 0x055E, 0x055F, /* 6 */ 0x0560, 0x0561, 0x0562, 0x0563, 0x0564, 0x0565, 0x0566, 0x0567, 0x0568, 0x0569, 0x056A, 0x056B, 0x056C, 0x056D, 0x056E, 0x056F, /* 7 */ 0x0570, 0x0571, 0x0572, 0x0573, 0x0574, 0x0575, 0x0576, 0x0577, 0x0578, 0x0579, 0x057A, 0x057B, 0x057C, 0x057D, 0x057E, 0x057F, /* 8 */ 0x0580, 0x0581, 0x0582, 0x0583, 0x0584, 0x0585, 0x0586, 0x0587, 0x0588, 0x0589, 0x058A, 0x058B, 0x058C, 0x058D, 0x058E, 0x058F, /* 9 */ 0x0590, 0x0591, 0x0592, 0x0593, 0x0594, 0x0595, 0x0596, 0x0597, 0x0598, 0x0599, 0x059A, 0x059B, 0x059C, 0x059D, 0x059E, 0x059F, /* A */ 0x05A0, 0x05A1, 0x05A2, 0x05A3, 0x05A4, 0x05A5, 0x05A6, 0x05A7, 0x05A8, 0x05A9, 0x05AA, 0x05AB, 0x05AC, 0x05AD, 0x05AE, 0x05AF, /* B */ 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, 0x05B8, 0x05B9, 0x05BA, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF, /* C */ 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05C4, 0x05C5, 0x05C6, 0x05C7, 0x05C8, 0x05C9, 0x05CA, 0x05CB, 0x05CC, 0x05CD, 0x05CE, 0x05CF, /* D */ 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, /* E */ 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x05EB, 0x05EC, 0x05ED, 0x05EE, 0x05EF, /* F */ 0x05F0, 0x05F1, 0x05F2, 0x05F3, 0x05F4, 0x05F5, 0x05F6, 0x05F7, 0x05F8, 0x05F9, 0x05FA, 0x05FB, 0x05FC, 0x05FD, 0x05FE, 0x05FF, // Table 6 (for high byte 0x10) /* 0 */ 0x1000, 0x1001, 0x1002, 0x1003, 0x1004, 0x1005, 0x1006, 0x1007, 0x1008, 0x1009, 0x100A, 0x100B, 0x100C, 0x100D, 0x100E, 0x100F, /* 1 */ 0x1010, 0x1011, 0x1012, 0x1013, 0x1014, 0x1015, 0x1016, 0x1017, 0x1018, 0x1019, 0x101A, 0x101B, 0x101C, 0x101D, 0x101E, 0x101F, /* 2 */ 0x1020, 0x1021, 0x1022, 0x1023, 0x1024, 0x1025, 0x1026, 0x1027, 0x1028, 0x1029, 0x102A, 0x102B, 0x102C, 0x102D, 0x102E, 0x102F, /* 3 */ 0x1030, 0x1031, 0x1032, 0x1033, 0x1034, 0x1035, 0x1036, 0x1037, 0x1038, 0x1039, 0x103A, 0x103B, 0x103C, 0x103D, 0x103E, 0x103F, /* 4 */ 0x1040, 0x1041, 0x1042, 0x1043, 0x1044, 0x1045, 0x1046, 0x1047, 0x1048, 0x1049, 0x104A, 0x104B, 0x104C, 0x104D, 0x104E, 0x104F, /* 5 */ 0x1050, 0x1051, 0x1052, 0x1053, 0x1054, 0x1055, 0x1056, 0x1057, 0x1058, 0x1059, 0x105A, 0x105B, 0x105C, 0x105D, 0x105E, 0x105F, /* 6 */ 0x1060, 0x1061, 0x1062, 0x1063, 0x1064, 0x1065, 0x1066, 0x1067, 0x1068, 0x1069, 0x106A, 0x106B, 0x106C, 0x106D, 0x106E, 0x106F, /* 7 */ 0x1070, 0x1071, 0x1072, 0x1073, 0x1074, 0x1075, 0x1076, 0x1077, 0x1078, 0x1079, 0x107A, 0x107B, 0x107C, 0x107D, 0x107E, 0x107F, /* 8 */ 0x1080, 0x1081, 0x1082, 0x1083, 0x1084, 0x1085, 0x1086, 0x1087, 0x1088, 0x1089, 0x108A, 0x108B, 0x108C, 0x108D, 0x108E, 0x108F, /* 9 */ 0x1090, 0x1091, 0x1092, 0x1093, 0x1094, 0x1095, 0x1096, 0x1097, 0x1098, 0x1099, 0x109A, 0x109B, 0x109C, 0x109D, 0x109E, 0x109F, /* A */ 0x10D0, 0x10D1, 0x10D2, 0x10D3, 0x10D4, 0x10D5, 0x10D6, 0x10D7, 0x10D8, 0x10D9, 0x10DA, 0x10DB, 0x10DC, 0x10DD, 0x10DE, 0x10DF, /* B */ 0x10E0, 0x10E1, 0x10E2, 0x10E3, 0x10E4, 0x10E5, 0x10E6, 0x10E7, 0x10E8, 0x10E9, 0x10EA, 0x10EB, 0x10EC, 0x10ED, 0x10EE, 0x10EF, /* C */ 0x10F0, 0x10F1, 0x10F2, 0x10F3, 0x10F4, 0x10F5, 0x10C6, 0x10C7, 0x10C8, 0x10C9, 0x10CA, 0x10CB, 0x10CC, 0x10CD, 0x10CE, 0x10CF, /* D */ 0x10D0, 0x10D1, 0x10D2, 0x10D3, 0x10D4, 0x10D5, 0x10D6, 0x10D7, 0x10D8, 0x10D9, 0x10DA, 0x10DB, 0x10DC, 0x10DD, 0x10DE, 0x10DF, /* E */ 0x10E0, 0x10E1, 0x10E2, 0x10E3, 0x10E4, 0x10E5, 0x10E6, 0x10E7, 0x10E8, 0x10E9, 0x10EA, 0x10EB, 0x10EC, 0x10ED, 0x10EE, 0x10EF, /* F */ 0x10F0, 0x10F1, 0x10F2, 0x10F3, 0x10F4, 0x10F5, 0x10F6, 0x10F7, 0x10F8, 0x10F9, 0x10FA, 0x10FB, 0x10FC, 0x10FD, 0x10FE, 0x10FF, // Table 7 (for high byte 0x20) /* 0 */ 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x200B, 0x0000, 0x0000, 0x0000, 0x0000, /* 1 */ 0x2010, 0x2011, 0x2012, 0x2013, 0x2014, 0x2015, 0x2016, 0x2017, 0x2018, 0x2019, 0x201A, 0x201B, 0x201C, 0x201D, 0x201E, 0x201F, /* 2 */ 0x2020, 0x2021, 0x2022, 0x2023, 0x2024, 0x2025, 0x2026, 0x2027, 0x2028, 0x2029, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x202F, /* 3 */ 0x2030, 0x2031, 0x2032, 0x2033, 0x2034, 0x2035, 0x2036, 0x2037, 0x2038, 0x2039, 0x203A, 0x203B, 0x203C, 0x203D, 0x203E, 0x203F, /* 4 */ 0x2040, 0x2041, 0x2042, 0x2043, 0x2044, 0x2045, 0x2046, 0x2047, 0x2048, 0x2049, 0x204A, 0x204B, 0x204C, 0x204D, 0x204E, 0x204F, /* 5 */ 0x2050, 0x2051, 0x2052, 0x2053, 0x2054, 0x2055, 0x2056, 0x2057, 0x2058, 0x2059, 0x205A, 0x205B, 0x205C, 0x205D, 0x205E, 0x205F, /* 6 */ 0x2060, 0x2061, 0x2062, 0x2063, 0x2064, 0x2065, 0x2066, 0x2067, 0x2068, 0x2069, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7 */ 0x2070, 0x2071, 0x2072, 0x2073, 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079, 0x207A, 0x207B, 0x207C, 0x207D, 0x207E, 0x207F, /* 8 */ 0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087, 0x2088, 0x2089, 0x208A, 0x208B, 0x208C, 0x208D, 0x208E, 0x208F, /* 9 */ 0x2090, 0x2091, 0x2092, 0x2093, 0x2094, 0x2095, 0x2096, 0x2097, 0x2098, 0x2099, 0x209A, 0x209B, 0x209C, 0x209D, 0x209E, 0x209F, /* A */ 0x20A0, 0x20A1, 0x20A2, 0x20A3, 0x20A4, 0x20A5, 0x20A6, 0x20A7, 0x20A8, 0x20A9, 0x20AA, 0x20AB, 0x20AC, 0x20AD, 0x20AE, 0x20AF, /* B */ 0x20B0, 0x20B1, 0x20B2, 0x20B3, 0x20B4, 0x20B5, 0x20B6, 0x20B7, 0x20B8, 0x20B9, 0x20BA, 0x20BB, 0x20BC, 0x20BD, 0x20BE, 0x20BF, /* C */ 0x20C0, 0x20C1, 0x20C2, 0x20C3, 0x20C4, 0x20C5, 0x20C6, 0x20C7, 0x20C8, 0x20C9, 0x20CA, 0x20CB, 0x20CC, 0x20CD, 0x20CE, 0x20CF, /* D */ 0x20D0, 0x20D1, 0x20D2, 0x20D3, 0x20D4, 0x20D5, 0x20D6, 0x20D7, 0x20D8, 0x20D9, 0x20DA, 0x20DB, 0x20DC, 0x20DD, 0x20DE, 0x20DF, /* E */ 0x20E0, 0x20E1, 0x20E2, 0x20E3, 0x20E4, 0x20E5, 0x20E6, 0x20E7, 0x20E8, 0x20E9, 0x20EA, 0x20EB, 0x20EC, 0x20ED, 0x20EE, 0x20EF, /* F */ 0x20F0, 0x20F1, 0x20F2, 0x20F3, 0x20F4, 0x20F5, 0x20F6, 0x20F7, 0x20F8, 0x20F9, 0x20FA, 0x20FB, 0x20FC, 0x20FD, 0x20FE, 0x20FF, // Table 8 (for high byte 0x21) /* 0 */ 0x2100, 0x2101, 0x2102, 0x2103, 0x2104, 0x2105, 0x2106, 0x2107, 0x2108, 0x2109, 0x210A, 0x210B, 0x210C, 0x210D, 0x210E, 0x210F, /* 1 */ 0x2110, 0x2111, 0x2112, 0x2113, 0x2114, 0x2115, 0x2116, 0x2117, 0x2118, 0x2119, 0x211A, 0x211B, 0x211C, 0x211D, 0x211E, 0x211F, /* 2 */ 0x2120, 0x2121, 0x2122, 0x2123, 0x2124, 0x2125, 0x2126, 0x2127, 0x2128, 0x2129, 0x212A, 0x212B, 0x212C, 0x212D, 0x212E, 0x212F, /* 3 */ 0x2130, 0x2131, 0x2132, 0x2133, 0x2134, 0x2135, 0x2136, 0x2137, 0x2138, 0x2139, 0x213A, 0x213B, 0x213C, 0x213D, 0x213E, 0x213F, /* 4 */ 0x2140, 0x2141, 0x2142, 0x2143, 0x2144, 0x2145, 0x2146, 0x2147, 0x2148, 0x2149, 0x214A, 0x214B, 0x214C, 0x214D, 0x214E, 0x214F, /* 5 */ 0x2150, 0x2151, 0x2152, 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215A, 0x215B, 0x215C, 0x215D, 0x215E, 0x215F, /* 6 */ 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, /* 7 */ 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, /* 8 */ 0x2180, 0x2181, 0x2182, 0x2183, 0x2184, 0x2185, 0x2186, 0x2187, 0x2188, 0x2189, 0x218A, 0x218B, 0x218C, 0x218D, 0x218E, 0x218F, /* 9 */ 0x2190, 0x2191, 0x2192, 0x2193, 0x2194, 0x2195, 0x2196, 0x2197, 0x2198, 0x2199, 0x219A, 0x219B, 0x219C, 0x219D, 0x219E, 0x219F, /* A */ 0x21A0, 0x21A1, 0x21A2, 0x21A3, 0x21A4, 0x21A5, 0x21A6, 0x21A7, 0x21A8, 0x21A9, 0x21AA, 0x21AB, 0x21AC, 0x21AD, 0x21AE, 0x21AF, /* B */ 0x21B0, 0x21B1, 0x21B2, 0x21B3, 0x21B4, 0x21B5, 0x21B6, 0x21B7, 0x21B8, 0x21B9, 0x21BA, 0x21BB, 0x21BC, 0x21BD, 0x21BE, 0x21BF, /* C */ 0x21C0, 0x21C1, 0x21C2, 0x21C3, 0x21C4, 0x21C5, 0x21C6, 0x21C7, 0x21C8, 0x21C9, 0x21CA, 0x21CB, 0x21CC, 0x21CD, 0x21CE, 0x21CF, /* D */ 0x21D0, 0x21D1, 0x21D2, 0x21D3, 0x21D4, 0x21D5, 0x21D6, 0x21D7, 0x21D8, 0x21D9, 0x21DA, 0x21DB, 0x21DC, 0x21DD, 0x21DE, 0x21DF, /* E */ 0x21E0, 0x21E1, 0x21E2, 0x21E3, 0x21E4, 0x21E5, 0x21E6, 0x21E7, 0x21E8, 0x21E9, 0x21EA, 0x21EB, 0x21EC, 0x21ED, 0x21EE, 0x21EF, /* F */ 0x21F0, 0x21F1, 0x21F2, 0x21F3, 0x21F4, 0x21F5, 0x21F6, 0x21F7, 0x21F8, 0x21F9, 0x21FA, 0x21FB, 0x21FC, 0x21FD, 0x21FE, 0x21FF, // Table 9 (for high byte 0xFE) /* 0 */ 0xFE00, 0xFE01, 0xFE02, 0xFE03, 0xFE04, 0xFE05, 0xFE06, 0xFE07, 0xFE08, 0xFE09, 0xFE0A, 0xFE0B, 0xFE0C, 0xFE0D, 0xFE0E, 0xFE0F, /* 1 */ 0xFE10, 0xFE11, 0xFE12, 0xFE13, 0xFE14, 0xFE15, 0xFE16, 0xFE17, 0xFE18, 0xFE19, 0xFE1A, 0xFE1B, 0xFE1C, 0xFE1D, 0xFE1E, 0xFE1F, /* 2 */ 0xFE20, 0xFE21, 0xFE22, 0xFE23, 0xFE24, 0xFE25, 0xFE26, 0xFE27, 0xFE28, 0xFE29, 0xFE2A, 0xFE2B, 0xFE2C, 0xFE2D, 0xFE2E, 0xFE2F, /* 3 */ 0xFE30, 0xFE31, 0xFE32, 0xFE33, 0xFE34, 0xFE35, 0xFE36, 0xFE37, 0xFE38, 0xFE39, 0xFE3A, 0xFE3B, 0xFE3C, 0xFE3D, 0xFE3E, 0xFE3F, /* 4 */ 0xFE40, 0xFE41, 0xFE42, 0xFE43, 0xFE44, 0xFE45, 0xFE46, 0xFE47, 0xFE48, 0xFE49, 0xFE4A, 0xFE4B, 0xFE4C, 0xFE4D, 0xFE4E, 0xFE4F, /* 5 */ 0xFE50, 0xFE51, 0xFE52, 0xFE53, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFE58, 0xFE59, 0xFE5A, 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0xFE5F, /* 6 */ 0xFE60, 0xFE61, 0xFE62, 0xFE63, 0xFE64, 0xFE65, 0xFE66, 0xFE67, 0xFE68, 0xFE69, 0xFE6A, 0xFE6B, 0xFE6C, 0xFE6D, 0xFE6E, 0xFE6F, /* 7 */ 0xFE70, 0xFE71, 0xFE72, 0xFE73, 0xFE74, 0xFE75, 0xFE76, 0xFE77, 0xFE78, 0xFE79, 0xFE7A, 0xFE7B, 0xFE7C, 0xFE7D, 0xFE7E, 0xFE7F, /* 8 */ 0xFE80, 0xFE81, 0xFE82, 0xFE83, 0xFE84, 0xFE85, 0xFE86, 0xFE87, 0xFE88, 0xFE89, 0xFE8A, 0xFE8B, 0xFE8C, 0xFE8D, 0xFE8E, 0xFE8F, /* 9 */ 0xFE90, 0xFE91, 0xFE92, 0xFE93, 0xFE94, 0xFE95, 0xFE96, 0xFE97, 0xFE98, 0xFE99, 0xFE9A, 0xFE9B, 0xFE9C, 0xFE9D, 0xFE9E, 0xFE9F, /* A */ 0xFEA0, 0xFEA1, 0xFEA2, 0xFEA3, 0xFEA4, 0xFEA5, 0xFEA6, 0xFEA7, 0xFEA8, 0xFEA9, 0xFEAA, 0xFEAB, 0xFEAC, 0xFEAD, 0xFEAE, 0xFEAF, /* B */ 0xFEB0, 0xFEB1, 0xFEB2, 0xFEB3, 0xFEB4, 0xFEB5, 0xFEB6, 0xFEB7, 0xFEB8, 0xFEB9, 0xFEBA, 0xFEBB, 0xFEBC, 0xFEBD, 0xFEBE, 0xFEBF, /* C */ 0xFEC0, 0xFEC1, 0xFEC2, 0xFEC3, 0xFEC4, 0xFEC5, 0xFEC6, 0xFEC7, 0xFEC8, 0xFEC9, 0xFECA, 0xFECB, 0xFECC, 0xFECD, 0xFECE, 0xFECF, /* D */ 0xFED0, 0xFED1, 0xFED2, 0xFED3, 0xFED4, 0xFED5, 0xFED6, 0xFED7, 0xFED8, 0xFED9, 0xFEDA, 0xFEDB, 0xFEDC, 0xFEDD, 0xFEDE, 0xFEDF, /* E */ 0xFEE0, 0xFEE1, 0xFEE2, 0xFEE3, 0xFEE4, 0xFEE5, 0xFEE6, 0xFEE7, 0xFEE8, 0xFEE9, 0xFEEA, 0xFEEB, 0xFEEC, 0xFEED, 0xFEEE, 0xFEEF, /* F */ 0xFEF0, 0xFEF1, 0xFEF2, 0xFEF3, 0xFEF4, 0xFEF5, 0xFEF6, 0xFEF7, 0xFEF8, 0xFEF9, 0xFEFA, 0xFEFB, 0xFEFC, 0xFEFD, 0xFEFE, 0x0000, // Table 10 (for high byte 0xFF) /* 0 */ 0xFF00, 0xFF01, 0xFF02, 0xFF03, 0xFF04, 0xFF05, 0xFF06, 0xFF07, 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, /* 1 */ 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, /* 2 */ 0xFF20, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, /* 3 */ 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0xFF3B, 0xFF3C, 0xFF3D, 0xFF3E, 0xFF3F, /* 4 */ 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, /* 5 */ 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFF5E, 0xFF5F, /* 6 */ 0xFF60, 0xFF61, 0xFF62, 0xFF63, 0xFF64, 0xFF65, 0xFF66, 0xFF67, 0xFF68, 0xFF69, 0xFF6A, 0xFF6B, 0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F, /* 7 */ 0xFF70, 0xFF71, 0xFF72, 0xFF73, 0xFF74, 0xFF75, 0xFF76, 0xFF77, 0xFF78, 0xFF79, 0xFF7A, 0xFF7B, 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, /* 8 */ 0xFF80, 0xFF81, 0xFF82, 0xFF83, 0xFF84, 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0xFF89, 0xFF8A, 0xFF8B, 0xFF8C, 0xFF8D, 0xFF8E, 0xFF8F, /* 9 */ 0xFF90, 0xFF91, 0xFF92, 0xFF93, 0xFF94, 0xFF95, 0xFF96, 0xFF97, 0xFF98, 0xFF99, 0xFF9A, 0xFF9B, 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F, /* A */ 0xFFA0, 0xFFA1, 0xFFA2, 0xFFA3, 0xFFA4, 0xFFA5, 0xFFA6, 0xFFA7, 0xFFA8, 0xFFA9, 0xFFAA, 0xFFAB, 0xFFAC, 0xFFAD, 0xFFAE, 0xFFAF, /* B */ 0xFFB0, 0xFFB1, 0xFFB2, 0xFFB3, 0xFFB4, 0xFFB5, 0xFFB6, 0xFFB7, 0xFFB8, 0xFFB9, 0xFFBA, 0xFFBB, 0xFFBC, 0xFFBD, 0xFFBE, 0xFFBF, /* C */ 0xFFC0, 0xFFC1, 0xFFC2, 0xFFC3, 0xFFC4, 0xFFC5, 0xFFC6, 0xFFC7, 0xFFC8, 0xFFC9, 0xFFCA, 0xFFCB, 0xFFCC, 0xFFCD, 0xFFCE, 0xFFCF, /* D */ 0xFFD0, 0xFFD1, 0xFFD2, 0xFFD3, 0xFFD4, 0xFFD5, 0xFFD6, 0xFFD7, 0xFFD8, 0xFFD9, 0xFFDA, 0xFFDB, 0xFFDC, 0xFFDD, 0xFFDE, 0xFFDF, /* E */ 0xFFE0, 0xFFE1, 0xFFE2, 0xFFE3, 0xFFE4, 0xFFE5, 0xFFE6, 0xFFE7, 0xFFE8, 0xFFE9, 0xFFEA, 0xFFEB, 0xFFEC, 0xFFED, 0xFFEE, 0xFFEF, /* F */ 0xFFF0, 0xFFF1, 0xFFF2, 0xFFF3, 0xFFF4, 0xFFF5, 0xFFF6, 0xFFF7, 0xFFF8, 0xFFF9, 0xFFFA, 0xFFFB, 0xFFFC, 0xFFFD, 0xFFFE, 0xFFFF, }; hfsplus-1.0.4/libhfsp/src/unicode.h0100644000000000000000000000153407441220605015717 0ustar rootroot/* * linux/fs/hfsplus/unicode.c * * Copyright (C) 1999-2000 Brad Boyer (flar@pants.nu) * This file may be distributed under the terms of the GNU Public License. * * The routines found here convert hfs-unicode string into ascii Strings * and vice versa. Tehy allow the correct comparison between Strings. */ /* convert the asci string astr into a unicode string given by ustr. * * returns actual length of convertet string. */ int unicode_asc2uni(hfsp_unistr255 *ustr, const char *astr); /* Convert an unicode string ustr to a ascii string astr of given maximum len * * returns actual length of convertet string. */ int unicode_uni2asc(char *astr, const hfsp_unistr255 *ustr, int maxlen); /* similar to strcmp for unicode, pascal strings */ SInt32 fast_unicode_compare (const hfsp_unistr255 *ustr1, const hfsp_unistr255 *ustr2); hfsplus-1.0.4/libhfsp/src/volume.c0100644000000000000000000004355407450133475015613 0ustar rootroot/* * libhfs - library for reading and writing Macintosh HFS volumes * * Code to acces the basic volume information of a HFS+ volume. * * Copyright (C) 2000 Klaus Halfmann * Original work by 1996-1998 Robert Leslie * other work 2000 from Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: volume.c,v 1.6 2002/03/26 18:00:29 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # include # include # include # include # include # include "libhfsp.h" # include "volume.h" # include "record.h" # include "btree.h" # include "blockiter.h" # include "os.h" # include "swab.h" # include "hfstime.h" # include "partitions.h" /* Fill a given buffer with the given block in volume. */ int volume_readinbuf(volume * vol,void* buf, long block) { UInt16 blksize_bits; ASSERT( block < vol->maxblocks); blksize_bits = vol->blksize_bits; // printf("Reading from %lx\n", block << blksize_bits); if (os_seek(&vol->fd, block, blksize_bits) == block) if (1 == os_read(&vol->fd, buf, 1, blksize_bits)) return 0; return -1; } /* Write buffer to given block on medium. */ int volume_writetobuf(volume * vol,void* buf, long block) { UInt16 blksize_bits; ASSERT( block < vol->maxblocks); blksize_bits = vol->blksize_bits; // printf("Writing to %lx\n", block << blksize_bits); if (os_seek(&vol->fd, block, blksize_bits) == block) if (1 == os_write(&vol->fd, buf, 1, blksize_bits)) return 0; return -1; } /* read multiple blocks of a fork into given memory. * * block realtive index in fork to start with * count number of blocks to read * forktype usually HFSP_EXTENT_DATA or HFSP_EXTENT_RSRC * fileId id (needed) in case extents must be fetched * * returns given pinter or NULL on failure. */ void* volume_readfromfork(volume* vol, void* buf, hfsp_fork_raw* f, UInt32 block, UInt32 count, UInt8 forktype, UInt32 fileId) { blockiter iter; char* cbuf = buf; blockiter_init(&iter, vol, f, forktype, fileId); if (blockiter_skip(&iter, block)) return NULL; while (count > 0) { --count; if (volume_readinbuf(vol, cbuf, blockiter_curr(&iter))) return NULL; cbuf += vol->blksize; if (count > 0 && blockiter_next(&iter)) return NULL; } return buf; } /* write multiple blocks of a fork buf to medium. * The caller is responsible for allocating a suffient * large fork and eventually needed extends records for now. * * block realtive index in fork to start with * count number of blocks to write * forktype usually HFSP_EXTENT_DATA or HFSP_EXTENT_RSRC * fileId id (needed) in case extents must be written * * returns value != 0 on error. */ int volume_writetofork(volume* vol, void* buf, hfsp_fork_raw* f, UInt32 block, UInt32 count, UInt8 forktype, UInt32 fileId) { blockiter iter; char* cbuf = buf; blockiter_init(&iter, vol, f, forktype, fileId); if (blockiter_skip(&iter, block)) return -1; while (count > 0) { --count; if (volume_writetobuf(vol, cbuf, blockiter_curr(&iter))) return -1; cbuf += vol->blksize; if (count > 0 && blockiter_next(&iter)) return -1; } return 0; } /* Check in Allocation file if given block is allocated. */ int volume_allocated(volume* vol, UInt32 block) { int bit = block & 0x07; int mask,index; char* bits; char buf[vol->blksize]; // if (block >= vol->maxblocks) // HFSP_ERROR(-1, "Allocation block out of range."); block >>= 3; mask = (1 << vol->blksize_bits) -1; /* Usually 0x0FFF */ index = block & mask; block >>= vol->blksize_bits; // block in allocation file bits = (char*) volume_readfromfork(vol, buf, &vol->vol.alloc_file, block, 1, HFSP_EXTENT_DATA, HFSP_ALLOC_CNID); if (!bits) HFSP_ERROR(-1, "Allocation block not found !?"); return (bits[index] & (0x80 >> bit)); /* Bit one is 0x80 ! */ return 0; fail: return -1; } /* Mark in Allocation file a given block as allocated. * * ToDo: optimize for adjacent blocks ... * use cache directly */ int volume_allocate(volume* vol, UInt32 block) { int bit = block & 0x07; int mask,index; char* bits; char buf[vol->blksize]; int shift = 0x80 >> bit; /* Bit one is 0x80 */ // if (block >= vol->maxblocks) // HFSP_ERROR(-1, "Allocation block out of range."); block >>= 3; mask = (1 << vol->blksize_bits) -1; /* Usually 0x0FFF */ index = block & mask; block >>= vol->blksize_bits; // block in allocation file bits = (char*) volume_readfromfork(vol, buf, &vol->vol.alloc_file, block, 1, HFSP_EXTENT_DATA, HFSP_ALLOC_CNID); if (!bits) HFSP_ERROR(-1, "Allocation block not found !?"); if (bits[index] & shift) HFSP_ERROR(-1, "volume_allocate: Block already allocated"); bits[index] |= shift; return volume_writetofork(vol, buf, &vol->vol.alloc_file, block, 1, HFSP_EXTENT_DATA, HFSP_ALLOC_CNID); fail: return -1; } /* Mark in Allocation file a given block as freee. * * ToDo: optimize for adjacent blocks ... * use cache directly */ int volume_deallocate(volume* vol, UInt32 block) { int bit = block & 0x07; int mask,index; char* bits; char buf[vol->blksize]; int shift = 0x80 >> bit; /* Bit one is 0x80 */ // if (block >= vol->maxblocks) // HFSP_ERROR(-1, "Allocation block out of range."); block >>= 3; mask = (1 << vol->blksize_bits) -1; /* Usually 0x0FFF */ index = block & mask; block >>= vol->blksize_bits; // block in allocation file bits = (char*) volume_readfromfork(vol, buf, &vol->vol.alloc_file, block, 1, HFSP_EXTENT_DATA, HFSP_ALLOC_CNID); if (!bits) HFSP_ERROR(-1, "Allocation block not found !?"); if (!(bits[index] & shift)) HFSP_ERROR(-1, "volume_allocate: Block already free"); bits[index] &= ~shift; return volume_writetofork(vol, buf, &vol->vol.alloc_file, block, 1, HFSP_EXTENT_DATA, HFSP_ALLOC_CNID); fail: return -1; } /* Initialize a raw hfsp_extent_rec. */ static void volume_initextent(hfsp_extent_rec er) { memset(er, 0, 8 * sizeof(hfsp_extent)); /* int i; hfsp_extent* e; for (i=0; i < 8; i++) { e = &er[i]; e->start_block = 0; e->block_count = 0; } */ } /** Initalize an (empty !) fork, you may later request additional space */ void volume_initfork(volume* vol, hfsp_fork_raw* f, UInt16 fork_type) { f->total_size = 0; if (fork_type == HFSP_EXTENT_DATA) f->clump_size = vol->vol.data_clump_sz; else f->clump_size = vol->vol.rsrc_clump_sz; f->total_blocks = 0; volume_initextent(f->extents); } /* Read a raw hfsp_extent_rec from memory. * * return pointer right after the structure. */ void* volume_readextent(void *p, hfsp_extent_rec er) { int i; hfsp_extent* e; for (i=0; i < 8; i++) { e = &er[i]; e->start_block = bswabU32_inc(p); e->block_count = bswabU32_inc(p); } return p; } /* Write a raw hfsp_extent_rec to memory. * * return pointer right after the structure. */ void* volume_writeextent(void *p, hfsp_extent_rec er) { int i; hfsp_extent* e; for (i=0; i < 8; i++) { e = &er[i]; bstoreU32_inc(p, e->start_block ); bstoreU32_inc(p, e->block_count ); } return p; } /* Read a raw hfsp_fork from memory. * * return pointer right after the structure. */ void* volume_readfork(void *p, hfsp_fork_raw* f) { f->total_size = bswabU64_inc(p); f->clump_size = bswabU32_inc(p); f->total_blocks = bswabU32_inc(p); return volume_readextent(p, f->extents); } /* Write a raw hfsp_fork to memory. * * return pointer right after the structure. */ void* volume_writefork(void *p, hfsp_fork_raw* f) { bstoreU64_inc(p, f->total_size ); bstoreU32_inc(p, f->clump_size ); bstoreU32_inc(p, f->total_blocks); return volume_writeextent(p, f->extents); } /* Read the volume from the given buffer and swap the bytes. */ static int volume_readbuf(hfsp_vh* vh, void* p) { if ( (vh->signature = bswabU16_inc(p)) != HFSP_VOLHEAD_SIG) HFSP_ERROR(-1, "This is not a HFS+ volume"); vh->version = bswabU16_inc(p); vh->attributes = bswabU32_inc(p); vh->last_mount_vers = bswabU32_inc(p); vh->reserved = bswabU32_inc(p); vh->create_date = bswabU32_inc(p); vh->modify_date = bswabU32_inc(p); vh->backup_date = bswabU32_inc(p); vh->checked_date = bswabU32_inc(p); vh->file_count = bswabU32_inc(p); vh->folder_count = bswabU32_inc(p); vh->blocksize = bswabU32_inc(p); vh->total_blocks = bswabU32_inc(p); vh->free_blocks = bswabU32_inc(p); vh->next_alloc = bswabU32_inc(p); vh->rsrc_clump_sz = bswabU32_inc(p); vh->data_clump_sz = bswabU32_inc(p); vh->next_cnid = bswabU32_inc(p); vh->write_count = bswabU32_inc(p); vh->encodings_bmp = bswabU64_inc(p); memcpy(vh->finder_info, p, 32); ((char*) p) += 32; // finderinfo is not used by now p = volume_readfork(p, &vh->alloc_file ); p = volume_readfork(p, &vh->ext_file ); p = volume_readfork(p, &vh->cat_file ); p = volume_readfork(p, &vh->attr_file ); p = volume_readfork(p, &vh->start_file ); return 0; fail: return -1; } /* Write the volume to the given buffer and swap the bytes. */ static int volume_writebuf(hfsp_vh* vh, void* p) { bstoreU16_inc(p, vh->signature ); bstoreU16_inc(p, vh->version ); bstoreU32_inc(p, vh->attributes ); bstoreU32_inc(p, vh->last_mount_vers); bstoreU32_inc(p, vh->reserved ); bstoreU32_inc(p, vh->create_date ); bstoreU32_inc(p, vh->modify_date ); bstoreU32_inc(p, vh->backup_date ); bstoreU32_inc(p, vh->checked_date ); bstoreU32_inc(p, vh->file_count ); bstoreU32_inc(p, vh->folder_count ); bstoreU32_inc(p, vh->blocksize ); bstoreU32_inc(p, vh->total_blocks ); bstoreU32_inc(p, vh->free_blocks ); bstoreU32_inc(p, vh->next_alloc ); bstoreU32_inc(p, vh->rsrc_clump_sz ); bstoreU32_inc(p, vh->data_clump_sz ); bstoreU32_inc(p, vh->next_cnid ); bstoreU32_inc(p, vh->write_count ); bstoreU64_inc(p, vh->encodings_bmp ); memcpy(p, vh->finder_info, 32); ((char*) p) += 32; // finderinfo is not used by now p = volume_writefork(p, &vh->alloc_file ); p = volume_writefork(p, &vh->ext_file ); p = volume_writefork(p, &vh->cat_file ); p = volume_writefork(p, &vh->attr_file ); p = volume_writefork(p, &vh->start_file ); return 0; } /* Read the volume from the given block */ static int volume_read(volume * vol, hfsp_vh* vh, UInt32 block) { char buf[vol->blksize]; if (volume_readinbuf(vol, buf, block)) return -1; return volume_readbuf(vh, buf); } /* Find out wether the volume is wrapped and unwrap it eventually */ static int volume_read_wrapper(volume * vol, hfsp_vh* vh) { UInt16 signature; char buf[vol->blksize]; void *p = buf; if( volume_readinbuf(vol, buf, 2) ) // Wrapper or volume header starts here return -1; signature = bswabU16_inc(p); if (signature == HFS_VOLHEAD_SIG) /* Wrapper */ { UInt32 drAlBlkSiz; /* size (in bytes) of allocation blocks */ UInt32 sect_per_block; /* how may block build an hfs sector */ UInt16 drAlBlSt; /* first allocation block in volume */ UInt16 embeds, embedl; /* Start/lenght of embedded area in blocks */ ((char*) p) += 0x12; /* skip unneeded HFS vol fields */ drAlBlkSiz = bswabU32_inc(p); /* offset 0x14 */ ((char*) p) += 0x4; /* skip unneeded HFS vol fields */ drAlBlSt = bswabU16_inc(p); /* offset 0x1C */ ((char*) p) += 0x5E; /* skip unneeded HFS vol fields */ signature = bswabU16_inc(p); /* offset 0x7C, drEmbedSigWord */ if (signature != HFSP_VOLHEAD_SIG) HFSP_ERROR(-1, "This looks like a normal HFS volume"); embeds = bswabU16_inc(p); embedl = bswabU16_inc(p); sect_per_block = (drAlBlkSiz / HFSP_BLOCKSZ); // end is absolute (not relative to HFS+ start) vol->maxblocks = embedl * sect_per_block; os_offset += ((UInt64) (drAlBlSt + embeds * sect_per_block)) << HFS_BLOCKSZ_BITS; /* Now we can try to read the embedded HFS+ volume header */ return volume_read(vol,vh,2); } else if (signature == HFSP_VOLHEAD_SIG) /* Native HFS+ volume */ { p = buf; // Restore to begin of block return volume_readbuf(vh, p); } else HFSP_ERROR(-1, "Neither Wrapper nor native HFS+ volume header found"); fail: return -1; } /** Mark the volume as modified by setting its modfied date */ void volume_modified(volume* vol) { time_t now; hfsp_vh* head; gmtime(&now); head = &vol->vol; head->modify_date = now + HFSPTIMEDIFF; } /** Mark this volume as used by Linux by modifying the header */ void volume_linux_mark(volume* vol) { hfsp_vh* head = &vol->vol; // *** Debugging *** vol ->flags |= HFSP_BACKUP_DIRTY; // MacOS does not like that :( // head->version = HPUTILS_VERS; head->last_mount_vers = HPLS_SIGNATURE; // For now I always mark the volume as inconsistent ... head->attributes |= HFSPLUS_VOL_INCNSTNT; volume_modified(vol); } /* Open the device, read and verify the volume header (and its backup) */ int volume_open(volume* vol, char* devname, int partition, int rw) { hfsp_vh backup; /* backup volume found at second to last block */ int shift; int blksize_bits; vol->blksize_bits = HFSP_BLOCKSZ_BITS; vol->flags = 0; vol->blksize = HFSP_BLOCKSZ; vol->maxblocks = 3; /* this should be enough until we find the volume descriptor */ vol->extents = NULL; /* Thanks to Jeremias Sauceda */ btree_reset(&vol->catalog); if (os_open(&vol->fd, devname, rw)) return -1; /* set the offset to the first block of the given partition */ if( partition!= 0) { partition_map map; int block; if( partition_getPartitionMap( &map, vol->fd)== -1) HFSP_ERROR(-1, "No Apple partition map found"); block = partition_getStartBlock( &map, "Apple_HFS", partition); if (block == 0) HFSP_ERROR(-1, "No valid Apple_HFS partition found"); os_offset = ((UInt64)block) << HFSP_BLOCKSZ_BITS; } vol->flags |= rw & HFSP_MODE_RDWR; if (volume_read_wrapper(vol, &vol->vol)) return -1; if (volume_read(vol, &backup, vol->maxblocks - 2)) return -1; /* Now switch blksize from HFSP_BLOCKSZ (512) to value given in header and adjust depend values accordingly, after that a block always means a HFS+ allocation size */ /* Usually blocksize is 4096 */ blksize_bits = ffs(vol->vol.blocksize) -1; shift = blksize_bits - vol->blksize_bits; vol -> blksize = vol->vol.blocksize; vol -> blksize_bits = blksize_bits; vol -> maxblocks = vol->vol.total_blocks; /* cant calculate via shift ? */ if (vol->flags & HFSP_MODE_RDWR) { char buf[HFSP_BLOCKSZ]; void *p = buf; volume_linux_mark(vol); // write back (dirty) volume header if (volume_writebuf(&vol->vol, p)) return -1; // evil, but will never happen volume_writetobuf(vol, buf, 2); // This is always block 2 } if (btree_init_cat(&vol->catalog, vol, &vol->vol.cat_file)) return -1; return 0; fail: return -1; } /* Write back all data eventually cached and close the device */ int volume_close(volume* vol) { btree_close(&vol->catalog); if (vol->extents) { btree_close(vol->extents); FREE(vol->extents); } if (vol->flags & HFSP_MODE_RDWR) // volume was opened for writing, { /* Switch back to HFSP_BLOCKSZ (512) */ int shift = vol->blksize_bits - HFSP_BLOCKSZ_BITS; char buf[HFSP_BLOCKSZ]; void *p = buf; hfsp_vh* head = &vol->vol; // Clear inconsistent flag head->attributes &= ~HFSPLUS_VOL_INCNSTNT; // set Unmounted flag head->attributes |= HFSPLUS_VOL_UNMNT; vol->blksize_bits = HFSP_BLOCKSZ_BITS; vol -> maxblocks <<= shift; /* cant calculate via shift ? */ if (volume_writebuf(&vol->vol, p)) return -1; // evil, but will never happen volume_writetobuf(vol, buf, 2); // This is always block 2 if (vol->flags & HFSP_BACKUP_DIRTY) // need to write backup block, too { // !!! Need to check this with larger volumes, too !!! volume_writetobuf(vol, buf, vol->maxblocks-2); } } return os_close(&vol->fd); } /* internal fucntion used to create the extents btree, is called by inline function when needed */ void volume_create_extents_tree(volume* vol) { btree* result = (btree*) ALLOC(btree*, sizeof(btree)); if (!result) HFSP_ERROR(ENOMEM, "No memory for extents btree"); if (!btree_init_extent(result, vol, &vol->vol.ext_file)) { vol->extents = result; return; } fail: vol->extents = NULL; } /* accessor for entends btree, is created on demand */ /* inline */ btree* volume_get_extents_tree(volume* vol) { if (!vol->extents) volume_create_extents_tree(vol); return vol->extents; } /* return new Id for files/folder and check for overflow. * * retun 0 on error . */ UInt32 volume_get_nextid(volume* vol) { UInt32 result = vol->vol.next_cnid; if (result < HFSP_MIN_CNID) // oops possible wrap around overflow { hfsp_error = "Maximum number of node IDs exhausted, sorry"; return 0; } vol->vol.next_cnid = 1 + result; return result; } hfsplus-1.0.4/libhfsp/src/volume.h0100644000000000000000000000612707444577574015632 0ustar rootroot/* * libhfs - library for reading and writing Macintosh HFS volumes * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: volume.h,v 1.2 2002/03/16 08:17:00 klaus Exp $ */ /* Open the device, read and verify the volume header (and its backup) */ extern int volume_open(volume* vol, char* devname, int partition, int rw); /* Write back all data eventually cached and close the device. */ extern int volume_close(volume* vol); /* read multiple blocks into given memory. * * returns given pointer or NULL on failure. */ extern void* volume_readfromfork(volume* vol, void* buf, hfsp_fork_raw* f, UInt32 block, UInt32 count, UInt8 forktype, UInt32 fileId); /* write multiple blocks of a fork buf to medium. * The caller is responsible for allocating a suffient * large fork and eventually needed extends records for now. * * block realtive index in fork to start with * count number of blocks to write * forktype usually HFSP_EXTENT_DATA or HFSP_EXTENT_RSRC * fileId id (needed) in case extents must be written * * returns value != 0 on error. */ int volume_writetofork(volume* vol, void* buf, hfsp_fork_raw* f, UInt32 block, UInt32 count, UInt8 forktype, UInt32 fileId); /* Fill a given buffer with the given block in volume. */ int volume_readinbuf(volume * vol,void* buf, long block); /* Check in Allocation file if given block is allocated. */ extern int volume_allocated(volume* v, UInt32 block); /* Read a raw hfsp_extent_rec from memory. */ extern void* volume_readextent(void *p, hfsp_extent_rec er); /* Read fork information from raw memory */ extern void* volume_readfork(void *p, hfsp_fork_raw* f); /* Write fork information to raw memory */ extern void* volume_writefork(void *p, hfsp_fork_raw* f); /* Initialize for to all zero, you may allocate later */ void volume_initfork(volume* vol, hfsp_fork_raw* f, UInt16 fork_type); /* internal function used to create the extents btree, is called by following inline function when needed */ extern void volume_create_extents_tree(volume* vol); /* accessor for entends btree, is created on demand */ extern inline btree* volume_get_extents_tree(volume* vol) { if (!vol->extents) volume_create_extents_tree(vol); return vol->extents; } /* return new Id for files/folder and check for overflow. * * retun 0 on error . */ extern UInt32 volume_get_nextid(volume* vol); hfsplus-1.0.4/libhfsp/.cvsignore0100644000000000000000000000023707441220604015327 0ustar rootrootMakefile Makefile.in configure config.h config.cache config.status config.sub config.guess ltconfig ltmain.sh stamp-h stamp-h.in libtool config.log aclocal.m4 hfsplus-1.0.4/libhfsp/Makefile.am0100644000000000000000000000031307441220604015356 0ustar rootroot# # Makefile.am for hfsplus # # Created by Klaus Kaempf and # Klaus Halfmann # # $Id: Makefile.am,v 1.1.1.1 2002/03/05 19:50:28 klaus Exp $ SUBDIRS = src hfsplus-1.0.4/libhfsp/test/0040755000000000000000000000000007450157145014320 5ustar rootroothfsplus-1.0.4/libhfsp/test/.cvsignore0100644000000000000000000000010107441220605016275 0ustar rootrootMakefile Makefile.in *.o *.lo .deps .libs *.a *.la hfsptest core hfsplus-1.0.4/libhfsp/test/Makefile.am0100644000000000000000000000213007441220605016335 0ustar rootroot# # Makefile.am for libhfsp/test # Created by Klaus Kaempf # # # libhfsp+ - library for reading and writing Macintosh HFS+ volumes # Copyright (C) 1996-1998 Robert Leslie # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # $Id: Makefile.am,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ # testdir = . test_PROGRAMS = hfsptest hfsptest_SOURCES = test.c hfsptest_LDADD = ../src/libhfsp.la INCLUDES = -I../src clean-local: rm -f hfsptest EXTRA_DIST = volumes hfsplus-1.0.4/libhfsp/test/dump1.txt0100644000000000000000000006573007441220605016107 0ustar rootroot # This is a commented dump of an freshly formatted HFS+ volume # (Thanks to Hollis Blanchard for providing it.) # # $Id: dump1.txt,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ # # This dump was created using xxd -a (not od, not hexdump) # 0 1 2 3 4 5 6 7 8 9 A B C D E F 0000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * A master volume record is always found on block 2 2*0x200 = 0x4000 The HFS Wrapper for the HFS volume starts here ('BD') 0000400: 4244 b5ad f194 b5ad f337 8200 0006 0003 BD.......7...... # 0x12 (drNmAlBlks) number of allocation blocks: 7ff9 # 0x14 (drAlBlkSiz) is the blocksize: 0x00000400 # 0x1C (drAlBlSt) is the first allocation block 0x000B 0000410: 000d 7ff9 0000 0400 0000 0400 000b 0000 ................ 0000420: 0016 0000 0564 6973 6b31 7573 0000 0000 .....disk1us.... 0000430: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000440: 0000 0000 0000 0000 000f 0000 1000 0000 ................ 0000450: 1000 0000 0000 0006 0000 0000 0000 0002 ................ 0000460: 0000 0000 0000 0000 0000 0000 0000 0000 ................ # 0x7C: H+ indicates that this is a HFS wrapper # 0x7E: Start block of embedded HFS+ system in Wrapper: 0x0024 # Starblock 0x53 = 0x0b + 0x024 * 2 (blocksize / 0x200 = def blocksize) # Startadr 0x53 * 0x200 = 0xa600 0000470: 0000 0000 0000 0000 0000 0000 482b 0024 ............H+.$ # 0x80 end of embedded filesystem 0x7fd5 # Lastblock 0xfffd = 0x0b + 0x7fd5 * 2 (blocksize / 0x200 = def blocksize) # Lastadr (0xfffd + 1) * 0x200 = 0x1FFFC00 0000480: 7fd5 0000 1000 0000 0004 0000 0000 0000 ................ 0000490: 0000 0000 1000 0004 0004 0000 0000 0000 ................ 00004a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 0000600: ffff ffff ffff ffff ffff ffff ffff ffff ................ * # This is the hfs volume bitmap marking the wrapper # as reserverd. A real waste of space uuuh # 00015e0: ffff ffff ffff ffff ffff ffff ffff ffff ................ 00015f0: ffff ffff ffff ffff ffff ffff ffff ff80 ................ * # More parts of the HFS Wrapper omnitted ... * # This text explains the function of the wrapper 0003a00: 5768 7920 6361 6e27 7420 796f 7520 7365 Why can't you se 0003a10: 6520 796f 7572 2066 696c 6573 3f0d 0d54 e your files?..T 0003a20: 6869 7320 6861 7264 2064 6973 6b20 6973 his hard disk is 0003a30: 2066 6f72 6d61 7474 6564 2077 6974 6820 formatted with 0003a40: 7468 6520 4d61 6320 4f53 2045 7874 656e the Mac OS Exten 0003a50: 6465 6420 666f 726d 6174 2e20 596f 7572 ded format. Your # ... # A small, pseudo System folder is included ... 0005310: 0072 5468 6973 2073 7461 7274 7570 2064 .rThis startup d 0005320: 6973 6b20 7769 6c6c 206e 6f74 2077 6f72 isk will not wor 0005330: 6b20 6f6e 2074 6869 7320 636f 6d70 7574 k on this comput 0005340: 6572 2e2f 4120 506f 7765 7220 5043 2062 er./A Power PC b # ... The Wrapper was formatted on on a japanese OS8 or 9 (thanks to Hollis Blanchard), and theirefore contained a Kanji readme, too ...) * 000a600: # Start of the embedded HFS+ volume * # A master volume record is always found on block 2 2*0x200+a600 = 0xaa00 # 0x00 Signture: 'H+' # 0x02 Version: A04 # 0x04 Attributes: HFSPLUS_VOL_UNMNT (sucessfully unmounted ...) # 0x08 Last Mounted Version '8.10' (others seen ?) 000aa00: 482b 0004 0000 0100 382e 3130 0000 0000 H+......8.10.... # Variant whem mounted from HFSUTILS # 0x00 Signture: 'H+' # 0x02 Version: 0x0102 -> Version 1.0.2 # 0x04 Attributes: HFSPLUS_VOL_UNMNT (sucessfully unmounted ...) # 0x08 Last Mounted Version 'H+LX' Version of our tools 000aa00: 482b 0102 0000 0000 482b 4c58 0000 0000 H+......H+LX.... # Several Dates in MacOS format 000aa10: b5ad f194 b5ad 7322 0000 0000 b5ad 7304 ......s"......s. # 0x20: File count 3, 0x24 Folder count 3 # 0x28: Blocksize: 0x200 (usually 0x1000) # 0x2C: total blocks 0xffaa (0xffaa * 0x200= 1FF5400 = AC00 Overhead) 000aa20: 0000 0003 0000 0003 0000 0200 0000 ffaa ................ # 0x30: free blocks: fb04 # 0x34: search for next allocation block at: 0x06a3 # 0x38: rsrc clump (preallocation-) size 0x2000 # 0x3C: data clump (preallocation-) size 0x2000 000aa30: 0000 fb04 0000 06a3 0000 2000 0000 2000 .......... ... . # 0x40: next (unique) cnid 0x16 # 0x44: number of mounts so far: 0x16 # 0x48: encodings Bitmap: MacJapanese (0x02 , Bit 1) 000aa40: 0000 0016 0000 0016 0000 00000000 0002 ................ # Finder Info (Seems that the volume was never opened by Finder ...) 000aa50: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000aa60: 0000 0000 0000 0000 0000 0000 0000 0000 ................ # Fork info for allocation file # 0x70: Total size (64 Bits) 0x2000 bytes # 0x78: clumpsize 0x2000 # 0x7c: totalblocks 0x10 (* 0x200 = 0x2000 fits exactly) 000aa70: 0000 0000 0000 2000 0000 2000 0000 0010 ...... ... ..... # 0x80 - 0xc0 8 extends, first (and only) from 0x03 , 0x10 blocks # this is sufficient for 0x010000 bits # location starts at 0xa600 + 0x03*0x200 = 0xac00 # location ends at 0xa600 + (0x03 + 0x10) *0x200 = 0xcc00 000aa80: 0000 0003 0000 0010 0000 0000 0000 0000 ................ 000aa90: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000aaa0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000aab0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ # Fork information for extends file (wonder why this is needed ?) # 0xC0: Total size (64 bits) 0x40000 bytes # 0xC8: ClumpSize 0x4000 bytes # 0xCC: totalblocks 0x200 (* 0x200 = 0x40000 fits exactly) 000aac0: 0000 0000 0004 0000 0004 0000 0000 0200 ................ # 0xaD0 - 0xb10 8 extends, first (and only) from 0x13, 0x200 blocks # location starts at 0xa600 + 0x13 *0x200=0x0CC00 # location ends at 0xa600 + (0x13+0x200)*0x200=0x4CC00 000aad0: 0000 0013 0000 0200 0000 0000 0000 0000 ................ 000aae0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000aaf0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000ab00: 0000 0000 0000 0000 0000 0000 0000 0000 ................ # Fork information for catalog file # 0x10: Total size (64 bits) 0x40000 bytes # 0x18: ClumpSize 0x4000 bytes # 0x1C: totalblocks 0x200 (* 0x200 = 0x40000 fits exactly) 000ab10: 0000 0000 0004 0000 0004 0000 0000 0200 ................ # 0x20 - 0x40 8 extends, first (and only) from 0x213, 0x200 blocks # location starts at 0xa600 + 0x213 *0x200=0x4CC00 # location ends at 0xa600 + (0x213+0x200)*0x200=0x8CC00 000ab20: 0000 0213 0000 0200 0000 0000 0000 0000 ................ 000ab30: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000ab40: 0000 0000 0000 0000 0000 0000 0000 0000 ................ No attr-fork, No boot-fork 000ab50: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * # Allocation Bitmap starts here # This marks blocks 0x0000 - 0x007F as allocated 000ac00: ffff ffff ffff ffff ffff ffff ffff ffff ................ # This marks blocks 0x0080 - 0x00ff as allocated 000ac10: ffff ffff ffff ffff ffff ffff ffff ffff ................ # This marks blocks 0x0100 - 0x017f as allocated 000ac20: ffff ffff ffff ffff ffff ffff ffff ffff ................ 000ac30: ffff ffff ffff ffff ffff ffff ffff ffff ................ 000ac40: ffff ffff ffff ffff ffff ffff ffff ffff ................ 000ac50: ffff ffff ffff ffff ffff ffff ffff ffff ................ 000ac60: ffff ffff ffff ffff ffff ffff ffff ffff ................ 000ac70: ffff ffff ffff ffff ffff ffff ffff ffff ................ # This marks blocks 0x0600 - 0x067f as allocated 000ac80: ffff e000 0000 0000 0000 0000 0000 0000 ................ # This marks blocks 0x0680 - 0x06A3 as allocated # First free block should be at 0x06a4 *0x200 + 0xa600 = 0xdee00 000ac90: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000aca0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000acb0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000acc0: 0000 1fff ffff ffff ffff ffff ffff ffff ................ # This marks blocks 0x0884 - 0x08FF as allocated 000acd0: ffff ffff f000 0000 0000 0000 0000 0000 ................ # This marks blocks 0x0927 - 0x097F as allocated 000ace0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 000cbf0: 0000 0000 00c0 0000 0000 0000 0000 0000 ................ # Marks 0xFFA8 - i0xFFA9 as allocated FFA8*0x200 + 0xa600 = 1FFF600 # end of allocation file - begin of extends file 000cc00: 0000 0000 0000 0000 0100 0003 0000 0000 ................ 000cc10: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000cc20: 0400 000a 0000 0100 0000 00ff 0000 0004 ................ 000cc30: 0000 0000 0000 0002 0000 0000 0000 0000 ................ 000cc40: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 000ccf0: 0000 0000 0000 0000 8000 0000 0000 0000 ................ 000cd00: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 000cff0: 0000 0000 0000 0000 03f8 00f8 0078 000e .............x.. 000d000: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * # end of extends file - begin of catalog file # Btree Node Descriptor: # 0x00 : next 0x00 -> (no additional map node) # 0x04 : prev 0x00 -> single, top node, well # 0x08 : kind 0x01 = HFSP_NODE_HEAD # 0x09 : height 0x00 # 0x0A : num_rec 0x003 # 0x0C : reserved 0 # Btree header (expected in type HFSP_NODE_HEAD) # 0x0E : depth 0x01 004cc00: 0000 0000 0000 0000 0100 0003 0000 0001 ................ # 0x00 : root 0x00000001 # 0x04 : leaf_count 0x0000004e = 64 records ? # 0x08 : leaf_head 0x00000001 # 0x0C : leaf_tail 0x00000001 004cc10: 0000 0001 0000 000e 0000 0001 0000 0001 ................ # 0x20 : node_size 0x1000 -> end of node at 0x4dc00 ? # 0x22 : max_key_len 0x204 = 516 ( pretty large, hmmm) # 0x24 : node_count 0x40 -> lenght of btree 0x40 * 0x1000 = 0x400000 # 0x28 : free_nodes 0x3e # 0x2c : reserved # 0x2e : clump_size 0x40000 (misaligned) 004cc20: 1000 0204 0000 0040 0000 003e 0000 0004 .......@...>.... # 0x32 : btree_type: 0 # 0x33 : reserved: 0 # 0x34 : attributes: 0x06 : HFSPLUS_TREE_BIGKEYS, HFSPLUS_TREE_VAR_NDXKEY_SIZE # 0x38 - 0x88 : reserved 004cc30: 0000 0000 0000 0006 0000 0000 0000 0000 ................ * # 0x88 Start of reserverd record 004cc80: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * # 0xF8 End of reserved record , start of B-Tree Map record # Size = 0x400000 / 0x1000 / 0x08 bits = 0x80 bytes 004ccf0: 0000 0000 0000 0000 c000 0000 0000 0000 ................ 004cd00: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * # Backpointers in reverse Order # 0xFE : 0x000E pointer to start at 0xCC0E # 0xFC : 0x0078 pointer to reserved record at 0xCC78 # 0xFA : 0x00f8 pointer to Map Record at 0xCCF8 # 0xF8 : 0x0ff8 pointer to Freee Space 0xDBF8 -> no more space, ok 004dbf0: 0000 0000 0000 0000 0ff8 00f8 0078 000e .............x.. # 0x00 : Begin of node 1, Node descriptor # 0x00 : next 0x00 # 0x04 : prev 0x00 -> no further Map Node # 0x08 : kind 0xff = HFSP_NODE_LEAF # 0x09 : height 0x01 -> Leaf one below root, well # 0x0A : num_rec 0x00e -> 14 entries # 0x0C : reserved 0 # 0x0e : length of key 0x0010 004dc00: 0000 0000 0000 0000 ff01 000e 0000 0010 ................ # 0x10 : Parent cnid 0x00000001 HFSP_POR_CNID : Parent of root # 0x12 : lenght of (Unicode) string # 0x14 - 0x20 : String 'disk1' 004dc10: 0000 0001 0005 0064 0069 0073 006b 0031 .......d.i.s.k.1 # 0x00 : RecordType : HFSP_FOLDER # 0x02 : flags 0x00 # 0x04 : valence 0x00000005 # 0x08 : id 0x00000002 : HFSP_ROOT_CNID # 0x0c : create date 0xB5AD7304 004dc20: 0001 0000 0000 0005 0000 0002 b5ad 7304 ..............s. # 0x00 : content_mod_date : 0xB5AD7314 # 0x04 : attribute_mod_date : 0 # 0x08 : acces_date : 0 # 0x0c : backup_date : 0 004dc30: b5ad 7314 0000 0000 0000 0000 0000 0000 ..s............. # 0x00 : permission 0,0,0,0 004dc40: 0000 0000 0000 0000 0000 0000 0000 0000 ................ # 0x00 : DInfo, No rect, # 0x08 : frFlags: 0x03e0 = ??? # 0x0A : frLocation: 190, 960 (usual place at upper right corner) # 0x0C : frView: 0010e 004dc50: 0000 0000 0000 0000 03e0 00be 03c0 010e ................ # 0x00 : DXInfo , frScroll 0,0 # 0x04 : frOpenChain : 0xE1000000 # 0x08 : frUnused : 0x0000 # 0x0A : frComment : 0x0000 # 0x0C : frPutAway : 0x00000000 004dc60: 0000 0000 e100 0000 0000 0000 0000 0000 ................ # 0x00 : Text encoding : 0x00000001 (Mac Roman ?) # 0x04 : reserved : 0x00000000 ??? # 0x08 : Start of record 1 : key_len = 6 # 0x0A : parent Id: 0x00000002 HFSP_ROOT_CNID # 0x0E : strlen = 0 Mhh 004dc70: 0000 0001 0000 0000 0006 0000 0002 0000 ................ # 0x00 : 0x0003 Folder thread # 0x02 : 0x0000 reserved # 0x04 : parentID 0x00000001 HFSP_POR_CNID # 0x08 : length of String : 5 'disk1' 004dc80: 0003 0000 0000 0001 0005 0064 0069 0073 ...........d.i.s # 0x94 : Begin of record 2 : Length of key 1a # 0x98 : paren cnid : 0x00000002 HFSP_ROOT_CNID , well # 0x9C : Lenght of String : 10 'Desktop DB' 004dc90: 006b 0031 001a 0000 0002 000a 0044 0065 .k.1.........D.e 004dca0: 0073 006b 0074 006f 0070 0020 0044 0042 .s.k.t.o.p. .D.B # 0xb0 : type of record 0x0002 : HFSP File # 0xb2 : flags: 0x0002 HFSP_THREAD_EXISTS # 0xb4 : reserved: 0x00000000 # 0xb8 : id i: 0x00000012 (Reserved by Apple, ok for Desktop DB) # 0xba : create date 004dcb0: 0002 0002 0000 0000 0000 0012 b5ad 7314 ..............s. # 0xc0 : content_mod_date # 0xc4 : attribute_mod_date : 0 # 0xc8 : acces_date : 0 # 0xcc : backup_date : 0 004dcc0: b5ad 7314 0000 0000 0000 0000 0000 0000 ..s............. # 0x00 : permission 0,0,0,0 004dcd0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ # Finfo: # 0x00 : fdType 'BTFL' fdCreator 'DMGR' # 0x08 : fdFlags : 0x4000 (probably invisible ...) # 0x0A : no point (is invisible anyway ..) # 0x0e : fdFldr 0x0000 (not in any window) 004dce0: 4254 464c 444d 4752 4000 0000 0000 0000 BTFLDMGR@....... # FXInfo: all 0 (never displayed ...) 004dcf0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ # 0x00 : Text encoding 0x00000001 : ??? (Mac Roman ?) # 0x04 : reserved2 # 0x08 : datafork, total size 0x0000000000002000 004dd00: 0000 0001 0000 0000 0000 0000 0000 2000 .............. . # 0x00 : clumpsize 0 (not used ?) # 0x04 : total blocks 0x00010 (0x10 * 0x200 = 0x2000 fits exactly) # 0x08 : first block 0x613, length 0x10 -> Starts at 0xa600 + 0x613*0x200 = 0xCCC00 -> Ends at 0xa600 + 0x623*0x200 = 0xCEC00 004dd10: 0000 0000 0000 0010 0000 0613 0000 0010 ................ 004dd20: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 004dd30: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 004dd40: 0000 0000 0000 0000 0000 0000 0000 0000 ................ # 0x58 : rsrcfork (none) 004dd50: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 004dd60: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 004dd70: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 004dd80: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 004dd90: 0000 0000 0000 0000 0000 0000 0000 0000 ................ # 0xa8 : end of rsrcfork # 0xa8 : File: 'Desktop DF' 004dda0: 0000 0000 0000 0000 001a 0000 0002 000a ................ 004ddb0: 0044 0065 0073 006b 0074 006f 0070 0020 .D.e.s.k.t.o.p. 004ddc0: 0044 0046 0002 0002 0000 0000 0000 0011 .D.F............ 004ddd0: b5ad 7314 b5ad 7314 0000 0000 0000 0000 ..s...s......... 004dde0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 004ddf0: 0000 0000 4454 464c 444d 4752 4000 0000 ....DTFLDMGR@... 004de00: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 004de10: 0000 0000 0000 0001 0000 0000 0000 0000 ................ # 0x00 : datafork, total size 0x0000000200000000 ??? # 0x0C : first block 0x623, length 0x80 -> Starts at 0xa600 + 0x623*0x200 = 0xCEC00 -> Ends at 0xa600 + 0x6A3*0x200 = 0xDEC00 004de20: 0000 0002 0000 0000 0000 0080 0000 0623 ...............# 004de30: 0000 0080 0000 0000 0000 0000 0000 0000 ................ 004de40: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 004deb0: 0000 0000 0000 0000 0000 0000 0022 0000 .............".. 004dec0: 0002 000e 0044 0065 0073 006b 0074 006f .....D.e.s.k.t.o 004ded0: 0070 0020 0046 006f 006c 0064 0065 0072 .p. .F.o.l.d.e.r 004dee0: 0001 0000 0000 0000 0000 0014 b5ad 7314 ..............s. 004def0: b5ad 7314 0000 0000 0000 0000 0000 0000 ..s............. 004df00: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 004df30: 0000 0001 0000 0000 0034 0000 0002 0017 .........4...... 004df40: 0054 0068 0065 0056 006f 006c 0075 006d .T.h.e.V.o.l.u.m 004df50: 0065 0053 0065 0074 0074 0069 006e 0067 .e.S.e.t.t.i.n.g 004df60: 0073 0046 006f 006c 0064 0065 0072 0001 .s.F.o.l.d.e.r.. 004df70: 0000 0000 0001 0000 0010 b5ad 7314 b5ad ............s... 004df80: 7314 0000 0000 0000 0000 0000 0000 0000 s............... 004df90: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 004dfa0: 0000 0000 0000 5000 0000 0000 0000 0000 ......P......... 004dfb0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 004dfc0: 0001 0000 0000 0010 0000 0002 0005 0054 ...............T 004dfd0: 0072 0061 0073 0068 0001 0000 0000 0000 .r.a.s.h........ 004dfe0: 0000 0015 b5ad 7314 b5ad 7314 0000 0000 ......s...s..... 004dff0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 004e000: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 004e010: 4000 0000 0000 0000 0000 0000 0000 0000 @............... 004e020: 0000 0000 0000 0000 0000 0001 0000 0000 ................ 004e030: 0006 0000 0010 0000 0003 0000 0000 0002 ................ 004e040: 0017 0054 0068 0065 0056 006f 006c 0075 ...T.h.e.V.o.l.u 004e050: 006d 0065 0053 0065 0074 0074 0069 006e .m.e.S.e.t.t.i.n 004e060: 0067 0073 0046 006f 006c 0064 0065 0072 .g.s.F.o.l.d.e.r 004e070: 002a 0000 0010 0012 0044 0065 0073 006b .*.......D.e.s.k 004e080: 0074 006f 0070 0050 0072 0069 006e 0074 .t.o.p.P.r.i.n.t 004e090: 0065 0072 0073 0020 0044 0042 0002 0002 .e.r.s. .D.B.... 004e0a0: 0000 0000 0000 0013 b5ad 7314 b5ad 7314 ..........s...s. 004e0b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 004e0c0: 0000 0000 0000 0000 0000 0000 6474 706c ............dtpl 004e0d0: 6463 6463 4000 0000 0000 0000 0000 0000 dcdc@........... 004e0e0: 0000 0000 8000 0000 0000 0000 0000 0001 ................ 004e0f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 004e140: 0000 0000 0000 0000 0000 011e 0000 0000 ................ 004e150: 0000 0001 0000 06a3 0000 0001 0000 0000 ................ 004e160: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 004e190: 0000 0000 0006 0000 0011 0000 0004 0000 ................ 004e1a0: 0000 0002 000a 0044 0065 0073 006b 0074 .......D.e.s.k.t 004e1b0: 006f 0070 0020 0044 0046 0006 0000 0012 .o.p. .D.F...... 004e1c0: 0000 0004 0000 0000 0002 000a 0044 0065 .............D.e 004e1d0: 0073 006b 0074 006f 0070 0020 0044 0042 .s.k.t.o.p. .D.B 004e1e0: 0006 0000 0013 0000 0004 0000 0000 0010 ................ 004e1f0: 0012 0044 0065 0073 006b 0074 006f 0070 ...D.e.s.k.t.o.p 004e200: 0050 0072 0069 006e 0074 0065 0072 0073 .P.r.i.n.t.e.r.s 004e210: 0020 0044 0042 0006 0000 0014 0000 0003 . .D.B.......... 004e220: 0000 0000 0002 000e 0044 0065 0073 006b .........D.e.s.k 004e230: 0074 006f 0070 0020 0046 006f 006c 0064 .t.o.p. .F.o.l.d 004e240: 0065 0072 0006 0000 0015 0000 0003 0000 .e.r............ 004e250: 0000 0002 0005 0054 0072 0061 0073 0068 .......T.r.a.s.h 004e260: 0073 0068 0044 0065 0073 006b 0074 006f .s.h.D.e.s.k.t.o 004e270: 0070 0050 0072 0069 006e 0074 0065 0072 .p.P.r.i.n.t.e.r 004e280: 0073 0020 0044 0042 0006 0000 0014 0000 .s. .D.B........ 004e290: 0003 0000 0000 0002 000e 0044 0065 0073 ...........D.e.s 004e2a0: 006b 0074 006f 0070 0020 0046 006f 006c .k.t.o.p. .F.o.l 004e2b0: 0064 0065 0072 0006 0000 0015 0000 0003 .d.e.r.......... 004e2c0: 0000 0000 0002 0005 0054 0072 0061 0073 .........T.r.a.s 004e2d0: 0068 0000 0000 0000 0000 0000 0000 0000 .h.............. 004e2e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * # Backpointers in reverse order 004ebe0: 06d2 0660 0644 0616 05e0 05ba 0594 0470 ...`.D.........p # Backpointers in reverse order # 0xFE : 0x000E Pointer to '?????' at 0x4DC0E # 0xFC : 0x0078 Pointer to '?????' at 0x4DC0E # 0xFA : 0x000E Pointer to '?????' at 0x4DC0E # 0xF8 : 0x000E Pointer to '?????' at 0x4DC0E # 0xF6 : 0x000E Pointer to '?????' at 0x4DC0E # 0xF4 : 0x0094 Pointer to '?????' at 0x4DC94 # 0xF2 : 0x0078 Pointer to '???' at 0x4DC78 # 0xF0 : 0x000E Pointer to 'disk1' at 0x4DC0E 004ebf0: 0430 03c6 0338 02bc 01a8 0094 0078 000e .0...8.......x.. # 0x03 : Begin of node 2 (does not exists) 004ec00: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * # End of catalog file 008cc00: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * # Begin of Desktop DB 00ccc00: 0000 0000 0000 0000 0100 0003 0000 0001 ................ 00ccc10: 0000 0001 0000 0001 0000 0001 0000 0001 ................ 00ccc20: 0200 0025 0000 0010 0000 000e 0000 0000 ...%............ 00ccc30: 2000 ff00 0000 0000 0000 0000 0000 0000 ............... 00ccc40: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 00ccc70: 0000 0000 0000 0000 020a 0100 0000 0000 ................ 00ccc80: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 00cccf0: 0000 0000 0000 0000 c000 0000 0000 0000 ................ 00ccd00: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 00ccdf0: 0000 0000 0000 0000 01f8 00f8 0078 000e .............x.. 00cce00: 0000 0000 0000 0000 ff01 0001 0000 0b01 ................ 00cce10: 6174 636f 6174 636f fe00 0000 0000 0000 atcoatco........ 00cce20: 0000 0002 0000 0000 0000 0000 0000 0000 ................ 00cce30: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 00ccff0: 0000 0000 0000 0000 0000 0000 0024 000e .............$.. 00cd000: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * # End of Desktop DB - Begin of Desktop FD 00cec00: 0002 0100 0066 272e 0066 262e 0000 00dc .....f'..f&..... 00cec10: 0000 1df3 0c44 6963 7469 6f6e 6172 792e .....Dictionary. 00cec20: 6800 0200 0200 5445 5854 4357 4945 0100 h.....TEXTCWIE.. 00cec30: 0e95 bd90 ac8a 7083 5383 5683 6283 4e83 ......p.S.V.b.N. 00cec40: 0200 0000 4646 494c 6d6f 7672 0100 01a2 ....FFILmovr.... 00cec50: 0000 4646 494c 6d6f 7672 0100 01a2 0042 ..FFILmovr.....B 00cec60: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00cec70: 0000 b3ec 2e40 0000 0000 0066 280a 0000 .....@.....f(... 00cec80: 0000 0000 0000 0000 1800 0000 1df3 1244 ...............D 00cec90: 6963 7469 6f6e 6172 7944 6961 6c6f 672e ictionaryDialog. 00ceca0: 6300 0200 0200 5445 5854 4357 4945 0100 c.....TEXTCWIE.. 00cecb0: ffff ffff 0000 0002 80bd 0000 0000 805c ...............\ 00cecc0: 0000 9c00 0000 0000 01ac 0000 3400 b13e ............4..> 00cecd0: 2b63 b144 ab18 0000 0000 0000 0000 0000 +c.D............ 00cece0: 0000 0000 0000 0000 0000 0000 2545 0003 ............%E.. 00cecf0: 0000 0000 0000 0000 1f49 0001 0000 0000 .........I...... 00ced00: 0000 001a d000 0000 00ff 000a 0000 ffff ................ 00ced10: 000a 000a 0000 0009 0001 0003 0000 0000 ................ 00ced20: 001a d000 0000 00ff 000c 0000 fffe 000c ................ 00ced30: 000c 0000 000a 0002 0003 0000 0000 001a ................ 00ced40: d000 0000 00ff 000e 0000 fffe 000e 000e ................ 00ced50: 0000 000c 0002 0004 0000 0000 001a d000 ................ 00ced60: 0000 00ff 0012 0000 fffd 0012 0012 0000 ................ 00ced70: 000f 0003 0005 0000 0000 001a d000 0000 ................ 00ced80: 00ff 0019 0000 fffd 0018 0018 0000 0015 ................ 00ced90: 0003 0006 0000 0000 001a d000 0000 00ff ................ 00ceda0: 0009 0000 ffff 0009 0009 0000 0008 0001 ................ 00cedb0: 0002 0000 0000 02ec 1000 413d 0000 00ff ..........A=.... 00cedc0: 0db7 fdb7 0400 1000 0000 0060 0000 0000 ...........`.... 00cedd0: 0000 029c 0000 0155 0000 0000 0100 0155 .......U.......U 00cede0: feab 0155 0000 0000 0268 0004 0006 0000 ...U.....h...... 00cedf0: 0000 413d 0009 0000 7ff6 000a 0000 7ff5 ..A=............ 00cee00: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * # End of Desktop DF - Start of ... 00dec00: 0000 0100 0000 0100 0000 0000 0000 001e ................ 00dec10: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 00ded00: 0000 0100 0000 0100 0000 0000 0000 001e ................ 00ded10: 0000 0000 0000 0000 001c 001e ffff 0000 ................ 00ded20: 001a d000 0000 00ff 000a 0000 ffff 000a ................ 00ded30: 000a 0000 0009 0001 0003 0000 0000 001a ................ 00ded40: d000 0000 00ff 000c 0000 fffe 000c 000c ................ 00ded50: 0000 000a 0002 0003 0000 0000 001a d000 ................ 00ded60: 0000 00ff 000e 0000 fffe 000e 000e 0000 ................ 00ded70: 000c 0002 0004 0000 0000 001a d000 0000 ................ 00ded80: 00ff 0012 0000 fffd 0012 0012 0000 000f ................ 00ded90: 0003 0005 0000 0000 001a d000 0000 00ff ................ 00deda0: 0018 0000 fffd 0018 0018 0000 0015 0003 ................ 00dedb0: 0006 0000 0000 02e8 1000 413c 0000 00ff ..........A<.... 00dedc0: 0db7 fdb7 0400 1000 0000 0060 0000 0000 ...........`.... 00dedd0: 0000 029c 0000 0155 0000 0000 0100 0155 .......U.......U 00dede0: feab 0155 0000 0000 0268 0004 0006 0000 ...U.....h...... 00dedf0: 0000 413c 0009 0000 7ff0 000a 0000 7fef ..A<............ # First free block as defined by allocation bitmap 00dee00: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * # Backup Master directory block for HFS+ # Second to last block in volume = 0x1FFF800 - 2*0x200 = 1FFF600< 1fff600: 482b 0004 0000 0100 382e 3130 0000 0000 H+......8.10.... 1fff610: b5ad f194 b5ad 7304 0000 0000 b5ad 7304 ......s.......s. 1fff620: 0000 0000 0000 0000 0000 0200 0000 ffaa ................ 1fff630: 0000 fb95 0000 0613 0000 2000 0000 2000 .......... ... . 1fff640: 0000 0010 0000 0000 0000 0000 0000 0002 ................ 1fff650: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 1fff660: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 1fff670: 0000 0000 0000 2000 0000 2000 0000 0010 ...... ... ..... 1fff680: 0000 0003 0000 0010 0000 0000 0000 0000 ................ 1fff690: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 1fff6c0: 0000 0000 0004 0000 0004 0000 0000 0200 ................ 1fff6d0: 0000 0013 0000 0200 0000 0000 0000 0000 ................ 1fff6e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 1fff710: 0000 0000 0004 0000 0004 0000 0000 0200 ................ 1fff720: 0000 0213 0000 0200 0000 0000 0000 0000 ................ 1fff730: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * # Backup Master directory block for HFS-Wrapper 1fffc00: 4244 b5ad f194 b5ad f194 8300 0006 0003 BD.............. 1fffc10: 000d 7ff9 0000 0400 0000 0400 000b 0000 ................ 1fffc20: 0016 0000 0768 6673 706c 7573 0000 0000 .....hfsplus.... 1fffc30: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 1fffc40: 0000 0000 0000 0000 000d 0000 1000 0000 ................ 1fffc50: 1000 0000 0000 0006 0000 0000 0000 0002 ................ 1fffc60: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 1fffc70: 0000 0000 0000 0000 0000 0000 482b 0024 ............H+.$ 1fffc80: 7fd5 0000 1000 0000 0004 0000 0000 0000 ................ 1fffc90: 0000 0000 1000 0004 0004 0000 0000 0000 ................ 1fffca0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 1fffff0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ hfsplus-1.0.4/libhfsp/test/dump2.txt0100644000000000000000000007526107441220605016110 0ustar rootroot # This is a commented dump of an HFS+ volume # Original By Brad Boyer # # $Id: dump2.txt,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ 000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * Signature: 42 44 Create Time: b47f394a Mod Time: b5c1dc16 Attributes: 8300 (LOCKED | SPARED | CLEAN) Num Files: 0005 Vol Bmp: 0003 000400: 42 44 b4 7f 39 4a b5 c1 dc 16 83 00 00 05 00 03 BD..9J.......... AllocPtr: 0009 AllocBlk Cnt: fee7 (65255) AllocBlk Size: 00000600 (1.5k) Clump Size: 00000600 (1.5k) AllocBlk Start: 0013 Next CNID: 00000015 000410: 00 09 fe e7 00 00 06 00 00 00 06 00 00 13 00 00 ................ Free Blocks: 0000 Volume Label: ZIP-100 000420: 00 15 00 00 07 5a 49 50 2d 31 30 30 00 00 00 00 .....ZIP-100.... 000430: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Write Count: 0000000d Extents ClmpSize: 00001200 (4.5k) Catalog ClmpSize: 00001200 (4.5k) 000440: 00 00 00 00 00 00 00 00 00 0d 00 00 12 00 00 00 ................ NumDir in root: 0000 File Count: 00000005 Dir Count: 00000000 000450: 12 00 00 00 00 00 00 05 00 00 00 00 00 00 00 02 ................ 000460: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Embedded Sig: 482b Embedded Extent: 0018 fecf 000470: 00 00 00 00 00 00 00 00 00 00 00 00 48 2b 00 18 ............H+.. 000480: fe cf 00 00 12 00 00 00 00 03 00 00 00 00 00 00 ................ 000490: 00 00 00 00 12 00 00 03 00 03 00 00 00 00 00 00 ................ 0004a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * [Snipped data from HFS wrapper, including System and "Where have..."] Start of HFS+ Volume Header (Start of HFS+ filesystem = b600) Signature: 482b Version: 0004 Attributes: 00000100 (Unmounted) Last Mounted: 8.10 (MacOS 8) Reserved: 00000000 00ba00: 48 2b 00 04 00 00 01 00 38 2e 31 30 00 00 00 00 H+......8.10.... Create Date: b47f394a Modify Date: b5c24c1a Backup Date: 00000000 Checked Date: b47fa9cc 00ba10: b4 7f 39 4a b5 c2 4c 1a 00 00 00 00 b4 7f a9 cc ..9J..L......... File Count: 00000004 Folder Count: 00000000 Block Size: 00000200 (512) Total Blocks: 0002fc6d 00ba20: 00 00 00 04 00 00 00 00 00 00 02 00 00 02 fc 6d ...............m Free Blocks: 0002efb4 Next Alloc: 000012ae rsrc ClumpSz: 00002000 data ClumpSz: 00002000 00ba30: 00 02 ef b4 00 00 12 ae 00 00 20 00 00 00 20 00 .......... ... . Next CNID: 00000014 Write Count: 00000020 Encodings Bitmap: 0000000000000001 (MacRoman) 00ba40: 00 00 00 14 00 00 00 20 00 00 00 00 00 00 00 01 ....... ........ Finderinfo 00ba50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * Allocation File Logical Size: 0000000000006000 (24k) Clump Size: 00006000 Total Blocks: 00000030 00ba70: 00 00 00 00 00 00 60 00 00 00 60 00 00 00 00 30 ......`...`....0 Extent 1 Start Block: 00000003 Block Count: 00000030 00ba80: 00 00 00 03 00 00 00 30 00 00 00 00 00 00 00 00 .......0........ 00ba90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * Extents File Logical Size: 00000000000bf000 (764k) Clump Size: 000bf000 Total Blocks: 000005f8 00bac0: 00 00 00 00 00 0b f0 00 00 0b f0 00 00 00 05 f8 ................ Extent 1 Start Block: 00000033 Block Count: 000005f8 00bad0: 00 00 00 33 00 00 05 f8 00 00 00 00 00 00 00 00 ...3............ 00bae0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * Catalog File: Logical Size: 00000000000bf000 (764k) Clump Size: 000bf000 Total Blocks: 000005f8 00bb10: 00 00 00 00 00 0b f0 00 00 0b f0 00 00 00 05 f8 ................ Extent 1 Start Block: 0000062b Block Count: 000005f8 00bb20: 00 00 06 2b 00 00 05 f8 00 00 00 00 00 00 00 00 ...+............ 00bb30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * Start of Allocation File 00bc00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ * 00bd80: ff ff ff ff e0 00 00 00 00 00 00 00 00 00 00 00 ................ 00bd90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 00be40: 00 00 00 1f ff ff ff ff ff ff ff ff ff ff ff ff ................ 00be50: ff ff ff ff ff fe 00 00 00 00 00 00 00 00 00 00 ................ 00be60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 011b80: 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 ................ 011b90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * End of Allocation File Start of Extents File fLink: 00000000 bLink: 00000000 Kind: 01 (Header) Height: 00 Num Recs: 0003 Reserved: 0000 Tree Depth: 0000 011c00: 00 00 00 00 00 00 00 00 01 00 00 03 00 00 00 00 ................ Root Node: 00000000 Leaf Recs: 00000000 First Leaf: 00000000 Last Leaf: 00000000 011c10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Node Size: 0400 Max Keylen: 000a Total Nodes: 000002fc Free Nodes: 000002fb Reserved: 0000 Clump Size: 000bf000 011c20: 04 00 00 0a 00 00 02 fc 00 00 02 fb 00 00 00 0b ................ Tree Type: 00 (unused in HFS+) Reserved: 00 Attributes:00000002 (BigKeys) 011c30: f0 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 ................ 011c40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * Map record (starts at 11cf8, node 0 in use) 011cf0: 00 00 00 00 00 00 00 00 80 00 00 00 00 00 00 00 ................ 011d00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * Record Offsets: Rec 1: 000e (header record) Rec 2: 0078 (reserved record) Rec 3: 00f8 (map record) Rec 4: 03f8 (free space) 011ff0: 00 00 00 00 00 00 00 00 03 f8 00 f8 00 78 00 0e .............x.. 012000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * Start of Catalog File fLink: 00000000 bLink: 00000000 Kind: 01 (Header) Height: 00 Num Recs: 0003 Reserved: 0000 Tree Depth: 0001 0d0c00: 00 00 00 00 00 00 00 00 01 00 00 03 00 00 00 01 ................ Root Node: 00000001 Leaf Recs: 0000000a First Leaf: 00000001 Last Leaf: 00000001 0d0c10: 00 00 00 01 00 00 00 0a 00 00 00 01 00 00 00 01 ................ Node Size: 1000 Max Keylen: 0204 Total Nodes: 000000bf Free Nodes: 000000bd Reserved: 0000 Clump Size: 000bf000 0d0c20: 10 00 02 04 00 00 00 bf 00 00 00 bd 00 00 00 0b ................ Tree Type: 00 (unused in HFS+) Reserved: 00 Attributes:00000006 (BigKeys | VariableIndexKeys) 0d0c30: f0 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 ................ 0d0c40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * Map record (starts at d0cf8, nodes 0 and 1 in use) 0d0cf0: 00 00 00 00 00 00 00 00 c0 00 00 00 00 00 00 00 ................ 0d0d00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * Record Offsets: Rec 1: 000e (header record) Rec 2: 0078 (reserved record) Rec 3: 00f8 (map record) Rec 4: 0ff8 (free space) 0d1bf0: 00 00 00 00 00 00 00 00 0f f8 00 f8 00 78 00 0e .............x.. Node 1 (Root and only leaf node) fLink: 00000000 bLink: 00000000 Kind: ff (Leaf) Height: 01 Num Recs: 000a Reserved: 0000 Keylen: 0014 (Start of Record 1: 0d1c0e) 0d1c00: 00 00 00 00 00 00 00 00 ff 01 00 0a 00 00 00 14 ................ ParentId: 00000001 (Parent of Root) NodeNameLen: 0007 NodeNameText: 005a00490050002d003100300030 (ZIP-100) 0d1c10: 00 00 00 01 00 07 00 5a 00 49 00 50 00 2d 00 31 .......Z.I.P.-.1 RecordType: 0001 (Folder) Flags: 0000 Valence: 00000004 CNID: 00000002 (Root) 0d1c20: 00 30 00 30 00 01 00 00 00 00 00 04 00 00 00 02 .0.0............ CreateDate: b47fa9cd ContentModDate: b47fa9e1 AttribModDate: 00000000 AccessDate: 00000000 0d1c30: b4 7f a9 cd b4 7f a9 e1 00 00 00 00 00 00 00 00 ................ BackupDate: 00000000 Owner: 00000000 Group: 00000000 Permissions: 00000000 0d1c40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Device: 00000000 Rect: 0000000000000000 Flags: 03e0 Location: 00dc03c0 0d1c50: 00 00 00 00 00 00 00 00 00 00 00 00 03 e0 00 dc ................ View: 0107 Scroll: 00000000 OpenChain: c3400000 Unused: 0000 Comment: 0000 0d1c60: 03 c0 01 07 00 00 00 00 c3 40 00 00 00 00 00 00 .........@...... PutAway: 00000000 Encoding: 00000000 Reserved: 00000000 Keylen: 0006 (Start of Record 2: 0d1c7c) ParentId: 00000002 (Root) 0d1c70: 00 00 00 00 00 00 00 00 00 00 00 00 00 06 00 00 ................ NodeNameLen: 0000 RecordType: 0003 (Folder Thread) Reserved: 0000 ParentId: 00000001 (Parent of Root) NodeNameLen: 0007 NodeNameText: 005a00490050002d003100300030 (ZIP-100) 0d1c80: 00 02 00 00 00 03 00 00 00 00 00 01 00 07 00 5a ...............Z Keylen: 001a (Start of Record 3: 0d1c9c) ParentId: 00000002 (Root) 0d1c90: 00 49 00 50 00 2d 00 31 00 30 00 30 00 1a 00 00 .I.P.-.1.0.0.... NodeNameLen: 000a NodeNameText: 004400650073006b0074006f0070002000440042 (Desktop DB) 0d1ca0: 00 02 00 0a 00 44 00 65 00 73 00 6b 00 74 00 6f .....D.e.s.k.t.o RecordType: 0002 (File) Flags: 0002 Reserved: 00000000 0d1cb0: 00 70 00 20 00 44 00 42 00 02 00 02 00 00 00 00 .p. .D.B........ CNID: 00000011 CreateDate: b47fa9cd ContentModDate: b47fa9cd AttribModDate: 00000000 0d1cc0: 00 00 00 11 b4 7f a9 cd b4 7f a9 cd 00 00 00 00 ................ AccessDate: 00000000 BackupDate: 00000000 Owner: 00000000 Group: 00000000 0d1cd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Permissions: 00000000 Device: 00000000 Type: 4254464c (BTFL) Creator: 444d4752 (DMGR) 0d1ce0: 00 00 00 00 00 00 00 00 42 54 46 4c 44 4d 47 52 ........BTFLDMGR Flags: 4000 Location: 00000000 Folder: 0000 Icon: 0000 Unused: 0000000000000000 0d1cf0: 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 @............... Comment: 0000 PutAway: 00000000 Encoding: 00000000 Reserved: 00000000 DataSize: 0000000000000000 0d1d00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ ClumpSize: 24000000 Blocks: 00000000 0d1d10: 00 00 00 00 00 00 24 00 00 00 00 00 00 00 00 12 ......$......... 0d1d20: 00 00 12 1b 00 00 00 12 00 00 00 00 00 00 00 00 ................ 0d1d30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 0d1db0: 00 1a 00 00 00 02 00 0a 00 44 00 65 00 73 00 6b .........D.e.s.k 0d1dc0: 00 74 00 6f 00 70 00 20 00 44 00 46 00 02 00 02 .t.o.p. .D.F.... 0d1dd0: 00 00 00 00 00 00 00 10 b4 7f a9 cd b4 7f a9 cd ................ 0d1de0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0d1df0: 00 00 00 00 00 00 00 00 00 00 00 00 44 54 46 4c ............DTFL 0d1e00: 44 4d 47 52 40 00 00 00 00 00 00 00 00 00 00 00 DMGR@........... 0d1e10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0d1e20: 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 ................ 0d1e30: 00 00 00 80 00 00 12 2d 00 00 00 80 00 00 00 00 .......-........ 0d1e40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 0d1ec0: 00 00 00 00 00 2a 00 00 00 02 00 12 00 44 00 65 .....*.......D.e 0d1ed0: 00 73 00 6b 00 74 00 6f 00 70 00 50 00 72 00 69 .s.k.t.o.p.P.r.i 0d1ee0: 00 6e 00 74 00 65 00 72 00 73 00 20 00 44 00 42 .n.t.e.r.s. .D.B 0d1ef0: 00 02 00 02 00 00 00 00 00 00 00 12 b4 7f a9 cd ................ 0d1f00: b4 7f a9 cd 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0d1f10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0d1f20: 64 74 70 6c 64 63 64 63 40 00 00 00 00 00 00 00 dtpldcdc@....... 0d1f30: 00 00 00 00 00 00 00 00 80 00 00 00 00 00 00 00 ................ 0d1f40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 0d1f90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 1e ................ 0d1fa0: 00 00 00 00 00 00 00 01 00 00 12 ad 00 00 00 01 ................ 0d1fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 0d1fe0: 00 00 00 00 00 00 00 00 00 28 00 00 00 02 00 11 .........(...... 0d1ff0: 00 4f 00 70 00 65 00 6e 00 46 00 6f 00 6c 00 64 .O.p.e.n.F.o.l.d 0d2000: 00 65 00 72 00 4c 00 69 00 73 00 74 00 44 00 46 .e.r.L.i.s.t.D.F 0d2010: 00 0d 00 02 00 02 00 00 00 00 00 00 00 13 b4 7f ................ 0d2020: a9 e1 b4 7f a9 e1 00 00 00 00 00 00 00 00 00 00 ................ 0d2030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0d2040: 00 00 46 4f 4c 44 4d 41 43 53 40 00 00 00 00 00 ..FOLDMACS@..... 0d2050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 0d20c0: 01 1e 00 00 00 00 00 00 00 01 00 00 12 ae 00 00 ................ 0d20d0: 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0d20e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 0d2100: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 10 ................ 0d2110: 00 00 00 04 00 00 00 00 00 02 00 0a 00 44 00 65 .............D.e 0d2120: 00 73 00 6b 00 74 00 6f 00 70 00 20 00 44 00 46 .s.k.t.o.p. .D.F 0d2130: 00 06 00 00 00 11 00 00 00 04 00 00 00 00 00 02 ................ 0d2140: 00 0a 00 44 00 65 00 73 00 6b 00 74 00 6f 00 70 ...D.e.s.k.t.o.p 0d2150: 00 20 00 44 00 42 00 06 00 00 00 12 00 00 00 04 . .D.B.......... 0d2160: 00 00 00 00 00 02 00 12 00 44 00 65 00 73 00 6b .........D.e.s.k 0d2170: 00 74 00 6f 00 70 00 50 00 72 00 69 00 6e 00 74 .t.o.p.P.r.i.n.t 0d2180: 00 65 00 72 00 73 00 20 00 44 00 42 00 06 00 00 .e.r.s. .D.B.... 0d2190: 00 13 00 00 00 04 00 00 00 00 00 02 00 11 00 4f ...............O 0d21a0: 00 70 00 65 00 6e 00 46 00 6f 00 6c 00 64 00 65 .p.e.n.F.o.l.d.e 0d21b0: 00 72 00 4c 00 69 00 73 00 74 00 44 00 46 00 0d .r.L.i.s.t.D.F.. 0d21c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * Record Offsets: Rec 9: 0556 Rec 10: 058c Rec 11: 05c0 (Free space) 0d2be0: 00 00 00 00 00 00 00 00 00 00 05 c0 05 8c 05 56 ...............V Record Offsets: Rec 1: 000e Rec 2: 007c Rec 3: 009c Rec 4: 01b0 Rec 5: 02c4 Rec 6: 03e8 Rec 7: 050a Rec 8: 0530 0d2bf0: 05 30 05 0a 03 e8 02 c4 01 b0 00 9c 00 7c 00 0e .0...........|.. 0d2c00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 191c00: 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 1e ................ 191c10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 191d00: 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 1e ................ 191d10: 00 00 00 00 00 00 00 00 00 1c 00 1e ff ff 00 00 ................ 191d20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 192200: 00 00 01 00 00 00 08 0c 00 00 07 0c 00 00 00 5a ...............Z 192210: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 192300: 00 00 01 00 07 ff ff e0 1e 08 00 b8 74 08 00 ae ............t... 192310: c4 0f ff a3 84 00 00 21 84 00 80 21 84 00 00 21 .......!...!...! 192320: 84 1e b8 21 84 04 a4 21 84 08 a4 21 84 1e b8 21 ...!...!...!...! 192330: 84 00 20 21 84 00 00 21 87 ff ff e1 84 2a aa a1 .. !...!.....*.. 192340: 84 35 55 41 84 2a aa 99 87 ff ff 3d 84 00 00 3d .5UA.*.....=...= 192350: 84 00 00 19 84 4e 38 01 84 d1 45 ff 84 51 45 ff .....N8...E..QE. 192360: 84 51 45 c7 84 51 45 c7 84 4e 39 e7 84 00 01 e7 .QE..QE..N9..... 192370: 84 00 01 e7 87 ff ff e7 c4 00 01 e7 7c 00 01 ff ............|... 192380: 07 ff ff ff 07 ff ff e0 1f ff ff f8 7f ff ff fe ................ 192390: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ * 1923f0: ff ff ff ff ff ff ff ff ff ff ff ff 7f ff ff ff ................ 192400: 07 ff ff ff 00 00 02 00 00 00 0f ff ff ff ff ff ................ 192410: ff ff ff ff ff f0 00 00 00 0f ff fd dd dd fc cc ................ 192420: cc cc cc cc fd ff f0 00 0f ff cf dd dd dd fc cc ................ 192430: cc cc cc cc fd fc ff f0 ff dd cf dd dd dd ff ff ................ 192440: ff ff ff ff fd fc dd ff fd dd cf dd dd dd dd dd ................ 192450: dd dd dd dd dd fc dd df fd dd cf dd dd dd dd dd ................ 192460: fd dd dd dd dd fc dd df fd dd cf dd dd dd dd dd ................ 192470: dd dd dd dd dd fc dd df fd dd cf dd dd df ff fd ................ 192480: fd ff fd dd dd fc dd df fd dd cf dd dd dd df dd ................ 192490: fd fd df dd dd fc dd df fd dd cf dd dd dd fd dd ................ 1924a0: fd fd df dd dd fc dd df fd dd cf dd dd df ff fd ................ 1924b0: fd ff fd dd dd fc dd df fd dd cf dd dd dd dd dd ................ 1924c0: dd fd dd dd dd fc dd df fd dd cf dd dd dd dd dd ................ 1924d0: dd dd dd dd dd fc dd df fd dd cf ff ff ff ff ff ................ 1924e0: ff ff ff ff ff fc dd df fd dd cf 00 00 f3 33 33 ..............33 1924f0: 33 33 33 33 33 fc dd df fd dd cf 00 00 f3 33 33 33333.........33 * 192510: 33 33 33 33 33 05 5d df fd dd cf ff ff ff ff ff 33333.]......... 192520: ff ff ff ff f0 55 55 df fd dd cf 00 00 00 00 00 .....UU......... 192530: 00 00 00 00 00 55 55 df fd dd cf 00 00 00 00 00 .....UU......... 192540: 00 00 00 00 00 05 5d df fd dd cf 00 0f 00 ff f0 ......]......... 192550: 00 ff f0 00 00 0d dd df fd dd cf 00 ff 0f 00 0f ................ 192560: 0f 00 0f 05 55 55 55 55 fd dd cf 00 0f 0f 00 0f ....UUUU........ 192570: 0f 00 0f 05 33 33 33 35 fd dd cf 00 0f 0f 00 0f ....3335........ 192580: 0f 00 0f 05 33 00 03 35 fd dd cf 00 0f 0f 00 0f ....3..5........ 192590: 0f 00 0f 05 33 00 03 35 fd dd cf 00 0f 00 ff f0 ....3..5........ 1925a0: 00 ff f0 05 33 30 03 35 fd dd cf 00 00 00 00 00 ....30.5........ 1925b0: 00 00 00 05 33 30 03 35 fd dd cf 00 00 00 00 00 ....30.5........ 1925c0: 00 00 00 05 33 30 03 35 fd dd cf ff ff ff ff ff ....30.5........ 1925d0: ff ff ff f5 33 30 03 35 fd dd cf dd dd dd dd dd ....30.5........ 1925e0: dd dd dd d5 33 30 03 35 0f ff ff dd dd dd dd dd ....30.5........ 1925f0: dd dd dd d5 33 33 33 35 00 00 0f ff ff ff ff ff ....3335........ 192600: ff ff ff f5 55 55 55 55 00 00 04 00 00 00 00 00 ....UUUU........ 192610: 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ 192620: ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00 ff ................ 192630: ff ff ff f8 f8 f8 f8 f8 ff f6 f6 f6 f6 f6 f6 f6 ................ 192640: f6 f6 f6 f6 ff f8 ff ff ff 00 00 00 00 ff ff ff ................ 192650: f6 ff f8 f8 f8 f8 f8 f8 ff f6 f6 f6 f6 f6 f6 f6 ................ 192660: f6 f6 f6 f6 ff f8 ff f6 ff ff ff 00 ff ff f8 f8 ................ 192670: f6 ff f8 f8 f8 f8 f8 f8 ff ff ff ff ff ff ff ff ................ 192680: ff ff ff ff ff f8 ff f6 f8 f8 ff ff ff f8 f8 f8 ................ 192690: f6 ff f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 ................ 1926a0: f8 f8 f8 f8 f8 f8 ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 1926b0: f6 ff f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 ff f8 f8 f8 ................ 1926c0: f8 f8 f8 f8 f8 f8 ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 1926d0: f6 ff f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 ................ 1926e0: f8 f8 f8 f8 f8 f8 ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 1926f0: f6 ff f8 f8 f8 f8 f8 ff ff ff ff f8 ff f8 ff ff ................ 192700: ff f8 f8 f8 f8 f8 ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 192710: f6 ff f8 f8 f8 f8 f8 f8 f8 ff f8 f8 ff f8 ff f8 ................ 192720: f8 ff f8 f8 f8 f8 ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 192730: f6 ff f8 f8 f8 f8 f8 f8 ff f8 f8 f8 ff f8 ff f8 ................ 192740: f8 ff f8 f8 f8 f8 ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 192750: f6 ff f8 f8 f8 f8 f8 ff ff ff ff f8 ff f8 ff ff ................ 192760: ff f8 f8 f8 f8 f8 ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 192770: f6 ff f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 ff f8 ................ 192780: f8 f8 f8 f8 f8 f8 ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 192790: f6 ff f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 ................ 1927a0: f8 f8 f8 f8 f8 f8 ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 1927b0: f6 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ 1927c0: ff ff ff ff ff ff ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 1927d0: f6 ff 00 00 00 00 ff d8 d8 d8 d8 d8 d8 d8 d8 d8 ................ 1927e0: d8 d8 d8 d8 d8 d8 ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 1927f0: f6 ff 00 00 00 00 ff d8 d8 d8 d8 d8 d8 d8 d8 d8 ................ 192800: d8 d8 d8 d8 d8 d8 ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 192810: f6 ff 00 00 00 00 ff d8 d8 d8 d8 d8 d8 d8 d8 d8 ................ 192820: d8 d8 d8 d8 d8 d8 00 b0 b0 f8 f8 ff ff f8 f8 f8 ................ 192830: f6 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ 192840: ff ff ff ff ff 00 b0 b0 b0 b0 f8 ff ff f8 f8 f8 ................ 192850: f6 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 192860: 00 00 00 00 00 00 b0 b0 b0 b0 f8 ff ff f8 f8 f8 ................ 192870: f6 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 192880: 00 00 00 00 00 00 00 b0 b0 f8 f8 ff ff f8 f8 f8 ................ 192890: f6 ff 00 00 00 ff 00 00 ff ff ff 00 00 00 ff ff ................ 1928a0: ff 00 00 00 00 00 00 f8 f8 f8 f8 ff ff f8 f8 f8 ................ 1928b0: f6 ff 00 00 ff ff 00 ff 00 00 00 ff 00 ff 00 00 ................ 1928c0: 00 ff 00 b0 b0 b0 b0 b0 b0 b0 b0 b0 ff f8 f8 f8 ................ 1928d0: f6 ff 00 00 00 ff 00 ff 00 00 00 ff 00 ff 00 00 ................ 1928e0: 00 ff 00 b0 d8 d8 d8 d8 d8 d8 d8 b0 ff f8 f8 f8 ................ 1928f0: f6 ff 00 00 00 ff 00 ff 00 00 00 ff 00 ff 00 00 ................ 192900: 00 ff 00 b0 d8 d8 00 00 00 d8 d8 b0 ff f8 f8 f8 ................ 192910: f6 ff 00 00 00 ff 00 ff 00 00 00 ff 00 ff 00 00 ................ 192920: 00 ff 00 b0 d8 d8 00 00 00 d8 d8 b0 ff f8 f8 f8 ................ 192930: f6 ff 00 00 00 ff 00 00 ff ff ff 00 00 00 ff ff ................ 192940: ff 00 00 b0 d8 d8 d8 00 00 d8 d8 b0 ff f8 f8 f8 ................ 192950: f6 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 192960: 00 00 00 b0 d8 d8 d8 00 00 d8 d8 b0 ff f8 f8 f8 ................ 192970: f6 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 192980: 00 00 00 b0 d8 d8 d8 00 00 d8 d8 b0 ff f8 f8 f8 ................ 192990: f6 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ 1929a0: ff ff ff b0 d8 d8 d8 00 00 d8 d8 b0 ff f8 f8 f8 ................ 1929b0: f6 ff f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 ................ 1929c0: f8 f8 f8 b0 d8 d8 d8 00 00 d8 d8 b0 00 ff ff ff ................ 1929d0: ff ff f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 ................ 1929e0: f8 f8 f8 b0 d8 d8 d8 d8 d8 d8 d8 b0 00 00 00 00 ................ 1929f0: 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ 192a00: ff ff ff b0 b0 b0 b0 b0 b0 b0 b0 b0 00 00 01 00 ................ 192a10: 00 00 08 0c 00 00 07 0c 00 00 00 5a 05 a3 c5 a8 ...........Z.... 192a20: 29 22 00 00 00 1c 00 5a 00 02 49 43 4e 23 00 00 )".....Z..ICN#.. 192a30: 00 1a 69 63 6c 34 00 00 00 26 69 63 6c 38 00 00 ..icl4...&icl8.. 192a40: 00 32 bf b9 ff ff 00 00 00 00 05 a3 c4 cc bf b9 .2.............. 192a50: ff ff 00 00 01 04 05 a3 c4 d0 bf b9 ff ff 00 00 ................ 192a60: 03 08 05 a3 c4 bc 00 00 00 00 00 00 00 00 00 00 ................ 192a70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 24ec00: 00 00 00 00 00 00 00 00 01 00 00 03 00 00 00 01 ................ 24ec10: 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 ................ 24ec20: 02 00 00 25 00 00 00 12 00 00 00 10 00 00 00 00 ...%............ 24ec30: 20 00 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 ............... 24ec40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 24ec70: 00 00 00 00 00 00 00 00 02 0a 01 00 00 00 00 00 ................ 24ec80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 24ecf0: 00 00 00 00 00 00 00 00 c0 00 00 00 00 00 00 00 ................ 24ed00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 24edf0: 00 00 00 00 00 00 00 00 01 f8 00 f8 00 78 00 0e .............x.. 24ee00: 00 00 00 00 00 00 00 00 ff 01 00 01 00 00 0b 01 ................ 24ee10: 61 74 63 6f 61 74 63 6f fe 00 00 00 00 00 00 00 atcoatco........ 24ee20: 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 ................ 24ee30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 24eff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 24 00 0e .............$.. 24f000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 251000: 00 02 00 00 00 00 00 00 01 00 00 03 00 00 00 01 ................ 251010: 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 ................ 251020: 02 00 00 07 00 00 00 09 00 00 00 07 00 00 00 00 ................ 251030: 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 251040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 2510f0: 00 00 00 00 00 00 00 00 c0 00 00 00 00 00 00 00 ................ 251100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 2511f0: 00 00 00 00 00 00 00 00 01 f8 00 f8 00 78 00 0e .............x.. 251200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 261000: 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 1e ................ 261010: 79 80 7f 79 7f 80 7f 79 7f 79 aa 79 7f 80 7f 79 y..y...y.y.y...y 261020: 7f 79 7f 7f 79 7f 79 7f 80 7f 79 80 7f 79 80 7f .y..y.y...y..y.. 261030: 79 a4 7f 80 7f 79 80 73 7f a4 7f a4 7f 79 7f 79 y....y.s.....y.y 261040: 80 7f a4 7f 80 7f a4 7f 80 7f 79 7f 7f 79 7f a4 ..........y..y.. 261050: 7f 79 7f a4 7f 79 7f a4 7f 79 7f 79 7f 7f a4 7f .y...y...y.y.... 261060: 79 7f 7f 79 7f 7f a4 7f 79 7f 79 7f 7f a4 7f 79 y..y....y.y....y 261070: a4 7f 79 7f 7f 79 7f 79 7f 79 7f 79 7f 79 aa 79 ..y..y.y.y.y.y.y 261080: 7f 80 7f 79 80 7f 7f 80 7f 79 7f 79 7f a4 7f 79 ...y.....y.y...y 261090: 7f 79 7f 79 7f a4 80 7f 4f 4e 54 f6 55 4e 2a 4f .y.y....ONT.UN*O 2610a0: 4f 55 2a 00 00 4f 06 79 7f aa aa ea 01 f6 09 ff OU*..O.y........ 2610b0: ea aa a4 5b 4f 06 2a 00 4e fe 00 61 06 4e 00 4e ...[O.*.N..a.N.N 2610c0: 00 4f 7f 5b a4 80 a3 a4 a4 86 a4 80 a4 80 aa a4 .O.[............ 2610d0: a4 aa a4 a4 aa a3 aa a4 a4 80 aa a4 a4 86 a4 80 ................ 2610e0: a3 80 a4 80 a4 7f a4 86 a4 a4 80 a3 80 a4 aa a4 ................ 2610f0: a4 80 a3 80 a3 86 a4 a3 a4 aa a3 80 aa 80 a4 80 ................ 261100: 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 1e ................ 261110: 00 00 00 00 00 00 00 00 00 1c 00 1e ff ff fe a4 ................ 261120: 58 aa a4 a3 fb a9 a4 80 aa 7f a4 a3 fb a3 a4 80 X............... 261130: a4 7f a4 80 a4 86 aa a4 80 a4 80 aa a4 80 a4 a4 ................ 261140: 80 aa 80 aa 80 a4 80 aa a4 a4 7f aa 80 a4 7f a4 ................ 261150: 86 a4 80 a4 80 a3 80 aa 80 a4 86 a4 80 a3 fb 7f ................ 261160: aa 80 aa a4 7f a4 86 a3 80 a4 80 a4 86 a4 80 a4 ................ 261170: 86 a4 86 a4 80 a4 80 a4 a4 aa fe a4 7f aa a4 80 ................ 261180: a4 80 aa 80 a3 80 aa 80 aa a4 a4 86 a4 7f aa 80 ................ 261190: a4 a4 a3 aa aa a4 80 a4 7f a4 aa a4 a4 a3 fb a3 ................ 2611a0: a4 aa 80 a3 fb a3 a4 a4 80 aa 80 a3 80 aa 80 aa ................ 2611b0: a3 aa a4 a4 7f aa a4 a3 80 a4 80 a3 80 aa 80 a4 ................ 2611c0: 80 a4 a4 aa aa a4 80 a4 aa a4 86 a4 86 a4 80 a3 ................ 2611d0: 80 aa a4 a4 aa a3 aa a4 a4 80 aa a4 a4 86 a4 80 ................ 2611e0: a3 80 a4 80 a4 7f a4 86 a4 a4 80 a3 80 a4 aa a4 ................ 2611f0: a4 80 a3 80 a3 86 a4 a3 a4 aa a3 80 aa 20 80 a4 ............. .. 261200: 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 1e ................ 261210: aa a4 80 a4 86 a4 a3 fb a3 86 a4 80 aa 80 aa fe ................ 261220: a4 58 aa a4 a3 fb a9 a4 80 aa 7f a4 a3 fb a3 a4 .X.............. 261230: 80 a4 7f a4 80 a4 86 aa a4 80 a4 80 aa a4 80 a4 ................ 261240: a4 80 aa 80 aa 80 a4 80 aa a4 a4 7f aa 80 a4 7f ................ 261250: a4 86 a4 80 a4 80 a3 80 aa 80 a4 86 a4 80 a3 fb ................ 261260: 7f aa 80 aa a4 7f a4 86 a3 80 a4 80 a4 86 a4 80 ................ 261270: a4 86 a4 86 a4 80 a4 80 a4 a4 aa fe a4 25 aa a4 .............%.. 261280: 80 a4 80 aa 80 a3 80 aa 80 a4 80 a4 80 a4 7f 55 ...............U 261290: 4e 4f 06 4f 54 f7 4f 55 30 4f 4f 55 4f 55 2a 79 NO.OT.OU0OOUOU*y 2612a0: a4 a4 ce ef 01 a5 06 ff ef aa a3 79 4e 4f fe 00 ...........yNO.. 2612b0: 03 4f 4e 06 2a fe 00 05 06 00 79 4f 7f 79 fd 7f .ON.*.....yO.y.. 2612c0: 00 79 f8 7f 02 79 7f 79 fb 7f 02 79 7f 79 fa 7f .y...y.y...y.y.. 2612d0: 00 79 fb 7f 00 79 fb 7f 00 79 fe 7f 03 79 7f 7f .y...y...y...y.. 2612e0: 79 fd 7f 00 79 fc 7f 00 79 fe 7f 00 79 fe 7f 0e y...y...y...y... 2612f0: 79 7f 7f 79 7f 7f 79 7f 7f 79 7f 7f 79 7f 79 fe y..y..y..y..y.y. 261300: 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 1e ................ 261310: 00 00 00 00 00 00 00 00 00 1c 00 1e ff ff fe 7f ................ 261320: 04 79 5b 7f 7f 79 fd 7f 00 79 fe 7f 13 79 7f 7f .y[..y...y...y.. 261330: 79 7f 79 7f 9d 7f 7f 79 7f 79 7f 79 7f 7f 79 7f y.y....y.y.y..y. 261340: 79 fd 7f 00 79 fd 7f 01 a3 79 fc 7f 00 79 fe 7f y...y....y...y.. 261350: 02 79 7f 79 fe 7f 00 79 fe 7f 08 79 7f 79 7f 7f .y.y...y...y.y.. 261360: 79 7f 7f 79 fd 7f 01 79 79 fe 7f 02 a4 7f 79 fe y..y...yy.....y. 261370: 7f 00 79 fd 7f 00 79 fb 7f 07 79 7f 7f 79 7f 79 ..y...y...y..y.y 261380: 7f 79 fe 7f 00 79 fa 7f 07 79 7f 7f 79 7f 7f 79 .y...y...y..y..y 261390: 79 fe 7f 04 79 7f 79 7f 79 fa 7f 02 79 7f 79 fb y...y.y.y...y.y. 2613a0: 7f 02 79 7f 79 fa 7f 00 79 fb 7f 00 79 fb 7f 00 ..y.y...y...y... 2613b0: 79 fe 7f 03 79 7f 7f 79 fd 7f 00 79 fc 7f 00 79 y...y..y...y...y 2613c0: fe 7f 00 79 fe 7f 0e 79 7f 7f 79 7f 7f 79 7f 7f ...y...y..y..y.. 2613d0: 79 7f 7f 79 7f 79 fe 7f 00 79 fe 7f 06 79 7f 7f y..y.y...y...y.. 2613e0: 79 7f 7f 79 f8 7f 02 9d 7f 79 fd 7f 01 79 a3 fe y..y.....y...y.. 2613f0: 7f 02 79 7f 79 fe 7f 04 79 5b 7f 7f 79 fd 7f 00 ..y.y...y[..y... 261400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 5f98c00: 48 2b 00 04 00 00 01 00 38 2e 31 30 00 00 00 00 H+......8.10.... 5f98c10: b4 7f 39 4a b4 7f a9 cc 00 00 00 00 b4 7f a9 cc ..9J............ 5f98c20: 00 00 00 00 00 00 00 00 00 00 02 00 00 02 fc 6d ...............m 5f98c30: 00 02 f0 48 00 00 12 1b 00 00 20 00 00 00 20 00 ...H...... ... . 5f98c40: 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 01 ................ 5f98c50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 5f98c70: 00 00 00 00 00 00 60 00 00 00 60 00 00 00 00 30 ......`...`....0 5f98c80: 00 00 00 03 00 00 00 30 00 00 00 00 00 00 00 00 .......0........ 5f98c90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 5f98cc0: 00 00 00 00 00 0b f0 00 00 0b f0 00 00 00 05 f8 ................ 5f98cd0: 00 00 00 33 00 00 05 f8 00 00 00 00 00 00 00 00 ...3............ 5f98ce0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 5f98d10: 00 00 00 00 00 0b f0 00 00 0b f0 00 00 00 05 f8 ................ 5f98d20: 00 00 06 2b 00 00 05 f8 00 00 00 00 00 00 00 00 ...+............ 5f98d30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 5f99200: 42 44 b4 7f 39 4a b4 7f 39 4b 83 00 00 05 00 03 BD..9J..9K...... 5f99210: 00 09 fe e7 00 00 06 00 00 00 06 00 00 13 00 00 ................ 5f99220: 00 15 00 00 07 5a 49 50 2d 31 30 30 00 00 00 00 .....ZIP-100.... 5f99230: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 5f99240: 00 00 00 00 00 00 00 00 00 0c 00 00 12 00 00 00 ................ 5f99250: 12 00 00 00 00 00 00 05 00 00 00 00 00 00 00 02 ................ 5f99260: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 5f99270: 00 00 00 00 00 00 00 00 00 00 00 00 48 2b 00 18 ............H+.. 5f99280: fe cf 00 00 12 00 00 00 00 03 00 00 00 00 00 00 ................ 5f99290: 00 00 00 00 12 00 00 03 00 03 00 00 00 00 00 00 ................ 5f992a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * hfsplus-1.0.4/libhfsp/test/dump3e.txt0100644000000000000000000012571607441220605016257 0ustar rootroot# This is a commented dump of the end of my 2.5 GB HFS+ Partition # # $Id: dump3e.txt,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ # # This dump was created with # dd bs=4096 skip=617720 if=/dev/hda13 | xxd # I adjusted the offsets manually # 96b04000: 3b81 0060 3bc1 0068 3ba1 006c 9001 005c ;..`;..h;..l...\ 96b04010: 3b60 0000 8001 004c 9001 0060 8001 0050 ;`.....L...`...P 96b04020: 9001 0064 8001 0054 9001 0068 8001 0058 ...d...T...h...X 96b04030: 9001 006c 4800 0050 8061 0068 389f 0070 ...lH..P.a.h8..p 96b04040: 8063 0010 8183 0000 818c 0030 4801 6971 .c.........0H.iq 96b04050: 8041 0014 8001 0060 9001 005c 8001 005c .A.....`...\...\ 96b04060: 2800 0000 4182 001c 8061 0064 389c 0000 (...A....a.d8... 96b04070: 38bd 0000 38de 0000 4800 32b5 6000 0000 8...8...H.2.`... 96b04080: 3b7b 0001 801f 002c 7c1b 0000 4180 ffac ;{.....,|...A... 96b04090: 807f 007c 3880 0000 8183 0000 818c 00a0 ...|8........... 96b040a0: 4801 691d 8041 0014 3800 0000 901f 0088 H.i..A..8....... 96b040b0: 807f 007c 8183 0000 818c 0014 4801 6901 ...|........H.i. 96b040c0: 8041 0014 3860 0000 8001 0098 3821 0090 .A..8`......8!.. 96b040d0: 7c08 03a6 bb61 ffec 4e80 0020 80a3 0060 |....a..N.. ...` 96b040e0: 8003 0064 3860 0000 90a4 0000 9004 0004 ...d8`.......... 96b040f0: 4e80 0020 80a3 0068 8003 006c 3860 0000 N.. ...h...l8`.. 96b04100: 90a4 0000 9004 0004 4e80 0020 7c08 02a6 ........N.. |... 96b04110: 93e1 fffc 7c7f 1b78 9001 0008 9421 ffb0 ....|..x.....!.. 96b04120: 80a4 0000 8004 0004 90a3 0050 9003 0054 ...........P...T 96b04130: 8003 0088 2c00 0000 4182 0040 801f 007c ....,...A..@...| 96b04140: 2800 0000 4182 0034 387f 0000 3881 0038 (...A..48...8..8 96b04150: 819f 0000 818c 004c 4801 6865 8041 0014 .......LH.he.A.. 96b04160: 807f 007c 3881 0038 8183 0000 818c 003c ...|8..8.......< 96b04170: 4801 684d 8041 0014 801f 0090 2c00 0000 H.hM.A......,... 96b04180: 4082 0014 807f 0080 8063 0018 4801 60e1 @........c..H.`. 96b04190: 8041 0014 8001 0058 3821 0050 3860 0000 .A.....X8!.P8`.. 96b041a0: 7c08 03a6 83e1 fffc 4e80 0020 80a3 0050 |.......N.. ...P 96b041b0: 8003 0054 3860 0000 90a4 0000 9004 0004 ...T8`.......... 96b041c0: 4e80 0020 7c08 02a6 9001 0008 9421 ffc0 N.. |........!.. 96b041d0: 8003 000c 3864 0000 7c04 0378 4801 5149 ....8d..|..xH.QI 96b041e0: 8041 0014 8001 0048 3860 0000 3821 0040 .A.....H8`..8!.@ 96b041f0: 7c08 03a6 4e80 0020 7c08 02a6 9001 0008 |...N.. |....... 96b04200: 9421 ffc0 8003 0018 3864 0000 7c04 0378 .!......8d..|..x 96b04210: 4801 5115 8041 0014 8001 0048 3860 0000 H.Q..A.....H8`.. 96b04220: 3821 0040 7c08 03a6 4e80 0020 8063 002c 8!.@|...N.. .c., 96b04230: 4e80 0020 7c08 02a6 93e1 fffc 3be3 0000 N.. |.......;... 96b04240: 9001 0008 3800 0000 9421 ff90 9001 0060 ....8....!.....` 96b04250: 3881 0060 9001 0064 9001 0050 9001 0054 8..`...d...P...T 96b04260: 9001 0040 9001 0044 9001 0048 9001 004c ...@...D...H...L 96b04270: 8063 007c 8183 0000 818c 0058 4801 6741 .c.|.......XH.gA 96b04280: 8041 0014 387f 0000 3881 0050 819f 0000 .A..8...8..P.... 96b04290: 818c 004c 4801 6729 8041 0014 3861 0060 ...LH.g).A..8a.` 96b042a0: 3881 0040 4801 5fe1 8041 0014 8061 0060 8..@H._..A...a.` 96b042b0: 8001 0040 7c03 0000 4080 0014 7c03 0050 ...@|...@...|..P 96b042c0: 7c03 0214 9001 0060 4800 0024 8001 0050 |......`H..$...P 96b042d0: 8081 0048 7c03 0214 7c00 2000 4081 0010 ...H|...|. .@... 96b042e0: 7c04 0050 7c00 1850 9001 0060 8061 0064 |..P|..P...`.a.d 96b042f0: 8001 0044 7c03 0000 4080 0014 7c03 0050 ...D|...@...|..P 96b04300: 7c03 0214 9001 0064 4800 0024 8001 0054 |......dH..$...T 96b04310: 8081 004c 7c03 0214 7c00 2000 4081 0010 ...L|...|. .@... 96b04320: 7c04 0050 7c00 1850 9001 0064 807f 007c |..P|..P...d...| 96b04330: 3881 0060 8183 0000 818c 004c 4801 6681 8..`.......LH.f. 96b04340: 8041 0014 8001 0078 3821 0070 7c08 03a6 .A.....x8!.p|... 96b04350: 83e1 fffc 4e80 0020 7c08 02a6 bfc1 fff8 ....N.. |....... 96b04360: 3be4 0000 3bc3 0000 9001 0008 9421 ffc0 ;...;........!.. 96b04370: 93e3 004c 8003 0088 2c00 0000 4182 0080 ...L....,...A... 96b04380: 807e 007c 2803 0000 4182 0074 2c1f 0000 .~.|(...A..t,... 96b04390: 4182 0044 801e 0098 2c00 0000 4182 000c A..D....,...A... 96b043a0: 7fc3 f378 4bff fe91 807e 0080 7fe4 fb78 ...xK....~.....x 96b043b0: 4800 2149 6000 0000 807e 007c 7fe4 fb78 H.!I`....~.|...x 96b043c0: 8183 0000 818c 00a0 4801 65f5 8041 0014 ........H.e..A.. 96b043d0: 4800 003c 8183 0000 7fe4 fb78 818c 00a0 H..<.......x.... 96b043e0: 4801 65dd 8041 0014 807e 0080 7fe4 fb78 H.e..A...~.....x 96b043f0: 4800 2109 6000 0000 4800 0014 807e 0080 H.!.`...H....~.. 96b04400: 7fe4 fb78 4800 20f5 6000 0000 8001 0048 ...xH. .`......H 96b04410: 3821 0040 3860 0000 7c08 03a6 bbc1 fff8 8!.@8`..|....... 96b04420: 4e80 0020 7c08 02a6 9001 0008 9421 ffc0 N.. |........!.. 96b04430: 8003 0088 2c00 0000 4182 0028 8003 007c ....,...A..(...| 96b04440: 2800 0000 4182 001c 7c03 0378 8183 0000 (...A...|..x.... 96b04450: 818c 00a4 4801 6569 8041 0014 4800 0008 ....H.ei.A..H... 96b04460: 8063 004c 8001 0048 3821 0040 7c08 03a6 .c.L...H8!.@|... 96b04470: 4e80 0020 3860 0000 4e80 0020 3860 0000 N.. 8`..N.. 8`.. 96b04480: 4e80 0020 3860 ffff 4e80 0020 3860 0000 N.. 8`..N.. 8`.. 96b04490: 4e80 0020 3860 ffff 4e80 0020 3860 0001 N.. 8`..N.. 8`.. 96b044a0: 4e80 0020 7c08 02a6 bfc1 fff8 3bc3 0000 N.. |.......;... 96b044b0: 3be4 0000 9001 0008 9421 ffc0 8003 0088 ;........!...... 96b044c0: 2c00 0000 4182 002c 807e 007c 2803 0000 ,...A..,.~.|(... 96b044d0: 4182 0020 8183 0000 7fe4 fb78 818c 004c A.. .......x...L 96b044e0: 4801 64dd 8041 0014 3860 0000 4800 0030 H.d..A..8`..H..0 96b044f0: 807e 0080 7fe4 fb78 80be 0058 80de 005c .~.....x...X...\ 96b04500: 4800 1e99 6000 0000 809f 0000 3860 0000 H...`.......8`.. 96b04510: 801f 0004 909e 0058 901e 005c 8001 0048 .......X...\...H 96b04520: 3821 0040 7c08 03a6 bbc1 fff8 4e80 0020 8!.@|.......N.. 96b04530: 8003 0088 2c00 0000 4082 0010 8003 0098 ....,...@....... 96b04540: 2c00 0000 4182 0024 80a3 007c 2805 0000 ,...A..$...|(... 96b04550: 4182 0018 8005 0020 9004 0000 8005 0024 A...... .......$ 96b04560: 9004 0004 4800 0014 80a3 0058 8003 005c ....H......X...\ 96b04570: 90a4 0000 9004 0004 3860 0000 4e80 0020 ........8`..N.. 96b04580: 3860 0000 4e80 0020 7c08 02a6 bf61 ffec 8`..N.. |....a.. 96b04590: 7c7f 1b78 9001 0008 9421 ff70 8003 002c |..x.....!.p..., 96b045a0: 2c00 0000 4082 000c 38a0 0000 4800 0008 ,...@...8...H... 96b045b0: 38a0 ffff 90a1 0048 387f 0024 3800 0000 8......H8..$8... 96b045c0: 3881 004c 90a1 004c 38c1 0054 38a1 0058 8..L...L8..T8..X 96b045d0: 9061 0050 9001 0054 9001 0058 8001 0048 .a.P...T...X...H 96b045e0: 2800 0000 4182 0010 8061 0050 4800 2d41 (...A....a.PH.-A 96b045f0: 6000 0000 8001 0048 3b81 0060 3bc1 0068 `......H;..`;..h 96b04600: 3ba1 006c 9001 005c 3b60 0000 8001 004c ;..l...\;`.....L 96b04610: 9001 0060 8001 0050 9001 0064 8001 0054 ...`...P...d...T 96b04620: 9001 0068 8001 0058 9001 006c 4800 004c ...h...X...lH..L 96b04630: 8061 0068 8063 0010 8183 0000 818c 0040 .a.h.c.........@ 96b04640: 4801 637d 8041 0014 8001 0060 9001 005c H.c}.A.....`...\ 96b04650: 8001 005c 2800 0000 4182 001c 8061 0064 ...\(...A....a.d 96b04660: 389c 0000 38bd 0000 38de 0000 4800 2cc1 8...8...8...H.,. 96b04670: 6000 0000 3b7b 0001 801f 002c 7c1b 0000 `...;{.....,|... 96b04680: 4180 ffb0 8001 0098 3821 0090 3860 0000 A.......8!..8`.. 96b04690: 7c08 03a6 bb61 ffec 4e80 0020 3860 0001 |....a..N.. 8`.. 96b046a0: 4e80 0020 7c08 02a6 bf41 ffe8 7c9a 2379 N.. |....A..|.#y 96b046b0: 3be3 0000 9001 0008 9421 ff80 4082 0010 ;........!..@... 96b046c0: 3c60 8000 3863 4005 4800 01b8 90bf 0078 <`..8c@.H......x 96b046d0: 3860 0020 4801 4b01 8041 0014 7c7b 1b79 8`. H.K..A..|{.y 96b046e0: 4182 0020 281f 0000 389f 0000 4182 0008 A.. (...8...A... 96b046f0: 3884 0004 7f63 db78 4800 17c5 6000 0000 8....c.xH...`... 96b04700: 281a 0000 937f 0080 4182 0050 7f43 d378 (.......A..P.C.x 96b04710: 3882 0f84 819a 0000 38bf 0074 818c 0008 8.......8..t.... 96b04720: 4801 629d 8041 0014 2c03 0000 4082 0020 H.b..A..,...@.. 96b04730: 807f 0074 389f 0070 8183 0000 818c 0018 ...t8..p........ 96b04740: 4801 627d 8041 0014 4800 0010 3c60 8000 H.b}.A..H...<`.. 96b04750: 3863 4005 4800 012c 7fe3 fb78 819f 0000 8c@.H..,...x.... 96b04760: 818c 0100 4801 6259 8041 0014 2c03 0000 ....H.bY.A..,... 96b04770: 4182 0108 7fe3 fb78 837f 0040 819f 0000 A......x...@.... 96b04780: 818c 0104 4801 6239 8041 0014 2c03 0000 ....H.b9.A..,... 96b04790: 4182 00c8 3ba1 0054 3b40 0000 3bc0 0000 A...;..T;@..;... 96b047a0: 4800 009c 807f 003c 7f83 f02e 807c 0010 H......<.....|.. 96b047b0: 8183 0000 818c 0014 4801 6205 8041 0014 ........H.b..A.. 96b047c0: 387f 0000 389c 0000 819f 0000 818c 010c 8...8........... 96b047d0: 4801 61ed 8041 0014 2c03 0000 4182 0058 H.a..A..,...A..X 96b047e0: 815c 0020 3800 0000 813c 001c 391c 0014 .\. 8....<..9... 96b047f0: 38fd 0000 389f 0070 9001 0054 9001 0058 8...8..p...T...X 96b04800: 807c 0010 80dc 0004 8183 0000 80bc 0000 .|.............. 96b04810: 818c 001c 4801 61a9 8041 0014 387f 0000 ....H.a..A..8... 96b04820: 389c 0000 819f 0000 818c 0110 4801 6191 8...........H.a. 96b04830: 8041 0014 3b5a 0001 3bde 0004 7c1a d800 .A..;Z..;...|... 96b04840: 4180 ff64 7fe3 fb78 819f 0000 818c 0108 A..d...x........ 96b04850: 4801 616d 8041 0014 7fe3 fb78 809f 0080 H.am.A.....x.... 96b04860: 819f 0000 818c 00f0 4801 6155 8041 0014 ........H.aU.A.. 96b04870: 3860 0000 4800 000c 3c60 8000 3863 4005 8`..H...<`..8c@. 96b04880: 8001 0088 3821 0080 7c08 03a6 bb41 ffe8 ....8!..|....A.. 96b04890: 4e80 0020 4e80 0020 7c08 02a6 bf41 ffe8 N.. N.. |....A.. 96b048a0: 7c7e 1b78 9001 0008 9421 ff70 8003 002c |~.x.....!.p..., 96b048b0: 2c00 0000 4082 000c 38a0 0000 4800 0008 ,...@...8...H... 96b048c0: 38a0 ffff 90a1 0048 387e 0024 3800 0000 8......H8~.$8... 96b048d0: 3881 004c 90a1 004c 38c1 0054 38a1 0058 8..L...L8..T8..X 96b048e0: 9061 0050 9001 0054 9001 0058 8001 0048 .a.P...T...X...H 96b048f0: 2800 0000 4182 0010 8061 0050 4800 2a31 (...A....a.PH.*1 96b04900: 6000 0000 8001 0048 3be1 0060 3ba1 0068 `......H;..`;..h 96b04910: 3b81 006c 9001 005c 8001 004c 9001 0060 ;..l...\...L...` 96b04920: 8001 0050 9001 0064 8001 0054 9001 0068 ...P...d...T...h 96b04930: 8001 0058 9001 006c 807e 0080 2803 0000 ...X...l.~..(... 96b04940: 4182 0018 3880 0001 4800 15f1 6000 0000 A...8...H...`... 96b04950: 3800 0000 901e 0080 3b40 0000 4800 00a0 8.......;@..H... 96b04960: 8361 0068 807b 0010 8183 0000 818c 0020 .a.h.{......... 96b04970: 4801 604d 8041 0014 807b 0010 8183 0000 H.`M.A...{...... 96b04980: 818c 0018 4801 6039 8041 0014 281b 0000 ....H.`9.A..(... 96b04990: 4182 003c 807b 0010 2803 0000 4182 0014 A..<.{..(...A... 96b049a0: 8183 0000 818c 0010 4801 6015 8041 0014 ........H.`..A.. 96b049b0: 387b 0004 3880 ffff 4800 4855 6000 0000 8{..8...H.HU`... 96b049c0: 7f63 db78 4801 47e1 8041 0014 8001 0060 .c.xH.G..A.....` 96b049d0: 9001 005c 8001 005c 2800 0000 4182 001c ...\...\(...A... 96b049e0: 8061 0064 389f 0000 38bc 0000 38dd 0000 .a.d8...8...8... 96b049f0: 4800 293d 6000 0000 3b5a 0001 801e 002c H.)=`...;Z....., 96b04a00: 7c1a 0000 4180 ff5c 387e 0024 4800 2665 |...A..\8~.$H.&e 96b04a10: 6000 0000 387e 003c 3880 0000 38a0 ffff `...8~.<8...8... 96b04a20: 4800 2295 6000 0000 807e 0074 2803 0000 H.".`....~.t(... 96b04a30: 4182 001c 8183 0000 818c 0010 4801 5f81 A...........H._. 96b04a40: 8041 0014 3800 0000 901e 0074 8001 0098 .A..8......t.... 96b04a50: 3821 0090 3860 0000 7c08 03a6 bb41 ffe8 8!..8`..|....A.. 96b04a60: 4e80 0020 7c08 02a6 93e1 fffc 3be4 0000 N.. |.......;... 96b04a70: 9001 0008 3800 0000 9421 ffb0 9001 0038 ....8....!.....8 96b04a80: 8063 0074 2803 0000 4182 0030 8183 0000 .c.t(...A..0.... 96b04a90: 38a1 0038 3882 0f84 818c 0008 4801 5f21 8..88.......H._! 96b04aa0: 8041 0014 2c03 0000 4182 0010 3c60 8000 .A..,...A...<`.. 96b04ab0: 3863 4005 4800 0034 8061 0038 7fe4 fb78 8c@.H..4.a.8...x 96b04ac0: 8183 0000 818c 001c 4801 5ef5 8041 0014 ........H.^..A.. 96b04ad0: 8061 0038 8183 0000 818c 0010 4801 5ee1 .a.8........H.^. 96b04ae0: 8041 0014 3860 0000 8001 0058 3821 0050 .A..8`.....X8!.P 96b04af0: 7c08 03a6 83e1 fffc 4e80 0020 8063 0084 |.......N.. .c.. 96b04b00: 4e80 0020 8003 0058 9004 0000 8003 005c N.. ...X.......\ 96b04b10: 9004 0004 80a4 0000 8003 0050 7c05 0214 ...........P|... 96b04b20: 9004 0008 8003 0054 3860 0000 80a4 0004 .......T8`...... 96b04b30: 7c05 0214 9004 000c 4e80 0020 3c60 8000 |.......N.. <`.. 96b04b40: 3863 4005 4e80 0020 7c08 02a6 3880 0000 8c@.N.. |...8... 96b04b50: 9001 0008 9421 ffc0 8183 0000 818c 0048 .....!.........H 96b04b60: 4801 5e5d 8041 0014 8001 0048 3860 0000 H.^].A.....H8`.. 96b04b70: 3821 0040 7c08 03a6 4e80 0020 7c08 02a6 8!.@|...N.. |... 96b04b80: 3880 0000 9001 0008 9421 ffc0 8183 0000 8........!...... 96b04b90: 818c 0048 4801 5e29 8041 0014 8001 0048 ...HH.^).A.....H 96b04ba0: 3860 0000 3821 0040 7c08 03a6 4e80 0020 8`..8!.@|...N.. 96b04bb0: 7c08 02a6 3880 0000 9001 0008 9421 ffc0 |...8........!.. 96b04bc0: 8183 0000 818c 0048 4801 5df5 8041 0014 .......HH.]..A.. 96b04bd0: 8001 0048 3860 0000 3821 0040 7c08 03a6 ...H8`..8!.@|... 96b04be0: 4e80 0020 7c08 02a6 bfc1 fff8 3bc3 0000 N.. |.......;... 96b04bf0: 3860 0020 9001 0008 9421 ff90 4801 45d9 8`. .....!..H.E. 96b04c00: 8041 0014 7c7f 1b79 4182 0020 281e 0000 .A..|..yA.. (... 96b04c10: 389e 0000 4182 0008 3884 0004 7fe3 fb78 8...A...8......x 96b04c20: 4800 129d 6000 0000 807e 0080 3880 0000 H...`....~..8... 96b04c30: 4800 18c9 6000 0000 807e 0080 8003 001c H...`....~...... 96b04c40: 2c00 0002 4182 000c 4080 0024 4800 0020 ,...A...@..$H.. 96b04c50: 387e 0000 389f 0000 819e 0000 818c 00f4 8~..8........... 96b04c60: 4801 5d5d 8041 0014 4800 001c 387e 0000 H.]].A..H...8~.. 96b04c70: 389f 0000 819e 0000 818c 00f0 4801 5d41 8...........H.]A 96b04c80: 8041 0014 807e 0080 3880 0001 8003 001c .A...~..8....... 96b04c90: 901f 001c 807e 0080 4800 12a1 6000 0000 .....~..H...`... 96b04ca0: 3800 0000 3881 0054 901e 0080 93fe 0080 8...8..T........ 96b04cb0: 9001 005c 9001 0060 807e 0058 801e 005c ...\...`.~.X...\ 96b04cc0: 80a1 005c 9061 0054 80c1 0060 9001 0058 ...\.a.T...`...X 96b04cd0: 807e 0080 4800 16c5 6000 0000 807e 0060 .~..H...`....~.` 96b04ce0: 38a1 004c 801e 0064 9061 004c 9001 0050 8..L...d.a.L...P 96b04cf0: 807e 0074 809e 0078 8183 0000 818c 0048 .~.t...x.......H 96b04d00: 4801 5cbd 8041 0014 807e 0080 3880 0001 H.\..A...~..8... 96b04d10: 4800 17e9 6000 0000 8001 0078 3821 0070 H...`......x8!.p 96b04d20: 3860 0001 7c08 03a6 bbc1 fff8 4e80 0020 8`..|.......N.. 96b04d30: 3860 0001 4e80 0020 7c08 02a6 93e1 fffc 8`..N.. |....... 96b04d40: 3be3 0000 9001 0008 3800 0064 9421 ff70 ;.......8..d.!.p 96b04d50: 9081 00ac 3861 004c 3881 0048 90a1 00b0 ....8a.L8..H.... 96b04d60: 9001 004c 9001 0048 4801 56b5 8041 0014 ...L...HH.V..A.. 96b04d70: 8001 004c 3c80 4330 8061 00ac 6c00 8000 ...L<.C0.a..l... 96b04d80: c862 8bf8 9001 0074 6c60 8000 c822 8c00 .b.....tl`...".. 96b04d90: 9081 0070 c801 0070 9001 007c ec00 1828 ...p...p...|...( 96b04da0: 9081 0078 fc00 0824 c841 0078 ec42 1828 ...x...$.A.x.B.( 96b04db0: fc02 0032 fc00 001e d801 0068 8001 006c ...2.......h...l 96b04dc0: 901f 0060 8001 0048 8061 00b0 6c00 8000 ...`...H.a..l... 96b04dd0: 9001 005c 6c60 8000 9081 0058 c801 0058 ...\l`.....X...X 96b04de0: 9001 0064 ec00 1828 9081 0060 fc00 0824 ...d...(...`...$ 96b04df0: c821 0060 ec21 1828 fc01 0032 fc00 001e .!.`.!.(...2.... 96b04e00: d801 0050 8001 0054 901f 0064 8001 0098 ...P...T...d.... 96b04e10: 3821 0090 7c08 03a6 83e1 fffc 4e80 0020 8!..|.......N.. 96b04e20: 3860 0001 4e80 0020 3c60 8000 3863 4001 8`..N.. <`..8c@. 96b04e30: 4e80 0020 3860 0001 4e80 0020 3860 0000 N.. 8`..N.. 8`.. 96b04e40: 4e80 0020 3860 0000 4e80 0020 3860 0000 N.. 8`..N.. 8`.. 96b04e50: 4e80 0020 3863 fffc 4bff e8f4 3863 fffc N.. 8c..K...8c.. 96b04e60: 4bff e8d8 3863 fffc 4bff e6a0 7c08 02a6 K...8c..K...|... 96b04e70: 93e1 fffc 3922 3718 7c7f 1b78 9001 0008 ....9"7.|..x.... 96b04e80: 3800 0000 3902 d944 38a9 0044 9421 ffc0 8...9..D8..D.!.. 96b04e90: 2804 0000 38c2 382c 9103 0000 3869 0070 (...8.8,....8i.p 96b04ea0: 38e2 3800 90df 0000 38c2 37dc 911f 0004 8.8.....8.7..... 96b04eb0: 90ff 0004 911f 0008 90df 0008 913f 0000 .............?.. 96b04ec0: 90bf 0004 907f 0008 901f 000c 901f 0010 ................ 96b04ed0: 901f 0014 901f 0018 901f 001c 901f 0020 ............... 96b04ee0: 901f 0024 4182 0020 7c83 2378 3882 0f94 ...$A.. |.#x8... 96b04ef0: 8183 0000 38bf 0010 818c 0008 4801 5ac1 ....8.......H.Z. 96b04f00: 8041 0014 8001 0048 3821 0040 7fe3 fb78 .A.....H8!.@...x 96b04f10: 7c08 03a6 83e1 fffc 4e80 0020 7c08 02a6 |.......N.. |... 96b04f20: 93e1 fffc 7c7f 1b79 3862 3718 9001 0008 ....|..y8b7..... 96b04f30: 9421 ffc0 4182 002c 907f 0000 38a3 0044 .!..A..,....8..D 96b04f40: 3863 0070 7c80 0735 90bf 0004 907f 0008 8c.p|..5........ 96b04f50: 4081 0010 7fe3 fb78 4801 424d 8041 0014 @......xH.BM.A.. 96b04f60: 8001 0048 3821 0040 7fe3 fb78 7c08 03a6 ...H8!.@...x|... 96b04f70: 83e1 fffc 4e80 0020 8083 000c 3804 0001 ....N.. ....8... 96b04f80: 9003 000c 7c03 0378 4e80 0020 7c08 02a6 ....|..xN.. |... 96b04f90: 9001 0008 9421 ffc0 8083 000c 3404 ffff .....!......4... 96b04fa0: 9003 000c 4081 000c 8063 000c 4800 0024 ....@....c..H..$ 96b04fb0: 2803 0000 4182 0018 8183 0000 3880 0001 (...A.......8... 96b04fc0: 818c 00c0 4801 59f9 8041 0014 3860 0000 ....H.Y..A..8`.. 96b04fd0: 8001 0048 3821 0040 7c08 03a6 4e80 0020 ...H8!.@|...N.. 96b04fe0: 7c08 02a6 bfc1 fff8 3940 0000 7cbf 2b78 |.......9@..|.+x 96b04ff0: 3902 0e84 7c7e 1b78 38a2 0fd4 396a 0000 9...|~.x8...9j.. 96b05000: 9001 0008 7d4c 5378 3922 0fc4 9421 ffc0 ....}LSx9"...!.. 96b05010: 8004 0000 8068 0000 7c00 1840 3862 0ff4 .....h..|..@8b.. 96b05020: 4082 0018 80e4 0004 80c8 0004 7c07 3040 @...........|.0@ 96b05030: 4082 0008 3980 0001 5586 063f 4182 0018 @...9...U..?A... 96b05040: 80e4 0008 80c8 0008 7c07 3040 4082 0008 ........|.0@@... 96b05050: 3960 0001 5566 063f 4182 0018 80e4 000c 9`..Uf.?A....... 96b05060: 80c8 000c 7c07 3040 4082 0008 3940 0001 ....|.0@@...9@.. 96b05070: 5546 063f 4182 0024 7fc3 f378 819e 0000 UF.?A..$...x.... 96b05080: 818c 000c 4801 5939 8041 0014 93df 0000 ....H.Y9.A...... 96b05090: 3860 0000 4800 01d8 80c9 0000 3900 0000 8`..H.......9... 96b050a0: 3948 0000 3968 0000 7c00 3040 4082 0018 9H..9h..|.0@@... 96b050b0: 80e4 0004 80c9 0004 7c07 3040 4082 0008 ........|.0@@... 96b050c0: 3960 0001 5566 063f 4182 0018 80e4 0008 9`..Uf.?A....... 96b050d0: 80c9 0008 7c07 3040 4082 0008 3940 0001 ....|.0@@...9@.. 96b050e0: 5546 063f 4182 0018 80e4 000c 80c9 000c UF.?A........... 96b050f0: 7c07 3040 4082 0008 3900 0001 5506 063f |.0@@...9...U..? 96b05100: 4182 0024 7fc3 f378 819e 0000 818c 000c A..$...x........ 96b05110: 4801 58ad 8041 0014 93df 0000 3860 0000 H.X..A......8`.. 96b05120: 4800 014c 80c3 0000 3900 0000 3928 0000 H..L....9...9(.. 96b05130: 3948 0000 7c00 3040 4082 0018 80e4 0004 9H..|.0@@....... 96b05140: 80c3 0004 7c07 3040 4082 0008 3940 0001 ....|.0@@...9@.. 96b05150: 5546 063f 4182 0018 80e4 0008 80c3 0008 UF.?A........... 96b05160: 7c07 3040 4082 0008 3920 0001 5526 063f |.0@@...9 ..U&.? 96b05170: 4182 0018 80c4 000c 8063 000c 7c06 1840 A........c..|..@ 96b05180: 4082 0008 3900 0001 5503 063f 4182 0034 @...9...U..?A..4 96b05190: 7fc3 f378 819e 0000 818c 000c 4801 5821 ...x........H.X! 96b051a0: 8041 0014 281e 0000 387e 0000 4182 0008 .A..(...8~..A... 96b051b0: 3863 0004 907f 0000 3860 0000 4800 00b0 8c......8`..H... 96b051c0: 8065 0000 38c0 0000 38e6 0000 3906 0000 .e..8...8...9... 96b051d0: 7c00 1840 4082 0018 8064 0004 8005 0004 |..@@....d...... 96b051e0: 7c03 0040 4082 0008 3900 0001 5500 063f |..@@...9...U..? 96b051f0: 4182 0018 8064 0008 8005 0008 7c03 0040 A....d......|..@ 96b05200: 4082 0008 38e0 0001 54e0 063f 4182 0018 @...8...T..?A... 96b05210: 8064 000c 8005 000c 7c03 0040 4082 0008 .d......|..@@... 96b05220: 38c0 0001 54c0 063f 4182 0034 7fc3 f378 8...T..?A..4...x 96b05230: 819e 0000 818c 000c 4801 5785 8041 0014 ........H.W..A.. 96b05240: 281e 0000 387e 0000 4182 0008 3863 0008 (...8~..A...8c.. 96b05250: 907f 0000 3860 0000 4800 0014 3800 0000 ....8`..H...8... 96b05260: 3c60 8000 901f 0000 3863 4002 8001 0048 <`......8c@....H 96b05270: 3821 0040 7c08 03a6 bbc1 fff8 4e80 0020 8!.@|.......N.. 96b05280: 7c08 02a6 93e1 fffc 7c7f 1b78 9001 0008 |.......|..x.... 96b05290: 9421 ffc0 8063 0010 2803 0000 4182 0070 .!...c..(...A..p 96b052a0: 8183 0000 38bf 0014 3882 1024 818c 0008 ....8...8..$.... 96b052b0: 4801 570d 8041 0014 807f 0010 38bf 0018 H.W..A......8... 96b052c0: 3882 1004 8183 0000 818c 0008 4801 56f1 8...........H.V. 96b052d0: 8041 0014 807f 0010 38bf 001c 3882 0fb4 .A......8...8... 96b052e0: 8183 0000 818c 0008 4801 56d5 8041 0014 ........H.V..A.. 96b052f0: 807f 0010 38bf 0024 3882 0fa4 8183 0000 ....8..$8....... 96b05300: 818c 0008 4801 56b9 8041 0014 8001 0048 ....H.V..A.....H 96b05310: 3821 0040 3860 0000 7c08 03a6 83e1 fffc 8!.@8`..|....... 96b05320: 4e80 0020 7c08 02a6 bfc1 fff8 3bc3 0000 N.. |.......;... 96b05330: 3be4 0000 9001 0008 9421 ffc0 8063 0014 ;........!...c.. 96b05340: 2803 0000 4182 0034 8183 0000 7fc4 f378 (...A..4.......x 96b05350: 818c 0018 4801 5669 8041 0014 807e 0014 ....H.Vi.A...~.. 96b05360: 8183 0000 818c 0010 4801 5655 8041 0014 ........H.VU.A.. 96b05370: 3800 0000 901e 0014 7fe3 fb78 3882 1024 8..........x8..$ 96b05380: 819f 0000 38be 0014 818c 0008 4801 5631 ....8.......H.V1 96b05390: 8041 0014 2c03 0000 4182 0010 3c60 8004 .A..,...A...<`.. 96b053a0: 3863 0009 4800 0028 807e 0014 2803 0000 8c..H..(.~..(... 96b053b0: 4182 0018 8183 0000 7fc4 f378 818c 0014 A..........x.... 96b053c0: 4801 55fd 8041 0014 3860 0000 8001 0048 H.U..A..8`.....H 96b053d0: 3821 0040 7c08 03a6 bbc1 fff8 4e80 0020 8!.@|.......N.. 96b053e0: 7c08 02a6 93e1 fffc 7c7f 1b78 9001 0008 |.......|..x.... 96b053f0: 9421 ffc0 8063 0018 2803 0000 4182 001c .!...c..(...A... 96b05400: 8183 0000 818c 0010 4801 55b5 8041 0014 ........H.U..A.. 96b05410: 3800 0000 901f 0018 807f 0014 2803 0000 8...........(... 96b05420: 4182 001c 8183 0000 818c 0010 4801 5591 A...........H.U. 96b05430: 8041 0014 3800 0000 901f 0014 807f 0010 .A..8........... 96b05440: 2803 0000 4182 001c 8183 0000 818c 0010 (...A........... 96b05450: 4801 556d 8041 0014 3800 0000 901f 0010 H.Um.A..8....... 96b05460: 807f 001c 2803 0000 4182 001c 8183 0000 ....(...A....... 96b05470: 818c 0010 4801 5549 8041 0014 3800 0000 ....H.UI.A..8... 96b05480: 901f 001c 8001 0048 3821 0040 3860 0000 .......H8!.@8`.. 96b05490: 7c08 03a6 83e1 fffc 4e80 0020 7c08 02a6 |.......N.. |... 96b054a0: 9001 0008 9421 ffc0 8183 0000 818c 00bc .....!.......... 96b054b0: 4801 550d 8041 0014 2803 0000 4182 001c H.U..A..(...A... 96b054c0: 8183 0000 818c 0014 4801 54f5 8041 0014 ........H.T..A.. 96b054d0: 3860 0000 4800 000c 3c60 8000 3863 4005 8`..H...<`..8c@. 96b054e0: 8001 0048 3821 0040 7c08 03a6 4e80 0020 ...H8!.@|...N.. 96b054f0: 3860 0000 4e80 0020 7c08 02a6 93e1 fffc 8`..N.. |....... 96b05500: 7c9f 2378 9001 0008 9421 ffc0 8183 0000 |.#x.....!...... 96b05510: 818c 00bc 4801 54a9 8041 0014 2803 0000 ....H.T..A..(... 96b05520: 4182 0020 8183 0000 7fe4 fb78 818c 00a0 A.. .......x.... 96b05530: 4801 548d 8041 0014 3860 0000 4800 000c H.T..A..8`..H... 96b05540: 3c60 8000 3863 4005 8001 0048 3821 0040 <`..8c@....H8!.@ 96b05550: 7c08 03a6 83e1 fffc 4e80 0020 7c08 02a6 |.......N.. |... 96b05560: 93e1 fffc 7c9f 2378 9001 0008 9421 ffc0 ....|.#x.....!.. 96b05570: 8183 0000 818c 00bc 4801 5445 8041 0014 ........H.TE.A.. 96b05580: 2803 0000 4182 0020 8183 0000 7fe4 fb78 (...A.. .......x 96b05590: 818c 00b4 4801 5429 8041 0014 3860 0000 ....H.T).A..8`.. 96b055a0: 4800 000c 3c60 8000 3863 4005 8001 0048 H...<`..8c@....H 96b055b0: 3821 0040 7c08 03a6 83e1 fffc 4e80 0020 8!.@|.......N.. 96b055c0: 7c08 02a6 9001 0008 9421 ffc0 8183 0000 |........!...... 96b055d0: 818c 00bc 4801 53e9 8041 0014 2803 0000 ....H.S..A..(... 96b055e0: 4182 001c 8183 0000 818c 0098 4801 53d1 A...........H.S. 96b055f0: 8041 0014 3860 0000 4800 000c 3c60 8000 .A..8`..H...<`.. 96b05600: 3863 4005 8001 0048 3821 0040 7c08 03a6 8c@....H8!.@|... 96b05610: 4e80 0020 7c08 02a6 9001 0008 9421 ffc0 N.. |........!.. 96b05620: 8183 0000 818c 00bc 4801 5395 8041 0014 ........H.S..A.. 96b05630: 2803 0000 4182 0018 8183 0000 818c 0144 (...A..........D 96b05640: 4801 537d 8041 0014 4800 0008 3860 0000 H.S}.A..H...8`.. 96b05650: 8001 0048 3821 0040 7c08 03a6 4e80 0020 ...H8!.@|...N.. 96b05660: 8063 0020 4e80 0020 7c08 02a6 bfc1 fff8 .c. N.. |....... 96b05670: 7c9e 2378 9001 0008 9421 ffc0 8183 0000 |.#x.....!...... 96b05680: 818c 00bc 4801 5339 8041 0014 7c7f 1b79 ....H.S9.A..|..y 96b05690: 4182 0030 807e 0000 4801 4965 8041 0014 A..0.~..H.Ie.A.. 96b056a0: 819f 0000 3883 0000 387f 0000 818c 0020 ....8...8...... 96b056b0: 4801 530d 8041 0014 3860 0000 4800 000c H.S..A..8`..H... 96b056c0: 3c60 8000 3863 4005 8001 0048 3821 0040 <`..8c@....H8!.@ 96b056d0: 7c08 03a6 bbc1 fff8 4e80 0020 7c08 02a6 |.......N.. |... 96b056e0: bfa1 fff4 3ba3 0000 3bc4 0000 9001 0008 ....;...;....... 96b056f0: 9421 ffb0 819d 0000 818c 00bc 4801 52c1 .!..........H.R. 96b05700: 8041 0014 7c7f 1b79 4182 0078 801d 001c .A..|..yA..x.... 96b05710: 2800 0000 4182 003c 7fe3 fb78 819f 0000 (...A..<...x.... 96b05720: 818c 00d8 4801 5299 8041 0014 7c64 1b78 ....H.R..A..|d.x 96b05730: 807d 001c 38a1 0038 8183 0000 818c 0028 .}..8..8.......( 96b05740: 4801 527d 8041 0014 2c03 0000 4082 001c H.R}.A..,...@... 96b05750: 387f 0000 3881 0038 819f 0000 818c 0058 8...8..8.......X 96b05760: 4801 525d 8041 0014 8001 0038 3860 0000 H.R].A.....88`.. 96b05770: 901e 0000 8001 003c 901e 0004 4800 000c .......<....H... 96b05780: 3c60 8000 3863 4005 8001 0058 3821 0050 <`..8c@....X8!.P 96b05790: 7c08 03a6 bba1 fff4 4e80 0020 7c08 02a6 |.......N.. |... 96b057a0: bfa1 fff4 3ba3 0000 3bc4 0000 9001 0008 ....;...;....... 96b057b0: 9421 ffb0 819d 0000 818c 00bc 4801 5201 .!..........H.R. 96b057c0: 8041 0014 7c7f 1b79 4182 0078 801d 001c .A..|..yA..x.... 96b057d0: 2800 0000 4182 003c 7fe3 fb78 819f 0000 (...A..<...x.... 96b057e0: 818c 00d8 4801 51d9 8041 0014 7c64 1b78 ....H.Q..A..|d.x 96b057f0: 807d 001c 38a1 0038 8183 0000 818c 0030 .}..8..8.......0 96b05800: 4801 51bd 8041 0014 2c03 0000 4082 001c H.Q..A..,...@... 96b05810: 387f 0000 3881 0038 819f 0000 818c 0040 8...8..8.......@ 96b05820: 4801 519d 8041 0014 8001 0038 3860 0000 H.Q..A.....88`.. 96b05830: 901e 0000 8001 003c 901e 0004 4800 000c .......<....H... 96b05840: 3c60 8000 3863 4005 8001 0058 3821 0050 <`..8c@....X8!.P 96b05850: 7c08 03a6 bba1 fff4 4e80 0020 7c08 02a6 |.......N.. |... 96b05860: bfc1 fff8 3bc3 0000 3be4 0000 9001 0008 ....;...;....... 96b05870: 9421 ffb0 819e 0000 818c 00bc 4801 5141 .!..........H.QA 96b05880: 8041 0014 2803 0000 4182 006c 387e 0000 .A..(...A..l8~.. 96b05890: 3881 0040 819e 0000 818c 0098 4801 5121 8..@........H.Q! 96b058a0: 8041 0014 387e 0000 3881 0038 819e 0000 .A..8~..8..8.... 96b058b0: 818c 0094 4801 5109 8041 0014 8001 0038 ....H.Q..A.....8 96b058c0: 3860 0000 901f 0000 8001 003c 901f 0004 8`.........<.... 96b058d0: 809f 0000 8001 0040 7c04 0214 901f 0008 .......@|....... 96b058e0: 809f 0004 8001 0044 7c04 0214 901f 000c .......D|....... 96b058f0: 4800 000c 3c60 8000 3863 4005 8001 0058 H...<`..8c@....X 96b05900: 3821 0050 7c08 03a6 bbc1 fff8 4e80 0020 8!.P|.......N.. 96b05910: 7c08 02a6 bfa1 fff4 3ba3 0000 3bc4 0000 |.......;...;... 96b05920: 9001 0008 9421 ffb0 819d 0000 818c 00bc .....!.......... 96b05930: 4801 508d 8041 0014 7c7f 1b79 4182 0078 H.P..A..|..yA..x 96b05940: 801d 001c 2800 0000 4182 003c 7fe3 fb78 ....(...A..<...x 96b05950: 819f 0000 818c 00d8 4801 5065 8041 0014 ........H.Pe.A.. 96b05960: 7c64 1b78 807d 001c 7fc5 f378 8183 0000 |d.x.}.....x.... 96b05970: 818c 0018 4801 5049 8041 0014 2c03 0000 ....H.PI.A..,... 96b05980: 4082 002c 801e 0000 3881 0038 387f 0000 @..,....8..88... 96b05990: 9001 0038 801e 0004 9001 003c 819f 0000 ...8.......<.... 96b059a0: 818c 004c 4801 5019 8041 0014 3860 0000 ...LH.P..A..8`.. 96b059b0: 4800 000c 3c60 8000 3863 4005 8001 0058 H...<`..8c@....X 96b059c0: 3821 0050 7c08 03a6 bba1 fff4 4e80 0020 8!.P|.......N.. 96b059d0: 3860 0000 4e80 0020 7c08 02a6 bfa1 fff4 8`..N.. |....... 96b059e0: 3ba3 0000 3bc4 0000 9001 0008 9421 ffb0 ;...;........!.. 96b059f0: 819d 0000 818c 00bc 4801 4fc5 8041 0014 ........H.O..A.. 96b05a00: 7c7f 1b79 4182 0078 801d 001c 2800 0000 |..yA..x....(... 96b05a10: 4182 003c 7fe3 fb78 819f 0000 818c 00d8 A..<...x........ 96b05a20: 4801 4f9d 8041 0014 7c64 1b78 807d 001c H.O..A..|d.x.}.. 96b05a30: 7fc5 f378 8183 0000 818c 0020 4801 4f81 ...x....... H.O. 96b05a40: 8041 0014 2c03 0000 4082 002c 801e 0000 .A..,...@..,.... 96b05a50: 3881 0038 387f 0000 9001 0038 801e 0004 8..88......8.... 96b05a60: 9001 003c 819f 0000 818c 003c 4801 4f51 ...<.......A...C. 0000100: 0ad8 7010 a02e 41fa ff12 43f8 02e0 7010 ..p...A...C...p. 0000110: a02e 41fa ff56 43f8 0970 21c9 096c 7010 ..A..VC..p!..lp. 0000120: a02e 303a ff58 a06d 303a ff50 a06c 2047 ..0:.X.m0:.P.l G 0000130: 3178 0210 0016 a00f 6654 42a8 0012 4268 1x......fTB...Bh 0000140: 001c a207 6640 2868 005e 2168 005a 0030 ....f@(h.^!h.Z.0 0000150: 6710 217c 4552 494b 001c 7001 a260 6626 g.!|ERIK..p..`f& 0000160: a015 554f a995 4a5f 6b1a 594f 2f3c 626f ..UO..J_k.YO/. ~............ 0035390: 0000 2e2a 2a00 2b2b 1b3d 0000 2f03 2f2d ...**.++.=.././- 00353a0: 0000 3d30 3132 3334 3536 3700 3839 0000 ..=01234567.89.. 00353b0: 0010 1010 1010 1010 1010 1010 1010 1010 ................ 00353c0: 1010 1005 010b 7f10 0410 0c10 1c1d 1f1e ................ 00353d0: 0041 5344 4648 475a 5843 56a4 4251 5745 .ASDFHGZXCV.BQWE 00353e0: 5259 5431 3233 3436 353d 3937 2d38 305d RYT123465=97-80] 00353f0: 4f55 5b49 500d 4c4a 274b 3b5c 2c2f 4e4d OU[IP.LJ'K;\,/NM 0035400: 2e09 2060 0803 1b00 0000 0000 0000 0000 .. `............ 0035410: 0000 2e1d 2a00 2b1c 1b1f 0000 2f03 1e2d ....*.+...../..- 0035420: 0000 3d30 3132 3334 3536 3700 3839 0000 ..=01234567.89.. 0035430: 0010 1010 1010 1010 1010 1010 1010 1010 ................ 0035440: 1010 1005 010b 7f10 0410 0c10 1c1d 1f1e ................ 0035450: 008c a7b6 c4fa a9bd c58d c3a4 bacf b700 ................ 0035460: a8b4 a0c1 aaa3 a2a4 b0ad bba6 d0a5 bcd4 ................ 0035470: bf00 d200 b90d c2c6 befb c9c7 b2d6 00b5 ................ 0035480: b309 ca00 0803 1b00 0000 0000 0000 0000 ................ 0035490: 0000 2e1d 2a00 2b1c 1b1f 0000 2f03 1e2d ....*.+...../..- 00354a0: 0000 3d30 3132 3334 3536 3700 3839 0000 ..=01234567.89.. 00354b0: 0010 1010 1010 1010 1010 1010 1010 1010 ................ 00354c0: 1010 1005 010b 7f10 0410 0c10 1c1d 1f1e ................ 00354d0: 0081 eaeb ecee fdfc fe82 d7b1 f5ce e3ab ................ 00354e0: e4e7 ffda dbdc dddf deb1 e1e0 d1a1 e2d5 ................ 00354f0: afac d3f6 b80d f1ef aef0 f2c8 f8c0 f7e5 ................ 0035500: f909 ca60 0803 1b00 0000 0000 0000 0000 ...`............ 0035510: 0000 2e2a 2a00 2b2b 1b3d 0000 2f03 2f2d ...**.++.=.././- 0035520: 0000 3d30 3132 3334 3536 3700 3839 0000 ..=01234567.89.. 0035530: 0010 1010 1010 1010 1010 1010 1010 1010 ................ 0035540: 1010 1005 010b 7f10 0410 0c10 1c1d 1f1e ................ 0035550: 0081 eaeb ecee a9bd c582 c3a4 f5ce b7ab ................ 0035560: a8e7 a0c1 aaa3 a2a4 b0ad bba6 d0a5 bcd4 ................ 0035570: afac d2f6 b80d f1ef aefb c9c7 b2d6 f7e5 ................ 0035580: b309 ca60 0803 1b00 0000 0000 0000 0000 ...`............ 0035590: 0000 2e1d 2a00 2b1c 1b1f 0000 2f03 1e2d ....*.+...../..- 00355a0: 0000 3d30 3132 3334 3536 3700 3839 0000 ..=01234567.89.. 00355b0: 0010 1010 1010 1010 1010 1010 1010 1010 ................ 00355c0: 1010 1005 010b 7f10 0410 0c10 1c1d 1f1e ................ 00355d0: 008c a7b6 c4fa a9bd c58d c3a4 bacf b7ab ................ 00355e0: a8b4 a0c1 aaa3 a2a4 b0ad bba6 d0a5 bcd4 ................ 00355f0: bfac d25e b90d c2c6 befb c9c7 b2d6 7eb5 ...^..........~. 0035600: b309 ca60 0803 1b00 0000 0000 0000 0000 ...`............ 0035610: 0000 2e1d 2a00 2b1c 1b1f 0000 2f03 1e2d ....*.+...../..- 0035620: 0000 3d30 3132 3334 3536 3700 3839 0000 ..=01234567.89.. 0035630: 0010 1010 1010 1010 1010 1010 1010 1010 ................ 0035640: 1010 1005 010b 7f10 0410 0c10 1c1d 1f1e ................ 0035650: 0001 1304 0608 071a 1803 1630 0211 1705 ...........0.... 0035660: 1219 1431 3233 3436 353d 3937 1f38 301d ...123465=97.80. 0035670: 0f15 1b09 100d 0c0a 270b 3b1c 2c2f 0e0d ........'.;.,/.. 0035680: 2e09 2060 0803 1b00 0000 0000 0000 0000 .. `............ 0035690: 0000 2e1d 2a00 2b1c 1b1f 0000 2f03 1e2d ....*.+...../..- 00356a0: 0000 3d30 3132 3334 3536 3700 3839 0000 ..=01234567.89.. 00356b0: 0010 1010 1010 1010 1010 1010 1010 1010 ................ 00356c0: 1010 1005 010b 7f10 0410 0c10 1c1d 1f1e ................ 00356d0: 0000 0503 0e00 0b20 ab41 e745 8349 ea4f ....... .A.E.I.O 00356e0: ee55 f261 8765 8e69 926f 9775 9c00 ab03 .U.a.e.i.o.u.... 00356f0: 3200 0b20 6041 cb45 e949 ed4f f155 f461 2.. `A.E.I.O.U.a 0035700: 8865 8f69 936f 9875 9d00 6003 2200 0b20 .e.i.o.u..`.".. 0035710: f641 e545 e649 eb4f ef55 f361 8965 9069 .A.E.I.O.U.a.e.i 0035720: 946f 9975 9e00 f603 2000 0d20 ac41 8045 .o.u.... .. .A.E 0035730: e849 ec4f 8555 8659 d961 8a65 9169 956f .I.O.U.Y.a.e.i.o 0035740: 9a75 9f79 d800 ac03 2d00 0720 f741 cc4e .u.y....-.. .A.N 0035750: 844f cd61 8b6e 966f 9b00 f700 0040 0c20 .O.a.n.o.....@. 0035760: 4ba0 292f 0ba9 922f 0b20 7802 aed1 fc00 K.)/.../. x..... 0035770: 0100 0021 c800 0021 cf09 0821 cd09 0442 ...!...!...!...B 0035780: b80a 8c41 ed06 702b 4800 1008 b800 040b ...A..p+H....... 0035790: 212b 7c00 0640 0000 162b 7c00 0c80 0000 !+|..@...+|..... 00357a0: 1a20 7802 ae0c 6806 7c00 0867 0a0c 6807 . x...h.|..g..h. 00357b0: 7d00 0866 0000 3041 fa01 2c21 7807 2000 }..f..0A..,!x. . 00357c0: 0243 fa00 3841 fa00 3093 c820 0943 f80a .C..8A..0.. .C.. 00357d0: 78a0 2ea0 bd61 0002 7a26 4024 5320 5f43 x....a..z&@$S _C 00357e0: f80a 784e d1a8 fe41 fa01 0221 c802 ba30 ..xN...A...!...0 00357f0: 387f ffa9 c960 eea0 234e d224 2f00 0822 8....`..#N.$/.." 0035800: 2f00 0420 4148 e71f 3e4e 904c df7c f84e /.. AH..>N.L.|.N 0035810: 7548 e760 c042 a742 a748 6f00 0448 6f00 uH.`.B.B.Ho..Ho. 0035820: 042f 052f 0441 f110 002f 082f 0a4e ba04 ././.A..././.N.. 0035830: 544f ef00 1826 1f2c 1f4c df03 064a 404e TO...&.,.L...J@N 0035840: 752d 1f48 e67f fc72 002a 6800 20db e800 u-.H...r.*h. ... 0035850: 2870 40c0 2800 2d41 f803 a431 6a00 4a00 (p@.(.-A...1j.J. 0035860: 1831 6a00 4800 1621 4d00 2021 4600 2431 .1j.H..!M. !F.$1 0035870: 7c00 0100 2c81 2800 2d20 030c 8000 7fff |...,.(.- ...... 0035880: ff62 0ce1 88d0 8021 4000 2e60 0000 5800 .b.....!@..`..X. 0035890: 6801 0000 2ce1 88d0 8021 4000 3220 0342 h...,....!@.2 .B 00358a0: 4048 40ee 4821 4000 2e60 0000 3a20 0c67 @H@.H!@..`..: .g 00358b0: 344a b803 9466 0620 2c00 1260 0420 2c00 4J...f. ,..`. ,. 00358c0: 200c 8000 7fff ff63 1c2f 00e1 88d0 8021 ......c./.....! 00358d0: 4000 3220 1f42 4048 40ee 4821 4000 2e00 @.2 .B@H@.H!@... 00358e0: 6801 0000 2c4e f950 ff80 0100 067f ff00 h...,N.P........ 00358f0: 0ab1 7400 00bf f000 00aa 0fb1 7400 7800 ..t.........t.x. 0035900: 5e00 7254 6869 7320 7374 6172 7475 7020 ^.rThis startup 0035910: 6469 736b 2077 696c 6c20 6e6f 7420 776f disk will not wo 0035920: 726b 206f 6e20 7468 6973 2063 6f6d 7075 rk on this compu 0035930: 7465 722e 2f41 2050 6f77 6572 2050 4320 ter./A Power PC 0035940: 6261 7365 6420 636f 6d70 7574 6572 2069 based computer i 0035950: 7320 7265 7175 6972 6564 2074 6f20 7374 s required to st 0035960: 6172 7475 702f 6672 6f6d 2074 6869 7320 artup/from this 0035970: 6469 736b 2e00 00bf f000 8800 5100 3c00 disk........Q.<. 0035980: 7100 5c00 ffff 0001 ffff 8003 ffff c007 q.\............. 0035990: feff e00f fc7f f01f ec67 f83f c447 fc7f .........g.?.G.. 00359a0: c447 feff 4447 fffe 4447 fffe 4447 fffe .G..DG..DG..DG.. 00359b0: 4447 fffe 4447 fffe 4447 fffe 4007 1ffe DG..DG..DG..@... 00359c0: 0006 1ffe 0006 1ffe 0004 3ffe 0000 3ffe ..........?...?. 00359d0: 0000 7ffe 0000 7ffe 0000 fffe 0000 fffe ................ 00359e0: 0001 fffe 0001 ff7e 0403 fe3f 0207 fc1f .......~...?.... 00359f0: ffff f80f ffff f007 ffff e003 ffff c001 ................ 0035a00: ffff 80aa 0f00 0e00 01a6 2800 9a01 9400 ..........(..... 0035a10: ae01 cfad f8a6 2800 0852 6573 7461 7274 ......(..Restart 0035a20: 20ad f800 2c30 3c00 9fa1 4622 4830 3c00 ...,0<...F"H0<. 0035a30: 95a1 46b3 c867 063f 3c00 02a8 9520 7802 ..F..g.?<.... x. 0035a40: ae41 e800 0a08 3800 0602 8e67 024e 704e .A....8....g.NpN 0035a50: d04e 56ff 6a48 e71f 382d 7807 24ff f441 .NV.jH..8-x.$..A 0035a60: fafd e021 c807 242d 7807 20ff f841 fafe ...!..$-x. ..A.. 0035a70: 3e21 c807 2024 7806 fc41 fafd 9621 c806 >!.. $x..A...!.. 0035a80: fc70 0021 c002 ba4e ba0a 1628 4020 0c67 .p.!...N...(@ .g 0035a90: 0e70 0030 2c00 080c 8000 0042 4467 0470 .p.0,......BDg.p 0035aa0: 2aa9 c93c 2c00 483a 2c00 4a30 2c00 2448 *..<,.H:,.J0,.$H 0035ab0: c072 0032 2c00 9c74 0926 2c00 1ce4 a34c .r.2,..t.&,....L 0035ac0: 0138 0028 03d8 8070 0aa3 462d 48ff ec43 .8.(...p..F-H..C 0035ad0: fa01 8a20 4970 0aa2 472d 7807 a4ff f041 ... Ip..G-x....A 0035ae0: fa01 9821 c807 a448 6eff 6e48 6eff 6a2f ...!...Hn.nHn.j/ 0035af0: 0448 c52f 0548 c62f 064e ba02 8e3e 004f .H./.H./.N...>.O 0035b00: ef00 1466 0000 f821 eeff f007 a420 6eff ...f...!..... n. 0035b10: ec70 0aa2 4721 ca06 fc21 eeff f807 2021 .p..G!...!.... ! 0035b20: eeff f407 244a aeff 6a67 0c20 6eff 6a2f ....$J..jg. n.j/ 0035b30: 104e ba06 b058 4f70 002f 0020 6eff 6e2f .N...XOp./. n.n/ 0035b40: 104e bafc b84e ba09 5828 4070 023f 00a9 .N...N..X(@p.?.. 0035b50: 9a70 002d 40ff 843d 6c00 4eff 8843 eeff .p.-@..=l.N..C.. 0035b60: 7220 49a0 0e70 0028 402d 40ff 843d 46ff r I..p.(@-@..=F. 0035b70: 8843 eeff 7220 49a0 0f3e 0050 4f66 7e4e .C..r I..>.POf~N 0035b80: ba09 1e28 4020 0c67 0e70 0030 2c00 080c ...(@ .g.p.0,... 0035b90: 8000 0048 2b67 047e dd60 624a ac00 7a67 ...H+g.~.`bJ..zg 0035ba0: 242d 7c45 5249 4bff 8e2d 6c00 7aff a243 $-|ERIK..-l.z..C 0035bb0: eeff 7220 4970 01a2 603e 0066 4043 eeff ..r Ip..`>.f@C.. 0035bc0: 7220 49a0 1555 8fa9 954a 5f6c 063e 3cff r I..U...J_l.><. 0035bd0: 3f60 2a70 002d 40ff 843d 46ff 8843 eeff ?`*p.-@..=F..C.. 0035be0: 7220 49a0 0f59 8f2f 3c62 6f6f 7470 023f r I..Y./.O...f 0035de0: 0003 a82c 2c00 5048 7800 ec48 6efc 084e ...,,.PHx..Hn..N 0035df0: ba20 063d 7cff 80fc 563d 45fc 503d 44fc . .=|...V=E.P=D. 0035e00: 522d 6c00 28fc 240c ac00 00ff ff00 2c50 R-l.(.$.......,P 0035e10: 4f63 083d 7cff fffc 2260 063d 6c00 2efc Oc.=|..."`.=l... 0035e20: 223d 6e00 12fc 2c3d 54fc 102d 6c00 28fc "=n...,=T..-l.(. 0035e30: cc2d 6c00 2cfc d02d 6c00 30fc d42d 6c00 .-l.,..-l.0..-l. 0035e40: 10fc 122d 6c00 14fc 1670 0030 2c00 0632 ...-l....p.0,..2 0035e50: 3c80 0082 403d 41fc 1a2d 6c00 40fc 2e2d <...@=A..-l.@..- 0035e60: 6c00 20fc 7a2d 6c00 24fc 7e2d 46fc 822d l. .z-l.$.~-F..- 0035e70: 7803 7cfc 5c59 8f2e b803 802d 5ffc b059 x.|.\Y.....-_..Y 0035e80: 8f2e b803 782d 5ffc 581d 7c00 01fc 341d ....x-_.X.|...4. 0035e90: 7c00 2bfc 3548 6efc f848 6eff fe4e ba05 |.+.5Hn..Hn..N.. 0035ea0: 723e 0050 4f66 0002 e23d 6eff fefc ac20 r>.POf...=n.... 0035eb0: 6efc f870 0320 8020 6efc f821 6c00 c400 n..p. . n..!l... 0035ec0: 0822 2c00 284c 2c10 0000 cc20 6efc f821 .",.(L,.... n..! 0035ed0: 4100 0c41 eefc 0822 6efc f823 4800 1441 A..A..."n..#H..A 0035ee0: ec00 d022 6efc f823 4800 1820 6efc f848 ..."n..#H.. n..H 0035ef0: 6800 1870 002f 0048 6c00 d02f 0848 6efc h..p./.Hl../.Hn. 0035f00: 084e ba05 f43e 0048 7a04 f448 7a04 fa48 .N...>.Hz..Hz..H 0035f10: 7a04 cc48 7a04 6848 7a1e 7a2f 2efc f84e z..Hz.hHz.z/...N 0035f20: ba0c 8a3e 004f ef00 2c66 0002 5e48 6efc ...>.O..,f..^Hn. 0035f30: f448 6eff fe4e ba04 da3e 0050 4f66 0002 .Hn..N...>.POf.. 0035f40: 4a3d 6eff fefc ae20 6efc f470 0420 8020 J=n.... n..p. . 0035f50: 6efc f421 6c01 1400 0822 2c00 284c 2c10 n..!l....",.(L,. 0035f60: 0001 1c20 6efc f421 4100 0c41 eefc 0822 ... n..!A..A..." 0035f70: 6efc f423 4800 1441 ec01 2022 6efc f423 n..#H..A.. "n..# 0035f80: 4800 1820 6efc f448 6800 1870 002f 0048 H.. n..Hh..p./.H 0035f90: 6c01 202f 0848 6efc 084e ba05 5c3e 0048 l. /.Hn..N..\>.H 0035fa0: 7a04 5c48 7a04 6248 7a04 3448 7a03 d048 z.\Hz.bHz.4Hz..H 0035fb0: 7a0b 7e2f 2efc f44e ba0b f23e 004f ef00 z.~/...N...>.O.. 0035fc0: 2c66 0001 c62d 7c00 000a d8fd f848 6efd ,f...-|......Hn. 0035fd0: fc2f 2efd f84e ba04 e848 6efd 0048 6efd ./...N...Hn..Hn. 0035fe0: fc2f 062f 2efc f44e ba03 183e 004f ef00 ././...N...>.O.. 0035ff0: 1866 0001 9648 6efc fc48 6eff fc4e ba04 .f...Hn..Hn..N.. 0036000: 123e 0050 4f66 0001 8220 6efc fc20 aefd .>.POf... n.. .. 0036010: 0820 6efc fc21 6efd ac00 0820 2c00 284c . n..!n.... ,.(L 0036020: 2e00 00fd b420 6efc fc21 4000 0c41 eefc ..... n..!@..A.. 0036030: 0822 6efc fc23 4800 1441 eefd b822 6efc ."n..#H..A..."n. 0036040: fc23 4800 1820 6efc fc21 6efd 3000 3220 .#H.. n..!n.0.2 0036050: 6efc fc21 4600 3a20 6efd f824 6efc fc45 n..!F.: n..$n..E 0036060: ea00 3e22 4a24 4872 0012 1252 4148 c120 ..>"J$Hr...RAH. 0036070: 01a2 2e20 6efc fc48 6800 1848 7800 ff48 ... n..Hh..Hx..H 0036080: 6efd b82f 2efc fc48 6efc 084e ba04 6a3e n../...Hn..N..j> 0036090: 0070 001f 00a9 9b55 8f48 7a01 403f 2eff .p.....U.Hz.@?.. 00360a0: fc70 011f 00a9 c43d 5fff fe70 011f 00a9 .p.....=_..p.... 00360b0: 9b30 2eff feb0 6eff fc4f ef00 1467 0e3d .0....n..O...g.= 00360c0: 7cff ffff fe3e 3cff 3f60 0000 be4e ba06 |....><.?`...N.. 00360d0: d24a 0067 664a b803 9466 2259 8f2f 3c70 .J.gfJ...f"Y./

      <.@`*><..Y 0036140: 8f2f 3c76 6572 7370 013f 00a8 1f26 5f20 ./.....N^NuNV../ 00362c0: 073d 6e00 0aff e43d 6e00 0eff e62d 6e00 .=n....=n....-n. 00362d0: 14ff ee2d 7c00 0002 00ff f220 2e00 1054 ...-|...... ...T 00362e0: 8072 09e3 a82d 40ff fc3d 7c00 01ff fa43 .r...-@..=|....C 00362f0: eeff ce20 49a0 033e 002e 2eff ca4e 5e4e ... I..>.....N^N 0036300: 754e 56fd d448 e701 3826 6e00 102d 6e00 uNV..H..8&n..-n. 0036310: 14fd d470 012d 40fd dc2d 7c00 0000 f8fd ...p.-@..-|..... 0036320: d848 6efd e04e ba12 0e49 eefd f470 0030 .Hn..N...I...p.0 0036330: 1352 80d0 8058 8038 8029 6e00 0c00 0220 .R...X.8.)n.... 0036340: 4b24 4c5c 8a22 4a72 0032 1352 81d2 8120 K$L\."Jr.2.R... 0036350: 01a2 2e48 6efd e048 6eff fe48 6efd d470 ...Hn..Hn..Hn..p 0036360: ff2f 0048 6efd e02f 2e00 084e ba0a 6e2e ./.Hn../...N..n. 0036370: 0030 074c ee1c 80fd c44e 5e4e 754e 56ff .0.L.....N^NuNV. 0036380: ce48 e701 1826 6e00 142e 2b00 0820 07a5 .H...&n...+.. .. 0036390: 1e28 4820 0c66 0c55 8f3e b802 2030 1f48 .(H .f.U.>.. 0.H 00363a0: c060 302d 4cff ee3d 6e00 0aff e62d 47ff .`0-L..=n....-G. 00363b0: f23d 7c00 01ff fa20 074c 2e00 0000 0c2d .=|.... .L.....- 00363c0: 40ff fc43 eeff ce20 49a0 0248 c02e 0026 @..C... I..H...& 00363d0: 8c20 074c ee18 80ff c24e 5e4e 754e 5600 . .L.....N^NuNV. 00363e0: 002f 0c28 6e00 0c4a 9467 0820 54a0 1f70 ./.(n..J.g. T..p 00363f0: 0028 8070 0028 6eff fc4e 5e4e 754e 5600 .(.p.(n..N^NuNV. 0036400: 0070 004e 5e4e 754e 5600 0070 004e 5e4e .p.N^NuNV..p.N^N 0036410: 754e 5600 0048 e707 1826 7803 4e70 0030 uNV..H...&x.Np.0 0036420: 134a 804c 7c08 0000 0000 5e3a 0042 477c .J.L|.....^:.BG| 0036430: d660 3a70 0030 0772 5e4c 0108 0049 f308 .`:p.0.r^L...I.. 0036440: 024a 9466 2670 5e2f 002f 0c4e ba19 aa70 .J.f&p^/./.N...p 0036450: ff28 8020 6e00 0c20 8c22 0c24 0b92 4220 .(. n.. .".$..B 0036460: 6e00 0830 8142 4650 4f60 0652 47ba 4762 n..0.BFPO`.RG.Gb 0036470: c230 064c ee18 e0ff ec4e 5e4e 754e 5600 .0.L.....N^NuNV. 0036480: 002f 0c28 6e00 0820 6c00 18a0 2370 5e2f ./.(n.. l...#p^/ 0036490: 002f 0c4e ba19 6228 6eff fc4e 5e4e 754e ./.N..b(n..N^NuN 00364a0: 5600 0032 3802 1022 7803 5860 08b2 6900 V..28.."x.X`..i. 00364b0: 4867 0622 5120 0966 f420 094e 5e4e 754e Hg."Q .f. .N^NuN 00364c0: 5600 0048 e700 3824 6e00 0c28 6e00 0874 V..H..8$n..(n..t 00364d0: 0014 1c4a 8247 ea00 0272 0060 0a70 0010 ...J.G...r.`.p.. 00364e0: 1c36 c020 0152 81b4 8162 f234 824c ee1c .6. .R...b.4.L.. 00364f0: 00ff f44e 5e4e 754e 56ff 9c48 e703 381c ...N^NuNV..H..8. 0036500: 2e00 1749 eeff c070 04a5 2226 4820 6e00 ...I...p.."&H n. 0036510: 1820 8b20 5370 0020 8048 6eff 9c48 6eff . . Sp. .Hn..Hn. 0036520: a52f 0b2f 2e00 104e ba01 263e 004a 2eff ././...N..&>.J.. 0036530: a54f ef00 1067 2220 5370 08b0 9063 1420 .O...g" Sp...c. 0036540: 4b70 44a0 2420 6e00 1024 5358 8a22 4a70 KpD.$ n..$SX."Jp 0036550: 40a2 2e30 0760 0000 ee3d 7c00 0aff a81d @..0.`...=|..... 0036560: 46ff aa42 2eff ab20 6e00 0c2d 50ff ac2d F..B... n..-P..- 0036570: 6eff 9cff b048 6eff a048 6eff a62f 0c48 n....Hn..Hn../.H 0036580: 6eff b470 002f 0048 6eff a820 6e00 0832 n..p./.Hn.. n..2 0036590: 2800 a448 c12f 014e ba02 3e3e 000c 4700 (..H./.N..>>..G. 00365a0: 204f ef00 1c66 0670 0060 0000 9a4a 4767 O...f.p.`...JGg 00365b0: 0630 0760 0000 9048 6eff 9c48 6eff a52f .0.`...Hn..Hn../ 00365c0: 0b2f 0c4e ba00 8a3e 004a 2eff a54f ef00 ./.N...>.J...O.. 00365d0: 1067 0430 0760 6e48 6eff a048 6eff a62f .g.0.`nHn..Hn../ 00365e0: 0c48 6eff b470 012f 0020 6e00 0832 2800 .Hn..p./. n..2(. 00365f0: a448 c12f 014e ba03 8c3e 000c 4700 204f .H./.N...>..G. O 0036600: ef00 1866 0470 0060 3c4a 4767 0430 0760 ...f.p.`.J...O.. 0036640: 1067 9430 074c ee1c c0ff 884e 5e4e 754e .g.0.L.....N^NuN 0036650: 56ff fc48 e713 3826 6e00 1428 6e00 0870 V..H..8&n..(n..p 0036660: 0026 8042 4776 0848 c74a b47e 0467 1048 .&.BGv.H.J.~.g.H 0036670: c720 347e 04d1 9330 0752 47b6 476e e830 . 4~...0.RG.Gn.0 0036680: 0748 c0e7 802c 0059 8f2f 2e00 0c4e ba30 .H...,.Y./...N.0 0036690: cedc 9f20 6e00 0c20 06a0 2420 4c24 6e00 ... n.. ..$ L$n. 00366a0: 0c24 522d 48ff fc20 6e00 0c20 5020 1241 .$R-H.. n.. P .A 00366b0: f00e 0422 4832 0748 c1e7 8120 0120 6eff ..."H2.H... . n. 00366c0: fca2 2e20 6e00 0c20 5048 c7df 900c 4700 ... n.. PH....G. 00366d0: 0866 0820 6e00 1042 1060 0820 6e00 1010 .f. n..B.`. n... 00366e0: bc00 0155 8f3e b802 2030 1f4c ee1c c8ff ...U.>.. 0.L.... 00366f0: e44e 5e4e 754e 56ff ce48 e701 0820 3c00 .N^NuNV..H... <. 0036700: 0004 00a7 1e28 4820 0c67 303d 6e00 0aff .....(H .g0=n... 0036710: e43d 6e00 0eff e62d 4cff ee2d 7c00 0004 .=n....-L..-|... 0036720: 00ff f270 002d 40ff fc3d 7c00 01ff fa43 ...p.-@..=|....C 0036730: eeff ce20 49a0 033e 0060 027e 9430 074c ... I..>.`.~.0.L 0036740: ee10 80ff c64e 5e4e 754e 56fe 0048 e70f .....N^NuNV..H.. 0036750: 0028 2e00 103a 2e00 0e3c 2e00 0a48 6efe .(...:...<...Hn. 0036760: 002f 0448 c52f 0548 c62f 064e bafb 083e ./.H./.H./.N...> 0036770: 004f ef00 1066 1e70 002d 40fe 5048 6efe .O...f.p.-@.PHn. 0036780: 002f 0448 c52f 0548 c62f 064e bafb 2e3e ./.H./.H./.N...> 0036790: 004f ef00 1030 074c ee00 f0fd f04e 5e4e .O...0.L.....N^N 00367a0: 754e 56ff fc48 e711 0020 3c73 7973 6141 uNV..H... .v.p.. 00367c0: aeff fc66 064a 4766 0276 0110 034c ee00 ...f.JGf.v...L.. 00367d0: 88ff f44e 5e4e 754e 56fd ca48 e713 3859 ...N^NuNV..H..8Y 00367e0: 8f3f 2e00 0a4e ba2e ae20 5f2d 48ff fc28 .?...N... _-H..( 00367f0: 6800 222d 6e00 18fd d270 012d 40fd da72 h."-n....p.-@..r 0036800: 0032 2c00 2c74 07b4 8166 0870 0c2d 40fd .2,.,t...f.p.-@. 0036810: d660 1c70 0030 2c00 2c72 0ab2 8066 0870 .`.p.0,.,r...f.p 0036820: 402d 40fd d660 082d 7c00 0002 08fd d670 @-@..`.-|......p 0036830: 002d 40fd de42 6efd e82d 40fd ea2d 6e00 .-@..Bn..-@..-n. 0036840: 10fd e242 6efd e62f 0c2f 2e00 0c4e ba02 ...Bn.././...N.. 0036850: 9c48 c02e 0050 4f66 0001 1e20 6e00 0c45 .H...POf... n..E 0036860: eefd f222 4a72 02c2 ac00 5067 0a24 4872 ..."Jr....Pg.$Hr 0036870: 0032 1254 8160 0c24 6e00 0c72 0012 1252 .2.T.`.$n..r...R 0036880: 4148 c120 01a2 2e47 ec00 680c ae00 0002 AH. ...G..h..... 0036890: 08fd d666 6e20 6eff fc20 6800 142d 6800 ...fn n.. h..-h. 00368a0: e8fd ce48 6efd ca2f 2efd ce20 6e00 0c2f ...Hn../... n../ 00368b0: 2800 024e ba2c c848 c02e 0057 c344 0367 (..N.,.H...W.D.g 00368c0: 0820 6efd ca20 5060 0430 7cff ff2c 082f . n.. P`.0|..,./ 00368d0: 0b2f 2e00 1c48 6efd d22f 0648 6efd de2f ./...Hn../.Hn../ 00368e0: 2eff fc4e ba04 f62e 0048 6b00 0420 6e00 ...N.....Hk.. n. 00368f0: 0c2f 2800 022f 2efd ce4e ba2c d04f ef00 ./(../...N.,.O.. 0036900: 3060 202f 0b2f 2e00 1c48 6efd d270 ff2f 0` /./...Hn..p./ 0036910: 0048 6efd de2f 2eff fc4e ba04 c02e 004f .Hn../...N.....O 0036920: ef00 184a 8766 504a ae00 2067 0820 6e00 ...J.fPJ.. g. n. 0036930: 2020 ab00 042f 0c48 6b00 144e ba01 ae48 .../.Hk..N...H 0036940: c02e 0050 4f66 304a ae00 1467 2a43 eb00 ...POf0J...g*C.. 0036950: 1420 4922 6e00 1472 02c2 ac00 5067 0a72 . I"n..r....Pg.r 0036960: 0032 2b00 1454 8160 0a72 0012 2b00 1452 .2+..T.`.r..+..R 0036970: 4148 c120 01a2 2e30 074c ee1c c8fd b24e AH. ...0.L.....N 0036980: 5e4e 754e 56ff ee48 e71f 3838 2e00 0e59 ^NuNV..H..88...Y 0036990: 8f3f 2e00 0a4e ba2c fe26 5f20 6b00 222d .?...N.,.&_ k."- 00369a0: 48ff fa49 e800 682d 6e00 14ff ee70 012d H..I..h-n....p.- 00369b0: 40ff f672 0032 2800 2c74 07b4 8166 0870 @..r.2(.,t...f.p 00369c0: 0c2d 40ff f260 2020 6eff fa70 0030 2800 .-@..` n..p.0(. 00369d0: 2c72 0ab2 8066 0870 402d 40ff f260 082d ,r...f.p@-@..`.- 00369e0: 7c00 0002 08ff f20c 4400 0166 0676 0160 |.......D..f.v.` 00369f0: 0000 860c 44ff ff66 0476 0260 7a4a 4466 ....D..f.v.`zJDf 0036a00: 0476 0460 720c 4480 0166 0442 4360 680c .v.`r.D..f.BC`h. 0036a10: 447f ff66 0476 0360 5e0c 4400 016f 2e7a D..f.v.`^.D..o.z 0036a20: 0160 202f 2e00 1848 6eff ee2f 0c70 012f .` /...Hn../.p./ 0036a30: 002f 0b4e ba06 a42e 004f ef00 1466 0000 ./.N.....O...f.. 0036a40: a052 8548 c4b8 8562 da76 0160 2a7c ff60 .R.H...b.v.`*|.` 0036a50: 1e2f 2e00 1848 6eff ee2f 0c70 022f 002f ./...Hn../.p././ 0036a60: 0b4e ba06 762e 004f ef00 1466 7253 8648 .N..v..O...frS.H 0036a70: c4b8 866d dc76 022f 2e00 1848 6eff ee2f ...m.v./...Hn../ 0036a80: 0c70 0030 032f 002f 0b4e ba06 4e2e 004f .p.0././.N..N..O 0036a90: ef00 1466 4a20 6e00 1c20 ac00 042f 2eff ...fJ n.. .../.. 0036aa0: fa48 6c00 144e ba00 4448 c02e 0050 4f66 .Hl..N..DH...POf 0036ab0: 2e43 ec00 1420 4922 6e00 1024 6eff fa72 .C... I"n..$n..r 0036ac0: 02c2 aa00 5067 0a72 0032 2c00 1454 8160 ....Pg.r.2,..T.` 0036ad0: 0a72 0012 2c00 1452 4148 c120 01a2 2e30 .r..,..RAH. ...0 0036ae0: 074c ee1c f8ff ce4e 5e4e 754e 5600 0048 .L.....N^NuNV..H 0036af0: e701 1826 6e00 0c28 6e00 0870 02c0 ab00 ...&n..(n..p.... 0036b00: 5067 043e 1460 067e 001e 144a 8770 0030 Pg.>.`.~...J.p.0 0036b10: 070c 4000 0665 06be 6b00 2c63 0630 3c03 ..@..e..k.,c.0<. 0036b20: 0e60 0270 004c ee18 80ff f44e 5e4e 754e .`.p.L.....N^NuN 0036b30: 5600 0048 e707 1826 6e00 0c28 6e00 082a V..H...&n..(n..* 0036b40: 2c00 022c 2b00 02bc 8564 047e 0160 50bc ,..,+....d.~.`P. 0036b50: 8563 047e ff60 4870 0030 2c00 064a 8067 .c.~.`Hp.0,..J.g 0036b60: 0a70 0030 2b00 064a 8066 1270 0030 2c00 .p.0+..J.f.p.0,. 0036b70: 0672 0032 2b00 062e 009e 8160 2270 0030 .r.2+......`"p.0 0036b80: 2b00 062f 0048 6b00 0870 0030 2c00 062f +../.Hk..p.0,../ 0036b90: 0048 6c00 084e ba13 242e 004f ef00 1020 .Hl..N..$..O... 0036ba0: 074c ee18 e0ff ec4e 5e4e 754e 56ff f048 .L.....N^NuNV..H 0036bb0: e701 184a ae00 0867 184a ae00 1067 124a ...J...g.J...g.J 0036bc0: ae00 1467 0c4a ae00 1867 064a ae00 1c66 ...g.J...g.J...f 0036bd0: 0670 ce60 0001 fc20 6e00 084a a800 2267 .p.`... n..J.."g 0036be0: 0670 0060 0001 ec20 6e00 080c a800 0002 .p.`... n....... 0036bf0: 0000 0864 0a20 3c00 0003 0260 0001 d420 ...d. <....`... 0036c00: 3c00 0002 aaa7 1e28 4820 0c66 0670 9460 <......(H .f.p.` 0036c10: 0001 c029 6e00 1000 5c29 6e00 1400 6029 ...)n...\)n...`) 0036c20: 6e00 1800 6429 6e00 0c00 0470 002d 40ff n...d)n....p.-@. 0036c30: f02d 7c00 0002 00ff f820 780b b872 0012 .-|...... x..r.. 0036c40: 2800 4274 08c4 0167 1055 8f2f 2e00 084e (.Bt...g.U./...N 0036c50: ba2a 8a39 5f00 0260 0e20 3803 4e32 2e00 .*.9_..`. 8.N2.. 0036c60: 0a92 4039 4100 0220 6e00 0821 4c00 2270 ..@9A.. n..!L."p 0036c70: 012f 0048 7802 0032 2c00 0248 c12f 0120 ./.Hx..2,..H./. 0036c80: 6e00 1c4e 902e 004f ef00 0c66 0001 2848 n..N...O...f..(H 0036c90: 6eff f070 002f 002f 0032 2c00 0248 c12f n..p././.2,..H./ 0036ca0: 0120 6e00 104e 902e 004f ef00 1066 0001 . n..N...O...f.. 0036cb0: 0626 6eff f02f 0b2f 2e00 084e ba08 942e .&n.././...N.... 0036cc0: 0050 4f66 0000 f039 6b00 0e00 1829 6b00 .POf...9k....)k. 0036cd0: 1000 1a29 6b00 1400 1e29 6b00 1800 2229 ...)k....)k...") 0036ce0: 6b00 1c00 2639 6b00 2000 2a39 6b00 2200 k...&9k. .*9k.". 0036cf0: 2c29 6b00 2400 2e29 6b00 2800 3219 6b00 ,)k.$..)k.(.2.k. 0036d00: 3200 0129 6b00 3400 5070 0030 2c00 2c0c 2..)k.4.Pp.0,.,. 0036d10: 4000 2863 0800 ac00 0000 0600 5039 7c00 @.(c........P9|. 0036d20: 0100 4a70 0029 4000 4c72 0129 4100 5829 ..Jp.)@.Lr.)A.X) 0036d30: 4102 8674 0034 2c00 2a0c 8200 0002 0066 A..t.4,.*......f 0036d40: 122f 2eff f02f 0c4e ba0c cc2e 0050 4f66 ./.../.N.....POf 0036d50: 6460 4870 202f 0072 0032 2c00 2a2f 0132 d`Hp /.r.2,.*/.2 0036d60: 2c00 0248 c12f 0120 6e00 1c4e 902e 004f ,..H./. n..N...O 0036d70: ef00 0c66 4048 6eff f02f 0c4e ba0c 542e ...f@Hn../.N..T. 0036d80: 0050 4f66 3048 6eff f070 002f 002f 0c4e .POf0Hn..p././.N 0036d90: ba0b a62e 004f ef00 0c66 1a70 0029 4000 .....O...f.p.)@. 0036da0: 5448 6eff f02f 0c4e ba0c 282e 0050 4f66 THn../.N..(..POf 0036db0: 0470 0060 1c20 6e00 0870 0021 4000 2248 .p.`. n..p.!@."H 0036dc0: 6eff f02f 0c4e ba0c 0a20 4ca0 1f20 0750 n../.N... L.. .P 0036dd0: 4f4c ee18 80ff e44e 5e4e 754e 56ff 5e48 OL.....N^NuNV.^H 0036de0: e70f 382a 2e00 1028 6e00 1c4a ae00 0866 ..8*...(n..J...f 0036df0: 0670 ce60 0002 da4a ae00 0c66 0670 ce60 .p.`...J...f.p.` 0036e00: 0002 ce20 6e00 0826 6800 2220 0b66 0a20 ... n..&h." .f. 0036e10: 3c00 0003 0260 0002 b842 0648 6eff ff2f <....`...B.Hn../ 0036e20: 2e00 0c2f 0b4e ba0a da2e 004f ef00 0c66 .../.N.....O...f 0036e30: 0002 6a4a 2eff ff67 0000 8620 6e00 0c2d ..jJ...g... n..- 0036e40: 6800 04ff de48 6eff e22f 2eff de2f 0b4e h....Hn../.../.N 0036e50: ba0a e62e 004f ef00 0c66 5220 6eff e270 .....O...fR n..p 0036e60: ffb0 2800 0866 2670 0030 2800 0a4a 8063 ..(..f&p.0(..J.c 0036e70: 1c48 6eff f220 6e00 0c48 6800 142f 2eff .Hn.. n..Hh../.. 0036e80: e22f 0b4e ba0d 641c 004f ef00 1070 0010 ./.N..d..O...p.. 0036e90: 064a 8066 1448 6eff e22f 0b4e ba0b 342e .J.f.Hn../.N..4. 0036ea0: 0050 4f66 0001 f660 0452 ab02 a270 0010 .POf...`.R...p.. 0036eb0: 064a 8066 0a2f 2e00 0c4e ba06 7a58 4f70 .J.f./...N..zXOp 0036ec0: 0010 064a 8066 7270 ffb0 8567 6cba aeff ...J.frp...gl... 0036ed0: de67 662d 45ff de48 6eff e22f 2eff de2f .gf-E..Hn../.../ 0036ee0: 0b4e ba0a 542e 004f ef00 0c66 4c20 6eff .N..T..O...fL n. 0036ef0: e270 ffb0 2800 0866 2670 0030 2800 0a4a .p..(..f&p.0(..J 0036f00: 8063 1c48 6eff f220 6e00 0c48 6800 142f .c.Hn.. n..Hh../ 0036f10: 2eff e22f 0b4e ba0c d21c 004f ef00 1070 .../.N.....O...p 0036f20: 0010 064a 8066 1248 6eff e22f 0b4e ba0a ...J.f.Hn../.N.. 0036f30: a22e 0050 4f66 0001 6470 0010 064a 8066 ...POf..dp...J.f 0036f40: 3448 6eff f248 6eff e248 6eff de48 6eff 4Hn..Hn..Hn..Hn. 0036f50: 5e20 6e00 0c48 6800 142f 0b4e ba0c fc2e ^ n..Hh../.N.... 0036f60: 004f ef00 1867 0c04 8000 0000 2067 0660 .O...g...... g.` 0036f70: 0001 2a7c 0170 0010 060c 4000 0166 6848 ..*|.p....@..fhH 0036f80: 6eff fc48 6eff f848 6eff f470 0030 2eff n..Hn..Hn..p.0.. 0036f90: f22f 002f 2eff e22f 0b4e ba0b 9c4a ae00 ././.../.N...J.. 0036fa0: 184f ef00 1867 0820 6e00 1830 aeff fc4a .O...g. n..0...J 0036fb0: ae00 1467 3220 6e00 1422 4828 2900 044c ...g2 n.."H()..L 0036fc0: 2840 0000 0870 0030 2eff fcb8 8064 043d (@...p.0.....d.= 0036fd0: 44ff fc20 6eff f824 6e00 1422 5272 0032 D.. n..$n.."Rr.2 0036fe0: 2eff fc20 01a2 2e20 0c67 0000 9028 ab00 ... ... .g...(.. 0036ff0: 5829 6eff de00 0439 6eff f200 0842 6c00 X)n....9n....Bl. 0037000: 0a70 0029 4000 0c42 ac00 1072 0012 060c .p.)@..B...r.... 0037010: 4100 0166 2e20 6eff f445 ec00 1422 4a72 A..f. n..E..."Jr 0037020: 02c2 ab00 5067 0a24 4872 0032 1254 8160 ....Pg.$Hr.2.T.` 0037030: 0c24 6eff f472 0012 1252 4148 c120 01a2 .$n..r...RAH. .. 0037040: 2e60 3822 6e00 0c43 e900 1420 4945 ec00 .`8"n..C... IE.. 0037050: 1422 4a72 02c2 ab00 5067 0e24 6e00 0c72 ."Jr....Pg.$n..r 0037060: 0032 2a00 1454 8160 0e24 6e00 0c72 0012 .2*..T.`.$n..r.. 0037070: 2a00 1452 4148 c120 01a2 2e48 6eff e22f *..RAH. ...Hn../ 0037080: 0b4e ba09 4e2e 0050 4f66 1070 0010 064a .N..N..POf.p...J 0037090: 8066 0470 2060 3870 0060 344a ae00 1867 .f.p `8p.`4J...g 00370a0: 0620 6e00 1842 5020 0c67 1870 0028 8029 . n..BP .g.p.(.) 00370b0: 4000 0442 ac00 0829 4000 0c42 ac00 1042 @..B...)@..B...B 00370c0: 6c00 140c 8700 0003 0a66 027e 2020 074c l........f.~ .L 00370d0: ee1c f0ff 424e 5e4e 754e 56ff be48 e707 ....BN^NuNV..H.. 00370e0: 383c 2e00 0e26 6e00 1070 002d 40ff ce2d 8<...&n..p.-@..- 00370f0: 40ff ee2d 40ff de4a ae00 0866 0670 ce60 @..-@..J...f.p.` 0037100: 0004 2a20 6e00 0828 6800 2220 0c66 0a20 ..* n..(h." .f. 0037110: 3c00 0003 0260 0004 1470 0030 064a 8067 <....`...p.0.J.g 0037120: 3270 0030 0672 01b2 8067 2870 0030 0672 2p.0.r...g(p.0.r 0037130: 04b2 8067 1e70 0030 0672 02b2 8067 1470 ...g.p.0.r...g.p 0037140: 0030 0672 03b2 8067 0a2e 3c00 000a 0560 .0.r...g..<....` 0037150: 0003 7c70 0030 064a 8067 0c70 0030 0672 ..|p.0.J.g.p.0.r 0037160: 03b2 8066 0000 9270 0030 064a 8066 082d ...f...p.0.J.f.- 0037170: 6c00 22ff ca60 062d 6c00 26ff ca4a aeff l."..`.-l.&..J.. 0037180: ca66 0a2e 3c00 0003 0a60 0003 4248 6eff .f..<....`..BHn. 0037190: de2f 2eff ca2f 0c4e ba07 9e2e 004f ef00 ./.../.N.....O.. 00371a0: 0c66 0003 2a20 6eff de70 ffb0 2800 0866 .f..* n..p..(..f 00371b0: 0a70 0030 2800 0a4a 8062 1848 6eff de2f .p.0(..J.b.Hn../ 00371c0: 0c4e ba08 0e2e 0050 4f66 0003 027e 2460 .N.....POf...~$` 00371d0: 0002 fc70 0030 064a 8066 0842 6eff fe60 ...p.0.J.f.Bn..` 00371e0: 0001 f020 6eff de70 0030 2800 0a53 803d ... n..p.0(..S.= 00371f0: 40ff fe60 0001 dc48 6eff c948 6eff fe48 @..`...Hn..Hn..H 0037200: 6eff ca48 6eff ee48 6eff de48 6eff ce2f n..Hn..Hn..Hn../ 0037210: 0b2f 0c4e ba03 f42e 004f ef00 2066 0002 ./.N.....O.. f.. 0037220: ae70 0030 0672 02b2 8066 0000 9c70 0030 .p.0.r...f...p.0 0037230: 2eff fe4a 8063 0853 6eff fe60 0001 944a ...J.c.Sn..`...J 0037240: aeff ce66 3020 6eff de2d 6800 04ff ca63 ...f0 n..-h....c 0037250: 1a48 6eff ce2f 2eff ca2f 0c4e ba06 da2e .Hn../.../.N.... 0037260: 004f ef00 0c66 0002 6660 0a2e 3c00 0003 .O...f..f`..<... 0037270: 5360 0002 5a4a aeff ee67 1248 6eff ee2f S`..ZJ...g.Hn../ 0037280: 0c4e ba07 4e2e 0050 4f66 0002 4241 eeff .N..N..POf..BA.. 0037290: ee43 eeff de20 d920 d920 d920 d941 eeff .C... . . . .A.. 00372a0: de43 eeff ce20 d920 d920 d920 d970 002d .C... . . . .p.- 00372b0: 40ff ce20 6eff de72 0032 2800 0a53 813d @.. n..r.2(..S.= 00372c0: 41ff fe60 0001 0c70 0030 0672 01b2 8066 A..`...p.0.r...f 00372d0: 0000 dc70 0010 2eff c90c 4000 0167 1c20 ...p......@..g. 00372e0: 6eff de4a 9066 1430 2eff feb0 6800 0a66 n..J.f.0....h..f 00372f0: 0a2e 3c00 0003 5460 0001 d470 0010 2eff ..<...T`...p.... 0037300: c94a 8066 1020 6eff de30 2eff feb0 6800 .J.f. n..0....h. 0037310: 0a66 0000 be70 0030 2eff fe4a 8020 6eff .f...p.0...J. n. 0037320: de72 0032 2800 0a53 81b2 806f 0852 6eff .r.2(..S...o.Rn. 0037330: fe60 0000 9e4a aeff ee66 2e20 6eff de2d .`...J...f. n..- 0037340: 50ff ca63 1a48 6eff ee2f 2eff ca2f 0c4e P..c.Hn../.../.N 0037350: ba05 e62e 004f ef00 0c66 0001 7260 0a2e .....O...f..r`.. 0037360: 3c00 0003 5460 0001 664a aeff ce67 1248 <...T`..fJ...g.H 0037370: 6eff ce2f 0c4e ba06 5a2e 0050 4f66 0001 n../.N..Z..POf.. 0037380: 4e41 eeff ce43 eeff de20 d920 d920 d920 NA...C... . . . 0037390: d941 eeff de43 eeff ee20 d920 d920 d920 .A...C... . . . 00373a0: d970 002d 40ff ee42 6eff fe60 2470 0010 .p.-@..Bn..`$p.. 00373b0: 2eff c90c 4000 0167 1820 6eff de30 2eff ....@..g. n..0.. 00373c0: feb0 6800 0a65 0a2e 3c00 0003 5460 0000 ..h..e..<...T`.. 00373d0: fe48 6eff c648 6eff c248 6eff be70 0030 .Hn..Hn..Hn..p.0 00373e0: 2eff fe2f 002f 2eff de2f 0c4e ba07 4a2e ..././.../.N..J. 00373f0: 004f ef00 1866 0000 d64a ae00 1867 0820 .O...f...J...g. 0037400: 6e00 1830 aeff c64a ae00 1467 3220 6e00 n..0...J...g2 n. 0037410: 1422 482a 2900 044c 2850 0000 0870 0030 ."H*)..L(P...p.0 0037420: 2eff c6ba 8064 043d 45ff c620 6eff c224 .....d.=E.. n..$ 0037430: 6e00 1422 5272 0032 2eff c620 01a2 2e20 n.."Rr.2... ... 0037440: 0b67 4a26 ac00 5827 6eff ca00 0437 6eff .gJ&..X'n....7n. 0037450: fe00 0842 6b00 0a70 0027 4000 0c42 ab00 ...Bk..p.'@..B.. 0037460: 1020 6eff be45 eb00 1422 4a72 02c2 ac00 . n..E..."Jr.... 0037470: 5067 0a24 4872 0032 1254 8160 0c24 6eff Pg.$Hr.2.T.`.$n. 0037480: be72 0012 1252 4148 c120 01a2 2e48 6eff .r...RAH. ...Hn. 0037490: de2f 0c4e ba05 3c2e 0050 4f66 304a aeff ./.N..<..POf0J.. 00374a0: ce67 1048 6eff ce2f 0c4e ba05 262e 0050 .g.Hn../.N..&..P 00374b0: 4f66 1a4a aeff ee67 1048 6eff ee2f 0c4e Of.J...g.Hn../.N 00374c0: ba05 102e 0050 4f66 0470 0060 5e48 6eff .....POf.p.`^Hn. 00374d0: ce2f 0c4e ba04 fc48 6eff de2f 0c4e ba04 ./.N...Hn../.N.. 00374e0: f248 6eff ee2f 0c4e ba04 e84a ae00 184f .Hn../.N...J...O 00374f0: ef00 1867 0620 6e00 1842 5020 0b67 1870 ...g. n..BP .g.p 0037500: 0026 8027 4000 0442 ab00 0827 4000 0c42 .&.'@..B...'@..B 0037510: ab00 1042 6b00 140c 8700 0003 0a67 080c ...Bk........g.. 0037520: 8700 0003 5466 027e 2020 074c ee1c e0ff ....Tf.~ .L.... 0037530: a64e 5e4e 754e 5600 0022 6e00 0820 0966 .N^NuNV.."n.. .f 0037540: 0470 ce60 0870 0023 4000 0470 004e 5e4e .p.`.p.#@..p.N^N 0037550: 754e 5600 002f 0c28 6e00 0c30 2c00 2004 uNV../.(n..0,. . 0037560: 4002 0067 2804 4002 0067 2204 4004 0067 @..g(.@..g".@..g 0037570: 1c04 4008 0067 1604 4010 0067 1004 4020 ..@..g..@..g..@ 0037580: 0067 0a04 4040 0067 0470 2560 7422 2c00 .g..@@.g.p%`t",. 0037590: 2470 0030 2c00 204a 804c 0100 0024 0020 $p.0,. J.L...$. 00375a0: 6e00 08b4 a800 0867 0470 2560 54b2 ac00 n......g.p%`T... 00375b0: 2862 0470 2560 4ab2 ac00 1062 0470 2560 (b.p%`J....b.p%` 00375c0: 40b2 ac00 1862 0470 2560 36b2 ac00 1c62 @....b.p%`6....b 00375d0: 0470 2560 2c70 0030 2c00 0e0c 4000 1063 .p%`,p.0,...@..c 00375e0: 0470 2560 1c10 2c00 3267 1404 0000 8067 .p%`..,.2g.....g 00375f0: 0e04 0000 7f67 0820 3c00 0003 5560 0270 .....g. <...U`.p 0037600: 0028 6eff fc4e 5e4e 754e 56ff 7448 e703 .(n..N^NuNV.tH.. 0037610: 3824 6e00 1026 6e00 0828 6e00 1470 0024 8$n..&n..(n..p.$ 0037620: 8028 8020 6e00 1820 8042 064a ae00 0c66 .(. n.. .B.J...f 0037630: 0a2e 3c00 0003 0860 0002 8a48 6eff ff2f ..<....`...Hn../ 0037640: 2e00 0c2f 0b4e ba02 ba2e 004f ef00 0c66 .../.N.....O...f 0037650: 0002 7220 6e00 0c2d 6800 04ff f44a 2eff ..r n..-h....J.. 0037660: ff67 0001 ea2f 0c2f 2eff f42f 0b4e ba02 .g..././.../.N.. 0037670: c82e 0070 24b0 874f ef00 0c67 0001 d04a ...p$..O...g...J 0037680: 8766 0002 4020 5470 ffb0 2800 0866 0001 .f..@ Tp..(..f.. 0037690: be70 0030 2800 0a4a 8063 0001 b252 ab02 .p.0(..J.c...R.. 00376a0: a248 6eff fa20 6e00 0c48 6800 142f 142f .Hn.. n..Hh.././ 00376b0: 0b4e ba05 361c 0070 0010 060c 4000 014f .N..6..p....@..O 00376c0: ef00 1067 0001 e470 0030 2eff fa4a 8066 ...g...p.0...J.f 00376d0: 0000 d620 544a a800 0467 0001 ce2d 6800 ... TJ...g...-h. 00376e0: 04ff f42f 0a20 542f 2800 042f 0b4e ba02 .../. T/(../.N.. 00376f0: 482e 004f ef00 0c66 0001 ca20 5270 ffb0 H..O...f... Rp.. 0037700: 2800 0866 0001 4870 0030 2800 0a4a 8063 (..f..Hp.0(..J.c 0037710: 0001 3c48 6eff f820 6e00 0c48 6800 142f ...p.0..@. 0037b00: 0e64 0470 2460 2670 0030 074a 8008 0000 .d.p$`&p.0.J.... 0037b10: 0067 0470 2460 16ba 4762 0470 2460 0eb8 .g.p$`..Gb.p$`.. 0037b20: 4762 0470 2460 0653 866c b870 004c ee18 Gb.p$`.S.l.p.L.. 0037b30: f0ff e84e 5e4e 754e 5600 0048 e706 3824 ...N^NuNV..H..8$ 0037b40: 6e00 143a 2e00 1226 6e00 0828 6e00 0cba n..:...&n..(n... 0037b50: 6c00 0a65 0670 2060 0000 8670 0030 2b00 l..e.p `...p.0+. 0037b60: 2ad0 8c72 0032 05e3 8990 8155 8020 4034 *..r.2.....U. @4 0037b70: 1070 0030 02d0 8c24 8070 02c0 ab00 5067 .p.0...$.p....Pg 0037b80: 0820 5230 1054 4060 0a20 5270 0010 1052 . R0.T@`. Rp...R 0037b90: 4048 c03c 0070 0030 0672 01c2 4070 0030 @H.<.p.0.r..@p.0 0037ba0: 014a 8067 0252 46d4 4670 0030 02d0 8c20 .J.g.RF.Fp.0... 0037bb0: 6e00 1820 8070 0030 2b00 2ad0 8c72 0032 n.. .p.0+.*..r.2 0037bc0: 0552 81e3 8990 8155 8020 403c 1070 0030 .R.....U. @<.p.0 0037bd0: 0672 0032 0290 8120 6e00 1c30 8070 004c .r.2... n..0.p.L 0037be0: ee1c 60ff ec4e 5e4e 754e 5600 0048 e707 ..`..N^NuNV..H.. 0037bf0: 3c24 6e00 1028 6e00 0c20 6e00 082a 6800 <$n..(n.. n..*h. 0037c00: 0470 0030 2800 2a47 f408 fe7c 002a 063a .p.0(.*G...|.*.: 0037c10: 2c00 0a53 8560 282e 06de 85e2 8f22 4c20 ,..S.`(......"L 0037c20: 0744 80d2 f30a 002f 092f 0a4e 9550 4f4a .D....././.N.POJ 0037c30: 8067 166e 062a 0753 8560 042c 0752 86bc .g.n.*.S.`.,.R.. 0037c40: 856f d42e 0670 0060 0270 0120 6e00 1430 .o...p.`.p. n..0 0037c50: 874c df3c e04e 5e4e 754e 56ff e448 e70f .L.<.N^NuNV..H.. 0037c60: 1826 6e00 1028 6e00 0870 0030 2c00 184a .&n..(n..p.0,..J 0037c70: 8066 0a2e 3c00 0003 0a60 0000 f02c 2c00 .f..<....`...,,. 0037c80: 1a70 0026 8042 6b00 044a 8666 067e c460 .p.&.Bk..J.f.~.` 0037c90: 0000 da48 6eff e42f 062f 0c4e bafc 9a2e ...Hn.././.N.... 0037ca0: 004f ef00 0c66 0000 c448 6eff f42f 2e00 .O...f...Hn../.. 0037cb0: 0c2f 2eff e42f 0c4e baff 3018 0020 6eff ./.../.N..0.. n. 0037cc0: e47a 001a 2800 0948 c527 865e 0020 6eff .z..(..H.'.^. n. 0037cd0: e470 ffb0 2800 084f ef00 1066 0a48 c537 .p..(..O...f.H.7 0037ce0: aeff f45e 0460 5a70 0010 040c 4000 0167 ...^.`Zp....@..g 0037cf0: 0e70 0030 2eff f44a 8067 0453 6eff f448 .p.0...J.g.Sn..H 0037d00: c537 aeff f45e 0448 6eff fe48 6eff fa48 .7...^.Hn..Hn..H 0037d10: 6eff f670 0030 2eff f42f 002f 2eff e42f n..p.0..././.../ 0037d20: 0c4e bafe 1420 6eff fa2c 1048 6eff e42f .N... n..,.Hn../ 0037d30: 0c4e bafc 9e2e 004f ef00 2066 2e60 00ff .N.....O.. f.`.. 0037d40: 4a20 6e00 1420 8620 6e00 1843 eeff e420 J n.. . n..C... 0037d50: d920 d920 d920 d920 6e00 1c30 aeff f44a . . . . n..0...J 0037d60: 0467 0470 0060 2270 2060 1e20 6e00 1470 .g.p.`"p `. n..p 0037d70: 0020 8020 6e00 1820 8020 6e00 1821 4000 . . n.. . n..!@. 0037d80: 0420 6e00 1c42 5020 074c ee18 f0ff cc4e . n..BP .L.....N 0037d90: 5e4e 754e 5600 002f 0b26 6e00 0c22 6e00 ^NuNV../.&n.."n. 0037da0: 0872 ff20 2900 04b0 ab00 0466 3410 2900 .r. )......f4.). 0037db0: 02b0 2b00 0266 1c20 2900 08b0 ab00 0866 ..+..f. )......f 0037dc0: 0472 0060 2820 2900 08b0 ab00 0863 1e72 .r.`( )......c.r 0037dd0: 0160 1a10 2900 02b0 2b00 0263 1072 0160 .`..)...+..c.r.` 0037de0: 0c20 2900 04b0 ab00 0463 0272 0120 0126 . )......c.r. .& 0037df0: 6eff fc4e 5e4e 754e 5600 0048 e707 182c n..N^NuNV..H..., 0037e00: 2e00 0c7e 004a 8667 0000 a870 04b0 8663 ...~.J.g...p...c 0037e10: 0e26 6e00 0816 c753 8666 fa60 0000 947a .&n....S.f.`...z 0037e20: 03ca ae00 084a 8567 2426 6e00 0816 c752 .....J.g$&n....R 0037e30: 8553 8670 04b0 8563 044a 8662 f04a 8667 .S.p...c.J.b.J.g 0037e40: 7070 fcc0 ae00 0828 4058 4c60 0870 fcc0 pp.....(@XL`.p.. 0037e50: ae00 0828 407a 03ca 864a 8567 1820 0cd0 ...(@z...J.g. .. 0037e60: 8626 4053 4b9c 8520 4b53 4b10 8753 8566 .&@SK.. KSK..S.f 0037e70: f64a 8667 3c7a 3fca 864a 8567 0a9c 85e4 .J.g.S 0037ee0: 8430 07e0 4872 0032 003a 341a 0070 0030 .0..Hr.2.:4..p.0 0037ef0: 054a 8067 1870 0030 0572 0032 0734 3c00 .J.g.p.0.r.2.4<. 0037f00: ffc4 4172 0032 02d2 803e 341a 004a 8467 ..Ar.2...>4..J.g 0037f10: 3a70 0030 074a 8067 c460 303c 1a53 8330 :p.0.J.g.`0<.S.0 0037f20: 06e0 4872 0032 003a 341a 0070 0030 054a ..Hr.2.:4..p.0.J 0037f30: 8067 1870 0030 0572 0032 0634 3c00 ffc4 .g.p.0.r.2.4<... 0037f40: 4172 0032 02d2 803c 341a 004a 8367 0870 Ar.2...<4..J.g.p 0037f50: 0030 064a 8067 c4bc 4766 0e70 0030 074a .0.J.g..Gf.p.0.J 0037f60: 8066 00ff 7470 0060 0abc 4763 0470 ff60 .f..tp.`..Gc.p.` 0037f70: 0270 014c ee1c f8ff e04e 5e4e 7501 0002 .p.L.....N^Nu... 0037f80: 0000 0003 0004 0005 0000 0000 0000 0000 ................ 0037f90: 0000 0000 0000 0000 0000 0000 0006 0000 ................ 0037fa0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0037fb0: 0000 0000 0000 0000 0000 0000 0007 0008 ................ 0037fc0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 0038170: 0000 0000 0000 0000 0009 000a 00ff ff00 ................ 0038180: 0100 0200 0300 0400 0500 0600 0700 0800 ................ 0038190: 0900 0a00 0b00 0c00 0d00 0e00 0f00 1000 ................ 00381a0: 1100 1200 1300 1400 1500 1600 1700 1800 ................ 00381b0: 1900 1a00 1b00 1c00 1d00 1e00 1f00 2000 .............. . 00381c0: 2100 2200 2300 2400 2500 2600 2700 2800 !.".#.$.%.&.'.(. 00381d0: 2900 2a00 2b00 2c00 2d00 2e00 2f00 3000 ).*.+.,.-.../.0. 00381e0: 3100 3200 3300 3400 3500 3600 3700 3800 1.2.3.4.5.6.7.8. 00381f0: 3900 3a00 3b00 3c00 3d00 3e00 3f00 4000 9.:.;.<.=.>.?.@. 0038200: 6100 6200 6300 6400 6500 6600 6700 6800 a.b.c.d.e.f.g.h. 0038210: 6900 6a00 6b00 6c00 6d00 6e00 6f00 7000 i.j.k.l.m.n.o.p. 0038220: 7100 7200 7300 7400 7500 7600 7700 7800 q.r.s.t.u.v.w.x. 0038230: 7900 7a00 5b00 5c00 5d00 5e00 5f00 6000 y.z.[.\.].^._.`. 0038240: 6100 6200 6300 6400 6500 6600 6700 6800 a.b.c.d.e.f.g.h. 0038250: 6900 6a00 6b00 6c00 6d00 6e00 6f00 7000 i.j.k.l.m.n.o.p. 0038260: 7100 7200 7300 7400 7500 7600 7700 7800 q.r.s.t.u.v.w.x. 0038270: 7900 7a00 7b00 7c00 7d00 7e00 7f00 8000 y.z.{.|.}.~..... 0038280: 8100 8200 8300 8400 8500 8600 8700 8800 ................ 0038290: 8900 8a00 8b00 8c00 8d00 8e00 8f00 9000 ................ 00382a0: 9100 9200 9300 9400 9500 9600 9700 9800 ................ 00382b0: 9900 9a00 9b00 9c00 9d00 9e00 9f00 a000 ................ 00382c0: a100 a200 a300 a400 a500 a600 a700 a800 ................ 00382d0: a900 aa00 ab00 ac00 ad00 ae00 af00 b000 ................ 00382e0: b100 b200 b300 b400 b500 b600 b700 b800 ................ 00382f0: b900 ba00 bb00 bc00 bd00 be00 bf00 c000 ................ 0038300: c100 c200 c300 c400 c500 e600 c700 c800 ................ 0038310: c900 ca00 cb00 cc00 cd00 ce00 cf00 f000 ................ 0038320: d100 d200 d300 d400 d500 d600 d700 f800 ................ 0038330: d900 da00 db00 dc00 dd00 fe00 df00 e000 ................ 0038340: e100 e200 e300 e400 e500 e600 e700 e800 ................ 0038350: e900 ea00 eb00 ec00 ed00 ee00 ef00 f000 ................ 0038360: f100 f200 f300 f400 f500 f600 f700 f800 ................ 0038370: f900 fa00 fb00 fc00 fd00 fe00 ff01 0001 ................ 0038380: 0101 0201 0301 0401 0501 0601 0701 0801 ................ 0038390: 0901 0a01 0b01 0c01 0d01 0e01 0f01 1101 ................ 00383a0: 1101 1201 1301 1401 1501 1601 1701 1801 ................ 00383b0: 1901 1a01 1b01 1c01 1d01 1e01 1f01 2001 .............. . 00383c0: 2101 2201 2301 2401 2501 2701 2701 2801 !.".#.$.%.'.'.(. 00383d0: 2901 2a01 2b01 2c01 2d01 2e01 2f01 3001 ).*.+.,.-.../.0. 00383e0: 3101 3301 3301 3401 3501 3601 3701 3801 1.3.3.4.5.6.7.8. 00383f0: 3901 3a01 3b01 3c01 3d01 3e01 4001 4001 9.:.;.<.=.>.@.@. 0038400: 4201 4201 4301 4401 4501 4601 4701 4801 B.B.C.D.E.F.G.H. 0038410: 4901 4b01 4b01 4c01 4d01 4e01 4f01 5001 I.K.K.L.M.N.O.P. 0038420: 5101 5301 5301 5401 5501 5601 5701 5801 Q.S.S.T.U.V.W.X. 0038430: 5901 5a01 5b01 5c01 5d01 5e01 5f01 6001 Y.Z.[.\.].^._.`. 0038440: 6101 6201 6301 6401 6501 6701 6701 6801 a.b.c.d.e.g.g.h. 0038450: 6901 6a01 6b01 6c01 6d01 6e01 6f01 7001 i.j.k.l.m.n.o.p. 0038460: 7101 7201 7301 7401 7501 7601 7701 7801 q.r.s.t.u.v.w.x. 0038470: 7901 7a01 7b01 7c01 7d01 7e01 7f01 8002 y.z.{.|.}.~..... 0038480: 5301 8301 8301 8501 8502 5401 8801 8802 S.........T..... 0038490: 5602 5701 8c01 8c01 8d01 dd02 5902 5b01 V.W.........Y.[. 00384a0: 9201 9202 6002 6301 9502 6902 6801 9901 ....`.c...i.h... 00384b0: 9901 9a01 9b02 6f02 7201 9e02 7501 a001 ......o.r...u... 00384c0: a101 a301 a301 a501 a501 a601 a801 a802 ................ 00384d0: 8301 aa01 ab01 ad01 ad02 8801 af01 b002 ................ 00384e0: 8a02 8b01 b401 b401 b601 b602 9201 b901 ................ 00384f0: b901 ba01 bb01 bd01 bd01 be01 bf01 c001 ................ 0038500: c101 c201 c301 c601 c601 c601 c901 c901 ................ 0038510: c901 cc01 cc01 cc01 cd01 ce01 cf01 d001 ................ 0038520: d101 d201 d301 d401 d501 d601 d701 d801 ................ 0038530: d901 da01 db01 dc01 dd01 de01 df01 e001 ................ 0038540: e101 e201 e301 e501 e501 e601 e701 e801 ................ 0038550: e901 ea01 eb01 ec01 ed01 ee01 ef01 f001 ................ 0038560: f301 f301 f301 f401 f501 f601 f701 f801 ................ 0038570: f901 fa01 fb01 fc01 fd01 fe01 ff03 0003 ................ 0038580: 0103 0203 0303 0403 0503 0603 0703 0803 ................ 0038590: 0903 0a03 0b03 0c03 0d03 0e03 0f03 1003 ................ 00385a0: 1103 1203 1303 1403 1503 1603 1703 1803 ................ 00385b0: 1903 1a03 1b03 1c03 1d03 1e03 1f03 2003 .............. . 00385c0: 2103 2203 2303 2403 2503 2603 2703 2803 !.".#.$.%.&.'.(. 00385d0: 2903 2a03 2b03 2c03 2d03 2e03 2f03 3003 ).*.+.,.-.../.0. 00385e0: 3103 3203 3303 3403 3503 3603 3703 3803 1.2.3.4.5.6.7.8. 00385f0: 3903 3a03 3b03 3c03 3d03 3e03 3f03 4003 9.:.;.<.=.>.?.@. 0038600: 4103 4203 4303 4403 4503 4603 4703 4803 A.B.C.D.E.F.G.H. 0038610: 4903 4a03 4b03 4c03 4d03 4e03 4f03 5003 I.J.K.L.M.N.O.P. 0038620: 5103 5203 5303 5403 5503 5603 5703 5803 Q.R.S.T.U.V.W.X. 0038630: 5903 5a03 5b03 5c03 5d03 5e03 5f03 6003 Y.Z.[.\.].^._.`. 0038640: 6103 6203 6303 6403 6503 6603 6703 6803 a.b.c.d.e.f.g.h. 0038650: 6903 6a03 6b03 6c03 6d03 6e03 6f03 7003 i.j.k.l.m.n.o.p. 0038660: 7103 7203 7303 7403 7503 7603 7703 7803 q.r.s.t.u.v.w.x. 0038670: 7903 7a03 7b03 7c03 7d03 7e03 7f03 8003 y.z.{.|.}.~..... 0038680: 8103 8203 8303 8403 8503 8603 8703 8803 ................ 0038690: 8903 8a03 8b03 8c03 8d03 8e03 8f03 9003 ................ 00386a0: b103 b203 b303 b403 b503 b603 b703 b803 ................ 00386b0: b903 ba03 bb03 bc03 bd03 be03 bf03 c003 ................ 00386c0: c103 a203 c303 c403 c503 c603 c703 c803 ................ 00386d0: c903 aa03 ab03 ac03 ad03 ae03 af03 b003 ................ 00386e0: b103 b203 b303 b403 b503 b603 b703 b803 ................ 00386f0: b903 ba03 bb03 bc03 bd03 be03 bf03 c003 ................ 0038700: c103 c203 c303 c403 c503 c603 c703 c803 ................ 0038710: c903 ca03 cb03 cc03 cd03 ce03 cf03 d003 ................ 0038720: d103 d203 d303 d403 d503 d603 d703 d803 ................ 0038730: d903 da03 db03 dc03 dd03 de03 df03 e003 ................ 0038740: e103 e303 e303 e503 e503 e703 e703 e903 ................ 0038750: e903 eb03 eb03 ed03 ed03 ef03 ef03 f003 ................ 0038760: f103 f203 f303 f403 f503 f603 f703 f803 ................ 0038770: f903 fa03 fb03 fc03 fd03 fe03 ff04 0004 ................ 0038780: 0104 5204 0304 5404 5504 5604 0704 5804 ..R...T.U.V...X. 0038790: 5904 5a04 5b04 0c04 0d04 0e04 5f04 3004 Y.Z.[......._.0. 00387a0: 3104 3204 3304 3404 3504 3604 3704 3804 1.2.3.4.5.6.7.8. 00387b0: 1904 3a04 3b04 3c04 3d04 3e04 3f04 4004 ..:.;.<.=.>.?.@. 00387c0: 4104 4204 4304 4404 4504 4604 4704 4804 A.B.C.D.E.F.G.H. 00387d0: 4904 4a04 4b04 4c04 4d04 4e04 4f04 3004 I.J.K.L.M.N.O.0. 00387e0: 3104 3204 3304 3404 3504 3604 3704 3804 1.2.3.4.5.6.7.8. 00387f0: 3904 3a04 3b04 3c04 3d04 3e04 3f04 4004 9.:.;.<.=.>.?.@. 0038800: 4104 4204 4304 4404 4504 4604 4704 4804 A.B.C.D.E.F.G.H. 0038810: 4904 4a04 4b04 4c04 4d04 4e04 4f04 5004 I.J.K.L.M.N.O.P. 0038820: 5104 5204 5304 5404 5504 5604 5704 5804 Q.R.S.T.U.V.W.X. 0038830: 5904 5a04 5b04 5c04 5d04 5e04 5f04 6104 Y.Z.[.\.].^._.a. 0038840: 6104 6304 6304 6504 6504 6704 6704 6904 a.c.c.e.e.g.g.i. 0038850: 6904 6b04 6b04 6d04 6d04 6f04 6f04 7104 i.k.k.m.m.o.o.q. 0038860: 7104 7304 7304 7504 7504 7604 7704 7904 q.s.s.u.u.v.w.y. 0038870: 7904 7b04 7b04 7d04 7d04 7f04 7f04 8104 y.{.{.}.}....... 0038880: 8104 8204 8304 8404 8504 8604 8704 8804 ................ 0038890: 8904 8a04 8b04 8c04 8d04 8e04 8f04 9104 ................ 00388a0: 9104 9304 9304 9504 9504 9704 9704 9904 ................ 00388b0: 9904 9b04 9b04 9d04 9d04 9f04 9f04 a104 ................ 00388c0: a104 a304 a304 a504 a504 a704 a704 a904 ................ 00388d0: a904 ab04 ab04 ad04 ad04 af04 af04 b104 ................ 00388e0: b104 b304 b304 b504 b504 b704 b704 b904 ................ 00388f0: b904 bb04 bb04 bd04 bd04 bf04 bf04 c004 ................ 0038900: c104 c204 c404 c404 c504 c604 c804 c804 ................ 0038910: c904 ca04 cc04 cc04 cd04 ce04 cf04 d004 ................ 0038920: d104 d204 d304 d404 d504 d604 d704 d804 ................ 0038930: d904 da04 db04 dc04 dd04 de04 df04 e004 ................ 0038940: e104 e204 e304 e404 e504 e604 e704 e804 ................ 0038950: e904 ea04 eb04 ec04 ed04 ee04 ef04 f004 ................ 0038960: f104 f204 f304 f404 f504 f604 f704 f804 ................ 0038970: f904 fa04 fb04 fc04 fd04 fe04 ff05 0005 ................ 0038980: 0105 0205 0305 0405 0505 0605 0705 0805 ................ 0038990: 0905 0a05 0b05 0c05 0d05 0e05 0f05 1005 ................ 00389a0: 1105 1205 1305 1405 1505 1605 1705 1805 ................ 00389b0: 1905 1a05 1b05 1c05 1d05 1e05 1f05 2005 .............. . 00389c0: 2105 2205 2305 2405 2505 2605 2705 2805 !.".#.$.%.&.'.(. 00389d0: 2905 2a05 2b05 2c05 2d05 2e05 2f05 3005 ).*.+.,.-.../.0. 00389e0: 6105 6205 6305 6405 6505 6605 6705 6805 a.b.c.d.e.f.g.h. 00389f0: 6905 6a05 6b05 6c05 6d05 6e05 6f05 7005 i.j.k.l.m.n.o.p. 0038a00: 7105 7205 7305 7405 7505 7605 7705 7805 q.r.s.t.u.v.w.x. 0038a10: 7905 7a05 7b05 7c05 7d05 7e05 7f05 8005 y.z.{.|.}.~..... 0038a20: 8105 8205 8305 8405 8505 8605 5705 5805 ............W.X. 0038a30: 5905 5a05 5b05 5c05 5d05 5e05 5f05 6005 Y.Z.[.\.].^._.`. 0038a40: 6105 6205 6305 6405 6505 6605 6705 6805 a.b.c.d.e.f.g.h. 0038a50: 6905 6a05 6b05 6c05 6d05 6e05 6f05 7005 i.j.k.l.m.n.o.p. 0038a60: 7105 7205 7305 7405 7505 7605 7705 7805 q.r.s.t.u.v.w.x. 0038a70: 7905 7a05 7b05 7c05 7d05 7e05 7f05 8005 y.z.{.|.}.~..... 0038a80: 8105 8205 8305 8405 8505 8605 8705 8805 ................ 0038a90: 8905 8a05 8b05 8c05 8d05 8e05 8f05 9005 ................ 0038aa0: 9105 9205 9305 9405 9505 9605 9705 9805 ................ 0038ab0: 9905 9a05 9b05 9c05 9d05 9e05 9f05 a005 ................ 0038ac0: a105 a205 a305 a405 a505 a605 a705 a805 ................ 0038ad0: a905 aa05 ab05 ac05 ad05 ae05 af05 b005 ................ 0038ae0: b105 b205 b305 b405 b505 b605 b705 b805 ................ 0038af0: b905 ba05 bb05 bc05 bd05 be05 bf05 c005 ................ 0038b00: c105 c205 c305 c405 c505 c605 c705 c805 ................ 0038b10: c905 ca05 cb05 cc05 cd05 ce05 cf05 d005 ................ 0038b20: d105 d205 d305 d405 d505 d605 d705 d805 ................ 0038b30: d905 da05 db05 dc05 dd05 de05 df05 e005 ................ 0038b40: e105 e205 e305 e405 e505 e605 e705 e805 ................ 0038b50: e905 ea05 eb05 ec05 ed05 ee05 ef05 f005 ................ 0038b60: f105 f205 f305 f405 f505 f605 f705 f805 ................ 0038b70: f905 fa05 fb05 fc05 fd05 fe05 ff10 0010 ................ 0038b80: 0110 0210 0310 0410 0510 0610 0710 0810 ................ 0038b90: 0910 0a10 0b10 0c10 0d10 0e10 0f10 1010 ................ 0038ba0: 1110 1210 1310 1410 1510 1610 1710 1810 ................ 0038bb0: 1910 1a10 1b10 1c10 1d10 1e10 1f10 2010 .............. . 0038bc0: 2110 2210 2310 2410 2510 2610 2710 2810 !.".#.$.%.&.'.(. 0038bd0: 2910 2a10 2b10 2c10 2d10 2e10 2f10 3010 ).*.+.,.-.../.0. 0038be0: 3110 3210 3310 3410 3510 3610 3710 3810 1.2.3.4.5.6.7.8. 0038bf0: 3910 3a10 3b10 3c10 3d10 3e10 3f10 4010 9.:.;.<.=.>.?.@. 0038c00: 4110 4210 4310 4410 4510 4610 4710 4810 A.B.C.D.E.F.G.H. 0038c10: 4910 4a10 4b10 4c10 4d10 4e10 4f10 5010 I.J.K.L.M.N.O.P. 0038c20: 5110 5210 5310 5410 5510 5610 5710 5810 Q.R.S.T.U.V.W.X. 0038c30: 5910 5a10 5b10 5c10 5d10 5e10 5f10 6010 Y.Z.[.\.].^._.`. 0038c40: 6110 6210 6310 6410 6510 6610 6710 6810 a.b.c.d.e.f.g.h. 0038c50: 6910 6a10 6b10 6c10 6d10 6e10 6f10 7010 i.j.k.l.m.n.o.p. 0038c60: 7110 7210 7310 7410 7510 7610 7710 7810 q.r.s.t.u.v.w.x. 0038c70: 7910 7a10 7b10 7c10 7d10 7e10 7f10 8010 y.z.{.|.}.~..... 0038c80: 8110 8210 8310 8410 8510 8610 8710 8810 ................ 0038c90: 8910 8a10 8b10 8c10 8d10 8e10 8f10 9010 ................ 0038ca0: 9110 9210 9310 9410 9510 9610 9710 9810 ................ 0038cb0: 9910 9a10 9b10 9c10 9d10 9e10 9f10 d010 ................ 0038cc0: d110 d210 d310 d410 d510 d610 d710 d810 ................ 0038cd0: d910 da10 db10 dc10 dd10 de10 df10 e010 ................ 0038ce0: e110 e210 e310 e410 e510 e610 e710 e810 ................ 0038cf0: e910 ea10 eb10 ec10 ed10 ee10 ef10 f010 ................ 0038d00: f110 f210 f310 f410 f510 c610 c710 c810 ................ 0038d10: c910 ca10 cb10 cc10 cd10 ce10 cf10 d010 ................ 0038d20: d110 d210 d310 d410 d510 d610 d710 d810 ................ 0038d30: d910 da10 db10 dc10 dd10 de10 df10 e010 ................ 0038d40: e110 e210 e310 e410 e510 e610 e710 e810 ................ 0038d50: e910 ea10 eb10 ec10 ed10 ee10 ef10 f010 ................ 0038d60: f110 f210 f310 f410 f510 f610 f710 f810 ................ 0038d70: f910 fa10 fb10 fc10 fd10 fe10 ff20 0020 ............. . 0038d80: 0120 0220 0320 0420 0520 0620 0720 0820 . . . . . . . . 0038d90: 0920 0a20 0b00 0000 0000 0000 0020 1020 . . ......... . 0038da0: 1120 1220 1320 1420 1520 1620 1720 1820 . . . . . . . . 0038db0: 1920 1a20 1b20 1c20 1d20 1e20 1f20 2020 . . . . . . . 0038dc0: 2120 2220 2320 2420 2520 2620 2720 2820 ! " # $ % & ' ( 0038dd0: 2900 0000 0000 0000 0000 0020 2f20 3020 ).......... / 0 0038de0: 3120 3220 3320 3420 3520 3620 3720 3820 1 2 3 4 5 6 7 8 0038df0: 3920 3a20 3b20 3c20 3d20 3e20 3f20 4020 9 : ; < = > ? @ 0038e00: 4120 4220 4320 4420 4520 4620 4720 4820 A B C D E F G H 0038e10: 4920 4a20 4b20 4c20 4d20 4e20 4f20 5020 I J K L M N O P 0038e20: 5120 5220 5320 5420 5520 5620 5720 5820 Q R S T U V W X 0038e30: 5920 5a20 5b20 5c20 5d20 5e20 5f20 6020 Y Z [ \ ] ^ _ ` 0038e40: 6120 6220 6320 6420 6520 6620 6720 6820 a b c d e f g h 0038e50: 6900 0000 0000 0000 0000 0000 0020 7020 i............ p 0038e60: 7120 7220 7320 7420 7520 7620 7720 7820 q r s t u v w x 0038e70: 7920 7a20 7b20 7c20 7d20 7e20 7f20 8020 y z { | } ~ . . 0038e80: 8120 8220 8320 8420 8520 8620 8720 8820 . . . . . . . . 0038e90: 8920 8a20 8b20 8c20 8d20 8e20 8f20 9020 . . . . . . . . 0038ea0: 9120 9220 9320 9420 9520 9620 9720 9820 . . . . . . . . 0038eb0: 9920 9a20 9b20 9c20 9d20 9e20 9f20 a020 . . . . . . . . 0038ec0: a120 a220 a320 a420 a520 a620 a720 a820 . . . . . . . . 0038ed0: a920 aa20 ab20 ac20 ad20 ae20 af20 b020 . . . . . . . . 0038ee0: b120 b220 b320 b420 b520 b620 b720 b820 . . . . . . . . 0038ef0: b920 ba20 bb20 bc20 bd20 be20 bf20 c020 . . . . . . . . 0038f00: c120 c220 c320 c420 c520 c620 c720 c820 . . . . . . . . 0038f10: c920 ca20 cb20 cc20 cd20 ce20 cf20 d020 . . . . . . . . 0038f20: d120 d220 d320 d420 d520 d620 d720 d820 . . . . . . . . 0038f30: d920 da20 db20 dc20 dd20 de20 df20 e020 . . . . . . . . 0038f40: e120 e220 e320 e420 e520 e620 e720 e820 . . . . . . . . 0038f50: e920 ea20 eb20 ec20 ed20 ee20 ef20 f020 . . . . . . . . 0038f60: f120 f220 f320 f420 f520 f620 f720 f820 . . . . . . . . 0038f70: f920 fa20 fb20 fc20 fd20 fe20 ff21 0021 . . . . . . .!.! 0038f80: 0121 0221 0321 0421 0521 0621 0721 0821 .!.!.!.!.!.!.!.! 0038f90: 0921 0a21 0b21 0c21 0d21 0e21 0f21 1021 .!.!.!.!.!.!.!.! 0038fa0: 1121 1221 1321 1421 1521 1621 1721 1821 .!.!.!.!.!.!.!.! 0038fb0: 1921 1a21 1b21 1c21 1d21 1e21 1f21 2021 .!.!.!.!.!.!.! ! 0038fc0: 2121 2221 2321 2421 2521 2621 2721 2821 !!"!#!$!%!&!'!(! 0038fd0: 2921 2a21 2b21 2c21 2d21 2e21 2f21 3021 )!*!+!,!-!.!/!0! 0038fe0: 3121 3221 3321 3421 3521 3621 3721 3821 1!2!3!4!5!6!7!8! 0038ff0: 3921 3a21 3b21 3c21 3d21 3e21 3f21 4021 9!:!;!!?!@! 0039000: 4121 4221 4321 4421 4521 4621 4721 4821 A!B!C!D!E!F!G!H! 0039010: 4921 4a21 4b21 4c21 4d21 4e21 4f21 5021 I!J!K!L!M!N!O!P! 0039020: 5121 5221 5321 5421 5521 5621 5721 5821 Q!R!S!T!U!V!W!X! 0039030: 5921 5a21 5b21 5c21 5d21 5e21 5f21 7021 Y!Z![!\!]!^!_!p! 0039040: 7121 7221 7321 7421 7521 7621 7721 7821 q!r!s!t!u!v!w!x! 0039050: 7921 7a21 7b21 7c21 7d21 7e21 7f21 7021 y!z!{!|!}!~!.!p! 0039060: 7121 7221 7321 7421 7521 7621 7721 7821 q!r!s!t!u!v!w!x! 0039070: 7921 7a21 7b21 7c21 7d21 7e21 7f21 8021 y!z!{!|!}!~!.!.! 0039080: 8121 8221 8321 8421 8521 8621 8721 8821 .!.!.!.!.!.!.!.! 0039090: 8921 8a21 8b21 8c21 8d21 8e21 8f21 9021 .!.!.!.!.!.!.!.! 00390a0: 9121 9221 9321 9421 9521 9621 9721 9821 .!.!.!.!.!.!.!.! 00390b0: 9921 9a21 9b21 9c21 9d21 9e21 9f21 a021 .!.!.!.!.!.!.!.! 00390c0: a121 a221 a321 a421 a521 a621 a721 a821 .!.!.!.!.!.!.!.! 00390d0: a921 aa21 ab21 ac21 ad21 ae21 af21 b021 .!.!.!.!.!.!.!.! 00390e0: b121 b221 b321 b421 b521 b621 b721 b821 .!.!.!.!.!.!.!.! 00390f0: b921 ba21 bb21 bc21 bd21 be21 bf21 c021 .!.!.!.!.!.!.!.! 0039100: c121 c221 c321 c421 c521 c621 c721 c821 .!.!.!.!.!.!.!.! 0039110: c921 ca21 cb21 cc21 cd21 ce21 cf21 d021 .!.!.!.!.!.!.!.! 0039120: d121 d221 d321 d421 d521 d621 d721 d821 .!.!.!.!.!.!.!.! 0039130: d921 da21 db21 dc21 dd21 de21 df21 e021 .!.!.!.!.!.!.!.! 0039140: e121 e221 e321 e421 e521 e621 e721 e821 .!.!.!.!.!.!.!.! 0039150: e921 ea21 eb21 ec21 ed21 ee21 ef21 f021 .!.!.!.!.!.!.!.! 0039160: f121 f221 f321 f421 f521 f621 f721 f821 .!.!.!.!.!.!.!.! 0039170: f921 fa21 fb21 fc21 fd21 fe21 fffe 00fe .!.!.!.!.!.!.... 0039180: 01fe 02fe 03fe 04fe 05fe 06fe 07fe 08fe ................ 0039190: 09fe 0afe 0bfe 0cfe 0dfe 0efe 0ffe 10fe ................ 00391a0: 11fe 12fe 13fe 14fe 15fe 16fe 17fe 18fe ................ 00391b0: 19fe 1afe 1bfe 1cfe 1dfe 1efe 1ffe 20fe .............. . 00391c0: 21fe 22fe 23fe 24fe 25fe 26fe 27fe 28fe !.".#.$.%.&.'.(. 00391d0: 29fe 2afe 2bfe 2cfe 2dfe 2efe 2ffe 30fe ).*.+.,.-.../.0. 00391e0: 31fe 32fe 33fe 34fe 35fe 36fe 37fe 38fe 1.2.3.4.5.6.7.8. 00391f0: 39fe 3afe 3bfe 3cfe 3dfe 3efe 3ffe 40fe 9.:.;.<.=.>.?.@. 0039200: 41fe 42fe 43fe 44fe 45fe 46fe 47fe 48fe A.B.C.D.E.F.G.H. 0039210: 49fe 4afe 4bfe 4cfe 4dfe 4efe 4ffe 50fe I.J.K.L.M.N.O.P. 0039220: 51fe 52fe 53fe 54fe 55fe 56fe 57fe 58fe Q.R.S.T.U.V.W.X. 0039230: 59fe 5afe 5bfe 5cfe 5dfe 5efe 5ffe 60fe Y.Z.[.\.].^._.`. 0039240: 61fe 62fe 63fe 64fe 65fe 66fe 67fe 68fe a.b.c.d.e.f.g.h. 0039250: 69fe 6afe 6bfe 6cfe 6dfe 6efe 6ffe 70fe i.j.k.l.m.n.o.p. 0039260: 71fe 72fe 73fe 74fe 75fe 76fe 77fe 78fe q.r.s.t.u.v.w.x. 0039270: 79fe 7afe 7bfe 7cfe 7dfe 7efe 7ffe 80fe y.z.{.|.}.~..... 0039280: 81fe 82fe 83fe 84fe 85fe 86fe 87fe 88fe ................ 0039290: 89fe 8afe 8bfe 8cfe 8dfe 8efe 8ffe 90fe ................ 00392a0: 91fe 92fe 93fe 94fe 95fe 96fe 97fe 98fe ................ 00392b0: 99fe 9afe 9bfe 9cfe 9dfe 9efe 9ffe a0fe ................ 00392c0: a1fe a2fe a3fe a4fe a5fe a6fe a7fe a8fe ................ 00392d0: a9fe aafe abfe acfe adfe aefe affe b0fe ................ 00392e0: b1fe b2fe b3fe b4fe b5fe b6fe b7fe b8fe ................ 00392f0: b9fe bafe bbfe bcfe bdfe befe bffe c0fe ................ 0039300: c1fe c2fe c3fe c4fe c5fe c6fe c7fe c8fe ................ 0039310: c9fe cafe cbfe ccfe cdfe cefe cffe d0fe ................ 0039320: d1fe d2fe d3fe d4fe d5fe d6fe d7fe d8fe ................ 0039330: d9fe dafe dbfe dcfe ddfe defe dffe e0fe ................ 0039340: e1fe e2fe e3fe e4fe e5fe e6fe e7fe e8fe ................ 0039350: e9fe eafe ebfe ecfe edfe eefe effe f0fe ................ 0039360: f1fe f2fe f3fe f4fe f5fe f6fe f7fe f8fe ................ 0039370: f9fe fafe fbfe fcfe fdfe fe00 00ff 00ff ................ 0039380: 01ff 02ff 03ff 04ff 05ff 06ff 07ff 08ff ................ 0039390: 09ff 0aff 0bff 0cff 0dff 0eff 0fff 10ff ................ 00393a0: 11ff 12ff 13ff 14ff 15ff 16ff 17ff 18ff ................ 00393b0: 19ff 1aff 1bff 1cff 1dff 1eff 1fff 20ff .............. . 00393c0: 41ff 42ff 43ff 44ff 45ff 46ff 47ff 48ff A.B.C.D.E.F.G.H. 00393d0: 49ff 4aff 4bff 4cff 4dff 4eff 4fff 50ff I.J.K.L.M.N.O.P. 00393e0: 51ff 52ff 53ff 54ff 55ff 56ff 57ff 58ff Q.R.S.T.U.V.W.X. 00393f0: 59ff 5aff 3bff 3cff 3dff 3eff 3fff 40ff Y.Z.;.<.=.>.?.@. 0039400: 41ff 42ff 43ff 44ff 45ff 46ff 47ff 48ff A.B.C.D.E.F.G.H. 0039410: 49ff 4aff 4bff 4cff 4dff 4eff 4fff 50ff I.J.K.L.M.N.O.P. 0039420: 51ff 52ff 53ff 54ff 55ff 56ff 57ff 58ff Q.R.S.T.U.V.W.X. 0039430: 59ff 5aff 5bff 5cff 5dff 5eff 5fff 60ff Y.Z.[.\.].^._.`. 0039440: 61ff 62ff 63ff 64ff 65ff 66ff 67ff 68ff a.b.c.d.e.f.g.h. 0039450: 69ff 6aff 6bff 6cff 6dff 6eff 6fff 70ff i.j.k.l.m.n.o.p. 0039460: 71ff 72ff 73ff 74ff 75ff 76ff 77ff 78ff q.r.s.t.u.v.w.x. 0039470: 79ff 7aff 7bff 7cff 7dff 7eff 7fff 80ff y.z.{.|.}.~..... 0039480: 81ff 82ff 83ff 84ff 85ff 86ff 87ff 88ff ................ 0039490: 89ff 8aff 8bff 8cff 8dff 8eff 8fff 90ff ................ 00394a0: 91ff 92ff 93ff 94ff 95ff 96ff 97ff 98ff ................ 00394b0: 99ff 9aff 9bff 9cff 9dff 9eff 9fff a0ff ................ 00394c0: a1ff a2ff a3ff a4ff a5ff a6ff a7ff a8ff ................ 00394d0: a9ff aaff abff acff adff aeff afff b0ff ................ 00394e0: b1ff b2ff b3ff b4ff b5ff b6ff b7ff b8ff ................ 00394f0: b9ff baff bbff bcff bdff beff bfff c0ff ................ 0039500: c1ff c2ff c3ff c4ff c5ff c6ff c7ff c8ff ................ 0039510: c9ff caff cbff ccff cdff ceff cfff d0ff ................ 0039520: d1ff d2ff d3ff d4ff d5ff d6ff d7ff d8ff ................ 0039530: d9ff daff dbff dcff ddff deff dfff e0ff ................ 0039540: e1ff e2ff e3ff e4ff e5ff e6ff e7ff e8ff ................ 0039550: e9ff eaff ebff ecff edff eeff efff f0ff ................ 0039560: f1ff f2ff f3ff f4ff f5ff f6ff f7ff f8ff ................ 0039570: f9ff faff fbff fcff fdff feff ff4e 5600 .............NV. 0039580: 0048 e701 182e 2e00 0826 6e00 0c28 6b00 .H.......&n..(k. 0039590: 0c60 20be ac00 0c66 182f 0c2f 0b4e ba00 .` ....f././.N.. 00395a0: aa41 ec00 1022 6e00 1022 8870 0050 4f60 .A..."n..".p.PO` 00395b0: 1028 5420 0c67 0870 ffb0 ac00 0c66 d470 .(T .g.p.....f.p 00395c0: 854c ee18 80ff f44e 5e4e 754e 56ff fc48 .L.....N^NuNV..H 00395d0: e703 382c 2e00 0c28 6e00 0826 4c48 6eff ..8,...(n..&LHn. 00395e0: fc2f 0c2f 064e baff 963e 000c 47ff 854f ././.N...>..G..O 00395f0: ef00 0c66 0628 6b00 1060 0e4a 4766 0a41 ...f.(k..`.JGf.A 0039600: f800 1028 6eff fc99 c82e 2b00 0470 04b0 ...(n.....+..p.. 0039610: 8766 0a20 6e00 1029 5000 1060 0e20 6e00 .f. n..)P..`. n. 0039620: 1045 ec00 1022 4a20 07a2 2e2f 0c2f 0b4e .E..."J ..././.N 0039630: ba00 1870 0029 4000 0829 4600 0c50 4f4c ...p.)@..)F..POL 0039640: ee1c c0ff e84e 5e4e 754e 56ff fc48 e700 .....N^NuNV..H.. 0039650: 3826 6e00 0828 6e00 0cb9 eb00 0c67 2c24 8&n..(n......g,$ 0039660: 6b00 0c27 4c00 0c20 6c00 0420 9467 0a20 k..'L.. l.. .g. 0039670: 5421 6c00 0400 0460 0627 6c00 0400 1028 T!l....`.'l....( 0039680: 8a70 0029 4000 0425 4c00 044c ee1c 00ff .p.)@..%L..L.... 0039690: f04e 5e4e 754e 5600 0048 e707 083e 2e00 .N^NuNV..H...>.. 00396a0: 0820 780b b828 680b 8270 093a 07e0 6530 . x..(h..p.:..e0 00396b0: 07e4 407c 7fcc 4048 c648 c520 745c 0020 ..@|..@H.H. t\. 00396c0: 064c 3c08 0000 0000 d0d1 c02d 4800 0a4c .L<........-H..L 00396d0: ee10 e0ff f04e 5e4e 7400 024e 56ff fc48 .....N^Nt..NV..H 00396e0: e703 3824 6e00 0826 4a20 780b b82d 680b ..8$n..&J x..-h. 00396f0: 82ff fc42 477c 0060 4e20 6eff fc28 706c ...BG|.`N n..(pl 0039700: 00b9 cb62 4020 0cd0 bc00 0068 00b0 8b65 ...b@ .....h...e 0039710: 3420 0b90 8c4c 7c08 0000 0000 d022 06ef 4 ...L|......".. 0039720: 813e 01de 4048 c7e5 8754 4720 780b b8be .>..@H...TG x... 0039730: 680b 706c 0c59 8f3f 074e baff 5ab5 df67 h.pl.Y.?.N..Z..g 0039740: 0c42 4760 0852 8670 40b0 8662 ac3d 4700 .BG`.R.p@..b.=G. 0039750: 0c4c ee1c c0ff e84e 5e4e 7400 0422 5f20 .L.....N^Nt.."_ 0039760: 5fa0 252e 806a 0242 974e d100 0010 0000 _.%..j.B.N...... 0039770: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 003a770: 0001 0000 0057 6f00 0056 6f00 0000 a207 .....Wo..Vo..... 003a780: 062d 8801 9200 0000 1c00 a200 0576 6572 .-...........ver 003a790: 7300 0100 3269 746c 6300 0000 4a69 746c s...2itlc...Jitl 003a7a0: 6200 0000 564b 4348 5200 0000 6262 6f6f b...VKCHR...bboo 003a7b0: 7400 0000 6e66 7265 6500 0000 7a00 01ff t...nfree...z... 003a7c0: ff20 0000 0000 003e 1000 02ff ff20 0000 . .....>..... .. 003a7d0: 4600 003c d000 00ff ff60 0000 5f00 003c F..<.....`.._..< 003a7e0: c800 00ff ff60 0000 9300 003d e400 00ff .....`.....=.... 003a7f0: ff60 0000 c900 003d 0800 02ff ff50 0006 .`.....=.....P.. 003a800: 5b00 003e 6000 00ff ff00 0046 6b00 003d [..>`......Fk..= 003a810: ec23 201b cfde dcf5 5401 3631 eccd feb7 .# .....T.61.... 003a820: b7b5 7fb9 664c c88e 0bb3 bf73 8d28 04cc ....fL.....s.(.. 003a830: 5002 0536 66e7 fced 0320 00d2 c7dd ffde P..6f.... ...... 003a840: 15f7 5b27 098c 0880 7b2b 33b7 0580 28cc ..['....{+3...(. 003a850: 330d 1616 f7e6 cc8f 1830 ab3b c4f7 4cf1 3........0.;..L. 003a860: 7dfb 3b55 c548 d48c b3bb 3b33 9c0c 0009 }.;U.H....;3.... 003a870: 1331 3222 1e4c cd50 20b3 08a3 efef fdee .12".L.P ....... 003a880: 325b 5fdb 4102 5fcf 6131 16eb 0cc2 e4d5 2[_.A._.a1...... 003a890: 7001 2003 dff5 954a e456 8735 cdd6 fce4 p. ....J.V.5.... 003a8a0: bb97 ba7f 804c cc47 79fe 33b1 8400 256e .....L.Gy.3...%n 003a8b0: 8720 36b0 cedc ebdc 2001 1176 c0e9 4e7c . 6..... ..v..N| 003a8c0: a5b3 3bfb 446c c888 7367 3373 ccac e498 ..;.Dl..sg3s.... 003a8d0: 1106 1db3 8cfe cfec 0a33 3502 cce2 efce .........35..... 003a8e0: 39bf 3a85 c408 a88c f3e3 3933 8444 f80c 9.:.......93.D.. 003a8f0: c176 f17a e4d8 9c89 2303 f033 bcfe edbf .v.z....#..3.... 003a900: 7333 73f7 0a44 cc68 73bf 31f3 4600 3a58 s3s..D.hs.1.F.:X 003a910: 1110 121b acec 5f3c a00e 1081 e4c6 cee4 ......_<........ 003a920: f697 83f3 400c 8c88 7387 b33d 8c4d fd1c ....@...s..=.M.. 003a930: 020b 9732 fcdd fcff 2021 7023 cddf a6de ...2.... !p#.... 003a940: 3bc3 3beb 4064 c1c4 3333 d73b 0800 8409 ;.;.@d..33.;.... 003a950: 3725 931b 17c5 648c 1104 e831 ff3f dc9e 7%....d....1.?.. 003a960: fbbf bf3b cd0c ac4d 1230 7711 c844 40e8 ...;...M.0w..D@. 003a970: 0252 1081 fdcc edd7 31b0 316c 8eeb fcc8 .R......1.1l.... 003a980: 3533 a12f 4844 4508 33e7 3173 e84f 8e44 53./HDE.3.1s.O.D 003a990: 0300 f2b1 c6fc 7c9c 3213 62a3 f5cd dded ......|.2.b..... 003a9a0: 3373 e335 8c8b 8880 37f3 3737 8844 cc0c 3s.5....7.77.D.. 003a9b0: 0100 3a01 c6ae e8cf 1130 f052 dd8e ece9 ..:......0.R.... 003a9c0: fef7 97fb c914 dc9c 72f3 6b33 840d 441c ........r.k3..D. 003a9d0: b007 1131 ec4d dcff 7111 9326 9dec 59bd ...1.M..q..&..Y. 003a9e0: 5f7b 793b 98c0 808f 7276 3b30 82c4 dc0e _{y;....rv;0.... 003a9f0: 1036 3231 cfed f56f 5200 6233 efaf cddc .621...oR.b3.... 003aa00: 4f4f 4f4f 4f4f 4f4f 4f4f 4f4f 4f4f 4f4f OOOOOOOOOOOOOOOO * 003eff0: 4f4f 4f4f 4f4f 4f4f 4f4f 4f4f 4f4f 4f4f OOOOOOOOOOOOOOOO # Start of Embedded HFS+ volume 003f000: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 003f400: 482b 0004 0000 0100 382e 3130 0000 0000 H+......8.10.... 003f410: b545 ba03 b610 c405 0000 0000 b5ff 783b .E............x; 003f420: 0000 1a57 0000 02e4 0000 1000 0009 6cbc ...W..........l. 003f430: 0003 6399 0007 7612 0001 0000 0001 0000 ..c...v......... 003f440: 0000 aa2f 0007 0cc5 0000 0000 0000 0001 .../............ 003f450: 0000 a126 0000 0000 0000 0000 0000 0000 ...&............ 003f460: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 003f470: 0000 0000 0001 3000 0001 3000 0000 0013 ......0...0..... 003f480: 0000 0001 0000 0013 0000 0000 0000 0000 ................ 003f490: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 003f4c0: 0000 0000 0040 0000 0040 0000 0000 0400 .....@...@...... 003f4d0: 0000 0014 0000 0400 0000 0000 0000 0000 ................ 003f4e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 003f510: 0000 0000 0080 0000 0040 0000 0000 0800 .........@...... 003f520: 0000 0414 0000 0400 0002 4d21 0000 0400 ..........M!.... 003f530: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 0040000: ffff ffff ffff ffff ffff ffff ffff ffff ................ # End of volume in dump3e.txt hfsplus-1.0.4/libhfsp/test/test.c0100644000000000000000000000336207444577643015460 0ustar rootroot/* * libhfsp - library for reading and writing Macintosh HFS+ volumes * * This is a test file used for development. I hope it will be * gone when this ever becomes final. * * Copyright (C) 2000 Klaus Halfmann * Original code 1996-1998 by Robert Leslie * other work 2000 from Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: test.c,v 1.2 2002/03/16 08:17:39 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif #include #include "libhfsp.h" #include "volume.h" #include "btree.h" #include "record.h" int main(int argc, char* argv[]) { volume v; btree b; record root, ls; UInt16 i; if (volume_open(&v, argv[1], 1, HFSP_MODE_RDONLY)) perror(hfsp_error); if (volume_get_extends_tree(&v)) perror(hfsp_error); /* UInt32 j; for (j=0xFFA0; j < 0xFFB0 ; j++) printf("allocated %lX %d\n", j, volume_allocated(&v, j)); */ if (volume_close(&v)) perror(hfsp_error); return 0; } hfsplus-1.0.4/mail/0040755000000000000000000000000007450341531012626 5ustar rootroothfsplus-1.0.4/mail/Apple.txt0100644000000000000000000000436607441220605014434 0ustar rootroot[Image] [Reply to sender] [Image] [Reply to all] [Image] [Reply to folder] [Image] [Forward] [Image] [Move/Copy] [Image] [Delete] [Image] [Read previous item] [Read next item] [Image] [Get help information on the current window] [Image] From: devprograms@apple.com [SMTP:devprograms@apple.com] To: khalfmann@libra.de Cc: Subject: Re: Creator Registration Reques Sent: 9/20/00 6:19 PM Importance: Normal Please include the line below in follow-up emails for this request. Follow-up: 1325041 Dear Klaus Halfmann, Thank you for registering your application creator information. We appreciate your continued product development and support of Apple Computer! The following product information has been registered: Company: (Powerpc) Linux Community Contact: Klaus Halfmann Address: Kirchstr. 24a 67691 Hochspeyer GERMANY Application: HFS+ Utlitities and Kernel Module for (PPC) Linux Phone: 49-6305-4172 49-621-41997-15 EMail Address: khalfmann@libra.de Application Signatures: H+LX (Hex) 482B4C58 H+Lx (Hex) 482B4C78 H+lx (Hex) 482B6C78 This letter serves as your confirmation. Please keep it on file. Additionally, you should review the information for accuracy. If you locate discrepancies, please contact Developer Support at devprograms@apple.com with your corrections. Thanks for supporting Apple! Best regards, Melanie Allen Apple Developer Connection Worldwide Developer Relations REQUEST ------------------------------------------------------------------------ WEB CREATOR/FILE TYPE Registration Request =========================================%UNIQUE REGISTRATION%: %NAME%: Klaus Halfmann %COMPANY%: (Powerpc) Linux Community %ADDRESS%: Kirchstr. 24a 67691 Hochspeyer GERMANY %TELEPHONE%: 49-6305-4172 49-621-41997-15 %E-MAIL%: khalfmann@libra.de %PRODUCT NAME%: HFS+ Utlitities and Kernel Module for (PPC) Linux %DEVICE DRIVER%: No %SIGNATURE (HEX)%: 482B4C58 %SIGNATURE (HEX)%: 482B4C78 %SIGNATURE (HEX)%: 482B6C78 %END DB REFERENCE ------------------------------------------------------------------- TIME IN: 19-Sep-2000 11:37 PDT TIME OUT: 20-Sep-2000 08:51 PDT Copyright 2000, Apple Computer, Inc. SECURITY: NON-DISCLOSURE USE ONLY hfsplus-1.0.4/mail/FlarKernel.txt0100644000000000000000000000407207441220605015412 0ustar rootrootHello Flar, here some more comments about your Kernel module: * Why dont you declare your inode ops static (and created the ops-records at the end. This way you need not to declare so many functions and avoid the (I like this expression :) "global namspace pollution". * Why must the error messages retunred be negative numbers ? (return -EIO;) * in dir.c: hfsplus_lookup always returns NULL, is this ok ? * I changed _asc2uni to return the lenght (and removed an unneeded invariant). This can be used in E.g. _fill_catkey. I hope I dont forget to send the diffs. * In general you should change many functions to return some value, this can improve performance because it can be done with registers. * I thougt C programs always return 0 on succes and anything else on error, is this not true in the kernel ? * Why are the functions to release structures often named _put... I'd like _close.. ore _release.. more. (close would eventually write back structures ...) * When You use double refrences (this->that->next) You should resolve the first reference when you use it more than about two times. This is poison for the RISC processor since its pipline must wait for the first pointer to become valid before using the second one. Even better: place some other, unrelated statements after the assigment of the first pointer Example: This *this; That *that = this->that; int i=0; // needed in next loop int count=this->num_elem; int val = that->value; * Thinking about your code, I found a nonportable statement in mine, I didn't swap the record offset in the node. * More comments in the diffs Do you think your kernel module is stable enough ? If yes we should make it oficially part of the 2.4 (or even 2.2) kernel. This way we would gain a CVS / BK acces, too. And I will try to use it, too :) I'm now going back to my tools doing some optimizations I'll need for write acces anyway. After that Im going to write a hfspcheck that is needed, too. * I'm still commenting on bnode.c, You'll get this diff later. Greetings Klaus, aka Hasi hfsplus-1.0.4/mail/Re1.0.0.txt0100644000000000000000000000232407441220605014306 0ustar rootroot zippel@fh-brandenburg.de flar@allandria.com dan_bethe@yahoo.com josh@antihype.com nicoya@apia.dhs.org Thanks to all who responded. Here is some more info ... I uploaded a binary and a source distribution to ftp://penguinppc.org/pub/hfsplus/ Thanks to flar I found a missing file in the cvs-repository Here the commands to access the CVS: export CVSROOT=":pserver:anonymous@partner.suse.de:/usr/local/hfsplus" cvs login [password hfsplus] cvs co hfsplus cd hfsplus/libhfsp make -f Makefile.cvs make I intend to work for one or two month and fix the bugs I already found. After that Ill create a new Distribution. This might change when someone starts helping me... I currently fix bugs related to wildcard matching etc. I assume these will keep me busy for a while. After that I think Ill redesing my object approach. The btree(s) will become part of the volume and not be visible to the "outside" any more. The redsign will include a cache. For everything else keep an eye on the top-level index.html. Ill try to be somewhat current there :) Admitted the _checking_ of an HFS+ volume is realtivly easy, I have quite a bit of respect for the task of fixing it. Just be patient :) Greetings, Klaus , aka Hasi hfsplus-1.0.4/mail/ReAcces.txt0100644000000000000000000000361407441220605014673 0ustar rootrootVon: flar@pants.nu Gesendet: Dienstag, 17. Oktober 2000 05:37 An: khalfmann@libra.de Betreff: Re: Problem accessing Backup HFS+ Volume Header Halfmann, Klaus wrote: > Hello Flar, I hope you can help me. I'll try. > While implementing the hpfscheck, I found that my code > to check the backup volume header only worked due to a > combination of two evenly stupid bugs. > > Due to some changes this bug now has hit me. My current > code works for a small (32 MB) image but not for my big > (2.5 G) main HFS+ partition, Grr. Please have a look at > the code in volume.c: volume_read_wrapper. > > The calculation in in the current (CVS) code is wrong. > because I calculated the lenght starting at the new offset > , not the old. Reversing the lines works for my small image > but the big partion doesnt work this way, its beyond the end > of the partition. > > vol->maxbloks = vol->startblock + embede * sect_per_block; > vol->startblock = drAlBlSt + embeds * sec_per_block; > > Please help me to understand why this is wrong ? > > To see the bug change the function volume_read() to care > about the returncode. Well, I don't know if this is your problem, but your comments show a misunderstanding of the wrapper data. The data you are calling embede is not the end of the embedded filesystem as stated in your comments. It's the number of allocation blocks used by the embedded filesystem. The way I interpret the code that's currently in CVS, maxbloks will point to the first block that isn't in the HFS+ data. This is just my interpretation at first glance. I could be wrong... > Meanwhile Ill try to locate the Backup Volume Header on my > Big partion and try it this way. Well, unless you know where the end of the volume is, you can't find the backup of the volume header, since its location is relative to the end of the filesystem. Brad Boyer flar@pants.nu hfsplus-1.0.4/mail/bnode.diff0100644000000000000000000000427707441220605014554 0ustar rootroot117d116 < /* release all the data associated with the bnode */ 138,142d136 < /* Read a node into the node buffer (?) < * < * off - < * retunrs ... < */ 183,188d176 < /* read bytes from node n into pointer "buf" starting at "off" with "len" ? < * < * A Node may consist of more than one buf corresponding to a disk block (?) < * < * return 0 on error, 1 on succes. < */ 217c205 < } // else numbufs != (>) 1 --- > } 241,248d228 < /* At the end of each node there a backpointers to < * the keys/records of the node. < * < * return the offset of the record given by rec. < * return 0 on error (0 is no valid value because each node < * starts with a node header.) < */ < 255c235 < printk("bad recnum %d in hfsplus_brec_off\n",rec); --- > printk("bad recnum\n"); 267,274d246 < /* At the end of each node there a backpointers to < * the keys/records of the node. < * < * return the length of the record given by rec. < * return 0 on error (0 is no valid value because each node < * starts with a node header.) < */ < 281c253 < printk("bad recnum %d in hfsplus_brec_len\n",rec); --- > printk("bad recnum\n"); 290,291d261 < // The empty space has an offest of its own so this < // will always work. 303,314d272 < /* read the record with index rec in the bnode into buf with len < * , skipping skip bytes. < * < * Hasi: Im going to intodruce a node buffer in my code to avoid < * the problems you are fighting against here. When < * You can assume that the node is completly in one < * area of memory you can be much faster. < * < * I currently always read twice the blocksize, so I < * have no problems with block boundaries, at a cost. < */ < 335,342d292 < /* At the end of each node there a backpointers to < * the keys/records of the node. < * < * return the length of the key given by rec. < * return 0 on error (0 is no valid value because each node < * starts with a node header.) < */ < 355,360c305 < /* Get the key for a record, but only copy into given buffer if needed. < * < * When forcecopy is not set the retuned pointer will become invalid < * at any time later. < */ < --- > /* Get the key for a record, but only copy into given buffer if needed */ hfsplus-1.0.4/mail/btree.diff0100644000000000000000000000134007441220605014552 0ustar rootroot4,6c4,5 < * Copyright (C) 1999 * Brad Boyer (flar@pants.nu) < * Additional Commennts by Klaus Halfmann (khalfmann@libra.de) < * aka Hasi --- > * Copyright (C) 1999 > * Brad Boyer (flar@pants.nu) 16,20d14 < /* Convert a (raw) bhead into a useable tree < * < * return 0 on error, 1 on succes. < */ < 62,69d55 < /* Allocate and initialize a btree from the given superblock. < * The btree may either be the catalog tree or the extents tree. < * < * fk is the fork of the tree is contained in. < * < * ToDo: divide this into smalle parts < */ < 111d96 < /* Hasi: what is this numbufs ??? */ 183d167 < /* release all memory allocated for the btree */ 450d433 < /* release all resources allocated for the iterator */ hfsplus-1.0.4/mail/buildrpm.txt0100644000000000000000000000265607441220605015211 0ustar rootrootVon: R Shapiro [rshapiro@bbn.com] Gesendet: Freitag, 29. September 2000 13:16 An: Halfmann, Klaus Betreff: Re: AW(n+1): hfsplus 1.0.1 readonly should be complete Halfmann, Klaus writes: > Please change it to 1.0.1 so we are in sync. Done. > Ill have word wit Suse > now if I can get some ftp/telnet acces. Does SuSE use rpms? I thought it was specific to RedHat/linuxppc.com. > Please send me that patch, Ill be happy to include it. (In fact I > might include everything needed to build an rpm. If you tell me how > I can do it myself for the next release :) I attached the source rpm. This includes the source tar (you don't need this obviously, but it's part of the package :), the patch file and the rpm spec file. To build the binary rpm from the source rpm do: rpm --rebuild hfsplusutils-1.0.1-1.src.rpm This will leave the binary rpm in /usr/src/redhat/RPMS/ppc/hfsplusutils-1.0.1-1.ppc.rpm The binary rpm is what you would usually distribute. I made the rpm to install your executables in /usr/bin and libs in /usr/lib, instead of /usr/local/bin and /usr/local/lib. I was trying to make it as close as possible to the hfsutils rpm. If you just want to look at the contents of the source rpm, do: rpm -i hfsplusutils-1.0.1-1.src.rpm The spec will be installed in /usr/src/redhat/SPECS and the source tar and the patch will be installed in /usr/src/redhat/SOURCES. hfsplus-1.0.4/mail/catalog.diff0100644000000000000000000000401607441220605015066 0ustar rootroot80,84c80 < /* Utility function to count subdirectories. < * < * Linux wants to know this but HFS+ does not know. < * (Does linux really need this ?) < */ --- > /* Utility function to count subdirectories */ 103c99 < break; // End of current directory --- > break; 107c103 < if(size < 2) // Unable tro retrive type, very bad ... --- > if(size < 2) 115,116d110 < /* Compare two catalog keys liek strcmp */ < 120d113 < hfsplus_unistr* u1, *u2; 124,130c117,120 < int diff = k2p - k1p; < u1 = &k1->u.cat.name; // Feed he RISC pipeline < u2 = &k2->u.cat.name; < if (!diff) < diff = hfsplus_unistrcmp(u1, u2); < < return diff; --- > if(k1p != k2p) { > return (k1p < k2p) ? -1 : 1; > } > return hfsplus_unistrcmp(&(k1->u.cat.name), &(k2->u.cat.name)); 133d122 < /* Intialize a catalog key by ist parent and name */ 144,145c133,135 < int len = hfsplus_asc2uni(&(key->u.cat.name), name); < hfsp_put_hs(6 + len << 1, key->key_len); --- > hfsplus_asc2uni(&(key->u.cat.name), name); > hfsp_put_hs(6 + 2 * hfsp_get_hs(key->u.cat.name.length), > key->key_len); 174d163 < /* Convert an catalog entry (file or foler) into a linux inode */ 215,216c204 < } else { // folder/file thread, not handled here. < // Hasi: You could handle '..' here with the Folder thread --- > } else { 221,225d208 < /* Find a folder thread (similar to linux '..') by its id < * < * returns value !=0 on succes. < */ < 232d214 < hfsp_u8 type; 239,242c221,222 < if (!len) < return 0; < type = hfsp_get_hs(entry->type); < if(type != HFSPLUS_FOLDER_THREAD) --- > if(!len || ((hfsp_get_hs(entry->type) != HFSPLUS_FOLDER_THREAD) && > (hfsp_get_hs(entry->type) != HFSPLUS_FILE_THREAD))) { 244,245c224 < < // Hasi: I think this is already code elsewhere , mmh --- > } 256,260c235,236 < if (!len) < return 0; < type = hfsp_get_hs(entry->type); < if((type != HFSPLUS_FOLDER) && < (type != HFSPLUS_FILE)) { --- > if(!len || ((hfsp_get_hs(entry->type) != HFSPLUS_FOLDER) && > (hfsp_get_hs(entry->type) != HFSPLUS_FILE))) { hfsplus-1.0.4/mail/dave.html0100644000000000000000000003573007441220605014436 0ustar rootroot T-Online Webmail
       
      WebMail
       
      Hilfe Weiterleiten Antworten Speichern Löschen Übersicht Webmail
            Hilfe             Weiterleiten             Antworten             Speichern             Loeschen             Uebersicht      
        eMail lesen    Klaus.Halfmann@t-online.de
       
      Absender: David Kamholz <davekam@pobox.com>
      Betreff: FW: hfsplus problem
      Datum: 26.08.01 16:55
      Empfänger: klaus.halfmann@t-online.de
      Alle Kopfzeilen: anzeigen

      Hopefully this address will work!

      I've also attached a postscript below.

      ----------
      From: David Kamholz <davekam@pobox.com>
      Date: Sat, 25 Aug 2001 10:27:06 -0400
      To: <khalfmann@libra.de>
      Subject: hfsplus problem

      Hi Klaus,

      I'm trying to get hfsplus to work to access a 3gb ide drive. I normally use
      it on a mac but I want to access it from linux to copy the files off it.
      There is one partition only; hfsutils is able to mount the wrapper. However
      hfsplusutils complains that it cannot find either the wrapper or HFS+ volume
      header.

      Upon examining the code and drive contents a bit more closely, it turns out
      that there's a partition map at the beginning. The HFS wrapper is located at
      0xE480, so presumably the beginning of the partition is located two blocks
      earlier at 0xE080. I tried modifying os_seek to always add 0xE080 to the
      offset, as a hack, just to see if it would work. It didn't. There was no
      longer an error about not finding the wrapper or the volume, but hpls didn't
      work nor anything else. Here is the output from the commands:

      root:/home/davekam/hfsplus-1.0.2/src# ./hpmount /dev/hdc
      (null): /dev/hdc: no error (Success)
      root:/home/davekam/hfsplus-1.0.2/src# ./hpls
      lt-hpls: lt-hpls: Unable to read file for cached Volume information. (No
      such file or directory)
      root:/home/davekam/hfsplus-1.0.2/src# ./hpumount
      lt-hpumount: destroy: Error while destroying .hfsplusvolume (No such file or
      directory)

      I haven't had a chance to debug enough to figure out why it's not creating
      the cache file. Do you have any idea what's wrong? Let me know if you want
      me to run some tests for you...

      Regards,
      Dave
      ----------

      Upon closer examination I got the offset wrong; it was actually 0x14800. The
      modifications I made to os.c are as follows:

      #define PARTITION_OFFSET 0x14800

      and in os_seek itself:

          if (offset == (unsigned long) -1)
              result = lseek(fd, 0, SEEK_END);
          else
          {
              where <<= blksize_bits;
              where += PARTITION_OFFSET;
      /*      printf("seeking to %x\n", where); */
              result = lseek(fd, where, SEEK_SET);
              result -= PARTITION_OFFSET;
          }

      This made it possible for me to copy the files I wanted. (I made a small
      perl script for recursive directory copying, I can send it to you if you
      like.) Actually, there was still one problem -- although doing hpls would
      always list directory contents correctly, for a few files, hpls <file> and
      hpcopy <file> would report "file not found" errors. I don't believe there
      was any problem with the filesystem, I had no trouble accessing these files
      on my mac. Fortunately, this occured only for two directories and one file
      so it didn't end up being a problem.

      Regards,
      Dave

            Hilfe             Weiterleiten             Antworten             Speichern             Loeschen             Uebersicht      
      Hilfe Weiterleiten Antworten Speichern Löschen Übersicht
      hfsplus-1.0.4/mail/dir.diff0100644000000000000000000000373307441220605014237 0ustar rootroot14,21d13 < /* What is this ? < * < * f - < * b - < * c - < * p - < */ < 27,28d18 < /* operations for directory inodes, compare with file.c */ < 70,77d59 < /* Find an entry in a directory given by ? < * < * filp - directory to seek (better would be dirp) < * offset - ? < * origin - 1: ... 2: ... else: ... < * returns ? < */ < 94d75 < // Hasi: default: return -1; // illegal origin 105d85 < // Hasi: Remove old iterator (cannot be reused ?) 121d100 < // Hasi: store iterator for ??? 129,136d107 < /* read a directory by filling the filldir structure ? < * < * filep - directory to read (shoud better be dirp) < * dirent < * filldir - ? < * returns ? < */ < 170,175d140 < < // Hasi: better handle the directory cases ('.','..') outside the loop < // You'll avoid these invariant f_pos tests. better make < // f_pos a normal variable (if possible ?) should be much faster. < < // for all directory entries ... 184d148 < // Create '.' entry for first entry (= directory thread ?) 188,192c152 < } < else if(filp->f_pos == 1) < // Create '..' synthetical entry for second entry from thread < // retrieved at pos = 0 < { --- > } else if(filp->f_pos == 1) { 197c157 < if(len < 8) { // Minimum key size --- > if(len < 8) { 205c165 < if(len < 12) { // Minum key with non empty string --- > if(len < 12) { 209,210d168 < // Hasi: since both ids are at the same position < // Yo can treat folder and file the same way 225c183 < if(filp->f_pos) { // Hasi: cannot happen when compiler is sane :) --- > if(filp->f_pos) { 241,243d198 < /* open a directory: intialize any privat data structure as neede. < */ < 250,251d204 < /* release a directory: remove any privat data structures as neede. < */ 260,264d212 < /* Lookup dentry in dir, returns correctly filled dentry (?) < * < * Always retunrs NULL ?! < */ < 294,295d241 < // Hasi: since both ids are at the same position < // Yo can treat folder and file the same way hfsplus-1.0.4/mail/extents.diff0100644000000000000000000000000007441220605015133 0ustar rootroothfsplus-1.0.4/mail/file.diff0100644000000000000000000000047607441220605014401 0ustar rootroot4,6c4,5 < * Copyright (C) 1999 Brad Boyer (flar@pants.nu) < * Addtional comments by Klaus Halfmann (khalfmann@libra.de) < * aka Hasi --- > * Copyright (C) 1999 > * Brad Boyer (flar@pants.nu) 14d12 < /* File operations are part of the inode */ 33d30 < /* Operations on _file_ inodes (copare to dir.c) */ hfsplus-1.0.4/mail/flar.txt0100644000000000000000000000670107441220605014312 0ustar rootroot[Image] [Reply to sender] [Image] [Reply to all] [Image] [Reply to folder] [Image] [Forward] [Image] [Move/Copy] [Image] [Delete] [Image] [Read previous item] [Read next item] [Image] [Get help information on the current window] [Image] From: flar@allandria.com [SMTP:flar@allandria.com] To: khalfmann@libra.de Cc: Subject: Re: HFS+ a bit Progress Sent: 8/18/00 4:53 AM Importance: Normal Halfmann, Klaus wrote: > Perhaps we should take a look at /hfsplus/libhfsp/test/dump1.txt: > at 004ccc0: > 004ccc4 should be the start of the B-Tree Map record. > This should start with first two bits set, that would be 0xc > But there are all zeros upto 0x4ccf8 where I found the expected > 0xc , But how can I correctly calculate this offset ? You need to look at the offsets at the end of the node to find the location and length of the map record. The end of the node has an array of 16 bit numbers which are the offsets of all the records in the node, and there is one more number than there are records to tell where the free space starts. > >> Perhaps we should "meet" somewhere in irc. If this is > >> impossible we should communicate by commenting in the source > >> code and in the documentation. > > I already started it tha "offline" way Well, I've found a couple problems in the code while looking at it the last day or so. In btree_init() you don't update p after you pass it to the first function, so you read the same data twice, and end up getting the wrong data in the header. I don't know if it's intentional, but your code will be wrong for any file with more than the 8 extents that can be held in the actual fork data structure. You aren't using the extents overflow file at all. My code in fs/hfsplus/extents.c shows the basic outline of the extents file usage, tho I'm not 100% sure I have it correct. I have another hexdumped drive image if you want it. It's a ZIP cartridge with a freshly formatted HFS+ filesystem done by the U.S. version of OS8 (8.5, I think). The file is about 128k uncompressed. Just another little detail I noticed in your comments. That "last mounted version" is a signature that is supposed to be unique for every program or OS that writes to an HFS+ disk, and should even be changed with major software revisions. I think Apple has a page where you can request a code. > Go to http://www.efnet.net/servers.html and choose a > server in your vincinity that "likes" you. (Some servers > kick you when they dont like you IP-adress). Perhaps > youll have trouble with your organisations firewalls etc. > > However you should join then channel "#mklinux" There you might > find me as "Hasi" (Ask a native German what this is :-). > There are severela irc clients around. I use the plain, > text only irc that comes with ppclinux. Use "/help" to find > out about irc (this works offline, too). As soon as you got > some idea about irc we can create a channel "HFS+" or > "hfsplus" to have a chat on our own. > > Let me think about the time diff. You are correct with > EST (European Summer Time) its 9 hours using 24-hour times > at 17:00 its 09:00 at your location, this might work. > Perhaps you like more to work at night (many at irc seem > to do so :-) so to meet me at 09:00 you should stay up > until about midnight 00:00 ... I'll try to get on there occasionally. Hopefully we can manage to be there at the same time. Brad Boyer flar@pants.nu hfsplus-1.0.4/mail/flar2.txt0100644000000000000000000001054507441220605014375 0ustar rootroot>Halfmann, Klaus wrote: >> I still can not find these offset, can you tell me where in >> dump1.txt I can find them ? > 004dbf0: 0000 0000 0000 0000 0ff8 00f8 0078 000e .............x.. >Here's the one for the header node in the catalog tree. The three >records are at the following offsets: > r1: 000e (14) > r2: 0078 (120) > r3: 00f8 (248) > Also, the free space begins at 0ff8. Ahrg, I assumed those offsets at the end of the Catalog _fork_ not at the end of the Catalog _record_ (Ok, I can throw away some of my code now :). Hmm I miss some start of the Btree map recod let me study this stupid technote again ... Ok I think I had a deep mistunderstanding of the hierarchy of structures. As I understdand the hierarchy now as follows: Volume (contains some predefined forks) Nodes (cocantenated via next/prev) BTrees (spanning over Nodes) (Btree-)records (files/folders) Forks of files (data / rsrc) as found in btrees. Extends file Btree extends records (keyed by parent / file cnid) (The technote really lacks an explanantion like this ...) The imposes, that one can do a binary search on those keys, fine. >> Yes , I just started to grasp whats up with the extends overflow >> file. I intended to add this functionality later. (Ill come >> away without for some time I assume :) >Not a huge deal. Only a heavily fragmented filesystem ever uses >this. I don't have any HFS+ filesystems where this isn't empty. Ill try to force MacOS into creating some extends and then will implement it ... -> added to my ToDo list in index.html >> 'LiH0', 'Linu', 'LiH+' > Sounds fine. I guess I'll have to get some for the kernel as well, > whenever I actually make it write to the disk. -> added to my ToDo list in index.html > Yes, I have a very good net connection at work. I would be able > to catch the last couple hours of the time you are on that way. >> Do you receive mails online ? If yes I could send you >> a mail and upon a direct answer we could go online simultaneously. > I don't generally look at my personal email while I'm at work, but > I keep an eye on my work email. (bboyer@yahoo-inc.com) > I also am almost always logged in with Yahoo! messenger during the > day as well. I even have a linuxppc build of the client. (It isn't > on the official download site yet, but it should get added soon.) > > http://messenger.yahoo.com/ > I apologize for the shameless plug. I work for Yahoo! ;) Oh well, I earn my money by doing Java programming on NT and (starting soon) AS400 (Yes you can do Java on those boxes :-) (Hm, but since they use PowerPC theyd bette'r run ppcLinux :-( ) Well, Ill try this messanger than. In case this might fail ill 'ping' you at your email adress. I'd suggest we use irc this way eventually attracting some people to join us ... [ Now senseless idea about new structure deleted] >> I target a code Sequence as follows: >> volume vol; >> record catalog; >> btreee tree; >> UInt32 cnid; >> volume_open(&vol, "/dev/hdx", HFSP_READONLY); >> record_open_catalog(&catalog, &vol); >> btree_open(&tree, &catalog); >> icnid = btree_find_recursive(&tree, "MyFile.txt"); >> btree_copy_data(&tree, "/home/user/MyFile.txt"); >> >> This would be the core for a hfspcp tool ... > It seems more logical to me to have the following: > volume_open(&vol, device, flags); > btree_open(&tree, &vol, CATALOG_CNID); > record_init(&record, &tree); > find_record(&record, searchkey); > catrecord_copy_data(&record, outfile); > This seems more in line with the actual relationships of the > on disk structures, whereas I would find the other way to > be somewhat misleading. In this case, the record would need > the tree rather than the fork, and the tree needs the fork. > However, I could just be biased by the way I wrote it. :) I think you are right here. Now since I found my basic mistakes I can go ahead and implement and test more utility functions. I will restructuree it in a away that the record will be "below" the btree. Thanks for you comments, it really pushed me foreward to discuss things with someone. Greetings, Klaus Halfmann aka "Hasi". P.S : (You get my Libra Signature when I write to you from work ...) hfsplus-1.0.4/mail/flar3.txt0100644000000000000000000000135207441220605014372 0ustar rootrootHello Brad, I think I have another bit of progress now. -> All record_read_... methods are ok -> All record__print_... methods are ok. -> I started the first attempts for binary search (in one node) I now understand why record_treads are neede, the work like the '.' nodes in unix. But Im unsure what the file_threads are neede for, perphaps for the (yet unused) attributes fork ? Ill Test the binary search etc and then will look ahead to support the INDX nodes. Did you ever have a look at the hfsutils ?. As soon as an ls is possible Id like to copy the hfsmount and hfsls commands and transform them into hfspmount and hfspls. In case you want to help you might start here ... Greetings Klaus Halfmann (aka Hasi) hfsplus-1.0.4/mail/gewrgiou@imbc.gr0100644000000000000000000000361407441220605015742 0ustar rootrootHello Londo_ It took me a while to compile the neccesary parts for my unicode problem, but here I am. Attached you will find a screenshot showing two Filenames I created with MacOS 9 on an HFS+ volume. In addition there is a small program that tries to convert those Unicode strings (extracted with gdb from my hpls tool.) The program failes however. I use glibc-2.1.3-4a as found on the LinuxPPC 2000 distribution. As reading the documentation (Hidden behind "info libc") I understand, that the sort of conversion I need is not supported yet: > Umlaut-A > ("Latin capital letter A with diaeresis") can either be > represented by the precomposed UCS code 0x00c4, or alter- > natively as the combination of a normal "Latin capital > letter A" followed by a "combining diaeresis": 0x0041 > 0x0308. (One of the strings just starts with that encoding) Ok I think I understand the problem, but I dont know yet how to solve it. I could write a conversion of my own, but before doing so please help me answering the following questions: 1) Will glibc support such conversions in some forseable release ? 2) Does one of the inconv-modules support this encoding yet ? if 1) and 2) are false, I fear I have to write an iconv module myself. 3) How can I get such conversion support in a Kernel module ? There is some code in the kernel that already does Unicode (and other) encodings in include/linux/nls.h and /linux/fs/nls/... Feel free to foreward this mail wherever you like. Greetings, | __ khalfmann@libra.de +--------+ | |\ | | \ | +----+ | v | \ | |__/ Klaus Halfmann | |... | | .^. | \| | Kirchstraße 24a | |.. | | < > | 67691 Hochspeyer | +----+ | 'v' | |_____==_|+==-------------==+ GERMANY | | | --__ __-- | +------+ +-------==--------+ P.S. This is my private .sig, I should use it more often :) hfsplus-1.0.4/mail/hfsplus.html0100644000000000000000000002010707441220605015173 0ustar rootroot Klaus Halfmann: HFS+

      HFS+ for the Linux Community

      My name is Klaus Halfmann and you may find me in the #ppclinux irc channels with my nickname Hasi. In this text I tell you how and why I started contributing to the (power PC) Linux community. I currently develop userland tools to acces the second generation Apple &tm; File System HFS+.

      Small Curricumlum vitae

      I have studied information science at the University of Kaiserslautern. Stimulated by a friend of mine I bought my first Apple Macintosh® an SE/30. After finishing my studies with a diploma I started working with MacAp, a C++ application framework supplied and founded by Apple. After working about 2 years, mostly doing medical applications I lost my job there and was caught by Stardivision in Hamburg. I was involved in the delivery of the Starwriter 3.0 and main development of StarOffice 4.0 for the Apple Macintosh. I still had the illusion of some quality in software development. Being not satisfied with my position and duties in Hamburg I went back to a loose friend of mine in Hochspeyer near Kaiserslautern, who became my boss. The first thing to do for me was porting a stock-charting and analyzing software from Object Pascal to C++ and PPC (MacApp again). Although I sucessfully managed to develop and deploy Version 1.2, 1.3 and 1.4 of the application the company as a whole went down and was bought by the german department of Programmers Paradise: ISP*D. I learned some lessons about programming, marketing and finances during that time, but perhaps I am still to truethfully for the current world of software engineering.

      Dropping the whole Mac-busines we started developing a Web-Application using Microsoft Active Server Pages &tm; and Microsoft SQL Server &tm;. Doing so I learned much more about HTML, SQL and Windows NT &tm;. After bringing the Application to some sort of finish called Version 1.0, I started reengeneering the Application using Java Server Pages (JSP) and a 100% Java aproach, now supporting Oracle and DB2, too. Meanwhile the product including the developers was bought by a newly founded copany: Healy Hudson. I had been reading some good books about Software engeneering and felt myself as technical leader of the project. After doing so about 2 years I found that my ideas where not adopted by the management at all: central ideas and problems where not know at all. Marketing told customers almost lies about the product and no cut was made to release some (more or less) useable Version 2.x. Although working with my boss was a pleasure and the corporate climate was really fine, I can not deny that my boss was unable to communicate with the managers in Munic and was in fact unuseable as a project manager. (As a programmer and problem-solver he was and still is great, and he can talk you into everything he wants to). Frustrated I looked for a company nearby and made my way to Libra Software GmbH, Mannheim.

      At that time I made my first experiences with Linux and PowerPC. Due to good Java Support I was able to port our application to Linux in less than three days, mostly concerend with case-sensitive file names. We had some external co-workers who all came with there personal notebooks. So I decided I would buy an iBook with ppc-linux and integrate it into the unavoideable Windows network using Samba. I did so at my old company and without much pain, at the new company. I usually travel about an hour by train to Mannheim. It came, that I dedicated most of this time to the linux community.

      Decision for Linux

      At university I programmed my diploma works on Ultrix &tm; using C++ and all the unix tools, so I was not afraid of the linux commandline. I looked around what I could do for the linux community. The first thing I stumbled over was that the nvsetenv tool was broken for new world machines like my iBook. I took this as a starting point and reworked the tool to be suiteable for new and (using the existing code) old nvram. With a kernel modification from Benjamin Herrenschmidt my work was almost ok (Hollis Blanchard has fixed a BUG, though :)). You can currently download it at hollis pages. I always had a goal in mind: I would like to boot into MacOS and back to Linux more easily.

      I looked around further for tools that where needed and I could do. Due to lack of acces to more hardware than my iBook, many things are out of range for me. The iBook (at that time) lacked support for graphics and sound, and I found that HFS+ was not supported by Linux at all. I tried a bit of kernel programming, but decided that this would need more expirience (and hardware perhaps). So I decided to provide HFS+ acces for the Linux community. My goal here was to ease the use of Linux for users of MacOS 8-9 (and maybe MacOSX, too, future will tell us)

      Asking around I found the hfsplus tools, which where a good starting point for my work. (It seems they still work but are not supported anymore. Who knows what happend to rob@mars.org ?). After doing my first steps I was able to provide the first useable tools. Thanks to Suse I now have a CVS repository for my project and someone that helped me creating rpm-packages. You can obtain a current version from penguinppc.org. I hope I will be able to finalize this project in some way which may need about a year with the time I currently can spare.

      Motivation and Philosophy

      I found a sort of new home in the ppclinux virtual community and want to thank the many people I met there. At my jobs much of the work I did and will do is not honored in a way I like it. And even more code and time was thrown away. Thinking about this, the approach of the Gnu Public License and the idea of open Software is much better: I can keep my, not my companies, copyright. The code is not lost when some boss of mine decides to do so. I would even like to do my normal work as open software but the German and international "software culture" is not ready for this step yet. (Well, my boss is not ready yet, too :))

      In my - now ten years - of programming I found that very often the customers want a solution but a product is sold to them. Current software industry is far away from being a craftsmanship: You can not go to the software worker next door and ask for a solution. And, some days later, you get a well done product, manufactured using some reliable standards and verifiable by anybody who likes too. I hope the idea of open software will move us towards this direction. Meanwhile I try to keep my head up, not telling the customers lies about my products, but involve them into the creative process of software development.

      I am still looking for a company that works like the ideals I stated above (and some other principles) I would like to adhere to. But I am realistically enough to see that I cannot stop the globe and turn it around as I like. So I leave that Job to God, the creator. Meanwhile I do what can be done to push things slowly in the direction I like them to be. Without hurting me and others to hard.

      A Joke from IRC

      (Hasi was talking about the HFS+ B*-Trees) Maybe I confused the names, anyway:
      <NightDog> Oh no I fear the Bees in the trees
      <Hasi> Bees ?
      <NightDog> Yes in the B-Trees
      *Hasi* listens to the Bees on his HFS+ volume
      <Hasi> cat /dev/hda13 > /dev/snd 
      <Hasi> Argh, no sound on iBook yet
      
      
                    |          __    khalfmann@libra.de
      +--------+    |   |\  | |  \
      | +----+ |    v   | \ | |__/   Klaus Halfmann
      | |... | |   .^.  |  \| |      Kirchstraße 24a
      | |..  | |  <   >      |       67691 Hochspeyer
      | +----+ |   'v'       |
      |_____==_|+==-------------==+  GERMANY
       |      | |   --__  __--    |
       +------+ +-------==--------+  
      
      hfsplus-1.0.4/mail/kaempf.txt0100644000000000000000000000070207441220605014624 0ustar rootrootHallo Her Kaempf, Das hfsplus Packet entwickelt sich langsam, ich beginne gerade damit die ersten "sinnvollen" Funktionen zu implementieren. Dazu habe ich im Toplevel ein src-directory angelegt. Ich habe dazu das Makefile.cvs in's top-level Directory dupliziert und neue Makefiles.am angelegt. Da ich nicht sovile Ahnung von den ganzen auto - tools habe möchte ich Sie bitten das Projekt mal zu überprüfen. Gruss, Klaus Halfmann, aka Hasi hfsplus-1.0.4/mail/main.c0100644000000000000000000000160607441220605013714 0ustar rootroot #include #define __USE_GNU #include int main(int arc, char* argv[]) { mbstate_t mbs = { 0, 0}; wchar_t sw1 [] ={ 65, 776, 79, 776, 85, 776, 187, 8222, 8240, 184, 733, 711, 65, 769, 85, 770, 216, 8719, 65, 778, 73, 769, 8364, 73, 776, 73, 768, 79, 769, 305, 710, 64258, 8225, 85, 768, 67, 807, 9674, 8249, 8250, 728, 731, 247, }; wchar_t sw2 [] ={ 97, 776, 111, 776, 117, 776, 223, 171, 8721, 8482, 174, 8224, 937, 168, 8260, 248, 960, 97, 778, 8218, 8706, 402, 169, 170, 186, 8710, 172, 165, 8776, 99, 807, 8730, 8747, 126, 181, 8734 }; const wchar_t *psw = sw1; char s [64]; int res = wcsnrtombs(s, &psw, 43, 64, &mbs); s[res] = '\0'; printf("%d %s \n", res, s); psw = sw2; res = wcsnrtombs(s, &psw, 36, 64, &mbs); s[res] = '\0'; printf("%d %s \n", res, s); return 0; } hfsplus-1.0.4/mail/phandle0100644000000000000000000000044607441220605014163 0ustar rootroot I, just started writing to an HFS+ image from Linux and stubled over the following problem which may interest the HFS+ developers - Setting the version flag in the volume header to something greater than 4 (I tried 0x0102) makes the volume unuseable by MacOS (Volume cannot be activated). hfsplus-1.0.4/mail/reflar.txt0100644000000000000000000000357107441220605014643 0ustar rootroot> * Your code is lacking comments (I know Im pedantic here). > Will you include comments of mine (and verify them) > in case I send you some ? Yes, I'll be more than happy to look at your comments and include them, and if I correct any of them, I'll be sure to let you know what I changed and why. > * I registered three creator codes with Apple. I myself > claim 'H+LX' (Hex) 482B4C58 for my hfsplus utils and > suppose you use 'H+Lx' (Hex) 482B4C78 for your > implementation. A third code is free for now: > 'H+lx' (Hex) 482B6C78 That sounds fine. Thanks for letting me use it. > * In my code I create the extents btreee on demand only. > (I hope to spare some memory this way) > Your code does not look like doing so. No, my code always loads it at mount time. I'll take a look and see how much memory I'm wasting that way. This shouldn't be a really big deal to change. > * In hfsplus_statfs I read: > > if(sb->u.hfsplus_sb.next_cnid <= HFSPLUS_EXCH_CNID) > tmp.f_ffree = 0; > else > tmp.f_ffree = 0xFFFFFFFF - sb->u.hfsplus_sb.next_cnid; > > This may fail in case someone ever writes a mkhfsp to create > a really empty HFS+ volume. (Why do you this anyway ?) This is a simplistic bit of code that probably should be rewritten. The reason it was done this way is a quirk in the way the MacOS does the allocation. It always creates the next normal file as the value in next_cnid and the increments the value. That number should always be initialized to a number greater than the value HFSPLUS_EXCH_CNID because that value and all smaller are reserved by Apple for special purposes. If a filesystem has next_cnid set to a number lower than that, there is a problem. I suspect that the value of f_ffree in statfs could be a little wrong without any side effects anyway. > More comments later. Thanks. I'm glad someone's looking at it. Noone else seems to have. hfsplus-1.0.4/mail/reflar2.txt0100644000000000000000000003463707441220605014734 0ustar rootroot Re: RE2: HFS+ a bit Progress
      Reply to sender Reply to all Reply to folder Forward Move/Copy Delete Read previous item Read next item Get help information on the current window
      From: flar@allandria.com [SMTP:flar@allandria.com]  
      To: khalfmann@libra.de 
      Cc:  
      Subject: Re: RE2: HFS+ a bit Progress 
      Sent: 8/19/00 4:38 AM 
      Importance: Normal 

      Halfmann, Klaus wrote:
      > Uhm, I found this one, I thougt that btree_head.reserved3
      > Would be [3] (reserverd_3_) but it actually is [16].

      Ah, yes. The names reserved[23] just mean that they're the second
      or third reserved block. I don't really like the struct member
      names as given in official Apple definitions.

      > I still can not find these offset, can you tell me where in
      > dump1.txt I can find them ?

      004dbf0: 0000 0000 0000 0000 0ff8 00f8 0078 000e  .............x..

      Here's the one for the header node in the catalog tree. The three
      records are at the following offsets:

      r1: 000e (14)
      r2: 0078 (120)
      r3: 00f8 (248)

      Also, the free space begins at 0ff8.

      > Yes , I just started to grasp whats up with the extends overflow
      > file. I intended to add this functionality later. (Ill come
      > away without for some time I assume :)

      Not a huge deal. Only a heavily fragmented filesystem ever uses
      this. I don't have any HFS+ filesystems where this isn't empty.

      > I once wrote Apple Progs only (sigh) and know very well how
      > to do that :). Here are some suggestions Ill try when you dont
      > mind 'LiH0', 'Linu', 'LiH+'

      Sounds fine. I guess I'll have to get some for the kernel as well,
      whenever I actually make it write to the disk.

      > Hmm, Im on irc from about 08:00-17:00 EST (European Summer time)
      > at workdays (Mo-Fr). _Sometimes_ Im online via modem around
      > 18:00 - 20:00 EST (but only short, is somehwat costly ...)
      >
      > Can you be online at work ?

      Yes, I have a very good net connection at work. I would be able
      to catch the last couple hours of the time you are on that way.

      > Do you receive mails online ? If yes I could send you
      > a mail and upon a direct answer we could go online simultaneously.

      I don't generally look at my personal email while I'm at work, but
      I keep an eye on my work email. (bboyer@yahoo-inc.com)

      I also am almost always logged in with Yahoo! messenger during the
      day as well. I even have a linuxppc build of the client. (It isn't
      on the official download site yet, but it should get added soon.)
      http://messenger.yahoo.com/

      I apologize for the shameless plug. I work for Yahoo!  ;)

      > I plan to restructe the code a bit more. Id like to intodruce
      > files record.h/.c containing the code to acces the B-tree _Records_
      > and leave btree.h/.c for the structures _inside_ the Records. So
      > record would be something like:
      > typedef struct {
      >     volume*         vol;
      >     hfsp_fork_raw*    fork;
      >     btree_nodes_desc  node;
      >     union {
      >       btree_head  head;
      >       ... // not sure what Ill need here ...
      >     } u;
      > } record;   // or better node ?
      >
      > Btree would become something like:
      > typedef struct {
      >     volume*         vol;
      >     record      rec;
      >     UInt64      keyPos;// position of key in given record
      >     hfsp_cat_key      key;
      >     hfsp_cat_extry    entry;    // file, folder or whatever
      > } btree;
      >
      > Note that rec is not a pointer so that the btree can be used
      > to traverse different records (Like in your iterator code.)
      >
      > I target a code Sequence as follows:
      >     volume  vol;
      >     record  catalog;
      >     btreee  tree;
      >     UInt32  cnid;
      >     volume_open(&vol, "/dev/hdx", HFSP_READONLY);
      >     record_open_catalog(&catalog, &vol);
      >     btree_open(&tree, &catalog);
      >     icnid = btree_find_recursive(&tree, "MyFile.txt");
      >     btree_copy_data(&tree, "/home/user/MyFile.txt");
      >
      > This would be the core for a hfspcp tool ...

      It seems more logical to me to have the following:

      volume_open(&vol, device, flags);
      btree_open(&tree, &vol, CATALOG_CNID);
      record_init(&record, &tree);
      find_record(&record, searchkey);
      catrecord_copy_data(&record, outfile);

      This seems more in line with the actual relationships of the
      on disk structures, whereas I would find the other way to
      be somewhat misleading. In this case, the record would need
      the tree rather than the fork, and the tree needs the fork.
      However, I could just be biased by the way I wrote it.  :)

      > Im writing this while going by train to my father 60s Birthday.
      > His brain is so full of cancer that he will not know this fact
      > anymore. Ill need some undisturbed time and X-Windows to make
      > these changes so I doubt I will do it this weekend, perhaps
      > I can spare some time next week.

      I certainly understand not having the time to work on this stuff.
      Hopefully I'll get a chance to analyze a bit more and figure out
      where I'm wrong about how the filesystem works, since my code
      is still pretty broken.

              Brad Boyer
              flar@pants.nu

       
      hfsplus-1.0.4/mail/reflar3.txt0100644000000000000000000000406507441220605014725 0ustar rootrootHello Brad, Yesterday I submitted the first "real" command to the CVS: hpmount. You must do a make -f Makefile.cvs to get it running (Understanding Well, it is not very usefull but the first step. My current plans look like this: - create hpls - create hpcd - create hpcp - create hpunmount ? did I miss a reasonalbe, readonly command ? - go on working on the extends overflow stuff Ill try to push Suse, that they do a weekly build on the stuff (So that I dont forget to add/commit a file) and supply the linuxppc community with the tools. When I feel fine about the tools on ppc we must find some fools^H^H^H^H^H nice people that try our code on x86 and other platforms, too. (Can you supply a http/ftp acces to some images ?) When the readonly part is working, theres still is a lot to do: - Need to write the supposed minimum checks to avoid duplicate CNIDs. Since this includes a complete tree traversal, so I can check for the btrees consistency, too. - Need to write code to allocate and deallocate blocks in forks and care about the allocation bitmaps. (append / truncate) - Need to write code for allocating and deallocating nodes in the node allocation bitmaps. I think I must write a node cache, to support atomic transactions and to avoid the overhead of reading two blocks I currently have. What I fear most is the code to rebalance the tree when it is completly filled and all the other cases. Maybe Ill tweak some images with MacOS to find out how its done there. /me thinks a while about btree reorganisation and shudders Uhm, I think I should write my Ideas into the documentation first, perhaps you can point met to some code / mailing lists I might study. I'll try to define some calculateable values that require a reorganisation. /me trys to think even harder Mhh, foget it, Ill take a pragmatically aproach: Ill do my best in the simple cases and bail out if cant cope with them right now (So most operations will succeed). After the structure is ok Ill think about writing those (recursive) reorganisation fucntions. Greetings, Klaus Halfmann, aka Hasi hfsplus-1.0.4/mail/super.diff0100644000000000000000000000360007441220605014610 0ustar rootroot4,6c4,5 < * Copyright (C) 2000 Brad Boyer (flar@pants.nu) < * additional comments by Klaus Halfmann (khalfmann@libra.de) < * aka Hasi --- > * Copyright (C) 1999 > * Brad Boyer (flar@pants.nu) 32,36d30 < /* Debugging function to print out a block as hex and ascii < * < * ToDo: remove this function in a final release. < */ < 74c68 < return 0; // Not a HFS block --- > return 0; 76c70 < return 0; // Does not contain an embedde HFS+ volume --- > return 0; 80c74 < return 0; // Hasi: Why cant we use that ? --- > return 0; 95,100d88 < /* Superblockperation: read inode < * The inode is preset by the vfs layer and contains < * i_ino, the inode (=directory) number to retrive < * < */ < 124,127d111 < /* Release any additial memory allocated for the inode. < * does not mean to write back any chnages (?). < */ < 134,137d117 < /* The volume is about to be unmounted, write < back all cached data (?) and free all additionally < allocated data */ < 149,154d128 < /** Fetch infomarzion about a volume and put it into *buf. < * < * buf - buffer on userside < * bufsize - maximum number of bytes to copy. < */ < 180,181d153 < /* Array of superblock operations that is handled to the kernel */ < 196d167 < /* Where does this ffz (find first zero ?) come from ? */ 199,205c170 < /* Read super function (called for mounting a filesystem) < * < * sb is partially intialized by VFS and contains < * the kernel device s_dev to read from. < * < * ToDo: Split this Monster into more manageable pieces. < */ --- > /* Read super function (called for mounting a filesystem */ 319d283 < /* Hasi: What effect do the suid and guid etc. have ? */ 378c342 < NULL /* Hasi: ???? */ --- > NULL 381,382c345 < /* Function to register filesystem handler, < * called by ? Shouldnt that be part of the MODULE part ? */ --- > /* Function to register filesystem handler */ hfsplus-1.0.4/mail/umlaut.gif0100644000000000000000000000305407441220605014621 0ustar rootrootGIF89a—7ð1ÿÿÿ,—7@ÿ„©Ëí£œ´Ú‹³Þ¼û&A¸#b^i´ë À®kÖh)£­¸39©úÅ„2ìx8J¡¥ååz@ÎhýeuIíñë«vÔ!9ü(^¹cÝÀ:Ëå6%j†Ô©_dþÖU§†35ˆ&¦¸ÈØèø)©øx5'X˜¸!73yé#ø&â6j÷ÇD´wZj§7Tc#Kª#šä:yª‰ƒ»éZ ûGûjÚ 8¶Z¼ì©zh(Ì7­ŒŒ½›½ÍL“«‹ùÌK^lŽž®îH¼~ÖH‹gKï…yL&?[{ãM ?H,èÔ£fë_zßR‚æ”k¯¶Ø²ˆ*„ÿѸ¥W¢b*Œ»ˆu °›®~)®LxçÞKM2¾¼¬â53$Ó¸#tOŸ¹v?õ` ZTŒC”i–.rxО¡Vhrì•’§¸ykfP ô‚GШLn‚E*¶–Ë´Nó]í¶¶á*}Z’ú$èq"¸am[^RRÊ©„_0;öØ©ÑÆs…µélšW–AÇ ß†lEÑnD³Ukž¬ù³ç‚åІ>:µêÕ§G³~ ;ök×ä–dD„3bÒ—O©íZxO&|,€®0h+Ó°œgu8̈ðg¾99žióvã†ÜñjÂÂô#Ä›¿ûÈ„CÔÈÆ¨`È·i_™6—Ñå³'?r®XäïáëÿEïuïðmáÁO{þõ˜<‡9Ÿ{ü16ÖWAÅ4 rƒI·ƒ¨ÔÓÒ7"Jõ[`Ïà×›™1Æ–TŽh]2ú•Õƒ*Ý(žiQÆâvûµãx¾¨§ã`²%Udh´%ydq½xÆä~dxWM¾X¥:–ôÄŽÉW˜WîGHÉI _’Çq™S\‚IŠ w^6+úHãcáI&fQ:ÇΈxúW›eºñçQ‚˜‡f´åƒ蛃„:çx‹9Ù\‰âøcâ™Â'©‚ùe^dO\¨)zf>*¨ÛLÊãuÚ´c«G¥j”ž<6Ua¯µîÖݬ—¾PnÇÿ}Ú©±Äû+ûhÊj£°æø%aÕâuãUÒN;j,c&"æ¯ãž[[¹Â°³&ºî¾ o¼òÎKo½öÞ‹o¾úîû¿aªëoÀà®ðÀ¦ §¬W›.“‚SI •‡a#f3I¬ÝBSD·DÁ?õ,dÎÇ\dS.®ÿŠ»œÃó†PU͢飖öÌss?È,™m£Þ û¦†áé¦ÖY(52Jâ6Œ•5=ܪ[B‹¡ªÉX%™¶iÂÙðÇ m.¨·ôôGX‹rŽy¹&Æ8ß’«ø°×vžZa–ܾ®è¡¡œ¬P·.gèÇu WR1Ãk«0tÕD÷}¶,&Îk¸—ÿaÄ÷/™õq¿:{ꦮ²±à±—úúz~ciµàoß0gʧÖ-ÑÝÔcÖ[ý_à+‡>ê”Wãè{|YœÐ­—u¨È Íu›#T´q‚JšO2n"¼äG¥|ŒS]ì·”ëÄ\ñ<©šàëÁJó#sž jí{Ì2ºlã?&}³KÂ? Qœðœ¨*p l }žr»ŒÕ¦Y윕&ˆX»â²JÖ¥±)F}l¢Lä48 XæNæ+H²*'º~nQV¥!¿JÉ0 ZR û4´gÕŽ($aù*Ç®­ê„Ê3ËÔ6vCëy8R—E˜…„ÿq/7T“\Ù”†”;!Î@CŠK ·˜ÁÅ]€ÖrÞ®èǼ<‰OŠ÷Ét.r­M®}nŠÛ¶Gà½Qe k[þ"ˆ:ƒíE@ÈÁ1 F)F‰$‘­ŠS$y=EbrŠa[X–´£E6¾J~d$o¶¼M¶xAba·†E¢÷%15Ë 9¾„A‹ˆ¤L¦s¢ÿQçtßËá·,™:.úÒ-”ÔÛózFDZ2ˆæ“¦Ø’æBì½å}rQ¦VBTÖ2Vç³,åbDm²UO’K̈Îuªp[–ë&üYÃv9pšüãå'è†Ï}^s!¼ðç‡(Pô‡ÿŠbB шJt ¢­¨E/ŠÑ ;hfsplus-1.0.4/mail/unicode.diff0100644000000000000000000000437007441220605015105 0ustar rootroot10,14d9 < < /* This is reusage of code from some other fs (NTFS ?) < Its unclear if this will support the special apple < encodings */ < 19,29c14 < /* convert the given utf8 String to an Pascal style, < two byte unicode String. < < returns length of converted string or negative value on error. < < ToDo: check for maximum lenght (255 double bytes) < verify that the encoding for umlauts is correct. < */ < < < int hfsplus_asc2uni(hfsplus_unistr *ustr, const char *astr) --- > void hfsplus_asc2uni(hfsplus_unistr *ustr, const char *astr) 31c16 < int i, len, retval; --- > int i, retval; 39,40c24 < len = hfsp_get_hs(ustr->length); < for(i = 0; i < len; i++) --- > for(i = 0; i < hfsp_get_hs(ustr->length); i++) 42d25 < return len; 45,50d27 < /* convert the given Pascal style, two byte uniocde string into < an utf8 String. < On input *len is the maximum allowed length, on output the actual len. < Illegal or erroneous charcter sequences are silently dropped. < */ < 66,67c43 < if(c > 0x7f) // otimize for ASCII characters < { --- > if(c > 0x7f) { 69c45 < if(size == -1) { // drop characters on error. --- > if(size == -1) { 486,488c462,463 < /* Fold the case of a unicode char, given the 16 bit value < Returns folded char, or 0 if ignorable < Hasi: optimized for PPC processor (I hope :) */ --- > /* Fold the case of a unicode char, given the 16 bit value */ > /* Returns folded char, or 0 if ignorable */ 491c466 < hfsp_u16 tmp, result; --- > hfsp_u16 tmp; 494,497c469,473 < result = c; < if (tmp) < result = case_fold_table[tmp + (c & 0xFF)]; < return result; --- > if(tmp) > tmp = case_fold_table[tmp + (c & 0xFF)]; > else > tmp = c; > return tmp; 500,501c476 < /* Compare unicode strings, acts like standard strcmp < Hasi: optimized for PPC processor (I hope :) */ --- > /* Compare unicode strings, acts like standard strcmp */ 504c479 < hfsp_u16 len1, len2, c1, c2, diff; --- > hfsp_u16 len1, len2, c1, c2; 523d497 < diff = c2-c1; 525,527c499,501 < if(!diff) < break; < if (!c1) // Implies !c2 --- > if(c1 != c2) > return (c1 < c2) ? -1 : 1; > if(!c1 && !c2) 530d503 < return diff; 562c535 < return hfsplus_unistrcmp(&str1, &str2) ? 1 : 0; --- > return hfsplus_unistrcmp(&str1, &str2)?1:0; hfsplus-1.0.4/mail/Re_AW2_More_progress_on_HFS.txt0100644000000000000000000010156707441220605020515 0ustar rootrootVon: flar@allandria.com Gesendet: Dienstag, 29. August 2000 17:51 An: khalfmann@libra.de Betreff: Re: AW2: More progress on HFS+ Halfmann, Klaus wrote: > Send me the hexdump, I should get used to identify HFS+ structures at > first glance :-) It's attached at the end. > a) Glibc suports 4 byte unicode (in fact ISO...whatever...) but apple uses > only 2byte unicode (at least for HFS+) , thats why my first attemt for > a conversion code crashed :-/ . There are some "fixed" routines for > often needed conversions in wchar.h and there is iconv.h > ( the sledehammer in conversion ) I have no Idea how good they are > or if they have bugs (and dont care for just now ...) > Forget about a prebuild decompostion. We might look at this iconv stuff > and write our own translator, urgh. That sounds pretty annoying. It's too bad Apple didn't use a more standard encoding, but they've never been good at following standards. > b) Apple supports conversion via its Translation services using the modules > found in the system folder. We might create a (huge !) table based > on those converters and try to "thin out" this table by some > good heuristic ... leading to an iconv module. Sounds possible, but I suspect it could get messy, since I wouldn't be surprised if each 'text encoding' on the filesystem needed it's own translator. > Meanwhile I added some files in hfsplus/src but have no makefile > yet. I could not find standard functions for the tasks needed in hfsp_utils > so I left them as found. My current goals is making hpmount and then > hpls working. I'll update my copy of the code and take a look. Brad Boyer flar@pants.nu ---------- 000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * Signature: 42 44 Create Time: b47f394a Mod Time: b5c1dc16 Attributes: 8300 (LOCKED | SPARED | CLEAN) Num Files: 0005 Vol Bmp: 0003 000400: 42 44 b4 7f 39 4a b5 c1 dc 16 83 00 00 05 00 03 BD..9J.......... AllocPtr: 0009 AllocBlk Cnt: fee7 (65255) AllocBlk Size: 00000600 (1.5k) Clump Size: 00000600 (1.5k) AllocBlk Start: 0013 Next CNID: 00000015 000410: 00 09 fe e7 00 00 06 00 00 00 06 00 00 13 00 00 ................ Free Blocks: 0000 Volume Label: ZIP-100 000420: 00 15 00 00 07 5a 49 50 2d 31 30 30 00 00 00 00 .....ZIP-100.... 000430: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Write Count: 0000000d Extents ClmpSize: 00001200 (4.5k) Catalog ClmpSize: 00001200 (4.5k) 000440: 00 00 00 00 00 00 00 00 00 0d 00 00 12 00 00 00 ................ NumDir in root: 0000 File Count: 00000005 Dir Count: 00000000 000450: 12 00 00 00 00 00 00 05 00 00 00 00 00 00 00 02 ................ 000460: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Embedded Sig: 482b Embedded Extent: 0018 fecf 000470: 00 00 00 00 00 00 00 00 00 00 00 00 48 2b 00 18 ............H+.. 000480: fe cf 00 00 12 00 00 00 00 03 00 00 00 00 00 00 ................ 000490: 00 00 00 00 12 00 00 03 00 03 00 00 00 00 00 00 ................ 0004a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * [Snipped data from HFS wrapper, including System and "Where have..."] Start of HFS+ Volume Header (Start of HFS+ filesystem = b600) Signature: 482b Version: 0004 Attributes: 00000100 (Unmounted) Last Mounted: 8.10 (MacOS 8) Reserved: 00000000 00ba00: 48 2b 00 04 00 00 01 00 38 2e 31 30 00 00 00 00 H+......8.10.... Create Date: b47f394a Modify Date: b5c24c1a Backup Date: 00000000 Checked Date: b47fa9cc 00ba10: b4 7f 39 4a b5 c2 4c 1a 00 00 00 00 b4 7f a9 cc ..9J..L......... File Count: 00000004 Folder Count: 00000000 Block Size: 00000200 (512) Total Blocks: 0002fc6d 00ba20: 00 00 00 04 00 00 00 00 00 00 02 00 00 02 fc 6d ...............m Free Blocks: 0002efb4 Next Alloc: 000012ae rsrc ClumpSz: 00002000 data ClumpSz: 00002000 00ba30: 00 02 ef b4 00 00 12 ae 00 00 20 00 00 00 20 00 .......... ... . Next CNID: 00000014 Write Count: 00000020 Encodings Bitmap: 0000000000000001 (MacRoman) 00ba40: 00 00 00 14 00 00 00 20 00 00 00 00 00 00 00 01 ....... ........ Finderinfo 00ba50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * Allocation File Logical Size: 0000000000006000 (24k) Clump Size: 00006000 Total Blocks: 00000030 00ba70: 00 00 00 00 00 00 60 00 00 00 60 00 00 00 00 30 ......`...`....0 Extent 1 Start Block: 00000003 Block Count: 00000030 00ba80: 00 00 00 03 00 00 00 30 00 00 00 00 00 00 00 00 .......0........ 00ba90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * Extents File Logical Size: 00000000000bf000 (764k) Clump Size: 000bf000 Total Blocks: 000005f8 00bac0: 00 00 00 00 00 0b f0 00 00 0b f0 00 00 00 05 f8 ................ Extent 1 Start Block: 00000033 Block Count: 000005f8 00bad0: 00 00 00 33 00 00 05 f8 00 00 00 00 00 00 00 00 ...3............ 00bae0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * Catalog File: Logical Size: 00000000000bf000 (764k) Clump Size: 000bf000 Total Blocks: 000005f8 00bb10: 00 00 00 00 00 0b f0 00 00 0b f0 00 00 00 05 f8 ................ Extent 1 Start Block: 0000062b Block Count: 000005f8 00bb20: 00 00 06 2b 00 00 05 f8 00 00 00 00 00 00 00 00 ...+............ 00bb30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * Start of Allocation File 00bc00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ * 00bd80: ff ff ff ff e0 00 00 00 00 00 00 00 00 00 00 00 ................ 00bd90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 00be40: 00 00 00 1f ff ff ff ff ff ff ff ff ff ff ff ff ................ 00be50: ff ff ff ff ff fe 00 00 00 00 00 00 00 00 00 00 ................ 00be60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 011b80: 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 ................ 011b90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * End of Allocation File Start of Extents File fLink: 00000000 bLink: 00000000 Kind: 01 (Header) Height: 00 Num Recs: 0003 Reserved: 0000 Tree Depth: 0000 011c00: 00 00 00 00 00 00 00 00 01 00 00 03 00 00 00 00 ................ Root Node: 00000000 Leaf Recs: 00000000 First Leaf: 00000000 Last Leaf: 00000000 011c10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Node Size: 0400 Max Keylen: 000a Total Nodes: 000002fc Free Nodes: 000002fb Reserved: 0000 Clump Size: 000bf000 011c20: 04 00 00 0a 00 00 02 fc 00 00 02 fb 00 00 00 0b ................ Tree Type: 00 (unused in HFS+) Reserved: 00 Attributes:00000002 (BigKeys) 011c30: f0 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 ................ 011c40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * Map record (starts at 11cf8, node 0 in use) 011cf0: 00 00 00 00 00 00 00 00 80 00 00 00 00 00 00 00 ................ 011d00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * Record Offsets: Rec 1: 000e (header record) Rec 2: 0078 (reserved record) Rec 3: 00f8 (map record) Rec 4: 03f8 (free space) 011ff0: 00 00 00 00 00 00 00 00 03 f8 00 f8 00 78 00 0e .............x.. 012000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * Start of Catalog File fLink: 00000000 bLink: 00000000 Kind: 01 (Header) Height: 00 Num Recs: 0003 Reserved: 0000 Tree Depth: 0001 0d0c00: 00 00 00 00 00 00 00 00 01 00 00 03 00 00 00 01 ................ Root Node: 00000001 Leaf Recs: 0000000a First Leaf: 00000001 Last Leaf: 00000001 0d0c10: 00 00 00 01 00 00 00 0a 00 00 00 01 00 00 00 01 ................ Node Size: 1000 Max Keylen: 0204 Total Nodes: 000000bf Free Nodes: 000000bd Reserved: 0000 Clump Size: 000bf000 0d0c20: 10 00 02 04 00 00 00 bf 00 00 00 bd 00 00 00 0b ................ Tree Type: 00 (unused in HFS+) Reserved: 00 Attributes:00000006 (BigKeys | VariableIndexKeys) 0d0c30: f0 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 ................ 0d0c40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * Map record (starts at d0cf8, nodes 0 and 1 in use) 0d0cf0: 00 00 00 00 00 00 00 00 c0 00 00 00 00 00 00 00 ................ 0d0d00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * Record Offsets: Rec 1: 000e (header record) Rec 2: 0078 (reserved record) Rec 3: 00f8 (map record) Rec 4: 0ff8 (free space) 0d1bf0: 00 00 00 00 00 00 00 00 0f f8 00 f8 00 78 00 0e .............x.. Node 1 (Root and only leaf node) fLink: 00000000 bLink: 00000000 Kind: ff (Leaf) Height: 01 Num Recs: 000a Reserved: 0000 Keylen: 0014 (Start of Record 1: 0d1c0e) 0d1c00: 00 00 00 00 00 00 00 00 ff 01 00 0a 00 00 00 14 ................ ParentId: 00000001 (Parent of Root) NodeNameLen: 0007 NodeNameText: 005a00490050002d003100300030 (ZIP-100) 0d1c10: 00 00 00 01 00 07 00 5a 00 49 00 50 00 2d 00 31 .......Z.I.P.-.1 RecordType: 0001 (Folder) Flags: 0000 Valence: 00000004 CNID: 00000002 (Root) 0d1c20: 00 30 00 30 00 01 00 00 00 00 00 04 00 00 00 02 .0.0............ CreateDate: b47fa9cd ContentModDate: b47fa9e1 AttribModDate: 00000000 AccessDate: 00000000 0d1c30: b4 7f a9 cd b4 7f a9 e1 00 00 00 00 00 00 00 00 ................ BackupDate: 00000000 Owner: 00000000 Group: 00000000 Permissions: 00000000 0d1c40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Device: 00000000 Rect: 0000000000000000 Flags: 03e0 Location: 00dc03c0 0d1c50: 00 00 00 00 00 00 00 00 00 00 00 00 03 e0 00 dc ................ View: 0107 Scroll: 00000000 OpenChain: c3400000 Unused: 0000 Comment: 0000 0d1c60: 03 c0 01 07 00 00 00 00 c3 40 00 00 00 00 00 00 .........@...... PutAway: 00000000 Encoding: 00000000 Reserved: 00000000 Keylen: 0006 (Start of Record 2: 0d1c7c) ParentId: 00000002 (Root) 0d1c70: 00 00 00 00 00 00 00 00 00 00 00 00 00 06 00 00 ................ NodeNameLen: 0000 RecordType: 0003 (Folder Thread) Reserved: 0000 ParentId: 00000001 (Parent of Root) NodeNameLen: 0007 NodeNameText: 005a00490050002d003100300030 (ZIP-100) 0d1c80: 00 02 00 00 00 03 00 00 00 00 00 01 00 07 00 5a ...............Z Keylen: 001a (Start of Record 3: 0d1c9c) ParentId: 00000002 (Root) 0d1c90: 00 49 00 50 00 2d 00 31 00 30 00 30 00 1a 00 00 .I.P.-.1.0.0.... NodeNameLen: 000a NodeNameText: 004400650073006b0074006f0070002000440042 (Desktop DB) 0d1ca0: 00 02 00 0a 00 44 00 65 00 73 00 6b 00 74 00 6f .....D.e.s.k.t.o RecordType: 0002 (File) Flags: 0002 Reserved: 00000000 0d1cb0: 00 70 00 20 00 44 00 42 00 02 00 02 00 00 00 00 .p. .D.B........ CNID: 00000011 CreateDate: b47fa9cd ContentModDate: b47fa9cd AttribModDate: 00000000 0d1cc0: 00 00 00 11 b4 7f a9 cd b4 7f a9 cd 00 00 00 00 ................ AccessDate: 00000000 BackupDate: 00000000 Owner: 00000000 Group: 00000000 0d1cd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Permissions: 00000000 Device: 00000000 Type: 4254464c (BTFL) Creator: 444d4752 (DMGR) 0d1ce0: 00 00 00 00 00 00 00 00 42 54 46 4c 44 4d 47 52 ........BTFLDMGR Flags: 4000 Location: 00000000 Folder: 0000 Icon: 0000 Unused: 0000000000000000 0d1cf0: 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 @............... Comment: 0000 PutAway: 00000000 Encoding: 00000000 Reserved: 00000000 DataSize: 0000000000000000 0d1d00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ ClumpSize: 24000000 Blocks: 00000000 0d1d10: 00 00 00 00 00 00 24 00 00 00 00 00 00 00 00 12 ......$......... 0d1d20: 00 00 12 1b 00 00 00 12 00 00 00 00 00 00 00 00 ................ 0d1d30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 0d1db0: 00 1a 00 00 00 02 00 0a 00 44 00 65 00 73 00 6b .........D.e.s.k 0d1dc0: 00 74 00 6f 00 70 00 20 00 44 00 46 00 02 00 02 .t.o.p. .D.F.... 0d1dd0: 00 00 00 00 00 00 00 10 b4 7f a9 cd b4 7f a9 cd ................ 0d1de0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0d1df0: 00 00 00 00 00 00 00 00 00 00 00 00 44 54 46 4c ............DTFL 0d1e00: 44 4d 47 52 40 00 00 00 00 00 00 00 00 00 00 00 DMGR@........... 0d1e10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0d1e20: 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 ................ 0d1e30: 00 00 00 80 00 00 12 2d 00 00 00 80 00 00 00 00 .......-........ 0d1e40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 0d1ec0: 00 00 00 00 00 2a 00 00 00 02 00 12 00 44 00 65 .....*.......D.e 0d1ed0: 00 73 00 6b 00 74 00 6f 00 70 00 50 00 72 00 69 .s.k.t.o.p.P.r.i 0d1ee0: 00 6e 00 74 00 65 00 72 00 73 00 20 00 44 00 42 .n.t.e.r.s. .D.B 0d1ef0: 00 02 00 02 00 00 00 00 00 00 00 12 b4 7f a9 cd ................ 0d1f00: b4 7f a9 cd 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0d1f10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0d1f20: 64 74 70 6c 64 63 64 63 40 00 00 00 00 00 00 00 dtpldcdc@....... 0d1f30: 00 00 00 00 00 00 00 00 80 00 00 00 00 00 00 00 ................ 0d1f40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 0d1f90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 1e ................ 0d1fa0: 00 00 00 00 00 00 00 01 00 00 12 ad 00 00 00 01 ................ 0d1fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 0d1fe0: 00 00 00 00 00 00 00 00 00 28 00 00 00 02 00 11 .........(...... 0d1ff0: 00 4f 00 70 00 65 00 6e 00 46 00 6f 00 6c 00 64 .O.p.e.n.F.o.l.d 0d2000: 00 65 00 72 00 4c 00 69 00 73 00 74 00 44 00 46 .e.r.L.i.s.t.D.F 0d2010: 00 0d 00 02 00 02 00 00 00 00 00 00 00 13 b4 7f ................ 0d2020: a9 e1 b4 7f a9 e1 00 00 00 00 00 00 00 00 00 00 ................ 0d2030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0d2040: 00 00 46 4f 4c 44 4d 41 43 53 40 00 00 00 00 00 ..FOLDMACS@..... 0d2050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 0d20c0: 01 1e 00 00 00 00 00 00 00 01 00 00 12 ae 00 00 ................ 0d20d0: 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0d20e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 0d2100: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 10 ................ 0d2110: 00 00 00 04 00 00 00 00 00 02 00 0a 00 44 00 65 .............D.e 0d2120: 00 73 00 6b 00 74 00 6f 00 70 00 20 00 44 00 46 .s.k.t.o.p. .D.F 0d2130: 00 06 00 00 00 11 00 00 00 04 00 00 00 00 00 02 ................ 0d2140: 00 0a 00 44 00 65 00 73 00 6b 00 74 00 6f 00 70 ...D.e.s.k.t.o.p 0d2150: 00 20 00 44 00 42 00 06 00 00 00 12 00 00 00 04 . .D.B.......... 0d2160: 00 00 00 00 00 02 00 12 00 44 00 65 00 73 00 6b .........D.e.s.k 0d2170: 00 74 00 6f 00 70 00 50 00 72 00 69 00 6e 00 74 .t.o.p.P.r.i.n.t 0d2180: 00 65 00 72 00 73 00 20 00 44 00 42 00 06 00 00 .e.r.s. .D.B.... 0d2190: 00 13 00 00 00 04 00 00 00 00 00 02 00 11 00 4f ...............O 0d21a0: 00 70 00 65 00 6e 00 46 00 6f 00 6c 00 64 00 65 .p.e.n.F.o.l.d.e 0d21b0: 00 72 00 4c 00 69 00 73 00 74 00 44 00 46 00 0d .r.L.i.s.t.D.F.. 0d21c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * Record Offsets: Rec 9: 0556 Rec 10: 058c Rec 11: 05c0 (Free space) 0d2be0: 00 00 00 00 00 00 00 00 00 00 05 c0 05 8c 05 56 ...............V Record Offsets: Rec 1: 000e Rec 2: 007c Rec 3: 009c Rec 4: 01b0 Rec 5: 02c4 Rec 6: 03e8 Rec 7: 050a Rec 8: 0530 0d2bf0: 05 30 05 0a 03 e8 02 c4 01 b0 00 9c 00 7c 00 0e .0...........|.. 0d2c00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 191c00: 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 1e ................ 191c10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 191d00: 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 1e ................ 191d10: 00 00 00 00 00 00 00 00 00 1c 00 1e ff ff 00 00 ................ 191d20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 192200: 00 00 01 00 00 00 08 0c 00 00 07 0c 00 00 00 5a ...............Z 192210: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 192300: 00 00 01 00 07 ff ff e0 1e 08 00 b8 74 08 00 ae ............t... 192310: c4 0f ff a3 84 00 00 21 84 00 80 21 84 00 00 21 .......!...!...! 192320: 84 1e b8 21 84 04 a4 21 84 08 a4 21 84 1e b8 21 ...!...!...!...! 192330: 84 00 20 21 84 00 00 21 87 ff ff e1 84 2a aa a1 .. !...!.....*.. 192340: 84 35 55 41 84 2a aa 99 87 ff ff 3d 84 00 00 3d .5UA.*.....=...= 192350: 84 00 00 19 84 4e 38 01 84 d1 45 ff 84 51 45 ff .....N8...E..QE. 192360: 84 51 45 c7 84 51 45 c7 84 4e 39 e7 84 00 01 e7 .QE..QE..N9..... 192370: 84 00 01 e7 87 ff ff e7 c4 00 01 e7 7c 00 01 ff ............|... 192380: 07 ff ff ff 07 ff ff e0 1f ff ff f8 7f ff ff fe ................ 192390: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ * 1923f0: ff ff ff ff ff ff ff ff ff ff ff ff 7f ff ff ff ................ 192400: 07 ff ff ff 00 00 02 00 00 00 0f ff ff ff ff ff ................ 192410: ff ff ff ff ff f0 00 00 00 0f ff fd dd dd fc cc ................ 192420: cc cc cc cc fd ff f0 00 0f ff cf dd dd dd fc cc ................ 192430: cc cc cc cc fd fc ff f0 ff dd cf dd dd dd ff ff ................ 192440: ff ff ff ff fd fc dd ff fd dd cf dd dd dd dd dd ................ 192450: dd dd dd dd dd fc dd df fd dd cf dd dd dd dd dd ................ 192460: fd dd dd dd dd fc dd df fd dd cf dd dd dd dd dd ................ 192470: dd dd dd dd dd fc dd df fd dd cf dd dd df ff fd ................ 192480: fd ff fd dd dd fc dd df fd dd cf dd dd dd df dd ................ 192490: fd fd df dd dd fc dd df fd dd cf dd dd dd fd dd ................ 1924a0: fd fd df dd dd fc dd df fd dd cf dd dd df ff fd ................ 1924b0: fd ff fd dd dd fc dd df fd dd cf dd dd dd dd dd ................ 1924c0: dd fd dd dd dd fc dd df fd dd cf dd dd dd dd dd ................ 1924d0: dd dd dd dd dd fc dd df fd dd cf ff ff ff ff ff ................ 1924e0: ff ff ff ff ff fc dd df fd dd cf 00 00 f3 33 33 ..............33 1924f0: 33 33 33 33 33 fc dd df fd dd cf 00 00 f3 33 33 33333.........33 * 192510: 33 33 33 33 33 05 5d df fd dd cf ff ff ff ff ff 33333.]......... 192520: ff ff ff ff f0 55 55 df fd dd cf 00 00 00 00 00 .....UU......... 192530: 00 00 00 00 00 55 55 df fd dd cf 00 00 00 00 00 .....UU......... 192540: 00 00 00 00 00 05 5d df fd dd cf 00 0f 00 ff f0 ......]......... 192550: 00 ff f0 00 00 0d dd df fd dd cf 00 ff 0f 00 0f ................ 192560: 0f 00 0f 05 55 55 55 55 fd dd cf 00 0f 0f 00 0f ....UUUU........ 192570: 0f 00 0f 05 33 33 33 35 fd dd cf 00 0f 0f 00 0f ....3335........ 192580: 0f 00 0f 05 33 00 03 35 fd dd cf 00 0f 0f 00 0f ....3..5........ 192590: 0f 00 0f 05 33 00 03 35 fd dd cf 00 0f 00 ff f0 ....3..5........ 1925a0: 00 ff f0 05 33 30 03 35 fd dd cf 00 00 00 00 00 ....30.5........ 1925b0: 00 00 00 05 33 30 03 35 fd dd cf 00 00 00 00 00 ....30.5........ 1925c0: 00 00 00 05 33 30 03 35 fd dd cf ff ff ff ff ff ....30.5........ 1925d0: ff ff ff f5 33 30 03 35 fd dd cf dd dd dd dd dd ....30.5........ 1925e0: dd dd dd d5 33 30 03 35 0f ff ff dd dd dd dd dd ....30.5........ 1925f0: dd dd dd d5 33 33 33 35 00 00 0f ff ff ff ff ff ....3335........ 192600: ff ff ff f5 55 55 55 55 00 00 04 00 00 00 00 00 ....UUUU........ 192610: 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ 192620: ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00 ff ................ 192630: ff ff ff f8 f8 f8 f8 f8 ff f6 f6 f6 f6 f6 f6 f6 ................ 192640: f6 f6 f6 f6 ff f8 ff ff ff 00 00 00 00 ff ff ff ................ 192650: f6 ff f8 f8 f8 f8 f8 f8 ff f6 f6 f6 f6 f6 f6 f6 ................ 192660: f6 f6 f6 f6 ff f8 ff f6 ff ff ff 00 ff ff f8 f8 ................ 192670: f6 ff f8 f8 f8 f8 f8 f8 ff ff ff ff ff ff ff ff ................ 192680: ff ff ff ff ff f8 ff f6 f8 f8 ff ff ff f8 f8 f8 ................ 192690: f6 ff f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 ................ 1926a0: f8 f8 f8 f8 f8 f8 ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 1926b0: f6 ff f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 ff f8 f8 f8 ................ 1926c0: f8 f8 f8 f8 f8 f8 ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 1926d0: f6 ff f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 ................ 1926e0: f8 f8 f8 f8 f8 f8 ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 1926f0: f6 ff f8 f8 f8 f8 f8 ff ff ff ff f8 ff f8 ff ff ................ 192700: ff f8 f8 f8 f8 f8 ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 192710: f6 ff f8 f8 f8 f8 f8 f8 f8 ff f8 f8 ff f8 ff f8 ................ 192720: f8 ff f8 f8 f8 f8 ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 192730: f6 ff f8 f8 f8 f8 f8 f8 ff f8 f8 f8 ff f8 ff f8 ................ 192740: f8 ff f8 f8 f8 f8 ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 192750: f6 ff f8 f8 f8 f8 f8 ff ff ff ff f8 ff f8 ff ff ................ 192760: ff f8 f8 f8 f8 f8 ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 192770: f6 ff f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 ff f8 ................ 192780: f8 f8 f8 f8 f8 f8 ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 192790: f6 ff f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 ................ 1927a0: f8 f8 f8 f8 f8 f8 ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 1927b0: f6 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ 1927c0: ff ff ff ff ff ff ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 1927d0: f6 ff 00 00 00 00 ff d8 d8 d8 d8 d8 d8 d8 d8 d8 ................ 1927e0: d8 d8 d8 d8 d8 d8 ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 1927f0: f6 ff 00 00 00 00 ff d8 d8 d8 d8 d8 d8 d8 d8 d8 ................ 192800: d8 d8 d8 d8 d8 d8 ff f6 f8 f8 f8 ff ff f8 f8 f8 ................ 192810: f6 ff 00 00 00 00 ff d8 d8 d8 d8 d8 d8 d8 d8 d8 ................ 192820: d8 d8 d8 d8 d8 d8 00 b0 b0 f8 f8 ff ff f8 f8 f8 ................ 192830: f6 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ 192840: ff ff ff ff ff 00 b0 b0 b0 b0 f8 ff ff f8 f8 f8 ................ 192850: f6 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 192860: 00 00 00 00 00 00 b0 b0 b0 b0 f8 ff ff f8 f8 f8 ................ 192870: f6 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 192880: 00 00 00 00 00 00 00 b0 b0 f8 f8 ff ff f8 f8 f8 ................ 192890: f6 ff 00 00 00 ff 00 00 ff ff ff 00 00 00 ff ff ................ 1928a0: ff 00 00 00 00 00 00 f8 f8 f8 f8 ff ff f8 f8 f8 ................ 1928b0: f6 ff 00 00 ff ff 00 ff 00 00 00 ff 00 ff 00 00 ................ 1928c0: 00 ff 00 b0 b0 b0 b0 b0 b0 b0 b0 b0 ff f8 f8 f8 ................ 1928d0: f6 ff 00 00 00 ff 00 ff 00 00 00 ff 00 ff 00 00 ................ 1928e0: 00 ff 00 b0 d8 d8 d8 d8 d8 d8 d8 b0 ff f8 f8 f8 ................ 1928f0: f6 ff 00 00 00 ff 00 ff 00 00 00 ff 00 ff 00 00 ................ 192900: 00 ff 00 b0 d8 d8 00 00 00 d8 d8 b0 ff f8 f8 f8 ................ 192910: f6 ff 00 00 00 ff 00 ff 00 00 00 ff 00 ff 00 00 ................ 192920: 00 ff 00 b0 d8 d8 00 00 00 d8 d8 b0 ff f8 f8 f8 ................ 192930: f6 ff 00 00 00 ff 00 00 ff ff ff 00 00 00 ff ff ................ 192940: ff 00 00 b0 d8 d8 d8 00 00 d8 d8 b0 ff f8 f8 f8 ................ 192950: f6 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 192960: 00 00 00 b0 d8 d8 d8 00 00 d8 d8 b0 ff f8 f8 f8 ................ 192970: f6 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 192980: 00 00 00 b0 d8 d8 d8 00 00 d8 d8 b0 ff f8 f8 f8 ................ 192990: f6 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ 1929a0: ff ff ff b0 d8 d8 d8 00 00 d8 d8 b0 ff f8 f8 f8 ................ 1929b0: f6 ff f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 ................ 1929c0: f8 f8 f8 b0 d8 d8 d8 00 00 d8 d8 b0 00 ff ff ff ................ 1929d0: ff ff f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 ................ 1929e0: f8 f8 f8 b0 d8 d8 d8 d8 d8 d8 d8 b0 00 00 00 00 ................ 1929f0: 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ 192a00: ff ff ff b0 b0 b0 b0 b0 b0 b0 b0 b0 00 00 01 00 ................ 192a10: 00 00 08 0c 00 00 07 0c 00 00 00 5a 05 a3 c5 a8 ...........Z.... 192a20: 29 22 00 00 00 1c 00 5a 00 02 49 43 4e 23 00 00 )".....Z..ICN#.. 192a30: 00 1a 69 63 6c 34 00 00 00 26 69 63 6c 38 00 00 ..icl4...&icl8.. 192a40: 00 32 bf b9 ff ff 00 00 00 00 05 a3 c4 cc bf b9 .2.............. 192a50: ff ff 00 00 01 04 05 a3 c4 d0 bf b9 ff ff 00 00 ................ 192a60: 03 08 05 a3 c4 bc 00 00 00 00 00 00 00 00 00 00 ................ 192a70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 24ec00: 00 00 00 00 00 00 00 00 01 00 00 03 00 00 00 01 ................ 24ec10: 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 ................ 24ec20: 02 00 00 25 00 00 00 12 00 00 00 10 00 00 00 00 ...%............ 24ec30: 20 00 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 ............... 24ec40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 24ec70: 00 00 00 00 00 00 00 00 02 0a 01 00 00 00 00 00 ................ 24ec80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 24ecf0: 00 00 00 00 00 00 00 00 c0 00 00 00 00 00 00 00 ................ 24ed00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 24edf0: 00 00 00 00 00 00 00 00 01 f8 00 f8 00 78 00 0e .............x.. 24ee00: 00 00 00 00 00 00 00 00 ff 01 00 01 00 00 0b 01 ................ 24ee10: 61 74 63 6f 61 74 63 6f fe 00 00 00 00 00 00 00 atcoatco........ 24ee20: 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 ................ 24ee30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 24eff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 24 00 0e .............$.. 24f000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 251000: 00 02 00 00 00 00 00 00 01 00 00 03 00 00 00 01 ................ 251010: 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 ................ 251020: 02 00 00 07 00 00 00 09 00 00 00 07 00 00 00 00 ................ 251030: 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 251040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 2510f0: 00 00 00 00 00 00 00 00 c0 00 00 00 00 00 00 00 ................ 251100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 2511f0: 00 00 00 00 00 00 00 00 01 f8 00 f8 00 78 00 0e .............x.. 251200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 261000: 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 1e ................ 261010: 79 80 7f 79 7f 80 7f 79 7f 79 aa 79 7f 80 7f 79 y..y...y.y.y...y 261020: 7f 79 7f 7f 79 7f 79 7f 80 7f 79 80 7f 79 80 7f .y..y.y...y..y.. 261030: 79 a4 7f 80 7f 79 80 73 7f a4 7f a4 7f 79 7f 79 y....y.s.....y.y 261040: 80 7f a4 7f 80 7f a4 7f 80 7f 79 7f 7f 79 7f a4 ..........y..y.. 261050: 7f 79 7f a4 7f 79 7f a4 7f 79 7f 79 7f 7f a4 7f .y...y...y.y.... 261060: 79 7f 7f 79 7f 7f a4 7f 79 7f 79 7f 7f a4 7f 79 y..y....y.y....y 261070: a4 7f 79 7f 7f 79 7f 79 7f 79 7f 79 7f 79 aa 79 ..y..y.y.y.y.y.y 261080: 7f 80 7f 79 80 7f 7f 80 7f 79 7f 79 7f a4 7f 79 ...y.....y.y...y 261090: 7f 79 7f 79 7f a4 80 7f 4f 4e 54 f6 55 4e 2a 4f .y.y....ONT.UN*O 2610a0: 4f 55 2a 00 00 4f 06 79 7f aa aa ea 01 f6 09 ff OU*..O.y........ 2610b0: ea aa a4 5b 4f 06 2a 00 4e fe 00 61 06 4e 00 4e ...[O.*.N..a.N.N 2610c0: 00 4f 7f 5b a4 80 a3 a4 a4 86 a4 80 a4 80 aa a4 .O.[............ 2610d0: a4 aa a4 a4 aa a3 aa a4 a4 80 aa a4 a4 86 a4 80 ................ 2610e0: a3 80 a4 80 a4 7f a4 86 a4 a4 80 a3 80 a4 aa a4 ................ 2610f0: a4 80 a3 80 a3 86 a4 a3 a4 aa a3 80 aa 80 a4 80 ................ 261100: 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 1e ................ 261110: 00 00 00 00 00 00 00 00 00 1c 00 1e ff ff fe a4 ................ 261120: 58 aa a4 a3 fb a9 a4 80 aa 7f a4 a3 fb a3 a4 80 X............... 261130: a4 7f a4 80 a4 86 aa a4 80 a4 80 aa a4 80 a4 a4 ................ 261140: 80 aa 80 aa 80 a4 80 aa a4 a4 7f aa 80 a4 7f a4 ................ 261150: 86 a4 80 a4 80 a3 80 aa 80 a4 86 a4 80 a3 fb 7f ................ 261160: aa 80 aa a4 7f a4 86 a3 80 a4 80 a4 86 a4 80 a4 ................ 261170: 86 a4 86 a4 80 a4 80 a4 a4 aa fe a4 7f aa a4 80 ................ 261180: a4 80 aa 80 a3 80 aa 80 aa a4 a4 86 a4 7f aa 80 ................ 261190: a4 a4 a3 aa aa a4 80 a4 7f a4 aa a4 a4 a3 fb a3 ................ 2611a0: a4 aa 80 a3 fb a3 a4 a4 80 aa 80 a3 80 aa 80 aa ................ 2611b0: a3 aa a4 a4 7f aa a4 a3 80 a4 80 a3 80 aa 80 a4 ................ 2611c0: 80 a4 a4 aa aa a4 80 a4 aa a4 86 a4 86 a4 80 a3 ................ 2611d0: 80 aa a4 a4 aa a3 aa a4 a4 80 aa a4 a4 86 a4 80 ................ 2611e0: a3 80 a4 80 a4 7f a4 86 a4 a4 80 a3 80 a4 aa a4 ................ 2611f0: a4 80 a3 80 a3 86 a4 a3 a4 aa a3 80 aa 20 80 a4 ............. .. 261200: 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 1e ................ 261210: aa a4 80 a4 86 a4 a3 fb a3 86 a4 80 aa 80 aa fe ................ 261220: a4 58 aa a4 a3 fb a9 a4 80 aa 7f a4 a3 fb a3 a4 .X.............. 261230: 80 a4 7f a4 80 a4 86 aa a4 80 a4 80 aa a4 80 a4 ................ 261240: a4 80 aa 80 aa 80 a4 80 aa a4 a4 7f aa 80 a4 7f ................ 261250: a4 86 a4 80 a4 80 a3 80 aa 80 a4 86 a4 80 a3 fb ................ 261260: 7f aa 80 aa a4 7f a4 86 a3 80 a4 80 a4 86 a4 80 ................ 261270: a4 86 a4 86 a4 80 a4 80 a4 a4 aa fe a4 25 aa a4 .............%.. 261280: 80 a4 80 aa 80 a3 80 aa 80 a4 80 a4 80 a4 7f 55 ...............U 261290: 4e 4f 06 4f 54 f7 4f 55 30 4f 4f 55 4f 55 2a 79 NO.OT.OU0OOUOU*y 2612a0: a4 a4 ce ef 01 a5 06 ff ef aa a3 79 4e 4f fe 00 ...........yNO.. 2612b0: 03 4f 4e 06 2a fe 00 05 06 00 79 4f 7f 79 fd 7f .ON.*.....yO.y.. 2612c0: 00 79 f8 7f 02 79 7f 79 fb 7f 02 79 7f 79 fa 7f .y...y.y...y.y.. 2612d0: 00 79 fb 7f 00 79 fb 7f 00 79 fe 7f 03 79 7f 7f .y...y...y...y.. 2612e0: 79 fd 7f 00 79 fc 7f 00 79 fe 7f 00 79 fe 7f 0e y...y...y...y... 2612f0: 79 7f 7f 79 7f 7f 79 7f 7f 79 7f 7f 79 7f 79 fe y..y..y..y..y.y. 261300: 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 1e ................ 261310: 00 00 00 00 00 00 00 00 00 1c 00 1e ff ff fe 7f ................ 261320: 04 79 5b 7f 7f 79 fd 7f 00 79 fe 7f 13 79 7f 7f .y[..y...y...y.. 261330: 79 7f 79 7f 9d 7f 7f 79 7f 79 7f 79 7f 7f 79 7f y.y....y.y.y..y. 261340: 79 fd 7f 00 79 fd 7f 01 a3 79 fc 7f 00 79 fe 7f y...y....y...y.. 261350: 02 79 7f 79 fe 7f 00 79 fe 7f 08 79 7f 79 7f 7f .y.y...y...y.y.. 261360: 79 7f 7f 79 fd 7f 01 79 79 fe 7f 02 a4 7f 79 fe y..y...yy.....y. 261370: 7f 00 79 fd 7f 00 79 fb 7f 07 79 7f 7f 79 7f 79 ..y...y...y..y.y 261380: 7f 79 fe 7f 00 79 fa 7f 07 79 7f 7f 79 7f 7f 79 .y...y...y..y..y 261390: 79 fe 7f 04 79 7f 79 7f 79 fa 7f 02 79 7f 79 fb y...y.y.y...y.y. 2613a0: 7f 02 79 7f 79 fa 7f 00 79 fb 7f 00 79 fb 7f 00 ..y.y...y...y... 2613b0: 79 fe 7f 03 79 7f 7f 79 fd 7f 00 79 fc 7f 00 79 y...y..y...y...y 2613c0: fe 7f 00 79 fe 7f 0e 79 7f 7f 79 7f 7f 79 7f 7f ...y...y..y..y.. 2613d0: 79 7f 7f 79 7f 79 fe 7f 00 79 fe 7f 06 79 7f 7f y..y.y...y...y.. 2613e0: 79 7f 7f 79 f8 7f 02 9d 7f 79 fd 7f 01 79 a3 fe y..y.....y...y.. 2613f0: 7f 02 79 7f 79 fe 7f 04 79 5b 7f 7f 79 fd 7f 00 ..y.y...y[..y... 261400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 5f98c00: 48 2b 00 04 00 00 01 00 38 2e 31 30 00 00 00 00 H+......8.10.... 5f98c10: b4 7f 39 4a b4 7f a9 cc 00 00 00 00 b4 7f a9 cc ..9J............ 5f98c20: 00 00 00 00 00 00 00 00 00 00 02 00 00 02 fc 6d ...............m 5f98c30: 00 02 f0 48 00 00 12 1b 00 00 20 00 00 00 20 00 ...H...... ... . 5f98c40: 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 01 ................ 5f98c50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 5f98c70: 00 00 00 00 00 00 60 00 00 00 60 00 00 00 00 30 ......`...`....0 5f98c80: 00 00 00 03 00 00 00 30 00 00 00 00 00 00 00 00 .......0........ 5f98c90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 5f98cc0: 00 00 00 00 00 0b f0 00 00 0b f0 00 00 00 05 f8 ................ 5f98cd0: 00 00 00 33 00 00 05 f8 00 00 00 00 00 00 00 00 ...3............ 5f98ce0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 5f98d10: 00 00 00 00 00 0b f0 00 00 0b f0 00 00 00 05 f8 ................ 5f98d20: 00 00 06 2b 00 00 05 f8 00 00 00 00 00 00 00 00 ...+............ 5f98d30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * 5f99200: 42 44 b4 7f 39 4a b4 7f 39 4b 83 00 00 05 00 03 BD..9J..9K...... 5f99210: 00 09 fe e7 00 00 06 00 00 00 06 00 00 13 00 00 ................ 5f99220: 00 15 00 00 07 5a 49 50 2d 31 30 30 00 00 00 00 .....ZIP-100.... 5f99230: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 5f99240: 00 00 00 00 00 00 00 00 00 0c 00 00 12 00 00 00 ................ 5f99250: 12 00 00 00 00 00 00 05 00 00 00 00 00 00 00 02 ................ 5f99260: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 5f99270: 00 00 00 00 00 00 00 00 00 00 00 00 48 2b 00 18 ............H+.. 5f99280: fe cf 00 00 12 00 00 00 00 03 00 00 00 00 00 00 ................ 5f99290: 00 00 00 00 12 00 00 03 00 03 00 00 00 00 00 00 ................ 5f992a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * hfsplus-1.0.4/mail/Re_BugReport_HFS_implementation_in_OS_9.txt0100644000000000000000000000367207441220605023055 0ustar rootrootVon: Peter Handel [handel@apple.com] Gesendet: Freitag, 10. November 2000 01:53 An: Halfmann, Klaus Betreff: Re: BugReport HFS+ implementation in OS 9 Klaus, this is the latest: ----------------- 11/7/00 6:39 PM Bill xxxx: I am not sure I understand what the developer is talking about. We don't maintain a leaf node count, only a leaf record count? The BTree Header Record (BTHeaderRec, defined in HFSVolumes.h) maintains a count of the number of records contained in the leaf nodes of the tree (BTHeaderRec->leafRecords), as well as the total number of nodes allocated to the BTree file (BTHeaderRec->totalNodes), and the number of free nodes (BTHeaderRec->totalNodes). The leaf record count in the BTHeaderRec was getting out of synch in earlier version of MacOS X but I haven't seen that since Beta. Can we get the developer to clarify this? ---------------- Thanks, Peter On Thursday, November 2, 2000, at 01:47 AM, Halfmann, Klaus wrote: > I'm in the process of writing HFS+ tools for linux and currently > work at the hpfsck tool. Doing so I found a minor Bug in the > Implemenation of HFS+ in MacOS 9. The B*Trees contain a field > leaf_count. I check this field against the node_count and > found it greater, resulting in an error message. > > This field is not important, I do not need it by now and > probably no other implemenation does so. It happend to me > on my main HFS+volume of 2.5 Gb after deleting several hunderes > of files. It happend in the catalog-btree. The extents-btree > is not affected as far as I can tell. > > In case you want to look at my code, I can give you an anonymous > CVS access, > > Greetings, > > > | | Klaus Halfmann khalfmann@libra.de > | | > | i | --. r--- -- | Libra Software GmbH Tel +49 (0)621 41997-0 > | | b-- | | a-- | Erzbergerstr. 17 Fax +49 (0)621 41997-30 > L--- | --- | | .---. 68165 Mannheim hfsplus-1.0.4/mail/Re_hfs_support_for_blocksize0100644000000000000000000000605107441220605020463 0ustar rootrootVon: Roman Zippel [zippel@fh-brandenburg.de] Gesendet: Mittwoch, 30. August 2000 03:10 An: Alexander Viro Cc: Matthew Wilcox; Roman Zippel; linux-fsdevel; linux-kernel; linuxppc-dev@lists.linuxppc.org Betreff: Re: hfs support for blocksize != 512 Hi, > > hfs. For example reading from a file might require a read from a btree > > file (extent file), with what another file write can be busy with (e.g. > > reordering the btree nodes). > > And? The point is: the thing I like about Linux is its simple interfaces, it's the basic idea of unix - keep it simple. That is true for most parts - the basic idea is simple and the real complexity is hidden behind it. But that's currently not true for vfs interface, a fs maintainer has to fight right now with fscking complex vfs interface and with a possible fscking complex fs implementation. E2fs or affs have a pretty simple structure and I believe you that it's not that hard to fix, maybe there is also a simple solution for hfs. But I'd like you to forget about that and think about the big picture (how Linus nicely states it). What we should aim at with the vfs interface is simplicity, I want to use a fscking simple semaphore to protect something like anywhere else, I don't want to juggle with lots blocks wich have to be updated atomically. Maybe you get once right, but it will follow you as a nightmare, you add one feature (e.g. quota), you add another feature (like btrees), you so still damned fscking sure to get and keeping it right? So and? What I'd really like to see from you is to be a bit more supportive for other peoples problems, I really don't expect you to solve these problems, but if someone approaches a different solution, you're pretty quick to refuse it. So lets get back to the vfs interface, fs currently have to do pretty much all there changes atomically, they have to grab all the buffers they need and do all changes at once. How can you be sure that this is possible for every possible fs? How do you make sure you don't create other problems like livelocks? We currently have problem that things like kswapd require an asynchronous interface, but fs prefer to synchronize it. Currently you pushing all the burden of an asynchronous interface into the fs, which want to rather avoid that. Why don't you think for a moment in the other direction? Currently I'm playing with the idea of a kernel thread for asynchronous io (maybe one per fs), that thread takes the io requests e.g. from kswapd and the io thread can safely sleep on it, while kswapd can continue its job, but I don't know yet, where to put, whether in the fs specific part or whether it can be made generic enough to be put into the generic part. Can we please think for a moment in that direction? At some point you have to synchronize the io anyway (at latest when it hits the device), but I would pretty much prefer if a fs would get some help at some earlier point. (Anyway, I need some sleep now as well... :) ) bye, Roman ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ hfsplus-1.0.4/rpm/0040755000000000000000000000000007450157145012510 5ustar rootroothfsplus-1.0.4/rpm/hfsplus.spec0100644000000000000000000000262207450157136015047 0ustar rootrootSummary: user-space HFS+ utilities Name: hfsplusutils %define version 1.0.4 %define location /usr Version: %{version} Release: 4 Copyright: GPL Group: Applications/File Source: ftp://penguinppc.org/pub/hfsplus/hfsplus.tz2 # Patch: hfsplus-static-make.patch BuildRoot: /var/tmp/%{name}-root Vendor: Klaus Halfmann Packager: Klaus Halfmann %description A portable, free implementation of routines for accessing HFS+ volumes. Currently only reading is supported. %prep %setup -q -n hfsplus # %patch0 -p0 %build CFLAGS="$RPM_OPT_FLAGS" make -f Makefile.cvs make %install rm -rf $RPM_BUILD_ROOT install -d $RPM_BUILD_ROOT%{location}/bin install -d $RPM_BUILD_ROOT%{location}/lib install -s -m 755 src/.libs/* $RPM_BUILD_ROOT%{location}/bin install -s -m 644 libhfsp/src/libhfsp.la $RPM_BUILD_ROOT%{location}/lib install -s -m 755 libhfsp/src/.libs/libhfsp.a $RPM_BUILD_ROOT%{location}/lib install -s -m 755 libhfsp/src/.libs/libhfsp.so.0.0.0 $RPM_BUILD_ROOT%{location}/lib # hpfsck should work a bit # rm $RPM_BUILD_ROOT%{location}/bin/hpfsck cd $RPM_BUILD_ROOT%{location}/lib; ln -s libhfsp.so.0.0.0 libhfsp.so cd $RPM_BUILD_ROOT%{location}/lib; ln -s libhfsp.so.0.0.0 libhfsp.so.0 %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %{location}/bin/* %{location}/lib/* %doc doc/bugs.html doc/faq.html doc/hfsp.html doc/libhfsp.html doc/man/hfsp.sgml hfsplus-1.0.4/src/0040755000000000000000000000000007450157145012501 5ustar rootroothfsplus-1.0.4/src/.cvsignore0100644000000000000000000000002507441220605014463 0ustar rootrootMakefile Makefile.in hfsplus-1.0.4/src/Makefile.am0100644000000000000000000000253607441220605014530 0ustar rootroot# # Makefile.am for hfsplus # # Created by Klaus Kaempf and # Klaus Halfmann # # $Id: Makefile.am,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ INCLUDES = -I../libhfsp/src CFLAGS = -O2 -Wall bin_PROGRAMS = hpmount hpumount hpls hpcd hpcopy hppwd hpfsck hprm hpmkdir hpmount_SOURCES = hpmount.c hpcache.c hfsputil.c glob.c dstring.c dlist.c hpumount_SOURCES = hpumount.c hpcache.c hfsputil.c glob.c dstring.c dlist.c hpls_SOURCES = hpls.c dstring.c dlist.c darray.c glob.c hpcache.c hfsputil.c hpcd_SOURCES = hpcd.c dstring.c dlist.c glob.c hpcache.c hfsputil.c hppwd_SOURCES = hppwd.c dstring.c hpcache.c hfsputil.c glob.c dlist.c hpcopy_SOURCES = hpcopy.c hpcache.c charset.c copyout.c binhex.c crc.c hfsputil.c glob.c \ dstring.c dlist.c hprm_SOURCES = hprm.c hpcache.c charset.c hfsputil.c glob.c dstring.c dlist.c hpmkdir_SOURCES = hpmkdir.c hpcache.c charset.c hfsputil.c glob.c dstring.c dlist.c hpfsck_SOURCES = hpfsck.c hfsputil.c glob.c dstring.c dlist.c LDADD = ../libhfsp/src/libhfsp.la # dynamically linked tools dont work, yet .. # LDADD = ../libhfsp/src/libhfsp.la AUTOMAKE_OPTIONS = foreign CLEANFILES = config.cache config.status config.log MAINTAINERCLEANFILES = Makefile Makefile.in \ configure config.h config.sub config.guess \ ltconfig ltmain.sh stamp-h stamp-h.in libtool aclocal.m4 hfsplus-1.0.4/src/binhex.c0100644000000000000000000002471607441220605014121 0ustar rootroot/* * hfsputils - tools for reading and writing Macintosh HFS+ volumes * * Utilties to write and read binhex (.hqx) formats. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: binhex.c,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # ifdef HAVE_UNISTD_H # include # else extern int dup(int fd); extern int close(int fd); # endif # include # include # include # include "binhex.h" # include "crc.h" const char *binhex_error = "no error"; extern int errno; # define ERROR(code, str) (binhex_error = (str), errno = (code)) static FILE *file; /* input/output file */ static char line[67]; /* ASCII line buffer */ static int lptr; /* next char in line buffer */ static int state86; /* 8->6 encoding state */ static unsigned char lastch; /* last encoded data byte */ static int runlen; /* runlength of last data byte */ static unsigned short crc; /* incremental CRC word */ static const unsigned char zero[2] = { 0, 0 }; static const char hqxheader[] = "(This file must be converted with BinHex 4.0)\n"; static const char enmap[] = "!\"#$%&'()*+,-012345689@ABCDEFGHI" "JKLMNPQRSTUVXYZ[`abcdefhijklmpqr"; static const signed char demap[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 13, 15, 16, 17, 18, 19, 20, 0, 21, 22, 0, 0, 0, 0, 0, 0, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 0, 38, 39, 40, 41, 42, 43, 44, 0, 45, 46, 47, 48, 0, 0, 0, 0, 49, 50, 51, 52, 53, 54, 55, 0, 56, 57, 58, 59, 60, 61, 0, 0, 62, 63, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; # define HEADERMATCH 40 # define MAXLINELEN 64 # define ISRETURN(c) (demap[(unsigned char) (c)] == -1) /* BinHex Encoding ========================================================= */ /* * NAME: bh->start() * DESCRIPTION: begin BinHex encoding */ int binhex_start(int fd) { int dupfd; dupfd = dup(fd); if (dupfd == -1) { ERROR(errno, "error duplicating output stream"); return -1; } file = fdopen(dupfd, "ab"); if (file == 0) { ERROR(errno, "error creating output buffer"); close(dupfd); return -1; } line[0] = ':'; lptr = 1; state86 = 0; runlen = 0; crc = 0x0000; if (fputs(hqxheader, file) == EOF) { ERROR(EIO, "error writing hqx header"); fclose(file); return -1; } return 0; } /* * NAME: flushline() * DESCRIPTION: flush a line to the output file */ static int flushline(void) { line[lptr++] = '\n'; if (fwrite(line,1,lptr,file) != lptr) { ERROR(EIO, "error writing output data"); return -1; } lptr = 0; return 0; } /* * NAME: addchars() * DESCRIPTION: insert bytes of data to the output stream */ static int addchars(const unsigned char *data, register int len) { register unsigned char c; while (len--) { c = *data++; if (lptr == MAXLINELEN && flushline() == -1) return -1; switch (state86 & 0xff00) { case 0x0000: line[lptr++] = enmap[c >> 2]; state86 = 0x0100 | (c & 0x03); break; case 0x0100: line[lptr++] = enmap[((state86 & 0x03) << 4) | (c >> 4)]; state86 = 0x0200 | (c & 0x0f); break; case 0x0200: line[lptr++] = enmap[((state86 & 0x0f) << 2) | (c >> 6)]; if (lptr == MAXLINELEN && flushline() == -1) return -1; line[lptr++] = enmap[c & 0x3f]; state86 = 0; break; } } return 0; } /* * NAME: rleflush() * DESCRIPTION: run-length encode data */ static int rleflush(void) { unsigned char rle[] = { 0x90, 0x00, 0x90, 0x00 }; if ((lastch != 0x90 && runlen < 4) || (lastch == 0x90 && runlen < 3)) { /* self representation */ if (lastch == 0x90) { while (runlen--) if (addchars(rle, 2) == -1) return -1; } else { while (runlen--) if (addchars(&lastch, 1) == -1) return -1; } } else { /* run-length encoded */ if (lastch == 0x90) { rle[3] = runlen; if (addchars(rle, 4) == -1) return -1; } else { rle[1] = lastch; rle[3] = runlen; if (addchars(&rle[1], 3) == -1) return -1; } } runlen = 0; return 0; } /* * NAME: bh->insert() * DESCRIPTION: encode bytes of data, buffering lines and flushing */ int binhex_insert(const void *buf, register int len) { register const unsigned char *data = buf; crc = crc_binh(data, len, crc); for ( ; len--; ++data) { if (runlen) { if (runlen == 0xff || lastch != *data) { if (rleflush() == -1) return -1; } if (lastch == *data) { ++runlen; continue; } } lastch = *data; runlen = 1; } return 0; } /* * NAME: bh->insertcrc() * DESCRIPTION: insert a two-byte CRC checksum */ int binhex_insertcrc(void) { unsigned char word[2]; crc = crc_binh(zero, 2, crc); word[0] = (crc & 0xff00) >> 8; word[1] = (crc & 0x00ff) >> 0; if (binhex_insert(word, 2) == -1) return -1; crc = 0x0000; return 0; } /* * NAME: bh->end() * DESCRIPTION: finish BinHex encoding */ int binhex_end(void) { int result = 0; if (runlen && rleflush()) result = -1; if (state86 && result == 0 && addchars(zero, 1)) // write out remaining state result = -1; line[lptr++] = ':'; if (result == 0 && flushline() == -1) result = -1; if (fclose(file) == EOF) { ERROR(errno, "error flushing output data"); result = result || -1; } return result; } /* BinHex Decoding ========================================================= */ /* * NAME: bh->open() * DESCRIPTION: begin BinHex decoding */ int binhex_open(int fd) { int dupfd, c; const char *ptr; dupfd = dup(fd); if (dupfd == -1) { ERROR(errno, "error duplicating input stream"); return -1; } file = fdopen(dupfd, "rb"); if (file == 0) { ERROR(errno, "error creating input buffer"); close(dupfd); return -1; } state86 = 0; runlen = 0; crc = 0x0000; /* find hqx header */ ptr = hqxheader; while (ptr == 0 || ptr - hqxheader < HEADERMATCH) { c = getc(file); if (c == EOF) { ERROR(EINVAL, "hqx file header not found"); fclose(file); return -1; } if (c == '\n' || c == '\r') { ptr = hqxheader; continue; } if (ptr && c != *ptr++) ptr = 0; } /* skip to CR/LF */ do { c = getc(file); if (c == EOF) { ERROR(EINVAL, "corrupt hqx file"); fclose(file); return -1; } } while (c != '\n' && c != '\r'); /* skip whitespace */ do { c = getc(file); if (c == EOF) { ERROR(EINVAL, "corrupt hqx file"); fclose(file); return -1; } } while (ISRETURN(c)); if (c != ':') { ERROR(EINVAL, "corrupt hqx file"); fclose(file); return -1; } return 0; } /* * NAME: hqxchar() * DESCRIPTION: return the next hqx character from the input stream */ static int hqxchar(void) { int c; do c = getc(file); while (c != EOF && ISRETURN(c)); if (c == EOF) { if (feof(file)) ERROR(EINVAL, "unexpected end of file"); else ERROR(EIO, "error reading input file"); return -1; } c = demap[(unsigned char) c]; if (c == 0) { ERROR(EINVAL, "illegal character in hqx file"); return -1; } return c - 1; } /* * NAME: nextchar() * DESCRIPTION: decode one character from the hqx stream */ static int nextchar(void) { int c, c2, ch; c = hqxchar(); if (c == -1) return -1; switch (state86 & 0xff00) { case 0x0000: c2 = hqxchar(); if (c2 == -1) return -1; ch = (c << 2) | (c2 >> 4); state86 = 0x0100 | (c2 & 0x0f); break; case 0x0100: ch = ((state86 & 0x0f) << 4) | (c >> 2); state86 = 0x0200 | (c & 0x03); break; case 0x0200: ch = ((state86 & 0x03) << 6) | c; state86 = 0; break; default: ch = 0; /* to make the compiler happy */ } return ch; } /* * NAME: bh->read() * DESCRIPTION: decode and return bytes from the hqx stream * * return length of ??? */ int binhex_read(void *buf, register int len) { register unsigned char *data = buf; const unsigned char *ptr = buf; int c, rl, count = len; while (len--) { if (runlen) { *data++ = lastch; --runlen; continue; } c = nextchar(); if (c == -1) return -1; if (c == 0x90) { rl = nextchar(); if (rl == -1) return -1; if (rl > 0) { runlen = rl - 1; ++len; continue; } } *data++ = lastch = c; } crc = crc_binh(ptr, count, crc); return count; } /* * NAME: bh->readcrc() * DESCRIPTION: read and compare CRC bytes */ int binhex_readcrc(void) { unsigned short check; unsigned char word[2]; check = crc_binh(zero, 2, crc); if (binhex_read(word, 2) < 2) return -1; crc = (word[0] << 8) | (word[1] << 0); if (crc != check) { ERROR(EINVAL, "CRC checksum error"); return -1; } crc = 0x0000; return 0; } /* * NAME: bh->close() * DESCRIPTION: finish BinHex decoding */ int binhex_close(void) { int c, result = 0; /* skip whitespace */ do c = getc(file); while (c != EOF && ISRETURN(c)); /* skip optional exclamation */ if (c == '!') { do c = getc(file); while (c != EOF && ISRETURN(c)); } /* verify trailing colon */ if (c != ':') { ERROR(EINVAL, "corrupt end of hqx file"); result = -1; } if (fclose(file) == EOF) { ERROR(errno, "error closing input file"); result = result || -1; } return result; } hfsplus-1.0.4/src/binhex.h0100644000000000000000000000351707441220605014122 0ustar rootroot/* * hfsputils - tools for reading and writing Macintosh HFS+ volumes * * Utilties to write and read binhex (.hqx) formats. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: binhex.h,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ extern const char *binhex_error; /* BinHex Encoding ==================================== */ /* begin BinHex encoding using the given file descriptor */ int binhex_start(int fd); /* encode bytes of data, buffering lines and flushing */ int binhex_insert(const void *buf, register int len); /* insert a two-byte CRC checksum */ int binhex_insertcrc(void); /* finish BinHex encoding */ int binhex_end(void); /* BinHex Decoding =================================== */ /* begin BinHex decoding usinf give file descriptor as input */ int binhex_open(int fd); /* decode and return bytes from the hqx stream */ int binhex_read(void *buf, register int maxlen); /* read and compare CRC bytes */ int binhex_readcrc(void); /* finish BinHex decoding */ int binhex_close(void); hfsplus-1.0.4/src/charset.c0100644000000000000000000001771107441220605014272 0ustar rootroot/* * hfsputils - tools for reading and writing Macintosh HFS+ volumes * * Tools for character set conversion. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: charset.c,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # include # include # include "charset.h" /* conversion from macroman to uniocde */ static const UCS2 macroman[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x00c4, 0x00c5, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8, 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc, 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, 0x00ae, 0x00a9, 0x2122, 0x00b4, 0x00a8, 0x2260, 0x00c6, 0x00d8, 0x221e, 0x00b1, 0x2264, 0x2265, 0x00a5, 0x00b5, 0x2202, 0x2211, 0x220f, 0x03c0, 0x222b, 0x00aa, 0x00ba, 0x2126, 0x00e6, 0x00f8, 0x00bf, 0x00a1, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab, 0x00bb, 0x2026, 0x00a0, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153, 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x25ca, 0x00ff, 0x0178, 0x2044, 0x00a4, 0x2039, 0x203a, 0xfb01, 0xfb02, 0x2021, 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2, 0x00ca, 0x00c1, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4, 0xf8ff, 0x00d2, 0x00da, 0x00db, 0x00d9, 0x0131, 0x02c6, 0x02dc, 0x00af, 0x02d8, 0x02d9, 0x02da, 0x00b8, 0x02dd, 0x02db, 0x02c7 }; /* Substitution for non ISO characters in macroman. Index is the lower part of an 2 byte unicode */ static const char *macroman_subst[128] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 - 0x8f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 - 0x9f */ "+", 0, 0, 0, 0, "*", 0, 0, /* 0xa0 - 0xa7 */ 0, 0, "[tm]", 0, 0, "!=", 0, 0, /* 0xa8 - 0xaf */ "[inf]", 0, "<=", ">=", 0, 0, "[partial]", "[Sum]", /* 0xb0 - 0xb7 */ "[Prod]", "[pi]", "[Integral]", 0, 0, "[ohm]", 0, 0, /* 0xb8 - 0xbf */ 0, 0, 0, "[Sqrt]", "[f]", "~=", "[delta]", 0, /* 0xc0 - 0xc7 */ 0, "...", 0, 0, 0, 0, "OE", "oe", /* 0xc8 - 0xcf */ "-", "--", "``", "''", "`", "'", 0, "#", /* 0xd0 - 0xd7 */ 0, "Y", "/", 0, "<", ">", "fi", "fl", /* 0xd8 - 0xdf */ "++", 0, ",", ",,", "o/oo", 0, 0, 0, /* 0xe0 - 0xe7 */ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe8 - 0xef */ "[Apple]", 0, 0, 0, 0, "i", "^", "~", /* 0xf0 - 0xf7 */ 0, "-", "\267", "\260", 0, "\"", "-", "^" /* 0xf8 - 0xff */ }; static unsigned char latin1[256]; /* iso charatcers not found in mac roman charset */ static const char *latin1_subst[128] = { "", "", "", "", "", "", "", "", /* 0x80 - 0x87 */ "", "", "", "", "", "", "", "", /* 0x88 - 0x8f */ "", "", "", "", "", "", "", "", /* 0x90 - 0x97 */ "", "", "", "", "", "", "", "", /* 0x98 - 0x9f */ 0, 0, 0, 0, 0, 0, "|", 0, /* 0xa0 - 0xa7 */ 0, 0, 0, 0, 0, "-", 0, 0, /* 0xa8 - 0xaf */ 0, 0, "[^2]", "[^3]", 0, 0, 0, 0, /* 0xb0 - 0xb7 */ 0, "[^1]", 0, 0, "[1/4]", "[1/2]", "[3/4]", 0, /* 0xb8 - 0xbf */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0 - 0xcf */ "D", 0, 0, 0, 0, 0, 0, "x", /* 0xd0 - 0xd7 */ 0, 0, 0, 0, 0, "Y", "P", 0, /* 0xd8 - 0xdf */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0 - 0xef */ "d", 0, 0, 0, 0, 0, 0, 0, /* 0xf0 - 0xf7 */ 0, 0, 0, 0, 0, "y", "p", 0 /* 0xf8 - 0xff */ }; /* * NAME: charset->unicode() * DESCRIPTION: return a Unicode string for MacOS Standard Roman */ UCS2 *cs_unicode(char *mstr, int *lenptr) { int len, i; UCS2 *unicode, *ptr; len = lenptr ? *lenptr : strlen(mstr); ptr = unicode = malloc((len + 1) * sizeof(UCS2)); if (!unicode) return 0; for (i = 0; i < len; ++i) *ptr++ = macroman[*(unsigned char *) mstr++]; *ptr = 0; return unicode; } /* * NAME: charset->latin1() * DESCRIPTION: return a Latin-1 (ISO 8859-1) string for MacOS Standard Roman */ char *cs_latin1(char *mstr, int *lenptr) { int ilen, olen, i; char *latin1, *ptr; const char *subst; unsigned char ch; UCS2 unicode; ilen = lenptr ? *lenptr : strlen(mstr); olen = 0; // calculate outputlen for (i = 0; i < ilen; ++i) { ch = *((unsigned char *) mstr + i); unicode = macroman[ch]; if (unicode & 0xff00) olen += strlen(macroman_subst[ch & 0x7f]); else ++olen; } ptr = latin1 = malloc(olen + 1); if (!latin1) return NULL; for (i = 0; i < ilen; ++i) { ch = *(unsigned char *) mstr++; unicode = macroman[ch]; if (unicode & 0xff00) { /* substitute similar Latin-1 character(s) */ subst = macroman_subst[ch & 0x7f]; strcpy(ptr, subst); ptr += strlen(subst); } else *ptr++ = unicode; } *ptr = 0; if (lenptr) *lenptr = olen; return latin1; } /* * NAME: charset->mktable() * DESCRIPTION: construct latin1[] table from macroman[] by inversion. */ static void mktable(void) { int i; for (i = 0x00; i <= 0xff; ++i) latin1[i] = 0xff; for (i = 0x00; i <= 0xff; ++i) { UCS2 unicode = macroman[i]; if (! (unicode & 0xff00)) latin1[unicode] = i; } } /* * NAME: charset->macroman() * DESCRIPTION: return a MacOS Standard Roman string for Latin-1 (ISO 8859-1) */ char *cs_macroman(char *lstr, int *lenptr) { int ilen, olen, i; char *macroman, *ptr; const char *subst; unsigned char ch, msr; if (latin1[0x80] != 0xff) mktable(); ilen = lenptr ? *lenptr : strlen(lstr); olen = 0; // Calculate outputlen for (i = 0; i < ilen; ++i) { ch = *((unsigned char *) lstr + i); msr = latin1[ch]; if (msr == 0xff) olen += strlen(latin1_subst[ch & 0x7f]); else ++olen; } macroman = malloc(olen + 1); if (macroman == 0) return 0; ptr = macroman; for (i = 0; i < ilen; ++i) { ch = *(unsigned char *) lstr++; msr = latin1[ch]; if (msr == 0xff) { /* substitute similar MacOS Standard Roman character(s) */ subst = latin1_subst[ch & 0x7f]; strcpy(ptr, subst); ptr += strlen(subst); } else *ptr++ = msr; } *ptr = 0; if (lenptr) *lenptr = olen; return macroman; } hfsplus-1.0.4/src/charset.h0100644000000000000000000000352707441220605014277 0ustar rootroot/* * hfsputils - tools for reading and writing Macintosh HFS+ volumes * * characterset conversions for filecopying. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: charset.h,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ /* a two byte unicode character, gnus wchar_t is 4 bytes in linux */ typedef unsigned short UCS2; /* return a unicode String for MacOS Standard Roman. * lenptr may be null in wich case the given strs len is used. * must be free()d */ UCS2 *cs_unicode(char *str, int *lenptr); /* return a Latin-1 (ISO 8859-1) string for MacOS Standard Roman. * lenptr may be null in wich case the given strs len is used. * on return *lenptr is set to the returned strings len. * must be free()d */ char *cs_latin1(char *, int *); /* return a MacOS Standard Roman string for Latin-1 (ISO 8859-1). * lenptr may be null in wich case the given strs len is used. * on return *lenptr is set to the returned strings len. * must be free()d */ char *cs_macroman(char *, int *); hfsplus-1.0.4/src/check10100644000000000000000000042347307441220605013564 0ustar rootroot*** Checking Volume Header: Volume is wrapped in HFS volume (use hfsck to check this) Embedded HFS+ volume at 0x55 (0xFFA8) of 0x200 sized Blocks signature : H+ version : 4 attributes : 0X100 last_mount_vers : H+LX reserved : 0 create_date : Tue Dec 5 16:36:39 2000 modify_date : Thu Jan 1 01:00:00 1970 backup_date : Fri Jan 1 01:00:00 1904 checked_date : Sun Jun 10 20:15:44 2001 file_count : 4 folder_count : 93 blocksize : 200 total_blocks : 65448 free_blocks : 64257 next_alloc : 1701 rsrc_clump_sz : 8192 data_clump_sz : 8192 next_cnid : 125 write_count : 402 encodings_bmp : 0X1 Allocation file total_size : 0X2000 clump_size : 0X2000 total_blocks : 0X10 extents : (0X3+0X10) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) Extension file total_size : 0X40000 clump_size : 0X40000 total_blocks : 0X200 extents : (0X13+0X200) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) Catalog file total_size : 0X40000 clump_size : 0X40000 total_blocks : 0X200 extents : (0X213+0X200) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) Attribute file total_size : 0 clump_size : 0 total_blocks : 0 extents : (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) Start file total_size : 0 clump_size : 0 total_blocks : 0 extents : (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) Volume was last Mounted by hfsplusutils: H+LX Done *** *** Checking Backup Volume Header: signature : H+ version : 4 attributes : 0X100 last_mount_vers : H+LX reserved : 0 create_date : Tue Dec 5 16:36:39 2000 modify_date : Thu Jan 1 01:00:00 1970 backup_date : Fri Jan 1 01:00:00 1904 checked_date : Sun Jun 10 20:15:44 2001 file_count : 4 folder_count : 93 blocksize : 200 total_blocks : 65448 free_blocks : 64257 next_alloc : 1701 rsrc_clump_sz : 8192 data_clump_sz : 8192 next_cnid : 125 write_count : 402 encodings_bmp : 0X1 Allocation file total_size : 0X2000 clump_size : 0X2000 total_blocks : 0X10 extents : (0X3+0X10) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) Extension file total_size : 0X40000 clump_size : 0X40000 total_blocks : 0X200 extents : (0X13+0X200) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) Catalog file total_size : 0X40000 clump_size : 0X40000 total_blocks : 0X200 extents : (0X213+0X200) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) Attribute file total_size : 0 clump_size : 0 total_blocks : 0 extents : (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) Start file total_size : 0 clump_size : 0 total_blocks : 0 extents : (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) Volume was last Mounted by hfsplusutils: H+LX Done *** *** Checking Extents Btree: depth : 0 root : 0 leaf_count : 0 leaf_head : 0 leaf_tail : 0 node_size : 0X400 max_key_len : 0XA node_count : 0X100 free_nodes : 0XFF reserved1 : 0 clump_size : 0X40000 btree_type : 0 reserved2 : 0 !HFSPLUS_BAD_CLOSE HFSPLUS_TREE_BIGKEYS !HFSPLUS_TREE_VAR_NDXKEY_SIZE Node descriptor for Node 0 next : 0 prev : 0 height : 0 num_rec : 0 reserved : 0 height : 0 HFSP_NODE_NDX Done *** *** Checking Catalog Btree: depth : 0X2 root : 0X3 leaf_count : 0XC4 leaf_head : 0X7 leaf_tail : 0X1 node_size : 0X1000 max_key_len : 0X204 node_count : 0X40 free_nodes : 0X38 reserved1 : 0 clump_size : 0X40000 btree_type : 0 reserved2 : 0 !HFSPLUS_BAD_CLOSE HFSPLUS_TREE_BIGKEYS HFSPLUS_TREE_VAR_NDXKEY_SIZE Node descriptor for Node 3 next : 0 prev : 0 height : 0X2 num_rec : 6 reserved : 0 height : 0X2 HFSP_NODE_NDX Node 3, Record 0 is at pos 000E,Backptr is at offset 0FFE Node descriptor for Node 7 next : 0X2 prev : 0 height : 0X1 num_rec : 15 reserved : 0 height : 0X1 HFSP_NODE_LEAF Node 7, Record 0 is at pos 000E,Backptr is at offset 0FFE Node 7, Record 1 is at pos 0082,Backptr is at offset 0FFC Node 7, Record 2 is at pos 00A8,Backptr is at offset 0FFA Node 7, Record 3 is at pos 010A,Backptr is at offset 0FF8 Node 7, Record 4 is at pos 016C,Backptr is at offset 0FF6 Node 7, Record 5 is at pos 01CE,Backptr is at offset 0FF4 Node 7, Record 6 is at pos 0230,Backptr is at offset 0FF2 Node 7, Record 7 is at pos 0292,Backptr is at offset 0FF0 Node 7, Record 8 is at pos 02F4,Backptr is at offset 0FEE Node 7, Record 9 is at pos 0356,Backptr is at offset 0FEC Node 7, Record 10 is at pos 03B8,Backptr is at offset 0FEA Node 7, Record 11 is at pos 041A,Backptr is at offset 0FE8 Node 7, Record 12 is at pos 0482,Backptr is at offset 0FE6 Node 7, Record 13 is at pos 0596,Backptr is at offset 0FE4 Node 7, Record 14 is at pos 06AA,Backptr is at offset 0FE2 Node 3, Record 1 is at pos 002E,Backptr is at offset 0FFC Node descriptor for Node 2 next : 0X6 prev : 0X7 height : 0X1 num_rec : 20 reserved : 0 height : 0X1 HFSP_NODE_LEAF Node 2, Record 0 is at pos 000E,Backptr is at offset 0FFE Node 2, Record 1 is at pos 004E,Backptr is at offset 0FFC Node 2, Record 2 is at pos 0172,Backptr is at offset 0FFA Node 2, Record 3 is at pos 0294,Backptr is at offset 0FF8 Node 2, Record 4 is at pos 02BA,Backptr is at offset 0FF6 Node 2, Record 5 is at pos 02E0,Backptr is at offset 0FF4 Node 2, Record 6 is at pos 0316,Backptr is at offset 0FF2 Node 2, Record 7 is at pos 034A,Backptr is at offset 0FF0 Node 2, Record 8 is at pos 035E,Backptr is at offset 0FEE Node 2, Record 9 is at pos 03C0,Backptr is at offset 0FEC Node 2, Record 10 is at pos 0422,Backptr is at offset 0FEA Node 2, Record 11 is at pos 0484,Backptr is at offset 0FE8 Node 2, Record 12 is at pos 04E6,Backptr is at offset 0FE6 Node 2, Record 13 is at pos 0548,Backptr is at offset 0FE4 Node 2, Record 14 is at pos 05AA,Backptr is at offset 0FE2 Node 2, Record 15 is at pos 060C,Backptr is at offset 0FE0 Node 2, Record 16 is at pos 066E,Backptr is at offset 0FDE Node 2, Record 17 is at pos 06D0,Backptr is at offset 0FDC Node 2, Record 18 is at pos 06E4,Backptr is at offset 0FDA Node 2, Record 19 is at pos 0746,Backptr is at offset 0FD8 Node 3, Record 2 is at pos 003A,Backptr is at offset 0FFA Node descriptor for Node 6 next : 0X4 prev : 0X2 height : 0X1 num_rec : 18 reserved : 0 height : 0X1 HFSP_NODE_LEAF Node 6, Record 0 is at pos 000E,Backptr is at offset 0FFE Node 6, Record 1 is at pos 0070,Backptr is at offset 0FFC Node 6, Record 2 is at pos 00D2,Backptr is at offset 0FFA Node 6, Record 3 is at pos 0134,Backptr is at offset 0FF8 Node 6, Record 4 is at pos 0196,Backptr is at offset 0FF6 Node 6, Record 5 is at pos 01F8,Backptr is at offset 0FF4 Node 6, Record 6 is at pos 025A,Backptr is at offset 0FF2 Node 6, Record 7 is at pos 02BC,Backptr is at offset 0FF0 Node 6, Record 8 is at pos 02D0,Backptr is at offset 0FEE Node 6, Record 9 is at pos 0332,Backptr is at offset 0FEC Node 6, Record 10 is at pos 0394,Backptr is at offset 0FEA Node 6, Record 11 is at pos 03F6,Backptr is at offset 0FE8 Node 6, Record 12 is at pos 0458,Backptr is at offset 0FE6 Node 6, Record 13 is at pos 04BA,Backptr is at offset 0FE4 Node 6, Record 14 is at pos 051C,Backptr is at offset 0FE2 Node 6, Record 15 is at pos 057E,Backptr is at offset 0FE0 Node 6, Record 16 is at pos 05E0,Backptr is at offset 0FDE Node 6, Record 17 is at pos 0642,Backptr is at offset 0FDC Node 3, Record 3 is at pos 0048,Backptr is at offset 0FF8 Node descriptor for Node 4 next : 0X5 prev : 0X6 height : 0X1 num_rec : 25 reserved : 0 height : 0X1 HFSP_NODE_LEAF Node 4, Record 0 is at pos 000E,Backptr is at offset 0FFE Node 4, Record 1 is at pos 007C,Backptr is at offset 0FFC Node 4, Record 2 is at pos 00EA,Backptr is at offset 0FFA Node 4, Record 3 is at pos 0158,Backptr is at offset 0FF8 Node 4, Record 4 is at pos 01C6,Backptr is at offset 0FF6 Node 4, Record 5 is at pos 0234,Backptr is at offset 0FF4 Node 4, Record 6 is at pos 02A2,Backptr is at offset 0FF2 Node 4, Record 7 is at pos 0310,Backptr is at offset 0FF0 Node 4, Record 8 is at pos 037E,Backptr is at offset 0FEE Node 4, Record 9 is at pos 03EC,Backptr is at offset 0FEC Node 4, Record 10 is at pos 0400,Backptr is at offset 0FEA Node 4, Record 11 is at pos 0462,Backptr is at offset 0FE8 Node 4, Record 12 is at pos 04C4,Backptr is at offset 0FE6 Node 4, Record 13 is at pos 0526,Backptr is at offset 0FE4 Node 4, Record 14 is at pos 0588,Backptr is at offset 0FE2 Node 4, Record 15 is at pos 05EA,Backptr is at offset 0FE0 Node 4, Record 16 is at pos 064C,Backptr is at offset 0FDE Node 4, Record 17 is at pos 06AE,Backptr is at offset 0FDC Node 4, Record 18 is at pos 0710,Backptr is at offset 0FDA Node 4, Record 19 is at pos 0772,Backptr is at offset 0FD8 Node 4, Record 20 is at pos 0786,Backptr is at offset 0FD6 Node 4, Record 21 is at pos 07E8,Backptr is at offset 0FD4 Node 4, Record 22 is at pos 084A,Backptr is at offset 0FD2 Node 4, Record 23 is at pos 08AC,Backptr is at offset 0FD0 Node 4, Record 24 is at pos 090E,Backptr is at offset 0FCE Node 3, Record 4 is at pos 0062,Backptr is at offset 0FF6 Node descriptor for Node 5 next : 0X1 prev : 0X4 height : 0X1 num_rec : 23 reserved : 0 height : 0X1 HFSP_NODE_LEAF Node 5, Record 0 is at pos 000E,Backptr is at offset 0FFE Node 5, Record 1 is at pos 0070,Backptr is at offset 0FFC Node 5, Record 2 is at pos 00D2,Backptr is at offset 0FFA Node 5, Record 3 is at pos 0134,Backptr is at offset 0FF8 Node 5, Record 4 is at pos 0196,Backptr is at offset 0FF6 Node 5, Record 5 is at pos 01AA,Backptr is at offset 0FF4 Node 5, Record 6 is at pos 020C,Backptr is at offset 0FF2 Node 5, Record 7 is at pos 026E,Backptr is at offset 0FF0 Node 5, Record 8 is at pos 02D0,Backptr is at offset 0FEE Node 5, Record 9 is at pos 0332,Backptr is at offset 0FEC Node 5, Record 10 is at pos 0394,Backptr is at offset 0FEA Node 5, Record 11 is at pos 03F6,Backptr is at offset 0FE8 Node 5, Record 12 is at pos 0458,Backptr is at offset 0FE6 Node 5, Record 13 is at pos 04BA,Backptr is at offset 0FE4 Node 5, Record 14 is at pos 051C,Backptr is at offset 0FE2 Node 5, Record 15 is at pos 0530,Backptr is at offset 0FE0 Node 5, Record 16 is at pos 0592,Backptr is at offset 0FDE Node 5, Record 17 is at pos 05F4,Backptr is at offset 0FDC Node 5, Record 18 is at pos 0656,Backptr is at offset 0FDA Node 5, Record 19 is at pos 06B8,Backptr is at offset 0FD8 Node 5, Record 20 is at pos 071A,Backptr is at offset 0FD6 Node 5, Record 21 is at pos 077C,Backptr is at offset 0FD4 Node 5, Record 22 is at pos 07DE,Backptr is at offset 0FD2 Node 3, Record 5 is at pos 0070,Backptr is at offset 0FF4 Node descriptor for Node 1 next : 0 prev : 0X5 height : 0X1 num_rec : 95 reserved : 0 height : 0X1 HFSP_NODE_LEAF Node 1, Record 0 is at pos 000E,Backptr is at offset 0FFE Node 1, Record 1 is at pos 0070,Backptr is at offset 0FFC Node 1, Record 2 is at pos 0084,Backptr is at offset 0FFA Node 1, Record 3 is at pos 00E6,Backptr is at offset 0FF8 Node 1, Record 4 is at pos 0148,Backptr is at offset 0FF6 Node 1, Record 5 is at pos 01AA,Backptr is at offset 0FF4 Node 1, Record 6 is at pos 020C,Backptr is at offset 0FF2 Node 1, Record 7 is at pos 026E,Backptr is at offset 0FF0 Node 1, Record 8 is at pos 02D0,Backptr is at offset 0FEE Node 1, Record 9 is at pos 0332,Backptr is at offset 0FEC Node 1, Record 10 is at pos 0394,Backptr is at offset 0FEA Node 1, Record 11 is at pos 03FC,Backptr is at offset 0FE8 Node 1, Record 12 is at pos 0464,Backptr is at offset 0FE6 Node 1, Record 13 is at pos 0478,Backptr is at offset 0FE4 Node 1, Record 14 is at pos 048C,Backptr is at offset 0FE2 Node 1, Record 15 is at pos 04A0,Backptr is at offset 0FE0 Node 1, Record 16 is at pos 04B4,Backptr is at offset 0FDE Node 1, Record 17 is at pos 04C8,Backptr is at offset 0FDC Node 1, Record 18 is at pos 04DC,Backptr is at offset 0FDA Node 1, Record 19 is at pos 04F0,Backptr is at offset 0FD8 Node 1, Record 20 is at pos 0504,Backptr is at offset 0FD6 Node 1, Record 21 is at pos 0518,Backptr is at offset 0FD4 Node 1, Record 22 is at pos 052C,Backptr is at offset 0FD2 Node 1, Record 23 is at pos 0540,Backptr is at offset 0FD0 Node 1, Record 24 is at pos 0554,Backptr is at offset 0FCE Node 1, Record 25 is at pos 0568,Backptr is at offset 0FCC Node 1, Record 26 is at pos 057C,Backptr is at offset 0FCA Node 1, Record 27 is at pos 0590,Backptr is at offset 0FC8 Node 1, Record 28 is at pos 05A4,Backptr is at offset 0FC6 Node 1, Record 29 is at pos 05B8,Backptr is at offset 0FC4 Node 1, Record 30 is at pos 05CC,Backptr is at offset 0FC2 Node 1, Record 31 is at pos 05E0,Backptr is at offset 0FC0 Node 1, Record 32 is at pos 05F4,Backptr is at offset 0FBE Node 1, Record 33 is at pos 0608,Backptr is at offset 0FBC Node 1, Record 34 is at pos 061C,Backptr is at offset 0FBA Node 1, Record 35 is at pos 0630,Backptr is at offset 0FB8 Node 1, Record 36 is at pos 0644,Backptr is at offset 0FB6 Node 1, Record 37 is at pos 0658,Backptr is at offset 0FB4 Node 1, Record 38 is at pos 066C,Backptr is at offset 0FB2 Node 1, Record 39 is at pos 0680,Backptr is at offset 0FB0 Node 1, Record 40 is at pos 0694,Backptr is at offset 0FAE Node 1, Record 41 is at pos 06A8,Backptr is at offset 0FAC Node 1, Record 42 is at pos 06BC,Backptr is at offset 0FAA Node 1, Record 43 is at pos 06D0,Backptr is at offset 0FA8 Node 1, Record 44 is at pos 06E4,Backptr is at offset 0FA6 Node 1, Record 45 is at pos 06F8,Backptr is at offset 0FA4 Node 1, Record 46 is at pos 070C,Backptr is at offset 0FA2 Node 1, Record 47 is at pos 0720,Backptr is at offset 0FA0 Node 1, Record 48 is at pos 0734,Backptr is at offset 0F9E Node 1, Record 49 is at pos 0754,Backptr is at offset 0F9C Node 1, Record 50 is at pos 0774,Backptr is at offset 0F9A Node 1, Record 51 is at pos 0794,Backptr is at offset 0F98 Node 1, Record 52 is at pos 07B4,Backptr is at offset 0F96 Node 1, Record 53 is at pos 07D4,Backptr is at offset 0F94 Node 1, Record 54 is at pos 07F4,Backptr is at offset 0F92 Node 1, Record 55 is at pos 0814,Backptr is at offset 0F90 Node 1, Record 56 is at pos 0834,Backptr is at offset 0F8E Node 1, Record 57 is at pos 0854,Backptr is at offset 0F8C Node 1, Record 58 is at pos 0868,Backptr is at offset 0F8A Node 1, Record 59 is at pos 087C,Backptr is at offset 0F88 Node 1, Record 60 is at pos 0890,Backptr is at offset 0F86 Node 1, Record 61 is at pos 08A4,Backptr is at offset 0F84 Node 1, Record 62 is at pos 08B8,Backptr is at offset 0F82 Node 1, Record 63 is at pos 08CC,Backptr is at offset 0F80 Node 1, Record 64 is at pos 08E0,Backptr is at offset 0F7E Node 1, Record 65 is at pos 08F4,Backptr is at offset 0F7C Node 1, Record 66 is at pos 0908,Backptr is at offset 0F7A Node 1, Record 67 is at pos 091C,Backptr is at offset 0F78 Node 1, Record 68 is at pos 0930,Backptr is at offset 0F76 Node 1, Record 69 is at pos 0944,Backptr is at offset 0F74 Node 1, Record 70 is at pos 0958,Backptr is at offset 0F72 Node 1, Record 71 is at pos 096C,Backptr is at offset 0F70 Node 1, Record 72 is at pos 0980,Backptr is at offset 0F6E Node 1, Record 73 is at pos 0994,Backptr is at offset 0F6C Node 1, Record 74 is at pos 09A8,Backptr is at offset 0F6A Node 1, Record 75 is at pos 09BC,Backptr is at offset 0F68 Node 1, Record 76 is at pos 09D0,Backptr is at offset 0F66 Node 1, Record 77 is at pos 09E4,Backptr is at offset 0F64 Node 1, Record 78 is at pos 09F8,Backptr is at offset 0F62 Node 1, Record 79 is at pos 0A0C,Backptr is at offset 0F60 Node 1, Record 80 is at pos 0A20,Backptr is at offset 0F5E Node 1, Record 81 is at pos 0A34,Backptr is at offset 0F5C Node 1, Record 82 is at pos 0A48,Backptr is at offset 0F5A Node 1, Record 83 is at pos 0A5C,Backptr is at offset 0F58 Node 1, Record 84 is at pos 0A70,Backptr is at offset 0F56 Node 1, Record 85 is at pos 0A84,Backptr is at offset 0F54 Node 1, Record 86 is at pos 0A98,Backptr is at offset 0F52 Node 1, Record 87 is at pos 0AAC,Backptr is at offset 0F50 Node 1, Record 88 is at pos 0AC0,Backptr is at offset 0F4E Node 1, Record 89 is at pos 0AD4,Backptr is at offset 0F4C Node 1, Record 90 is at pos 0AE8,Backptr is at offset 0F4A Node 1, Record 91 is at pos 0AFC,Backptr is at offset 0F48 Node 1, Record 92 is at pos 0B10,Backptr is at offset 0F46 Node 1, Record 93 is at pos 0B2A,Backptr is at offset 0F44 Node 1, Record 94 is at pos 0B44,Backptr is at offset 0F42 Done *** *** Checking files and directories in catalog: Node 0, Record 0 is at pos 000E,Backptr is at offset 0FFE Node 7, Record 1 is at pos 0082,Backptr is at offset 0FFC *** Key index : 0 parent cnid : 1 name : Ohne Titel === Folder === flags : 0x0 valence : 0xD id : 2 create_date : Tue Dec 5 15:36:39 2000 content_mod_date : Sun Jun 10 18:17:15 2001 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=48, left=33, bottom=338, right=486 ] frFlags : 0X3E0 frLocation : [ v=156, h=736 ] frView : 0X107 frScroll : [ v=-4, h=-18 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 7, Record 1 is at pos 0082,Backptr is at offset 0FFC Node 7, Record 2 is at pos 00A8,Backptr is at offset 0FFA *** Key index : 1 parent cnid : 2 name : === Folder Thread === parent cnid : 1 name : Ohne Titel Node 7, Record 2 is at pos 00A8,Backptr is at offset 0FFA Node 7, Record 3 is at pos 010A,Backptr is at offset 0FF8 *** Key index : 2 parent cnid : 2 name : 1 === Folder === flags : 0x0 valence : 0x9 id : 23 create_date : Sat Dec 9 21:10:27 2000 content_mod_date : Sat Dec 9 21:11:51 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=78, left=30, bottom=296, right=434 ] frFlags : 0X3E0 frLocation : [ v=0, h=1 ] frView : 0X107 frScroll : [ v=-4, h=-15 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 2 text_encoding : 0x0 reserved : 0x0 Node 7, Record 3 is at pos 010A,Backptr is at offset 0FF8 Node 7, Record 4 is at pos 016C,Backptr is at offset 0FF6 *** Key index : 3 parent cnid : 2 name : 2 === Folder === flags : 0x0 valence : 0x9 id : 24 create_date : Sat Dec 9 21:10:29 2000 content_mod_date : Sat Dec 9 21:11:54 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=0, h=129 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 2 text_encoding : 0x0 reserved : 0x0 Node 7, Record 4 is at pos 016C,Backptr is at offset 0FF6 Node 7, Record 5 is at pos 01CE,Backptr is at offset 0FF4 *** Key index : 4 parent cnid : 2 name : 3 === Folder === flags : 0x0 valence : 0x9 id : 25 create_date : Sat Dec 9 21:10:30 2000 content_mod_date : Sat Dec 9 21:11:56 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=0, h=257 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 2 text_encoding : 0x0 reserved : 0x0 Node 7, Record 5 is at pos 01CE,Backptr is at offset 0FF4 Node 7, Record 6 is at pos 0230,Backptr is at offset 0FF2 *** Key index : 5 parent cnid : 2 name : 4 === Folder === flags : 0x0 valence : 0x9 id : 26 create_date : Sat Dec 9 21:10:31 2000 content_mod_date : Sun Dec 10 18:28:38 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=331, right=434 ] frFlags : 0X3E0 frLocation : [ v=64, h=129 ] frView : 0X107 frScroll : [ v=-4, h=-15 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 2 text_encoding : 0x0 reserved : 0x0 Node 7, Record 6 is at pos 0230,Backptr is at offset 0FF2 Node 7, Record 7 is at pos 0292,Backptr is at offset 0FF0 *** Key index : 6 parent cnid : 2 name : 5 === Folder === flags : 0x0 valence : 0x9 id : 27 create_date : Sat Dec 9 21:10:32 2000 content_mod_date : Sat Dec 9 21:12:04 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=64, h=1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 2 text_encoding : 0x0 reserved : 0x0 Node 7, Record 7 is at pos 0292,Backptr is at offset 0FF0 Node 7, Record 8 is at pos 02F4,Backptr is at offset 0FEE *** Key index : 7 parent cnid : 2 name : 6 === Folder === flags : 0x0 valence : 0x9 id : 28 create_date : Sat Dec 9 21:10:34 2000 content_mod_date : Sat Dec 9 21:12:09 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=64, h=257 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 2 text_encoding : 0x0 reserved : 0x0 Node 7, Record 8 is at pos 02F4,Backptr is at offset 0FEE Node 7, Record 9 is at pos 0356,Backptr is at offset 0FEC *** Key index : 8 parent cnid : 2 name : 7 === Folder === flags : 0x0 valence : 0x9 id : 29 create_date : Sat Dec 9 21:10:35 2000 content_mod_date : Sat Dec 9 21:12:12 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=128, h=1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 2 text_encoding : 0x0 reserved : 0x0 Node 7, Record 9 is at pos 0356,Backptr is at offset 0FEC Node 7, Record 10 is at pos 03B8,Backptr is at offset 0FEA *** Key index : 9 parent cnid : 2 name : 8 === Folder === flags : 0x0 valence : 0x9 id : 30 create_date : Sat Dec 9 21:10:37 2000 content_mod_date : Sat Dec 9 21:12:18 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=128, h=129 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 2 text_encoding : 0x0 reserved : 0x0 Node 7, Record 10 is at pos 03B8,Backptr is at offset 0FEA Node 7, Record 11 is at pos 041A,Backptr is at offset 0FE8 *** Key index : 10 parent cnid : 2 name : 9 === Folder === flags : 0x0 valence : 0xA id : 31 create_date : Sat Dec 9 21:10:38 2000 content_mod_date : Sun Jun 10 18:17:37 2001 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=83, left=122, bottom=394, right=596 ] frFlags : 0X3E0 frLocation : [ v=128, h=257 ] frView : 0X107 frScroll : [ v=-4, h=-15 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 2 text_encoding : 0x0 reserved : 0x0 Node 7, Record 11 is at pos 041A,Backptr is at offset 0FE8 Node 7, Record 12 is at pos 0482,Backptr is at offset 0FE6 *** Key index : 11 parent cnid : 2 name : 9aaa === Folder === flags : 0x0 valence : 0x0 id : 120 create_date : Sun Jun 10 17:49:15 2001 content_mod_date : Sun Jun 10 17:49:15 2001 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=64, left=49, bottom=354, right=502 ] frFlags : 0X3E0 frLocation : [ v=192, h=1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 2 text_encoding : 0x0 reserved : 0x0 Node 7, Record 12 is at pos 0482,Backptr is at offset 0FE6 Node 7, Record 13 is at pos 0596,Backptr is at offset 0FE4 *** Key index : 12 parent cnid : 2 name : Desktop DB === File === flags : 0x2 reserved1 : 0x0 id : 18 create_date : Tue Dec 5 15:36:40 2000 content_mod_date : Tue Dec 5 15:36:40 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 fdType : BTFL fdCreator : DMGR fdFlags : 0X4000 fdLocation : [ v=0, h=0 ] fdFldr : 0 fdIconID : 0 fdComment : 0 fdPutAway : 0 text_encoding : 0x0 reserved : 0x0 Datafork: total_size : 0X2000 clump_size : 0 total_blocks : 0X10 extents : (0X613+0X10) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) Rsrcfork: total_size : 0 clump_size : 0 total_blocks : 0 extents : (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) Node 7, Record 13 is at pos 0596,Backptr is at offset 0FE4 Node 7, Record 14 is at pos 06AA,Backptr is at offset 0FE2 *** Key index : 13 parent cnid : 2 name : Desktop DF === File === flags : 0x2 reserved1 : 0x0 id : 17 create_date : Tue Dec 5 15:36:40 2000 content_mod_date : Tue Dec 5 15:36:40 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 fdType : DTFL fdCreator : DMGR fdFlags : 0X4000 fdLocation : [ v=0, h=0 ] fdFldr : 0 fdIconID : 0 fdComment : 0 fdPutAway : 0 text_encoding : 0x0 reserved : 0x0 Datafork: total_size : 0X2 clump_size : 0 total_blocks : 0X80 extents : (0X623+0X80) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) Rsrcfork: total_size : 0 clump_size : 0 total_blocks : 0 extents : (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) Node 7, Record 14 is at pos 06AA,Backptr is at offset 0FE2 Node 7, Record 15 is at pos 0738,Backptr is at offset 0FE0 *** Key index : 14 parent cnid : 2 name : TheVolumeSettingsFolder === Folder === flags : 0x0 valence : 0x2 id : 16 create_date : Tue Dec 5 15:36:40 2000 content_mod_date : Fri Dec 8 20:42:42 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=0, left=0, bottom=0, right=0 ] frFlags : 0X5000 frLocation : [ v=0, h=0 ] frView : 0X0 frScroll : [ v=0, h=0 ] frOpenChain : 0 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 7, Record 0 is at pos 000E,Backptr is at offset 0FFE Node 2, Record 1 is at pos 004E,Backptr is at offset 0FFC *** Key index : 0 parent cnid : 16 name : === Folder Thread === parent cnid : 2 name : TheVolumeSettingsFolder Node 2, Record 1 is at pos 004E,Backptr is at offset 0FFC Node 2, Record 2 is at pos 0172,Backptr is at offset 0FFA *** Key index : 1 parent cnid : 16 name : DesktopPrinters DB === File === flags : 0x2 reserved1 : 0x0 id : 19 create_date : Tue Dec 5 15:36:40 2000 content_mod_date : Tue Dec 5 15:36:40 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 fdType : dtpl fdCreator : dcdc fdFlags : 0X4000 fdLocation : [ v=0, h=0 ] fdFldr : 0 fdIconID : 0 fdComment : 0 fdPutAway : 0 text_encoding : 0x0 reserved : 0x0 Datafork: total_size : 0 clump_size : 0 total_blocks : 0 extents : (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) Rsrcfork: total_size : 0X11E clump_size : 0 total_blocks : 0X1 extents : (0X6A3+0X1) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) Node 2, Record 2 is at pos 0172,Backptr is at offset 0FFA Node 2, Record 3 is at pos 0294,Backptr is at offset 0FF8 *** Key index : 2 parent cnid : 16 name : OpenFolderListDF === File === flags : 0x2 reserved1 : 0x0 id : 22 create_date : Fri Dec 8 20:42:42 2000 content_mod_date : Sat Dec 9 21:12:31 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 fdType : FOLD fdCreator : MACS fdFlags : 0X4000 fdLocation : [ v=0, h=0 ] fdFldr : 0 fdIconID : 0 fdComment : 0 fdPutAway : 0 text_encoding : 0x0 reserved : 0x0 Datafork: total_size : 0 clump_size : 0 total_blocks : 0 extents : (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) Rsrcfork: total_size : 0X11E clump_size : 0 total_blocks : 0X1 extents : (0X6A4+0X1) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) (0+0) Node 2, Record 3 is at pos 0294,Backptr is at offset 0FF8 Node 2, Record 4 is at pos 02BA,Backptr is at offset 0FF6 *** Key index : 3 parent cnid : 17 name : === File Thread == parent cnid : 2 name : Desktop DF Node 2, Record 4 is at pos 02BA,Backptr is at offset 0FF6 Node 2, Record 5 is at pos 02E0,Backptr is at offset 0FF4 *** Key index : 4 parent cnid : 18 name : === File Thread == parent cnid : 2 name : Desktop DB Node 2, Record 5 is at pos 02E0,Backptr is at offset 0FF4 Node 2, Record 6 is at pos 0316,Backptr is at offset 0FF2 *** Key index : 5 parent cnid : 19 name : === File Thread == parent cnid : 16 name : DesktopPrinters DB Node 2, Record 6 is at pos 0316,Backptr is at offset 0FF2 Node 2, Record 7 is at pos 034A,Backptr is at offset 0FF0 *** Key index : 6 parent cnid : 22 name : === File Thread == parent cnid : 16 name : OpenFolderListDF Node 2, Record 7 is at pos 034A,Backptr is at offset 0FF0 Node 2, Record 8 is at pos 035E,Backptr is at offset 0FEE *** Key index : 7 parent cnid : 23 name : === Folder Thread === parent cnid : 2 name : 1 Node 2, Record 8 is at pos 035E,Backptr is at offset 0FEE Node 2, Record 9 is at pos 03C0,Backptr is at offset 0FEC *** Key index : 8 parent cnid : 23 name : 1 === Folder === flags : 0x0 valence : 0x0 id : 32 create_date : Sat Dec 9 21:10:27 2000 content_mod_date : Sat Dec 9 21:10:27 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=78, left=30, bottom=296, right=434 ] frFlags : 0X3E0 frLocation : [ v=0, h=1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 2, Record 9 is at pos 03C0,Backptr is at offset 0FEC Node 2, Record 10 is at pos 0422,Backptr is at offset 0FEA *** Key index : 9 parent cnid : 23 name : 2 === Folder === flags : 0x0 valence : 0x0 id : 33 create_date : Sat Dec 9 21:10:29 2000 content_mod_date : Sat Dec 9 21:10:29 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=0, h=129 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 2, Record 10 is at pos 0422,Backptr is at offset 0FEA Node 2, Record 11 is at pos 0484,Backptr is at offset 0FE8 *** Key index : 10 parent cnid : 23 name : 3 === Folder === flags : 0x0 valence : 0x0 id : 34 create_date : Sat Dec 9 21:10:30 2000 content_mod_date : Sat Dec 9 21:10:30 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=0, h=257 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 2, Record 11 is at pos 0484,Backptr is at offset 0FE8 Node 2, Record 12 is at pos 04E6,Backptr is at offset 0FE6 *** Key index : 11 parent cnid : 23 name : 4 === Folder === flags : 0x0 valence : 0x0 id : 35 create_date : Sat Dec 9 21:10:31 2000 content_mod_date : Sat Dec 9 21:10:31 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=64, h=1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 2, Record 12 is at pos 04E6,Backptr is at offset 0FE6 Node 2, Record 13 is at pos 0548,Backptr is at offset 0FE4 *** Key index : 12 parent cnid : 23 name : 5 === Folder === flags : 0x0 valence : 0x0 id : 36 create_date : Sat Dec 9 21:10:32 2000 content_mod_date : Sat Dec 9 21:10:32 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=64, h=129 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 2, Record 13 is at pos 0548,Backptr is at offset 0FE4 Node 2, Record 14 is at pos 05AA,Backptr is at offset 0FE2 *** Key index : 13 parent cnid : 23 name : 6 === Folder === flags : 0x0 valence : 0x0 id : 37 create_date : Sat Dec 9 21:10:34 2000 content_mod_date : Sat Dec 9 21:10:34 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=64, h=257 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 2, Record 14 is at pos 05AA,Backptr is at offset 0FE2 Node 2, Record 15 is at pos 060C,Backptr is at offset 0FE0 *** Key index : 14 parent cnid : 23 name : 7 === Folder === flags : 0x0 valence : 0x0 id : 38 create_date : Sat Dec 9 21:10:35 2000 content_mod_date : Sat Dec 9 21:10:35 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=128, h=1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 2, Record 15 is at pos 060C,Backptr is at offset 0FE0 Node 2, Record 16 is at pos 066E,Backptr is at offset 0FDE *** Key index : 15 parent cnid : 23 name : 8 === Folder === flags : 0x0 valence : 0x0 id : 39 create_date : Sat Dec 9 21:10:37 2000 content_mod_date : Sat Dec 9 21:10:37 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=128, h=129 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 2, Record 16 is at pos 066E,Backptr is at offset 0FDE Node 2, Record 17 is at pos 06D0,Backptr is at offset 0FDC *** Key index : 16 parent cnid : 23 name : 9 === Folder === flags : 0x0 valence : 0x0 id : 40 create_date : Sat Dec 9 21:10:38 2000 content_mod_date : Sat Dec 9 21:10:38 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=128, h=257 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 2, Record 17 is at pos 06D0,Backptr is at offset 0FDC Node 2, Record 18 is at pos 06E4,Backptr is at offset 0FDA *** Key index : 17 parent cnid : 24 name : === Folder Thread === parent cnid : 2 name : 2 Node 2, Record 18 is at pos 06E4,Backptr is at offset 0FDA Node 2, Record 19 is at pos 0746,Backptr is at offset 0FD8 *** Key index : 18 parent cnid : 24 name : 1 === Folder === flags : 0x0 valence : 0x0 id : 41 create_date : Sat Dec 9 21:10:27 2000 content_mod_date : Sat Dec 9 21:10:27 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=78, left=30, bottom=296, right=434 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 2, Record 19 is at pos 0746,Backptr is at offset 0FD8 Node 2, Record 20 is at pos 07A8,Backptr is at offset 0FD6 *** Key index : 19 parent cnid : 24 name : 2 === Folder === flags : 0x0 valence : 0x0 id : 42 create_date : Sat Dec 9 21:10:29 2000 content_mod_date : Sat Dec 9 21:10:29 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 2, Record 0 is at pos 000E,Backptr is at offset 0FFE Node 6, Record 1 is at pos 0070,Backptr is at offset 0FFC *** Key index : 0 parent cnid : 24 name : 3 === Folder === flags : 0x0 valence : 0x0 id : 43 create_date : Sat Dec 9 21:10:30 2000 content_mod_date : Sat Dec 9 21:10:30 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 6, Record 1 is at pos 0070,Backptr is at offset 0FFC Node 6, Record 2 is at pos 00D2,Backptr is at offset 0FFA *** Key index : 1 parent cnid : 24 name : 4 === Folder === flags : 0x0 valence : 0x0 id : 44 create_date : Sat Dec 9 21:10:31 2000 content_mod_date : Sat Dec 9 21:10:31 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 6, Record 2 is at pos 00D2,Backptr is at offset 0FFA Node 6, Record 3 is at pos 0134,Backptr is at offset 0FF8 *** Key index : 2 parent cnid : 24 name : 5 === Folder === flags : 0x0 valence : 0x0 id : 45 create_date : Sat Dec 9 21:10:32 2000 content_mod_date : Sat Dec 9 21:10:32 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 6, Record 3 is at pos 0134,Backptr is at offset 0FF8 Node 6, Record 4 is at pos 0196,Backptr is at offset 0FF6 *** Key index : 3 parent cnid : 24 name : 6 === Folder === flags : 0x0 valence : 0x0 id : 46 create_date : Sat Dec 9 21:10:34 2000 content_mod_date : Sat Dec 9 21:10:34 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 6, Record 4 is at pos 0196,Backptr is at offset 0FF6 Node 6, Record 5 is at pos 01F8,Backptr is at offset 0FF4 *** Key index : 4 parent cnid : 24 name : 7 === Folder === flags : 0x0 valence : 0x0 id : 47 create_date : Sat Dec 9 21:10:35 2000 content_mod_date : Sat Dec 9 21:10:35 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 6, Record 5 is at pos 01F8,Backptr is at offset 0FF4 Node 6, Record 6 is at pos 025A,Backptr is at offset 0FF2 *** Key index : 5 parent cnid : 24 name : 8 === Folder === flags : 0x0 valence : 0x0 id : 48 create_date : Sat Dec 9 21:10:37 2000 content_mod_date : Sat Dec 9 21:10:37 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 6, Record 6 is at pos 025A,Backptr is at offset 0FF2 Node 6, Record 7 is at pos 02BC,Backptr is at offset 0FF0 *** Key index : 6 parent cnid : 24 name : 9 === Folder === flags : 0x0 valence : 0x0 id : 49 create_date : Sat Dec 9 21:10:38 2000 content_mod_date : Sat Dec 9 21:10:38 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 6, Record 7 is at pos 02BC,Backptr is at offset 0FF0 Node 6, Record 8 is at pos 02D0,Backptr is at offset 0FEE *** Key index : 7 parent cnid : 25 name : === Folder Thread === parent cnid : 2 name : 3 Node 6, Record 8 is at pos 02D0,Backptr is at offset 0FEE Node 6, Record 9 is at pos 0332,Backptr is at offset 0FEC *** Key index : 8 parent cnid : 25 name : 1 === Folder === flags : 0x0 valence : 0x0 id : 50 create_date : Sat Dec 9 21:10:27 2000 content_mod_date : Sat Dec 9 21:10:27 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=78, left=30, bottom=296, right=434 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 6, Record 9 is at pos 0332,Backptr is at offset 0FEC Node 6, Record 10 is at pos 0394,Backptr is at offset 0FEA *** Key index : 9 parent cnid : 25 name : 2 === Folder === flags : 0x0 valence : 0x0 id : 51 create_date : Sat Dec 9 21:10:29 2000 content_mod_date : Sat Dec 9 21:10:29 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 6, Record 10 is at pos 0394,Backptr is at offset 0FEA Node 6, Record 11 is at pos 03F6,Backptr is at offset 0FE8 *** Key index : 10 parent cnid : 25 name : 3 === Folder === flags : 0x0 valence : 0x0 id : 52 create_date : Sat Dec 9 21:10:30 2000 content_mod_date : Sat Dec 9 21:10:30 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 6, Record 11 is at pos 03F6,Backptr is at offset 0FE8 Node 6, Record 12 is at pos 0458,Backptr is at offset 0FE6 *** Key index : 11 parent cnid : 25 name : 4 === Folder === flags : 0x0 valence : 0x0 id : 53 create_date : Sat Dec 9 21:10:31 2000 content_mod_date : Sat Dec 9 21:10:31 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 6, Record 12 is at pos 0458,Backptr is at offset 0FE6 Node 6, Record 13 is at pos 04BA,Backptr is at offset 0FE4 *** Key index : 12 parent cnid : 25 name : 5 === Folder === flags : 0x0 valence : 0x0 id : 54 create_date : Sat Dec 9 21:10:32 2000 content_mod_date : Sat Dec 9 21:10:32 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 6, Record 13 is at pos 04BA,Backptr is at offset 0FE4 Node 6, Record 14 is at pos 051C,Backptr is at offset 0FE2 *** Key index : 13 parent cnid : 25 name : 6 === Folder === flags : 0x0 valence : 0x0 id : 55 create_date : Sat Dec 9 21:10:34 2000 content_mod_date : Sat Dec 9 21:10:34 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 6, Record 14 is at pos 051C,Backptr is at offset 0FE2 Node 6, Record 15 is at pos 057E,Backptr is at offset 0FE0 *** Key index : 14 parent cnid : 25 name : 7 === Folder === flags : 0x0 valence : 0x0 id : 56 create_date : Sat Dec 9 21:10:35 2000 content_mod_date : Sat Dec 9 21:10:35 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 6, Record 15 is at pos 057E,Backptr is at offset 0FE0 Node 6, Record 16 is at pos 05E0,Backptr is at offset 0FDE *** Key index : 15 parent cnid : 25 name : 8 === Folder === flags : 0x0 valence : 0x0 id : 57 create_date : Sat Dec 9 21:10:37 2000 content_mod_date : Sat Dec 9 21:10:37 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 6, Record 16 is at pos 05E0,Backptr is at offset 0FDE Node 6, Record 17 is at pos 0642,Backptr is at offset 0FDC *** Key index : 16 parent cnid : 25 name : 9 === Folder === flags : 0x0 valence : 0x0 id : 58 create_date : Sat Dec 9 21:10:38 2000 content_mod_date : Sat Dec 9 21:10:38 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 6, Record 17 is at pos 0642,Backptr is at offset 0FDC Node 6, Record 18 is at pos 0656,Backptr is at offset 0FDA *** Key index : 17 parent cnid : 26 name : === Folder Thread === parent cnid : 2 name : 4 Node 6, Record 0 is at pos 000E,Backptr is at offset 0FFE Node 4, Record 1 is at pos 007C,Backptr is at offset 0FFC *** Key index : 0 parent cnid : 26 name : aaa1aaa === Folder === flags : 0x0 valence : 0x0 id : 68 create_date : Sat Dec 9 21:10:27 2000 content_mod_date : Sat Dec 9 21:10:27 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=78, left=30, bottom=296, right=434 ] frFlags : 0X3E0 frLocation : [ v=0, h=1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 1 is at pos 007C,Backptr is at offset 0FFC Node 4, Record 2 is at pos 00EA,Backptr is at offset 0FFA *** Key index : 1 parent cnid : 26 name : aaa2aaa === Folder === flags : 0x0 valence : 0x0 id : 69 create_date : Sat Dec 9 21:10:29 2000 content_mod_date : Sat Dec 9 21:10:29 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=0, h=129 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 2 is at pos 00EA,Backptr is at offset 0FFA Node 4, Record 3 is at pos 0158,Backptr is at offset 0FF8 *** Key index : 2 parent cnid : 26 name : aaa3aaa === Folder === flags : 0x0 valence : 0x0 id : 70 create_date : Sat Dec 9 21:10:30 2000 content_mod_date : Sat Dec 9 21:10:30 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=0, h=257 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 3 is at pos 0158,Backptr is at offset 0FF8 Node 4, Record 4 is at pos 01C6,Backptr is at offset 0FF6 *** Key index : 3 parent cnid : 26 name : aaa4aaa === Folder === flags : 0x0 valence : 0x0 id : 71 create_date : Sat Dec 9 21:10:31 2000 content_mod_date : Sat Dec 9 21:10:31 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=64, h=1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 4 is at pos 01C6,Backptr is at offset 0FF6 Node 4, Record 5 is at pos 0234,Backptr is at offset 0FF4 *** Key index : 4 parent cnid : 26 name : aaa5aaa === Folder === flags : 0x0 valence : 0x0 id : 72 create_date : Sat Dec 9 21:10:32 2000 content_mod_date : Sat Dec 9 21:10:32 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=64, h=129 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 5 is at pos 0234,Backptr is at offset 0FF4 Node 4, Record 6 is at pos 02A2,Backptr is at offset 0FF2 *** Key index : 5 parent cnid : 26 name : aaa6aaa === Folder === flags : 0x0 valence : 0x0 id : 73 create_date : Sat Dec 9 21:10:34 2000 content_mod_date : Sat Dec 9 21:10:34 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=64, h=257 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 6 is at pos 02A2,Backptr is at offset 0FF2 Node 4, Record 7 is at pos 0310,Backptr is at offset 0FF0 *** Key index : 6 parent cnid : 26 name : aaa7aaa === Folder === flags : 0x0 valence : 0x0 id : 74 create_date : Sat Dec 9 21:10:35 2000 content_mod_date : Sat Dec 9 21:10:35 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=128, h=1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 7 is at pos 0310,Backptr is at offset 0FF0 Node 4, Record 8 is at pos 037E,Backptr is at offset 0FEE *** Key index : 7 parent cnid : 26 name : aaa8aaa === Folder === flags : 0x0 valence : 0x0 id : 75 create_date : Sat Dec 9 21:10:37 2000 content_mod_date : Sat Dec 9 21:10:37 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=128, h=129 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 8 is at pos 037E,Backptr is at offset 0FEE Node 4, Record 9 is at pos 03EC,Backptr is at offset 0FEC *** Key index : 8 parent cnid : 26 name : aaa9aaa === Folder === flags : 0x0 valence : 0x0 id : 76 create_date : Sat Dec 9 21:10:38 2000 content_mod_date : Sat Dec 9 21:10:38 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=128, h=257 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 9 is at pos 03EC,Backptr is at offset 0FEC Node 4, Record 10 is at pos 0400,Backptr is at offset 0FEA *** Key index : 9 parent cnid : 27 name : === Folder Thread === parent cnid : 2 name : 5 Node 4, Record 10 is at pos 0400,Backptr is at offset 0FEA Node 4, Record 11 is at pos 0462,Backptr is at offset 0FE8 *** Key index : 10 parent cnid : 27 name : 1 === Folder === flags : 0x0 valence : 0x0 id : 59 create_date : Sat Dec 9 21:10:27 2000 content_mod_date : Sat Dec 9 21:10:27 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=78, left=30, bottom=296, right=434 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 11 is at pos 0462,Backptr is at offset 0FE8 Node 4, Record 12 is at pos 04C4,Backptr is at offset 0FE6 *** Key index : 11 parent cnid : 27 name : 2 === Folder === flags : 0x0 valence : 0x0 id : 60 create_date : Sat Dec 9 21:10:29 2000 content_mod_date : Sat Dec 9 21:10:29 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 12 is at pos 04C4,Backptr is at offset 0FE6 Node 4, Record 13 is at pos 0526,Backptr is at offset 0FE4 *** Key index : 12 parent cnid : 27 name : 3 === Folder === flags : 0x0 valence : 0x0 id : 61 create_date : Sat Dec 9 21:10:30 2000 content_mod_date : Sat Dec 9 21:10:30 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 13 is at pos 0526,Backptr is at offset 0FE4 Node 4, Record 14 is at pos 0588,Backptr is at offset 0FE2 *** Key index : 13 parent cnid : 27 name : 4 === Folder === flags : 0x0 valence : 0x0 id : 62 create_date : Sat Dec 9 21:10:31 2000 content_mod_date : Sat Dec 9 21:10:31 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 14 is at pos 0588,Backptr is at offset 0FE2 Node 4, Record 15 is at pos 05EA,Backptr is at offset 0FE0 *** Key index : 14 parent cnid : 27 name : 5 === Folder === flags : 0x0 valence : 0x0 id : 63 create_date : Sat Dec 9 21:10:32 2000 content_mod_date : Sat Dec 9 21:10:32 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 15 is at pos 05EA,Backptr is at offset 0FE0 Node 4, Record 16 is at pos 064C,Backptr is at offset 0FDE *** Key index : 15 parent cnid : 27 name : 6 === Folder === flags : 0x0 valence : 0x0 id : 64 create_date : Sat Dec 9 21:10:34 2000 content_mod_date : Sat Dec 9 21:10:34 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 16 is at pos 064C,Backptr is at offset 0FDE Node 4, Record 17 is at pos 06AE,Backptr is at offset 0FDC *** Key index : 16 parent cnid : 27 name : 7 === Folder === flags : 0x0 valence : 0x0 id : 65 create_date : Sat Dec 9 21:10:35 2000 content_mod_date : Sat Dec 9 21:10:35 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 17 is at pos 06AE,Backptr is at offset 0FDC Node 4, Record 18 is at pos 0710,Backptr is at offset 0FDA *** Key index : 17 parent cnid : 27 name : 8 === Folder === flags : 0x0 valence : 0x0 id : 66 create_date : Sat Dec 9 21:10:37 2000 content_mod_date : Sat Dec 9 21:10:37 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 18 is at pos 0710,Backptr is at offset 0FDA Node 4, Record 19 is at pos 0772,Backptr is at offset 0FD8 *** Key index : 18 parent cnid : 27 name : 9 === Folder === flags : 0x0 valence : 0x0 id : 67 create_date : Sat Dec 9 21:10:38 2000 content_mod_date : Sat Dec 9 21:10:38 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 19 is at pos 0772,Backptr is at offset 0FD8 Node 4, Record 20 is at pos 0786,Backptr is at offset 0FD6 *** Key index : 19 parent cnid : 28 name : === Folder Thread === parent cnid : 2 name : 6 Node 4, Record 20 is at pos 0786,Backptr is at offset 0FD6 Node 4, Record 21 is at pos 07E8,Backptr is at offset 0FD4 *** Key index : 20 parent cnid : 28 name : 1 === Folder === flags : 0x0 valence : 0x0 id : 77 create_date : Sat Dec 9 21:10:27 2000 content_mod_date : Sat Dec 9 21:10:27 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=78, left=30, bottom=296, right=434 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 21 is at pos 07E8,Backptr is at offset 0FD4 Node 4, Record 22 is at pos 084A,Backptr is at offset 0FD2 *** Key index : 21 parent cnid : 28 name : 2 === Folder === flags : 0x0 valence : 0x0 id : 78 create_date : Sat Dec 9 21:10:29 2000 content_mod_date : Sat Dec 9 21:10:29 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 22 is at pos 084A,Backptr is at offset 0FD2 Node 4, Record 23 is at pos 08AC,Backptr is at offset 0FD0 *** Key index : 22 parent cnid : 28 name : 3 === Folder === flags : 0x0 valence : 0x0 id : 79 create_date : Sat Dec 9 21:10:30 2000 content_mod_date : Sat Dec 9 21:10:30 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 23 is at pos 08AC,Backptr is at offset 0FD0 Node 4, Record 24 is at pos 090E,Backptr is at offset 0FCE *** Key index : 23 parent cnid : 28 name : 4 === Folder === flags : 0x0 valence : 0x0 id : 80 create_date : Sat Dec 9 21:10:31 2000 content_mod_date : Sat Dec 9 21:10:31 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 24 is at pos 090E,Backptr is at offset 0FCE Node 4, Record 25 is at pos 0970,Backptr is at offset 0FCC *** Key index : 24 parent cnid : 28 name : 5 === Folder === flags : 0x0 valence : 0x0 id : 81 create_date : Sat Dec 9 21:10:32 2000 content_mod_date : Sat Dec 9 21:10:32 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 4, Record 0 is at pos 000E,Backptr is at offset 0FFE Node 5, Record 1 is at pos 0070,Backptr is at offset 0FFC *** Key index : 0 parent cnid : 28 name : 6 === Folder === flags : 0x0 valence : 0x0 id : 82 create_date : Sat Dec 9 21:10:34 2000 content_mod_date : Sat Dec 9 21:10:34 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 5, Record 1 is at pos 0070,Backptr is at offset 0FFC Node 5, Record 2 is at pos 00D2,Backptr is at offset 0FFA *** Key index : 1 parent cnid : 28 name : 7 === Folder === flags : 0x0 valence : 0x0 id : 83 create_date : Sat Dec 9 21:10:35 2000 content_mod_date : Sat Dec 9 21:10:35 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 5, Record 2 is at pos 00D2,Backptr is at offset 0FFA Node 5, Record 3 is at pos 0134,Backptr is at offset 0FF8 *** Key index : 2 parent cnid : 28 name : 8 === Folder === flags : 0x0 valence : 0x0 id : 84 create_date : Sat Dec 9 21:10:37 2000 content_mod_date : Sat Dec 9 21:10:37 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 5, Record 3 is at pos 0134,Backptr is at offset 0FF8 Node 5, Record 4 is at pos 0196,Backptr is at offset 0FF6 *** Key index : 3 parent cnid : 28 name : 9 === Folder === flags : 0x0 valence : 0x0 id : 85 create_date : Sat Dec 9 21:10:38 2000 content_mod_date : Sat Dec 9 21:10:38 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 5, Record 4 is at pos 0196,Backptr is at offset 0FF6 Node 5, Record 5 is at pos 01AA,Backptr is at offset 0FF4 *** Key index : 4 parent cnid : 29 name : === Folder Thread === parent cnid : 2 name : 7 Node 5, Record 5 is at pos 01AA,Backptr is at offset 0FF4 Node 5, Record 6 is at pos 020C,Backptr is at offset 0FF2 *** Key index : 5 parent cnid : 29 name : 1 === Folder === flags : 0x0 valence : 0x0 id : 86 create_date : Sat Dec 9 21:10:27 2000 content_mod_date : Sat Dec 9 21:10:27 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=78, left=30, bottom=296, right=434 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 5, Record 6 is at pos 020C,Backptr is at offset 0FF2 Node 5, Record 7 is at pos 026E,Backptr is at offset 0FF0 *** Key index : 6 parent cnid : 29 name : 2 === Folder === flags : 0x0 valence : 0x0 id : 87 create_date : Sat Dec 9 21:10:29 2000 content_mod_date : Sat Dec 9 21:10:29 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 5, Record 7 is at pos 026E,Backptr is at offset 0FF0 Node 5, Record 8 is at pos 02D0,Backptr is at offset 0FEE *** Key index : 7 parent cnid : 29 name : 3 === Folder === flags : 0x0 valence : 0x0 id : 88 create_date : Sat Dec 9 21:10:30 2000 content_mod_date : Sat Dec 9 21:10:30 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 5, Record 8 is at pos 02D0,Backptr is at offset 0FEE Node 5, Record 9 is at pos 0332,Backptr is at offset 0FEC *** Key index : 8 parent cnid : 29 name : 4 === Folder === flags : 0x0 valence : 0x0 id : 89 create_date : Sat Dec 9 21:10:31 2000 content_mod_date : Sat Dec 9 21:10:31 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 5, Record 9 is at pos 0332,Backptr is at offset 0FEC Node 5, Record 10 is at pos 0394,Backptr is at offset 0FEA *** Key index : 9 parent cnid : 29 name : 5 === Folder === flags : 0x0 valence : 0x0 id : 90 create_date : Sat Dec 9 21:10:32 2000 content_mod_date : Sat Dec 9 21:10:32 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 5, Record 10 is at pos 0394,Backptr is at offset 0FEA Node 5, Record 11 is at pos 03F6,Backptr is at offset 0FE8 *** Key index : 10 parent cnid : 29 name : 6 === Folder === flags : 0x0 valence : 0x0 id : 91 create_date : Sat Dec 9 21:10:34 2000 content_mod_date : Sat Dec 9 21:10:34 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 5, Record 11 is at pos 03F6,Backptr is at offset 0FE8 Node 5, Record 12 is at pos 0458,Backptr is at offset 0FE6 *** Key index : 11 parent cnid : 29 name : 7 === Folder === flags : 0x0 valence : 0x0 id : 92 create_date : Sat Dec 9 21:10:35 2000 content_mod_date : Sat Dec 9 21:10:35 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 5, Record 12 is at pos 0458,Backptr is at offset 0FE6 Node 5, Record 13 is at pos 04BA,Backptr is at offset 0FE4 *** Key index : 12 parent cnid : 29 name : 8 === Folder === flags : 0x0 valence : 0x0 id : 93 create_date : Sat Dec 9 21:10:37 2000 content_mod_date : Sat Dec 9 21:10:37 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 5, Record 13 is at pos 04BA,Backptr is at offset 0FE4 Node 5, Record 14 is at pos 051C,Backptr is at offset 0FE2 *** Key index : 13 parent cnid : 29 name : 9 === Folder === flags : 0x0 valence : 0x0 id : 94 create_date : Sat Dec 9 21:10:38 2000 content_mod_date : Sat Dec 9 21:10:38 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 5, Record 14 is at pos 051C,Backptr is at offset 0FE2 Node 5, Record 15 is at pos 0530,Backptr is at offset 0FE0 *** Key index : 14 parent cnid : 30 name : === Folder Thread === parent cnid : 2 name : 8 Node 5, Record 15 is at pos 0530,Backptr is at offset 0FE0 Node 5, Record 16 is at pos 0592,Backptr is at offset 0FDE *** Key index : 15 parent cnid : 30 name : 1 === Folder === flags : 0x0 valence : 0x0 id : 95 create_date : Sat Dec 9 21:10:27 2000 content_mod_date : Sat Dec 9 21:10:27 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=78, left=30, bottom=296, right=434 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 5, Record 16 is at pos 0592,Backptr is at offset 0FDE Node 5, Record 17 is at pos 05F4,Backptr is at offset 0FDC *** Key index : 16 parent cnid : 30 name : 2 === Folder === flags : 0x0 valence : 0x0 id : 96 create_date : Sat Dec 9 21:10:29 2000 content_mod_date : Sat Dec 9 21:10:29 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 5, Record 17 is at pos 05F4,Backptr is at offset 0FDC Node 5, Record 18 is at pos 0656,Backptr is at offset 0FDA *** Key index : 17 parent cnid : 30 name : 3 === Folder === flags : 0x0 valence : 0x0 id : 97 create_date : Sat Dec 9 21:10:30 2000 content_mod_date : Sat Dec 9 21:10:30 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 5, Record 18 is at pos 0656,Backptr is at offset 0FDA Node 5, Record 19 is at pos 06B8,Backptr is at offset 0FD8 *** Key index : 18 parent cnid : 30 name : 4 === Folder === flags : 0x0 valence : 0x0 id : 98 create_date : Sat Dec 9 21:10:31 2000 content_mod_date : Sat Dec 9 21:10:31 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 5, Record 19 is at pos 06B8,Backptr is at offset 0FD8 Node 5, Record 20 is at pos 071A,Backptr is at offset 0FD6 *** Key index : 19 parent cnid : 30 name : 5 === Folder === flags : 0x0 valence : 0x0 id : 99 create_date : Sat Dec 9 21:10:32 2000 content_mod_date : Sat Dec 9 21:10:32 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 5, Record 20 is at pos 071A,Backptr is at offset 0FD6 Node 5, Record 21 is at pos 077C,Backptr is at offset 0FD4 *** Key index : 20 parent cnid : 30 name : 6 === Folder === flags : 0x0 valence : 0x0 id : 100 create_date : Sat Dec 9 21:10:34 2000 content_mod_date : Sat Dec 9 21:10:34 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 5, Record 21 is at pos 077C,Backptr is at offset 0FD4 Node 5, Record 22 is at pos 07DE,Backptr is at offset 0FD2 *** Key index : 21 parent cnid : 30 name : 7 === Folder === flags : 0x0 valence : 0x0 id : 101 create_date : Sat Dec 9 21:10:35 2000 content_mod_date : Sat Dec 9 21:10:35 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 5, Record 22 is at pos 07DE,Backptr is at offset 0FD2 Node 5, Record 23 is at pos 0840,Backptr is at offset 0FD0 *** Key index : 22 parent cnid : 30 name : 8 === Folder === flags : 0x0 valence : 0x0 id : 102 create_date : Sat Dec 9 21:10:37 2000 content_mod_date : Sat Dec 9 21:10:37 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 5, Record 0 is at pos 000E,Backptr is at offset 0FFE Node 1, Record 1 is at pos 0070,Backptr is at offset 0FFC *** Key index : 0 parent cnid : 30 name : 9 === Folder === flags : 0x0 valence : 0x0 id : 103 create_date : Sat Dec 9 21:10:38 2000 content_mod_date : Sat Dec 9 21:10:38 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=-1, h=-1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 1, Record 1 is at pos 0070,Backptr is at offset 0FFC Node 1, Record 2 is at pos 0084,Backptr is at offset 0FFA *** Key index : 1 parent cnid : 31 name : === Folder Thread === parent cnid : 2 name : 9 Node 1, Record 2 is at pos 0084,Backptr is at offset 0FFA Node 1, Record 3 is at pos 00E6,Backptr is at offset 0FF8 *** Key index : 2 parent cnid : 31 name : 1 === Folder === flags : 0x0 valence : 0x0 id : 104 create_date : Sat Dec 9 21:10:27 2000 content_mod_date : Sat Dec 9 21:10:27 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=78, left=30, bottom=296, right=434 ] frFlags : 0X3E0 frLocation : [ v=0, h=1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 1, Record 3 is at pos 00E6,Backptr is at offset 0FF8 Node 1, Record 4 is at pos 0148,Backptr is at offset 0FF6 *** Key index : 3 parent cnid : 31 name : 2 === Folder === flags : 0x0 valence : 0x0 id : 105 create_date : Sat Dec 9 21:10:29 2000 content_mod_date : Sat Dec 9 21:10:29 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=0, h=129 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 1, Record 4 is at pos 0148,Backptr is at offset 0FF6 Node 1, Record 5 is at pos 01AA,Backptr is at offset 0FF4 *** Key index : 4 parent cnid : 31 name : 3 === Folder === flags : 0x0 valence : 0x0 id : 106 create_date : Sat Dec 9 21:10:30 2000 content_mod_date : Sat Dec 9 21:10:30 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=0, h=257 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 1, Record 5 is at pos 01AA,Backptr is at offset 0FF4 Node 1, Record 6 is at pos 020C,Backptr is at offset 0FF2 *** Key index : 5 parent cnid : 31 name : 4 === Folder === flags : 0x0 valence : 0x0 id : 107 create_date : Sat Dec 9 21:10:31 2000 content_mod_date : Sat Dec 9 21:10:31 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=64, h=1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 1, Record 6 is at pos 020C,Backptr is at offset 0FF2 Node 1, Record 7 is at pos 026E,Backptr is at offset 0FF0 *** Key index : 6 parent cnid : 31 name : 5 === Folder === flags : 0x0 valence : 0x0 id : 108 create_date : Sat Dec 9 21:10:32 2000 content_mod_date : Sat Dec 9 21:10:32 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=64, h=129 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 1, Record 7 is at pos 026E,Backptr is at offset 0FF0 Node 1, Record 8 is at pos 02D0,Backptr is at offset 0FEE *** Key index : 7 parent cnid : 31 name : 6 === Folder === flags : 0x0 valence : 0x0 id : 109 create_date : Sat Dec 9 21:10:34 2000 content_mod_date : Sat Dec 9 21:10:34 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=64, h=257 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 1, Record 8 is at pos 02D0,Backptr is at offset 0FEE Node 1, Record 9 is at pos 0332,Backptr is at offset 0FEC *** Key index : 8 parent cnid : 31 name : 7 === Folder === flags : 0x0 valence : 0x0 id : 110 create_date : Sat Dec 9 21:10:35 2000 content_mod_date : Sat Dec 9 21:10:35 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=128, h=1 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 1, Record 9 is at pos 0332,Backptr is at offset 0FEC Node 1, Record 10 is at pos 0394,Backptr is at offset 0FEA *** Key index : 9 parent cnid : 31 name : 8 === Folder === flags : 0x0 valence : 0x0 id : 111 create_date : Sat Dec 9 21:10:37 2000 content_mod_date : Sat Dec 9 21:10:37 2000 attribute_mod_date : Fri Jan 1 01:00:00 1904 access_date : Fri Jan 1 01:00:00 1904 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=63, left=29, bottom=281, right=433 ] frFlags : 0X3E0 frLocation : [ v=128, h=129 ] frView : 0X107 frScroll : [ v=-8, h=-16 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 1, Record 10 is at pos 0394,Backptr is at offset 0FEA Node 1, Record 11 is at pos 03FC,Backptr is at offset 0FE8 *** Key index : 10 parent cnid : 31 name : 8aaa === Folder === flags : 0x0 valence : 0x0 id : 119 create_date : Sun Jun 10 17:09:56 2001 content_mod_date : Sun Jun 10 17:09:56 2001 attribute_mod_date : Sun Jun 10 17:09:56 2001 access_date : Sun Jun 10 17:09:56 2001 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=0, left=0, bottom=0, right=0 ] frFlags : 0X3E0 frLocation : [ v=128, h=257 ] frView : 0X107 frScroll : [ v=0, h=0 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 1, Record 11 is at pos 03FC,Backptr is at offset 0FE8 Node 1, Record 12 is at pos 0464,Backptr is at offset 0FE6 Warning folder create_date is in the future: (B76DA947) Sun Jul 8 08:08:07 2001 Warning folder content_mod_da is in the future: (B76DA947) Sun Jul 8 08:08:07 2001 Warning folder attribute_mod_ is in the future: (B76DA947) Sun Jul 8 08:08:07 2001 Warning folder access_date is in the future: (B76DA947) Sun Jul 8 08:08:07 2001 *** Key index : 11 parent cnid : 31 name : 9aaa === Folder === flags : 0x0 valence : 0x0 id : 113 create_date : Sun Jul 8 08:08:07 2001 content_mod_date : Sun Jul 8 08:08:07 2001 attribute_mod_date : Sun Jul 8 08:08:07 2001 access_date : Sun Jul 8 08:08:07 2001 backup_date : Fri Jan 1 01:00:00 1904 owner : 0 group : 0 perm : 0x0 dev : 0 frRect : [ top=0, left=0, bottom=0, right=0 ] frFlags : 0X3E0 frLocation : [ v=192, h=1 ] frView : 0X107 frScroll : [ v=0, h=0 ] frOpenChain : -1019215872 frUnused : 0 frComment : 0 frPutAway : 0 text_encoding : 0x0 reserved : 0x0 Node 1, Record 12 is at pos 0464,Backptr is at offset 0FE6 Node 1, Record 13 is at pos 0478,Backptr is at offset 0FE4 *** Key index : 12 parent cnid : 32 name : === Folder Thread === parent cnid : 23 name : 1 Node 1, Record 13 is at pos 0478,Backptr is at offset 0FE4 Node 1, Record 14 is at pos 048C,Backptr is at offset 0FE2 *** Key index : 13 parent cnid : 33 name : === Folder Thread === parent cnid : 23 name : 2 Node 1, Record 14 is at pos 048C,Backptr is at offset 0FE2 Node 1, Record 15 is at pos 04A0,Backptr is at offset 0FE0 *** Key index : 14 parent cnid : 34 name : === Folder Thread === parent cnid : 23 name : 3 Node 1, Record 15 is at pos 04A0,Backptr is at offset 0FE0 Node 1, Record 16 is at pos 04B4,Backptr is at offset 0FDE *** Key index : 15 parent cnid : 35 name : === Folder Thread === parent cnid : 23 name : 4 Node 1, Record 16 is at pos 04B4,Backptr is at offset 0FDE Node 1, Record 17 is at pos 04C8,Backptr is at offset 0FDC *** Key index : 16 parent cnid : 36 name : === Folder Thread === parent cnid : 23 name : 5 Node 1, Record 17 is at pos 04C8,Backptr is at offset 0FDC Node 1, Record 18 is at pos 04DC,Backptr is at offset 0FDA *** Key index : 17 parent cnid : 37 name : === Folder Thread === parent cnid : 23 name : 6 Node 1, Record 18 is at pos 04DC,Backptr is at offset 0FDA Node 1, Record 19 is at pos 04F0,Backptr is at offset 0FD8 *** Key index : 18 parent cnid : 38 name : === Folder Thread === parent cnid : 23 name : 7 Node 1, Record 19 is at pos 04F0,Backptr is at offset 0FD8 Node 1, Record 20 is at pos 0504,Backptr is at offset 0FD6 *** Key index : 19 parent cnid : 39 name : === Folder Thread === parent cnid : 23 name : 8 Node 1, Record 20 is at pos 0504,Backptr is at offset 0FD6 Node 1, Record 21 is at pos 0518,Backptr is at offset 0FD4 *** Key index : 20 parent cnid : 40 name : === Folder Thread === parent cnid : 23 name : 9 Node 1, Record 21 is at pos 0518,Backptr is at offset 0FD4 Node 1, Record 22 is at pos 052C,Backptr is at offset 0FD2 *** Key index : 21 parent cnid : 41 name : === Folder Thread === parent cnid : 24 name : 1 Node 1, Record 22 is at pos 052C,Backptr is at offset 0FD2 Node 1, Record 23 is at pos 0540,Backptr is at offset 0FD0 *** Key index : 22 parent cnid : 42 name : === Folder Thread === parent cnid : 24 name : 2 Node 1, Record 23 is at pos 0540,Backptr is at offset 0FD0 Node 1, Record 24 is at pos 0554,Backptr is at offset 0FCE *** Key index : 23 parent cnid : 43 name : === Folder Thread === parent cnid : 24 name : 3 Node 1, Record 24 is at pos 0554,Backptr is at offset 0FCE Node 1, Record 25 is at pos 0568,Backptr is at offset 0FCC *** Key index : 24 parent cnid : 44 name : === Folder Thread === parent cnid : 24 name : 4 Node 1, Record 25 is at pos 0568,Backptr is at offset 0FCC Node 1, Record 26 is at pos 057C,Backptr is at offset 0FCA *** Key index : 25 parent cnid : 45 name : === Folder Thread === parent cnid : 24 name : 5 Node 1, Record 26 is at pos 057C,Backptr is at offset 0FCA Node 1, Record 27 is at pos 0590,Backptr is at offset 0FC8 *** Key index : 26 parent cnid : 46 name : === Folder Thread === parent cnid : 24 name : 6 Node 1, Record 27 is at pos 0590,Backptr is at offset 0FC8 Node 1, Record 28 is at pos 05A4,Backptr is at offset 0FC6 *** Key index : 27 parent cnid : 47 name : === Folder Thread === parent cnid : 24 name : 7 Node 1, Record 28 is at pos 05A4,Backptr is at offset 0FC6 Node 1, Record 29 is at pos 05B8,Backptr is at offset 0FC4 *** Key index : 28 parent cnid : 48 name : === Folder Thread === parent cnid : 24 name : 8 Node 1, Record 29 is at pos 05B8,Backptr is at offset 0FC4 Node 1, Record 30 is at pos 05CC,Backptr is at offset 0FC2 *** Key index : 29 parent cnid : 49 name : === Folder Thread === parent cnid : 24 name : 9 Node 1, Record 30 is at pos 05CC,Backptr is at offset 0FC2 Node 1, Record 31 is at pos 05E0,Backptr is at offset 0FC0 *** Key index : 30 parent cnid : 50 name : === Folder Thread === parent cnid : 25 name : 1 Node 1, Record 31 is at pos 05E0,Backptr is at offset 0FC0 Node 1, Record 32 is at pos 05F4,Backptr is at offset 0FBE *** Key index : 31 parent cnid : 51 name : === Folder Thread === parent cnid : 25 name : 2 Node 1, Record 32 is at pos 05F4,Backptr is at offset 0FBE Node 1, Record 33 is at pos 0608,Backptr is at offset 0FBC *** Key index : 32 parent cnid : 52 name : === Folder Thread === parent cnid : 25 name : 3 Node 1, Record 33 is at pos 0608,Backptr is at offset 0FBC Node 1, Record 34 is at pos 061C,Backptr is at offset 0FBA *** Key index : 33 parent cnid : 53 name : === Folder Thread === parent cnid : 25 name : 4 Node 1, Record 34 is at pos 061C,Backptr is at offset 0FBA Node 1, Record 35 is at pos 0630,Backptr is at offset 0FB8 *** Key index : 34 parent cnid : 54 name : === Folder Thread === parent cnid : 25 name : 5 Node 1, Record 35 is at pos 0630,Backptr is at offset 0FB8 Node 1, Record 36 is at pos 0644,Backptr is at offset 0FB6 *** Key index : 35 parent cnid : 55 name : === Folder Thread === parent cnid : 25 name : 6 Node 1, Record 36 is at pos 0644,Backptr is at offset 0FB6 Node 1, Record 37 is at pos 0658,Backptr is at offset 0FB4 *** Key index : 36 parent cnid : 56 name : === Folder Thread === parent cnid : 25 name : 7 Node 1, Record 37 is at pos 0658,Backptr is at offset 0FB4 Node 1, Record 38 is at pos 066C,Backptr is at offset 0FB2 *** Key index : 37 parent cnid : 57 name : === Folder Thread === parent cnid : 25 name : 8 Node 1, Record 38 is at pos 066C,Backptr is at offset 0FB2 Node 1, Record 39 is at pos 0680,Backptr is at offset 0FB0 *** Key index : 38 parent cnid : 58 name : === Folder Thread === parent cnid : 25 name : 9 Node 1, Record 39 is at pos 0680,Backptr is at offset 0FB0 Node 1, Record 40 is at pos 0694,Backptr is at offset 0FAE *** Key index : 39 parent cnid : 59 name : === Folder Thread === parent cnid : 27 name : 1 Node 1, Record 40 is at pos 0694,Backptr is at offset 0FAE Node 1, Record 41 is at pos 06A8,Backptr is at offset 0FAC *** Key index : 40 parent cnid : 60 name : === Folder Thread === parent cnid : 27 name : 2 Node 1, Record 41 is at pos 06A8,Backptr is at offset 0FAC Node 1, Record 42 is at pos 06BC,Backptr is at offset 0FAA *** Key index : 41 parent cnid : 61 name : === Folder Thread === parent cnid : 27 name : 3 Node 1, Record 42 is at pos 06BC,Backptr is at offset 0FAA Node 1, Record 43 is at pos 06D0,Backptr is at offset 0FA8 *** Key index : 42 parent cnid : 62 name : === Folder Thread === parent cnid : 27 name : 4 Node 1, Record 43 is at pos 06D0,Backptr is at offset 0FA8 Node 1, Record 44 is at pos 06E4,Backptr is at offset 0FA6 *** Key index : 43 parent cnid : 63 name : === Folder Thread === parent cnid : 27 name : 5 Node 1, Record 44 is at pos 06E4,Backptr is at offset 0FA6 Node 1, Record 45 is at pos 06F8,Backptr is at offset 0FA4 *** Key index : 44 parent cnid : 64 name : === Folder Thread === parent cnid : 27 name : 6 Node 1, Record 45 is at pos 06F8,Backptr is at offset 0FA4 Node 1, Record 46 is at pos 070C,Backptr is at offset 0FA2 *** Key index : 45 parent cnid : 65 name : === Folder Thread === parent cnid : 27 name : 7 Node 1, Record 46 is at pos 070C,Backptr is at offset 0FA2 Node 1, Record 47 is at pos 0720,Backptr is at offset 0FA0 *** Key index : 46 parent cnid : 66 name : === Folder Thread === parent cnid : 27 name : 8 Node 1, Record 47 is at pos 0720,Backptr is at offset 0FA0 Node 1, Record 48 is at pos 0734,Backptr is at offset 0F9E *** Key index : 47 parent cnid : 67 name : === Folder Thread === parent cnid : 27 name : 9 Node 1, Record 48 is at pos 0734,Backptr is at offset 0F9E Node 1, Record 49 is at pos 0754,Backptr is at offset 0F9C *** Key index : 48 parent cnid : 68 name : === Folder Thread === parent cnid : 26 name : aaa1aaa Node 1, Record 49 is at pos 0754,Backptr is at offset 0F9C Node 1, Record 50 is at pos 0774,Backptr is at offset 0F9A *** Key index : 49 parent cnid : 69 name : === Folder Thread === parent cnid : 26 name : aaa2aaa Node 1, Record 50 is at pos 0774,Backptr is at offset 0F9A Node 1, Record 51 is at pos 0794,Backptr is at offset 0F98 *** Key index : 50 parent cnid : 70 name : === Folder Thread === parent cnid : 26 name : aaa3aaa Node 1, Record 51 is at pos 0794,Backptr is at offset 0F98 Node 1, Record 52 is at pos 07B4,Backptr is at offset 0F96 *** Key index : 51 parent cnid : 71 name : === Folder Thread === parent cnid : 26 name : aaa4aaa Node 1, Record 52 is at pos 07B4,Backptr is at offset 0F96 Node 1, Record 53 is at pos 07D4,Backptr is at offset 0F94 *** Key index : 52 parent cnid : 72 name : === Folder Thread === parent cnid : 26 name : aaa5aaa Node 1, Record 53 is at pos 07D4,Backptr is at offset 0F94 Node 1, Record 54 is at pos 07F4,Backptr is at offset 0F92 *** Key index : 53 parent cnid : 73 name : === Folder Thread === parent cnid : 26 name : aaa6aaa Node 1, Record 54 is at pos 07F4,Backptr is at offset 0F92 Node 1, Record 55 is at pos 0814,Backptr is at offset 0F90 *** Key index : 54 parent cnid : 74 name : === Folder Thread === parent cnid : 26 name : aaa7aaa Node 1, Record 55 is at pos 0814,Backptr is at offset 0F90 Node 1, Record 56 is at pos 0834,Backptr is at offset 0F8E *** Key index : 55 parent cnid : 75 name : === Folder Thread === parent cnid : 26 name : aaa8aaa Node 1, Record 56 is at pos 0834,Backptr is at offset 0F8E Node 1, Record 57 is at pos 0854,Backptr is at offset 0F8C *** Key index : 56 parent cnid : 76 name : === Folder Thread === parent cnid : 26 name : aaa9aaa Node 1, Record 57 is at pos 0854,Backptr is at offset 0F8C Node 1, Record 58 is at pos 0868,Backptr is at offset 0F8A *** Key index : 57 parent cnid : 77 name : === Folder Thread === parent cnid : 28 name : 1 Node 1, Record 58 is at pos 0868,Backptr is at offset 0F8A Node 1, Record 59 is at pos 087C,Backptr is at offset 0F88 *** Key index : 58 parent cnid : 78 name : === Folder Thread === parent cnid : 28 name : 2 Node 1, Record 59 is at pos 087C,Backptr is at offset 0F88 Node 1, Record 60 is at pos 0890,Backptr is at offset 0F86 *** Key index : 59 parent cnid : 79 name : === Folder Thread === parent cnid : 28 name : 3 Node 1, Record 60 is at pos 0890,Backptr is at offset 0F86 Node 1, Record 61 is at pos 08A4,Backptr is at offset 0F84 *** Key index : 60 parent cnid : 80 name : === Folder Thread === parent cnid : 28 name : 4 Node 1, Record 61 is at pos 08A4,Backptr is at offset 0F84 Node 1, Record 62 is at pos 08B8,Backptr is at offset 0F82 *** Key index : 61 parent cnid : 81 name : === Folder Thread === parent cnid : 28 name : 5 Node 1, Record 62 is at pos 08B8,Backptr is at offset 0F82 Node 1, Record 63 is at pos 08CC,Backptr is at offset 0F80 *** Key index : 62 parent cnid : 82 name : === Folder Thread === parent cnid : 28 name : 6 Node 1, Record 63 is at pos 08CC,Backptr is at offset 0F80 Node 1, Record 64 is at pos 08E0,Backptr is at offset 0F7E *** Key index : 63 parent cnid : 83 name : === Folder Thread === parent cnid : 28 name : 7 Node 1, Record 64 is at pos 08E0,Backptr is at offset 0F7E Node 1, Record 65 is at pos 08F4,Backptr is at offset 0F7C *** Key index : 64 parent cnid : 84 name : === Folder Thread === parent cnid : 28 name : 8 Node 1, Record 65 is at pos 08F4,Backptr is at offset 0F7C Node 1, Record 66 is at pos 0908,Backptr is at offset 0F7A *** Key index : 65 parent cnid : 85 name : === Folder Thread === parent cnid : 28 name : 9 Node 1, Record 66 is at pos 0908,Backptr is at offset 0F7A Node 1, Record 67 is at pos 091C,Backptr is at offset 0F78 *** Key index : 66 parent cnid : 86 name : === Folder Thread === parent cnid : 29 name : 1 Node 1, Record 67 is at pos 091C,Backptr is at offset 0F78 Node 1, Record 68 is at pos 0930,Backptr is at offset 0F76 *** Key index : 67 parent cnid : 87 name : === Folder Thread === parent cnid : 29 name : 2 Node 1, Record 68 is at pos 0930,Backptr is at offset 0F76 Node 1, Record 69 is at pos 0944,Backptr is at offset 0F74 *** Key index : 68 parent cnid : 88 name : === Folder Thread === parent cnid : 29 name : 3 Node 1, Record 69 is at pos 0944,Backptr is at offset 0F74 Node 1, Record 70 is at pos 0958,Backptr is at offset 0F72 *** Key index : 69 parent cnid : 89 name : === Folder Thread === parent cnid : 29 name : 4 Node 1, Record 70 is at pos 0958,Backptr is at offset 0F72 Node 1, Record 71 is at pos 096C,Backptr is at offset 0F70 *** Key index : 70 parent cnid : 90 name : === Folder Thread === parent cnid : 29 name : 5 Node 1, Record 71 is at pos 096C,Backptr is at offset 0F70 Node 1, Record 72 is at pos 0980,Backptr is at offset 0F6E *** Key index : 71 parent cnid : 91 name : === Folder Thread === parent cnid : 29 name : 6 Node 1, Record 72 is at pos 0980,Backptr is at offset 0F6E Node 1, Record 73 is at pos 0994,Backptr is at offset 0F6C *** Key index : 72 parent cnid : 92 name : === Folder Thread === parent cnid : 29 name : 7 Node 1, Record 73 is at pos 0994,Backptr is at offset 0F6C Node 1, Record 74 is at pos 09A8,Backptr is at offset 0F6A *** Key index : 73 parent cnid : 93 name : === Folder Thread === parent cnid : 29 name : 8 Node 1, Record 74 is at pos 09A8,Backptr is at offset 0F6A Node 1, Record 75 is at pos 09BC,Backptr is at offset 0F68 *** Key index : 74 parent cnid : 94 name : === Folder Thread === parent cnid : 29 name : 9 Node 1, Record 75 is at pos 09BC,Backptr is at offset 0F68 Node 1, Record 76 is at pos 09D0,Backptr is at offset 0F66 *** Key index : 75 parent cnid : 95 name : === Folder Thread === parent cnid : 30 name : 1 Node 1, Record 76 is at pos 09D0,Backptr is at offset 0F66 Node 1, Record 77 is at pos 09E4,Backptr is at offset 0F64 *** Key index : 76 parent cnid : 96 name : === Folder Thread === parent cnid : 30 name : 2 Node 1, Record 77 is at pos 09E4,Backptr is at offset 0F64 Node 1, Record 78 is at pos 09F8,Backptr is at offset 0F62 *** Key index : 77 parent cnid : 97 name : === Folder Thread === parent cnid : 30 name : 3 Node 1, Record 78 is at pos 09F8,Backptr is at offset 0F62 Node 1, Record 79 is at pos 0A0C,Backptr is at offset 0F60 *** Key index : 78 parent cnid : 98 name : === Folder Thread === parent cnid : 30 name : 4 Node 1, Record 79 is at pos 0A0C,Backptr is at offset 0F60 Node 1, Record 80 is at pos 0A20,Backptr is at offset 0F5E *** Key index : 79 parent cnid : 99 name : === Folder Thread === parent cnid : 30 name : 5 Node 1, Record 80 is at pos 0A20,Backptr is at offset 0F5E Node 1, Record 81 is at pos 0A34,Backptr is at offset 0F5C *** Key index : 80 parent cnid : 100 name : === Folder Thread === parent cnid : 30 name : 6 Node 1, Record 81 is at pos 0A34,Backptr is at offset 0F5C Node 1, Record 82 is at pos 0A48,Backptr is at offset 0F5A *** Key index : 81 parent cnid : 101 name : === Folder Thread === parent cnid : 30 name : 7 Node 1, Record 82 is at pos 0A48,Backptr is at offset 0F5A Node 1, Record 83 is at pos 0A5C,Backptr is at offset 0F58 *** Key index : 82 parent cnid : 102 name : === Folder Thread === parent cnid : 30 name : 8 Node 1, Record 83 is at pos 0A5C,Backptr is at offset 0F58 Node 1, Record 84 is at pos 0A70,Backptr is at offset 0F56 *** Key index : 83 parent cnid : 103 name : === Folder Thread === parent cnid : 30 name : 9 Node 1, Record 84 is at pos 0A70,Backptr is at offset 0F56 Node 1, Record 85 is at pos 0A84,Backptr is at offset 0F54 *** Key index : 84 parent cnid : 104 name : === Folder Thread === parent cnid : 31 name : 1 Node 1, Record 85 is at pos 0A84,Backptr is at offset 0F54 Node 1, Record 86 is at pos 0A98,Backptr is at offset 0F52 *** Key index : 85 parent cnid : 105 name : === Folder Thread === parent cnid : 31 name : 2 Node 1, Record 86 is at pos 0A98,Backptr is at offset 0F52 Node 1, Record 87 is at pos 0AAC,Backptr is at offset 0F50 *** Key index : 86 parent cnid : 106 name : === Folder Thread === parent cnid : 31 name : 3 Node 1, Record 87 is at pos 0AAC,Backptr is at offset 0F50 Node 1, Record 88 is at pos 0AC0,Backptr is at offset 0F4E *** Key index : 87 parent cnid : 107 name : === Folder Thread === parent cnid : 31 name : 4 Node 1, Record 88 is at pos 0AC0,Backptr is at offset 0F4E Node 1, Record 89 is at pos 0AD4,Backptr is at offset 0F4C *** Key index : 88 parent cnid : 108 name : === Folder Thread === parent cnid : 31 name : 5 Node 1, Record 89 is at pos 0AD4,Backptr is at offset 0F4C Node 1, Record 90 is at pos 0AE8,Backptr is at offset 0F4A *** Key index : 89 parent cnid : 109 name : === Folder Thread === parent cnid : 31 name : 6 Node 1, Record 90 is at pos 0AE8,Backptr is at offset 0F4A Node 1, Record 91 is at pos 0AFC,Backptr is at offset 0F48 *** Key index : 90 parent cnid : 110 name : === Folder Thread === parent cnid : 31 name : 7 Node 1, Record 91 is at pos 0AFC,Backptr is at offset 0F48 Node 1, Record 92 is at pos 0B10,Backptr is at offset 0F46 *** Key index : 91 parent cnid : 111 name : === Folder Thread === parent cnid : 31 name : 8 Node 1, Record 92 is at pos 0B10,Backptr is at offset 0F46 Node 1, Record 93 is at pos 0B2A,Backptr is at offset 0F44 *** Key index : 92 parent cnid : 113 name : === Folder Thread === parent cnid : 31 name : 9aaa Node 1, Record 93 is at pos 0B2A,Backptr is at offset 0F44 Node 1, Record 94 is at pos 0B44,Backptr is at offset 0F42 *** Key index : 93 parent cnid : 119 name : === Folder Thread === parent cnid : 31 name : 8aaa Node 1, Record 94 is at pos 0B44,Backptr is at offset 0F42 Node 1, Record 95 is at pos 0B5E,Backptr is at offset 0F40 *** Key index : 94 parent cnid : 120 name : === Folder Thread === parent cnid : 2 name : 9aaa hfsplus-1.0.4/src/confdefs.h0100644000000000000000000000000107441220605014415 0ustar rootroot hfsplus-1.0.4/src/copyout.c0100644000000000000000000003370707441220605014346 0ustar rootroot/* * hfsputils - tools for reading and writing Macintosh HFS+ volumes * * The functions here allow copying from HFS+ to unix files. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: copyout.c,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # ifdef HAVE_FCNTL_H # include # else int open(const char *, int, ...); # endif # ifdef HAVE_UNISTD_H # include # else int dup(int); # endif # include # include # include # include # include # include "libhfsp.h" # include "volume.h" # include "record.h" # include "blockiter.h" # include "unicode.h" # include "swab.h" # include "copyout.h" # include "charset.h" # include "binhex.h" # include "crc.h" const char *copyout_error = "no error"; extern int errno; # define ERROR(code, str) (copyout_error = (str), errno = (code)) # define MACB_BLOCKSZ 128 /* Copy Routines =========================================================== */ /* * NAME: fork->macb() * DESCRIPTION: copy a single fork for MacBinary II */ static int fork_macb(volume* vol, hfsp_fork_raw *fork, UInt8 forktype, UInt32 cnid, int ofile) { UInt64 total = fork->total_size; UInt32 blksize = vol -> blksize; size_t size, bytes; blockiter iter; char buf[blksize]; /* this is a gcc feature */ blockiter_init(&iter, vol, fork, forktype, cnid); /* This loop is optimized for a pipelined processor */ while (total > 0) { UInt32 block = blockiter_curr(&iter); int result = volume_readinbuf(vol, buf, block); size = total > blksize ? blksize : total; if (result) { ERROR(errno, hfsp_error); return result; } bytes = write(ofile, buf, size); total -= size; if (bytes != size) { if (bytes == -1) ERROR(errno, "error writing data"); else ERROR(EIO, "wrote incomplete chunk"); return -1; } if (blockiter_next(&iter)) break; } // fill up to MACB_BLOCKSZ size = (UInt32) fork->total_size & (MACB_BLOCKSZ -1); if (size > 0) // % MACB_BLCOKSZ { char buf[MACB_BLOCKSZ] = { 0 }; bytes = write(ofile, buf, MACB_BLOCKSZ - size); if (bytes != (MACB_BLOCKSZ - size)) { if (bytes == -1) ERROR(errno, "error writing data"); else ERROR(EIO, "wrote incomplete chunk"); return -1; } } return 0; } /* * NAME: do_macb() * DESCRIPTION: perform copy using MacBinary II translation */ static int do_macb(record *ifile, int ofile) { unsigned char buf[MACB_BLOCKSZ] = { 0 }; hfsp_cat_file *file = &ifile->record.u.file; UInt64 hsize; // huge , HFS+ size UInt32 bsize; // size supported by Macbinary size_t bytes; void *p; /* Mhh, this limits filenames to 63 characters */ buf[1] = unicode_uni2asc(&buf[2], &ifile->key.name, 63); p = &buf[65]; bstoreU32_inc(p, file->user_info.fdType); // 65 bstoreU32_inc(p, file->user_info.fdCreator); // 69 bstoreU8_inc (p, file->user_info.fdFlags >> 8); // 73 p = &buf[83]; // Umh , MacBinay does not support Uint64 sizes hsize = file->data_fork.total_size; if (hsize > UINT_MAX) { ERROR(errno, "MacBinary does not support files longer than 2^32 bytes"); return -1; } bsize = hsize; bstoreU32_inc(p, bsize); // 83 hsize = file->res_fork.total_size; if (hsize > UINT_MAX) { /* I wonder if any MacOS resource manager is able to cope with that anyway :) */ ERROR(errno, "MacBinary does not support files longer than 2^32 bytes"); return -1; } bsize = hsize; bstoreU32_inc(p, bsize); // 87 bstoreU32_inc(p, file->create_date); /* 91 */ bstoreU32_inc(p, file->content_mod_date); /* 95 */ p = &buf[101]; bstoreU8_inc (p, file->user_info.fdFlags & 0xFF); /* 101 */ p = &buf[122]; bstoreU8_inc (p, 129); bstoreU8_inc (p, 129); bstoreU16_inc (p, crc_macb(buf, 124, 0x0000)); bytes = write(ofile, buf, MACB_BLOCKSZ); if (bytes == -1) { ERROR(errno, "error writing data"); return -1; } else if (bytes != MACB_BLOCKSZ) { ERROR(EIO, "wrote incomplete chunk"); return -1; } if (fork_macb(ifile->tree->vol, &file->data_fork, HFSP_EXTENT_DATA, file->id, ofile) == -1) return -1; if (fork_macb(ifile->tree->vol, &file->res_fork, HFSP_EXTENT_RSRC, file->id, ofile) == -1) return -1; return 0; } /* * NAME: fork->binh() * DESCRIPTION: copy a single fork for BinHex * (The ofile is iplicitly given by binhex_start */ static int fork_binh(volume* vol, hfsp_fork_raw* fork, UInt8 forktype, UInt32 cnid) { UInt64 total = fork->total_size; UInt32 blksize = vol -> blksize; size_t size; blockiter iter; char buf[blksize]; /* this is a gcc feature */ blockiter_init(&iter, vol, fork, forktype, cnid); /* This loop is optimized for a pipelined processor */ while (total > 0) { UInt32 block = blockiter_curr(&iter); int result = volume_readinbuf(vol, buf, block); size = total > blksize ? blksize : total; if (result) { ERROR(errno, hfsp_error); return result; } total -= size; if (binhex_insert(buf, size) == -1) { ERROR(errno, binhex_error); return -1; } if (blockiter_next(&iter)) break; } if (binhex_insertcrc() == -1) { ERROR(errno, binhex_error); return -1; } return 0; } /* * NAME: binhx() * DESCRIPTION: auxiliary BinHex routine */ static int binhx(record *ifile) { hfsp_cat_file *file = &ifile->record.u.file; unsigned char byte; unsigned char name[255]; void *p = name; UInt64 hsize; // huge , HFS+ size UInt32 bsize; // size supported by Macbinary byte = unicode_uni2asc(name, &ifile->key.name, 255); if (binhex_insert(&byte, 1) == -1 || binhex_insert(name, byte + 1) == -1) { ERROR(errno, binhex_error); return -1; } /* name is recycled as buffer now */ bstoreU32_inc(p, file->user_info.fdType); bstoreU32_inc(p, file->user_info.fdCreator); bstoreU16_inc(p, file->user_info.fdFlags); hsize = file->data_fork.total_size; if (hsize > UINT_MAX) { ERROR(errno, "Binhex does not support files longer than 2^32 bytes"); return -1; } bsize = hsize; bstoreU32_inc(p, bsize); hsize = file->res_fork.total_size; if (hsize > UINT_MAX) { ERROR(errno, "Binhex does not support files longer than 2^32 bytes"); return -1; } bsize = hsize; bstoreU32_inc(p, bsize); if (binhex_insert(name, 18) == -1 || binhex_insertcrc() == -1) { ERROR(errno, binhex_error); return -1; } if (fork_binh(ifile->tree->vol, &file->data_fork, HFSP_EXTENT_DATA, file->id) == -1) return -1; if (fork_binh(ifile->tree->vol, &file->res_fork, HFSP_EXTENT_RSRC, file->id) == -1) return -1; return 0; } /* * NAME: do_binh() * DESCRIPTION: perform copy using BinHex translation */ static int do_binh(record *ifile, int ofile) { int result; if (binhex_start(ofile) == -1) { ERROR(errno, binhex_error); return -1; } result = binhx(ifile); if (binhex_end() == -1 && result == 0) { ERROR(errno, binhex_error); result = -1; } return result; } /* * NAME: do_text() * DESCRIPTION: perform copy using text translation */ static int do_text(volume* vol, hfsp_fork_raw *fork, UInt8 forktype, UInt32 cnid, int ofile) { UInt64 total = fork->total_size; UInt32 blksize = vol -> blksize; blockiter iter; char buf[blksize]; /* this is a gcc feature */ blockiter_init(&iter, vol, fork, forktype, cnid); /* This loop is optimized for a pipelined processor */ while (total > 0) { UInt32 block = blockiter_curr(&iter); int result = volume_readinbuf(vol, buf, block); size_t size = total > blksize ? blksize : total; size_t bytes; char *latin1, *ptr, *ptrend; if (result) { ERROR(errno, hfsp_error); return result; } latin1 = ptr = cs_latin1(buf, &size); if (ptr == 0) { ERROR(ENOMEM, 0); return -1; } ptrend = ptr + size; total -= size; while (ptr < ptrend) { if (*ptr == '\r') *ptr = '\n'; ptr ++; } bytes = write(ofile, latin1, size); free(latin1); if (bytes != size) { if (bytes == -1) ERROR(errno, "error writing data"); else ERROR(EIO, "wrote incomplete chunk"); return -1; } if (blockiter_next(&iter)) break; } return 0; } /* * NAME: do_raw() * DESCRIPTION: perform copy using no translation */ static int do_raw(volume* vol, hfsp_fork_raw *fork, UInt8 forktype, UInt32 cnid, int ofile) { UInt64 total = fork->total_size; UInt32 blksize = vol -> blksize; size_t size, bytes; blockiter iter; char buf[blksize]; /* this is a gcc feature */ blockiter_init(&iter, vol, fork, forktype, cnid); /* This loop is optimized for a pipelined processor */ while (total > 0) { UInt32 block = blockiter_curr(&iter); int result = volume_readinbuf(vol, buf, block); void* p = buf; size = total > blksize ? blksize : total; if (result) { ERROR(errno, hfsp_error); return result; } bytes = write(ofile, p, size); total -= size; if (bytes != size) { if (bytes == -1) ERROR(errno, "error writing data"); else ERROR(EIO, "wrote incomplete chunk"); return -1; } if (blockiter_next(&iter)) break; } return 0; } /* Utility Routines ======================================================== */ /* * NAME: opensrc() * DESCRIPTION: open the source file; set hint for destination filename */ static int opensrc(record *src, const char **dsthint, const char *ext) { static char name[255 + 4 + 1]; // Not multihtreaded, well char *ptr; if (src->record.type != HFSP_FILE) { ERROR(-1, "source is not a file"); return -1; } unicode_uni2asc(name, &src->key.name, 255); for (ptr = name; *ptr; ++ptr) { if (*ptr == '/') *ptr = '-'; } if (ext) strcat(name, ext); *dsthint = name; return 0; } /* * NAME: opendst() * DESCRIPTION: open the destination file */ static int opendst(const char *dstname, const char *hint) { int fd; if (strcmp(dstname, "-") == 0) fd = dup(STDOUT_FILENO); else { struct stat sbuf; char *path = NULL; if (stat(dstname, &sbuf) != -1 && S_ISDIR(sbuf.st_mode)) { path = malloc(strlen(dstname) + 1 + strlen(hint) + 1); if (!path) { ERROR(ENOMEM, 0); return -1; } strcpy(path, dstname); strcat(path, "/"); strcat(path, hint); dstname = path; } // Mhh, better use umask here ? fd = open(dstname, O_WRONLY | O_CREAT | O_TRUNC, 0666); if (path) free(path); } if (fd == -1) { ERROR(errno, "error opening destination file"); return -1; } return fd; } /* * NAME: closefiles() * DESCRIPTION: close source and destination files */ static int closefiles(record *src, int ofile) { int result = 0; if (close(ofile) == -1) { ERROR(errno, "error closing destination file"); result = -1; } return result; } /* * NAME: openfiles() * DESCRIPTION: open source and destination files */ static int openfiles(record *src, const char *dstname, const char *ext, int *ofile) { const char *dsthint; if (opensrc(src, &dsthint, ext)) return -1; *ofile = opendst(dstname, dsthint); if (*ofile == -1) return -1; return 0; } /* Interface Routines ====================================================== */ /* * NAME: cpo->macb() * DESCRIPTION: copy an HFS file to a UNIX file using MacBinary II translation */ int copyout_macb(record *src, const char *dstname) { int ofile, result = 0; if (openfiles(src, dstname, ".bin", &ofile)) return -1; result = do_macb(src, ofile); result = closefiles(src, ofile) || result; return result; } /* * NAME: cpo->binh() * DESCRIPTION: copy an HFS file to a UNIX file using BinHex translation */ int copyout_binh(record *src, const char *dstname) { int ofile, result; if (openfiles(src, dstname, ".hqx", &ofile) == -1) return -1; result = do_binh(src, ofile); return closefiles(src, ofile) || result; } /* * NAME: cpo->text() * DESCRIPTION: copy an HFS file to a UNIX file using text translation */ int copyout_text(record* src, const char *dstname) { const char *ext = ".txt"; int ofile, result = 0; hfsp_cat_file *file = &src->record.u.file; if (openfiles(src, dstname, ext, &ofile) == -1) return -1; result = do_text(src->tree->vol, &file->data_fork, HFSP_EXTENT_DATA, file->id,ofile); return closefiles(src, ofile) || result; } /* * NAME: cpo->raw() * DESCRIPTION: copy the data fork of an HFS file to a UNIX file */ int copyout_raw(record *src, const char *dstname) { int ofile, result = 0; hfsp_cat_file *file = &src->record.u.file; if (openfiles(src, dstname, NULL, &ofile) == -1) return -1; result = do_raw(src->tree->vol, &file->data_fork, HFSP_EXTENT_DATA, file->id, ofile); return closefiles(src, ofile) || result; } hfsplus-1.0.4/src/copyout.h0100644000000000000000000000252507441220605014345 0ustar rootroot/* * hfsputils - tools for reading and writing Macintosh HFS+ volumes * * The functions here allow copying from HFS+ to unix files. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: copyout.h,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ extern const char *copyout_error; typedef int (*cpofunc)(record *, const char *); extern int copyout_macb(record *, const char *); extern int copyout_binh(record *, const char *); extern int copyout_text(record *, const char *); extern int copyout_raw (record *, const char *); hfsplus-1.0.4/src/crc.c0100644000000000000000000000755307441220605013413 0ustar rootroot/* * hfsputils - tools for reading and writing Macintosh HFS+ volumes * * These functions calculate CRC checksums for binhex and macbinary. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: crc.c,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # include "crc.h" static const unsigned short magic[256] = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 }; /* * NAME: crc->binh() * DESCRIPTION: compute BinHex-style CRC value for a block of data */ unsigned short crc_binh(register const unsigned char *ptr, register int count, register unsigned short crc) { while (count--) crc = ((crc << 8) | *ptr++) ^ magic[crc >> 8]; return crc; } /* * NAME: crc->macb() * DESCRIPTION: compute MacBinary II-style CRC value for a block of data */ unsigned short crc_macb(register const unsigned char *ptr, register int count, register unsigned short crc) { while (count--) { crc ^= *ptr++ << 8; crc = (crc << 8) ^ magic[crc >> 8]; } return crc; } hfsplus-1.0.4/src/crc.h0100644000000000000000000000264307441220605013413 0ustar rootroot/* * hfsputils - tools for reading and writing Macintosh HFS+ volumes * * These functions calculate CRC checksums for binhex and macbinary. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: crc.h,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ /* compute BinHex-style CRC value for a block of data */ unsigned short crc_binh(register const unsigned char *ptr, register int count, register unsigned short crc); /* compute MacBinary II-style CRC value for a block of data */ unsigned short crc_macb(register const unsigned char *ptr, register int count, register unsigned short crc); hfsplus-1.0.4/src/darray.c0100644000000000000000000000570307441220605014121 0ustar rootroot/* * hfsutils - tools for reading and writing Macintosh HFS volumes * Copyright (C) 1996-1998 Robert Leslie * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: darray.c,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # include # include # include "darray.h" #define DARRAY_RESERVE 8 // intial reserved space (elemsz) /* * NAME: darray->new() * DESCRIPTION: allocate and return a new dynamic array */ int darray_new(darray* array,size_t elemsz) { array->memsz = DARRAY_RESERVE * elemsz; array->mem = malloc(array->memsz); if (array->mem == 0) return -1; array->eltend = array->mem; array->elemsz = elemsz; return 0; } /* * NAME: darray->free() * DESCRIPTION: dispose of a dynamic array */ void darray_free(darray *array) { free(array->mem); } /* * NAME: darray->size() * DESCRIPTION: return the number of elements in a dynamic array */ unsigned int darray_size(darray *array) { return (array->eltend - array->mem) / array->elemsz; } /* * NAME: darray->array() * DESCRIPTION: return the array as an indexable block */ inline void *darray_array(darray *array) { return (void *) array->mem; } /* * NAME: darray->append() * DESCRIPTION: add an element to the end of a dynamic array */ void *darray_append(darray *array, void *elem) { char *eltend = array->eltend; size_t elemsz = array->elemsz; if ((size_t) (eltend - array->mem) == array->memsz) { char *newmem; size_t newsz; newsz = array->memsz * 2; newmem = realloc(array->mem, newsz); if (newmem == 0) return 0; eltend = newmem + array->memsz; array->mem = newmem; array->memsz = newsz; } memcpy(eltend, elem, elemsz); array->eltend = eltend + elemsz; return eltend; } /* * NAME: darray->shrink() * DESCRIPTION: truncate elements from the end of a dynamic array */ void darray_shrink(darray *array, unsigned int nelts) { if (nelts < (array->eltend - array->mem) / array->elemsz) array->eltend = array->mem + nelts * array->elemsz; } /* * NAME: darray->sort() * DESCRIPTION: arrange items according to sorting criteria */ void darray_sort(darray *array, int (*compare)(const void *, const void *)) { qsort(array->mem, (array->eltend - array->mem) / array->elemsz, array->elemsz, compare); } hfsplus-1.0.4/src/darray.h0100644000000000000000000000315107441220605014121 0ustar rootroot/* * hfsutils - tools for reading and writing Macintosh HFS volumes * * dynamic arrays as helper structure. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: darray.h,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ typedef struct darray { char *mem; size_t memsz; char *eltend; // pointer to last element size_t elemsz; } darray; extern int darray_new(darray* d,size_t); extern void darray_free(darray *d); extern unsigned int darray_size(darray *); extern void *darray_append(darray *, void *); extern void darray_shrink(darray *, unsigned int); extern void darray_sort(darray *, int (*)(const void *, const void *)); /* return the array as an indexable block */ extern inline void *darray_array(darray *array) { return (void *) array->mem; } hfsplus-1.0.4/src/dlist.c0100644000000000000000000000551507441220605013757 0ustar rootroot/* * hfsutils - tools for reading and writing Macintosh HFS volumes * * Utility functions to dynamically manage a list of strings. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: dlist.c,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # include # include # include "dlist.h" /* * NAME: dlist->init() * DESCRIPTION: initialize a new dynamic list */ int dlist_init(dlist *list) { list->memsz = 100; list->mem = malloc(list->memsz); if (list->mem == 0) return -1; list->eltend = (char **) list->mem; list->strs = list->mem + list->memsz; return 0; } /* * NAME: dlist->free() * DESCRIPTION: dispose of a dynamic list */ void dlist_free(dlist *list) { free(list->mem); } /* * NAME: dlist->array() * DESCRIPTION: return the array of strings in a list; can dispose with free() */ char **dlist_array(dlist *list) { return (char **) list->mem; } /* * NAME: dlist->size() * DESCRIPTION: return the number of strings in a list */ int dlist_size(dlist *list) { return list->eltend - (char **) list->mem; } /* * NAME: dlist->append() * DESCRIPTION: insert a string to the end of a list */ int dlist_append(dlist *list, const char *str) { size_t len = strlen(str) + 1; /* make sure there is room */ if (sizeof(char *) + len > (size_t) (list->strs - (char *) list->eltend)) { dlist newlist; size_t strsz = (list->mem + list->memsz) - list->strs; char **elt; newlist.memsz = list->memsz * 2 + sizeof(char *) + len; newlist.mem = malloc(newlist.memsz); if (!newlist.mem) return -1; newlist.eltend = (char **) newlist.mem; newlist.strs = newlist.mem + newlist.memsz - strsz; memcpy(newlist.strs, list->strs, strsz); for (elt = (char **) list->mem; elt < list->eltend; ++elt) *newlist.eltend++ = newlist.strs + (*elt - list->strs); free(list->mem); *list = newlist; } list->strs -= len; strcpy(list->strs, str); *list->eltend++ = list->strs; return 0; } hfsplus-1.0.4/src/dlist.h0100644000000000000000000000307007441220605013756 0ustar rootroot/* * hfsutils - tools for reading and writing Macintosh HFS volumes * * Utility functions to dynamically manage a list of strings. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: dlist.h,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ typedef struct { char *mem; size_t memsz; char **eltend; char *strs; } dlist; extern int dlist_init(dlist *); extern void dlist_free(dlist *); extern int dlist_append(dlist *, const char *); /* return the array of strings in a list; can dispose with free() */ extern inline char **dlist_array(dlist *list) { return (char **) list->mem; } /* return the number of strings in a list */ extern inline int dlist_size(dlist *list) { return list->eltend - (char **) list->mem; } hfsplus-1.0.4/src/dstring.c0100644000000000000000000000674107441220605014314 0ustar rootroot/* * hfsputils - tools for reading and writing Macintosh HFS+ volumes * * A dynamic string implementation needed for glob. * * String a either kept in the given (50 bytes) buffer or * preallocated using two times the intial size. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: dstring.c,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # include # include # include "dstring.h" /* * NAME: dstring->init() * DESCRIPTION: initialize a new dynamic string */ void dstring_init(dstring *string) { string->str = string->sbuf; string->len = 0; string->space = sizeof(string->sbuf); string->sbuf[0] = 0; } /* * NAME: dstring->copy() * DESCRIPTION: coyp from an existing dstring */ int dstring_copy(dstring *string, dstring *from) { size_t len = from->len; size_t space = sizeof(string->sbuf); char *sbuf; string->len = len; if (len < space) // fits into normal buffer { sbuf = string->sbuf; strncpy(sbuf, from->str, space); } else // must allocate new space { space = from->space; // use given preallocation sbuf = malloc(space); if (!sbuf) return -1; strncpy(sbuf, from->str, space); } string -> str = sbuf; string->space = space; return 0; } /* * NAME: dstring->append() * DESCRIPTION: append to a dynamic string */ int dstring_append(dstring *string, const char *str, size_t len) { size_t newlen; if (len == (size_t) -1) len = strlen(str); newlen = string->len + len; /* make sure there is room */ if (newlen >= string->space) { char *new; newlen *= 2; new = malloc(newlen); if (!new) return -1; string->space = newlen; memcpy(new, string->str, string->len); if (string->str != string->sbuf) free(string->str); string->str = new; } /* append the string */ memcpy(string->str + string->len, str, len); string->len += len; string->str[string->len] = '\0'; return 0; } /* * NAME: dstring->string() * DESCRIPTION: return a pointer to a dynamic string's content */ char *dstring_string(dstring *string) { return string->str; } /* * NAME: dstring->length() * DESCRIPTION: return the length of a dynamic string */ int dstring_length(dstring *string) { return string->len; } /* * NAME: dstring->shrink() * DESCRIPTION: truncate a dynamic string to a shorter length */ void dstring_shrink(dstring *string, size_t len) { if (len < string->len) string->len = len; } /* * NAME: dstring->free() * DESCRIPTION: free a dynamic string */ void dstring_free(dstring *string) { if (string->str != string->sbuf) free(string->str); } hfsplus-1.0.4/src/dstring.h0100644000000000000000000000315607441220605014316 0ustar rootroot/* * hfsputils - tools for reading and writing Macintosh HFS+ volumes * * A dynamic String implementation need for globbbing. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: dstring.h,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ typedef struct { char *str; size_t len; size_t space; char sbuf[50]; } dstring; /* intialize to epty String */ extern void dstring_init(dstring *); /* intialize by copy */ extern int dstring_copy(dstring *to, dstring* from); /* append to dstring */ extern int dstring_append(dstring *, const char *, size_t); extern void dstring_shrink(dstring *, size_t); extern void dstring_free(dstring *); extern inline char *dstring_string(dstring *string) { return string->str; } extern inline int dstring_length(dstring *string) { return string->len; } hfsplus-1.0.4/src/glob.c0100644000000000000000000001736107441220605013565 0ustar rootroot/* * hfsutils - tools for reading and writing Macintosh HFS volumes * Copyright (C) 1996-1998 Robert Leslie * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: glob.c,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # include # include # include "libhfsp.h" # include "record.h" # include "unicode.h" # include "dlist.h" # include "dstring.h" # include "glob.h" /* * NAME: strmatch() * DESCRIPTION: return 1 iff a string matches a given (glob) pattern */ static int strmatch(const char *str, const char *pat) { while (1) { if (!*str && *pat && *pat != '*') return 0; // no more string but still pattern switch (*pat) { case NULL: // pattern at end return (!*str); // String at end ? case '*': // match all if (*++pat == 0) return 1; while (1) { if (strmatch(str, pat)) return 1; if (*str++ == 0) return 0; } case '?': break; case '[': { ++pat; while (1) { unsigned char p0, p1, s; p0 = *pat; if (p0 == ']' || p0 == 0) return 0; s = *str; if (p0 == s) break; if (pat[1] == '-') { p1 = pat[2]; if (p1 == 0) return 0; if ((p0 <= s && p1 >= s) || (p0 >= s && p1 <= s)) break; pat += 2; } ++pat; } while (*pat != ']') { if (*pat == 0) { --pat; break; } ++pat; } } // case '[': break; case '\\': if (*++pat == 0) return 0; /* fall through */ default: // simple equality ... if ( *pat != *str) return 0; } ++pat, ++str; } } /* need foreward declaration for recursion */ static int doglob(record *rec, dlist *list, const char *dir, const char *rem); /* * NAME: glob_braces() * DESCRIPTION: check for patterns like {a,b,c} * * obrace pointer to '{' * cbrace pointer to '}' * new String matched so far */ static int glob_braces(record* rec,dlist* list,const char * dir, const char *rem, const char* obrace, const char* cbrace, dstring* new) { const char *elt; const char *ptr; int len; if (!cbrace || // no closing '}' ? dstring_append(new, rem, obrace - rem) == -1) { dstring_free(new); return -1; } len = dstring_length(new); /* save current length for shrink */ for (ptr = obrace; *ptr != '}'; ) { ptr = elt = ptr + 1; while (*ptr != '}' && *ptr != ',') // find next element ++ptr; if (dstring_append(new, elt, ptr - elt) || dstring_append(new, cbrace + 1, -1) || doglob(rec, list, dir, dstring_string(new))) { dstring_free(new); return -1; } dstring_shrink(new, len); } dstring_free(new); return 0; } /* * NAME: glob_special() * DESCRIPTION: check for patterns containing wildcards '*[?' * * ptr points to end of pattern in rem. */ static int glob_special(record* rec,dlist* list,const char * dir, const char *rem, dstring* new, const char* ptr) { int result = 0; int rec_err; // error return by a record_ function record d; dstring pat; int found = 0; // marker when anything was found int len = dstring_length(new); /* remeber length for shrink */ dstring_init(&pat); if (dstring_append(&pat, rem, ptr - rem)) { /* text matched upto wildcard */ dstring_free(&pat); dstring_free(new); return -1; } if (!*dir && strstr(rem, "..")) // correct ? { d = *rec; rec_err = record_up(&d); // glob in parent directory ? } else rec_err = record_init_parent(&d, rec); // glob in current directory if (rec_err) { dstring_free(&pat); dstring_free(new); return -1; } // Iterate directory and match pattern(s) while (!record_next(&d)) { char buf[255]; // invisible files will still be considered here unicode_uni2asc(buf, &d.key.name, 255); if (strmatch(buf, dstring_string(&pat))) { dstring_shrink(new, len); if (dstring_append(new, buf, -1) == -1) { result = -1; break; } if (!*ptr) { result = dlist_append(list, dstring_string(new)); found = 1; if (result == -1) break; } else if (d.record.type == HFSP_FOLDER) /* match '...*...' */ { if (dstring_append(new, "/", 1) == -1) result = -1; else { found = 1; result = doglob(rec, list, dstring_string(new), ptr + 1); } if (result == -1) break; } } } /* What happens here ? */ if (result == 0 && ! found) { dstring_shrink(new, len); if (dstring_append(new, rem, -1) == -1) result = -1; else { char *ptr, *rem; for (rem = dstring_string(new) + len, ptr = rem; *rem; ++rem, ++ptr) { if (*rem == '\\') ++rem; *ptr = *rem; } *ptr = 0; result = dlist_append(list, dstring_string(new)); } } dstring_free(&pat); dstring_free(new); return result; } /* * NAME: doglob() * DESCRIPTION: perform recursive depth-first traversal of path to be globbed * * rec current directory * dlist list of dynamic strings found so far * dir name of current directory * rem (wildcarded) parameter to glob */ static int doglob(record *rec, dlist *list, const char *dir, const char *rem) { dstring new; int special; /* set when a wildcard is found */ int result = 0; const char *obrace, *cbrace, *ptr; dstring_init(&new); special = 0; obrace = cbrace = NULL; // Check for {....}, \ *[? for (ptr = rem; *ptr && (obrace || *ptr != '/'); ++ptr) { switch (*ptr) { case '{': if (!obrace) obrace = ptr; break; case '}': if (obrace && !cbrace) cbrace = ptr; break; case '\\': if (*++ptr == 0) --ptr; case '*': case '[': case '?': special = 1; break; } } // for if (obrace) return glob_braces(rec, list, dir, rem, obrace, cbrace, &new); if (dstring_append(&new, dir, -1)) /* start with current directory */ { dstring_free(&new); return -1; } if (special) return glob_special(rec, list, dir, rem, &new, ptr); /* ptr now points to '/' glob_subdir */ if (dstring_append(&new, rem, ptr - rem) == -1) result = -1; else { if (*ptr) { if (dstring_append(&new, "/", 1) == -1) result = -1; else result = doglob(rec, list, dstring_string(&new), ptr + 1); dstring_free(&new); return result; } result = dlist_append(list, dstring_string(&new)); } dstring_free(&new); return result; } /* * NAME: hfs->glob() * DESCRIPTION: perform glob pattern matching * * argc number of patterns to match. * argv the patterns. * return array of strings containing the matches, must be free()d. * *netls contains number of elements in returned array. */ char **hfsp_glob(record *rec, int argc, char *argv[], int *nelts) { dlist list; // accumulate the matches here int i; if (dlist_init(&list) == -1) return 0; for (i = 0; i < argc; ++i) { if (doglob(rec, &list, "", argv[i]) == -1) { dlist_free(&list); return 0; } } *nelts = dlist_size(&list); return dlist_array(&list); } hfsplus-1.0.4/src/glob.h0100644000000000000000000000212607441220605013563 0ustar rootroot/* * hfsutils - tools for reading and writing Macintosh HFS volumes * Copyright (C) 1996-1998 Robert Leslie * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: glob.h,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ /* match argc arguments found in args (containing wildcards) * in the directory specified by rec, returs pointer to * count strings containing the matched values */ char **hfsp_glob(record* rec, int argc, char* args[], int* count); hfsplus-1.0.4/src/hfsputil.c0100644000000000000000000002003507441220605014470 0ustar rootroot/* * hfsputils - tools for reading and writing Macintosh HFS+ volumes * * generic utilities for the hfsplus tools. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: hfsputil.c,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # include # include # include # include # include # include # include # ifdef HAVE_UNISTD_H # include # else char *getcwd(char *buf, size_t size); # endif # include "libhfsp.h" # include "hfsputil.h" # include "glob.h" const char *argv0, *bargv0; /* * NAME: main() * DESCRIPTION: dispatch command to the supported tools */ /* int main(int argc, char *argv[]) { int i, len; const char *dot; struct { const char *name; int (*func)(int, char *[]); } list[] = { { "hattrib", hattrib_main }, { "hcd", hcd_main }, { "hcopy", hcopy_main }, { "hdel", hdel_main }, { "hdir", hls_main }, { "hformat", hformat_main }, { "hls", hls_main }, { "hmkdir", hmkdir_main }, { "hmount", hmount_main }, { "hpwd", hpwd_main }, { "hrename", hrename_main }, { "hrmdir", hrmdir_main }, { "humount", humount_main }, { "hvol", hvol_main }, { 0, 0 } }; suid_init(); if (argc == 2) { if (strcmp(argv[1], "--version") == 0) { printf("%s - %s\n", hfsputils_version, hfsputils_copyright); printf("`%s --license' for licensing information.\n", argv[0]); return 0; } else if (strcmp(argv[1], "--license") == 0) { printf("\n%s", hfsputils_license); return 0; } } argv0 = argv[0]; bargv0 = strrchr(argv0, '/'); if (!bargv0) bargv0 = argv0; else ++bargv0; dot = strchr(bargv0, '.'); len = dot ? dot - bargv0 : strlen(bargv0); for (i = 0; list[i].name; ++i) { // might use gperf here (as an exercise :) if (strncmp(bargv0, list[i].name, len) == 0) { int result; bargv0 = list[i].name; if (hcwd_init() == -1) { perror("Failed to initialize HFS working directories"); return 1; } result = list[i].func(argc, argv); if (hcwd_finish() == -1) { perror("Failed to save working directory state"); return 1; } return result; } } fprintf(stderr, "%s: Unknown operation `%s'\n", argv0, bargv0); return 1; } */ /* * NAME: hfsputil->perror() * DESCRIPTION: output an HFS error */ void hfsputil_perror(const char *msg) { const char *str = strerror(errno); if (!hfsp_error) fprintf(stderr, "%s: %s: %c%s\n", argv0, msg, *str, str + 1); else fprintf(stderr, "%s: %s: %s (%s)\n", argv0, msg, hfsp_error, str); } /* * NAME: hfsputil->perrorp() * DESCRIPTION: output an HFS error for a pathname */ void hfsputil_perrorp(const char *path) { const char *str = strerror(errno); if (!hfsp_error) fprintf(stderr, "%s: \"%s\": %c%s\n", argv0, path, *str, str + 1); else fprintf(stderr, "%s: \"%s\": %s (%s)\n", argv0, path, hfsp_error, str); } /* * NAME: hfsputil->remount() * DESCRIPTION: mount a volume as though it were still mounted */ /* hfsvol *hfsputil_remount(mountent *ment, int flags) { hfsvol *vol; hfsvolent vent; if (ment == 0) { fprintf(stderr, "%s: No volume is current; use `hmount' or `hvol'\n", argv0); return 0; } suid_enable(); vol = hfs_mount(ment->path, ment->partno, flags); suid_disable(); if (vol == 0) { hfsputil_perror(ment->path); return 0; } hfs_vstat(vol, &vent); if (strcmp(vent.name, ment->vname) != 0) { fprintf(stderr, "%s: Expected volume \"%s\" not found\n", argv0, ment->vname); fprintf(stderr, "%s: Replace media on %s or use `hmount'\n", argv0, ment->path); hfs_umount(vol); return 0; } if (hfs_chdir(vol, ment->cwd) == -1) { fprintf(stderr, "%s: Current HFS directory \"%s%s:\" no longer exists\n", argv0, ment->vname, ment->cwd); } return vol; } */ /* * NAME: hfsputil->unmount() * DESCRIPTION: wrap the unmount operation with an error handler. */ /* void hfsputil_unmount(volume *vol, int *result) { if (volume_umount(vol) && *result == 0) { hfsputil_perror("Error closing HFS+ volume"); *result = 1; } } */ /* * NAME: hfsputil->pinfo() * DESCRIPTION: print information about a volume */ /* void hfsputil_pinfo(hfsvolent *ent) { printf("Volume name is \"%s\"%s\n", ent->name, (ent->flags & HFS_ISLOCKED) ? " (locked)" : ""); printf("Volume was created on %s", ctime(&ent->crdate)); printf("Volume was last modified on %s", ctime(&ent->mddate)); printf("Volume has %lu bytes free\n", ent->freebytes); } */ /* * NAME: hfsputil->glob() * DESCRIPTION: perform filename globbing */ char **hfsputil_glob(record *rec, int argc, char *argv[], int *nelts, int *result) { char **fargv; fargv = hfsp_glob(rec, argc, argv, nelts); if (fargv == 0 && *result == 0) { fprintf(stderr, "%s: globbing error\n", argv0); *result = 1; } return fargv; } /* * NAME: hfsputil->getcwd() * DESCRIPTION: return full path to current directory (must be free()'d) */ /* char *hfsputil_getcwd(record *rec) { char *path, name[HFS_MAX_FLEN + 1 + 1]; long cwd; int pathlen; path = malloc(1); path[0] = 0; pathlen = 0; cwd = hfs_getcwd(vol); while (cwd != HFS_CNID_ROOTPAR) { char *new; int namelen, i; if (hfs_dirinfo(vol, &cwd, name) == -1) return 0; if (pathlen) strcat(name, ":"); namelen = strlen(name); new = realloc(path, namelen + pathlen + 1); if (new == 0) { free(path); ERROR(ENOMEM, 0); return 0; } if (pathlen == 0) new[0] = 0; path = new; / * push string down to make room for path prefix (memmove()-ish) * / i = pathlen + 1; for (new = path + namelen + pathlen; i--; new--) *new = *(new - namelen); memcpy(path, name, namelen); pathlen += namelen; } return path; } */ /* * NAME: hfsputil->samepath() * DESCRIPTION: return 1 iff paths refer to same object */ int hfsputil_samepath(const char *path1, const char *path2) { struct stat sbuf1, sbuf2; return stat(path1, &sbuf1) == 0 && stat(path2, &sbuf2) == 0 && sbuf1.st_dev == sbuf2.st_dev && sbuf1.st_ino == sbuf2.st_ino; } /* * NAME: hfsputil->abspath() * DESCRIPTION: make given UNIX path absolute (must be free()'d) */ char *hfsputil_abspath(const char *path) { char *cwd, *buf; size_t len; if (path[0] == '/') return strdup(path); cwd = getenv("PWD"); if (cwd && hfsputil_samepath(cwd, ".")) { buf = malloc(strlen(cwd) + 1 + strlen(path) + 1); if (buf == 0) return 0; strcpy(buf, cwd); } else { len = 32; cwd = malloc(len); if (cwd == 0) return 0; while (getcwd(cwd, len) == 0) { if (errno != ERANGE) { free(cwd); return 0; } len <<= 1; buf = realloc(cwd, len); if (buf == 0) { free(cwd); return 0; } cwd = buf; } buf = realloc(cwd, strlen(cwd) + 1 + strlen(path) + 1); if (buf == 0) { free(cwd); return 0; } } strcat(buf, "/"); strcat(buf, path); return buf; } hfsplus-1.0.4/src/hfsputil.h0100644000000000000000000000321707441220605014500 0ustar rootroot/* * hfsutils - tools for reading and writing Macintosh HFS volumes * * Utility functions for HFS+ and linux files. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: hfsputil.h,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ extern int errno; extern const char *argv0, *bargv0; /* output an HFS error */ void hfsputil_perror(const char *); /* output an HFS error for a pathname */ void hfsputil_perrorp(const char *); // hfsvol *hfsputil_remount(mountent *, int); // void hfsputil_unmount(volume *, int *); // void hfsputil_pinfo(hfspvolent *); char **hfsputil_glob(record *root, int, char *[], int *, int *); // char *hfsputil_getcwd(volume *); /* return 1 iff paths refer to same object */ int hfsputil_samepath(const char *, const char *); /* make given UNIX path absolute (must be free()'d) */ char* hfsputil_abspath (const char *); hfsplus-1.0.4/src/hp.txt0100644000000000000000000000010607441220605013633 0ustar rootrootaa1aaa aa2aaa aa3aaa aa4aaa aa5aaa aa6aaa aa7aaa aa8aaa aa9aaa aaAaaa hfsplus-1.0.4/src/hpcache.c0100644000000000000000000001152407444577516014253 0ustar rootroot/* * hfsputils - tools for reading and writing Macintosh HFS volumes * * The structure defined here is saved in the users home directory * to cache the status of the HFS+ access. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: hpcache.c,v 1.3 2002/03/16 08:16:14 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # include # include # include # include # include #include "libhfsp.h" #include "volume.h" #include "btree.h" #include "record.h" #include "hpcache.h" #define CACHE_NAME ".hfsplusvolume" typedef struct { char vname[255]; /* name of the original opened device. */ UInt32 cnid; /* node od of the current directory. */ int partition; /* partition actually mounted (0 -> dont check for partitions) */ } hpcache; static hpcache volume_cache; /* return the filename of the file in the users home directory. * * result must be freed(); */ static char* hpcache_filename() { char *home, *path; home = getenv("HOME"); if (!home) home = ""; path = malloc(strlen(home) + 1 + sizeof(CACHE_NAME)); if (path) { strcpy(path, home); strcat(path, "/" CACHE_NAME); } return path; } /* open the file in the user home directory */ static FILE* hpcache_openfile(char* mode) { char* path = hpcache_filename(); FILE* fd = NULL; if (path) { fd = fopen(path, mode); free(path); } return fd; } /* read the cached value and put it into the static variable */ static int hpcache_read() { FILE* fd = hpcache_openfile("r"); int params; /* Number of parameters read by fscanf */ if (!fd) { hfsp_error = "Unable to read file for cached Volume information."; return -1; } params = fscanf(fd, "%255[^:]:%lu:%u", volume_cache.vname, &volume_cache.cnid, &volume_cache.partition); if (params < 2) { hfsp_error = "Failure while reading " CACHE_NAME; return -1; } else if (params == 2) /* old format */ volume_cache.partition = 0; /* ignore partitions in this case */ fclose(fd); return 0; } /* write the cached value to the users home directory. */ static int hpcache_write() { FILE* fd = hpcache_openfile("w+"); if (!fd) { hfsp_error = "Unable to create file for cached Volume information."; return -1; } fprintf(fd, "%s:%lu:%u", volume_cache.vname, volume_cache.cnid, volume_cache.partition); return 0; } /* call volume_open etc. and set the record to the volumes record * * partition open given partition number (if possible) * 0 - do not look for partition(s) at all. * -1 - take whatever partition is found * >0 - take given partion * openMode, one of HFSP_MODE_RDONLY, HFSP_MODE_RDWR */ int hpcache_open(volume* vol, record* rec, char* devicename, int partition, int openMode) { if (volume_open(vol, devicename, partition, openMode)) return -1; if (record_init_root(rec, &vol->catalog)) return -1; strncpy(volume_cache.vname, devicename, 255); // This is ok because this is the folder thread ... volume_cache.cnid = HFSP_ROOT_CNID; volume_cache.partition = partition; return hpcache_write(); } /* call volume_open etc. and set the record to the last used folder * * openMode, one of HFSP_MODE_RDONLY, HFSP_MODE_RDWR */ int hpcache_reopen(volume* vol, record* rec, int openMode) { if (hpcache_read()) return -1; if (volume_open(vol, volume_cache.vname, volume_cache.partition, openMode)) return -1; if (record_init_cnid(rec, &vol->catalog, volume_cache.cnid)) return -1; return 0; } /* Set the current folder to the given CNID */ int hpcache_cwd(UInt32 cnid) { volume_cache.cnid = cnid; return hpcache_write(); } /* destroy the file identifying the cache, You still must close volume_close yourself. */ int hpcache_destroy() { char* path = hpcache_filename(); int result = unlink(path); if (result) hfsp_error = "Error while destroying " CACHE_NAME; free(path); return result; } hfsplus-1.0.4/src/hpcache.h0100644000000000000000000000353507442720467014254 0ustar rootroot/* * hfsputils - tools for reading and writing Macintosh HFS volumes * * The structure defined here is saved in the users home directory * to cache the status of the HFS+ access. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: hpcache.h,v 1.2 2002/03/10 18:08:55 klaus Exp $ */ /* call volume_open etc. and set the record to the volumes record * * partition open given partition number (if possible) * 0 - do not look for partition(s) at all. * -1 - take whatever partition is found * >0 - take given partion * openMode, one of HFSP_MODE_RDONLY, HFSP_MODE_RDWR */ extern int hpcache_open(volume* vol, record* rev, char* devicename, int partition, int openMode); /* call volume_open etc. and set the record to the last used folder * * openMode, one of HFSP_MODE_RDONLY, HFSP_MODE_RDWR */ extern int hpcache_reopen(volume* vol, record* rev, int openMode); /* Set the current folder to the given CNID */ extern int hpcache_cwd(UInt32 cnid); /* Delete the information collected by _open */ extern int hpcache_destroy(); hfsplus-1.0.4/src/hpcd.c0100644000000000000000000000570507447065515013574 0ustar rootroot/* * hfsputils - tools for reading and writing Macintosh HFS+ volumes * * This program allows to change the "current" directory remembered * by the set of hp... tools. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: hpcd.c,v 1.2 2002/03/23 11:47:25 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # include # include # include # include "libhfsp.h" # include "record.h" # include "volume.h" # include "hpcache.h" # include "hfsputil.h" /* * NAME: hpcd->main() * DESCRIPTION: implement hcd command */ int main(int argc, char *argv[]) { volume vol; record old,new; char *path = "."; int fargc; char **fargv = 0; int result = 0; argv0 = argv[0]; if (argc > 2) { fprintf(stderr, "Usage: %s [hfs-path]\n", argv0); return 1; } if (hpcache_reopen(&vol,&old,HFSP_MODE_RDONLY)) goto fail; if (argc == 2) { fargv = hfsputil_glob(&old, 1, &argv[1], &fargc, &result); if (result == 0) { if (fargc != 1) { fprintf(stderr, "%s: %s: ambiguous path\n", argv0, argv[1]); result = 1; } else path = fargv[0]; } } /* todo: Schleife einbauen, die durch die Pfadtrenner iteriert */ if (result == 0) { if (path[0] == '.' && path[1] == '.') // == '..' { new = old; result = record_up(&new); if (result) hfsputil_perror(argv0); } else { result = record_init_string_parent(&new, &old, path); if (result) hfsputil_perror(argv0); else if (new.record.type != HFSP_FOLDER) { fprintf(stderr, "%s: %s is not a directory\n", argv0, path); result = 1; } } } if (result == 0) { if (new.record.type == HFSP_FOLDER) hpcache_cwd(new.record.u.folder.id); else if (new.record.type == HFSP_FOLDER_THREAD) hpcache_cwd(new.key.parent_cnid); else { fprintf(stderr, "%s: %s is not a directory\n", argv0, path); result = 1; } } if (fargv) free(fargv); result = volume_close(&vol) || result; return result; fail: hfsputil_perror(argv[0]); return result; } hfsplus-1.0.4/src/hpcopy.c0100644000000000000000000001540107441220605014135 0ustar rootroot/* * hfsputils - tools for reading and writing Macintosh HFS+ volumes * * This program allows to copy files from a HFS+ volume. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: hpcopy.c,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # ifdef HAVE_UNISTD_H # include # endif # include # include # include # include # include # include "libhfsp.h" # include "volume.h" # include "record.h" # include "hfsputil.h" # include "hpcache.h" // # include "copyin.h" Sorry, not yet # include "copyout.h" extern int optind; /* * NAME: automode_unix() * DESCRIPTION: automatically choose copyin transfer mode for UNIX path */ /* not yet static cpifunc automode_unix(const char *path) { int i; struct { const char *ext; cpifunc func; } exts[] = { { ".bin", cpi_macb }, { ".hqx", cpi_binh }, { ".txt", cpi_text }, { ".c", cpi_text }, { ".h", cpi_text }, { ".html", cpi_text }, { ".htm", cpi_text }, { ".rtf", cpi_text }, { 0, 0 } }; path += strlen(path); for (i = 0; exts[i].ext; ++i) { if (strcasecmp(path - strlen(exts[i].ext), exts[i].ext) == 0) return exts[i].func; } return cpi_raw; } */ /* * NAME: do_copyin() * DESCRIPTION: copy files from UNIX to HFS */ /* Sorry not in use by now ... static int do_copyin(record *rec, int argc, char *argv[], const char *dest, int mode) { hfsdirent ent; struct stat sbuf; cpifunc copyfile; int i, result = 0; if (argc > 1 && (hfs_stat(vol, dest, &ent) == -1 || ! (ent.flags & HFS_ISDIR))) { HFSP_ERROR(ENOTDIR, 0); hfsutil_perrorp(dest); return 1; } switch (mode) { case 'm': copyfile = cpi_macb; break; case 'b': copyfile = cpi_binh; break; case 't': copyfile = cpi_text; break; case 'r': copyfile = cpi_raw; break; } for (i = 0; i < argc; ++i) { if (stat(argv[i], &sbuf) != -1 && S_ISDIR(sbuf.st_mode)) { HFSP_ERROR(EISDIR, 0); hfsutil_perrorp(argv[i]); result = 1; } else { if (mode == 'a') copyfile = automode_unix(argv[i]); if (copyfile(argv[i], vol, dest) == -1) { HFSP_ERROR(errno, cpi_error); hfsutil_perrorp(argv[i]); result = 1; } } } return result; } */ /* * NAME: automode_hfs() * DESCRIPTION: automatically choose copyout transfer mode for HFS path */ static cpofunc automode_hfs(record *rec) { if (rec->record.type == HFSP_FILE) { hfsp_cat_file* file = &rec->record.u.file; char *type = (char*)&file->user_info.fdType; if (!strcmp(type, "TEXT") || !strcmp(type, "ttro")) return copyout_text; else if (file->res_fork.total_size == 0) // no resourcefork, well return copyout_raw; } return copyout_macb; } /* * NAME: do_copyout() * DESCRIPTION: copy files from HFS+ to UNIX */ static int do_copyout(record *rec, int argc, char *argv[], const char *dest, int mode) { struct stat sbuf; cpofunc copyfile; int i, result = 0; if (argc > 1 && (stat(dest, &sbuf) == -1 || ! S_ISDIR(sbuf.st_mode))) HFSP_ERROR(ENOTDIR, 0); switch (mode) { case 'm': copyfile = copyout_macb; break; case 'b': copyfile = copyout_binh; break; case 't': copyfile = copyout_text; break; case 'r': copyfile = copyout_raw; break; case 'a': // auto copyfile will be assigen per file copyfile = NULL; break; default: copyfile = NULL; HFSP_ERROR(-1, "Unexpected case"); } for (i = 0; i < argc; ++i) { record file; char* argi = argv[i]; if ( record_init_string_parent( &file, rec, argi) || (file.record.type != HFSP_FILE)) { hfsputil_perrorp(argi); HFSP_ERROR(EISDIR, 0); } else { if (mode == 'a') copyfile = automode_hfs(&file); if (copyfile(&file, dest)) { hfsputil_perrorp(argi); HFSP_ERROR(errno, copyout_error); result = 1; } } } return result; fail: return -1; } /* * NAME: usage() * DESCRIPTION: display usage message */ static int usage(void) { printf("Usage: %s [-m|-b|-t|-r|-a] source-path [...] target-path\n", argv0); printf( " -m MacBinary II: A popular format for binary file transfer.\n" " Both forks of the Macintosh file are preserved. This is the\n" " recommended mode for transferring arbitrary Macintosh files.\n" "\n" " -b BinHex: An alternative format for ASCII file transfer. \n" " Both forks of the Macintosh file are preserved.\n" "\n" " -t Text: Performs end-of-line translation.\n" " Only the data fork of the Macintosh file is copied.\n" "\n" " -r Raw Data: Performs no translation.\n" " Only the data fork of the Macintosh file is copied.\n" "\n" " -a Automatic: A mode will be chosen automatically for each file\n" " based on a set of predefined heuristics.\n"); return 1; } /* * NAME: hcopy->main() * DESCRIPTION: implement hcopy command */ int main(int argc, char *argv[]) { volume vol; record rec; int nargs, mode = 'a', result = 0; const char *target; int fargc; char **fargv; int (*copy)(record*, int, char *[], const char *, int); argv0 = argv[0]; while (1) { int opt; opt = getopt(argc, argv, "mbtra"); if (opt == EOF) break; switch (opt) { case '?': return usage(); default: mode = opt; } } nargs = argc - optind; if (nargs < 2) return usage(); target = argv[argc - 1]; if (hpcache_reopen(&vol,&rec,HFSP_MODE_RDONLY)) goto fail; copy = do_copyout; fargv = hfsputil_glob(&rec, nargs - 1, &argv[optind], &fargc, &result); if (!result) result = copy(&rec, fargc, fargv, target, mode); result = volume_close(&vol) || result; if (fargv && fargv != &argv[optind]) free(fargv); if (result) hfsputil_perrorp(argv0); return result; fail: hfsputil_perrorp(argv0); return -1; } hfsplus-1.0.4/src/hpfsck.c0100644000000000000000000000431607441220605014114 0ustar rootroot/* * hfsputils - tools for reading and writing Macintosh HFS+ volumes * * User command for cehcking filesystems, lik fsck * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: hpfsck.c,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # ifdef HAVE_UNISTD_H # include # endif #include # include "libhfsp.h" # include "fscheck.h" # include "hfsputil.h" /* * NAME: usage() * DESCRIPTION: display usage message */ static int usage(void) { printf("Usage: %s [-v] [-i] device\n", argv0); printf("\t-v Be more verbose\n"); printf("\t-i Ignore errors (default stop after first error)\n"); return 1; } extern int optind; /* * NAME: hpfsck->main() * DESCRIPTION: implement hpfsck command */ int main(int argc, char *argv[]) { int mode = HFSPCHECK_NORMAL; char *device; int nargs, result; argv0 = argv[0]; while (1) { int opt; opt = getopt(argc, argv, "vi"); if (opt == EOF) break; switch (opt) { case '?': return usage(); case 'v': mode |= HFSPCHECK_VERBOSE; break; case 'i': mode |= HFSPCHECK_IGNOREERR; break; } } nargs = argc - optind; if (nargs != 1) return usage(); device = argv[argc - 1]; result = maximum_check(device, mode); if (result != FSCK_NOERR) hfsputil_perror(argv[0]); return result; } hfsplus-1.0.4/src/hpls.c0100644000000000000000000005210707445150147013614 0ustar rootroot/* * hfsputils - tools for reading and writing Macintosh HFS+ volumes * * implement a ls simliar to standard linux ls for HFS+ * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: hpls.c,v 1.2 2002/03/17 17:20:39 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # ifdef HAVE_UNISTD_H # include # endif # ifdef HAVE_TERMIOS_H # include # endif # ifdef HAVE_SYS_IOCTL_H # include # else int ioctl(int, int, ...); # endif # include # include # include # include # include # include # include "libhfsp.h" # include "record.h" # include "hfstime.h" # include "volume.h" # include "unicode.h" #include "darray.h" #include "dlist.h" #include "dstring.h" #include "hpcache.h" #include "hfsputil.h" # define HPLS_ALL_FILES 0x0001 # define HPLS_ESCAPE 0x0002 # define HPLS_QUOTE 0x0004 # define HPLS_QMARK_CTRL 0x0008 # define HPLS_IMMEDIATE_DIRS 0x0010 # define HPLS_CATIDS 0x0020 # define HPLS_REVERSE 0x0040 # define HPLS_SIZE 0x0080 # define HPLS_INDICATOR 0x0100 # define HPLS_RECURSIVE 0x0200 # define HPLS_NAME 0x0400 # define HPLS_SPACE 0x0800 # define F_MASK 0x0007 # define F_LONG 0x0000 # define F_ONE 0x0001 # define F_MANY 0x0002 # define F_HORIZ 0x0003 # define F_COMMAS 0x0004 # define T_MASK 0x0008 # define T_MOD 0x0000 # define T_CREATE 0x0008 # define S_MASK 0x0030 # define S_NAME 0x0000 # define S_TIME 0x0010 # define S_SIZE 0x0020 typedef struct _queueent_ { char *path; record dirent; void (*free)(struct _queueent_ *); } queueent; extern char *optarg; extern int optind; /* * NAME: usage() * DESCRIPTION: display usage message */ static int usage() { fprintf(stderr, "Usage: %s [options] [hfs-path ...]\n", argv0); return 1; } /* * NAME: dpfree() * DESCRIPTION: free a queue entry containing dynamically-allocated data */ static inline void dpfree(queueent *ent) { free(ent->path); } /* * NAME: qnew() * DESCRIPTION: create a new queue array */ inline static int qnew(darray* da) { return darray_new(da, sizeof(queueent)); } /* * NAME: qfree() * DESCRIPTION: free a queue array */ static void qfree(darray *array) { int i, sz; queueent *ent; sz = darray_size(array); ent = (queueent*) darray_array(array); for (i = 0; i < sz; ++i,ent++) { if (ent->free) ent->free((void*) ent); } darray_free(array); } static int reverse; /* * NAME: compare_names() * DESCRIPTION: lexicographically compare two filenames */ static int compare_names(const queueent *ent1, const queueent *ent2) { return reverse ^ strcasecmp(ent1->path, ent2->path); } /* * NAME: compare_mtimes() * DESCRIPTION: chronologically compare two modification dates */ static int compare_mtimes(const queueent *ent1, const queueent *ent2) { return reverse ^ (ent2->dirent.record.u.file.content_mod_date - ent1->dirent.record.u.file.content_mod_date); } /* * NAME: compare_ctimes() * DESCRIPTION: chronologically compare two creation dates */ static int compare_ctimes(const queueent *ent1, const queueent *ent2) { return reverse ^ (ent2->dirent.record.u.file.create_date - ent1->dirent.record.u.file.create_date); } /* * NAME: compare_sizes() * DESCRIPTION: compare two file sizes */ static int compare_sizes(const queueent *ent1, const queueent *ent2) { UInt64 size1 = 0, size2 = 0; const hfsp_cat_file *f1, *f2; if (ent1->dirent.record.type == HFSP_FILE) { f1 = &ent1->dirent.record.u.file; size1 = f1->data_fork.total_size + f1->res_fork.total_size; } if (ent2->dirent.record.type == HFSP_FILE) { f2= &ent1->dirent.record.u.file; size2 = f2->data_fork.total_size + f2->res_fork.total_size; } // Cant use size2-size1 since sizeof(UInt64) > sizeof(int) (usually :) if (size1 > size2) return reverse; else if (size2 < size1) return -reverse; return 0; } /* * NAME: sortfiles() * DESCRIPTION: arrange files in order according to sort selection */ static void sortfiles(darray *files, int flags, int options) { int (*compare)(const queueent *, const queueent *); switch (options & S_MASK) { case S_NAME: compare = compare_names; break; case S_TIME: switch (options & T_MASK) { case T_MOD: compare = compare_mtimes; break; case T_CREATE: compare = compare_ctimes; break; default: abort(); } break; case S_SIZE: compare = compare_sizes; break; default: return; } reverse = (flags & HPLS_REVERSE) ? -1 : 1; darray_sort(files, (int (*)(const void *, const void *)) compare); } /* Escape a character when needed */ static char* escape_char(unsigned char c, char buf[]) { char *add = buf; buf[0] = '\0'; // just in case ... switch (c) { case '\\': add = "\\\\"; break; case '\n': add = "\\n"; break; case '\b': add = "\\b"; break; case '\r': add = "\\r"; break; case '\t': add = "\\t"; break; case '\f': add = "\\f"; break; case ' ': add = "\\ "; break; case '\"': add = "\\\""; break; default: if (isgraph(c)) *add = c; else sprintf(buf, "\\%03o", c); } return add; } /* * NAME: outpath() * DESCRIPTION: modulate an output string given current flags */ static int outpath(dstring *str, queueent *ent, int flags) { const char *path; path = ent->path; dstring_shrink(str, 0); if ((flags & HPLS_QUOTE) && dstring_append(str, "\"", 1) == -1) return -1; if (flags & (HPLS_ESCAPE | HPLS_QUOTE | HPLS_QMARK_CTRL)) { const unsigned char *ptr; for (ptr = path; *ptr; ++ptr) { char buf[5]; const char *add = buf; if (flags & HPLS_ESCAPE) add = escape_char(*ptr, buf); else /* ! (flags & HPLS_ESCAPE) */ { if (isprint(*ptr) || ! (flags & HPLS_QMARK_CTRL)) { sprintf(buf, "%c", *ptr); add = buf; } else { sprintf(buf, "?"); add = buf; } } if (dstring_append(str, add, -1) == -1) return -1; } } else // ! (HPLS_ESCAPE | HPLS_QUOTE | HPLS_QMARK_CTRL) { if (dstring_append(str, path, -1) == -1) return -1; } if ((flags & HPLS_QUOTE) && dstring_append(str, "\"", 1) == -1) return -1; if (flags & HPLS_INDICATOR) { char c = 0; if (ent->dirent.record.type == HFSP_FOLDER) c = '/'; // Mmhh, actually there are others like "appe" "appl" "sysz" ... else if (!strncmp((char*)&ent->dirent.record.u.file.user_info.fdType, "APPL",4)) c = '*'; if (c && dstring_append(str, &c, 1) == -1) return -1; } return 0; } /* * NAME: misclen() * DESCRIPTION: string length of miscellaneous section */ static int misclen(int flags) { return ((flags & HPLS_CATIDS) ? 8 : 0) + ((flags & HPLS_SIZE) ? 5 : 0); } /* * NAME: showmisc() * DESCRIPTION: output miscellaneous numbers */ static void showmisc(record *ent, int flags) { UInt64 size; if (flags & HPLS_CATIDS) { if (ent->record.type < HFSP_FOLDER_THREAD) printf("%7lu ", ent->record.u.file.id); else printf("%7lu ", ent->record.u.thread.parentID); } if (flags & HPLS_SIZE && ent->record.type == HFSP_FILE) { size = ent->record.u.file.data_fork.total_size + ent->record.u.file.res_fork.total_size; printf("%4Lu ", size / 1024 + (size % 1024 != 0)); } } /* * NAME: show_long() * DESCRIPTION: output a list of files in long format */ static void show_long(int sz, queueent *ents, char **strs, int flags, int options, int width) { int i; time_t now; now = time(0); for (i = 0; i < sz; ++i) { record *ent = &ents[i].dirent; time_t when; char timebuf[26]; int isThread; showmisc(ent, flags); isThread = ent->record.type >= HFSP_FOLDER_THREAD; timebuf[0] = 0; // Only files / folders have time fields if (!isThread) { switch (options & T_MASK) { case T_MOD: when = ent->record.u.file.content_mod_date; break; case T_CREATE: when = ent->record.u.file.create_date; break; default: abort(); } when -= HFSPTIMEDIFF; strcpy(timebuf, ctime(&when)); if (now > when + 6L * 30L * 24L * 60L * 60L || now < when - 60L * 60L) strcpy(timebuf + 11, timebuf + 19); timebuf[16] = 0; } if (ent->record.type == HFSP_FOLDER) { hfsp_cat_folder* f = &ent->record.u.folder; printf("d%c %9lu item%c %s %s\n", f->user_info.frFlags & HFS_FNDR_ISINVISIBLE ? 'i' : ' ', f->valence, f->valence == 1 ? ' ' : 's', timebuf + 4, strs[i]); } else if (ent->record.type == HFSP_FILE) { hfsp_cat_file* f = &ent->record.u.file; printf("%c%c %4.4s/%4.4s %9Lu %9Lu %s %s\n", f->flags & HFSP_FILE_LOCKED ? 'F' : 'f', f->user_info.fdFlags & HFS_FNDR_ISINVISIBLE ? 'i' : ' ', (char*) &f->user_info.fdType, (char*) &f->user_info.fdCreator, f->data_fork.total_size, f->res_fork.total_size, timebuf + 4, strs[i]); } else // Thread { printf(" Thread %s\n", strs[i]); } } } /* * NAME: show_one() * DESCRIPTION: output a list of files in single-column format */ static void show_one(int sz, queueent *ents, char **strs, int flags, int options, int width) { int i; for (i = 0; i < sz; ++i) { showmisc(&ents[i].dirent, flags); printf("%s\n", strs[i]); } } /* * NAME: show_many() * DESCRIPTION: output a list of files in vertical-column format */ static void show_many(int sz, queueent *ents, char **strs, int flags, int options, int width) { int i, len, misc, maxlen = 0, rows, cols, row; misc = misclen(flags); for (i = 0; i < sz; ++i) { len = strlen(strs[i]) + misc; if (len > maxlen) maxlen = len; } maxlen += 2; cols = width / maxlen; if (cols == 0) cols = 1; rows = sz / cols + (sz % cols != 0); for (row = 0; row < rows; ++row) { i = row; while (1) { showmisc(&ents[i].dirent, flags); printf("%s", strs[i]); i += rows; if (i >= sz) break; for (len = strlen(strs[i - rows]) + misc; len < maxlen; ++len) putchar(' '); } putchar('\n'); } } /* * NAME: show_horiz() * DESCRIPTION: output a list of files in horizontal-column format */ static void show_horiz(int sz, queueent *ents, char **strs, int flags, int options, int width) { int i, len, misc, maxlen = 0, cols; misc = misclen(flags); for (i = 0; i < sz; ++i) { len = strlen(strs[i]) + misc; if (len > maxlen) maxlen = len; } maxlen += 2; cols = width / maxlen; if (cols == 0) cols = 1; for (i = 0; i < sz; ++i) { if (i) { if (i % cols == 0) putchar('\n'); else { for (len = strlen(strs[i - 1]) + misc; len < maxlen; ++len) putchar(' '); } } showmisc(&ents[i].dirent, flags); printf("%s", strs[i]); } if (i) putchar('\n'); } /* * NAME: show_commas() * DESCRIPTION: output a list of files in comma-delimited format */ static void show_commas(int sz, queueent *ents, char **strs, int flags, int options, int width) { int i, pos = 0; for (i = 0; i < sz; ++i) { record *ent = &ents[i].dirent; int len = strlen(strs[i]) + misclen(flags) + ((i < sz - 1) ? 2 : 0); if (pos && pos + len >= width) { putchar('\n'); pos = 0; } showmisc(ent, flags); printf("%s", strs[i]); if (i < sz - 1) { putchar(','); putchar(' '); } pos += len; } if (pos) putchar('\n'); } /* * NAME: showfiles() * DESCRIPTION: display a set of files */ static int showfiles(darray *files, int flags, int options, int width) { dlist list; int i, sz, result = 0; queueent *ents; dstring str; char **strs; void (*show)(int, queueent *, char **, int, int, int); if (dlist_init(&list) == -1) { fprintf(stderr, "%s: not enough memory\n", argv0); return -1; } sz = darray_size(files); ents = (queueent*) darray_array(files); dstring_init(&str); for (i = 0; i < sz; ++i) { if (outpath(&str, &ents[i], flags) == -1 || dlist_append(&list, dstring_string(&str)) == -1) { result = -1; break; } } dstring_free(&str); strs = (char**) dlist_array(&list); switch (options & F_MASK) { case F_LONG: show = show_long; break; case F_ONE: show = show_one; break; case F_MANY: show = show_many; break; case F_HORIZ: show = show_horiz; break; case F_COMMAS: show = show_commas; break; default: abort(); } show(sz, ents, strs, flags, options, width); dlist_free(&list); return result; } /* * NAME: process() * DESCRIPTION: sort and display results */ static int process(darray *dirs, darray *files, int flags, int options, int width) { int i; queueent *ents; int result = 0; int fsz = darray_size(files); int dsz = darray_size(dirs); if (fsz) { sortfiles(files, flags, options); if (showfiles(files, flags, options, width) == -1) result = -1; flags |= HPLS_NAME | HPLS_SPACE; } else if (dsz > 1) flags |= HPLS_NAME; ents = (queueent*) darray_array(dirs); for (i = 0; i < dsz; ++i) // for all directories { record *path; queueent *ent, newent; record *dir; UInt16 type; ent = &ents[i]; dir = &newent.dirent; path = &ent->dirent; type = path->record.type; /* Supress '.' or invisible files */ if ( (type == HFSP_FILE || type == HFSP_FOLDER) && (path->record.u.folder.user_info.frFlags & HFS_FNDR_ISINVISIBLE) && ! (flags & HPLS_ALL_FILES)) continue; // glob does not remove all invisible files/folders darray_shrink(files, 0); // reset file list if (record_init_parent(dir, path)) { hfsputil_perrorp(ent->path); result = -1; continue; } do // for all files in directory { dstring name; // String to create filenames in char buf[255]; int len; type = dir->record.type; len = 0; // just in case if (type == HFSP_FILE_THREAD) continue; // dont know how to work with that by now if (type == HFSP_FOLDER_THREAD) { if (!(flags & HPLS_ALL_FILES)) continue; // emulate '.' buf [0] = '.'; buf[1] = '\0'; len = 1; } else // FILE or Folder { if ((dir->record.u.folder.user_info.frFlags & HFS_FNDR_ISINVISIBLE) && ! (flags & HPLS_ALL_FILES)) continue; len = unicode_uni2asc(buf, &dir->key.name, 255); } newent.free = NULL; // insert to list of folders .. if ((type == HFSP_FOLDER) && (flags & HPLS_RECURSIVE)) { dstring spath; // String to append path to dstring_init(&spath); if (dstring_append(&spath, ent->path, -1)) result = -1; if (dstring_append(&spath, "/", 1)) result = -1; if (dstring_append(&spath, buf, -1) == -1) result = -1; newent.path = strdup(dstring_string(&spath)); if (newent.path) newent.free = dpfree; else result = -1; dstring_free(&spath); if (!darray_append(dirs, &newent)) { result = -1; if (newent.path) free(newent.path); } if (result) { fprintf(stderr, "%s: not enough memory\n", argv0); break; } dsz = darray_size(dirs); ents = (queueent*) darray_array(dirs); ent = &ents[i]; } dstring_init(&name); if (dstring_append(&name, buf, -1) == -1) result = -1; newent.path = strdup(dstring_string(&name)); if (newent.path) newent.free = dpfree; else result = -1; if (!darray_append(files, &newent)) { fprintf(stderr, "%s: not enough memory\n", argv0); result = -1; break; } } while (!result && !record_next(dir)); // for all files if (result) break; if (flags & HPLS_SPACE) printf("\n"); if (flags & HPLS_NAME) printf("%s:\n", ent->path); sortfiles(files, flags, options); if (showfiles(files, flags, options, width)) result = -1; flags |= HPLS_NAME | HPLS_SPACE; } // all directories return result; } /* * NAME: queuepath() * DESCRIPTION: append a file or directory to the list to process * * if name is NULL append the whole contents of the (directory/thread) root. */ static int queuepath(record* root, char *name, darray *dirs, darray *files, int flags) { queueent ent; darray *array; UInt16 type; /* Folder or File (Thread) */ if (name) { if (record_init_string_parent(&ent.dirent, root, name)) { hfsputil_perrorp(name); return (errno == ENOENT) ? 0 : -1; } } else ent.dirent = *root; type = ent.dirent.record.type; ent.path = name ? name : "."; ent.free = 0; array = ((type == HFSP_FOLDER || type == HFSP_FOLDER_THREAD) && ! (flags & HPLS_IMMEDIATE_DIRS)) ? dirs : files; if (darray_append(array, &ent) == 0) { fprintf(stderr, "%s: not enough memory\n", argv0); return -1; } return 0; } /* * NAME: hpls->main() * DESCRIPTION: implement hpls command */ int main(int argc, char *argv[]) { volume vol; record rec; int fargc, i; char **fargv = NULL; int result = 0; int flags, options, width; char *ptr; darray dirs, files; argv0 = argv[0]; options = T_MOD | S_NAME; if (isatty(STDOUT_FILENO)) { options |= F_MANY; flags = HPLS_QMARK_CTRL; } else { options |= F_ONE; flags = 0; } ptr = getenv("COLUMNS"); width = ptr ? atoi(ptr) : 80; # ifdef TIOCGWINSZ // Special handling for windows ? { struct winsize ws; if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) != -1 && ws.ws_col != 0) width = ws.ws_col; } # endif while (1) // scan all the arguments { int opt = getopt(argc, argv, "1abcdfilmqrstxw:CFNQRSU"); if (opt == EOF) break; switch (opt) { case '?': return usage(argv[0]); case '1': options = (options & ~F_MASK) | F_ONE; break; case 'a': flags |= HPLS_ALL_FILES; break; case 'b': flags |= HPLS_ESCAPE; flags &= ~HPLS_QMARK_CTRL; break; case 'c': options = (options & ~(T_MASK | S_MASK)) | T_CREATE | S_TIME; break; case 'd': flags |= HPLS_IMMEDIATE_DIRS; break; case 'f': flags |= HPLS_ALL_FILES; flags &= ~HPLS_SIZE; options &= ~S_MASK; if ((options & F_MASK) == F_LONG) options = (options & ~F_MASK) | (isatty(STDOUT_FILENO) ? F_MANY : F_ONE); break; case 'i': flags |= HPLS_CATIDS; break; case 'l': options = (options & ~F_MASK) | F_LONG; break; case 'm': options = (options & ~F_MASK) | F_COMMAS; break; case 'q': flags |= HPLS_QMARK_CTRL; flags &= ~HPLS_ESCAPE; break; case 'r': flags |= HPLS_REVERSE; break; case 's': flags |= HPLS_SIZE; break; case 't': options = (options & ~S_MASK) | S_TIME; break; case 'x': options = (options & ~F_MASK) | F_HORIZ; break; case 'w': width = atoi(optarg); break; case 'C': options = (options & ~F_MASK) | F_MANY; break; case 'F': flags |= HPLS_INDICATOR; break; case 'N': flags &= ~(HPLS_ESCAPE | HPLS_QMARK_CTRL); break; case 'Q': flags |= HPLS_QUOTE | HPLS_ESCAPE; flags &= ~HPLS_QMARK_CTRL; break; case 'R': flags |= HPLS_RECURSIVE; break; case 'S': options = (options & ~S_MASK) | S_SIZE; break; case 'U': options &= ~S_MASK; break; } } // scan all arguments if (hpcache_reopen(&vol,&rec,HFSP_MODE_RDONLY)) goto fail; fargv = (char**) hfsputil_glob(&rec, argc - optind, &argv[optind], &fargc, &result); result = qnew(&dirs) || result; result = qnew(&files) || result; if (result) { fprintf(stderr, "%s: not enough memory\n", argv0); result = 1; } if (result == 0) { if (fargc == 0) // show curent dir { if (queuepath(&rec, NULL, &dirs, &files, flags)) result = 1; } else // show files / dirs found by globbing { for (i = 0; i < fargc; ++i) { if (queuepath(&rec, fargv[i], &dirs, &files, flags)) { result = 1; break; } } } } if (result == 0 && process(&dirs, &files, flags, options, width) == -1) result = 1; qfree(&files); qfree(&dirs); if (fargv) free(fargv); result = volume_close(&vol) || result; return result; fail: hfsputil_perror(argv[0]); return result; } hfsplus-1.0.4/src/hpmkdir.c0100644000000000000000000000640007441220605014270 0ustar rootroot/* * hfsputils - tools for reading and writing Macintosh HFS+ volumes * * create a new folder in the current (HFS+) working directory * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: hpmkdir.c,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # ifdef HAVE_UNISTD_H # include # endif /* # ifdef HAVE_TERMIOS_H # include # endif # ifdef HAVE_SYS_IOCTL_H # include # else int ioctl(int, int, ...); # endif # include # include # include # include */ # include # include # include "libhfsp.h" # include "record.h" // # include "hfstime.h" # include "volume.h" # include "unicode.h" #include "darray.h" #include "dlist.h" #include "dstring.h" #include "hpcache.h" #include "hfsputil.h" /* * NAME: usage() * DESCRIPTION: display usage message */ static int usage() { fprintf(stderr, "Usage: %s hfs-path ...\n", argv0); return 1; } /* create all the folders specified in the argvs. * * rec, base directory where files are found. * */ static int do_mkdir(record *rec, int argc, char *argv[], int flags) { int i; int result = 0; for (i = 0; i < argc; ++i) { record folder; char* argi = argv[i]; if (record_init_string(&folder, HFSP_FOLDER, argi, rec)) { hfsputil_perrorp(argi); HFSP_ERROR(-1, 0); } else if (record_insert(&folder)) { hfsputil_perrorp(argi); HFSP_ERROR(errno, 0); result = 1; } } return result; fail: return -1; } /* * NAME: hpmkdir->main() * DESCRIPTION: implement hpmkdir command */ int main(int argc, char *argv[]) { volume vol; record rec; int nargs, result = 0; int fargc, flags = 0; char **fargv; argv0 = argv[0]; while (1) // Our only option is -?/-h { int opt; opt = getopt(argc, argv, "h"); if (opt == EOF) break; switch (opt) { case '?': case 'h': return usage(); } } nargs = argc - optind; if (nargs < 1) return usage(); if (hpcache_reopen(&vol,&rec,HFSP_MODE_RDWR)) goto fail; fargv = hfsputil_glob(&rec, nargs, &argv[optind], &fargc, &result); if (!result) result = do_mkdir(&rec, fargc, fargv, flags); result = volume_close(&vol) || result; if (fargv && fargv != &argv[optind]) free(fargv); if (result) hfsputil_perrorp(argv0); return result; fail: hfsputil_perrorp(argv0); return -1; } hfsplus-1.0.4/src/hpmount.c0100644000000000000000000000714007450133475014336 0ustar rootroot/* * hfsputils - tools for reading and writing Macintosh HFS+ volumes * * This program allows to "mount" a device. In fact it does so * by creating some addtional info in the users home directory * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: hpmount.c,v 1.5 2002/03/26 18:00:29 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # ifdef HAVE_UNISTD_H # include # endif # include # include # include "libhfsp.h" # include "volume.h" # include "hpcache.h" # include "hfsputil.h" /* * NAME: usage() * DESCRIPTION: display usage message * RETURN: always 1, to be used as exit status * */ static int usage() { fprintf(stderr, "Usage: %s source-path \n", argv0); fprintf(stderr, "Options: -r mount volume readonly \n"); fprintf(stderr, " -p[n] mount partition n > 0 \n"); fprintf(stderr, " in case n is omitted mount first reasonable partition\n"); fprintf(stderr, "\n"); fprintf(stderr, "(Note: -p should be used only in case your kernel/OS \n"); fprintf(stderr, " does not support Macintosh partition maps)\n"); return 1; } /** Parse the partition number from the given argument. * Will exit() on error. */ int parse_partition(char *arg) { char* endchar; int result; if (arg == NULL) /* no option at all */ return -1; result = strtol(arg, &endchar, 0); if (('\0' != *endchar) || ( result < 0)) { fprintf(stderr, "Invalid partition '%s'\n", arg); exit(-1); } return result; } /* * NAME: hpmount->main() * DESCRIPTION: implement hpmount command */ int main(int argc, char *argv[]) { char* path = NULL; volume vol; record rec; int nargs, result = 0; /* mike: we should probably set this to 1 to mount the first found partition as default. this doesn't mean anything for an unpartitioned device */ int partition = 0; /* do not care for partitions */ int mode = HFSP_MODE_RDWR; argv0 = argv[0]; while (1) { int opt; opt = getopt(argc, argv, "hrp::"); if (opt == EOF) break; switch (opt) { case 'r': mode = HFSP_MODE_RDONLY; break; case 'p': partition = parse_partition(optarg); break; case '?': case 'h': default : return usage(); } } nargs = argc - optind; if (nargs < 1) return usage(); path = hfsputil_abspath(argv[optind]); if (!path) { fprintf(stderr, "%s: not enough memory\n", argv0); goto fail; } // suid_enable(); result = hpcache_open(&vol, &rec, path, partition, mode); // suid_disable(); if (result) hfsputil_perror(path); result = volume_close(&vol) || result; free(path); return result; fail: if (path) free(path); return 1; } hfsplus-1.0.4/src/hppwd.c0100644000000000000000000000470707441220605013764 0ustar rootroot/* * hfsputils - tools for reading and writing Macintosh HFS+ volumes * * This programm is ananlog to pwd for HFS+ volumes. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: hppwd.c,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # include # include "libhfsp.h" # include "record.h" # include "unicode.h" # include "hfsputil.h" # include "hpcache.h" # include "dstring.h" static int hppwd_ascend(dstring* append, record *r) { record parent = *r; int result = 0; int len; UInt16 type; char buf[255]; if (!record_up(&parent)) result = hppwd_ascend(append, &parent); type = r->record.type; if (dstring_append(append , "/", 1) || result) return -1; if (type == HFSP_FOLDER) len = unicode_uni2asc(buf,&r->key.name, 255); else if (type == HFSP_FOLDER_THREAD) len = unicode_uni2asc(buf,&r->record.u.thread.nodeName, 255); else return -1; // not a folder ? if (dstring_append(append , buf, len)) return -1; return 0; } /* * NAME: hppwd->main() * DESCRIPTION: implement hppwd command */ int main(int argc, char *argv[]) { volume vol; record rec; dstring append; // path is accumulated here argv0 = argv[0]; if (argc != 1) { fprintf(stderr, "Usage: %s\n", argv0); return 1; } dstring_init(&append); if (hpcache_reopen(&vol,&rec,HFSP_MODE_RDONLY)) goto fail; if (hppwd_ascend(&append, &rec)) goto fail; printf("%s\n", dstring_string(&append)); dstring_free(&append); return 0; fail: hfsputil_perror(argv0); dstring_free(&append); return 1; } hfsplus-1.0.4/src/hprm.c0100644000000000000000000000657607441220605013616 0ustar rootroot/* * hfsputils - tools for reading and writing Macintosh HFS+ volumes * * implement a ls simliar to standard linux ls for HFS+ * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: hprm.c,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # ifdef HAVE_UNISTD_H # include # endif # ifdef HAVE_TERMIOS_H # include # endif # ifdef HAVE_SYS_IOCTL_H # include # else int ioctl(int, int, ...); # endif # include # include # include # include # include # include # include "libhfsp.h" # include "record.h" # include "hfstime.h" # include "volume.h" # include "unicode.h" #include "darray.h" #include "dlist.h" #include "dstring.h" #include "hpcache.h" #include "hfsputil.h" /* * NAME: usage() * DESCRIPTION: display usage message */ static int usage() { fprintf(stderr, "Usage: %s [-Rf] hfs-path ...\n", argv0); return 1; } /* delete all the files specified in the argvs. * * rec, base directory where files are found. * */ static int do_delete(record *rec, int argc, char *argv[], int flags) { int i; int result = 0; for (i = 0; i < argc; ++i) { record file; // might be folder, too, well char* argi = argv[i]; if (record_init_string_parent( &file, rec, argi)) { hfsputil_perrorp(argi); HFSP_ERROR(-1, 0); } else if (record_delete(&file, flags)) { hfsputil_perrorp(argi); HFSP_ERROR(errno, 0); result = 1; } } return result; fail: return -1; } /* * NAME: hprm->main() * DESCRIPTION: implement hprm command */ int main(int argc, char *argv[]) { volume vol; record rec; int nargs, result = 0; int fargc, flags = 0; char **fargv; argv0 = argv[0]; while (1) // Our only option is -?/-h { int opt; opt = getopt(argc, argv, "hRf"); if (opt == EOF) break; switch (opt) { case '?': case 'h': return usage(); case 'R': flags |= RECORD_DELETE_RECURSE; break; case 'f': flags |= RECORD_DELETE_FORCE; break; } } nargs = argc - optind; if (nargs < 1) return usage(); if (hpcache_reopen(&vol,&rec,HFSP_MODE_RDWR)) goto fail; fargv = hfsputil_glob(&rec, nargs, &argv[optind], &fargc, &result); if (!result) result = do_delete(&rec, fargc, fargv, flags); result = volume_close(&vol) || result; if (fargv && fargv != &argv[optind]) free(fargv); if (result) hfsputil_perrorp(argv0); return result; fail: hfsputil_perrorp(argv0); return -1; } hfsplus-1.0.4/src/hprm.out0100644000000000000000000000000007441220605014153 0ustar rootroothfsplus-1.0.4/src/hpumount.c0100644000000000000000000000313007441220605014506 0ustar rootroot/* * hfsputils - tools for reading and writing Macintosh HFS+ volumes * * This program allows to "umount" a device. In fact it does so * by throwing away some infos stroed in the users directory. * * Copyright (C) 2000 Klaus Halfmann * Original 1996-1998 Robert Leslie * Additional work by Brad Boyer (flar@pants.nu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: hpumount.c,v 1.1.1.1 2002/03/05 19:50:29 klaus Exp $ */ # ifdef HAVE_CONFIG_H # include "config.h" # endif # include # include # include "libhfsp.h" # include "hpcache.h" # include "hfsputil.h" /* * NAME: hpmount->main() * DESCRIPTION: implement hpmount command */ int main(int argc, char *argv[]) { argv0 = argv[0]; if (argc != 1) { fprintf(stderr, "Usage: %s \n", argv0); goto fail; } if (hpcache_destroy()) hfsputil_perror("destroy"); return 0; fail: return 1; }