#! /usr/bin/perl $EBLOCKSIZE=131072; $dirents = $totdirentlen = $totnamelen = 0; $inodes = $totinodelen = 0; $sumnodes = $totsumnodelen = 0; $totpadlen = 0; $gaps = $totgaplen = 0; $nextaddr = 0; sub checkpadding { my ($addr, $totlen) = @_; my $len = hex($addr) - $nextaddr; if ($len > 0) { if (hex($addr) % $EBLOCKSIZE == 0 || $len <= 3) { $totalpadlen += $len; } else { print sprintf "Gap seen at %08x .. $addr, length $len\n", $nextaddr; $gaps++; $totgaplen += hex($addr) - $nextaddr; } } $nextaddr = hex($addr) + hex($totlen); } while(<>) { chop; if (/^\s+Dirent/) { die "Cannot parse $_" if (! /^ \s+ Dirent \s+ node \s at \s+ (\w+), \s+ totlen \s+ (\w+), \s+ \#pino \s+ (\w+), \s+ version \s+ (\w+), \s+ \#ino \s+ (\w+), \s+ nsize \s+ (\w+), \s+ name \s+ (.*) $/x); my ($addr, $totlen, $pino, $version, $ino, $nsize, $name) = ($1, $2, $3, $4, $5, $6, $7); &checkpadding($addr, $totlen); $dirents++; $totdirentlen += hex($totlen); $totnamelen += hex($nsize); } elsif (/^\s+Inode Sum/) { die "Cannot parse $_" if (! /^ \s+ Inode \s Sum \s+ node \s at \s+ (\w+), \s+ totlen \s+ (\w+), \s+ sum_num \s+ (\w+), \s+ cleanmarker \s size \s+ (\w+) \s* $/x); my ($addr, $totlen, $sum_num, $cleanmarksize) = ($1, $2, $3, $4); &checkpadding($addr, $totlen); $sumnodes++; $totsumnodelen += hex($totlen); } elsif (/^\s+Inode/) { die "Cannot parse $_" if (! /^ \s+ Inode \s+ node \s at \s+ (\w+), \s+ totlen \s+ (\w+), \s+ \#ino \s+ (\w+), \s+ version \s+ (\w+), \s+ isize \s+ (\w+), \s+ csize \s+ (\w+), \s+ dsize \s+ (\w+), \s+ offset \s+ (\w+) \s* $/x); my ($addr, $totlen, $ino, $version, $isize, $csize, $dsize, $offset) = ($1, $2, $3, $4, $5, $6, $7, $8); &checkpadding($addr, $totlen); $inodes++; $totinodelen += hex($totlen); } else { die "Cannot parse $_"; } } $totalsize = $totdirentlen + $totinodelen + $totsumnodelen + $totpadlen + $totgaplen; print "Number of dirents:\t$dirents.\n"; print sprintf " Total dirent node space:\t$totdirentlen (%.1f%%)\n", 100.0*$totdirentlen/$totalsize; print " Average dirent len:\t", sprintf("%.1f", $totdirentlen/$dirents), "\n" if ($dirents > 0); print " Total dirent name space:\t$totnamelen\n"; print sprintf(" Average name len:\t%.1f\n", $totnamelen/$dirents) if ($dirents > 0); print "\n"; print "Number of Inodes:\t$inodes\n"; print sprintf " Total Inode space:\t$totinodelen (%.1f%%)\n", 100.0*$totinodelen/$totalsize; print " Average Inode size:\t", sprintf("%.1f", $totinodelen/$inodes), "\n" if ($inodes > 0); if ($sumnodes) { print "\n"; print "Number of Inode Summary nodes:\t$sumnodes\n"; print sprintf " Total Inode Sum space:\t$totsumnodelen, (%.1f%%)\n", 100.0*$totsumnodelen/$totalsize; print " Average Sum node size:\t", sprintf("%.1f", $totsumnodelen/$sumnodes), "\n"; } print sprintf "\nPadding:\t$totalpadlen %.1f%%\n", 100.0*$totalpadlen/$totalsize; print "Total image size: $totalsize\n";