すでにtarのデータをを出力するプログラムは書いてあるので、あとはgzに変換するプログラムを書けば勝利だね!
ということで、適当に調べて書いてみました。
参考資料
GZIP file format specification version 4.3
DEFLATE Compressed Data Format Specification version 1.3
書いたソースコード
#!/usr/bin/perl
use strict;
my $inputFileName;
my $outputFileName;
if(@ARGV2) {
die "Usage: file2gz.pl [output file]\n";
} elsif(@ARGV $outputFileName")) {
close(IN);
die "Output file open error.\n";
}
binmode(IN);
binmode(OUT);
my ($mtime) = (stat(IN))[9];
print OUT "\x1f\x8b\x08\x00";
print OUT pack("C4",$mtime&0xFF,($mtime>>8)&0xFF,($mtime>>16)&0xFF,($mtime>>24)&0xFF);
print OUT "\x00\x00";
my @crc32table=();
&crc32maketable;
my $crc32=0xFFFFFFFF;
my $size=0;
if((-s IN)>0) {
my $nowsize;
my $data;
my $datatoout="";
while($nowsize=read(IN,$data,0xFFFF)) {
if($datatoout ne "") {
print OUT "\x00";
print OUT $datatoout;
}
$size=($size+$nowsize)&0xFFFFFFFF;
$datatoout=pack("C2",$nowsize&0xFF,($nowsize>>8)&0xFF);
$datatoout.=pack("C2",(~$nowsize)&0xFF,((~$nowsize)>>8)&0xFF);
$datatoout.=$data;
$crc32=&crc32update($crc32,$data);
}
if($datatoout ne "") {
print OUT "\x01";
print OUT $datatoout;
}
} else {
print OUT "\x01\x00\x00\xFF\xFF";
}
print OUT pack("C4",(~$crc32)&0xFF,((~$crc32)>>8)&0xFF,
((~$crc32)>>16)&0xFF,((~$crc32)>>24)&0xFF);
print OUT pack("C4",$size&0xFF,($size>>8)&0xFF,($size>>16)&0xFF,($size>>24)&0xFF);
close(IN);
close(OUT);
sub crc32maketable {
for(my $n=0;$n>1)&0x7FFFFFFF);
} else {
$c=($c>>1)&0x7FFFFFFF;
}
$crc32table[$n]=$c;
}
}
}
sub crc32update {
my ($crc,$data)=@_;
my $len=length($data);
for(my $i=0;$i>8)&0x00FFFFFF);
}
return $crc;
}
また、 というように、出力ファイルの名前を指定することができます。
次はzipファイルを生成したいな。