]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/netburst.cpp
Change the syntax of FOREACH macros to be less dumb.
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / netburst.cpp
index a77623bfce10dcd9590a417670d6ce877b8ed6af..d86115cce40da25cffc47e455c00084da03cb52e 100644 (file)
@@ -34,9 +34,8 @@
  */
 void TreeSocket::DoBurst(TreeServer* s)
 {
-       std::string servername = s->GetName();
        ServerInstance->SNO->WriteToSnoMask('l',"Bursting to \2%s\2 (Authentication: %s%s).",
-               servername.c_str(),
+               s->GetName().c_str(),
                capab->auth_fingerprint ? "SSL Fingerprint and " : "",
                capab->auth_challenge ? "challenge-response" : "plaintext password");
        this->CleanNegotiationInfo();
@@ -44,7 +43,7 @@ void TreeSocket::DoBurst(TreeServer* s)
        /* send our version string */
        this->WriteLine(":" + ServerInstance->Config->GetSID() + " VERSION :"+ServerInstance->GetVersionString());
        /* Send server tree */
-       this->SendServers(Utils->TreeRoot,s,1);
+       this->SendServers(Utils->TreeRoot, s);
        /* Send users and their oper status */
        this->SendUsers();
 
@@ -52,36 +51,30 @@ void TreeSocket::DoBurst(TreeServer* s)
                SyncChannel(i->second);
 
        this->SendXLines();
-       FOREACH_MOD(I_OnSyncNetwork,OnSyncNetwork(Utils->Creator,(void*)this));
+       FOREACH_MOD(OnSyncNetwork, (Utils->Creator,(void*)this));
        this->WriteLine(":" + ServerInstance->Config->GetSID() + " ENDBURST");
        ServerInstance->SNO->WriteToSnoMask('l',"Finished bursting to \2"+ s->GetName()+"\2.");
 }
 
-/** Recursively send the server tree with distances as hops.
+/** Recursively send the server tree.
  * This is used during network burst to inform the other server
  * (and any of ITS servers too) of what servers we know about.
  * If at any point any of these servers already exist on the other
- * end, our connection may be terminated. The hopcounts given
- * by this function are relative, this doesn't matter so long as
- * they are all >1, as all the remote servers re-calculate them
- * to be relative too, with themselves as hop 0.
+ * end, our connection may be terminated.
+ * The hopcount parameter (3rd) is deprecated, and is always 0.
  */
-void TreeSocket::SendServers(TreeServer* Current, TreeServer* s, int hops)
+void TreeSocket::SendServers(TreeServer* Current, TreeServer* s)
 {
-       char command[MAXBUF];
        for (unsigned int q = 0; q < Current->ChildCount(); q++)
        {
                TreeServer* recursive_server = Current->GetChild(q);
                if (recursive_server != s)
                {
-                       std::string recursive_servername = recursive_server->GetName();
-                       snprintf(command, MAXBUF, ":%s SERVER %s * %d %s :%s", Current->GetID().c_str(), recursive_servername.c_str(), hops,
-                                       recursive_server->GetID().c_str(),
-                                       recursive_server->GetDesc().c_str());
-                       this->WriteLine(command);
-                       this->WriteLine(":"+recursive_server->GetID()+" VERSION :"+recursive_server->GetVersion());
+                       this->WriteLine(InspIRCd::Format(":%s SERVER %s * 0 %s :%s", Current->GetID().c_str(),
+                               recursive_server->GetName().c_str(), recursive_server->GetID().c_str(), recursive_server->GetDesc().c_str()));
+                       this->WriteLine(":" + recursive_server->GetID() + " VERSION :" + recursive_server->GetVersion());
                        /* down to next level */
-                       this->SendServers(recursive_server, s, hops+1);
+                       this->SendServers(recursive_server, s);
                }
        }
 }
@@ -104,7 +97,7 @@ void TreeSocket::SendFJoins(Channel* c)
        for (UserMembCIter i = ulist->begin(); i != ulist->end(); ++i)
        {
                const std::string& modestr = i->second->modes;
-               if ((line.length() + modestr.length() + (UUID_LENGTH-1) + 2) > 480)
+               if ((line.length() + modestr.length() + UIDGenerator::UUID_LENGTH + 2) > 480)
                {
                        this->WriteLine(line);
                        line.erase(erase_from);
@@ -114,16 +107,13 @@ void TreeSocket::SendFJoins(Channel* c)
        }
        this->WriteLine(line);
 
-       ModeReference ban(NULL, "ban");
+       ChanModeReference ban(NULL, "ban");
        static_cast<ListModeBase*>(*ban)->DoSyncChannel(c, Utils->Creator, this);
 }
 
 /** Send all XLines we know about */
 void TreeSocket::SendXLines()
 {
-       char data[MAXBUF];
-       const char* sn = ServerInstance->Config->GetSID().c_str();
-
        std::vector<std::string> types = ServerInstance->XLines->GetAllTypes();
 
        for (std::vector<std::string>::const_iterator it = types.begin(); it != types.end(); ++it)
@@ -142,12 +132,14 @@ void TreeSocket::SendXLines()
                                if (!i->second->IsBurstable())
                                        break;
 
-                               snprintf(data,MAXBUF,":%s ADDLINE %s %s %s %lu %lu :%s",sn, it->c_str(), i->second->Displayable(),
-                                               i->second->source.c_str(),
-                                               (unsigned long)i->second->set_time,
-                                               (unsigned long)i->second->duration,
-                                               i->second->reason.c_str());
-                               this->WriteLine(data);
+                               this->WriteLine(InspIRCd::Format(":%s ADDLINE %s %s %s %lu %lu :%s",
+                                       ServerInstance->Config->GetSID().c_str(),
+                                       it->c_str(),
+                                       i->second->Displayable().c_str(),
+                                       i->second->source.c_str(),
+                                       (unsigned long)i->second->set_time,
+                                       (unsigned long)i->second->duration,
+                                       i->second->reason.c_str()));
                        }
                }
        }
