#pragma save_binary // File : /adm/daemons/userid.c // Creator : Watcher@TMI-2 (5/93) // // Based on the general design concepts of Pinkfish@DiscWorld's // IDENT server. All Bing Pinkfish!! // // This daemon will connect up to an authorization daemon and // and return a user's login name. #include <priv.h> #include <config.h> #include <net/socket.h> #include <net/daemons.h> #include <mudlib.h> inherit DAEMON ; mapping requests; void create() { seteuid(getuid(this_object())); requests = ([ ]); } void query_userid() { string socket, address; int port, line, tmp; // Check to make sure we have pulled the local port from // the mud's name server. // Get socket source info from the requesting user. socket = socket_address( previous_object() ); if(!socket) return; // Parse out address and port from source socket if(sscanf(socket, "%s %d", address, port) != 2) return; line = socket_create(STREAM, "socket_shutdown"); if(line < 0) return; if(socket_connect(line, address + " 113","receive_data","write_data") < 0) { previous_object()->query_link()->set("userid", 0); socket_close(line); return ; } requests[line] = ({ previous_object(), port }); } void write_data(int line) { int ret; // Okay, send the userid request protocol. ret = socket_write(line, requests[line][1] + "," + mud_port() + "\n"); // Hmmm....is there an IDENT server listening ? if(ret < 0) { socket_close(line); requests[line][0]->query_link()->set("userid", 0); map_delete(requests, line); } } void receive_data(int line, string info) { string tmp, machine, name, userid; // Okay ... we got a response. Are we sure its from the driver // and is the info we actually want... if(previous_object() || !requests[line] || !requests[line][0] || !info || sscanf(info, "%s : USERID : %s : %s\r\n", tmp, machine, name) != 3) { socket_close(line); map_delete(requests, line); return; } userid = name + "@" + query_ip_name(requests[line][0]); requests[line][0]->query_link()->set("userid", userid); socket_close(line); map_delete(requests, line); } mapping query_requests() { return requests; }