#include "socket.h" #include "inet.h" #include "udp.h" object pl; string who; int got_something; void dest_me(); void create() { seteuid( getuid() ); } /* create() */ int do_finger( string str ) { string name, host; object ob; if( sscanf( str, "%s@%s", name, host ) == 2 ) { lower_case( name ); /* if (name == "") name = "EVERYONE"; */ ob = clone_object( file_name( this_object() ) ); ob->finger_away( name, host, this_player() ); return 1; } /* * Should be a local finger... no idea why they want to do that though. * shrug. */ return 0; } /* do_finger() */ void finger_away( string name, string host, object me ) { who = name; pl = me; if( NAMESERVER_CD->query_mud_info( host ) ) { /* Its a cd one... finger them the cd way... */ if( name == "" ) (UDP_PATH + "rwho_q")->send_rwho_q( host ); else (UDP_PATH + "gfinger_q")->send_gfinger_q( host, name ); dest_me(); return; } INETD->open_to_service( "finger", INETD_TYPE, host, name + "\nNewMoon" ); call_out( "dest_me", 5 * 60 * 60 ); } /* finger_away() */ void read_callback( int fd, string mess ) { got_something = 1; tell_object( pl, mess ); pl->finger_callback( 2, mess ); } /* read_callback() */ void connected( int fd ) { if( who ) previous_object()->write_fd( fd, who + "\n" ); else { previous_object()->write_fd( fd, "EVERYONE\n" ); previous_object()->write_fd( fd, "\n" ); } who = 0; } /* write_callback() */ void close_callback() { if( !got_something ) tell_object( pl, "Did not recieve anything in your intermud finger.\n" ); pl->finger_callback( 0 ); dest_me(); } /* close_callback() */ void failed( string reason ) { pl->finger_callback( 1, reason ); tell_object( pl, "We failed for " + reason + " reason.\n" ); dest_me(); } /* failed() */ void dest_me() { destruct( this_object() ); } /* dest_me() */