home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 2 / 2112 / nfinger < prev   
Encoding:
Text File  |  1990-12-28  |  3.3 KB  |  152 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.  
  54. while (<FINGER>) {
  55.     s/\s*$//;
  56.     next if /^$/;
  57.     if (/^\[([^\]]*)\]$/) {
  58.     $host = sprintf("%-8s", $1);
  59.     $sawhost = 1;
  60.     } elsif (/^Login/) {
  61.     if (!$printed++) {
  62.         substr($_, 9, 0) = 'Home    ';
  63.         s/   Name/Name   /;
  64.         print;
  65.     }
  66.     $host = $localhost unless $sawhost;
  67.     $sawhost = 0;
  68.     } elsif (/^\S+:/) {
  69.     $sawhost = /^finger:/;
  70.     print STDERR "$host <$_>";
  71.     } else {
  72.     substr($_, 9, 0) = $host;
  73.     print;
  74.     } 
  75. close FINGER || die "$0: error running finger, status was $?\n";
  76.  
  77. ##############################################################
  78.  
  79. sub resolve {
  80.     local($addr,$alias,@list);
  81.     local(@addrs) = @_;
  82.  
  83.     for $addr (@addrs) {
  84.     unless (defined $ALIAS{"$addr\0"}) {
  85.         push(@list, &forward($addr));
  86.         next;
  87.     } 
  88.     chop($alias = $ALIAS{"$addr\0"});
  89.         
  90.     $alias =~ s/^\s*(.*)\s*$/$1/;
  91.     $alias =~ s/^([^!]*)!([^!]+)$/$2@$1/;
  92.  
  93.     if ($alias eq "$addr@$localhost" || $alias eq $addr) {
  94.         push(@list, &forward($addr));
  95.     }  else {
  96.         print "[ $addr -> $alias ]\n" if $verbose;
  97.         push(@list,&resolve(split(/\s*,\s*/,$alias)));
  98.     }
  99.     } 
  100.     return @list;
  101.  
  102.  
  103. ##############################################################
  104.  
  105. sub forward {
  106.      local($user) = @_;
  107.      local($forward); 
  108.  
  109.      $seen{$addr}++ && return $addr;
  110.  
  111.      return $user if $user =~ /^\s*"?[|\/]/;
  112.      return $user if $user =~ /^\s*.+@.+$/;
  113.      return $user if $user =~ /^\s*.+\\?!.+$/;
  114.      return $user if $user =~ /^\s*\\/;
  115.  
  116.      if (($forward = &logdir($user)) && -r $forward .= '/.forward') {
  117.     if (!open forward) {
  118.         print STDERR "$0: cannot open $forward: $!\n";
  119.     } else {
  120.         print "[ $user -> $forward ]\n" if $verbose;
  121.         chop($user = <forward>);
  122.         close forward;
  123.         print "[ $forward -> $user ]\n" if $verbose;
  124.         return &resolve(split(/,/,$user));
  125.     }
  126.      } 
  127.      return $user;
  128.  
  129.  
  130. ##############################################################
  131.  
  132. sub logdir {
  133.     if (! $been_here_before++) { # might make it much faster
  134.     setpwent unless $dbm_passwd = dbmopen(PASSWD,'/etc/passwd', undef);
  135.     }
  136.  
  137.     if ($dbm_passwd) {
  138.     return '' unless defined $PASSWD{$_[0]};
  139.     local(@a);
  140.     @a = split(/[\000]+/,$PASSWD{$_[0]});
  141.     return $a[$#a-1];
  142.     } else {
  143.     return (getpwnam($_[0]))[7];
  144.     }
  145.