X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/d40ae8457012497e9cfc529d9b7ae39d6f0f7674..7d54716c7cba385b13aba54348f4c7bca2f2c4a7:/authext/authext.c diff --git a/authext/authext.c b/authext/authext.c index 55570e48..828428fc 100644 --- a/authext/authext.c +++ b/authext/authext.c @@ -5,10 +5,14 @@ #include "../lib/irc_string.h" #include "../nick/nick.h" #include "../core/hooks.h" +#include "../lib/strlfunc.h" +#include "../lib/version.h" #include #include +MODULE_VERSION("") + #define ALLOCUNIT 100 #define authnamehash(x) ((x)%AUTHNAMEHASHSIZE) @@ -20,7 +24,10 @@ authname *authnametable[AUTHNAMEHASHSIZE]; /* internal access only */ static authname *authnametablebyname[AUTHNAMEHASHSIZE]; -sstring *authnameextnames[MAXAUTHNAMEEXTS]; +static struct { + sstring *name; + int persistent; +} authnameexts[MAXAUTHNAMEEXTS]; static void authextstats(int hooknum, void *arg); @@ -59,7 +66,7 @@ void freeauthname (authname *anp) { freeauthnames=anp; } -int registerauthnameext(const char *name) { +int registerauthnameext(const char *name, int persistent) { int i; if (findauthnameext(name)!=-1) { @@ -68,8 +75,9 @@ int registerauthnameext(const char *name) { } for (i=0;icontent)) { + if (authnameexts[i].name!=NULL && !ircd_strcmp(name,authnameexts[i].name->content)) { return i; } } @@ -94,8 +102,8 @@ void releaseauthnameext(int index) { int i; authname *anp; - freesstring(authnameextnames[index]); - authnameextnames[index]=NULL; + freesstring(authnameexts[index].name); + authnameexts[index].name=NULL; for (i=0;inext) { @@ -126,7 +134,7 @@ authname *findauthnamebyname(const char *name) { return NULL; for (anp=authnametablebyname[authnamehashbyname(name)];anp;anp=(authname *)anp->nextbyname) - if (!ircd_strcmp(anp->nicks->authname, name)) + if (!ircd_strcmp(anp->name, name)) return anp; return NULL; @@ -145,8 +153,10 @@ authname *findorcreateauthname(unsigned long userid, const char *name) { anp=newauthname(); anp->userid=userid; + strlcpy(anp->name, name, sizeof(anp->name)); anp->usercount=0; anp->marker=0; + anp->flags=0; anp->nicks=NULL; memset(anp->exts, 0, MAXAUTHNAMEEXTS * sizeof(void *)); anp->next=(struct authname *)authnametable[thehash]; @@ -166,9 +176,10 @@ void releaseauthname(authname *anp) { anp->nicks = NULL; for(i=0;iexts[i]!=NULL) + if(authnameexts[i].persistent && anp->exts[i]!=NULL) return; + triggerhook(HOOK_AUTH_LOSTAUTHNAME, (void *)anp); found = 0; for(manp=&(authnametable[authnamehash(anp->userid)]);*manp;manp=(authname **)&((*manp)->next)) { if ((*manp)==anp) { @@ -219,7 +230,7 @@ authname *getauthbyname(const char *name) { return a; } -static char *genstats(authname **hashtable) { +static char *genstats(authname **hashtable, authname *(nextfn)(authname *)) { int i,curchain,maxchain=0,total=0,buckets=0; authname *ap; static char buf[100]; @@ -228,7 +239,7 @@ static char *genstats(authname **hashtable) { if (hashtable[i]!=NULL) { buckets++; curchain=0; - for (ap=hashtable[i];ap;ap=ap->next) { + for (ap=hashtable[i];ap;ap=nextfn(ap)) { total++; curchain++; } @@ -242,16 +253,24 @@ static char *genstats(authname **hashtable) { return buf; } +static authname *nextbynext(authname *in) { + return in->next; +} + +static authname *nextbyname(authname *in) { + return in->nextbyname; +} + static void authextstats(int hooknum, void *arg) { long level=(long)arg; char buf[100]; if (level>5) { /* Full stats */ - snprintf(buf,sizeof(buf),"Authext : by id: %s", genstats(authnametable)); + snprintf(buf,sizeof(buf),"Authext : by id: %s", genstats(authnametable, nextbynext)); triggerhook(HOOK_CORE_STATSREPLY,buf); - snprintf(buf,sizeof(buf),"Authext : by name: %s", genstats(authnametablebyname)); + snprintf(buf,sizeof(buf),"Authext : by name: %s", genstats(authnametablebyname, nextbyname)); triggerhook(HOOK_CORE_STATSREPLY,buf); } }