X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fop%2Fgrent.t;h=3611c1b890e1b97ec2511ce91f5c41cd982eca75;hb=dae61315f25fcf8c7df4b4125f53b733e5e58dea;hp=d054ccc2b990025feeb58783addea280f8845fc3;hpb=87cfc387a12aa6d69540adfec3c0fdfbcea8ac7c;p=p5sagit%2Fp5-mst-13.2.git diff --git a/t/op/grent.t b/t/op/grent.t index d054ccc..3611c1b 100755 --- a/t/op/grent.t +++ b/t/op/grent.t @@ -2,41 +2,97 @@ BEGIN { chdir 't' if -d 't'; - @INC = "../lib" if -d "../lib"; - eval { require Config; import Config; }; + @INC = '../lib'; + require './test.pl'; +} - my $GR = "/etc/group"; +eval {my @n = getgrgid 0}; +if ($@ =~ /(The \w+ function is unimplemented)/) { + skip_all "getgrgid unimplemented"; +} + +eval { require Config; import Config; }; +my $reason; +if ($Config{'i_grp'} ne 'define') { + $reason = '$Config{i_grp} not defined'; +} +elsif (not -f "/etc/group" ) { # Play safe. + $reason = 'no /etc/group file'; +} - $where = $GR; +if (not defined $where) { # Try NIS. + foreach my $ypcat (qw(/usr/bin/ypcat /bin/ypcat /etc/ypcat)) { + if (-x $ypcat && + open(GR, "$ypcat group 2>/dev/null |") && + defined()) + { + print "# `ypcat group` worked\n"; - if (-x "/usr/bin/nidump") { # nidump is not just NeXT/OpenStep - if (open(GR, "nidump group . |")) { - $where = "NetInfo group"; - } else { - print "1..0\n"; - exit 0; - } - } elsif ((defined $Config{'i_grp'} and $Config{'i_grp'} ne 'define') - or not -f $GR or not open(GR, $GR) - ) { - print "1..0\n"; - exit 0; + # Check to make sure we're really using NIS. + if( open(NSSW, "/etc/nsswitch.conf" ) ) { + my($group) = grep /^\s*group:/, ; + + # If there's no group line, assume it default to compat. + if( !$group || $group !~ /(nis|compat)/ ) { + print "# Doesn't look like you're using NIS in ". + "/etc/nsswitch.conf\n"; + last; + } + } + $where = "NIS group - $ypcat"; + undef $reason; + last; + } } } -print "1..1\n"; +if (not defined $where) { # Try NetInfo. + foreach my $nidump (qw(/usr/bin/nidump)) { + if (-x $nidump && + open(GR, "$nidump group . 2>/dev/null |") && + defined()) + { + $where = "NetInfo group - $nidump"; + undef $reason; + last; + } + } +} + +if (not defined $where) { # Try local. + my $GR = "/etc/group"; + if (-f $GR && open(GR, $GR) && defined()) { + undef $reason; + $where = "local $GR"; + } +} + +if ($reason) { + skip_all $reason; +} + + +# By now the GR filehandle should be open and full of juicy group entries. + +plan tests => 3; # Go through at most this many groups. +# (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"; + +ok( setgrent(), 'setgrent' ) || print "# $!\n"; + while () { chomp; - my @s = split /:/; + # LIMIT -1 so that groups with no users don't fall off + my @s = split /:/, $_, -1; my ($name_s,$passwd_s,$gid_s,$members_s) = @s; if (@s) { push @{ $seen{$name_s} }, $.; @@ -44,7 +100,11 @@ while () { 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 != 4 but do we know enough # of group file formats everywhere? if (@s == 4) { @@ -61,31 +121,68 @@ while () { ($name,$passwd,$gid,$members) = @n; next if $name_s ne $name; } + # NOTE: group names *CAN* contain whitespace. $members =~ s/\s+/,/g; - $suspect{$name_s}++ - if $name ne $name_s or -# Shadow passwords confuse this. + # what about different orders of members? + $perfect{$name_s}++ + if $name eq $name_s and +# Do not compare passwords: think shadow passwords. # Not that group passwords are used much but better not assume anything. -# $passwd ne $passwd_s or - $gid ne $gid_s or - $members ne $members_s; + $gid eq $gid_s and + $members eq $members_s; } $n++; } -# Drop the multiply defined groups. +endgrent(); -foreach (sort keys %seen) { - my $times = @{ $seen{$_} }; - if ($times > 1) { - # Multiply defined groups are rarely intentional. - local $" = ", "; - print "# Group '$_' 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 <