home *** CD-ROM | disk | FTP | other *** search
- #!/usr/local/bin/perl
- #
- # nfinger -- finger people at their home machines
- # as defined in the /usr/lib/aliases
- # dbm file. recursively resolve all
- # aliases first, so works on lists
-
- dbmopen(ALIAS,'/usr/lib/aliases',undef) || die "can't dbmopen aliases: $!";
-
- chop($localhost = `hostname`);
-
- @finger_opts = ();
- while ($ARGV[0] =~ /^-/) {
- if ($ARGV[0] eq '-v') {
- $verbose++;
- shift;
- } else {
- push(@finger_opts, shift);
- }
- }
-
- while ($user = shift) {
- undef %seen;
- $seeking++;
- push(@finger, &resolve($user));
- }
-
- undef %seen;
- @ofinger = @finger;
- for (@finger) {
- s/^\\//;
- s/\s//g;
- push(@nfinger, $_) unless $seen{$_}++ || m#^\s*("\s*)?[|/]#;
- }
- @finger = sort @nfinger;
-
- if ($seeking && !@finger) {
- printf STDERR "$0: can't finger only pipes and files! (@ofinger)\n";
- exit 1;
- }
-
- $exec = "/usr/ucb/finger @finger_opts @finger\n";
-
- print $exec if $verbose;
-
-
- exec $exec unless grep(/-.*s/, @finger_opts);
-
-
- open (FINGER, "$exec 2>&1 |") || die "Can't open finger pipe\n";
-
- $mask = "%-8s%s";
- $\ = "\n";
- $| = 1;
- $localhost = sprintf("%-8s", $localhost);
-
- while (<FINGER>) {
- s/\s*$//;
- next if /^$/;
- if (/^\[([^\]]*)\]$/) {
- $host = sprintf("%-8s", $1);
- $sawhost = 1;
- } elsif (/^Login/) {
- if (!$printed++) {
- substr($_, 9, 0) = 'Home ';
- s/ Name/Name /;
- print;
- }
- $host = $localhost unless $sawhost;
- $sawhost = 0;
- } elsif (/^\S+:/) {
- $sawhost = /^finger:/;
- print STDERR "$host <$_>";
- } else {
- substr($_, 9, 0) = $host;
- print;
- }
- }
- close FINGER || die "$0: error running finger, status was $?\n";
-
- ##############################################################
-
- sub resolve {
- local($addr,$alias,@list);
- local(@addrs) = @_;
-
- for $addr (@addrs) {
- unless (defined $ALIAS{"$addr\0"}) {
- push(@list, &forward($addr));
- next;
- }
- chop($alias = $ALIAS{"$addr\0"});
-
- $alias =~ s/^\s*(.*)\s*$/$1/;
- $alias =~ s/^([^!]*)!([^!]+)$/$2@$1/;
-
- if ($alias eq "$addr@$localhost" || $alias eq $addr) {
- push(@list, &forward($addr));
- } else {
- print "[ $addr -> $alias ]\n" if $verbose;
- push(@list,&resolve(split(/\s*,\s*/,$alias)));
- }
- }
- return @list;
- }
-
-
- ##############################################################
-
- sub forward {
- local($user) = @_;
- local($forward);
-
- $seen{$addr}++ && return $addr;
-
- 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(/,/,$user));
- }
- }
- 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];
- }
- }
-