#include <newudp.h>
#ifdef CDLIB
#include <std.h>
#endif
/* Mud / Admin email address. */
#define EMAIL "ddt@ucc.gu.uwa.edu.au"
void udp_query(mapping data) {
mapping ret;
switch(data[DATA]) {
case "commands":
ret = INETD->query("hosts");
if (ret[lower_case(data[NAME])])
ret = ([
DATA: implode(ret[lower_case(data[NAME])][LOCAL_COMMANDS], ":")
]);
else
ret = ([ DATA: implode(INETD->query("commands"), ":") ]);
break;
case "email":
ret = ([ DATA: EMAIL ]);
break;
case "hosts":
{
mapping hosts;
string *list;
string tmp;
int i;
tmp = "";
for(i = sizeof(list = keys(hosts = INETD->query("hosts")));
i--; ) {
tmp +=
hosts[list[i]][HOST_NAME] + ":" +
hosts[list[i]][HOST_IP] + ":" +
hosts[list[i]][HOST_UDP_PORT] + ":" +
implode(hosts[list[i]][LOCAL_COMMANDS], ",") + ":" +
implode(hosts[list[i]][HOST_COMMANDS], ",") + ":" +
hosts[list[i]][HOST_STATUS];
if (i)
tmp += "\n";
}
ret = ([ DATA: tmp ]);
break;
}
case "inetd":
ret = ([ DATA: INETD_VERSION ]);
break;
case "list":
/* List of things that can be queried. */
ret = ([ DATA: "commands:email:hosts:inetd:mud_port:time:version" ]);
break;
case "mud_port":
#ifdef CDLIB
ret = ([ DATA: SECURITY->do_debug("mud_port") ]);
#else
ret = ([ DATA: __PORT__ ]);
#endif
break;
case "time":
ret = ([ DATA: ctime(time()) ]);
break;
case "version":
#ifdef CDLIB
ret = ([ DATA: SECURITY->do_debug("version")+":"+MUDLIB_VERSION]);
#else
ret = ([ DATA: __VERSION__+": flame lib v 1.0" ]);
#endif
break;
default:
/* Just ignore it for the time being. */
return;
}
INETD->send_udp(data[NAME], ret + ([
REQUEST: REPLY,
RECIPIENT: data[SENDER],
ID: data[ID],
QUERY: data[DATA]
]) );
}