]>
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"
16 #include "../lib/version.h"
21 int nc_cmd_dumptree(void *source
, int cargc
, char **cargv
);
22 int nc_cmd_nodecount(void *source
, int cargc
, char **cargv
);
25 if (!(dumpip_logfp
= fopen("log/iplist", "w")))
26 Error("dumpip", ERR_ERROR
, "Failed to open log file!");
27 registercontrolhelpcmd("dumptree", NO_DEVELOPER
, 2, &nc_cmd_dumptree
,
28 "Dumps diaganostic information on the patricia trie structure\n"
29 "Usage: dumptree <ipv4|ipv6|cidr4|cidr6> [int]\n"
30 "Nodes with prefixies Only:\n"
31 "No arguments - default prints: ptr, ip\n"
32 "1: ptr, prefixptr, bitlen, refcount, ip\n"
33 "2: ptr, bit, usercount, ip\n"
34 "3: ptr, leftptr, rightptr, parentptr\n"
35 "4: ptr, ext0, ext1, ext2, ext3, ext4\n"
36 "All Notes (inc no prefixies):\n"
37 "10: ptr, prefixptr, ip\n"
38 "11: ptr, prefixbitlen, refcount,ip\n"
39 "12: ptr, bitlen, usercount, ip\n"
40 "13: ptr, leftptr, rightptr, parentptr\n"
41 "14: ptr, ext0, ext1, ext2, ext3, ext4");
42 registercontrolhelpcmd("nodecount", NO_OPER
, 1, &nc_cmd_nodecount
, "Displays number of users on a given ipv4/6 or cidr4/6");
48 deregistercontrolcmd("dumptree", &nc_cmd_dumptree
);
49 deregistercontrolcmd("nodecount", &nc_cmd_nodecount
);
52 int nc_cmd_dumptree(void *source
, int cargc
, char **cargv
) {
53 nick
*np
=(nick
*)source
;
54 struct irc_in_addr sin
;
56 patricia_node_t
*head
, *node
;
61 controlreply(np
, "Syntax: dumptree <ipv4|ipv6|cidr4|cidr6>");
65 if (ipmask_parse(cargv
[0], &sin
, &bits
) == 0) {
66 controlreply(np
, "Invalid mask.");
71 level
=strtoul(cargv
[1],NULL
,10);
74 head
= refnode(iptree
, &sin
, bits
);
77 PATRICIA_WALK(head
, node
)
81 controlreply(np
,"%p: %s", node
, IPtostr(node
->prefix
->sin
));
84 controlreply(np
,"%p: prefix %p, bit %d, ref_count %d, IP: %s",node
, node
->prefix
,
85 node
->prefix
->bitlen
, node
->prefix
->ref_count
, IPtostr(node
->prefix
->sin
));
88 controlreply(np
,"%p: bit: %d, usercount: %d, IP: %s", node
, node
->bit
, node
->usercount
, IPtostr(node
->prefix
->sin
));
91 controlreply(np
,"%p: L: %p, R: %p P: %p", node
, node
->l
, node
->r
, node
->parent
);
94 controlreply(np
,"%p: 0: %p, 1: %p, 2: %p, 3: %p, 4: %p", node
,
95 node
->exts
[0], node
->exts
[1], node
->exts
[2], node
->exts
[3], node
->exts
[4]);
98 if( i
== 0 ) controlreply(np
,"Invalid Level");
101 controlreply(np
,"too many... aborting...");
107 PATRICIA_WALK_ALL(head
, node
)
111 controlreply(np
,"%p: prefix: %p %s", node
, node
->prefix
, node
->prefix
?IPtostr(node
->prefix
->sin
):"");
115 controlreply(np
,"%p: prefix bit: %d, ref_count %d, IP: %s",node
,
116 node
->prefix
->bitlen
, node
->prefix
->ref_count
, IPtostr(node
->prefix
->sin
));
118 controlreply(np
,"%p: --", node
);
121 controlreply(np
,"%p: bit: %d, usercount: %d, IP: %s", node
, node
->bit
, node
->usercount
, node
->prefix
?IPtostr(node
->prefix
->sin
):"");
124 controlreply(np
,"%p: L: %p, R: %p P: %p", node
, node
->l
, node
->r
, node
->parent
);
127 controlreply(np
,"%p%s 0: %p, 1: %p, 2: %p, 3: %p, 4: %p", node
, node
->prefix
?"-":":",
128 node
->exts
[0], node
->exts
[1], node
->exts
[2], node
->exts
[3], node
->exts
[4]);
131 if ( i
== 0 ) controlreply(np
,"Invalid Level");
134 controlreply(np
,"too many... aborting...");
140 derefnode(iptree
, head
);
144 int nc_cmd_nodecount(void *source
, int cargc
, char **cargv
) {
145 nick
*np
= (nick
*)source
;
146 struct irc_in_addr sin
;
148 patricia_node_t
*head
;
152 controlreply(np
, "Syntax: nodecount <ipv4|ipv6|cidr4|cidr6>");
156 if (ipmask_parse(cargv
[0], &sin
, &bits
) == 0) {
157 controlreply(np
, "Invalid mask.");
162 head
= refnode(iptree
, &sin
, bits
);
164 count
= head
->usercount
;
166 derefnode(iptree
, head
);
168 controlreply(np
, "%d user(s) found.", count
);