summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/message.h2
-rw-r--r--src/commands.cpp30
-rw-r--r--src/message.cpp21
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;
}
-
-