chop(tb);
if (sock != -1)
{
- log(DEBUG,"DATAOUT: %s",tb);
write(sock,tb,bytes > 514 ? 514 : bytes);
}
}
vsnprintf(textbuffer, MAXBUF, text, argsPtr);
va_end(argsPtr);
- WriteFrom(u->fd,u,"%s",textbuffer);
+ // FIX: Stops a message going to the same person more than once
+ std::vector<int> already_sent;
for (int i = 0; i < MAXCHANS; i++)
{
{
char* o = (*ulist)[j];
userrec* otheruser = (userrec*)o;
- WriteFrom(otheruser->fd,u,"%s",textbuffer);
+ bool do_send = true;
+ for (int t = 0; t < already_sent.size(); t++)
+ {
+ if (already_sent[t] == otheruser->fd)
+ {
+ do_send = false;
+ break;
+ }
+ }
+ if (do_send)
+ {
+ already_sent.push_back(otheruser->fd);
+ WriteFrom(otheruser->fd,u,"%s",textbuffer);
+ }
}
}
}
vsnprintf(textbuffer, MAXBUF, text, argsPtr);
va_end(argsPtr);
+ std::vector<int> already_sent;
+
for (int i = 0; i < MAXCHANS; i++)
{
if (u->chans[i].channel)
char* o = (*ulist)[j];
userrec* otheruser = (userrec*)o;
if (u != otheruser)
- WriteFrom(otheruser->fd,u,"%s",textbuffer);
+ {
+ bool do_send = true;
+ for (int t = 0; t < already_sent.size(); t++)
+ {
+ if (already_sent[t] == otheruser->fd)
+ {
+ do_send = false;
+ break;
+ }
+ }
+ if (do_send)
+ {
+ already_sent.push_back(otheruser->fd);
+ WriteFrom(otheruser->fd,u,"%s",textbuffer);
+ }
+ }
}
}
}
}
}
-void handle_version(char **parameters, int pcnt, userrec *user)
+std::string GetVersionString()
{
- char Revision[] = "$Revision$";
-
- char *s1 = Revision;
- char *savept;
- char *v2 = strtok_r(s1," ",&savept);
- s1 = savept;
- v2 = strtok_r(s1," ",&savept);
- s1 = savept;
+ char Revision[] = "$Revision$";
+ char versiondata[MAXBUF];
+ char *s1 = Revision;
+ char *savept;
+ char *v2 = strtok_r(s1," ",&savept);
+ s1 = savept;
+ v2 = strtok_r(s1," ",&savept);
+ s1 = savept;
+ snprintf(versiondata,MAXBUF,"%s Rev. %s %s :%s (O=%lu)",VERSION,v2,ServerName,SYSTEM,(unsigned long)OPTIMISATION);
- WriteServ(user->fd,"351 %s :%s Rev. %s %s :%s (O=%lu)",user->nick,VERSION,v2,ServerName,SYSTEM,(unsigned long)OPTIMISATION);
+}
+
+void handle_version(char **parameters, int pcnt, userrec *user)
+{
+ if (!pcnt)
+ {
+ WriteServ(user->fd,"351 %s :%s",user->nick,GetVersionString().c_str());
+ }
+ else
+ {
+ for (int j = 0; j < 32; j++)
+ {
+ if (me[j] != NULL)
+ {
+ for (int x = 0; x < me[j]->connectors.size(); x++)
+ {
+ if (match(me[j]->connectors[x].GetServerName().c_str(),parameters[0]))
+ {
+ WriteServ(user->fd,"351 %s :%s",user->nick,me[j]->connectors[x].GetVersionString().c_str());
+ return;
+ }
+ }
+ }
+ }
+ WriteServ(user->fd,"402 %s %s :No such server",user->nick,parameters[0]);
+ }
+ return;
}
snprintf(data,MAXBUF,"Y %lu",(unsigned long)TIME);
serv->SendPacket(data,tcp_host);
// send users and channels
+
+ NetSendMyRoutingTable();
+
+ // send all routing table and uline voodoo. The ordering of these commands is IMPORTANT!
+ for (int j = 0; j < 32; j++)
+ {
+ if (me[j] != NULL)
+ {
+ for (int k = 0; k < me[j]->connectors.size(); k++)
+ {
+ if (is_uline(me[j]->connectors[k].GetServerName().c_str()))
+ {
+ snprintf(data,MAXBUF,"H %s",me[j]->connectors[k].GetServerName().c_str());
+ serv->SendPacket(data,tcp_host);
+ }
+ }
+ }
+ }
+
+ // send our version for the remote side to cache
+ snprintf(data,MAXBUF,"v %s %s",ServerName,GetVersionString().c_str());
+ serv->SendPacket(data,tcp_host);
+
+ // sync the users and channels, give the modules a look-in.
for (user_hash::iterator u = clientlist.begin(); u != clientlist.end(); u++)
{
snprintf(data,MAXBUF,"N %lu %s %s %s %s +%s %s %s :%s",(unsigned long)u->second->age,u->second->nick,u->second->host,u->second->dhost,u->second->ident,u->second->modes,u->second->ip,u->second->server,u->second->fullname);
// sync global zlines, glines, etc
sync_xlines(serv,tcp_host);
- for (int j = 0; j < 32; j++)
- {
- if (me[j] != NULL)
- {
- for (int k = 0; k < me[j]->connectors.size(); k++)
- {
- if (is_uline(me[j]->connectors[k].GetServerName().c_str()))
- {
- snprintf(data,MAXBUF,"H %s",me[j]->connectors[k].GetServerName().c_str());
- serv->SendPacket(data,tcp_host);
- NetSendMyRoutingTable();
- }
- }
- }
- }
-
snprintf(data,MAXBUF,"F %lu",(unsigned long)TIME);
serv->SendPacket(data,tcp_host);
log(DEBUG,"Sent sync");