#!/usr/local/bin/perl # # This program takes a list of email addresses and expands them by connecting # to the appropriate machines and asking the sendmail daemon on each machine # how the address will be interpreted. # # Stig@netcom.com Sept 1994 ($ARGV[0] eq '-d') && ($debug=1,shift); foreach $addr (@ARGV) { @exn= &expn($addr); print $addr,":\n ", join("\n ", @exn), "\n"; } sub expn { local ($addr) = @_; local ($user, $host, $expansion, $tn_pid); $addr =~ m/(\w+)(@([\w.-]+))?/ || return "bad address"; $user = $1; $host = ($3 || "localhost"); print "expanding $user at $host\n" if $debug; pipe(TTI,TI); pipe(TO,TTO); select TI; $|=1; select TTO; $|=1; select STDERR; $|=1; if (!($tn_pid= fork())) { close (TI); close (TO); if ($debug) { pipe(DI,DDI); pipe(DDO,DO); select DDI; $|=1; select DO; $|=1; if (!fork()) { foreach (DI, DO, TTO, DDO) { close $_; } while () { print STDERR "in: $_"; print DDI; } exit 0; } if (!fork()) { foreach (DI, DO, TTI, DDI) { close $_; } while () { print STDERR "out: $_"; print TTO; } exit 0; } close(TTO),close(TTI); open(TTI,"<&DI") || die "debugging whacked: $!"; open(TTO,">&DO") || die "debugging whacked: $!"; } open (STDIN, "<&TTI") || die "reopen stdin"; open (STDOUT,">&TTO") || die "reopen stdout"; open (STDERR,">/dev/null") || die "reopen stderr"; exec ("telnet", $host, "25"); die "how did I get here?"; } close(TTI), close(TTO); ($_=) until m/^220 /; print TI "expn $user \n"; do { $_=; $expansion .= $_; } until m/^\d\d\d /; print TI "quit\n"; scalar(); # wait for the goodbye message close(TI), close(TO); chop $expansion; @exp = split(m/\n/,$expansion); grep(s/^\d\d\d[- ]//, @exp); print "$user\@$host : ", join(", ",@exp), "\n" if $debug; return @exp }