14 use Hash::Util qw(lock_keys); |
14 use Hash::Util qw(lock_keys); |
15 use Getopt::Long; |
15 use Getopt::Long; |
16 use Pod::Usage; |
16 use Pod::Usage; |
17 use Imager 0.1; |
17 use Imager 0.1; |
18 |
18 |
19 use constant KiB => 1024; |
19 use constant KiB => 1024; |
20 use constant MiB => 1024 * KiB; |
20 use constant MiB => 1024 * KiB; |
21 use constant GiB => 1024 * MiB; |
21 use constant GiB => 1024 * MiB; |
22 use constant BS => 4 * MiB; |
22 use constant BS => 4 * MiB; |
23 use constant DATEFMT => "%Y-%m-%dT%H:%M:%SZ"; |
23 use constant DATEFMT => "%Y-%m-%dT%H:%M:%SZ"; |
24 use constant CIPHER => "aes-128-cbc"; |
24 use constant CIPHER => "aes-128-cbc"; |
25 |
25 |
26 sub get_devsize; |
26 sub get_devsize; |
27 sub get_devname; |
27 sub get_devname; |
28 sub save; |
28 sub save; |
29 |
|
30 |
29 |
31 $SIG{INT} = sub { die "Got INT\n" }; |
30 $SIG{INT} = sub { die "Got INT\n" }; |
32 |
31 |
33 my %o = ( |
32 my %o = ( |
34 compress => undef, |
33 compress => undef, |
51 ); |
50 ); |
52 }, |
51 }, |
53 "c|comment=s" => \$o{comment}, |
52 "c|comment=s" => \$o{comment}, |
54 "z|compress:i" => sub { $o{compress} = $_[1] ? $_[1] : Z_BEST_SPEED }, |
53 "z|compress:i" => sub { $o{compress} = $_[1] ? $_[1] : Z_BEST_SPEED }, |
55 "p|pass=s" => \$o{pass}, |
54 "p|pass=s" => \$o{pass}, |
56 "now=i" => \$o{now}, |
55 "now=i" => \$o{now}, |
57 "b|blocksize=s" => sub { |
56 "b|blocksize=s" => sub { |
58 given ($_[1]) { |
57 given ($_[1]) { |
59 when (/(\d+)G/i) { $o{blocksize} = $1 * GiB }; |
58 when (/(\d+)G/i) { $o{blocksize} = $1 * GiB }; |
60 when (/(\d+)M/i) { $o{blocksize} = $1 * MiB }; |
59 when (/(\d+)M/i) { $o{blocksize} = $1 * MiB }; |
61 when (/(\d+)K/i) { $o{blocksize} = $1 * KiB }; |
60 when (/(\d+)K/i) { $o{blocksize} = $1 * KiB }; |
176 if ($o{pass}) { |
175 if ($o{pass}) { |
177 open($out, "|openssl @{[CIPHER]} -pass $o{pass} -out $out"); |
176 open($out, "|openssl @{[CIPHER]} -pass $o{pass} -out $out"); |
178 } |
177 } |
179 binmode($out); |
178 binmode($out); |
180 |
179 |
181 |
180 my $bufref = \$buffer; |
182 my $bufref = \$buffer; |
181 if ($o{compress}) { |
183 if ($o{compress}) { |
182 my $zbuffer; |
184 my $zbuffer; |
183 gzip( |
185 gzip( |
184 \$buffer => \$zbuffer, |
186 \$buffer => \$zbuffer, |
185 -Minimal => 1, |
187 -Minimal => 1, |
186 -Level => Z_BEST_SPEED, |
188 -Level => Z_BEST_SPEED, |
187 -Strategy => Z_FILTERED |
189 -Strategy => Z_FILTERED |
188 ) or die $GzipError; |
190 ) or die $GzipError; |
189 if (length($zbuffer) / length($buffer) < 0.9) { |
191 if (length($zbuffer) / length($buffer) < 0.9) { |
190 $bufref = \$zbuffer; |
192 $bufref = \$zbuffer; |
191 $ext = ".gz$ext"; |
193 $ext = ".gz$ext"; |
|
194 } |
|
195 } |
192 } |
196 |
193 } |
197 #for(my $todo = length $$bufref; |
194 |
198 # $todo -= syswrite $out => $$bufref, $todo, -$todo; 1) |
195 #for(my $todo = length $$bufref; |
199 #{ |
196 # $todo -= syswrite $out => $$bufref, $todo, -$todo; 1) |
200 #} |
197 #{ |
201 syswrite $out => $$bufref; |
198 #} |
202 |
199 syswrite $out => $$bufref or die "$0: write: $!\n"; |
203 close($out) or die $!; |
200 close($out) or die "$0: close output file: $!"; |
|
201 |
204 rename($out => "$data/$file$ext"); |
202 rename($out => "$data/$file$ext"); |
205 $index{BLOCKS}[$blknr] .= " *"; |
203 $index{BLOCKS}[$blknr] .= " *"; |
206 $stats{written}++; |
204 $stats{written}++; |
207 } |
205 } |
208 else { |
206 else { |