| #!/usr/bin/perl -w | |
| # | |
| # Copyright (c) 2000-2001 Silicon Graphics, Inc. All Rights Reserved. | |
| # | |
| # This program is free software; you can redistribute it and/or | |
| # modify it under the terms of the GNU General Public License as | |
| # published by the Free Software Foundation. | |
| # | |
| # This program is distributed in the hope that it would be useful, | |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| # GNU General Public License for more details. | |
| # | |
| # You should have received a copy of the GNU General Public License | |
| # along with this program; if not, write the Free Software Foundation, | |
| # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
| # | |
| # | |
| # traverse the entire filesystem dumping info. | |
| # | |
| # dxm 5/10/00 | |
| use MD5; | |
| use Getopt::Std; | |
| my %opt; | |
| sub scan($) | |
| { | |
| my ($file)=@_; | |
| my ($md5)=new MD5; | |
| my (@stat); | |
| unless (@stat=lstat("$file")) { | |
| printf("%-" . ($opt{v}?65:32) . "s $file\n", "!!! could not lstat"); | |
| return; | |
| } | |
| $stat[0]=$stat[8]=""; # wipe the device and access time | |
| $md5->reset; | |
| $md5->add(join(" ",@stat)); | |
| print join(" ",@stat), "\n"; | |
| if ($opt{v}) { | |
| print $md5->hexdigest . " "; | |
| $md5->reset; | |
| } | |
| if (-l "$file") { | |
| if (!defined($link = readlink $file)) { | |
| printf("%-32s $file\n", "!!! could not readlink"); | |
| return; | |
| } | |
| $md5->add($link); | |
| } elsif (-f "$file") { | |
| if (!open(FILE, "$file")) { | |
| printf("%-32s $file\n", "!!! could not read"); | |
| return; | |
| } | |
| $md5->addfile(FILE); | |
| close (FILE); | |
| } | |
| print $md5->hexdigest . " $file\n"; | |
| } | |
| getopts('vs', \%opt); | |
| die "Usage: $0 <dir>\n" unless (@ARGV == 1); | |
| $dir=shift @ARGV; | |
| die "can't read $dir\n" unless (-r $dir); | |
| die "$dir is not a directory\n" unless (-d _); | |
| chomp($HOST = `hostname -s`); | |
| print "*** fs-walk host $HOST dir $dir\n"; | |
| @todo=$dir; | |
| while ($dir = shift @todo) { | |
| scan($dir); | |
| unless (opendir(DIR,$dir)) { | |
| printf("%-" . ($opt{v}?65:32) . "s $dir\n", "!!! could not opendir"); | |
| next; | |
| } | |
| unless (@all=readdir(DIR)) { | |
| printf("%-" . ($opt{v}?65:32) . "s $dir\n", "!!! could not readdir"); | |
| next; | |
| } | |
| closedir(DIR); | |
| @dirs=grep(-d "$dir/$_" && !-l "$dir/$_", @all); | |
| foreach (@all) { | |
| next if /^\.\.?$/; | |
| scan("$dir/$_"); | |
| } | |
| foreach (grep(!/^\.\.?$/, @dirs)) { | |
| push (@todo,"$dir/$_"); | |
| } | |
| } | |