@@ -156,13 +148,15 @@ void TreeSocket::SendXLines()
 /** Send channel topic, modes and metadata */
 void TreeSocket::SyncChannel(Channel* chan)
 {
-       char data[MAXBUF];
-
        SendFJoins(chan);
-       if (!chan->topic.empty())
+
+       // If the topic was ever set, send it, even if it's empty now
+       // because a new empty topic should override an old non-empty topic
+       if (chan->topicset != 0)
        {
-               snprintf(data,MAXBUF,":%s FTOPIC %s %lu %lu %s :%s", ServerInstance->Config->GetSID().c_str(), chan->name.c_str(), (unsigned long) chan->age, (unsigned long)chan->topicset, chan->setby.c_str(), chan->topic.c_str());
-               this->WriteLine(data);
+               this->WriteLine(InspIRCd::Format(":%s FTOPIC %s %lu %lu %s :%s", ServerInstance->Config->GetSID().c_str(),
+                       chan->name.c_str(), (unsigned long)chan->age, (unsigned long)chan->topicset,
+                       chan->setby.c_str(), chan->topic.c_str()));
        }
 
        for (Extensible::ExtensibleStore::const_iterator i = chan->GetExtList().begin(); i != chan->GetExtList().end(); i++)
@@ -173,14 +167,12 @@ void TreeSocket::SyncChannel(Channel* chan)
                        Utils->Creator->ProtoSendMetaData(this, chan, item->name, value);
        }
 
-       FOREACH_MOD(I_OnSyncChannel,OnSyncChannel(chan, Utils->Creator, this));
+       FOREACH_MOD(OnSyncChannel, (chan, Utils->Creator, this));
 }
 
 /** send all users and their oper state/modes */
 void TreeSocket::SendUsers()
 {
-       char data[MAXBUF];
-       std::string dataline;
        for (user_hash::iterator u = ServerInstance->Users->clientlist->begin(); u != ServerInstance->Users->clientlist->end(); u++)
        {
                if (u->second->registered == REG_ALL)
@@ -188,28 +180,27 @@ void TreeSocket::SendUsers()
                        TreeServer* theirserver = Utils->FindServer(u->second->server);
                        if (theirserver)
                        {
-                               snprintf(data,MAXBUF,":%s UID %s %lu %s %s %s %s %s %lu +%s :%s",
-                                               theirserver->GetID().c_str(),   /* Prefix: SID */
-                                               u->second->uuid.c_str(),        /* 0: UUID */
-                                               (unsigned long)u->second->age,  /* 1: TS */
-                                               u->second->nick.c_str(),        /* 2: Nick */
-                                               u->second->host.c_str(),        /* 3: Displayed Host */
-                                               u->second->dhost.c_str(),       /* 4: Real host */
-                                               u->second->ident.c_str(),       /* 5: Ident */
-                                               u->second->GetIPString().c_str(),       /* 6: IP string */
-                                               (unsigned long)u->second->signon, /* 7: Signon time for WHOWAS */
-                                               u->second->FormatModes(true),   /* 8...n: Modes and params */
-                                               u->second->fullname.c_str());   /* size-1: GECOS */
-                               this->WriteLine(data);
+                               this->WriteLine(InspIRCd::Format(":%s UID %s %lu %s %s %s %s %s %lu +%s :%s",
+                                       theirserver->GetID().c_str(),     // Prefix: SID
+                                       u->second->uuid.c_str(),          // 0: UUID
+                                       (unsigned long)u->second->age,    // 1: TS
+                                       u->second->nick.c_str(),          // 2: Nick
+                                       u->second->host.c_str(),          // 3: Real host
+                                       u->second->dhost.c_str(),         // 4: Display host
+                                       u->second->ident.c_str(),         // 5: Ident
+                                       u->second->GetIPString().c_str(), // 6: IP address
+                                       (unsigned long)u->second->signon, // 7: Signon time
+                                       u->second->FormatModes(true),     // 8...n: User modes and params
+                                       u->second->fullname.c_str()));    // size-1: GECOS
+
                                if (u->second->IsOper())
                                {
-                                       snprintf(data,MAXBUF,":%s OPERTYPE %s", u->second->uuid.c_str(), u->second->oper->name.c_str());
-                                       this->WriteLine(data);
+                                       this->WriteLine(InspIRCd::Format(":%s OPERTYPE :%s", u->second->uuid.c_str(), u->second->oper->name.c_str()));
                                }
                                if (u->second->IsAway())
                                {
-                                       snprintf(data,MAXBUF,":%s AWAY %ld :%s", u->second->uuid.c_str(), (long)u->second->awaytime, u->second->awaymsg.c_str());
-                                       this->WriteLine(data);
+                                       this->WriteLine(InspIRCd::Format(":%s AWAY %ld :%s", u->second->uuid.c_str(), (long)u->second->awaytime,
+                                               u->second->awaymsg.c_str()));
                                }
                        }
 
@@ -221,7 +212,7 @@ void TreeSocket::SendUsers()
                                        Utils->Creator->ProtoSendMetaData(this, u->second, item->name, value);
                        }
 
-                       FOREACH_MOD(I_OnSyncUser,OnSyncUser(u->second,Utils->Creator,this));
+                       FOREACH_MOD(OnSyncUser, (u->second,Utils->Creator,this));
                }
        }
 }