#include "../core/nsmalloc.h"
#include "../control/control.h"
#include "../core/schedule.h"
+#include "../lib/version.h"
#include <stdio.h>
#include <string.h>
-#define ALLOCUNIT 100
+MODULE_VERSION("")
-patricianick_t *freepatricianicks;
int pnode_ext;
int pnick_ext;
-int pn_cmd_dumpnodenicks(void *source, int cargc, char **cargv);
+int pn_cmd_nodeuserlist(void *source, int cargc, char **cargv);
void _init() {
nick *np, *nnp;
registerhook(HOOK_NICK_NEWNICK, &pn_hook_newuser);
registerhook(HOOK_NICK_LOSTNICK, &pn_hook_lostuser);
- registercontrolcmd("dumpnodenicks", NO_DEVELOPER, 1, &pn_cmd_dumpnodenicks);
+ registercontrolhelpcmd("nodeuserlist", NO_OPER, 1, &pn_cmd_nodeuserlist, "Usage: nodeuserlist <ipv4|ipv6|cidr4|cidr6>\nLists all users on a given IP address or CIDR range.");
}
void _fini() {
deregisterhook(HOOK_NICK_NEWNICK, &pn_hook_newuser);
deregisterhook(HOOK_NICK_LOSTNICK, &pn_hook_lostuser);
- deregistercontrolcmd("dumpnodenicks", &pn_cmd_dumpnodenicks);
+ deregistercontrolcmd("nodeuserlist", &pn_cmd_nodeuserlist);
}
patricianick_t *getpatricianick() {
- int i;
- patricianick_t *pnp;
-
- if (freepatricianicks==NULL) {
- freepatricianicks=(patricianick_t *)nsmalloc(POOL_PATRICIANICK, ALLOCUNIT*sizeof(patricianick_t));
- for(i=0;i<ALLOCUNIT-1;i++) {
- freepatricianicks[i].identhash[0]=(nick *)&(freepatricianicks[i+1]);
- }
- freepatricianicks[ALLOCUNIT-1].identhash[0]=NULL;
- }
+ patricianick_t *pnp = nsmalloc(POOL_PATRICIANICK, sizeof(patricianick_t));
- pnp=freepatricianicks;
- freepatricianicks=(patricianick_t *)pnp->identhash[0];
+ if (!pnp)
+ return NULL;
memset(pnp, 0, sizeof(patricianick_t));
return pnp;
void addnicktonode(patricia_node_t *node, nick *np) {
unsigned long hash;
+ patricia_ref_prefix(node->prefix);
+
if (!(node->exts[pnode_ext])) {
node->exts[pnode_ext] = getpatricianick();
}
}
void freepatricianick(patricianick_t *pnp) {
- pnp->identhash[0]=(nick *)freepatricianicks;
- freepatricianicks=pnp;
+ nsfree(POOL_PATRICIANICK, pnp);
}
void pn_hook_newuser(int hook, void *arg) {
deletenickfromnode(np->ipnode, np);
}
-int pn_cmd_dumpnodenicks(void *source, int cargc, char **cargv) {
+int pn_cmd_nodeuserlist(void *source, int cargc, char **cargv) {
nick *np=(nick *)source;
struct irc_in_addr sin;
unsigned char bits;
nick *npp;
if (cargc < 1) {
- controlreply(np, "Syntax: dumpnodenicks <ipv4|ipv6|cidr4|cidr6>");
- return CMD_OK;
+ return CMD_USAGE;
}
if (ipmask_parse(cargv[0], &sin, &bits) == 0) {
controlreply(np, "Invalid mask.");
- return CMD_OK;
+ return CMD_ERROR;
}
head = refnode(iptree, &sin, bits);
}
}
PATRICIA_WALK_END;
+ derefnode(iptree, head);
controlreply(np, "Total users on %s: %d", cargv[0], count);
return CMD_OK;