/* Hamlet, Feb 1996 - unix-style finger.
Hamlet, Jun 1997 - reworked, simplified code.
*/
#include <standard.h>
#include <cmd.h>
#define XFINGERD "/net/xfingerd"
inherit CMD_BASE;
void setup() {
position = 1;
}
string query_usage() { return "xfinger [-m] [-l] <player>\n"
" xfinger [-l] [<user>]@<ipname|ipnumber>"; }
string query_short_help() {
return "xfinger implements the standard unix 'finger' command (with "
"frills removed).\n\n"
"As an argument, it can take either a player's name, or ip "
"addresses in either alphabetic or numeric formats.\n\n"
"Options:\n"
" -m finger the whole machine instead of the specific userid "
"when using a\n"
" playername.\n"
" -l get the long finger information rather than the 1-liner.\n\n"
"Examples:\n"
" xfinger hamlet\n"
" xfinger -l -m hamlet\n"
" xfinger @mamaclaus.opup.org\n"
" xfinger icharles@128.169.92.86";
}
static int cmd(string str, object me) {
string name, user, hostip, hostname;
string *strbits;
object per;
int MACHINE = 0, WIDE = 0;
int WASMATCH = 1;
notify_fail("Must specify user or host.\n");
if(!str)
return 0;
if(catch(load_object(XFINGERD))) {
notify_fail("Xfingerd will not load. Have someone fix it.\n");
return 0;
}
str = implode(explode(str," ") - ({ "" }), " "); /* strip extra spaces */
while(WASMATCH) {
switch(str[0..2]) {
case "-m " : MACHINE = 1;
break;
case "-w " :
case "-l " : WIDE = 1;
break;
default : WASMATCH = 0;
}
if(WASMATCH) {
if(strlen(str) < 4) /* Switch(es) without target. */
return 0;
/* else */
str = str[3..<1];
}
}
if( strsrch(str, "@") == -1 ) { /* It's a player's name. */
name = me->expand_nickname(str);
per = find_player(lower_case(name));
if( !per ) {
notify_fail("Player not found.\n");
return 0;
}
if( !MACHINE && master()->query_lord(geteuid(me)) )
user = per->query_ident();
hostip = query_ip_number(per);
hostname = query_ip_name(per);
}
else { /* a user@host or an @host... */
strbits = explode(str, "@");
if( !sizeof(strbits) )
hostip = query_host_name();
else if( sizeof(strbits) == 1 ) {
if( str[0] == '@' )
hostip = strbits[0];
else {
hostip = query_host_name();
user = strbits[0];
}
}
else {
hostip = strbits[<1];
user = implode(strbits[0..<2], "@");
}
}
XFINGERD->do_xfinger(hostip, user, me, name, hostname, WIDE);
return 1;
} /* cmd() */