home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / perl560.zip / t / op / grent.t < prev    next >
Text File  |  1999-07-27  |  3KB  |  140 lines

  1. #!./perl
  2.  
  3. BEGIN {
  4.     chdir 't' if -d 't';
  5.     unshift @INC, "../lib" if -d "../lib";
  6.     eval {my @n = getgrgid 0};
  7.     if ($@ && $@ =~ /(The \w+ function is unimplemented)/) {
  8.     print "1..0 # Skip: $1\n";
  9.     exit 0;
  10.     }
  11.     eval { require Config; import Config; };
  12.     my $reason;
  13.     if ($Config{'i_grp'} ne 'define') {
  14.     $reason = '$Config{i_grp} not defined';
  15.     }
  16.     elsif (not -f "/etc/group" ) { # Play safe.
  17.     $reason = 'no /etc/group file';
  18.     }
  19.  
  20.     if (not defined $where) {    # Try NIS.
  21.     foreach my $ypcat (qw(/usr/bin/ypcat /bin/ypcat /etc/ypcat)) {
  22.         if (-x $ypcat &&
  23.         open(GR, "$ypcat group 2>/dev/null |") &&
  24.         defined(<GR>)) {
  25.         $where = "NIS group";
  26.         undef $reason;
  27.         last;
  28.         }
  29.     }
  30.     }
  31.  
  32.     if (not defined $where) {    # Try NetInfo.
  33.     foreach my $nidump (qw(/usr/bin/nidump)) {
  34.         if (-x $nidump &&
  35.         open(GR, "$nidump group . 2>/dev/null |") &&
  36.         defined(<GR>)) {
  37.         $where = "NetInfo group";
  38.         undef $reason;
  39.         last;
  40.         }
  41.     }
  42.     }
  43.  
  44.     if (not defined $where) {    # Try local.
  45.     my $GR = "/etc/group";
  46.     if (-f $GR && open(GR, $GR) && defined(<GR>)) {
  47.         undef $reason;
  48.         $where = $GR;
  49.     }
  50.     }
  51.     if ($reason) {
  52.     print "1..0 # Skip: $reason\n";
  53.     exit 0;
  54.     }
  55. }
  56.  
  57. # By now GR filehandle should be open and full of juicy group entries.
  58.  
  59. print "1..1\n";
  60.  
  61. # Go through at most this many groups.
  62. # (note that the first entry has been read away by now)
  63. my $max = 25;
  64.  
  65. my $n   = 0;
  66. my $tst = 1;
  67. my %perfect;
  68. my %seen;
  69.  
  70. while (<GR>) {
  71.     chomp;
  72.     my @s = split /:/;
  73.     my ($name_s,$passwd_s,$gid_s,$members_s) = @s;
  74.     if (@s) {
  75.     push @{ $seen{$name_s} }, $.;
  76.     } else {
  77.     warn "# Your $where line $. is empty.\n";
  78.     next;
  79.     }
  80.     if ($n == $max) {
  81.     local $/;
  82.     my $junk = <GR>;
  83.     last;
  84.     }
  85.     # In principle we could whine if @s != 4 but do we know enough
  86.     # of group file formats everywhere?
  87.     if (@s == 4) {
  88.     $members_s =~ s/\s*,\s*/,/g;
  89.     $members_s =~ s/\s+$//;
  90.     $members_s =~ s/^\s+//;
  91.     @n = getgrgid($gid_s);
  92.     # 'nogroup' et al.
  93.     next unless @n;
  94.     my ($name,$passwd,$gid,$members) = @n;
  95.     # Protect against one-to-many and many-to-one mappings.
  96.     if ($name_s ne $name) {
  97.         @n = getgrnam($name_s);
  98.         ($name,$passwd,$gid,$members) = @n;
  99.         next if $name_s ne $name;
  100.     }
  101.     # NOTE: group names *CAN* contain whitespace.
  102.     $members =~ s/\s+/,/g;
  103.     # what about different orders of members?
  104.     $perfect{$name_s}++
  105.         if $name    eq $name_s    and
  106. # Do not compare passwords: think shadow passwords.
  107. # Not that group passwords are used much but better not assume anything.
  108.                $gid     eq $gid_s     and
  109.                $members eq $members_s;
  110.     }
  111.     $n++;
  112. }
  113.  
  114. if (keys %perfect == 0) {
  115.     $max++;
  116.     print <<EOEX;
  117. #
  118. # The failure of op/grent test is not necessarily serious.
  119. # It may fail due to local group administration conventions.
  120. # If you are for example using both NIS and local groups,
  121. # test failure is possible.  Any distributed group scheme
  122. # can cause such failures.
  123. #
  124. # What the grent test is doing is that it compares the $max first
  125. # entries of $where
  126. # with the results of getgrgid() and getgrnam() call.  If it finds no
  127. # matches at all, it suspects something is wrong.
  128. EOEX
  129.     print "not ";
  130.     $not = 1;
  131. } else {
  132.     $not = 0;
  133. }
  134. print "ok ", $tst++;
  135. print "\t# (not necessarily serious: run t/op/grent.t by itself)" if $not;
  136. print "\n";
  137.  
  138. close(GR);
  139.