X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/c98390004f4f14cd8215302d77313f81e2546e22..31c047d725da786852b5bbdb805b94e9ef0bc2c8:/src/cache.c diff --git a/src/cache.c b/src/cache.c index c55364a..a7cdb86 100644 --- a/src/cache.c +++ b/src/cache.c @@ -44,6 +44,7 @@ #include "hash.h" #include "cache.h" #include "sprintf_irc.h" +#include "irc_dictionary.h" static BlockHeap *cachefile_heap = NULL; static BlockHeap *cacheline_heap = NULL; @@ -52,6 +53,9 @@ struct cachefile *user_motd = NULL; struct cachefile *oper_motd = NULL; char user_motd_changed[MAX_DATE_STRING]; +struct Dictionary *help_dict_oper = NULL; +struct Dictionary *help_dict_user = NULL; + /* init_cache() * * inputs - @@ -68,6 +72,9 @@ init_cache(void) user_motd = cache_file(MPATH, "ircd.motd", 0); oper_motd = cache_file(OPATH, "opers.motd", 0); + + help_dict_oper = irc_dictionary_create(strcasecmp); + help_dict_user = irc_dictionary_create(strcasecmp); } /* cache_file() @@ -156,7 +163,8 @@ free_cachefile(struct cachefile *cacheptr) * * inputs - * outputs - - * side effects - contents of help directories are loaded. + * side effects - old help cache deleted + * - contents of help directories are loaded. */ void load_help(void) @@ -165,12 +173,19 @@ load_help(void) struct dirent *ldirent= NULL; char filename[MAXPATHLEN]; struct cachefile *cacheptr; + struct DictionaryIter iter; -#if defined(S_ISLNK) && defined(HAVE_LSTAT) - struct stat sb; -#endif + DICTIONARY_FOREACH(cacheptr, &iter, help_dict_oper) + { + 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) @@ -180,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); - add_to_help_hash(cacheptr->name, cacheptr); + irc_dictionary_add(help_dict_oper, cacheptr->name, cacheptr); } closedir(helpfile_dir); @@ -193,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 = hash_find_help(ldirent->d_name, HELP_OPER); - - if(cacheptr != NULL) - { - cacheptr->flags |= HELP_USER; - continue; - } - } -#endif - cacheptr = cache_file(filename, ldirent->d_name, HELP_USER); - add_to_help_hash(cacheptr->name, cacheptr); + irc_dictionary_add(help_dict_user, cacheptr->name, cacheptr); } closedir(helpfile_dir);