diff options
-rw-r--r-- | include/message.h | 2 | ||||
-rw-r--r-- | src/commands.cpp | 30 | ||||
-rw-r--r-- | src/message.cpp | 21 |
3 files changed, 34 insertions, 19 deletions
diff --git a/include/message.h b/include/message.h index d00cae30e..b990b15ec 100644 --- a/include/message.h +++ b/include/message.h @@ -44,7 +44,7 @@ char* cmode(userrec *user, chanrec *chan); int cstatus(userrec *user, chanrec *chan); int has_channel(userrec *u, chanrec *c); void TidyBan(char *ban); -char* chlist(userrec *user, userrec* source); +std::string chlist(userrec *user, userrec* source); void send_network_quit(const char* nick, const char* reason); #endif diff --git a/src/commands.cpp b/src/commands.cpp index 7cdc534a2..dbcd3f4f9 100644 --- a/src/commands.cpp +++ b/src/commands.cpp @@ -823,6 +823,23 @@ void handle_whois(char **parameters, int pcnt, userrec *user) } } +void split_chlist(userrec* user, userrec* dest, std::string &cl) +{ + std::stringstream channels(cl); + std::string line = ""; + std::string cname = ""; + while (!channels.eof()) + { + channels >> cname; + line = line + cname + " "; + if (line.length() > 400) + { + WriteServ(user->fd,"319 %s %s :%s",user->nick, dest->nick, line.c_str()); + line = ""; + } + } +} + void do_whois(userrec* user, userrec* dest,unsigned long signon, unsigned long idle, char* nick) { // bug found by phidjit - were able to whois an incomplete connection if it had sent a NICK or USER @@ -833,10 +850,17 @@ void do_whois(userrec* user, userrec* dest,unsigned long signon, unsigned long i { WriteServ(user->fd,"378 %s %s :is connecting from *@%s %s",user->nick, dest->nick, dest->host, dest->ip); } - char* cl = chlist(dest,user); - if (*cl) + std::string cl = chlist(dest,user); + if (cl.length()) { - WriteServ(user->fd,"319 %s %s :%s",user->nick, dest->nick, cl); + if (cl.length() > 400) + { + split_chlist(user,dest,cl); + } + else + { + WriteServ(user->fd,"319 %s %s :%s",user->nick, dest->nick, cl.c_str()); + } } WriteServ(user->fd,"312 %s %s %s :%s",user->nick, dest->nick, dest->server, GetServerDescription(dest->server).c_str()); if (*dest->awaymsg) diff --git a/src/message.cpp b/src/message.cpp index 79ea41f19..f55df0ee3 100644 --- a/src/message.cpp +++ b/src/message.cpp @@ -427,11 +427,11 @@ void TidyBan(char *ban) char lst[MAXBUF]; -char* chlist(userrec *user,userrec* source) +std::string chlist(userrec *user,userrec* source) { - char cmp[MAXBUF]; + std::string cmp = ""; + std::string lst = ""; log(DEBUG,"chlist: %s",user->nick); - strcpy(lst,""); if (!user) { return lst; @@ -442,27 +442,18 @@ char* chlist(userrec *user,userrec* source) { if (user->chans[i].channel->name) { - strlcpy(cmp,user->chans[i].channel->name,MAXBUF); - strlcat(cmp," ",MAXBUF); - if (!strstr(lst,cmp)) + cmp = std::string(user->chans[i].channel->name) + " "; + if (!strstr(lst.c_str(),cmp.c_str())) { // if the channel is NOT private/secret, OR the source user is on the channel if (((!(user->chans[i].channel->binarymodes & CM_PRIVATE)) && (!(user->chans[i].channel->binarymodes & CM_SECRET))) || (has_channel(source,user->chans[i].channel))) { - strlcat(lst,cmode(user,user->chans[i].channel),MAXBUF); - strlcat(lst,user->chans[i].channel->name,MAXBUF); - strlcat(lst," ",MAXBUF); + lst = lst + std::string(cmode(user,user->chans[i].channel)) + std::string(user->chans[i].channel->name) + " "; } } } } } - if (strlen(lst)) - { - lst[strlen(lst)-1] = '\0'; // chop trailing space - } return lst; } - - |