X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/1d3e262e402f90a96530ab33ad5eaf3582c9e67e..90a3c35b295b07ebe3793bf5d3b882c3c1a5dc7c:/src/cache.c diff --git a/src/cache.c b/src/cache.c index 0a23ebb..3db464e 100644 --- a/src/cache.c +++ b/src/cache.c @@ -36,23 +36,23 @@ #include "ircd_defs.h" #include "common.h" #include "s_conf.h" -#include "tools.h" #include "client.h" -#include "memory.h" -#include "balloc.h" -#include "event.h" #include "hash.h" #include "cache.h" #include "sprintf_irc.h" +#include "irc_dictionary.h" +#include "numeric.h" static BlockHeap *cachefile_heap = NULL; static BlockHeap *cacheline_heap = NULL; struct cachefile *user_motd = NULL; struct cachefile *oper_motd = NULL; -dlink_list links_cache_list; char user_motd_changed[MAX_DATE_STRING]; +struct Dictionary *help_dict_oper = NULL; +struct Dictionary *help_dict_user = NULL; + /* init_cache() * * inputs - @@ -69,7 +69,9 @@ init_cache(void) user_motd = cache_file(MPATH, "ircd.motd", 0); oper_motd = cache_file(OPATH, "opers.motd", 0); - memset(&links_cache_list, 0, sizeof(links_cache_list)); + + help_dict_oper = irc_dictionary_create(strcasecmp); + help_dict_user = irc_dictionary_create(strcasecmp); } /* cache_file() @@ -101,7 +103,7 @@ cache_file(const char *filename, const char *shortname, int flags) local_tm = localtime(&sb.st_mtime); if(local_tm != NULL) - ircsnprintf(user_motd_changed, sizeof(user_motd_changed), + rb_snprintf(user_motd_changed, sizeof(user_motd_changed), "%d/%d/%d %d:%d", local_tm->tm_mday, local_tm->tm_mon + 1, 1900 + local_tm->tm_year, local_tm->tm_hour, @@ -124,50 +126,13 @@ cache_file(const char *filename, const char *shortname, int flags) strlcpy(lineptr->data, " ", sizeof(lineptr->data)); else strlcpy(lineptr->data, line, sizeof(lineptr->data)); - dlinkAddTail(lineptr, &lineptr->linenode, &cacheptr->contents); + rb_dlinkAddTail(lineptr, &lineptr->linenode, &cacheptr->contents); } fclose(in); return cacheptr; } -void -cache_links(void *unused) -{ - struct Client *target_p; - dlink_node *ptr; - dlink_node *next_ptr; - char *links_line; - - DLINK_FOREACH_SAFE(ptr, next_ptr, links_cache_list.head) - { - MyFree(ptr->data); - free_dlink_node(ptr); - } - - links_cache_list.head = links_cache_list.tail = NULL; - links_cache_list.length = 0; - - DLINK_FOREACH(ptr, global_serv_list.head) - { - target_p = ptr->data; - - /* skip ourselves (done in /links) and hidden servers */ - if(IsMe(target_p) || - (IsHidden(target_p) && !ConfigServerHide.disable_hidden)) - continue; - - /* if the below is ever modified, change LINKSLINELEN */ - links_line = MyMalloc(LINKSLINELEN); - ircsnprintf(links_line, LINKSLINELEN, "%s %s :1 %s", - target_p->name, me.name, - target_p->info[0] ? target_p->info : - "(Unknown Location)"); - - dlinkAddTailAlloc(links_line, &links_cache_list); - } -} - /* free_cachefile() * * inputs - cachefile to free @@ -177,13 +142,13 @@ cache_links(void *unused) void free_cachefile(struct cachefile *cacheptr) { - dlink_node *ptr; - dlink_node *next_ptr; + rb_dlink_node *ptr; + rb_dlink_node *next_ptr; if(cacheptr == NULL) return; - DLINK_FOREACH_SAFE(ptr, next_ptr, cacheptr->contents.head) + RB_DLINK_FOREACH_SAFE(ptr, next_ptr, cacheptr->contents.head) { BlockHeapFree(cacheline_heap, ptr->data); } @@ -195,7 +160,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) @@ -204,12 +170,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) @@ -217,9 +190,9 @@ load_help(void) while((ldirent = readdir(helpfile_dir)) != NULL) { - ircsnprintf(filename, sizeof(filename), "%s/%s", HPATH, ldirent->d_name); + rb_snprintf(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); @@ -230,29 +203,10 @@ load_help(void) while((ldirent = readdir(helpfile_dir)) != NULL) { - 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 + rb_snprintf(filename, sizeof(filename), "%s/%s", UHPATH, ldirent->d_name); 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); @@ -268,11 +222,11 @@ void send_user_motd(struct Client *source_p) { struct cacheline *lineptr; - dlink_node *ptr; + rb_dlink_node *ptr; const char *myname = get_id(&me, source_p); const char *nick = get_id(source_p, source_p); - if(user_motd == NULL || dlink_list_length(&user_motd->contents) == 0) + if(user_motd == NULL || rb_dlink_list_length(&user_motd->contents) == 0) { sendto_one(source_p, form_str(ERR_NOMOTD), myname, nick); return; @@ -280,7 +234,7 @@ send_user_motd(struct Client *source_p) sendto_one(source_p, form_str(RPL_MOTDSTART), myname, nick, me.name); - DLINK_FOREACH(ptr, user_motd->contents.head) + RB_DLINK_FOREACH(ptr, user_motd->contents.head) { lineptr = ptr->data; sendto_one(source_p, form_str(RPL_MOTD), myname, nick, lineptr->data); @@ -299,15 +253,15 @@ void send_oper_motd(struct Client *source_p) { struct cacheline *lineptr; - dlink_node *ptr; + rb_dlink_node *ptr; - if(oper_motd == NULL || dlink_list_length(&oper_motd->contents) == 0) + if(oper_motd == NULL || rb_dlink_list_length(&oper_motd->contents) == 0) return; sendto_one(source_p, form_str(RPL_OMOTDSTART), me.name, source_p->name); - DLINK_FOREACH(ptr, oper_motd->contents.head) + RB_DLINK_FOREACH(ptr, oper_motd->contents.head) { lineptr = ptr->data; sendto_one(source_p, form_str(RPL_OMOTD),