From: Michael Poole Date: Fri, 14 Dec 2007 03:32:13 +0000 (-0500) Subject: Avoid appending a user to curr_opers or curr_helpers more than once. X-Git-Tag: v1.4.0-rc3~48 X-Git-Url: http://git.pk910.de/?p=srvx.git;a=commitdiff_plain;h=a96bcd75a7530b0f9a25209b585e3ee18dc49937 Avoid appending a user to curr_opers or curr_helpers more than once. hash.h (userList_contains): Declare new function. hash.c (userList_contains): Implement it. nickserv.c (set_user_handle_info): Use it to check against curr_helpers. proto-p10.c (mod_usermode): Use it for curr_opers. --- diff --git a/src/hash.c b/src/hash.c index d806c27..2250d06 100644 --- a/src/hash.c +++ b/src/hash.c @@ -42,6 +42,18 @@ void init_structs(void) reg_exit_func(hash_cleanup); } +int userList_contains(struct userList *list, struct userNode *user) +{ + unsigned int ii; + + for (ii = 0; ii < list->used; ++ii) { + if (user == list->list[ii]) { + return 1; + } + } + return 0; +} + server_link_func_t *slf_list; unsigned int slf_size = 0, slf_used = 0; diff --git a/src/hash.h b/src/hash.h index 1da8758..354054e 100644 --- a/src/hash.h +++ b/src/hash.h @@ -199,6 +199,8 @@ struct userNode* GetUserH(const char *nick); /* using nick */ struct chanNode* GetChannel(const char *name); struct modeNode* GetUserMode(struct chanNode* channel, struct userNode* user); +int userList_contains(struct userList *list, struct userNode *user); + typedef void (*server_link_func_t) (struct server *server); void reg_server_link_func(server_link_func_t handler); diff --git a/src/nickserv.c b/src/nickserv.c index 305cfad..81fe3aa 100644 --- a/src/nickserv.c +++ b/src/nickserv.c @@ -944,7 +944,7 @@ set_user_handle_info(struct userNode *user, struct handle_info *hi, int stamp) user->next_authed = hi->users; hi->users = user; hi->lastseen = now; - if (IsHelper(user)) + if (IsHelper(user) && !userList_contains(&curr_helpers, user)) userList_append(&curr_helpers, user); if (hi->fakehost || old_info) diff --git a/src/proto-p10.c b/src/proto-p10.c index 8a5a76d..a0da122 100644 --- a/src/proto-p10.c +++ b/src/proto-p10.c @@ -2213,11 +2213,11 @@ void mod_usermode(struct userNode *user, const char *mode_change) { case '-': add = 0; break; case 'o': do_user_mode(FLAGS_OPER); - if (add) { + if (!add) { + userList_remove(&curr_opers, user); + } else if (!userList_contains(&curr_opers, user)) { userList_append(&curr_opers, user); call_oper_funcs(user); - } else { - userList_remove(&curr_opers, user); } break; case 'i': do_user_mode(FLAGS_INVISIBLE);