bin/imager.save
changeset 78 603b47708d37
parent 77 e65d90b1682d
child 80 ffde94c51cd4
equal deleted inserted replaced
77:e65d90b1682d 78:603b47708d37
   119         encryption => $o{pass} ? CIPHER : "none",
   119         encryption => $o{pass} ? CIPHER : "none",
   120     };
   120     };
   121 
   121 
   122     open(my $in => $src);
   122     open(my $in => $src);
   123     binmode($in);
   123     binmode($in);
   124     local $/ = \$o{blocksize};
       
   125     local $| = 1;
   124     local $| = 1;
   126 
   125 
   127     my %stats = (
   126     my %stats = (
   128         written => 0,
   127         written => 0,
   129         skipped => 0,
   128         skipped => 0,
   143           length($stats{todo}) => $stats{skipped};
   142           length($stats{todo}) => $stats{skipped};
   144         alarm(5);
   143         alarm(5);
   145     };
   144     };
   146     $SIG{ALRM}->();
   145     $SIG{ALRM}->();
   147 
   146 
   148     while (my $buffer = <$in>) {
   147     for (my $blknr = 0; sysread($in => my $buffer, $o{blocksize}) > 0; ++$blknr) {
       
   148 	
   149         my ($file, $ext, $cs);
   149         my ($file, $ext, $cs);
   150         $file = $cs = md5_hex($buffer);
   150         $file = $cs = md5_hex($buffer);
   151         $file =~ s/(?<fn>(?<prefix>...).*)/$+{prefix}\/$+{fn}/g;
   151         $file =~ s/(?<fn>(?<prefix>...).*)/$+{prefix}\/$+{fn}/g;
   152         $ext .= $o{pass}     ? ".x"  : "";
   152         $ext .= $o{pass}     ? ".x"  : "";
   153 
   153 
   154         # the extension we do not put into the index
   154         # the extension we do not put into the index
   155         push @{ $index{BLOCKS} }, sprintf "%12d %s %s" => ($. - 1),
   155         push @{ $index{BLOCKS} }, sprintf "%12d %s %s" => $blknr,
   156           $cs,                    $file;
   156           $cs,                    $file;
   157 
   157 
   158         if (not Imager::get_file("$data/$file")) {
   158         if (not Imager::get_file("$data/$file")) {
   159             mkpath dirname("$data/$file");
   159             mkpath dirname("$data/$file");
   160             my $out = File::Temp->new(
   160             my $out = File::Temp->new(
   182             }
   182             }
   183 
   183 
   184             syswrite $out => $buffer;
   184             syswrite $out => $buffer;
   185             close($out);
   185             close($out);
   186             rename($out => "$data/$file$ext");
   186             rename($out => "$data/$file$ext");
   187             $index{BLOCKS}[$. - 1] .= " *";
   187             $index{BLOCKS}[$blknr] .= " *";
   188             $stats{written}++;
   188             $stats{written}++;
   189         }
   189         }
   190         else {
   190         else {
   191             $stats{skipped}++;
   191             $stats{skipped}++;
   192         }
   192         }