home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / languages / perl / scripts-convex / getalias < prev    next >
Encoding:
Text File  |  1993-07-14  |  2.7 KB  |  117 lines

  1. #!/usr/local/bin/perl
  2.  
  3. dbmopen(ALIASES,'/usr/lib/aliases',undef) || die "can't dbmopen aliases";
  4.  
  5. require 'getopts.pl';;
  6.  
  7. (&Getopts('avVs') && $#ARGV >= 0) || die "usage: $0 [-avVs] alias ...\n";
  8.  
  9. chop($host = `hostname`);
  10.  
  11. ($aliasonly, $verbose, $showall, $short) = ($opt_a, $opt_v, $opt_V, $opt_s);
  12. $verbose |= $showall;
  13.  
  14. while ($user = shift) {
  15.     local(%seen);
  16.     if ($short) {
  17.     print join(' ', &resolve($user)), "\n";
  18.     } else {
  19.     print "$user -> ", join(', ', sort &resolve($user)), "\n";
  20.     } 
  21. }
  22.  
  23. sub resolve {
  24.     local($addr,$alias,@list,@ilist);
  25.  
  26.     while ($addr = shift) {
  27.     if ($seen{$addr}++) {
  28.         #push(@list, $addr);
  29.         next;
  30.     } 
  31.     unless (defined $ALIASES{"$addr\0"}) {
  32.         push(@list, &forward($addr));
  33.         next;
  34.     } 
  35.     chop($alias = $ALIASES{"$addr\0"});
  36.     $alias =~ s/^\s*(.*)\s*$/$1/;
  37.     if ($alias eq $addr) {
  38.         push(@list, &forward($addr));
  39.         next;
  40.     } 
  41.     if ($alias =~ /^"/) {
  42.         push(@list, $alias);
  43.         next;
  44.     } 
  45.     print "[ $addr -> $alias ]\n" 
  46.         if $showall || ($verbose 
  47.         && ($alias !~ /^$addr@\w+$/ && 
  48.             $alias !~ /^[^!]+![^!]+$/));
  49.     if ($alias eq "$addr@$host") {
  50.         push(@list, &forward($addr));
  51.         next;
  52.     } 
  53.     if ($alias =~ /^:include:(.*)/) {
  54.         unless (open(INC, $file = $1)) {
  55.         print STDERR "$0: can't open $file: $!\n";
  56.         next;
  57.         }
  58.         @ilist = grep(!/^#/, <INC>);
  59.         for (@ilist) { s/\s//g; } 
  60.         close(INC);
  61.         printf "[ %s -> %s ]\n", $file, join(' ', @ilist) if $verbose;
  62.         push(@list,&resolve(@ilist));
  63.     } else {
  64.         push(@list,&resolve(split(/\s*,\s*/,$alias)));
  65.     }
  66.     } 
  67.     return @list;
  68.  
  69.  
  70. ##############################################################
  71.  
  72. sub forward {
  73.      local($user) = @_;
  74.      local($forward); 
  75.  
  76.      return $user if $aliasonly;
  77.      return $user if $user =~ /^\s*"?[|\/]/;
  78.      return $user if $user =~ /^\s*.+@.+$/;
  79.      return $user if $user =~ /^\s*.+\\?!.+$/;
  80.      return $user if $user =~ /^\s*\\/;
  81.  
  82.      if (($forward = &logdir($user)) && -r $forward .= '/.forward') {
  83.     if (!open forward) {
  84.         print STDERR "$0: cannot open $forward: $!\n";
  85.     } else {
  86.         print "[ $user -> $forward ]\n" if $verbose;
  87.         chop($user = <forward>);
  88.         close forward;
  89.         print "[ $forward -> $user ]\n" if $verbose;
  90.         return &resolve(split(/\s*,\s*/,$user));
  91.     }
  92.      } else {
  93.     #print "no forward for $user\n";
  94.      } 
  95.      $user = "$user <MAILER-DAEMON>" unless $forward;
  96.      return $user;
  97.  
  98.  
  99. ##############################################################
  100.  
  101. sub logdir {
  102.     if (! $been_here_before++) { # might make it much faster
  103.     setpwent unless $dbm_passwd = dbmopen(PASSWD,'/etc/passwd', undef);
  104.     }
  105.  
  106.     if ($dbm_passwd) {
  107.     return '' unless defined $PASSWD{$_[0]};
  108.     local(@a);
  109.     @a = split(/[\000]+/,$PASSWD{$_[0]});
  110.     return $a[$#a-1];
  111.     } else {
  112.     return (getpwnam($_[0]))[7];
  113.     }
  114.