]>
jfr.im git - irc/quakenet/newserv.git/blob - patricia/patricia_commands.c
7 #include "../nick/nick.h"
8 #include "../localuser/localuserchannel.h"
9 #include "../core/hooks.h"
10 #include "../core/schedule.h"
11 #include "../lib/array.h"
12 #include "../lib/base64.h"
13 #include "../lib/irc_string.h"
14 #include "../lib/splitline.h"
15 #include "../control/control.h"
18 int nc_cmd_dumptree(void *source
, int cargc
, char **cargv
);
19 int nc_cmd_nodecount(void *source
, int cargc
, char **cargv
);
22 if (!(dumpip_logfp
= fopen("log/iplist", "w")))
23 Error("dumpip", ERR_ERROR
, "Failed to open log file!");
24 registercontrolcmd("dumptree", 10, 2, &nc_cmd_dumptree
);
25 registercontrolcmd("nodecount", 10, 1, &nc_cmd_nodecount
);
31 deregistercontrolcmd("dumptree", &nc_cmd_dumptree
);
32 deregistercontrolcmd("nodecount", &nc_cmd_nodecount
);
35 int nc_cmd_dumptree(void *source
, int cargc
, char **cargv
) {
36 nick
*np
=(nick
*)source
;
37 struct irc_in_addr sin
;
39 patricia_node_t
*head
, *node
;
44 controlreply(np
, "Syntax: dumptree <ipv4|ipv6|cidr4|cidr6>");
48 if (ipmask_parse(cargv
[0], &sin
, &bits
) == 0) {
49 controlreply(np
, "Invalid mask.");
54 level
=strtoul(cargv
[1],NULL
,10);
57 head
= refnode(iptree
, &sin
, bits
);
60 PATRICIA_WALK(head
, node
)
64 controlreply(np
,"%p: %s", node
, IPtostr(node
->prefix
->sin
));
67 controlreply(np
,"%p: prefix %p, bit %d, ref_count %d, IP: %s",node
, node
->prefix
,
68 node
->prefix
->bitlen
, node
->prefix
->ref_count
, IPtostr(node
->prefix
->sin
));
71 controlreply(np
,"%p: bit: %d, usercount: %d, IP: %s", node
, node
->bit
, node
->usercount
, IPtostr(node
->prefix
->sin
));
74 controlreply(np
,"%p: L: %p, R: %p P: %p", node
, node
->l
, node
->r
, node
->parent
);
77 controlreply(np
,"%p: 0: %p, 1: %p, 2: %p, 3: %p, 4: %p", node
,
78 node
->exts
[0], node
->exts
[1], node
->exts
[2], node
->exts
[3], node
->exts
[4]);
81 if( i
== 0 ) controlreply(np
,"Invalid Level");
84 controlreply(np
,"too many... aborting...");
90 PATRICIA_WALK_ALL(head
, node
)
94 controlreply(np
,"%p: prefix: %p %s", node
, node
->prefix
, node
->prefix
?IPtostr(node
->prefix
->sin
):"");
98 controlreply(np
,"%p: prefix bit: %d, ref_count %d, IP: %s",node
,
99 node
->prefix
->bitlen
, node
->prefix
->ref_count
, IPtostr(node
->prefix
->sin
));
101 controlreply(np
,"%p: --", node
);
104 controlreply(np
,"%p: bit: %d, usercount: %d, IP: %s", node
, node
->bit
, node
->usercount
, node
->prefix
?IPtostr(node
->prefix
->sin
):"");
107 controlreply(np
,"%p: L: %p, R: %p P: %p", node
, node
->l
, node
->r
, node
->parent
);
110 controlreply(np
,"%p%s 0: %p, 1: %p, 2: %p, 3: %p, 4: %p", node
, node
->prefix
?"-":":",
111 node
->exts
[0], node
->exts
[1], node
->exts
[2], node
->exts
[3], node
->exts
[4]);
114 if ( i
== 0 ) controlreply(np
,"Invalid Level");
117 controlreply(np
,"too many... aborting...");
123 derefnode(iptree
, head
);
127 int nc_cmd_nodecount(void *source
, int cargc
, char **cargv
) {
128 nick
*np
= (nick
*)source
;
129 struct irc_in_addr sin
;
131 patricia_node_t
*head
;
135 controlreply(np
, "Syntax: nodecount <ipv4|ipv6|cidr4|cidr6>");
139 if (ipmask_parse(cargv
[0], &sin
, &bits
) == 0) {
140 controlreply(np
, "Invalid mask.");
145 head
= refnode(iptree
, &sin
, bits
);
147 count
= head
->usercount
;
149 derefnode(iptree
, head
);
151 controlreply(np
, "%d user(s) found.", count
);