/
LIB3/
LIB3/D/ADMIN/
LIB3/D/ADMIN/OBJ/
LIB3/D/ADMIN/ROOM/W/
LIB3/D/HOME/
LIB3/D/HOME/CITY/ARENA/
LIB3/D/HOME/CITY/ITEMS/
LIB3/D/HOME/CITY/POSTOFFI/
LIB3/DOC/
LIB3/GLOBAL/SPECIAL/
LIB3/GLOBAL/VIRTUAL/
LIB3/NET/
LIB3/NET/CONFIG/
LIB3/NET/DAEMON/CHARS/
LIB3/NET/GOPHER/
LIB3/NET/INHERIT/
LIB3/NET/OBJ/
LIB3/NET/SAVE/
LIB3/NET/VIRTUAL/
LIB3/OBJ/B_DAY/
LIB3/OBJ/HANDLERS/TERM_TYP/
LIB3/PLAYERS/B/
LIB3/PLAYERS/N/
LIB3/ROOM/
LIB3/SAVE/
LIB3/SAVE/BOARDS/
LIB3/SAVE/ENVIRON/
LIB3/SAVE/POST/
LIB3/STD/COMMANDS/SHADOWS/
LIB3/STD/CREATOR/
LIB3/STD/DOM/
LIB3/STD/EFFECTS/
LIB3/STD/EFFECTS/HEALING/
LIB3/STD/EFFECTS/OTHER/
LIB3/STD/EFFECTS/POISONS/
LIB3/STD/ENVIRON/
LIB3/STD/GUILDS/
LIB3/STD/LIQUIDS/
LIB3/STD/ROOM/
LIB3/STD/TRIGGER/SHADOW/
LIB3/W/
LIB3/W/BANNOR/
LIB3/W/NEWSTYLE/
#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() */