equal
deleted
inserted
replaced
47 -verbose => 2, |
47 -verbose => 2, |
48 exit => 0, |
48 exit => 0, |
49 -noperldoc => system("perldoc -V >/dev/null 2>&1") |
49 -noperldoc => system("perldoc -V >/dev/null 2>&1") |
50 ); |
50 ); |
51 }, |
51 }, |
52 "c|comment=s" => \$o{comment}, |
52 "c|comment=s" => \$o{comment}, |
53 "z|compress:i" => sub { $o{compress} = $_[1] ? $_[1] : Z_BEST_SPEED }, |
53 "z|compress:i" => sub { $o{compress} = $_[1] ? $_[1] : Z_BEST_SPEED }, |
54 "p|pass=s" => \$o{pass}, |
54 "p|pass=s" => \$o{pass}, |
55 "b|blocksize=s" => sub { |
55 "b|blocksize=s" => sub { |
56 given ($_[1]) { |
56 given ($_[1]) { |
57 when (/(\d+)G/i) { $o{blocksize} = $1 * GiB }; |
57 when (/(\d+)G/i) { $o{blocksize} = $1 * GiB }; |
58 when (/(\d+)M/i) { $o{blocksize} = $1 * MiB }; |
58 when (/(\d+)M/i) { $o{blocksize} = $1 * MiB }; |
77 } |
77 } |
78 save($src, $dst); |
78 save($src, $dst); |
79 exit; |
79 exit; |
80 } |
80 } |
81 |
81 |
82 do 1 while wait != -1; |
82 my $rc = 0; |
|
83 while (wait != -1) { |
|
84 $rc = ($? >> 8) if ($? >> 8) > $rc; |
|
85 } |
|
86 exit $rc; |
83 |
87 |
84 } |
88 } |
85 |
89 |
86 sub save { |
90 sub save { |
87 my ($src, $dst) = @_; |
91 my ($src, $dst) = @_; |
89 my $data = "{DIR}/data"; |
93 my $data = "{DIR}/data"; |
90 my $info = "{DIR}/data/info"; |
94 my $info = "{DIR}/data/info"; |
91 my ($size, $name); |
95 my ($size, $name); |
92 |
96 |
93 if ($src =~ /(?<dev>.+?):(?<name>.+)/) { |
97 if ($src =~ /(?<dev>.+?):(?<name>.+)/) { |
94 $src = $+{dev}; |
98 $src = $+{dev}; |
95 $name = $+{name}; |
99 $name = $+{name}; |
96 } |
100 } |
97 else { $name = $src }; |
101 else { $name = $src } |
98 |
102 |
99 foreach ($idx, $data, $info) { |
103 foreach ($idx, $data, $info) { |
100 s/{DIR}/$dst/g; |
104 s/{DIR}/$dst/g; |
101 s/{HOSTNAME}/hostname/eg; |
105 s/{HOSTNAME}/hostname/eg; |
102 s/{DEVICE}/$name/g; |
106 s/{DEVICE}/$name/g; |
142 length($stats{todo}) => $stats{skipped}; |
146 length($stats{todo}) => $stats{skipped}; |
143 alarm(5); |
147 alarm(5); |
144 }; |
148 }; |
145 $SIG{ALRM}->(); |
149 $SIG{ALRM}->(); |
146 |
150 |
147 for (my $blknr = 0; sysread($in => my $buffer, $o{blocksize}) > 0; ++$blknr) { |
151 for ( |
148 |
152 my $blknr = 0 ; |
|
153 sysread($in => my $buffer, $o{blocksize}) > 0 ; |
|
154 ++$blknr |
|
155 ) |
|
156 { |
|
157 |
149 my ($file, $ext, $cs); |
158 my ($file, $ext, $cs); |
150 $file = $cs = md5_hex($buffer); |
159 $file = $cs = md5_hex($buffer); |
151 $file =~ s/(?<fn>(?<prefix>...).*)/$+{prefix}\/$+{fn}/g; |
160 $file =~ s/(?<fn>(?<prefix>...).*)/$+{prefix}\/$+{fn}/g; |
152 $ext .= $o{pass} ? ".x" : ""; |
161 $ext .= $o{pass} ? ".x" : ""; |
153 |
162 |
154 # the extension we do not put into the index |
163 # the extension we do not put into the index |
155 push @{ $index{BLOCKS} }, sprintf "%12d %s %s" => $blknr, |
164 push @{ $index{BLOCKS} }, sprintf "%12d %s %s" => $blknr, |
156 $cs, $file; |
165 $cs, $file; |
157 |
166 |
165 if ($o{pass}) { |
174 if ($o{pass}) { |
166 open($out, "|openssl @{[CIPHER]} -pass $o{pass} -out $out"); |
175 open($out, "|openssl @{[CIPHER]} -pass $o{pass} -out $out"); |
167 } |
176 } |
168 binmode($out); |
177 binmode($out); |
169 |
178 |
170 if ($o{compress}) { |
179 |
171 my $zbuffer; |
180 my $bufref = \$buffer; |
172 gzip( |
181 if ($o{compress}) { |
173 \$buffer => \$zbuffer, |
182 my $zbuffer; |
174 -Minimal => 1, |
183 gzip( |
175 -Level => Z_BEST_SPEED, |
184 \$buffer => \$zbuffer, |
176 -Strategy => Z_FILTERED |
185 -Minimal => 1, |
177 ) or die $GzipError; |
186 -Level => Z_BEST_SPEED, |
178 if (length($zbuffer)/length($buffer) < 0.9) { |
187 -Strategy => Z_FILTERED |
179 $buffer = $zbuffer; |
188 ) or die $GzipError; |
180 $ext = ".gz$ext"; |
189 if (length($zbuffer) / length($buffer) < 0.9) { |
181 } |
190 $bufref = \$zbuffer; |
182 } |
191 $ext = ".gz$ext"; |
183 |
192 } |
184 syswrite $out => $buffer; |
193 } |
185 close($out); |
194 |
|
195 #for(my $todo = length $$bufref; |
|
196 # $todo -= syswrite $out => $$bufref, $todo, -$todo; 1) |
|
197 #{ |
|
198 #} |
|
199 syswrite $out => $$bufref; |
|
200 |
|
201 close($out) or die $!; |
186 rename($out => "$data/$file$ext"); |
202 rename($out => "$data/$file$ext"); |
187 $index{BLOCKS}[$blknr] .= " *"; |
203 $index{BLOCKS}[$blknr] .= " *"; |
188 $stats{written}++; |
204 $stats{written}++; |
189 } |
205 } |
190 else { |
206 else { |