From: franklahm Date: Mon, 4 Jan 2010 10:02:18 +0000 (+0000) Subject: Rename asaddump to apple_dump X-Git-Tag: branch-dircache-rewrite-start~38 X-Git-Url: https://arthur.barton.de/gitweb/?p=netatalk.git;a=commitdiff_plain;h=d861fc384ee4d020ca523ed046ac1979a3eb2b11 Rename asaddump to apple_dump --- diff --git a/NEWS b/NEWS index dac01f90..54410534 100644 --- a/NEWS +++ b/NEWS @@ -23,7 +23,7 @@ Changes in 2.1-beta1 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. diff --git a/configure.in b/configure.in index 57912588..ef3b0734 100644 --- a/configure.in +++ b/configure.in @@ -1,4 +1,4 @@ -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) @@ -1214,9 +1214,9 @@ AC_OUTPUT([Makefile 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 diff --git a/contrib/shell_utils/.cvsignore b/contrib/shell_utils/.cvsignore index 313b0b40..51b23a75 100644 --- a/contrib/shell_utils/.cvsignore +++ b/contrib/shell_utils/.cvsignore @@ -9,4 +9,4 @@ cleanappledouble.pl netatalkshorternamelinks.pl lp2pap.sh asip-status.pl -asaddump +apple_dump diff --git a/contrib/shell_utils/Makefile.am b/contrib/shell_utils/Makefile.am index 71bf8752..bb2f1496 100644 --- a/contrib/shell_utils/Makefile.am +++ b/contrib/shell_utils/Makefile.am @@ -8,7 +8,7 @@ PERLSCRIPTS = \ afpd-mtab.pl \ apple_cp apple_mv apple_rm \ asip-status.pl \ - asaddump + apple_dump SUFFIXES = .tmpl . diff --git a/contrib/shell_utils/apple_dump.in b/contrib/shell_utils/apple_dump.in new file mode 100755 index 00000000..ffbcd8f2 --- /dev/null +++ b/contrib/shell_utils/apple_dump.in @@ -0,0 +1,634 @@ +#!@PERL@ +# +# AppleSingle/AppleDouble dump +# +# (c) 2009 by HAT +# +# 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 diff --git a/contrib/shell_utils/asaddump.in b/contrib/shell_utils/asaddump.in deleted file mode 100644 index ffbcd8f2..00000000 --- a/contrib/shell_utils/asaddump.in +++ /dev/null @@ -1,634 +0,0 @@ -#!@PERL@ -# -# AppleSingle/AppleDouble dump -# -# (c) 2009 by HAT -# -# 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