log(DEBUG,"Sending FJOINs to other server for %s",c->name);
char list[MAXBUF];
std::string individual_halfops = ":"+Srv->GetServerName()+" FMODE "+c->name;
- size_t counter = snprintf(list,MAXBUF,":%s FJOIN %s %lu",Srv->GetServerName().c_str(),c->name,(unsigned long)c->age);
- size_t initial = counter;
+
+ size_t dlen, curlen;
+ dlen = curlen = snprintf(list,MAXBUF,":%s FJOIN %s %lu",Srv->GetServerName().c_str(),c->name,(unsigned long)c->age);
+ int numusers = 0;
+ char* ptr = list + dlen;
CUList *ulist = c->GetUsers();
std::vector<userrec*> specific_halfop;
for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++)
{
- charlcat(list,' ',MAXBUF);
- counter++;
int x = cflags(i->second,c);
if ((x & UCMODE_HOP) && (x & UCMODE_OP))
{
specific_voice.push_back(i->second);
}
- char n = 0;
+ const char* n = "";
if (x & UCMODE_OP)
{
- n = '@';
+ n = "@";
}
else if (x & UCMODE_HOP)
{
- n = '%';
+ n = "%";
}
else if (x & UCMODE_VOICE)
{
- n = '+';
+ n = "+";
}
- if (n)
- {
- charlcat(list,n,MAXBUF);
- counter++;
- }
+ size_t ptrlen = snprintf(ptr, MAXBUF, " %s%s", n, i->second->nick);
+
+ curlen += ptrlen;
+ ptr += ptrlen;
- counter += strlcat(list,i->second->nick,MAXBUF);
+ numusers++;
- if (counter > (480-NICKMAX))
+ if (curlen > (480-NICKMAX))
{
- log(DEBUG,"FJOIN line wrapped to %d %d",counter,(480-NICKMAX));
this->WriteLine(list);
- counter = snprintf(list,MAXBUF,":%s FJOIN %s %lu",Srv->GetServerName().c_str(),c->name,(unsigned long)c->age);
+ dlen = curlen = snprintf(list,MAXBUF,":%s FJOIN %s %lu",Srv->GetServerName().c_str(),c->name,(unsigned long)c->age);
+ ptr = list + dlen;
+ ptrlen = 0;
+ numusers = 0;
for (unsigned int y = 0; y < specific_voice.size(); y++)
{
this->WriteLine(":"+Srv->GetServerName()+" FMODE "+c->name+" +v "+specific_voice[y]->nick);
}
}
}
- if (counter != initial)
+ if (numusers)
{
- log(DEBUG,"Final FJOIN line");
this->WriteLine(list);
for (unsigned int y = 0; y < specific_voice.size(); y++)
{
*/
std::string burst = "BURST "+ConvToStr(time(NULL));
std::string endburst = "ENDBURST";
- Srv->SendOpers("*** Bursting to \2"+s->GetName()+"\2.");
+ // Because by the end of the netburst, it could be gone!
+ std::string name = s->GetName();
+ Srv->SendOpers("*** Bursting to \2"+name+"\2.");
this->WriteLine(burst);
ServerInstance->DoOneIteration(false);
/* send our version string */
this->WriteLine(":"+Srv->GetServerName()+" VERSION :"+Srv->GetVersion());
/* Send server tree */
- this->SendServers(TreeRoot,s,1);
+ if (FindServer(name))
+ this->SendServers(TreeRoot,s,1);
ServerInstance->DoOneIteration(false);
/* Send users and their oper status */
- this->SendUsers(s);
+ if (FindServer(name))
+ this->SendUsers(s);
ServerInstance->DoOneIteration(false);
/* Send everything else (channel modes, xlines etc) */
- this->SendChannelModes(s);
+ if (FindServer(name))
+ this->SendChannelModes(s);
ServerInstance->DoOneIteration(false);
- this->SendXLines(s);
+ if (FindServer(name))
+ this->SendXLines(s);
ServerInstance->DoOneIteration(false);
FOREACH_MOD(I_OnSyncOtherMetaData,OnSyncOtherMetaData((Module*)TreeProtocolModule,(void*)this));
ServerInstance->DoOneIteration(false);
this->WriteLine(endburst);
- Srv->SendOpers("*** Finished bursting to \2"+s->GetName()+"\2.");
+ Srv->SendOpers("*** Finished bursting to \2"+name+"\2.");
}
/* This function is called when we receive data from a remote
return 0;
}
- virtual int OnPreCommand(std::string command, char **parameters, int pcnt, userrec *user, bool validated)
+ virtual int OnPreCommand(const std::string &command, char **parameters, int pcnt, userrec *user, bool validated)
{
/* If the command doesnt appear to be valid, we dont want to mess with it. */
if (!validated)
return 0;
}
- virtual void OnGetServerDescription(std::string servername,std::string &description)
+ virtual void OnGetServerDescription(const std::string &servername,std::string &description)
{
TreeServer* s = FindServer(servername);
if (s)
}
}
- virtual void OnPostLocalTopicChange(userrec* user, chanrec* chan, std::string topic)
+ virtual void OnPostLocalTopicChange(userrec* user, chanrec* chan, const std::string &topic)
{
std::deque<std::string> params;
params.push_back(chan->name);
DoOneToMany(user->nick,"TOPIC",params);
}
- virtual void OnWallops(userrec* user, std::string text)
+ virtual void OnWallops(userrec* user, const std::string &text)
{
if (user->fd > -1)
{
}
}
- virtual void OnUserNotice(userrec* user, void* dest, int target_type, std::string text, char status)
+ virtual void OnUserNotice(userrec* user, void* dest, int target_type, const std::string &text, char status)
{
if (target_type == TYPE_USER)
{
}
}
- virtual void OnUserMessage(userrec* user, void* dest, int target_type, std::string text, char status)
+ virtual void OnUserMessage(userrec* user, void* dest, int target_type, const std::string &text, char status)
{
if (target_type == TYPE_USER)
{
}
}
- virtual void OnChangeHost(userrec* user, std::string newhost)
+ virtual void OnChangeHost(userrec* user, const std::string &newhost)
{
// only occurs for local clients
if (user->registered != 7)
DoOneToMany(user->nick,"FHOST",params);
}
- virtual void OnChangeName(userrec* user, std::string gecos)
+ virtual void OnChangeName(userrec* user, const std::string &gecos)
{
// only occurs for local clients
if (user->registered != 7)
DoOneToMany(user->nick,"FNAME",params);
}
- virtual void OnUserPart(userrec* user, chanrec* channel, std::string partmessage)
+ virtual void OnUserPart(userrec* user, chanrec* channel, const std::string &partmessage)
{
if (user->fd > -1)
{
}
}
- virtual void OnUserQuit(userrec* user, std::string reason)
+ virtual void OnUserQuit(userrec* user, const std::string &reason)
{
if ((user->fd > -1) && (user->registered == 7))
{
}
- virtual void OnUserPostNick(userrec* user, std::string oldnick)
+ virtual void OnUserPostNick(userrec* user, const std::string &oldnick)
{
if (user->fd > -1)
{
}
}
- virtual void OnUserKick(userrec* source, userrec* user, chanrec* chan, std::string reason)
+ virtual void OnUserKick(userrec* source, userrec* user, chanrec* chan, const std::string &reason)
{
if ((source) && (source->fd > -1))
{
}
}
- virtual void OnRemoteKill(userrec* source, userrec* dest, std::string reason)
+ virtual void OnRemoteKill(userrec* source, userrec* dest, const std::string &reason)
{
std::deque<std::string> params;
params.push_back(dest->nick);
DoOneToMany(source->nick,"KILL",params);
}
- virtual void OnRehash(std::string parameter)
+ virtual void OnRehash(const std::string ¶meter)
{
if (parameter != "")
{
// note: the protocol does not allow direct umode +o except
// via NICK with 8 params. sending OPERTYPE infers +o modechange
// locally.
- virtual void OnOper(userrec* user, std::string opertype)
+ virtual void OnOper(userrec* user, const std::string &opertype)
{
if (user->fd > -1)
{
}
}
- void OnLine(userrec* source, std::string host, bool adding, char linetype, long duration, std::string reason)
+ void OnLine(userrec* source, const std::string &host, bool adding, char linetype, long duration, const std::string &reason)
{
if (source->fd > -1)
{
}
}
- virtual void OnAddGLine(long duration, userrec* source, std::string reason, std::string hostmask)
+ virtual void OnAddGLine(long duration, userrec* source, const std::string &reason, const std::string &hostmask)
{
OnLine(source,hostmask,true,'G',duration,reason);
}
- virtual void OnAddZLine(long duration, userrec* source, std::string reason, std::string ipmask)
+ virtual void OnAddZLine(long duration, userrec* source, const std::string &reason, const std::string &ipmask)
{
OnLine(source,ipmask,true,'Z',duration,reason);
}
- virtual void OnAddQLine(long duration, userrec* source, std::string reason, std::string nickmask)
+ virtual void OnAddQLine(long duration, userrec* source, const std::string &reason, const std::string &nickmask)
{
OnLine(source,nickmask,true,'Q',duration,reason);
}
- virtual void OnAddELine(long duration, userrec* source, std::string reason, std::string hostmask)
+ virtual void OnAddELine(long duration, userrec* source, const std::string &reason, const std::string &hostmask)
{
OnLine(source,hostmask,true,'E',duration,reason);
}
- virtual void OnDelGLine(userrec* source, std::string hostmask)
+ virtual void OnDelGLine(userrec* source, const std::string &hostmask)
{
OnLine(source,hostmask,false,'G',0,"");
}
- virtual void OnDelZLine(userrec* source, std::string ipmask)
+ virtual void OnDelZLine(userrec* source, const std::string &ipmask)
{
OnLine(source,ipmask,false,'Z',0,"");
}
- virtual void OnDelQLine(userrec* source, std::string nickmask)
+ virtual void OnDelQLine(userrec* source, const std::string &nickmask)
{
OnLine(source,nickmask,false,'Q',0,"");
}
- virtual void OnDelELine(userrec* source, std::string hostmask)
+ virtual void OnDelELine(userrec* source, const std::string &hostmask)
{
OnLine(source,hostmask,false,'E',0,"");
}
- virtual void OnMode(userrec* user, void* dest, int target_type, std::string text)
+ virtual void OnMode(userrec* user, void* dest, int target_type, const std::string &text)
{
if ((user->fd > -1) && (user->registered == 7))
{
}
}
- virtual void ProtoSendMode(void* opaque, int target_type, void* target, std::string modeline)
+ virtual void ProtoSendMode(void* opaque, int target_type, void* target, const std::string &modeline)
{
TreeSocket* s = (TreeSocket*)opaque;
if (target)
}
}
- virtual void ProtoSendMetaData(void* opaque, int target_type, void* target, std::string extname, std::string extdata)
+ virtual void ProtoSendMetaData(void* opaque, int target_type, void* target, const std::string &extname, const std::string &extdata)
{
TreeSocket* s = (TreeSocket*)opaque;
if (target)