hfspax

以下のPerlスクリプトで修正。なんか、微妙にファイルサイズが規格に合致してないかもだけど知らない。あと、100バイト以上のファイルパスに対応してないのではまるかも。基本的には、FINFリソースをustar形式のファイルから削除するというもの(当然、プログラムだったりすると起動できなくなる)。

#! /usr/bin/perl

use strict;
use FileHandle;

sub chop_nulls($) {
my $buffer = shift;
$buffer =~ s/\0+$//;
return $buffer;
}

my $filepath = shift;
defined $filepath or die "Usage: $0 INPUT_FILEPATH > OUTPUT_FILEPATH\n";

my $h = FileHandle->new($filepath);
defined $h or die "Couldn't open $filepath: $!";

binmode $h;
binmode STDOUT;

my $buffer;
my $size;
my $ignore;

while (512 == read $h, $buffer, 512) {

if ($size <= 0) {

my $name = chop_nulls substr $buffer, 0, 100;
$size = oct chop_nulls substr $buffer, 124, 12;

if ($name =~ m{/\.\.namedfork/finf$}) {
seek $h, -$size, 1;
$ignore = 1;
} else {
$ignore = undef;
}
}
else {
$size -= 512;
}

print $buffer unless $ignore;
}