home *** CD-ROM | disk | FTP | other *** search
- #!/usr/local/bin/perl
-
- dbmopen(ALIASES,'/usr/lib/aliases',undef) || die "can't dbmopen aliases";
-
- require 'getopts.pl';;
-
- (&Getopts('avVs') && $#ARGV >= 0) || die "usage: $0 [-avVs] alias ...\n";
-
- chop($host = `hostname`);
-
- ($aliasonly, $verbose, $showall, $short) = ($opt_a, $opt_v, $opt_V, $opt_s);
- $verbose |= $showall;
-
- while ($user = shift) {
- local(%seen);
- if ($short) {
- print join(' ', &resolve($user)), "\n";
- } else {
- print "$user -> ", join(', ', sort &resolve($user)), "\n";
- }
- }
-
- sub resolve {
- local($addr,$alias,@list,@ilist);
-
- while ($addr = shift) {
- if ($seen{$addr}++) {
- #push(@list, $addr);
- next;
- }
- unless (defined $ALIASES{"$addr\0"}) {
- push(@list, &forward($addr));
- next;
- }
- chop($alias = $ALIASES{"$addr\0"});
- $alias =~ s/^\s*(.*)\s*$/$1/;
- if ($alias eq $addr) {
- push(@list, &forward($addr));
- next;
- }
- if ($alias =~ /^"/) {
- push(@list, $alias);
- next;
- }
- print "[ $addr -> $alias ]\n"
- if $showall || ($verbose
- && ($alias !~ /^$addr@\w+$/ &&
- $alias !~ /^[^!]+![^!]+$/));
- if ($alias eq "$addr@$host") {
- push(@list, &forward($addr));
- next;
- }
- if ($alias =~ /^:include:(.*)/) {
- unless (open(INC, $file = $1)) {
- print STDERR "$0: can't open $file: $!\n";
- next;
- }
- @ilist = grep(!/^#/, <INC>);
- for (@ilist) { s/\s//g; }
- close(INC);
- printf "[ %s -> %s ]\n", $file, join(' ', @ilist) if $verbose;
- push(@list,&resolve(@ilist));
- } else {
- push(@list,&resolve(split(/\s*,\s*/,$alias)));
- }
- }
- return @list;
- }
-
-
- ##############################################################
-
- sub forward {
- local($user) = @_;
- local($forward);
-
- return $user if $aliasonly;
- return $user if $user =~ /^\s*"?[|\/]/;
- return $user if $user =~ /^\s*.+@.+$/;
- return $user if $user =~ /^\s*.+\\?!.+$/;
- return $user if $user =~ /^\s*\\/;
-
- if (($forward = &logdir($user)) && -r $forward .= '/.forward') {
- if (!open forward) {
- print STDERR "$0: cannot open $forward: $!\n";
- } else {
- print "[ $user -> $forward ]\n" if $verbose;
- chop($user = <forward>);
- close forward;
- print "[ $forward -> $user ]\n" if $verbose;
- return &resolve(split(/\s*,\s*/,$user));
- }
- } else {
- #print "no forward for $user\n";
- }
- $user = "$user <MAILER-DAEMON>" unless $forward;
- return $user;
-
- }
-
- ##############################################################
-
- sub logdir {
- if (! $been_here_before++) { # might make it much faster
- setpwent unless $dbm_passwd = dbmopen(PASSWD,'/etc/passwd', undef);
- }
-
- if ($dbm_passwd) {
- return '' unless defined $PASSWD{$_[0]};
- local(@a);
- @a = split(/[\000]+/,$PASSWD{$_[0]});
- return $a[$#a-1];
- } else {
- return (getpwnam($_[0]))[7];
- }
- }
-