From 84fdd1cdf1e3eddf6f5e5c39285a8ff7ab1af470 Mon Sep 17 00:00:00 2001 From: brain Date: Thu, 15 Dec 2005 17:00:14 +0000 Subject: Improved pointer voodoo in chanmodes(), many less strlcats git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@2481 e03df62e-2008-0410-955e-edbf42e46eb7 --- src/helperfuncs.cpp | 59 +++++++++++++++++++---------------------------------- 1 file changed, 21 insertions(+), 38 deletions(-) diff --git a/src/helperfuncs.cpp b/src/helperfuncs.cpp index b9dec4a40..38355eb2b 100644 --- a/src/helperfuncs.cpp +++ b/src/helperfuncs.cpp @@ -778,7 +778,7 @@ long GetMaxBans(char* name) void purge_empty_chans(userrec* u) { - int go_again = 1, purge = 0; + int purge = 0; // firstly decrement the count on each channel for (unsigned int f = 0; f < u->chans.size(); f++) @@ -803,7 +803,6 @@ void purge_empty_chans(userrec* u) if (i2->second) delete i2->second; chanlist.erase(i2); - go_again = 1; purge++; u->chans[i].channel = NULL; } @@ -820,57 +819,39 @@ void purge_empty_chans(userrec* u) } -char scratch[MAXBUF]; -char sparam[MAXBUF]; - char* chanmodes(chanrec *chan) { + static char scratch[MAXBUF]; + static char sparam[MAXBUF]; + int offset = 0; + if (!chan) { log(DEFAULT,"*** BUG *** chanmodes was given an invalid parameter"); - strcpy(scratch,""); + *scratch = '\0'; return scratch; } - strcpy(scratch,""); - strcpy(sparam,""); + *scratch = '\0'; + *sparam = '\0'; if (chan->binarymodes & CM_NOEXTERNAL) - { - strlcat(scratch,"n",MAXMODES); - } + scratch[offset++] = 'n'; if (chan->binarymodes & CM_TOPICLOCK) - { - strlcat(scratch,"t",MAXMODES); - } + scratch[offset++] = 't'; if (*chan->key) - { - strlcat(scratch,"k",MAXMODES); - } + scratch[offset++] = 'k'; if (chan->limit) - { - strlcat(scratch,"l",MAXMODES); - } + scratch[offset++] = 'l'; if (chan->binarymodes & CM_INVITEONLY) - { - strlcat(scratch,"i",MAXMODES); - } + scratch[offset++] = 'i'; if (chan->binarymodes & CM_MODERATED) - { - strlcat(scratch,"m",MAXMODES); - } + scratch[offset++] = 'm'; if (chan->binarymodes & CM_SECRET) - { - strlcat(scratch,"s",MAXMODES); - } + scratch[offset++] = 's'; if (chan->binarymodes & CM_PRIVATE) - { - strlcat(scratch,"p",MAXMODES); - } + scratch[offset++] = 'p'; if (*chan->key) - { - strlcat(sparam," ",MAXBUF); - strlcat(sparam,chan->key,MAXBUF); - } + snprintf(sparam,MAXBUF," %s",chan->key); if (chan->limit) { char foo[24]; @@ -879,7 +860,8 @@ char* chanmodes(chanrec *chan) } if (*chan->custom_modes) { - strlcat(scratch,chan->custom_modes,MAXMODES); + for (char* t= chan->custom_modes; *t; t++) + scratch[offset++] = *t; for (int z = 0; chan->custom_modes[z] != 0; z++) { std::string extparam = chan->GetModeParameter(chan->custom_modes[z]); @@ -890,7 +872,8 @@ char* chanmodes(chanrec *chan) } } } - log(DEBUG,"chanmodes: %s %s%s",chan->name,scratch,sparam); + /* Null terminate scratch */ + scratch[offset] = '\0'; strlcat(scratch,sparam,MAXMODES); return scratch; } -- cgit v1.2.3