commit b90f71ca2ab1b2eea7ca992b1e51a4b39afe0728 from: Scott Perry via: Florian Westphal date: Mon May 26 19:20:03 2008 UTC Use strtok_r instead of strchr in IRC_JOIN. This patch does significant cleanup on the join code by using strtok_r instead of mangling strchr to parse channel names and keys in parallel when a JOIN command contains a list of channels and keys. Also adds an strtok_r implementation to libportab. commit - d060e90de06e0fb3fc3e557fe97f9d0b0e132a29 commit + b90f71ca2ab1b2eea7ca992b1e51a4b39afe0728 blob - 3aa42fcea16c4047196ee5a35db92986ae04f753 blob + f02835fb9bca4d0b7eacaa00106ea90487235458 --- configure.in +++ configure.in @@ -139,7 +139,7 @@ AC_CHECK_FUNCS([ \ bind gethostbyaddr gethostbyname gethostname inet_ntoa \ setsid setsockopt socket strcasecmp waitpid],,AC_MSG_ERROR([required function missing!])) -AC_CHECK_FUNCS(inet_aton isdigit sigaction snprintf vsnprintf strdup strlcpy strlcat) +AC_CHECK_FUNCS(inet_aton isdigit sigaction snprintf vsnprintf strdup strlcpy strlcat strtok_r) # -- Configuration options -- blob - 92dd8cd37559908da502f289cdee024b65cfe97b blob + 203e32f4e2961835b7ba56aab6158f693873137e --- src/ngircd/irc-channel.c +++ src/ngircd/irc-channel.c @@ -182,7 +182,7 @@ join_send_topic(CLIENT *Client, CLIENT *target, CHANNE GLOBAL bool IRC_JOIN( CLIENT *Client, REQUEST *Req ) { - char *channame, *channame_ptr, *key, *key_ptr, *flags; + char *channame, *key = NULL, *flags, *lastkey, *lastchan; CLIENT *target; CHANNEL *chan; @@ -208,16 +208,11 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req ) return part_from_all_channels(Client, target); /* Are channel keys given? */ - if (Req->argc > 1) { - key = Req->argv[1]; - key_ptr = strchr(key, ','); - if (key_ptr) *key_ptr = '\0'; - } else { - key = key_ptr = NULL; - } + if (Req->argc > 1) + key = strtok_r(Req->argv[1], ",", &lastkey); + channame = Req->argv[0]; - channame_ptr = strchr(channame, ','); - if (channame_ptr) *channame_ptr = '\0'; + channame = strtok_r(channame, ",", &lastchan); while (channame) { flags = NULL; @@ -288,18 +283,9 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req ) break; /* write error */ /* next channel? */ - channame = channame_ptr; - if (channame) { - channame++; - channame_ptr = strchr(channame, ','); - if (channame_ptr) *channame_ptr = '\0'; - - if (key_ptr) { - key = ++key_ptr; - key_ptr = strchr(key, ','); - if (key_ptr) *key_ptr = '\0'; - } - } + channame = strtok_r(NULL, ",", &lastchan); + if (channame && key) + key = strtok_r(NULL, ",", &lastkey); } return CONNECTED; } /* IRC_JOIN */ blob - 06c6bae474ee52347de3966b824e5d9d2ab51326 blob + c48e67add1e47017b89a555371d9d197584f2bcd --- src/portab/Makefile.am +++ src/portab/Makefile.am @@ -9,14 +9,12 @@ # Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste # der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. # -# $Id: Makefile.am,v 1.8 2005/04/16 09:23:01 fw Exp $ -# AUTOMAKE_OPTIONS = ansi2knr noinst_LIBRARIES = libngportab.a -libngportab_a_SOURCES = strlcpy.c strdup.c vsnprintf.c +libngportab_a_SOURCES = strdup.c strlcpy.c strtok_r.c vsnprintf.c check_PROGRAMS = portabtest blob - 2a133efc63d4b31d711f42b60a46d5a36753cccc blob + 83e11313d4ae3aa1ff555cd40ecf6eee1d40b514 --- src/portab/portab.h +++ src/portab/portab.h @@ -148,6 +148,10 @@ extern size_t strlcpy PARAMS(( char *dst, const char * extern char * strdup PARAMS(( const char *s )); #endif +#ifndef HAVE_STRTOK_R +extern char * strtok_r PARAMS((char *str, const char *delim, char **saveptr)); +#endif + #ifndef HAVE_VSNPRINTF #include extern int vsnprintf PARAMS(( char *str, size_t count, const char *fmt, va_list args )); blob - /dev/null blob + 852c8f705548d557785dc68a86bb0378e3d4e1d4 (mode 644) --- /dev/null +++ src/portab/strtok_r.c @@ -0,0 +1,27 @@ +#include "portab.h" +#include + +#ifndef HAVE_STRTOK_R + +char * +strtok_r(char *str, const char *delim, char **saveptr) +{ + char *tmp; + + if (!str) + str = *saveptr; + str += strspn(str, delim); + if (*str == 0) + return NULL; + + tmp = str + strcspn(str, delim); /* get end of token */ + if (*tmp) { /* another delimiter */ + *tmp = 0; + tmp++; + } + *saveptr = tmp; + return str; +} + +#endif +