home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / languages / perl / scripts-convex / nfinger < prev    next >
Encoding:
Text File  |  1991-08-09  |  3.3 KB  |  155 lines

  1. #!/usr/local/bin/perl
  2. #
  3. # nfinger -- finger people at their home machines
  4. #         as defined in the /usr/lib/aliases 
  5. #         dbm file.  recursively resolve all
  6. #         aliases first, so works on lists
  7.  
  8. dbmopen(ALIAS,'/usr/lib/aliases',undef) || die "can't dbmopen aliases: $!";
  9.  
  10. chop($localhost = `hostname`);
  11.  
  12. @finger_opts = ();
  13. while ($ARGV[0] =~ /^-/) { 
  14.     if ($ARGV[0] eq '-v') {
  15.     $verbose++;
  16.     shift;
  17.     } else {
  18.     push(@finger_opts, shift); 
  19.     }
  20.  
  21. while ($user = shift) { 
  22.     undef %seen;
  23.     $seeking++;
  24.     push(@finger, &resolve($user)); 
  25. }
  26.  
  27. undef %seen;
  28. @ofinger = @finger;
  29. for (@finger) {
  30.     s/^\\//;
  31.     s/\s//g;
  32.     push(@nfinger, $_) unless $seen{$_}++ || m#^\s*("\s*)?[|/]#;
  33. @finger = sort @nfinger;
  34.  
  35. if ($seeking && !@finger) {
  36.     printf STDERR "$0: can't finger only pipes and files! (@ofinger)\n";
  37.     exit 1;
  38.  
  39. $exec = "/usr/ucb/finger @finger_opts @finger\n";
  40.  
  41. print $exec if $verbose;
  42.  
  43.  
  44. exec $exec unless grep(/-.*s/, @finger_opts);
  45.     
  46.  
  47. open (FINGER, "$exec 2>&1 |") || die "Can't open finger pipe\n";
  48.  
  49. $mask = "%-8s%s";
  50. $\ = "\n";
  51. $| = 1;
  52. $localhost = sprintf("%-8s", $localhost);
  53. $localhost =~ s/\..*//;            # trim spurious domain noise
  54.  
  55. while (<FINGER>) {
  56.     s/\s*$//;
  57.     next if /^$/;
  58.     if (/^\[([^\]]*)\]$/) {
  59.     $host = $1;
  60.     $host =~ s/\..*//;
  61.     $host = sprintf("%-8s", $host);
  62.     $sawhost = 1;
  63.     } elsif (/^Login/) {
  64.     if (!$printed++) {
  65.         substr($_, 9, 0) = 'Home    ';
  66.         s/   Name/Name   /;
  67.         print;
  68.     }
  69.     $host = $localhost unless $sawhost;
  70.     $sawhost = 0;
  71.     } elsif (/^\S+:/) {
  72.     $sawhost = /^finger:/;
  73.     print STDERR "$host <$_>";
  74.     } else {
  75.     substr($_, 9, 0) = $host;
  76.     print;
  77.     } 
  78. close FINGER || die "$0: error running finger, status was $?\n";
  79.  
  80. ##############################################################
  81.  
  82. sub resolve {
  83.     local($addr,$alias,@list);
  84.     local(@addrs) = @_;
  85.  
  86.     for $addr (@addrs) {
  87.     unless (defined $ALIAS{"$addr\0"}) {
  88.         push(@list, &forward($addr));
  89.         next;
  90.     } 
  91.     chop($alias = $ALIAS{"$addr\0"});
  92.         
  93.     $alias =~ s/^\s*(.*)\s*$/$1/;
  94.     $alias =~ s/^([^!]*)!([^!]+)$/$2@$1/;
  95.  
  96.     if ($alias eq "$addr@$localhost" || $alias eq $addr) {
  97.         push(@list, &forward($addr));
  98.     }  else {
  99.         print "[ $addr -> $alias ]\n" if $verbose;
  100.         push(@list,&resolve(split(/\s*,\s*/,$alias)));
  101.     }
  102.     } 
  103.     return @list;
  104.  
  105.  
  106. ##############################################################
  107.  
  108. sub forward {
  109.      local($user) = @_;
  110.      local($forward); 
  111.  
  112.      $seen{$addr}++ && return $addr;
  113.  
  114.      return $user if $user =~ /^\s*"?[|\/]/;
  115.      return $user if $user =~ /^\s*.+@.+$/;
  116.      return $user if $user =~ /^\s*.+\\?!.+$/;
  117.      return $user if $user =~ /^\s*\\/;
  118.  
  119.      if (($forward = &logdir($user)) && -r $forward .= '/.forward') {
  120.     if (!open forward) {
  121.         print STDERR "$0: cannot open $forward: $!\n";
  122.     } else {
  123.         print "[ $user -> $forward ]\n" if $verbose;
  124.         chop($user = <forward>);
  125.         close forward;
  126.         print "[ $forward -> $user ]\n" if $verbose;
  127.         return &resolve(split(/,/,$user));
  128.     }
  129.      } 
  130.      return $user;
  131.  
  132.  
  133. ##############################################################
  134.  
  135. sub logdir {
  136.     if (! $been_here_before++) { # might make it much faster
  137.     setpwent unless $dbm_passwd = dbmopen(PASSWD,'/etc/passwd', undef);
  138.     }
  139.  
  140.     if ($dbm_passwd) {
  141.     return '' unless defined $PASSWD{$_[0]};
  142.     local(@a);
  143.     @a = split(/[\000]+/,$PASSWD{$_[0]});
  144.     return $a[$#a-1];
  145.     } else {
  146.     return (getpwnam($_[0]))[7];
  147.     }
  148.