File Coverage

blib/lib/Archive/Cpio/OldBinary.pm
Criterion Covered Total %
statement 3 46 6.5
branch 0 8 0.0
condition n/a
subroutine 1 8 12.5
pod 0 7 0.0
total 4 69 5.8


line stmt bran cond sub pod time code
1             package Archive::Cpio::OldBinary;
2              
3 1     1   7 use Archive::Cpio::Common;
  1         1  
  1         1201  
4              
5             my $TRAILER = 'TRAILER!!!';
6             my $BLOCK_SIZE = 512;
7              
8             my @HEADER = qw(
9             magic
10             dev
11             ino
12             mode
13             uid
14             gid
15             nlink
16             rdev
17             mtime_high
18             mtime_low
19             namesize
20             datasize_high
21             datasize_low
22             );
23              
24             sub new {
25 0     0 0   my ($class, $magic) = @_;
26 0           bless { magic => unpack('v', $magic) }, $class;
27             }
28              
29             sub read_one {
30 0     0 0   my ($o, $FHwp) = @_;
31 0           my $entry = read_one_header($o, $FHwp);
32              
33 0           $entry->{name} = $FHwp->read($entry->{namesize});
34 0           $entry->{name} =~ s/\0$//;
35              
36 0 0         $entry->{name} ne $TRAILER or return;
37 0           $FHwp->read(padding(2, $entry->{namesize}));
38              
39 0           $entry->{data} = $FHwp->read($entry->{datasize});
40 0           $FHwp->read(padding(2, $entry->{datasize}));
41              
42 0           cleanup_entry($entry);
43              
44 0           $entry;
45             }
46              
47             sub read_one_header {
48 0     0 0   my ($o, $FHwp) = @_;
49              
50 0           my %h;
51 0           my @vals = unpack('v*', $FHwp->read(2 * @HEADER));
52 0           foreach my $field (@HEADER) {
53 0           $h{$field} = shift @vals;
54             }
55 0           foreach ('mtime', 'datasize') {
56 0           $h{$_} = $h{$_ . '_high'} * 0x10000 + $h{$_ . '_low'};
57             }
58              
59 0 0         $h{magic} == $o->{magic} or die "bad magic ($h{magic} vs $o->{MAGIC})\n";
60              
61 0           \%h;
62             }
63              
64             sub write_one {
65 0     0 0   my ($o, $F, $entry) = @_;
66              
67 0           $entry->{magic} = $o->{magic};
68 0           $entry->{namesize} = length($entry->{name}) + 1;
69 0           $entry->{datasize} = length($entry->{data});
70              
71 0           foreach ('mtime', 'datasize') {
72 0           $entry->{$_ . '_high'} = int($entry->{$_} / 0x10000);
73 0           $entry->{$_ . '_low'} = $entry->{$_} % 0x10000;
74             }
75              
76 0           write_or_die($F, pack_header($entry) .
77             $entry->{name} . "\0" .
78             "\0" x padding(2, $entry->{namesize}));
79 0           write_or_die($F, $entry->{data});
80 0           write_or_die($F, "\0" x padding(2, $entry->{datasize}));
81              
82 0           cleanup_entry($entry);
83             }
84              
85             sub write_trailer {
86 0     0 0   my ($o, $F) = @_;
87              
88 0           write_one($o, $F, { name => $TRAILER, data => '', nlink => 1 });
89 0           write_or_die($F, "\0" x padding($BLOCK_SIZE, tell($F)));
90             }
91              
92             sub cleanup_entry {
93 0     0 0   my ($entry) = @_;
94              
95 0           foreach ('datasize', 'namesize', 'magic') {
96 0           delete $entry->{$_};
97             }
98 0           foreach (keys %$entry) {
99 0 0         /_low$|_high$/ and delete $entry->{$_};
100             }
101             }
102              
103             sub pack_header {
104 0     0 0   my ($h) = @_;
105 0 0         pack('v*', map { $h->{$_} || 0 } @HEADER);
  0            
106             }
107              
108             1;