}
else
{
- log(DEBUG,"*** BUG *** Non-module umode passed to process_module_umode!");
if (faked)
{
delete s2;
{
/* found this oper's opertype */
ConfValue("type","host",j,Hostname,&config_f);
- strncpy(user->dhost,Hostname,256);
+ ChangeDisplayedHost(user,Hostname);
}
}
if (!strchr(user->modes,'o'))
log(DEBUG," ");
}
+void handle_R(char token,char* params,serverrec* source,serverrec* reply, char* udp_host)
+{
+ char* server = strtok(params," ");
+ char* data = strtok(NULL,"\r\n");
+ log(DEBUG,"Forwarded packet '%s' to '%s'",data,server);
+ NetSendToOne(server,data);
+}
void handle_J(char token,char* params,serverrec* source,serverrec* reply, char* udp_host)
{
}
}
+void NetSendMyRoutingTable()
+{
+ // send out a line saying what is reachable to us.
+ // E.g. if A is linked to B C and D, send out:
+ // $ A B C D
+ // if its only linked to B and D send out:
+ // $ A B D
+ // if it has no links, dont even send out the line at all.
+ char buffer[MAXBUF];
+ sprintf(buffer,"$ %s",ServerName);
+ bool sendit = false;
+ for (int i = 0; i < 32; i++)
+ {
+ if (me[i] != NULL)
+ {
+ for (int j = 0; j < me[i]->connectors.size(); j++)
+ {
+ if (me[i]->connectors[j].GetState() != STATE_DISCONNECTED)
+ {
+ strncat(buffer," ",MAXBUF);
+ strncat(buffer,me[i]->connectors[j].GetServerName().c_str(),MAXBUF);
+ sendit = true;
+ }
+ }
+ }
+ }
+ if (sendit)
+ NetSendToAll(buffer);
+}
+
+void handle_dollar(char token,char* params,serverrec* source,serverrec* reply, char* udp_host)
+{
+ log(DEBUG,"Storing routing table...");
+ char* sourceserver = strtok(params," ");
+ char* server = strtok(NULL," ");
+ for (int i = 0; i < 32; i++)
+ {
+ if (me[i] != NULL)
+ {
+ for (int j = 0; j < me[i]->connectors.size(); j++)
+ {
+ if (!strcasecmp(me[i]->connectors[j].GetServerName().c_str(),sourceserver))
+ {
+ me[i]->connectors[j].routes.clear();
+ log(DEBUG,"Found entry for source server.");
+ while (server)
+ {
+ // store each route
+ me[i]->connectors[j].routes.push_back(server);
+ log(DEBUG,"*** Stored route: %s -> %s -> %s",ServerName,sourceserver,server);
+ server = strtok(NULL," ");
+ }
+ return;
+ }
+ }
+ }
+ }
+ log(DEBUG,"Warning! routing table received from nonexistent server!");
+}
+
void process_restricted_commands(char token,char* params,serverrec* source,serverrec* reply, char* udp_host,char* ipaddr,int port)
{
case '+':
handle_plus(token,params,source,reply,udp_host);
break;
+ // routing table
+ case '$':
+ handle_dollar(token,params,source,reply,udp_host);
+ break;
+ // R <server> <data>
+ // redirect token, send all of <data> along to the given
+ // server as this server has been found to still have a route to it
+ case 'R':
+ handle_R(token,params,source,reply,udp_host);
+ break;
// ?
// ping
case '?':
WriteOpers("Sending my netburst to %s",udp_host);
DoSync(source,udp_host);
WriteOpers("Send of netburst to %s completed",udp_host);
-
+ NetSendMyRoutingTable();
break;
// anything else
default:
if (!strcasecmp(me[j]->connectors[k].GetServerName().c_str(),udp_host))
{
me[j]->connectors[k].SetServerName(servername);
+ NetSendMyRoutingTable();
return;
}
}
return;
}
}
+ // bad cookie, bad bad! go sit in the corner!
WriteOpers("Bad cookie from %s!",servername);
return;
}
sprintf(buffer,"X 0");
serv->SendPacket(buffer,udp_host);
DoSync(me[j],udp_host);
+ NetSendMyRoutingTable();
return;
}
}
// *FIX* Instead of closing sockets in kill_link when they receive the ERROR :blah line, we should queue
// them in a list, then reap the list every second or so.
- if (reap_counter>5000)
+ if (reap_counter>2500)
{
if (fd_reap.size() > 0)
{
fd_reap.clear();
reap_counter=0;
}
+ reap_counter++;
fd_set serverfds;
FD_ZERO(&serverfds);
{
strncpy(resolved,remotehost,MAXBUF);
}
- log(DEBUG," ");
- log(DEBUG," ");
- log(DEBUG,"Resolved: '%s'",resolved);
- log(DEBUG," ");
// add to this connections ircd_connector vector
me[x]->AddIncoming(incomingSockfd,resolved,ntohs(client.sin_port));
}
char udp_msg[MAXBUF];
strncpy(udp_msg,msgs[ctr].c_str(),MAXBUF);
if (strlen(udp_msg)<1)
- {
+ {
log(DEBUG,"Invalid string from %s [route%d]",udp_host,x);
break;
}
FD_SET (openSockfd[count], &selectFds);
}
- reap_counter++;
tv.tv_usec = 1;
selectResult = select(MAXSOCKS, &selectFds, NULL, NULL, &tv);