/* Hamlet, Feb 1996. -- This gets called to do the xfinger command.
Hamlet, Jun 1997. -- reworked to use inquired. Doesn't need cloned
any more. Simplified, cleaned the code, etc.
*/
#include <inquire_err.h>
#include <socket.h>
#define INTERNIC "rs.internic.net"
mapping servers;
mapping fds;
void whois_cb(int fd, int success, mixed response,
string wordip, string numericip);
void do_whois(object me, string data, string server) {
int ret, fast;
string dom;
if(catch(load_object(INQUIRED))) {
tell_object(me, "Inquired seems to be broken. Have someone fix it.\n");
return;
}
if(!data) data = "";
if(!strlen(server))
if(strsrch(data, ".") > -1) {
dom = explode(data, ".")[<1];
if(servers[dom])
server = servers[dom];
else
server = servers["EUROPE"];
}
if(!strlen(server))
server = servers["default"];
else { /* weird cases */
if( (server == servers["nz"]) && (data[<3..<1] == ".nz") )
data = "nz " + data[0..<4];
else if( server == servers["jp"] )
data += "/e";
else if( (server == servers["dk"]) && (data[<3..<1] == ".dk") )
data = data[0..<4];
}
ret = INQUIRED->inquire( server, 43, STREAM, data, (: whois_cb :) );
if(ret <= 0)
tell_object(me, "whois: "+ inquire_error(ret) + "\n");
else {
tell_object(me, "Please wait...\n");
fds[ret] = me;
}
}
void whois_cb(int fd, int success, mixed response,
string wordip, string numericip) {
string header;
if(!fds[fd])
return;
header = "\n[" + wordip + "]\n";
if(success <= 0)
tell_object(fds[fd], header + "whois: " + response + "\n");
else
tell_object(fds[fd], header + response + "\n");
map_delete(fds, fd);
}
private void create() {
seteuid("Network stuff");
fds = ([ ]);
servers = ([ "net" : INTERNIC, "edu" : INTERNIC, "com" : INTERNIC
,"org" : INTERNIC, "gov" : INTERNIC
,"us" : "nii.isi.edu", "mil" : "nic.ddn.mil"
,"mx" : "whois.nic.mx", "au" : "whois.aunic.net"
,"se" : "whois.sunet.se", "jp" : "whois.nic.ad.jp"
,"uk" : "www.nic.uk", "nz" : "waikato.ac.nz"
,"dk" : "whois.uni-c.dk"
,"EUROPE" : "whois.ripe.net"
,"default" : "ds.internic.net", "internic" : INTERNIC
]);
}
mapping get_servers() { return copy(servers); }