From 85550587fb0015fcd5ceba413987e423bfb33879 Mon Sep 17 00:00:00 2001 From: Jilles Tjoelker Date: Sat, 29 Mar 2008 23:38:22 +0100 Subject: [PATCH] Unbreak /quote help stats as an oper (all where oper and user help are different). Remove symlink optimization, so helpfiles equal for opers and users are loaded into memory twice, which is not an issue. --- include/cache.h | 3 ++- modules/m_help.c | 2 +- src/cache.c | 43 +++++++++++++------------------------------ 3 files changed, 16 insertions(+), 32 deletions(-) diff --git a/include/cache.h b/include/cache.h index 64fb30c7..814a0402 100644 --- a/include/cache.h +++ b/include/cache.h @@ -44,7 +44,8 @@ extern void send_user_motd(struct Client *); extern void send_oper_motd(struct Client *); struct Dictionary; -extern struct Dictionary *help_dict; +extern struct Dictionary *help_dict_oper; +extern struct Dictionary *help_dict_user; #endif diff --git a/modules/m_help.c b/modules/m_help.c index 24c562f3..544b54a3 100644 --- a/modules/m_help.c +++ b/modules/m_help.c @@ -102,7 +102,7 @@ dohelp(struct Client *source_p, int flags, const char *topic) if(EmptyString(topic)) topic = ntopic; - hptr = irc_dictionary_retrieve(help_dict, topic); + hptr = irc_dictionary_retrieve(flags & HELP_OPER ? help_dict_oper : help_dict_user, topic); if(hptr == NULL || !(hptr->flags & flags)) { diff --git a/src/cache.c b/src/cache.c index 2ca0bbf9..a7cdb86e 100644 --- a/src/cache.c +++ b/src/cache.c @@ -53,7 +53,8 @@ struct cachefile *user_motd = NULL; struct cachefile *oper_motd = NULL; char user_motd_changed[MAX_DATE_STRING]; -struct Dictionary *help_dict = NULL; +struct Dictionary *help_dict_oper = NULL; +struct Dictionary *help_dict_user = NULL; /* init_cache() * @@ -72,7 +73,8 @@ init_cache(void) user_motd = cache_file(MPATH, "ircd.motd", 0); oper_motd = cache_file(OPATH, "opers.motd", 0); - help_dict = irc_dictionary_create(strcasecmp); + help_dict_oper = irc_dictionary_create(strcasecmp); + help_dict_user = irc_dictionary_create(strcasecmp); } /* cache_file() @@ -173,17 +175,17 @@ load_help(void) struct cachefile *cacheptr; struct DictionaryIter iter; -#if defined(S_ISLNK) && defined(HAVE_LSTAT) - struct stat sb; -#endif - - DICTIONARY_FOREACH(cacheptr, &iter, help_dict) + DICTIONARY_FOREACH(cacheptr, &iter, help_dict_oper) { - irc_dictionary_delete(help_dict, cacheptr->name); + irc_dictionary_delete(help_dict_oper, cacheptr->name); + free_cachefile(cacheptr); + } + DICTIONARY_FOREACH(cacheptr, &iter, help_dict_user) + { + irc_dictionary_delete(help_dict_user, cacheptr->name); free_cachefile(cacheptr); } - /* opers must be done first */ helpfile_dir = opendir(HPATH); if(helpfile_dir == NULL) @@ -193,7 +195,7 @@ load_help(void) { ircsnprintf(filename, sizeof(filename), "%s/%s", HPATH, ldirent->d_name); cacheptr = cache_file(filename, ldirent->d_name, HELP_OPER); - irc_dictionary_add(help_dict, cacheptr->name, cacheptr); + irc_dictionary_add(help_dict_oper, cacheptr->name, cacheptr); } closedir(helpfile_dir); @@ -206,27 +208,8 @@ load_help(void) { ircsnprintf(filename, sizeof(filename), "%s/%s", UHPATH, ldirent->d_name); -#if defined(S_ISLNK) && defined(HAVE_LSTAT) - if(lstat(filename, &sb) < 0) - continue; - - /* ok, if its a symlink, we work on the presumption if an - * oper help exists of that name, its a symlink to that --fl - */ - if(S_ISLNK(sb.st_mode)) - { - cacheptr = irc_dictionary_retrieve(help_dict, ldirent->d_name); - - if(cacheptr != NULL && cacheptr->flags & HELP_OPER) /* is this really needed? --nenolod */ - { - cacheptr->flags |= HELP_USER; - continue; - } - } -#endif - cacheptr = cache_file(filename, ldirent->d_name, HELP_USER); - irc_dictionary_add(help_dict, cacheptr->name, cacheptr); + irc_dictionary_add(help_dict_user, cacheptr->name, cacheptr); } closedir(helpfile_dir);