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"

#if 0
#define debug(x) if (find_player("garion")) \
		    tell_object(find_player("garion"), (x))
#else
#define debug(x)
#endif

#define WWW_PATH "secure/sockets/www"
#define ERROR "<PLAINTEXT>Error\n"

int sock;

static string parse_request(string file);
static void listen_call(int fd, int act, mixed a, mixed b);
static void callback(int fd, int act, mixed a, mixed b);

void reset(int arg)
{
    if (arg) return;
    sock=SOCKETD->socket_listen(5152, #'listen_call);
    debug("httpd started.\n");
}

static void listen_call(int fd, int act, mixed a, mixed b)
{
    debug(sprintf("listen_call(%d,%d,%O,%O)\n",fd,act,a,b));
    switch(act) {
      case SOCKET_READY:
	return;
      case SOCKET_ACCEPT:
	SOCKETD->socket_accept(fd, #'callback);
	return;
      case SOCKET_ERROR:
	sock=-1;
      case SOCKET_CLOSE:
	destruct(this_object());
	return;
    }
}

static void callback(int fd, int act, mixed a, mixed b)
{
    debug(sprintf("callback(%d,%d,%O,%O)\n",fd,act,a,b));
    switch(act) {
      case SOCKET_READ: {
	string file, *tmp;
	tmp=explode(a, "\r\n");
	tmp=explode(tmp[0], " ");
	if (tmp[0]!="GET") {
	    SOCKETD->socket_close(fd);
	    return;
	}
	file=tmp[1];
	a=parse_request(file);
	SOCKETD->socket_write(fd, a);
	SOCKETD->socket_close(fd);
	return;
      }
      case SOCKET_ERROR: {
	SOCKETD->socket_close(fd);
      }
    }
}

static string parse_request(string file)
{
    string data, tmp, *args;

    args=explode(file, "/")-({""});
    if (!sizeof(args)) return ERROR;

    file=sprintf("%s/%s.c", WWW_PATH, args[0]);

    if (file_size(file) > 0) {
	if (tmp=catch(data=call_other(file, "www_main", args[1..]))) {
	    return ERROR;
	}
	return data;
    }
    return ERROR;
}

void destructor()
{
    if (sock<0) return;
    SOCKETD->socket_close(sock);
}