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() {
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();
}
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;