X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/1a96a370b0727c695adf77a4257bcf6d9a4c81c7..3e1b768066a16c4b899b9cbdd7911be883151a05:/authext/authext.c diff --git a/authext/authext.c b/authext/authext.c index 2451a622..7606832d 100644 --- a/authext/authext.c +++ b/authext/authext.c @@ -6,27 +6,33 @@ #include "../nick/nick.h" #include "../core/hooks.h" #include "../lib/strlfunc.h" +#include "../lib/version.h" +#include "../lib/ccassert.h" #include #include -#define ALLOCUNIT 100 +MODULE_VERSION("") + +/* checking to see that u_int64_t == unsigned long long for strtoull */ +CCASSERT(sizeof(unsigned long long) == sizeof(u_int64_t)) #define authnamehash(x) ((x)%AUTHNAMEHASHSIZE) -#define authnamehashbyname(x) (crc32i(x)%AUTHNAMEHASHSIZE) +#define authnamehashbyname(x) (irc_crc32i(x)%AUTHNAMEHASHSIZE) -authname *freeauthnames; 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); void _init(void) { - freeauthnames=NULL; memset(authnametable,0,sizeof(authnametable)); memset(authnametablebyname,0,sizeof(authnametablebyname)); registerhook(HOOK_CORE_STATSREQUEST, &authextstats); @@ -38,29 +44,14 @@ void _fini(void) { } authname *newauthname(void) { - authname *anp; - int i; - - if (freeauthnames==NULL) { - freeauthnames=(authname *)nsmalloc(POOL_AUTHEXT, ALLOCUNIT*sizeof(authname)); - for (i=0;i<(ALLOCUNIT-1);i++) { - freeauthnames[i].next=&(freeauthnames[i+1]); - } - freeauthnames[ALLOCUNIT-1].next=NULL; - } - - anp=freeauthnames; - freeauthnames=anp->next; - - return anp; + return nsmalloc(POOL_AUTHEXT, sizeof(authname)); } void freeauthname (authname *anp) { - anp->next=freeauthnames; - freeauthnames=anp; + nsfree(POOL_AUTHEXT, anp); } -int registerauthnameext(const char *name) { +int registerauthnameext(const char *name, int persistent) { int i; if (findauthnameext(name)!=-1) { @@ -69,8 +60,9 @@ int registerauthnameext(const char *name) { } for (i=0;icontent)) { + if (authnameexts[i].name!=NULL && !ircd_strcmp(name,authnameexts[i].name->content)) { return i; } } @@ -95,8 +87,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) { @@ -169,9 +161,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) {