ldmud-3.2.9/doc/
ldmud-3.2.9/doc/efun/
ldmud-3.2.9/mud/
ldmud-3.2.9/mud/heaven7/
ldmud-3.2.9/mud/heaven7/lib/
ldmud-3.2.9/mud/lp-245/
ldmud-3.2.9/mud/lp-245/banish/
ldmud-3.2.9/mud/lp-245/doc/
ldmud-3.2.9/mud/lp-245/doc/examples/
ldmud-3.2.9/mud/lp-245/doc/sefun/
ldmud-3.2.9/mud/lp-245/log/
ldmud-3.2.9/mud/lp-245/obj/Go/
ldmud-3.2.9/mud/lp-245/players/lars/
ldmud-3.2.9/mud/lp-245/room/death/
ldmud-3.2.9/mud/lp-245/room/maze1/
ldmud-3.2.9/mud/lp-245/room/sub/
ldmud-3.2.9/mud/lp-245/secure/
ldmud-3.2.9/mud/morgengrauen/
ldmud-3.2.9/mud/morgengrauen/lib/
ldmud-3.2.9/mud/sticklib/
ldmud-3.2.9/mud/sticklib/src/
ldmud-3.2.9/mudlib/uni-crasher/
ldmud-3.2.9/pkg/
ldmud-3.2.9/pkg/debugger/
ldmud-3.2.9/pkg/diff/
ldmud-3.2.9/pkg/misc/
ldmud-3.2.9/src/autoconf/
ldmud-3.2.9/src/bugs/
ldmud-3.2.9/src/bugs/MudCompress/
ldmud-3.2.9/src/bugs/b-020916-files/
ldmud-3.2.9/src/bugs/doomdark/
ldmud-3.2.9/src/bugs/ferrycode/ferry/
ldmud-3.2.9/src/bugs/ferrycode/obj/
ldmud-3.2.9/src/bugs/psql/
ldmud-3.2.9/src/done/
ldmud-3.2.9/src/done/order_alist/
ldmud-3.2.9/src/done/order_alist/obj/
ldmud-3.2.9/src/done/order_alist/room/
ldmud-3.2.9/src/gcc/
ldmud-3.2.9/src/gcc/2.7.0/
ldmud-3.2.9/src/gcc/2.7.1/
ldmud-3.2.9/src/hosts/
ldmud-3.2.9/src/hosts/GnuWin32/
ldmud-3.2.9/src/hosts/amiga/NetIncl/
ldmud-3.2.9/src/hosts/amiga/NetIncl/netinet/
ldmud-3.2.9/src/hosts/amiga/NetIncl/sys/
ldmud-3.2.9/src/hosts/i386/
ldmud-3.2.9/src/hosts/msdos/byacc/
ldmud-3.2.9/src/hosts/msdos/doc/
ldmud-3.2.9/src/hosts/os2/
ldmud-3.2.9/src/hosts/win32/
ldmud-3.2.9/src/util/
ldmud-3.2.9/src/util/erq/
ldmud-3.2.9/src/util/indent/hosts/next/
ldmud-3.2.9/src/util/xerq/
ldmud-3.2.9/src/util/xerq/lpc/
ldmud-3.2.9/src/util/xerq/lpc/www/
#include "socket.h"
#include <errno.h>

#define LUSER      0
#define RUSER      1
#define HOST       2
#define CONTINUED  3

mapping sockets;

void callback(int fd, int act, mixed a, mixed b);

status main(string str)
{
    string user, host;
    int sock;
    if (!sockets) sockets = allocate_mapping(0, 4);
    if (!adminp(this_player())) return 0;
    if (!str) str="";
    host = __HOST_NAME__;
    user = str;
    sscanf(str, "%s@%s", user, host);

    sock = SOCKETD->socket_connect(host, 79, #'callback);
    sockets[sock, LUSER] = this_player();
    sockets[sock, RUSER] = user;
    sockets[sock, HOST]  = host;
    printf("[finger to: %s@%s]\n", user, host);
    call_out("time_out", 90, sock);
    return 1;
}

void callback(int sock, int act, mixed a, mixed b)
{
    if (!sockets[sock, LUSER] && act != SOCKET_CLOSE) {
	SOCKETD->socket_close(sock);
	return;
    }
    switch(act) {
      case SOCKET_READY:
	SOCKETD->socket_write(sock, sprintf("%s\r\n", sockets[sock, RUSER]));
	break;
      case SOCKET_READ:
	if (!sockets[sock, CONTINUED]) {
            tell_object(sockets[sock, LUSER], sprintf("[%s@%s]\n",
	      sockets[sock, RUSER],
	      sockets[sock, HOST]));
	    sockets[sock, CONTINUED] = 1;
	}
	tell_object(sockets[sock, LUSER], a);
	break;
      case SOCKET_CLOSE:
	m_delete(sockets, sock);
	break;
      case SOCKET_ERROR: {
	string err;
	switch(a) {
          case ECONNREFUSED:
	    err = "Connection Refused";
            break;
          case EHOSTUNREACH:
            err = "Host Unreachable";
            break;
          case ENETUNREACH:
            err = "Net Unreachable";
            break;
          default:
            err = sprintf("Code %d", a);
            break;
	}
	tell_object(sockets[sock, LUSER],
          sprintf("ifinger: Error in connection to %s: %s.\n",
            sockets[sock, HOST],
            err));
	m_delete(sockets, sock);
      }
      break;
    }
    return;
}

void help()
{
    write("Usage: ifinger [[<user>]@<host>]\n"
          "Send an internet finger request.\n");
    return;
}

void time_out(int sock)
{
    if (sockets[sock, LUSER])
	tell_object(sockets[sock, LUSER],
          sprintf("Finger to %s@%s timed out.\n",
            sockets[sock, RUSER],
            sockets[sock, HOST]));
	m_delete(sockets, sock);
	return;
}

mapping query_sockets() { return copy_mapping(sockets); }