X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fop%2Fgrent.t;h=761d8b9cf6042442f6aad0feb481c33cc723c5f7;hb=5cec1e3b3b86ef84555da325ea92c9cc0b18b7b2;hp=393065379e237d5a7b8979a11962af6e2853b6fc;hpb=c5987ebb451d843cbf0a792310f25ebaec3f7378;p=p5sagit%2Fp5-mst-13.2.git diff --git a/t/op/grent.t b/t/op/grent.t index 3930653..761d8b9 100755 --- a/t/op/grent.t +++ b/t/op/grent.t @@ -2,33 +2,92 @@ BEGIN { chdir 't' if -d 't'; - @INC = "../lib" if -d "../lib"; + unshift @INC, "../lib" if -d "../lib"; + eval {my @n = getgrgid 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_grp'} ne 'define') { + $reason = '$Config{i_grp} not defined'; + } + elsif (not -f "/etc/group" ) { # Play safe. + $reason = 'no /etc/group file'; + } - my $GR = "/etc/group"; + 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()) { + $where = "NIS group"; + undef $reason; + last; + } + } + } - if ($Config{'i_grp'} ne 'define' or not -f $GR or not open(GR, $GR)) { - print "1..0\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"; + undef $reason; + last; + } + } + } + + if (not defined $where) { # Try local. + my $GR = "/etc/group"; + if (-f $GR && open(GR, $GR) && defined()) { + undef $reason; + $where = $GR; + } + } + if ($reason) { + print "1..0 # Skip: $reason\n"; exit 0; } } +# By now GR filehandle should be open and full of juicy group entries. + print "1..1\n"; # Go through at most this many groups. -my $max = 25; # +# (note that the first entry has been read away by now) +my $max = 25; -my $n = 0; -my $not; +my $n = 0; my $tst = 1; +my %perfect; +my %seen; -$not = 0; while () { - last if $n == $max; chomp; - @s = split /:/; + my @s = split /:/; + my ($name_s,$passwd_s,$gid_s,$members_s) = @s; + if (@s) { + push @{ $seen{$name_s} }, $.; + } else { + warn "# Your $where line $. is empty.\n"; + next; + } + 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) { - my ($name_s,$passwd_s,$gid_s,$members_s) = @s; + $members_s =~ s/\s*,\s*/,/g; + $members_s =~ s/\s+$//; + $members_s =~ s/^\s+//; @n = getgrgid($gid_s); # 'nogroup' et al. next unless @n; @@ -39,18 +98,42 @@ while () { ($name,$passwd,$gid,$members) = @n; next if $name_s ne $name; } - $members =~ s/ /,/g; - $not = 1, last - if $name ne $name_s or -# Shadow passwords confuse this. -# $passwd ne $passwd_s or - $gid ne $gid_s or - $members ne $members_s; + # NOTE: group names *CAN* contain whitespace. + $members =~ s/\s+/,/g; + # 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. + $gid eq $gid_s and + $members eq $members_s; } $n++; } -print "not " if $not; -print "ok ", $tst++, "\n"; +if (keys %perfect == 0) { + $max++; + print <