X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fop%2Fpwent.t;h=4cccbfe01631f0131939b36daa0d1ea88eb07746;hb=36c66720946952b050ad9db88444230a58b3c69d;hp=4316b17028a33d3439a357dd8301ce80667623c2;hpb=2d8e6c8d50eaf50f663a5fd184404c73944226e0;p=p5sagit%2Fp5-mst-13.2.git diff --git a/t/op/pwent.t b/t/op/pwent.t index 4316b17..4cccbfe 100755 --- a/t/op/pwent.t +++ b/t/op/pwent.t @@ -2,48 +2,90 @@ BEGIN { chdir 't' if -d 't'; - @INC = "../lib" if -d "../lib"; + @INC = '../lib'; + eval {my @n = getpwuid 0}; + 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; +setpwent(); while () { chomp; - my @s = split /:/; + # 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) = @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) { @@ -57,33 +99,67 @@ 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++; } +endpwent(); -# Drop the multiply defined users. +if (keys %perfect == 0) { + $max++; + print < 1) { - # Multiply defined users are rarely intentional. - local $" = ", "; - print "# User '$_' defined multiple times in $where, lines: @{$seen{$_}}.\n"; - delete $suspect{$_}; - } +# Test both the scalar and list contexts. + +my @pw1; + +setpwent(); +for (1..$max) { + my $pw = scalar getpwent(); + last unless defined $pw; + push @pw1, $pw; +} +endpwent(); + +my @pw2; + +setpwent(); +for (1..$max) { + my ($pw) = (getpwent()); + last unless defined $pw; + push @pw2, $pw; } +endpwent(); -print "not " if keys %suspect; +print "not " unless "@pw1" eq "@pw2"; print "ok ", $tst++, "\n"; close(PW);