| #!/usr/bin/perl -w |
| # SPDX-License-Identifier: GPL-2.0 |
| # Copyright (c) 2000-2001 Silicon Graphics, Inc. All Rights Reserved. |
| # |
| # traverse the entire filesystem dumping info. |
| # |
| 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/$_"); |
| } |
| } |
| |