X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fop%2Fpwent.t;h=fc71f574ad07a76a3b60daf6384a7c5d05ba9459;hb=a4c04bdcc508b6a45f83e703d0f82401445aa55b;hp=13655880042afb31662d59694f02aac51d4aed42;hpb=55ec6b6309c634e33b4056d21286b6381092bd30;p=p5sagit%2Fp5-mst-13.2.git diff --git a/t/op/pwent.t b/t/op/pwent.t index 1365588..fc71f57 100755 --- a/t/op/pwent.t +++ b/t/op/pwent.t @@ -2,51 +2,101 @@ BEGIN { chdir 't' if -d 't'; - @INC = "../lib" if -d "../lib"; + @INC = '../lib'; + eval {my @n = getpwuid 0; setpwent()}; + if ($@ && $@ =~ /(The \w+ function is unimplemented)/) { + print "1..0 # Skip: $1\n"; + exit 0; + } eval { require Config; import Config; }; + my $reason; + if ($Config{'i_pwd'} ne 'define') { + $reason = '$Config{i_pwd} undefined'; + } + elsif (not -f "/etc/passwd" ) { # Play safe. + $reason = 'no /etc/passwd file'; + } - my $PW = "/etc/passwd"; + if (not defined $where) { # Try NIS. + foreach my $ypcat (qw(/usr/bin/ypcat /bin/ypcat /etc/ypcat)) { + if (-x $ypcat && + open(PW, "$ypcat passwd 2>/dev/null |") && + defined()) { + $where = "NIS passwd"; + undef $reason; + last; + } + } + } - $where = $PW; + if (not defined $where) { # Try NetInfo. + foreach my $nidump (qw(/usr/bin/nidump)) { + if (-x $nidump && + open(PW, "$nidump passwd . 2>/dev/null |") && + defined()) { + $where = "NetInfo passwd"; + undef $reason; + last; + } + } + } - if (-x "/usr/bin/nidump") { - if (open(PW, "nidump passwd . |")) { - $where = "NetInfo"; - } else { - print "1..0\n"; - exit 0; + if (not defined $where) { # Try local. + my $PW = "/etc/passwd"; + if (-f $PW && open(PW, $PW) && defined()) { + $where = $PW; + undef $reason; } - } elsif ((defined $Config{'i_pwd'} and $Config{'i_pwd'} ne 'define') - or not -f $PW or not open(PW, $PW)) { - print "1..0\n"; + } + + if ($reason) { # Give up. + print "1..0 # Skip: $reason\n"; exit 0; } } -print "1..1\n"; +# By now the PW filehandle should be open and full of juicy password entries. + +print "1..2\n"; # Go through at most this many users. -my $max = 25; # +# (note that the first entry has been read away by now) +my $max = 25; my $n = 0; my $tst = 1; -my %suspect; +my %perfect; my %seen; +print "# where $where\n"; + +setpwent(); + while () { chomp; - my @s = split /:/; - my ($name_s, $passwd_s, $uid_s, $gid_s, $gcos_s, $home_s, $shell_s) = @s; + # LIMIT -1 so that users with empty shells don't fall off + my @s = split /:/, $_, -1; + my ($name_s, $passwd_s, $uid_s, $gid_s, $gcos_s, $home_s, $shell_s); + if ($^O eq 'darwin') { + ($name_s, $passwd_s, $uid_s, $gid_s, $gcos_s, $home_s, $shell_s) = @s[0,1,2,3,7,8,9]; + } else { + ($name_s, $passwd_s, $uid_s, $gid_s, $gcos_s, $home_s, $shell_s) = @s; + } + next if /^\+/; # ignore NIS includes if (@s) { push @{ $seen{$name_s} }, $.; } else { warn "# Your $where line $. is empty.\n"; next; } - next if $n == $max; + if ($n == $max) { + local $/; + my $junk = ; + last; + } # In principle we could whine if @s != 7 but do we know enough # of passwd file formats everywhere? - if (@s == 7) { + if (@s == 7 || ($^O eq 'darwin' && @s == 10)) { @n = getpwuid($uid_s); # 'nobody' et al. next unless @n; @@ -57,33 +107,70 @@ while () { ($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$home,$shell) = @n; next if $name_s ne $name; } - $suspect{$name_s}++ - if $name ne $name_s or -# Shadow passwords confuse this. -# Think about non-crypt(3) encryptions, too, before you do anything rash. -# $passwd ne $passwd_s or - $uid ne $uid_s or - $gid ne $gid_s or - $gcos ne $gcos_s or - $home ne $home_s or - $shell ne $shell_s; + $perfect{$name_s}++ + if $name eq $name_s and + $uid eq $uid_s and +# Do not compare passwords: think shadow passwords. + $gid eq $gid_s and + $gcos eq $gcos_s and + $home eq $home_s and + $shell eq $shell_s; } $n++; } -# Drop the multiply defined users. +endpwent(); -foreach (sort keys %seen) { - my $times = @{ $seen{$_} }; - if ($times > 1) { - # Multiply defined users are rarely intentional. - local $" = ", "; - warn "# User '$_' defined multiple times in $where, lines: @{$seen{$_}}.\n"; - delete $suspect{$_}; - } +print "# max = $max, n = $n, perfect = ", scalar keys %perfect, "\n"; + +if (keys %perfect == 0 && $n) { + $max++; + print <