#!/usr/local/bin/perl # # print out a table of contents for a tar file # # pat@jaameri.gsfc.nasa.gov (patrick m. ryan) # eval "exec /usr/bin/perl -S $0 $*" if $running_under_some_shell; require 'getopts.pl'; require 'ctime.pl'; &Getopts('vd'); # v == verbose, d == debug if ($opt_d) { $debug=1; } $tar_header = join(' ', ("a100". # name "a8". # mode "a8". # uid "a8". # gid "a12". # size "a12". # mtime "a8". # chksum "a1". # linkflag "a100". # linkname "a8". # magic "a32". # uname "a32". # gname "a8". # devmajor "a8")); # devminor $tblock = 512; $fname=shift; open(F,"<$fname") || die "$fname: no such file; stopped"; while (sysread(F,$_,$tblock)) { if (/^\0+$/) { last; } # tar EOF ($name,$mode,$uid,$gid,$size,$mtime,$chksum,$linkflag,$linkname,$magic, $uname,$gname,$devmajor,$devminor) = unpack($tar_header,$_); $uid = oct($uid); $gid = oct($gid); $mode = oct($mode); $size = oct($size); $mtime = oct($mtime); $chksum = oct($chksum); $linkflag = oct($linkflag); chop($c=&ctime($mtime)); ##printf "%5d/%5d ",$uid,$gid; $login_name = getpwuid($uid); if ($login_name) { printf "%8s/",$login_name; } else { printf "%8d/",$uid; } $group_name = getgrgid($gid); if ($group_name) { printf "%-8s",$group_name; } else { printf "%8d",$gid; } printf "%7d ",$size; print $c," "; print "$name"; print "\n"; if ($opt_v) { printf "mode = %04o\n",$mode; print "uid = $uid\n"; print "gid = $gid\n"; print "size = $size\n"; print "mtime = $c ($mtime)\n"; print "chksum = $chksum\n"; if ($linkflag) { print "linkflag = $linkflag\n"; print "linkname = $linkname\n"; } if ($magic =~ /^ustar/) { print "uname = $uname\n"; print "gname = $gname\n"; } # if ($devmajor !~ /^\s+$/) # { # print "devmajor = $devmajor\n"; # print "devminor = $devminor\n"; # } } $nblocks = int($size / $tblock); $extra = $size % $tblock; if ($extra) { $nblocks += 1; } $off = $nblocks * $tblock; seek(F,$off,1); # skip to the next file } exit 0; # Local Variables: # mode: perl # End: