X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/4fa7d79d61ebd81f53d2db80809746f034d04162..cb5aa4cdd6af4114b18db464f022ef99a44304d7:/nick/nick.c?ds=sidebyside diff --git a/nick/nick.c b/nick/nick.c index 2b949d97..679f0554 100644 --- a/nick/nick.c +++ b/nick/nick.c @@ -12,6 +12,8 @@ #include "../server/server.h" #include "../parser/parser.h" #include "../lib/version.h" +#include "../core/nsmalloc.h" + #include #include #include @@ -32,6 +34,12 @@ const flag umodeflags[] = { { 'h', UMODE_SETHOST }, { 'R', UMODE_REGPRIV }, { 'I', UMODE_HIDEIDLE }, + { 'P', UMODE_PARANOID }, + { '\0', 0 } }; + +const flag accountflags[] = { + { 's', AFLAG_STAFF }, + { 'd', AFLAG_DEVELOPER }, { '\0', 0 } }; #define nickhash(x) ((crc32i(x))%NICKHASHSIZE) @@ -40,13 +48,18 @@ nick *nicktable[NICKHASHSIZE]; nick **servernicks[MAXSERVERS]; sstring *nickextnames[MAXNICKEXTS]; -sstring *nodeextnames[PATRICIA_MAXSLOTS]; -patricia_tree_t *iptree; -sstring *authnameextnames[MAXAUTHNAMEEXTS]; void nickstats(int hooknum, void *arg); void _init() { + unsigned int i; + authname *anp; + + /* Clear up the nicks in authext */ + for (i=0;inext) + anp->nicks=NULL; + initnickalloc(); initnickhelpers(); memset(nicktable,0,sizeof(nicktable)); @@ -68,8 +81,36 @@ void _init() { /* Fake the addition of our own server */ handleserverchange(HOOK_SERVER_NEWSERVER,(void *)numerictolong(mynumeric->content,2)); +} + +void _fini() { + nick *np; + int i; - iptree = patricia_new_tree(PATRICIA_MAXBITS); + fininickhelpers(); + + for (i=0;inext) { + freesstring(np->shident); + freesstring(np->sethost); + } + } + + nsfreeall(POOL_NICK); + + /* Free the hooks */ + deregisterhook(HOOK_SERVER_NEWSERVER,&handleserverchange); + deregisterhook(HOOK_SERVER_LOSTSERVER,&handleserverchange); + deregisterhook(HOOK_CORE_STATSREQUEST,&nickstats); + + /* And our server handlers */ + deregisterserverhandler("N",&handlenickmsg); + deregisterserverhandler("D",&handlekillmsg); + deregisterserverhandler("Q",&handlequitmsg); + deregisterserverhandler("M",&handleusermodemsg); + deregisterserverhandler("W",&handlewhoismsg); + deregisterserverhandler("AC",&handleaccountmsg); + deregisterserverhandler("R",&handlestatsmsg); } /* @@ -86,7 +127,7 @@ void handleserverchange(int hooknum, void *arg) { switch(hooknum) { case HOOK_SERVER_NEWSERVER: - servernicks[servernum]=(nick **)malloc((serverlist[servernum].maxusernum+1)*sizeof(nick **)); + servernicks[servernum]=(nick **)nsmalloc(POOL_NICK,(serverlist[servernum].maxusernum+1)*sizeof(nick **)); memset(servernicks[servernum],0,(serverlist[servernum].maxusernum+1)*sizeof(nick **)); break; @@ -96,7 +137,7 @@ void handleserverchange(int hooknum, void *arg) { deletenick(servernicks[servernum][i]); } } - free(servernicks[servernum]); + nsfree(POOL_NICK,servernicks[servernum]); break; } } @@ -149,6 +190,7 @@ void deletenick(nick *np) { freesstring(np->shident); /* freesstring(NULL) is OK */ freesstring(np->sethost); + np->ipnode->usercount--; derefnode(iptree, np->ipnode); /* TODO: figure out how to cleanly remove nodes without affecting other modules */ @@ -267,56 +309,24 @@ void releasenickext(int index) { } } -int registerauthnameext(const char *name) { - int i; - - if (findauthnameext(name)!=-1) { - Error("nick",ERR_WARNING,"Tried to register duplicate authname extension %s",name); - return -1; - } - - for (i=0;icontent)) { - return i; - } - } +char *visiblehostmask(nick *np, char *buf) { + char uhbuf[USERLEN+HOSTLEN+2]; - return -1; -} + visibleuserhost(np, uhbuf); + sprintf(buf,"%s!%s",np->nick,uhbuf); -void releaseauthnameext(int index) { - int i; - authname *anp; - - freesstring(authnameextnames[index]); - authnameextnames[index]=NULL; - - for (i=0;inext) { - anp->exts[index]=NULL; - } - } + return buf; } -/* visiblehostmask - * Produces the "apparent" hostmask as seen by network users. +/* visibleuserhost + * As above without nick */ -char *visiblehostmask(nick *np, char *buf) { +char *visibleuserhost(nick *np, char *buf) { char hostbuf[HOSTLEN+1]; char *ident, *host; @@ -335,7 +345,7 @@ char *visiblehostmask(nick *np, char *buf) { host=hostbuf; } - sprintf(buf,"%s!%s@%s",np->nick,ident,host); + sprintf(buf,"%s@%s",ident,host); return buf; } @@ -395,47 +405,3 @@ nick *getnickbynumericstr(char *numericstr) { #endif -int registernodeext(const char *name) { - int i; - - if (findnodeext(name)!=-1) { - Error("nick",ERR_WARNING,"Tried to register duplicate node extension %s",name); - return -1; - } - - for (i=0;icontent)) { - return i; - } - } - - return -1; -} - -void releasenodeext(int index) { - patricia_node_t *head, *node; - - freesstring(nodeextnames[index]); - nodeextnames[index]=NULL; - - head = iptree->head; - - PATRICIA_WALK_ALL(head, node) - { - node->slots[index]=NULL; - } PATRICIA_WALK_END; -}