#/usr/bin/perl # Usage: finger [fingeroptions] [names] # Bind %ALIAS to the aliases database. dbmopen(ALIAS,'/usr/lib/aliases',undef) || die "can't dbmopen aliases"; # Strip finger switches. while ($ARGV[0] =~ /^-/) { push(@fingerargs, shift); } # Process user names. while ($user = shift) { push(@finger, &resolve($user)); } # Uniquify names. @finger = grep(!$seen{$_}++, @finger); # And run finger. exec 'finger', @fingerargs, @finger if @finger; die "Couldn't run finger: $!\n"; ############################################################## sub resolve { local($home,$addr,$alias,@list); while ($addr = shift) { if (defined $ALIAS{$addr."\0"}) { # In dbm file. chop($alias = $ALIAS{$addr."\0"}); } else { $home = (getpwnam($addr))[7]; if (defined($home) && -r "$home/.forward") { open(FORWARD,"$home/.forward"); chop($alias = ); close FORWARD; } else { push(@list, $addr); # Not aliased. next; } } $alias =~ s/"\|[^"]*",?//g; $alias =~ s/^\s*(.*)\s*$/$1/; if ($alias eq '') { # Oops, only pipes. push(@list, $addr); # So back out alias. next; } $alias =~ s/([^!]*)!(.*)/$2@$1/; # A uucp addr? # Now call ourselves recursively. push(@list,&resolve(split(/[\s,]+/,$alias))); } return @list; }