/* Hamlet, Feb 1996. -- This gets cloned to do the xfinger command. The
Command is now more complex so integration can be
truly simple (not that it'll ever be integrated).
*/
object querier;
string thedata;
string host;
string user;
void res_cb(string address, string resolved, int key);
varargs void dest_me(int i);
int do_xfinger(string data, object me, string extrajunk) {
string *parts, *trash;
int WORD = 0;
int i;
int tmp;
seteuid("Root");
querier = me;
trash = explode(data,"@");
if(sizeof(trash) == 1)
user = "";
else if(sizeof(trash) == 2)
user = trash[0];
else
return 0;
if(strlen(extrajunk)) { /* they did 'finger <username>', so we can trust */
res_cb(extrajunk,trash[sizeof(trash)-1],-200);
}
else { /* finger <hostname|hostip> -- don't trust it. */
parts = explode(trash[sizeof(trash)-1],".");
for(i=0;i<sizeof(parts);i++)
if(!sscanf(parts[i],"%d",tmp))
WORD = 1;
if(!WORD) /* if resolve fails, we'll trust this */
thedata = trash[sizeof(trash)-1];
resolve(trash[sizeof(trash)-1],"res_cb");
}
return 1;
}
void res_cb(string address, string resolved, int key) {
object xfingerd;
string data;
if(!resolved && !thedata) {
tell_object(querier,"xfinger: That seems to have been a bad address.\n");
return;
}
if(strlen(user) && (user != "/W ")) {
if(user[0..2] != "/W ")
host = "\n["+user+"@";
else
host = "\n["+user[3..strlen(user)-1]+"@";
}
else
host = "\n[";
if(resolved)
host += address+" ("+resolved+")]\n";
else
host += thedata+"]\n";
if(!xfingerd = clone_object("/secure/xfingerd")) {
tell_object(querier,"Oops... xfingerd didn't want to clone.\n");
dest_me();
return;
}
if(resolved)
data = user + "@" + resolved;
else
data = user + "@" + thedata;
if(!xfingerd->do_xfinger(data, this_object())) {
tell_object(querier,"xfinger: Error with sockets or something. "
"Check the log.\n");
dest_me();
}
else
call_out("dest_me",40,1);
}
void receive_xfinger_data(string response) {
if(!querier) {
dest_me();
return;
}
tell_object(querier,host+response+"\n");
dest_me();
}
varargs void dest_me(int i) {
if(i && querier)
tell_object(querier,"** Xfinger timed out for "+host[1..strlen(host)-1]);
if(!i)
remove_call_out("dest_me");
destruct(this_object());
}