From 5a34b193e620cdd8141b79197c37717cdda0a48e 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 64fb30c..814a040 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 24c562f..544b54a 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 2ca0bbf..a7cdb86 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);