database can't be open.
* NEW: support for Unicode characters in the range above U+010000 using
internal surrogate pairs
-* NEW: asaddump: utility to dump AppleSingle and AppleDouble files
+* NEW: apple_dump: utility to dump AppleSingle and AppleDouble files
* UPD: atalkd and papd are now disabled by default. AppleTalk is legacy.
* UPD: slp advertisement is now disabled by default. server option -slp
SRVLOC is legacy.
-dnl $Id: configure.in,v 1.235 2009-12-23 15:53:15 franklahm Exp $
+dnl $Id: configure.in,v 1.236 2010-01-04 10:02:18 franklahm Exp $
dnl configure.in for netatalk
AC_INIT(etc/afpd/main.c)
contrib/shell_utils/Makefile
contrib/shell_utils/afpd-mtab.pl
contrib/shell_utils/apple_cp
+ contrib/shell_utils/apple_dump
contrib/shell_utils/apple_mv
contrib/shell_utils/apple_rm
- contrib/shell_utils/asaddump
contrib/shell_utils/asip-status.pl
contrib/timelord/Makefile
contrib/a2boot/Makefile
netatalkshorternamelinks.pl
lp2pap.sh
asip-status.pl
-asaddump
+apple_dump
afpd-mtab.pl \
apple_cp apple_mv apple_rm \
asip-status.pl \
- asaddump
+ apple_dump
SUFFIXES = .tmpl .
--- /dev/null
+#!@PERL@
+#
+# AppleSingle/AppleDouble dump
+#
+# (c) 2009 by HAT <hat@fa2.so-net.ne.jp>
+#
+# 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.
+#
+
+use File::Basename;
+use File::Spec;
+use bigint; # require perl >= 5.8
+
+# parse command line -----------------------------------------------
+
+$finderinfo = 0; # 0: unknown 1: file 2: directory
+while ($arg = shift @ARGV)
+{
+ if ($arg =~ /^(-h|-help|--help)$/ ) {
+ printf ("usage: %s [-a] FILE|DIR\n" ,basename($0));
+ printf (" or: %s -f FILE\n" ,basename($0));
+ printf (" or: %s -d FILE\n" ,basename($0));
+ printf (" or: %s -h|-help|--help\n" ,basename($0));
+ printf ("Dump AppleSingle/AppleDouble format file.\n");
+ printf ("\n");
+ printf (" -a (default) Dump a AppleSingle/AppleDouble file for FILE or DIR\n");
+ printf (" automatically.\n");
+ printf (" Extrapolate FinderInfo type from absolute path.\n");
+ printf (" If FILE is not AppleSingle/AppleDouble format,\n");
+ printf (" look for '.AppleDouble/FILE' and '._FILE'.\n");
+ printf (" If DIR, look for 'DIR/.AppleDouble/.Parent' and '._DIR'.\n");
+ printf (" -f Dump FILE. Assume FinderInfo to be FileInfo.\n");
+ printf (" -d Dump FILE. Assume FinderInfo to be DirInfo.\n");
+ printf (" -h,-help,--help Display this help and exit\n");
+ printf ("\n");
+ printf ("There is no way to detect whether FinderInfo is FileInfo or DirInfo.\n");
+ printf ("By default, %s examins whether file or directory,\n" ,basename($0));
+ printf ("a parent directory is .AppleDouble, filename is ._*, filename is .Parent,\n");
+ printf ("and so on.\n");
+ printf ("If setting option -f or -d, %s assume FinderInfo and doesn't look for\n");
+ printf ("another file.\n");
+ exit 0;
+ } elsif ($arg eq "-a") {
+ $finderinfo = 0;
+ } elsif ($arg eq "-f") {
+ $finderinfo = 1;
+ } elsif ($arg eq "-d") {
+ $finderinfo = 2;
+ } elsif ($arg =~ /^-/) {
+ printf (STDERR "%s: invalid option %s\n", basename($0), $arg);
+ printf (STDERR "Try \`%s\ -h' for more information.\n", basename($0));
+ exit 1;
+ } else {
+ $afile = $arg;
+ }
+}
+
+if (!($afile)) {
+ printf (STDERR "missing file operand.\n");
+ exit 1;
+}
+if (!( -e $afile)) {
+ printf (STDERR "\"%s\" not found.\n", $afile);
+ exit 1;
+}
+
+# detect FinderInfo, and search AppleSingle/AppleDouble file --------------
+
+$abspath = File::Spec->rel2abs($afile);
+($basename, $path, $ext) = fileparse($abspath);
+
+if ( $finderinfo != 0 ) {
+ ;
+} elsif ( -f $afile ) {
+ if ( $basename eq ".Parent") {
+ $finderinfo = 2;
+ } elsif ( $path =~ /\/.AppleDouble\/$/ ) {
+ $finderinfo =1;
+ } elsif ( $basename =~ /^._/ ) {
+ if ( -f $path.substr($basename, 2) ) {
+ $finderinfo =1;
+ } elsif ( -d $path.substr($basename, 2) ) {
+ $finderinfo =2;
+ }
+ }
+ if (!open(INFILE, "<$afile")) {
+ printf (STDERR "cannot open %s\n", $afile);
+ exit 1;
+ }
+ read(INFILE,$buf,4);
+ $val = unpack("N", $buf );
+ close(INFILE);
+ if ($val == 0x00051600 || $val == 0x00051607) {
+ ;
+ } else {
+ printf ("\"%s\" is not AppleSingle/AppleDouble format.\n", $afile);
+ $finderinfo = 1;
+ $netatalkfile = $path.".AppleDouble/".$basename;
+ $osxfile = $path."._".$basename;
+ if ( -e $netatalkfile ) {
+ $afile = $netatalkfile;
+ } elsif ( -e $osxfile ) {
+ printf ("\"%s\" not found.\n", $netatalkfile);
+ $afile = $osxfile;
+ } else {
+ printf ("\"%s\" not found.\n", $netatalkfile);
+ printf ("\"%s\" not found.\n", $osxfile);
+ exit 1;
+ }
+ }
+} elsif ( -d $afile) {
+ printf ("\"%s\" is directory.\n", $afile);
+ $finderinfo =2;
+ $netatalkfile = $path.$basename."/.AppleDouble/.Parent";
+ $osxfile = $path."._".$basename;
+ if ( -e $netatalkfile ) {
+ $afile = $netatalkfile;
+ } elsif ( -e $osxfile ) {
+ printf ("\"%s\" not found.\n", $netatalkfile);
+ $afile = $osxfile;
+ } else {
+ printf ("\"%s\" not found.\n", $netatalkfile);
+ printf ("\"%s\" not found.\n", $osxfile);
+ exit 1;
+ }
+} else {
+ printf (STDERR "unknown error: %s\n", $afile);
+ exit 1;
+}
+
+if (!open(INFILE, "<$afile")) {
+ printf (STDERR "cannot open %s\n", $afile);
+ exit 1;
+}
+printf ("%s:\n\n", $afile);
+
+# Magic Number -----------------------------------------------
+
+read(INFILE,$buf,4);
+$val = unpack("N", $buf );
+printf("Magic Num. : %08X", $val);
+if ( $val == 0x00051600 ) {
+ printf(" : AppleSingle");
+}
+elsif ( $val == 0x00051607 ) {
+ printf(" : AppleDouble");
+}
+else {
+ printf(" : Unknown" );
+}
+print "\n";
+
+# Version Number ---------------------------------------------
+
+read(INFILE,$buf,4);
+$val = unpack("N", $buf );
+printf("Ver. Num. : %08X", $val);
+if ( $val == 0x00010000 ) {
+ printf(" : Version 1");
+}
+elsif ( $val == 0x00020000 ) {
+ printf(" : Version 2");
+}
+else {
+ printf(" : Unknown" );
+}
+print "\n";
+
+# v1:Home file system / v2:Filler ----------------------------
+
+read(INFILE,$buf,16);
+print "Filler :";
+hexdump($buf, 16, 16, " ");
+
+# Number of entities -----------------------------------------
+
+read(INFILE,$buf,2);
+$entnum = unpack("n", $buf );
+printf("Num. of ent: %04X ", $entnum);
+printf(" : %d", $entnum);
+print "\n";
+
+# data -------------------------------------------------------
+
+for ( $num = 0 ; $num < $entnum ; $num++) {
+
+ seek(INFILE, ($num * 12 + 26), 0);
+
+# Entry ---------------------------------------------------
+
+ read(INFILE,$buf,4);
+ $entid = unpack("N", $buf );
+ printf("\nEntry ID : %08X", $entid);
+ if ( $entid == 1 ) { printf(" : Data Fork ---------------------------------------------"); }
+ elsif ( $entid == 2 ) { printf(" : Resource Fork -----------------------------------------"); }
+ elsif ( $entid == 3 ) { printf(" : Real Name ---------------------------------------------"); }
+ elsif ( $entid == 4 ) { printf(" : Comment -----------------------------------------------"); }
+ elsif ( $entid == 5 ) { printf(" : Icon, B&W ---------------------------------------------"); }
+ elsif ( $entid == 6 ) { printf(" : Icon Color --------------------------------------------"); }
+ elsif ( $entid == 7 ) { printf(" : File Info ---------------------------------------------"); }
+ elsif ( $entid == 8 ) { printf(" : File Dates Info ---------------------------------------"); }
+ elsif ( $entid == 9 ) { printf(" : Finder Info -------------------------------------------"); }
+ elsif ( $entid == 10 ) { printf(" : Macintosh File Info -----------------------------------"); }
+ elsif ( $entid == 11 ) { printf(" : ProDOS File Info --------------------------------------"); }
+ elsif ( $entid == 12 ) { printf(" : MS-DOS File Info --------------------------------------"); }
+ elsif ( $entid == 13 ) { printf(" : Short Name --------------------------------------------"); }
+ elsif ( $entid == 14 ) { printf(" : AFP File Info -----------------------------------------"); }
+ elsif ( $entid == 15 ) { printf(" : Directory ID ------------------------------------------"); }
+ elsif ( $entid == 0x8053567E ) { printf(" : CNID (Netatalk Extended) ------------------------------"); }
+ elsif ( $entid == 0x8053594E ) { printf(" : DB stamp (Netatalk Extended) --------------------------"); }
+ elsif ( $entid == 0x80444556 ) { printf(" : dev (Netatalk Extended) -------------------------------"); }
+ elsif ( $entid == 0x80494E4F ) { printf(" : inode (Netatalk Extended) -----------------------------"); }
+ else { printf(" : Unknown -----------------------------------------------"); }
+ print "\n";
+
+# Offset -------------------------------------------------
+
+ read(INFILE,$buf,4);
+ $ofst = unpack("N", $buf );
+ printf("Offset : %08X", $ofst);
+ printf(" : %d ", $ofst);
+
+# Length -------------------------------------------------
+
+ read(INFILE,$buf,4);
+ $len = unpack("N", $buf );
+ printf("\nLength : %08X", $len);
+ printf(" : %d", $len);
+ $quo = $len >> 4;
+ $rem = $len & 0xF;
+ print "\n";
+
+# Dump for each Entry ID --------------------------------
+
+# if ( $entid == 1 ) { ; } # Data Fork
+# if ( $entid == 2 ) { ; } # Resource Fork
+# if ( $entid == 3 ) { ; } # Real Name
+# if ( $entid == 4 ) { ; } # Comment
+# if ( $entid == 5 ) { ; } # Icon, B&W
+# if ( $entid == 6 ) { ; } # Icon Color
+# if ( $entid == 7 ) { ; } # File Info
+ if ( $entid == 8 ) { filedatesdump($ofst,$len); }
+ elsif ( $entid == 9 ) { finderinfodump($ofst,$len); }
+# if ( $entid == 10 ) { ; } # Macintosh File Info
+# if ( $entid == 11 ) { ; } # ProDOS File Info
+# if ( $entid == 12 ) { ; } # MS-DOS File Info
+# if ( $entid == 13 ) { ; } # Short Name
+# if ( $entid == 14 ) { ; } # AFP File Info
+ elsif ( $entid == 15 ) { bedump($ofst,$len); } # Directory ID
+ elsif ( $entid == 0x8053567E ) { bedump($ofst,$len); } # CNID (Netatalk Extended)
+ elsif ( $entid == 0x8053594E ) { bedump($ofst,$len); ledump($ofst,$len); } # DB stamp (Netatalk Extended)
+ elsif ( $entid == 0x80444556 ) { bedump($ofst,$len); ledump($ofst,$len); } # dev (Netatalk Extended)
+ elsif ( $entid == 0x80494E4F ) { bedump($ofst,$len); ledump($ofst,$len); } # inode (Netatalk Extended)
+
+# RAW Dump ---------------------------------------------------
+
+ if ( ($quo > 0) || ($rem > 0)) {
+ print "-RAW DUMP--: 0 1 2 3 4 5 6 7 8 9 A B C D E F : (ASCII)\n";
+ }
+
+ seek(INFILE, $ofst, 0);
+ $addrs = 0;
+ for ( $line = 0 ; $line < $quo ; $line++) {
+ read(INFILE, $buf, 16);
+ printf ( "%08X :", $addrs);
+ hexdump($buf, 16, 16, " ");
+ $addrs = $addrs + 0x10;
+ }
+ if ( $rem != 0 ) {
+ read(INFILE, $buf, $rem);
+ printf ( "%08X :", $addrs);
+ hexdump($buf, $rem, 16, " ");
+ }
+}
+
+close(INFILE);
+exit 0;
+
+#sub -----------------------------------------------------------
+
+sub filedatesdump {
+ my ($ofst, $len) = @_;
+ my ($datedata);
+ my ($i);
+ my ($datestr);
+
+ @datetype =('create ', 'modify ', 'backup ', 'access ');
+
+ seek(INFILE, $ofst, 0);
+
+ printf ("-DATE------: : (GMT) : (Local)\n");
+
+ for ( $i = 0 ; $i < 4 ; $i++) {
+ read(INFILE,$buf,4);
+ $datedata = unpack("N", $buf );
+ if ($datedata < 0x80000000) {
+ $datestr = gmtime( $datedata + 946684800)
+ ." : "
+ .localtime( $datedata + 946684800);
+ } elsif ($datedata == 0x80000000) {
+ $datestr = "Unknown or Initial";
+ } else {
+ $datestr = gmtime( $datedata - 3348282496)
+ ." : "
+ .localtime( $datedata - 3348282496);
+ }
+ printf ("%s : %08X : %s\n",$datetype[$i], $datedata, $datestr);
+ }
+}
+
+sub finderinfodump {
+ my ($ofst, $len) = @_;
+
+ seek(INFILE, $ofst, 0);
+
+ if ($finderinfo == 0) {
+ print "-NOTE------: cannot detect whether FInfo or DInfo. assume FInfo.\n";
+ }
+
+ if ($finderinfo == 0 || $finderinfo == 1) {
+ filefinderinfodump();
+ } elsif ($finderinfo == 2) {
+ dirfinderinfodump();
+ } else {
+ print STDERR "unknown FinderInfo type\n"
+ }
+
+ if ($len > 32) { eadump(); }
+}
+
+sub filefinderinfodump {
+
+ print "-FInfo-----:\n";
+
+ read(INFILE,$buf,4);
+ print "Type : ";
+ hexdump($buf, 4, 4, "");
+
+ read(INFILE,$buf,4);
+ print "Creator : ";
+ hexdump($buf, 4, 4, "");
+
+ read(INFILE,$buf,2);
+ $flags = unpack("n", $buf );
+ printf ("isAlias : %d\n", ($flags >> 15) & 1);
+ printf ("Invisible : %d\n", ($flags >> 14) & 1);
+ printf ("hasBundle : %d\n", ($flags >> 13) & 1);
+ printf ("nameLocked : %d\n", ($flags >> 12) & 1);
+ printf ("Stationery : %d\n", ($flags >> 11) & 1);
+ printf ("CustomIcon : %d\n", ($flags >> 10) & 1);
+ printf ("Reserved : %d\n", ($flags >> 9) & 1);
+ printf ("Inited : %d\n", ($flags >> 8) & 1);
+ printf ("NoINITS : %d\n", ($flags >> 7) & 1);
+ printf ("Shared : %d\n", ($flags >> 6) & 1);
+ printf ("SwitchLaunc: %d\n", ($flags >> 5) & 1);
+ printf ("ExtHidden : %d\n", ($flags >> 4) & 1);
+ printf ("color : %d%d%d\n", ($flags >> 3) & 1,
+ ($flags >> 2) & 1,
+ ($flags >> 1) & 1);
+ printf ("isOnDesk : %d\n", ($flags >> 0) & 1);
+
+ read(INFILE,$buf,2);
+ $val = unpack("n", $buf );
+ printf("Location v : %04X", $val);
+ printf(" : %d \n", $val);
+
+ read(INFILE,$buf,2);
+ $val = unpack("n", $buf );
+ printf("Location h : %04X", $val);
+ printf(" : %d \n", $val);
+
+ read(INFILE,$buf,2);
+ print "Fldr : ";
+ hexdump($buf, 2, 4, "");
+
+ print "-FXInfo----:\n";
+
+ read(INFILE,$buf,2);
+ print "IconID : ";
+ hexdump($buf, 2, 4, "");
+
+ read(INFILE,$buf,2);
+ print "Unused : ";
+ hexdump($buf, 2, 4, "");
+ read(INFILE,$buf,2);
+ print "Unused : ";
+ hexdump($buf, 2, 4, "");
+ read(INFILE,$buf,2);
+ print "Unused : ";
+ hexdump($buf, 2, 4, "");
+
+ read(INFILE,$buf,1);
+ print "Script : ";
+ hexdump($buf, 1, 4, "");
+
+ read(INFILE,$buf,1);
+ print "XFlags : ";
+ hexdump($buf, 1, 4, "");
+
+ read(INFILE,$buf,2);
+ print "Comment : ";
+ hexdump($buf, 2, 4, "");
+
+ read(INFILE,$buf,4);
+ print "PutAway : ";
+ hexdump($buf, 4, 4, "");
+
+}
+
+sub dirfinderinfodump {
+
+ print "-DInfo-----:\n";
+
+ read(INFILE,$buf,2);
+ $val = unpack("n", $buf );
+ printf("Rect top : %04X", $val);
+ printf(" : %d \n", $val);
+
+ read(INFILE,$buf,2);
+ $val = unpack("n", $buf );
+ printf("Rect left : %04X", $val);
+ printf(" : %d \n", $val);
+
+ read(INFILE,$buf,2);
+ $val = unpack("n", $buf );
+ printf("Rect bottom: %04X", $val);
+ printf(" : %d \n", $val);
+
+ read(INFILE,$buf,2);
+ $val = unpack("n", $buf );
+ printf("Rect right : %04X", $val);
+ printf(" : %d \n", $val);
+
+ read(INFILE,$buf,2);
+ $flags = unpack("n", $buf );
+ printf ("isAlias : %d\n", ($flags >> 15) & 1);
+ printf ("Invisible : %d\n", ($flags >> 14) & 1);
+ printf ("hasBundle : %d\n", ($flags >> 13) & 1);
+ printf ("nameLocked : %d\n", ($flags >> 12) & 1);
+ printf ("Stationery : %d\n", ($flags >> 11) & 1);
+ printf ("CustomIcon : %d\n", ($flags >> 10) & 1);
+ printf ("Reserved : %d\n", ($flags >> 9) & 1);
+ printf ("Inited : %d\n", ($flags >> 8) & 1);
+ printf ("NoINITS : %d\n", ($flags >> 7) & 1);
+ printf ("Shared : %d\n", ($flags >> 6) & 1);
+ printf ("SwitchLaunc: %d\n", ($flags >> 5) & 1);
+ printf ("ExtHidden : %d\n", ($flags >> 4) & 1);
+ printf ("color : %d%d%d\n", ($flags >> 3) & 1,
+ ($flags >> 2) & 1,
+ ($flags >> 1) & 1);
+ printf ("isOnDesk : %d\n", ($flags >> 0) & 1);
+
+ read(INFILE,$buf,2);
+ $val = unpack("n", $buf );
+ printf("Location v : %04X", $val);
+ printf(" : %d \n", $val);
+
+ read(INFILE,$buf,2);
+ $val = unpack("n", $buf );
+ printf("Location h : %04X", $val);
+ printf(" : %d \n", $val);
+
+ read(INFILE,$buf,2);
+ print "View : ";
+ hexdump($buf, 2, 4, "");
+
+ print "-DXInfo----:\n";
+
+ read(INFILE,$buf,4);
+ print "Scroll : ";
+ hexdump($buf, 4, 4, "");
+
+ read(INFILE,$buf,4);
+ print "OpenChain : ";
+ hexdump($buf, 4, 4, "");
+
+ read(INFILE,$buf,1);
+ print "Script : ";
+ hexdump($buf, 1, 4, "");
+
+ read(INFILE,$buf,1);
+ print "XFlags : ";
+ hexdump($buf, 1, 4, "");
+
+ read(INFILE,$buf,2);
+ print "Comment : ";
+ hexdump($buf, 2, 4, "");
+
+ read(INFILE,$buf,4);
+ print "PutAway : ";
+ hexdump($buf, 4, 4, "");
+
+}
+
+sub eadump {
+
+ print "-EA--------:\n";
+
+ read(INFILE,$buf,2);
+ print "pad : ";
+ hexdump($buf, 2, 4, "");
+
+ read(INFILE,$buf,4);
+ print "magic : ";
+ hexdump($buf, 4, 4, "");
+
+ read(INFILE,$buf,4);
+ print "debug_tag : ";
+ hexdump($buf, 4, 4, "");
+
+ read(INFILE,$buf,4);
+ $ea_total_size = unpack("N", $buf );
+ printf("total_size : %08X", $ea_total_size);
+ printf(" : %d \n", $ea_total_size);
+
+ read(INFILE,$buf,4);
+ $ea_data_start = unpack("N", $buf );
+ printf("data_start : %08X", $ea_data_start);
+ printf(" : %d \n", $ea_data_start);
+
+ read(INFILE,$buf,4);
+ $ea_data_length = unpack("N", $buf );
+ printf("data_length: %08X", $ea_data_length);
+ printf(" : %d \n", $ea_data_length);
+
+ read(INFILE,$buf,4);
+ print "reserved[0]: ";
+ hexdump($buf, 4, 4, "");
+
+ read(INFILE,$buf,4);
+ print "reserved[1]: ";
+ hexdump($buf, 4, 4, "");
+
+ read(INFILE,$buf,4);
+ print "reserved[2]: ";
+ hexdump($buf, 4, 4, "");
+
+ read(INFILE,$buf,2);
+ print "flags : ";
+ hexdump($buf, 2, 4, "");
+
+ read(INFILE,$buf,2);
+ $ea_num_attrs = unpack("n", $buf );
+ printf("num_attrs : %04X", $ea_num_attrs);
+ printf(" : %d \n", $ea_num_attrs);
+
+}
+
+sub bedump {
+ my ($ofst, $len) = @_;
+ my ($i);
+ my ($value);
+
+ seek(INFILE, $ofst, 0);
+
+ printf("%2dbit-BE : ", $len * 8 );
+
+ $value = 0;
+ for ( $i=0 ; $i < $len ; $i++ ) {
+ read(INFILE,$buf,1);
+ $bytedata[$i] = unpack("C", $buf );
+ $value += $bytedata[$i] << (($len - $i -1) * 8) ;
+ }
+
+ for ( $i=0 ; $i < $len ; $i++ ) {
+ printf("%02X", $bytedata[$i]);
+ }
+
+ printf(" : %s", $value);
+ print "\n";
+
+}
+
+sub ledump {
+ my ($ofst, $len) = @_;
+ my ($i);
+ my ($value);
+
+ seek(INFILE, $ofst, 0);
+
+ printf("%2dbit-LE : ", $len * 8 );
+
+ $value = 0;
+ for ( $i=0 ; $i < $len ; $i++ ) {
+ read(INFILE,$buf,1);
+ $bytedata[$len - $i - 1] = unpack("C", $buf );
+ $value += $bytedata[$len - $i -1] << ($i * 8) ;
+ }
+
+ for ( $i=0 ; $i < $len ; $i++ ) {
+ printf("%02X", $bytedata[$i]);
+ }
+
+ printf(" : %s", $value);
+ print "\n";
+
+}
+
+sub hexdump {
+ my ($buf, $len, $col, $delimit) = @_;
+ my ($i);
+
+ $hexstr = "";
+ $ascstr = "";
+
+ for ( $i=0 ; $i < $len ; $i++ ) {
+ $val = substr($buf, $i, 1);
+ $ascval = ord($val);
+ $hexstr .= sprintf("%s%02X", $delimit, $ascval);
+
+ if (($ascval < 32) || ( $ascval > 126 )) {
+ $val = ".";
+ }
+ $ascstr .= $val;
+ }
+ for ( ; $i < $col ; $i++) {
+ $hexstr .= " ".$delimit;
+ $ascstr .= " ";
+ }
+
+ printf("%s : %s", $hexstr,$ascstr);
+
+ print "\n";
+}
+
+#EOF
+++ /dev/null
-#!@PERL@
-#
-# AppleSingle/AppleDouble dump
-#
-# (c) 2009 by HAT <hat@fa2.so-net.ne.jp>
-#
-# 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.
-#
-
-use File::Basename;
-use File::Spec;
-use bigint; # require perl >= 5.8
-
-# parse command line -----------------------------------------------
-
-$finderinfo = 0; # 0: unknown 1: file 2: directory
-while ($arg = shift @ARGV)
-{
- if ($arg =~ /^(-h|-help|--help)$/ ) {
- printf ("usage: %s [-a] FILE|DIR\n" ,basename($0));
- printf (" or: %s -f FILE\n" ,basename($0));
- printf (" or: %s -d FILE\n" ,basename($0));
- printf (" or: %s -h|-help|--help\n" ,basename($0));
- printf ("Dump AppleSingle/AppleDouble format file.\n");
- printf ("\n");
- printf (" -a (default) Dump a AppleSingle/AppleDouble file for FILE or DIR\n");
- printf (" automatically.\n");
- printf (" Extrapolate FinderInfo type from absolute path.\n");
- printf (" If FILE is not AppleSingle/AppleDouble format,\n");
- printf (" look for '.AppleDouble/FILE' and '._FILE'.\n");
- printf (" If DIR, look for 'DIR/.AppleDouble/.Parent' and '._DIR'.\n");
- printf (" -f Dump FILE. Assume FinderInfo to be FileInfo.\n");
- printf (" -d Dump FILE. Assume FinderInfo to be DirInfo.\n");
- printf (" -h,-help,--help Display this help and exit\n");
- printf ("\n");
- printf ("There is no way to detect whether FinderInfo is FileInfo or DirInfo.\n");
- printf ("By default, %s examins whether file or directory,\n" ,basename($0));
- printf ("a parent directory is .AppleDouble, filename is ._*, filename is .Parent,\n");
- printf ("and so on.\n");
- printf ("If setting option -f or -d, %s assume FinderInfo and doesn't look for\n");
- printf ("another file.\n");
- exit 0;
- } elsif ($arg eq "-a") {
- $finderinfo = 0;
- } elsif ($arg eq "-f") {
- $finderinfo = 1;
- } elsif ($arg eq "-d") {
- $finderinfo = 2;
- } elsif ($arg =~ /^-/) {
- printf (STDERR "%s: invalid option %s\n", basename($0), $arg);
- printf (STDERR "Try \`%s\ -h' for more information.\n", basename($0));
- exit 1;
- } else {
- $afile = $arg;
- }
-}
-
-if (!($afile)) {
- printf (STDERR "missing file operand.\n");
- exit 1;
-}
-if (!( -e $afile)) {
- printf (STDERR "\"%s\" not found.\n", $afile);
- exit 1;
-}
-
-# detect FinderInfo, and search AppleSingle/AppleDouble file --------------
-
-$abspath = File::Spec->rel2abs($afile);
-($basename, $path, $ext) = fileparse($abspath);
-
-if ( $finderinfo != 0 ) {
- ;
-} elsif ( -f $afile ) {
- if ( $basename eq ".Parent") {
- $finderinfo = 2;
- } elsif ( $path =~ /\/.AppleDouble\/$/ ) {
- $finderinfo =1;
- } elsif ( $basename =~ /^._/ ) {
- if ( -f $path.substr($basename, 2) ) {
- $finderinfo =1;
- } elsif ( -d $path.substr($basename, 2) ) {
- $finderinfo =2;
- }
- }
- if (!open(INFILE, "<$afile")) {
- printf (STDERR "cannot open %s\n", $afile);
- exit 1;
- }
- read(INFILE,$buf,4);
- $val = unpack("N", $buf );
- close(INFILE);
- if ($val == 0x00051600 || $val == 0x00051607) {
- ;
- } else {
- printf ("\"%s\" is not AppleSingle/AppleDouble format.\n", $afile);
- $finderinfo = 1;
- $netatalkfile = $path.".AppleDouble/".$basename;
- $osxfile = $path."._".$basename;
- if ( -e $netatalkfile ) {
- $afile = $netatalkfile;
- } elsif ( -e $osxfile ) {
- printf ("\"%s\" not found.\n", $netatalkfile);
- $afile = $osxfile;
- } else {
- printf ("\"%s\" not found.\n", $netatalkfile);
- printf ("\"%s\" not found.\n", $osxfile);
- exit 1;
- }
- }
-} elsif ( -d $afile) {
- printf ("\"%s\" is directory.\n", $afile);
- $finderinfo =2;
- $netatalkfile = $path.$basename."/.AppleDouble/.Parent";
- $osxfile = $path."._".$basename;
- if ( -e $netatalkfile ) {
- $afile = $netatalkfile;
- } elsif ( -e $osxfile ) {
- printf ("\"%s\" not found.\n", $netatalkfile);
- $afile = $osxfile;
- } else {
- printf ("\"%s\" not found.\n", $netatalkfile);
- printf ("\"%s\" not found.\n", $osxfile);
- exit 1;
- }
-} else {
- printf (STDERR "unknown error: %s\n", $afile);
- exit 1;
-}
-
-if (!open(INFILE, "<$afile")) {
- printf (STDERR "cannot open %s\n", $afile);
- exit 1;
-}
-printf ("%s:\n\n", $afile);
-
-# Magic Number -----------------------------------------------
-
-read(INFILE,$buf,4);
-$val = unpack("N", $buf );
-printf("Magic Num. : %08X", $val);
-if ( $val == 0x00051600 ) {
- printf(" : AppleSingle");
-}
-elsif ( $val == 0x00051607 ) {
- printf(" : AppleDouble");
-}
-else {
- printf(" : Unknown" );
-}
-print "\n";
-
-# Version Number ---------------------------------------------
-
-read(INFILE,$buf,4);
-$val = unpack("N", $buf );
-printf("Ver. Num. : %08X", $val);
-if ( $val == 0x00010000 ) {
- printf(" : Version 1");
-}
-elsif ( $val == 0x00020000 ) {
- printf(" : Version 2");
-}
-else {
- printf(" : Unknown" );
-}
-print "\n";
-
-# v1:Home file system / v2:Filler ----------------------------
-
-read(INFILE,$buf,16);
-print "Filler :";
-hexdump($buf, 16, 16, " ");
-
-# Number of entities -----------------------------------------
-
-read(INFILE,$buf,2);
-$entnum = unpack("n", $buf );
-printf("Num. of ent: %04X ", $entnum);
-printf(" : %d", $entnum);
-print "\n";
-
-# data -------------------------------------------------------
-
-for ( $num = 0 ; $num < $entnum ; $num++) {
-
- seek(INFILE, ($num * 12 + 26), 0);
-
-# Entry ---------------------------------------------------
-
- read(INFILE,$buf,4);
- $entid = unpack("N", $buf );
- printf("\nEntry ID : %08X", $entid);
- if ( $entid == 1 ) { printf(" : Data Fork ---------------------------------------------"); }
- elsif ( $entid == 2 ) { printf(" : Resource Fork -----------------------------------------"); }
- elsif ( $entid == 3 ) { printf(" : Real Name ---------------------------------------------"); }
- elsif ( $entid == 4 ) { printf(" : Comment -----------------------------------------------"); }
- elsif ( $entid == 5 ) { printf(" : Icon, B&W ---------------------------------------------"); }
- elsif ( $entid == 6 ) { printf(" : Icon Color --------------------------------------------"); }
- elsif ( $entid == 7 ) { printf(" : File Info ---------------------------------------------"); }
- elsif ( $entid == 8 ) { printf(" : File Dates Info ---------------------------------------"); }
- elsif ( $entid == 9 ) { printf(" : Finder Info -------------------------------------------"); }
- elsif ( $entid == 10 ) { printf(" : Macintosh File Info -----------------------------------"); }
- elsif ( $entid == 11 ) { printf(" : ProDOS File Info --------------------------------------"); }
- elsif ( $entid == 12 ) { printf(" : MS-DOS File Info --------------------------------------"); }
- elsif ( $entid == 13 ) { printf(" : Short Name --------------------------------------------"); }
- elsif ( $entid == 14 ) { printf(" : AFP File Info -----------------------------------------"); }
- elsif ( $entid == 15 ) { printf(" : Directory ID ------------------------------------------"); }
- elsif ( $entid == 0x8053567E ) { printf(" : CNID (Netatalk Extended) ------------------------------"); }
- elsif ( $entid == 0x8053594E ) { printf(" : DB stamp (Netatalk Extended) --------------------------"); }
- elsif ( $entid == 0x80444556 ) { printf(" : dev (Netatalk Extended) -------------------------------"); }
- elsif ( $entid == 0x80494E4F ) { printf(" : inode (Netatalk Extended) -----------------------------"); }
- else { printf(" : Unknown -----------------------------------------------"); }
- print "\n";
-
-# Offset -------------------------------------------------
-
- read(INFILE,$buf,4);
- $ofst = unpack("N", $buf );
- printf("Offset : %08X", $ofst);
- printf(" : %d ", $ofst);
-
-# Length -------------------------------------------------
-
- read(INFILE,$buf,4);
- $len = unpack("N", $buf );
- printf("\nLength : %08X", $len);
- printf(" : %d", $len);
- $quo = $len >> 4;
- $rem = $len & 0xF;
- print "\n";
-
-# Dump for each Entry ID --------------------------------
-
-# if ( $entid == 1 ) { ; } # Data Fork
-# if ( $entid == 2 ) { ; } # Resource Fork
-# if ( $entid == 3 ) { ; } # Real Name
-# if ( $entid == 4 ) { ; } # Comment
-# if ( $entid == 5 ) { ; } # Icon, B&W
-# if ( $entid == 6 ) { ; } # Icon Color
-# if ( $entid == 7 ) { ; } # File Info
- if ( $entid == 8 ) { filedatesdump($ofst,$len); }
- elsif ( $entid == 9 ) { finderinfodump($ofst,$len); }
-# if ( $entid == 10 ) { ; } # Macintosh File Info
-# if ( $entid == 11 ) { ; } # ProDOS File Info
-# if ( $entid == 12 ) { ; } # MS-DOS File Info
-# if ( $entid == 13 ) { ; } # Short Name
-# if ( $entid == 14 ) { ; } # AFP File Info
- elsif ( $entid == 15 ) { bedump($ofst,$len); } # Directory ID
- elsif ( $entid == 0x8053567E ) { bedump($ofst,$len); } # CNID (Netatalk Extended)
- elsif ( $entid == 0x8053594E ) { bedump($ofst,$len); ledump($ofst,$len); } # DB stamp (Netatalk Extended)
- elsif ( $entid == 0x80444556 ) { bedump($ofst,$len); ledump($ofst,$len); } # dev (Netatalk Extended)
- elsif ( $entid == 0x80494E4F ) { bedump($ofst,$len); ledump($ofst,$len); } # inode (Netatalk Extended)
-
-# RAW Dump ---------------------------------------------------
-
- if ( ($quo > 0) || ($rem > 0)) {
- print "-RAW DUMP--: 0 1 2 3 4 5 6 7 8 9 A B C D E F : (ASCII)\n";
- }
-
- seek(INFILE, $ofst, 0);
- $addrs = 0;
- for ( $line = 0 ; $line < $quo ; $line++) {
- read(INFILE, $buf, 16);
- printf ( "%08X :", $addrs);
- hexdump($buf, 16, 16, " ");
- $addrs = $addrs + 0x10;
- }
- if ( $rem != 0 ) {
- read(INFILE, $buf, $rem);
- printf ( "%08X :", $addrs);
- hexdump($buf, $rem, 16, " ");
- }
-}
-
-close(INFILE);
-exit 0;
-
-#sub -----------------------------------------------------------
-
-sub filedatesdump {
- my ($ofst, $len) = @_;
- my ($datedata);
- my ($i);
- my ($datestr);
-
- @datetype =('create ', 'modify ', 'backup ', 'access ');
-
- seek(INFILE, $ofst, 0);
-
- printf ("-DATE------: : (GMT) : (Local)\n");
-
- for ( $i = 0 ; $i < 4 ; $i++) {
- read(INFILE,$buf,4);
- $datedata = unpack("N", $buf );
- if ($datedata < 0x80000000) {
- $datestr = gmtime( $datedata + 946684800)
- ." : "
- .localtime( $datedata + 946684800);
- } elsif ($datedata == 0x80000000) {
- $datestr = "Unknown or Initial";
- } else {
- $datestr = gmtime( $datedata - 3348282496)
- ." : "
- .localtime( $datedata - 3348282496);
- }
- printf ("%s : %08X : %s\n",$datetype[$i], $datedata, $datestr);
- }
-}
-
-sub finderinfodump {
- my ($ofst, $len) = @_;
-
- seek(INFILE, $ofst, 0);
-
- if ($finderinfo == 0) {
- print "-NOTE------: cannot detect whether FInfo or DInfo. assume FInfo.\n";
- }
-
- if ($finderinfo == 0 || $finderinfo == 1) {
- filefinderinfodump();
- } elsif ($finderinfo == 2) {
- dirfinderinfodump();
- } else {
- print STDERR "unknown FinderInfo type\n"
- }
-
- if ($len > 32) { eadump(); }
-}
-
-sub filefinderinfodump {
-
- print "-FInfo-----:\n";
-
- read(INFILE,$buf,4);
- print "Type : ";
- hexdump($buf, 4, 4, "");
-
- read(INFILE,$buf,4);
- print "Creator : ";
- hexdump($buf, 4, 4, "");
-
- read(INFILE,$buf,2);
- $flags = unpack("n", $buf );
- printf ("isAlias : %d\n", ($flags >> 15) & 1);
- printf ("Invisible : %d\n", ($flags >> 14) & 1);
- printf ("hasBundle : %d\n", ($flags >> 13) & 1);
- printf ("nameLocked : %d\n", ($flags >> 12) & 1);
- printf ("Stationery : %d\n", ($flags >> 11) & 1);
- printf ("CustomIcon : %d\n", ($flags >> 10) & 1);
- printf ("Reserved : %d\n", ($flags >> 9) & 1);
- printf ("Inited : %d\n", ($flags >> 8) & 1);
- printf ("NoINITS : %d\n", ($flags >> 7) & 1);
- printf ("Shared : %d\n", ($flags >> 6) & 1);
- printf ("SwitchLaunc: %d\n", ($flags >> 5) & 1);
- printf ("ExtHidden : %d\n", ($flags >> 4) & 1);
- printf ("color : %d%d%d\n", ($flags >> 3) & 1,
- ($flags >> 2) & 1,
- ($flags >> 1) & 1);
- printf ("isOnDesk : %d\n", ($flags >> 0) & 1);
-
- read(INFILE,$buf,2);
- $val = unpack("n", $buf );
- printf("Location v : %04X", $val);
- printf(" : %d \n", $val);
-
- read(INFILE,$buf,2);
- $val = unpack("n", $buf );
- printf("Location h : %04X", $val);
- printf(" : %d \n", $val);
-
- read(INFILE,$buf,2);
- print "Fldr : ";
- hexdump($buf, 2, 4, "");
-
- print "-FXInfo----:\n";
-
- read(INFILE,$buf,2);
- print "IconID : ";
- hexdump($buf, 2, 4, "");
-
- read(INFILE,$buf,2);
- print "Unused : ";
- hexdump($buf, 2, 4, "");
- read(INFILE,$buf,2);
- print "Unused : ";
- hexdump($buf, 2, 4, "");
- read(INFILE,$buf,2);
- print "Unused : ";
- hexdump($buf, 2, 4, "");
-
- read(INFILE,$buf,1);
- print "Script : ";
- hexdump($buf, 1, 4, "");
-
- read(INFILE,$buf,1);
- print "XFlags : ";
- hexdump($buf, 1, 4, "");
-
- read(INFILE,$buf,2);
- print "Comment : ";
- hexdump($buf, 2, 4, "");
-
- read(INFILE,$buf,4);
- print "PutAway : ";
- hexdump($buf, 4, 4, "");
-
-}
-
-sub dirfinderinfodump {
-
- print "-DInfo-----:\n";
-
- read(INFILE,$buf,2);
- $val = unpack("n", $buf );
- printf("Rect top : %04X", $val);
- printf(" : %d \n", $val);
-
- read(INFILE,$buf,2);
- $val = unpack("n", $buf );
- printf("Rect left : %04X", $val);
- printf(" : %d \n", $val);
-
- read(INFILE,$buf,2);
- $val = unpack("n", $buf );
- printf("Rect bottom: %04X", $val);
- printf(" : %d \n", $val);
-
- read(INFILE,$buf,2);
- $val = unpack("n", $buf );
- printf("Rect right : %04X", $val);
- printf(" : %d \n", $val);
-
- read(INFILE,$buf,2);
- $flags = unpack("n", $buf );
- printf ("isAlias : %d\n", ($flags >> 15) & 1);
- printf ("Invisible : %d\n", ($flags >> 14) & 1);
- printf ("hasBundle : %d\n", ($flags >> 13) & 1);
- printf ("nameLocked : %d\n", ($flags >> 12) & 1);
- printf ("Stationery : %d\n", ($flags >> 11) & 1);
- printf ("CustomIcon : %d\n", ($flags >> 10) & 1);
- printf ("Reserved : %d\n", ($flags >> 9) & 1);
- printf ("Inited : %d\n", ($flags >> 8) & 1);
- printf ("NoINITS : %d\n", ($flags >> 7) & 1);
- printf ("Shared : %d\n", ($flags >> 6) & 1);
- printf ("SwitchLaunc: %d\n", ($flags >> 5) & 1);
- printf ("ExtHidden : %d\n", ($flags >> 4) & 1);
- printf ("color : %d%d%d\n", ($flags >> 3) & 1,
- ($flags >> 2) & 1,
- ($flags >> 1) & 1);
- printf ("isOnDesk : %d\n", ($flags >> 0) & 1);
-
- read(INFILE,$buf,2);
- $val = unpack("n", $buf );
- printf("Location v : %04X", $val);
- printf(" : %d \n", $val);
-
- read(INFILE,$buf,2);
- $val = unpack("n", $buf );
- printf("Location h : %04X", $val);
- printf(" : %d \n", $val);
-
- read(INFILE,$buf,2);
- print "View : ";
- hexdump($buf, 2, 4, "");
-
- print "-DXInfo----:\n";
-
- read(INFILE,$buf,4);
- print "Scroll : ";
- hexdump($buf, 4, 4, "");
-
- read(INFILE,$buf,4);
- print "OpenChain : ";
- hexdump($buf, 4, 4, "");
-
- read(INFILE,$buf,1);
- print "Script : ";
- hexdump($buf, 1, 4, "");
-
- read(INFILE,$buf,1);
- print "XFlags : ";
- hexdump($buf, 1, 4, "");
-
- read(INFILE,$buf,2);
- print "Comment : ";
- hexdump($buf, 2, 4, "");
-
- read(INFILE,$buf,4);
- print "PutAway : ";
- hexdump($buf, 4, 4, "");
-
-}
-
-sub eadump {
-
- print "-EA--------:\n";
-
- read(INFILE,$buf,2);
- print "pad : ";
- hexdump($buf, 2, 4, "");
-
- read(INFILE,$buf,4);
- print "magic : ";
- hexdump($buf, 4, 4, "");
-
- read(INFILE,$buf,4);
- print "debug_tag : ";
- hexdump($buf, 4, 4, "");
-
- read(INFILE,$buf,4);
- $ea_total_size = unpack("N", $buf );
- printf("total_size : %08X", $ea_total_size);
- printf(" : %d \n", $ea_total_size);
-
- read(INFILE,$buf,4);
- $ea_data_start = unpack("N", $buf );
- printf("data_start : %08X", $ea_data_start);
- printf(" : %d \n", $ea_data_start);
-
- read(INFILE,$buf,4);
- $ea_data_length = unpack("N", $buf );
- printf("data_length: %08X", $ea_data_length);
- printf(" : %d \n", $ea_data_length);
-
- read(INFILE,$buf,4);
- print "reserved[0]: ";
- hexdump($buf, 4, 4, "");
-
- read(INFILE,$buf,4);
- print "reserved[1]: ";
- hexdump($buf, 4, 4, "");
-
- read(INFILE,$buf,4);
- print "reserved[2]: ";
- hexdump($buf, 4, 4, "");
-
- read(INFILE,$buf,2);
- print "flags : ";
- hexdump($buf, 2, 4, "");
-
- read(INFILE,$buf,2);
- $ea_num_attrs = unpack("n", $buf );
- printf("num_attrs : %04X", $ea_num_attrs);
- printf(" : %d \n", $ea_num_attrs);
-
-}
-
-sub bedump {
- my ($ofst, $len) = @_;
- my ($i);
- my ($value);
-
- seek(INFILE, $ofst, 0);
-
- printf("%2dbit-BE : ", $len * 8 );
-
- $value = 0;
- for ( $i=0 ; $i < $len ; $i++ ) {
- read(INFILE,$buf,1);
- $bytedata[$i] = unpack("C", $buf );
- $value += $bytedata[$i] << (($len - $i -1) * 8) ;
- }
-
- for ( $i=0 ; $i < $len ; $i++ ) {
- printf("%02X", $bytedata[$i]);
- }
-
- printf(" : %s", $value);
- print "\n";
-
-}
-
-sub ledump {
- my ($ofst, $len) = @_;
- my ($i);
- my ($value);
-
- seek(INFILE, $ofst, 0);
-
- printf("%2dbit-LE : ", $len * 8 );
-
- $value = 0;
- for ( $i=0 ; $i < $len ; $i++ ) {
- read(INFILE,$buf,1);
- $bytedata[$len - $i - 1] = unpack("C", $buf );
- $value += $bytedata[$len - $i -1] << ($i * 8) ;
- }
-
- for ( $i=0 ; $i < $len ; $i++ ) {
- printf("%02X", $bytedata[$i]);
- }
-
- printf(" : %s", $value);
- print "\n";
-
-}
-
-sub hexdump {
- my ($buf, $len, $col, $delimit) = @_;
- my ($i);
-
- $hexstr = "";
- $ascstr = "";
-
- for ( $i=0 ; $i < $len ; $i++ ) {
- $val = substr($buf, $i, 1);
- $ascval = ord($val);
- $hexstr .= sprintf("%s%02X", $delimit, $ascval);
-
- if (($ascval < 32) || ( $ascval > 126 )) {
- $val = ".";
- }
- $ascstr .= $val;
- }
- for ( ; $i < $col ; $i++) {
- $hexstr .= " ".$delimit;
- $ascstr .= " ";
- }
-
- printf("%s : %s", $hexstr,$ascstr);
-
- print "\n";
-}
-
-#EOF