X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_spanningtree.cpp;h=e859ff8445fc4436da93ec5e9e6ba2930d5cf9d8;hb=843710b75a87e9ee91e4e14f78e9bce9267af391;hp=03e543cd64a4bdd737e7390008358768398cdd6b;hpb=6a35f96eb272821d42f0757e2654d84bd5b2c05a;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_spanningtree.cpp b/src/modules/m_spanningtree.cpp index 03e543cd6..e859ff844 100644 --- a/src/modules/m_spanningtree.cpp +++ b/src/modules/m_spanningtree.cpp @@ -883,26 +883,23 @@ class TreeSocket : public InspSocket { if (params.size() != 4) return true; - std::string channel = params[0]; time_t ts = atoi(params[1].c_str()); - std::string setby = params[2]; - std::string topic = params[3]; std::string nsource = source; - chanrec* c = Srv->FindChannel(channel); + chanrec* c = Srv->FindChannel(params[0]); if (c) { if ((ts >= c->topicset) || (!*c->topic)) { std::string oldtopic = c->topic; - strlcpy(c->topic,topic.c_str(),MAXTOPIC); - strlcpy(c->setby,setby.c_str(),NICKMAX); + strlcpy(c->topic,params[3].c_str(),MAXTOPIC); + strlcpy(c->setby,params[2].c_str(),NICKMAX); c->topicset = ts; /* if the topic text is the same as the current topic, * dont bother to send the TOPIC command out, just silently * update the set time and set nick. */ - if (oldtopic != topic) + if (oldtopic != params[3]) { userrec* user = Srv->FindNick(source); if (!user) @@ -1063,10 +1060,6 @@ class TreeSocket : public InspSocket return true; // NICK age nick host dhost ident +modes ip :gecos // 0 1 2 3 4 5 6 7 - std::string nick = params[1]; - std::string host = params[2]; - std::string dhost = params[3]; - std::string ident = params[4]; time_t age = atoi(params[0].c_str()); std::string modes = params[5]; while (*(modes.c_str()) == '+') @@ -1075,17 +1068,15 @@ class TreeSocket : public InspSocket m++; modes = m; } - std::string ip = params[6]; - std::string gecos = params[7]; - char* tempnick = (char*)nick.c_str(); - log(DEBUG,"Introduce client %s!%s@%s",tempnick,ident.c_str(),host.c_str()); + char* tempnick = (char*)params[1].c_str(); + log(DEBUG,"Introduce client %s!%s@%s",tempnick,params[4].c_str(),params[2].c_str()); user_hash::iterator iter; iter = clientlist.find(tempnick); if (iter != clientlist.end()) { // nick collision - log(DEBUG,"Nick collision on %s!%s@%s: %lu %lu",tempnick,ident.c_str(),host.c_str(),(unsigned long)age,(unsigned long)iter->second->age); + log(DEBUG,"Nick collision on %s!%s@%s: %lu %lu",tempnick,params[4].c_str(),params[2].c_str(),(unsigned long)age,(unsigned long)iter->second->age); this->WriteLine(":"+Srv->GetServerName()+" KILL "+tempnick+" :Nickname collision"); return true; } @@ -1093,15 +1084,15 @@ class TreeSocket : public InspSocket clientlist[tempnick] = new userrec(); clientlist[tempnick]->fd = FD_MAGIC_NUMBER; strlcpy(clientlist[tempnick]->nick, tempnick,NICKMAX); - strlcpy(clientlist[tempnick]->host, host.c_str(),160); - strlcpy(clientlist[tempnick]->dhost, dhost.c_str(),160); + strlcpy(clientlist[tempnick]->host, params[2].c_str(),160); + strlcpy(clientlist[tempnick]->dhost, params[3].c_str(),160); clientlist[tempnick]->server = (char*)FindServerNamePtr(source.c_str()); - strlcpy(clientlist[tempnick]->ident, ident.c_str(),IDENTMAX); - strlcpy(clientlist[tempnick]->fullname, gecos.c_str(),MAXGECOS); + strlcpy(clientlist[tempnick]->ident, params[4].c_str(),IDENTMAX); + strlcpy(clientlist[tempnick]->fullname, params[7].c_str(),MAXGECOS); clientlist[tempnick]->registered = 7; clientlist[tempnick]->signon = age; strlcpy(clientlist[tempnick]->modes, modes.c_str(),53); - inet_aton(ip.c_str(),&clientlist[tempnick]->ip4); + inet_aton(params[6].c_str(),&clientlist[tempnick]->ip4); ucrec a; a.channel = NULL; @@ -1160,45 +1151,46 @@ class TreeSocket : public InspSocket void SendXLines(TreeServer* Current) { char data[MAXBUF]; + const char* sn = Srv->GetServerName().c_str(); /* Yes, these arent too nice looking, but they get the job done */ for (std::vector::iterator i = zlines.begin(); i != zlines.end(); i++) { - snprintf(data,MAXBUF,":%s ADDLINE Z %s %s %lu %lu :%s",Srv->GetServerName().c_str(),i->ipaddr,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); + snprintf(data,MAXBUF,":%s ADDLINE Z %s %s %lu %lu :%s",sn,i->ipaddr,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); this->WriteLine(data); } for (std::vector::iterator i = qlines.begin(); i != qlines.end(); i++) { - snprintf(data,MAXBUF,":%s ADDLINE Q %s %s %lu %lu :%s",Srv->GetServerName().c_str(),i->nick,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); + snprintf(data,MAXBUF,":%s ADDLINE Q %s %s %lu %lu :%s",sn,i->nick,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); this->WriteLine(data); } for (std::vector::iterator i = glines.begin(); i != glines.end(); i++) { - snprintf(data,MAXBUF,":%s ADDLINE G %s %s %lu %lu :%s",Srv->GetServerName().c_str(),i->hostmask,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); + snprintf(data,MAXBUF,":%s ADDLINE G %s %s %lu %lu :%s",sn,i->hostmask,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); this->WriteLine(data); } for (std::vector::iterator i = elines.begin(); i != elines.end(); i++) { - snprintf(data,MAXBUF,":%s ADDLINE E %s %s %lu %lu :%s",Srv->GetServerName().c_str(),i->hostmask,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); + snprintf(data,MAXBUF,":%s ADDLINE E %s %s %lu %lu :%s",sn,i->hostmask,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); this->WriteLine(data); } for (std::vector::iterator i = pzlines.begin(); i != pzlines.end(); i++) { - snprintf(data,MAXBUF,":%s ADDLINE Z %s %s %lu %lu :%s",Srv->GetServerName().c_str(),i->ipaddr,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); + snprintf(data,MAXBUF,":%s ADDLINE Z %s %s %lu %lu :%s",sn,i->ipaddr,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); this->WriteLine(data); } for (std::vector::iterator i = pqlines.begin(); i != pqlines.end(); i++) { - snprintf(data,MAXBUF,":%s ADDLINE Q %s %s %lu %lu :%s",Srv->GetServerName().c_str(),i->nick,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); + snprintf(data,MAXBUF,":%s ADDLINE Q %s %s %lu %lu :%s",sn,i->nick,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); this->WriteLine(data); } for (std::vector::iterator i = pglines.begin(); i != pglines.end(); i++) { - snprintf(data,MAXBUF,":%s ADDLINE G %s %s %lu %lu :%s",Srv->GetServerName().c_str(),i->hostmask,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); + snprintf(data,MAXBUF,":%s ADDLINE G %s %s %lu %lu :%s",sn,i->hostmask,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); this->WriteLine(data); } for (std::vector::iterator i = pelines.begin(); i != pelines.end(); i++) { - snprintf(data,MAXBUF,":%s ADDLINE E %s %s %lu %lu :%s",Srv->GetServerName().c_str(),i->hostmask,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); + snprintf(data,MAXBUF,":%s ADDLINE E %s %s %lu %lu :%s",sn,i->hostmask,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); this->WriteLine(data); } } @@ -1208,19 +1200,20 @@ class TreeSocket : public InspSocket { char data[MAXBUF]; std::deque list; + const char* sn = Srv->GetServerName().c_str(); for (chan_hash::iterator c = chanlist.begin(); c != chanlist.end(); c++) { SendFJoins(Current, c->second); - snprintf(data,MAXBUF,":%s FMODE %s +%s",Srv->GetServerName().c_str(),c->second->name,chanmodes(c->second,true)); + snprintf(data,MAXBUF,":%s FMODE %s +%s",sn,c->second->name,chanmodes(c->second,true)); this->WriteLine(data); if (*c->second->topic) { - snprintf(data,MAXBUF,":%s FTOPIC %s %lu %s :%s",Srv->GetServerName().c_str(),c->second->name,(unsigned long)c->second->topicset,c->second->setby,c->second->topic); + snprintf(data,MAXBUF,":%s FTOPIC %s %lu %s :%s",sn,c->second->name,(unsigned long)c->second->topicset,c->second->setby,c->second->topic); this->WriteLine(data); } for (BanList::iterator b = c->second->bans.begin(); b != c->second->bans.end(); b++) { - snprintf(data,MAXBUF,":%s FMODE %s +b %s",Srv->GetServerName().c_str(),c->second->name,b->data); + snprintf(data,MAXBUF,":%s FMODE %s +b %s",sn,c->second->name,b->data); this->WriteLine(data); } FOREACH_MOD(I_OnSyncChannel,OnSyncChannel(c->second,(Module*)TreeProtocolModule,(void*)this)); @@ -1244,7 +1237,7 @@ class TreeSocket : public InspSocket { snprintf(data,MAXBUF,":%s NICK %lu %s %s %s %s +%s %s :%s",u->second->server,(unsigned long)u->second->age,u->second->nick,u->second->host,u->second->dhost,u->second->ident,u->second->modes,(char*)inet_ntoa(u->second->ip4),u->second->fullname); this->WriteLine(data); - if (strchr(u->second->modes,'o')) + if (*u->second->oper) { this->WriteLine(":"+std::string(u->second->nick)+" OPERTYPE "+std::string(u->second->oper)); } @@ -1300,23 +1293,16 @@ class TreeSocket : public InspSocket /* Check that the data read is a valid pointer and it has some content */ if (data && *data) { - this->in_buffer += data; + this->in_buffer.append(data); /* While there is at least one new line in the buffer, * do something useful (we hope!) with it. */ while (in_buffer.find("\n") != std::string::npos) { - char* line = (char*)in_buffer.c_str(); - std::string ret = ""; - while ((*line != '\n') && (strlen(line))) - { - if ((*line != '\r') && (*line != '\n')) - ret = ret + *line; - line++; - } - if ((*line == '\n') || (*line == '\r')) - line++; - in_buffer = line; + std::string ret = in_buffer.substr(0,in_buffer.find("\n")-1); + in_buffer = in_buffer.substr(in_buffer.find("\n")+1,in_buffer.length()-in_buffer.find("\n")); + if (ret.find("\r") != std::string::npos) + ret = in_buffer.substr(0,in_buffer.find("\r")-1); /* Process this one, abort if it * didnt return true. */ @@ -1567,42 +1553,42 @@ class TreeSocket : public InspSocket { if (params.size() < 6) return true; - std::string linetype = params[0]; /* Z, Q, E, G, K */ - std::string mask = params[1]; /* Line type dependent */ - std::string source = params[2]; /* may not be online or may be a server */ - std::string settime = params[3]; /* EPOCH time set */ - std::string duration = params[4]; /* Duration secs */ - std::string reason = params[5]; - switch (*(linetype.c_str())) + bool propogate = false; + + switch (*(params[0].c_str())) { case 'Z': - add_zline(atoi(duration.c_str()), source.c_str(), reason.c_str(), mask.c_str()); - zline_set_creation_time((char*)mask.c_str(), atoi(settime.c_str())); + propogate = add_zline(atoi(params[4].c_str()), params[2].c_str(), params[5].c_str(), params[1].c_str()); + zline_set_creation_time((char*)params[1].c_str(), atoi(params[3].c_str())); break; case 'Q': - add_qline(atoi(duration.c_str()), source.c_str(), reason.c_str(), mask.c_str()); - qline_set_creation_time((char*)mask.c_str(), atoi(settime.c_str())); + propogate = add_qline(atoi(params[4].c_str()), params[2].c_str(), params[5].c_str(), params[1].c_str()); + qline_set_creation_time((char*)params[1].c_str(), atoi(params[3].c_str())); break; case 'E': - add_eline(atoi(duration.c_str()), source.c_str(), reason.c_str(), mask.c_str()); - eline_set_creation_time((char*)mask.c_str(), atoi(settime.c_str())); + propogate = add_eline(atoi(params[4].c_str()), params[2].c_str(), params[5].c_str(), params[1].c_str()); + eline_set_creation_time((char*)params[1].c_str(), atoi(params[3].c_str())); break; case 'G': - add_gline(atoi(duration.c_str()), source.c_str(), reason.c_str(), mask.c_str()); - gline_set_creation_time((char*)mask.c_str(), atoi(settime.c_str())); + propogate = add_gline(atoi(params[4].c_str()), params[2].c_str(), params[5].c_str(), params[1].c_str()); + gline_set_creation_time((char*)params[1].c_str(), atoi(params[3].c_str())); break; case 'K': - add_kline(atoi(duration.c_str()), source.c_str(), reason.c_str(), mask.c_str()); + propogate = add_kline(atoi(params[4].c_str()), params[2].c_str(), params[5].c_str(), params[1].c_str()); break; default: /* Just in case... */ - Srv->SendOpers("*** \2WARNING\2: Invalid xline type '"+linetype+"' sent by server "+prefix+", ignored!"); + Srv->SendOpers("*** \2WARNING\2: Invalid xline type '"+params[0]+"' sent by server "+prefix+", ignored!"); + propogate = false; break; } /* Send it on its way */ - params[5] = ":" + params[5]; - DoOneToAllButSender(prefix,"ADDLINE",params,prefix); + if (propogate) + { + params[5] = ":" + params[5]; + DoOneToAllButSender(prefix,"ADDLINE",params,prefix); + } return true; } @@ -2509,8 +2495,8 @@ class ModuleSpanningTree : public Module std::vector Bindings; int line; int NumServers; - int max_local; - int max_global; + unsigned int max_local; + unsigned int max_global; cmd_rconnect* command_rconnect; public: @@ -2574,7 +2560,7 @@ class ModuleSpanningTree : public Module void HandleLusers(char** parameters, int pcnt, userrec* user) { /* Only update these when someone wants to see them, more efficient */ - if (local_count() > max_local) + if ((unsigned int)local_count() > max_local) max_local = local_count(); if (clientlist.size() > max_global) max_global = clientlist.size(); @@ -2584,8 +2570,8 @@ class ModuleSpanningTree : public Module WriteServ(user->fd,"253 %s %d :unknown connections",user->nick,usercount_unknown()); WriteServ(user->fd,"254 %s %d :channels formed",user->nick,chancount()); WriteServ(user->fd,"254 %s :I have %d clients and %d servers",user->nick,local_count(),this->CountLocalServs()); - WriteServ(user->fd,"265 %s :Current Local Users: %d Max: %d",user->nick,local_count(),max_local); - WriteServ(user->fd,"266 %s :Current Global Users: %d Max: %d",user->nick,clientlist.size(),max_global); + WriteServ(user->fd,"265 %s :Current Local Users: %d Max: %d",user->nick,local_count(),max_local); + WriteServ(user->fd,"266 %s :Current Global Users: %d Max: %d",user->nick,clientlist.size(),max_global); return; }