#!/usr/bin/perl ($src, $dst) = @ARGV; die "no dst" unless defined $dst; &add_file($src,$dst); sub add_file { $TAR_PACK_HEADER = 'a100 a8 a8 a8 a12 a12 A8 a1 a100 a6 a2 a32 a32 a8 a8 a155 x12'; $MAGIC = "felix"; $BLK_SIZE = 100000; my $src = shift; my $dst = shift; my ($mode,$uid,$gid,$rdev,$size,$mtime) = (lstat $src)[2,4..7,9]; my $tmp = pack($TAR_PACK_HEADER, $src, sprintf("%06o",$mode), sprintf("%06o",$uid), sprintf("%06o",$gid), sprintf("%11o",$size), sprintf("%11o",$mtime), "", 0, "", $MAGIC, '00', scalar getpwuid($uid), scalar getgrgid($gid), 0, 0, ""); substr($tmp,148,7) = sprintf("%6o\0", unpack("%16C*", $tmp)); open(TAR, ">>$dst") || die "$dst: $!"; binmode TAR; syswrite TAR, $tmp; open(FH, $src) || die $!; binmode FH; while (sysread(FH,$buf,$BLK_SIZE)) { syswrite TAR, $buf; } syswrite TAR, "\0" x (512-($size & 0x1ff)) if ($size & 0x1ff); # syswrite TAR, "\0" x 1024; close(FH); close(TAR); }