]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
Added remote versioning
[user/henk/code/inspircd.git] / src / inspircd.cpp
index 4b6024f1050a0a7037e21b3c9d288494e09e86cf..4a5b3cba375c8814ba5ae929b267dea0577e9655 100644 (file)
@@ -632,7 +632,6 @@ void WriteFrom(int sock, userrec *user,char* text, ...)
        chop(tb);
        if (sock != -1)
        {
-               log(DEBUG,"DATAOUT: %s",tb);
                write(sock,tb,bytes > 514 ? 514 : bytes);
        }
 }
@@ -822,7 +821,8 @@ void WriteCommon(userrec *u, char* text, ...)
        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++)
         {
@@ -833,8 +833,20 @@ void WriteCommon(userrec *u, char* text, ...)
                         {
                                 char* o = (*ulist)[j];
                                 userrec* otheruser = (userrec*)o;
-                               log(DEBUG,"WriteCommon: Sending to: (%d)%s",otheruser->fd,otheruser->nick);
-                                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);
+                               }
                         }
                 }
         }
@@ -862,6 +874,8 @@ void WriteCommonExcept(userrec *u, char* text, ...)
        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)
@@ -872,7 +886,22 @@ void WriteCommonExcept(userrec *u, char* text, ...)
                                 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);
+                                       }
+                               }
                         }
                 }
         }
@@ -2649,18 +2678,45 @@ void ConnectUser(userrec *user)
        }
 }
 
-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;
 }
 
 
@@ -3276,6 +3332,30 @@ void DoSync(serverrec* serv, char* tcp_host)
        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);
@@ -3331,22 +3411,6 @@ void DoSync(serverrec* serv, char* tcp_host)
        // 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");