#!/usr/bin/perl -w # (C) 2003-2007 Willem Jan Hengeveld # Web: http://www.xs4all.nl/~itsme/ # http://wiki.xda-developers.com/ # # $Id$ # use strict; # list files from reiserfs using rfstools. use Dumpvalue; use POSIX; use Time::Local; my $d= Dumpvalue->new(); my $path= shift || ""; my $dir= RecurseDir($path); ListDir($dir, $path); exit(0); sub ListDir { my ($dir, $path)= @_; print "Directory of $path:\n"; for my $name (sort keys %$dir) { PrintDirEntry($dir->{$name}); } for my $name (sort keys %$dir) { if ($dir->{$name}{type} eq "d") { ListDir($dir->{$name}{contents}, "$path/$name"); } } } sub PrintDirEntry { my ($entry)= @_; print $entry->{type}, $entry->{perms}, " ", sprintf("%10d", $entry->{size}), " ", DateString($entry->{timestamp}), " ", $entry->{name}, "\n"; } sub DateString { my ($time)= @_; return POSIX::strftime("%Y-%m-%d %H:%M:%S", localtime $time); } sub RecurseDir { my ($path)= @_; print "reading $path\n"; my $dir= rfsdir($path); for my $name (keys %$dir) { if ($dir->{$name}{type} eq "d") { $dir->{$name}{contents}= RecurseDir("$path/$name"); } } return $dir; } sub rfsdir { my ($path)= @_; open RFS, "rfstool ls $path|" or die "error running rfstool: $@\n"; my $dir={}; while () { if (my ($type, $perms, $size, $month, $day, $time, $year, $name)= (m{^(.)(.{9})\s(.{12})\s\w{3}\s(\w{3})\s(\d{2})\s([\d:]{8})\s(\d{4})\s(.*?)\s*$})) { next if ($name eq "." || $name eq ".."); $dir->{$name}= { type=>$type, perms=>$perms, size=>$size =~ /\d/? int($size):0, timestamp=>toDateTime($year, $month, $day, $time), name=>$name, }; } } close RFS; return $dir; } sub toDateTime { my ($year, $month, $day, $time)= @_; my @months= qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); my %months= map { $months[$_] => $_ } (0..$#months); my ($hour, $minute, $second)= ($time =~ /(\d+):(\d+):(\d+)/); return timelocal($second, $minute, $hour, $day, $months{$month}, $year-1900); }