#!/usr/local/bin/perl # Copyright (c) 1998 Gabor Egressy gabor@vmunix.com # All rights reserved. All wrongs reversed. This program is free # software; you can redistribute it and/or modify it under the same # terms as Perl itself. use strict; use vars qw(%dir %suid %old_suid @suid $home); sub recurse($); sub recurse($) { my $dir = shift; opendir DIR,"$dir/" or return; my @files = grep {!/^\.\.?$/} readdir DIR or return; closedir DIR; my ($dev,$ino) = (stat "$dir/")[0,1]; $dir{"$dev-$ino"} = 1; my $file; for $file (@files) { ($dev,$ino) = (stat "$dir/$file")[0,1]; if(-f _) { $suid{"$dir/$file"} = 1 if -u _ || -g _; } elsif(-d _ && ! exists $dir{"$dev-$ino"}) { $suid{"$dir/$file/"} = 1 if -u _ || -g _; recurse "$dir/$file"; } } } $home = (getpwuid $<)[7]; open FILE,"$home/.suid_files" or goto FIRST; while() { chop; $old_suid{$_} = 1; } close FILE; FIRST : recurse ''; open FILE,">$home/.suid_files" or die "$!"; for (sort keys %suid) { push @suid,$_ if ! exists $old_suid{$_}; print FILE "$_\n"; } close FILE; print "New suid/sgid files\n" if @suid > 0; for (@suid) { print "$_\n"; } @suid = (); for (sort keys %old_suid) { push @suid,$_ if ! exists $suid{$_}; } print "Removed suid/sgid files\n" if @suid > 0; for (@suid) { print "$_\n"; }