--- a/bin/imager.fuse Mon Jun 18 16:55:10 2012 +0200
+++ b/bin/imager.fuse Mon Aug 27 15:51:22 2012 +0200
@@ -14,6 +14,7 @@
use DB_File;
use File::Basename;
use Imager;
+use Smart::Comments;
my %o = (
debug => undef,
@@ -38,8 +39,11 @@
sub max {
(sort { $a <=> $b } @_)[-1];
}
-my $debug = sub { print STDERR @_ };
-$debug = sub { };
+
+sub nop_debug { }
+sub yes_debug { print STDERR @_ }
+
+*{main::debug} = \&nop_debug;
#$SIG{INT} = sub { warn "Got ^C or INT signal\n"; exit 1; };
@@ -47,7 +51,7 @@
GetOptions(
"d|debug!" => \$o{debug},
- "detach!" => \$o{detach},
+ "detach!" => \$o{detach},
"tmp:s" => sub { $o{tmp} = length $_[1] ? $_[1] : $ENV{TMP} // "/tmp" },
"h|help" => sub { pod2usage(-verbose => 1, -exit => 0) },
"p|pass=s" => \$o{pass},
@@ -62,6 +66,11 @@
and @ARGV == 2
or pod2usage;
+ if ($o{debug}) {
+ undef &{main::debug};
+ *{main::debug} = \&yes_debug;
+ }
+
my ($src, $mp) = @ARGV;
$DATA = "$src/data";
@@ -82,13 +91,14 @@
Fuse::main(
mountpoint => $mp,
- debug => $o{debug} // 0,
- getattr => \&getattr,
- getdir => \&getdir,
- open => \&openfile,
- read => \&readbuffer,
- write => \&writebuffer,
- release => \&release,
+
+ # debug => $o{debug} // 0,
+ getattr => \&getattr,
+ getdir => \&getdir,
+ open => \&openfile,
+ read => \&readbuffer,
+ write => \&writebuffer,
+ release => \&release,
);
exit;
@@ -154,7 +164,7 @@
sub release {
my $path = $IDX . shift;
return 0 if not exists $IMAGE{$path};
- $debug->("Currently we have " . keys(%DIRTY) . " dirty blocks\n");
+ debug("Currently we have " . keys(%DIRTY) . " dirty blocks\n");
return 0;
}
@@ -164,11 +174,16 @@
my $finfo = $IMAGE{$path} or die "File $path is not opened!";
return "" if $offset >= $finfo->{meta}{devsize};
+ debug("<<< REQUESTED: offset:$offset size:$size\n");
+
my $buffer = "";
for (my $need = $size ; $need > 0 ; $need = $size - length($buffer)) {
+ debug("<<< offset:@{[$offset + length($buffer)]} size:$need\n");
$buffer .= _readblock($finfo, $need, $offset + length($buffer));
+ debug("<<< missing: ", $size - length($buffer), "\n") if $size - length($buffer);
}
+ debug("<<< SENDING " . length($buffer) . "\n\n");
return $buffer;
}
@@ -176,8 +191,9 @@
my ($finfo, $size, $offset) = @_;
my ($block, $blockoffset, $length);
- $debug->("<<< block offset:$offset size:$size\n");
- $debug->(" block @{[int($offset/BS)]} + @{[$offset % BS]}\n");
+ debug("<<< requested: offset:$offset size:$size"
+ . "\tfrom $finfo->{meta}{filesystem}\n");
+ debug(" mapped to: block:@{[int($offset/BS)]}+@{[$offset % BS]}\n");
# first check if it's an dirty block
$block = int($offset / BS);
@@ -185,7 +201,7 @@
$blockoffset = $offset % BS;
$length = min(BS - $blockoffset, $size);
- $debug->(
+ debug(
"+++ dirty offset:$block*@{[BS]} + $blockoffset size:$length\n"
);
return substr $DIRTY{ $finfo . $block }, $blockoffset, $length;
@@ -207,18 +223,19 @@
}
}
- $debug->("=== $length\n");
- $debug->(
-"+++ disk offset:$block*$finfo->{meta}{blocksize} + $blockoffset size:$length\n"
- );
+ debug("+++ disk offset:$block*$finfo->{meta}{blocksize}"
+ . " + $blockoffset size:$length\n");
+
+# die if $blockoffset == 417792;
my $fn = "$DATA/" . $finfo->{blocklist}{$block};
+ debug(" fn:$fn\n");
state %cache;
if (not defined $cache{fn}
or ($cache{fn} ne $fn))
{
- Imager::get_block("$fn*" => \$cache{data});
+ Imager::get_block("$fn*" => \$cache{data});
$cache{fn} = $fn;
}
@@ -253,11 +270,11 @@
$blockoffset = $offset % BS;
$length = min(BS - $blockoffset, $size);
- $debug->(">>> offset:$offset size:$length of $size\n");
- $debug->(" block @{[int($offset/BS)]} + @{[$offset % BS]}\n");
+ debug(">>> offset:$offset size:$length of $size\n");
+ debug(" block @{[int($offset/BS)]} + @{[$offset % BS]}\n");
if (not exists $DIRTY{ $finfo . $block }) {
- $debug->("+++ missing $block+$blockoffset\n");
+ debug("+++ missing $block+$blockoffset\n");
$DIRTY{ $finfo . $block } = _readblock($finfo, BS, $block * BS);
}
@@ -274,11 +291,12 @@
while (<$fh>) {
last if /^$/;
/^(?<k>\S+):\s+(?:(?<n>\d+)|(?<v>.*?))\s*$/
- and do {
- # na sowas, die Zeitstempel dürfen nicht als Zeichenkette reinkommen!
- $meta{ $+{k} } = defined $+{n} ? (0+$+{n}) : $+{v};
- next;
- };
+ and do {
+
+ # na sowas, die Zeitstempel dürfen nicht als Zeichenkette reinkommen!
+ $meta{ $+{k} } = defined $+{n} ? (0 + $+{n}) : $+{v};
+ next;
+ };
}
return %meta;
}
--- a/bin/imager.save Mon Jun 18 16:55:10 2012 +0200
+++ b/bin/imager.save Mon Aug 27 15:51:22 2012 +0200
@@ -16,18 +16,17 @@
use Pod::Usage;
use Imager 0.1;
-use constant KiB => 1024;
-use constant MiB => 1024 * KiB;
-use constant GiB => 1024 * MiB;
-use constant BS => 4 * MiB;
-use constant DATEFMT => "%Y-%m-%dT%H:%M:%SZ";
-use constant CIPHER => "aes-128-cbc";
+use constant KiB => 1024;
+use constant MiB => 1024 * KiB;
+use constant GiB => 1024 * MiB;
+use constant BS => 4 * MiB;
+use constant DATEFMT => "%Y-%m-%dT%H:%M:%SZ";
+use constant CIPHER => "aes-128-cbc";
sub get_devsize;
sub get_devname;
sub save;
-
$SIG{INT} = sub { die "Got INT\n" };
my %o = (
@@ -53,7 +52,7 @@
"c|comment=s" => \$o{comment},
"z|compress:i" => sub { $o{compress} = $_[1] ? $_[1] : Z_BEST_SPEED },
"p|pass=s" => \$o{pass},
- "now=i" => \$o{now},
+ "now=i" => \$o{now},
"b|blocksize=s" => sub {
given ($_[1]) {
when (/(\d+)G/i) { $o{blocksize} = $1 * GiB };
@@ -83,7 +82,7 @@
my $rc = 0;
while (wait != -1) {
- $rc = ($? >> 8) if ($? >> 8) > $rc;
+ $rc = ($? >> 8) if ($? >> 8) > $rc;
}
exit $rc;
@@ -178,29 +177,28 @@
}
binmode($out);
-
- my $bufref = \$buffer;
- if ($o{compress}) {
- my $zbuffer;
- gzip(
- \$buffer => \$zbuffer,
- -Minimal => 1,
- -Level => Z_BEST_SPEED,
- -Strategy => Z_FILTERED
- ) or die $GzipError;
- if (length($zbuffer) / length($buffer) < 0.9) {
- $bufref = \$zbuffer;
- $ext = ".gz$ext";
- }
+ my $bufref = \$buffer;
+ if ($o{compress}) {
+ my $zbuffer;
+ gzip(
+ \$buffer => \$zbuffer,
+ -Minimal => 1,
+ -Level => Z_BEST_SPEED,
+ -Strategy => Z_FILTERED
+ ) or die $GzipError;
+ if (length($zbuffer) / length($buffer) < 0.9) {
+ $bufref = \$zbuffer;
+ $ext = ".gz$ext";
}
+ }
- #for(my $todo = length $$bufref;
- # $todo -= syswrite $out => $$bufref, $todo, -$todo; 1)
- #{
- #}
- syswrite $out => $$bufref;
-
- close($out) or die $!;
+ #for(my $todo = length $$bufref;
+ # $todo -= syswrite $out => $$bufref, $todo, -$todo; 1)
+ #{
+ #}
+ syswrite $out => $$bufref or die "$0: write: $!\n";
+ close($out) or die "$0: close output file: $!";
+
rename($out => "$data/$file$ext");
$index{BLOCKS}[$blknr] .= " *";
$stats{written}++;