#include #include #include #include #include #include #include #include #include #include #include "config.h" #include #ifdef USING_STD_STRING using std::string; #endif #ifdef DMALLOC #include #endif #ifdef SOCKS #include #endif #include "command.h" #include "serverdcc.h" #include "window.h" #include "tcltk.h" #include "messages.h" #include "format.h" extern ilist windows; extern char currentwindow[20]; int check(char *command, char *data, char *argument) { char temp[TEMPLEN]; *argument=0; if((strlen(command)==strlen(data))&&(!(strcasecmp(command,data)))) return 1; sprintf(temp,"%s ",command); if(!strncasecmp(temp,data,strlen(temp))) { if(strlen(data)>strlen(temp)) { strcpy(argument,data+strlen(temp)); } return 1; } return 0; } int do_command(const char *pathname, const char *comm) { tchan chan; tchan *chanp=0; tquery query; tquery *queryp=0; char argument[TEMPLEN]; char command[TEMPLEN]={0}; char tempcommand[TEMPLEN]; int parsed=0; int n; char *position; twindow window; twindow *windowp=0; struct hostent *h; string argumentstr; int oldparsed; if(!comm) return 1; strcpy(command,comm); if(command[0]=='/') strcpy(command,command+1); /* Set up channel or query pointers */ if(pathname&&strcmp(pathname,".main")) { strcpy(window.pathname,pathname); if((windowp=windows.find(window))) { if(!strncasecmp(pathname,".channel",8)) { strcpy(chan.pathname,pathname); chanp=windowp->server->chanlist.find(chan); } if(!strncasecmp(pathname,".query",6)) { strcpy(query.pathname,pathname); queryp=windowp->server->querylist.find(query); } } } if(command[0]=='/') { if(windowp) { TT_EvalF(TT_ARGS,"namespace eval ::%d %q",windowp->server->index,command); } else { TT_EvalF(TT_ARGS,"%s",command); } return 0; } /* lookup */ if(check("lookup",command,argument)) { parsed=1; if(strlen(argument)) { if(!(h=gethostbyname(argument))) { switch(h_errno) { case HOST_NOT_FOUND: fdisplay("DNS_ERROR",-1,1,M_DNS_ERROR_UNKNOWN); break; case NO_ADDRESS: fdisplay("DNS_ERROR",-1,1,M_DNS_ERROR_NOIP); break; case NO_RECOVERY: fdisplay("DNS_ERROR",-1,1,M_DNS_ERROR_NORECOVER); break; case TRY_AGAIN: fdisplay("DNS_ERROR",-1,1,M_DNS_ERROR_TEMPORARY); break; } } else { fdisplay("DNS_FOR",-1,1,argument); fdisplay("DNS_HOSTNAME",-1,1,h->h_name); fdisplay("DNS_IP",-1,1,inet_ntoa(*((struct in_addr*)h->h_addr))); } } } oldparsed=parsed; if(comm&&strlen(comm)) { if(pathname&&strlen(pathname)) { strcpy(window.pathname,pathname); windowp=windows.find(window); } if(windowp) { if(comm[0]=='/') { strcpy(tempcommand,comm+1); } else { strcpy(tempcommand,comm); } if((position=strstr(tempcommand," "))) { argumentstr=position+1; *position=0; } for(n=0;n<(signed)strlen(tempcommand);n++) tempcommand[n]=tolower(tempcommand[n]); TT_Eval(TT_ARGS,"\ set ::internal::alias_parsed 0\n\ set ::internal::alias_returnvalue 0\n\ "); if(windowp->server) { TT_EvalF(TT_ARGS,"\ foreach script $::%d::scripts {\n\ if { [info commands ::%d::${script}::alias_%s]!=\"\" } {\n\ set ::internal::alias_parsed 1\n\ set ::internal::alias_returnvalue [::%d::${script}::alias_%s %q]\n\ if { $::internal::alias_returnvalue==1 } {\n\ break\n\ } else {\n\ set ::internal::alias_returnvalue 0\n\ }\n\ }\n\ }\n\ ",windowp->server->index,windowp->server->index,tempcommand,windowp->server->index,tempcommand,argumentstr.c_str()); } TT_EvalF(TT_ARGS,"\ if { !$::internal::alias_returnvalue && [info commands ::dynamic::alias_%s]!=\"\" } {\n\ set ::internal::alias_parsed 1\n\ set ::internal::alias_returnvalue [::dynamic::alias_%s %q]\n\ if { $::internal::alias_returnvalue!=1 } {\n\ set ::internal::alias_returnvalue 0\n\ }\n\ }\n\ ",tempcommand,tempcommand,argumentstr.c_str()); TT_EvalF(TT_ARGS,"\ if { !$::internal::alias_returnvalue && [info commands alias_%s]!=\"\" } {\n\ set ::internal::alias_parsed 1\n\ alias_%s %q\n\ }\n\ ",tempcommand,tempcommand,argumentstr.c_str()); parsed=TT_Int(TT_ARGS,"set ::internal::alias_parsed"); } } if(!parsed&&!oldparsed) { // DEBUG //TT_EvalF(TT_ARGS,".raw.text insert end \"Command (command.cc:171): %q\\n\"",command); if(windowp&&windowp->server) windowp->server->senddata(command); } return 0; }