]>
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 registercontrolhelpcmd("dumptree", NO_DEVELOPER
, 2, &nc_cmd_dumptree
,
25 "Dumps diaganostic information on the patricia trie structure\n"
26 "Usage: dumptree <ipv4|ipv6|cidr4|cidr6> [int]\n"
27 "Nodes with prefixies Only:\n"
28 "No arguments - default prints: ptr, ip\n"
29 "1: ptr, prefixptr, bitlen, refcount, ip\n"
30 "2: ptr, bit, usercount, ip\n"
31 "3: ptr, leftptr, rightptr, parentptr\n"
32 "4: ptr, ext0, ext1, ext2, ext3, ext4\n"
33 "All Notes (inc no prefixies):\n"
34 "10: ptr, prefixptr, ip\n"
35 "11: ptr, prefixbitlen, refcount,ip\n"
36 "12: ptr, bitlen, usercount, ip\n"
37 "13: ptr, leftptr, rightptr, parentptr\n"
38 "14: ptr, ext0, ext1, ext2, ext3, ext4");
39 registercontrolhelpcmd("nodecount", NO_OPER
, 1, &nc_cmd_nodecount
, "Displays number of users on a given ipv4/6 or cidr4/6");
45 deregistercontrolcmd("dumptree", &nc_cmd_dumptree
);
46 deregistercontrolcmd("nodecount", &nc_cmd_nodecount
);
49 int nc_cmd_dumptree(void *source
, int cargc
, char **cargv
) {
50 nick
*np
=(nick
*)source
;
51 struct irc_in_addr sin
;
53 patricia_node_t
*head
, *node
;
58 controlreply(np
, "Syntax: dumptree <ipv4|ipv6|cidr4|cidr6>");
62 if (ipmask_parse(cargv
[0], &sin
, &bits
) == 0) {
63 controlreply(np
, "Invalid mask.");
68 level
=strtoul(cargv
[1],NULL
,10);
71 head
= refnode(iptree
, &sin
, bits
);
74 PATRICIA_WALK(head
, node
)
78 controlreply(np
,"%p: %s", node
, IPtostr(node
->prefix
->sin
));
81 controlreply(np
,"%p: prefix %p, bit %d, ref_count %d, IP: %s",node
, node
->prefix
,
82 node
->prefix
->bitlen
, node
->prefix
->ref_count
, IPtostr(node
->prefix
->sin
));
85 controlreply(np
,"%p: bit: %d, usercount: %d, IP: %s", node
, node
->bit
, node
->usercount
, IPtostr(node
->prefix
->sin
));
88 controlreply(np
,"%p: L: %p, R: %p P: %p", node
, node
->l
, node
->r
, node
->parent
);
91 controlreply(np
,"%p: 0: %p, 1: %p, 2: %p, 3: %p, 4: %p", node
,
92 node
->exts
[0], node
->exts
[1], node
->exts
[2], node
->exts
[3], node
->exts
[4]);
95 if( i
== 0 ) controlreply(np
,"Invalid Level");
98 controlreply(np
,"too many... aborting...");
104 PATRICIA_WALK_ALL(head
, node
)
108 controlreply(np
,"%p: prefix: %p %s", node
, node
->prefix
, node
->prefix
?IPtostr(node
->prefix
->sin
):"");
112 controlreply(np
,"%p: prefix bit: %d, ref_count %d, IP: %s",node
,
113 node
->prefix
->bitlen
, node
->prefix
->ref_count
, IPtostr(node
->prefix
->sin
));
115 controlreply(np
,"%p: --", node
);
118 controlreply(np
,"%p: bit: %d, usercount: %d, IP: %s", node
, node
->bit
, node
->usercount
, node
->prefix
?IPtostr(node
->prefix
->sin
):"");
121 controlreply(np
,"%p: L: %p, R: %p P: %p", node
, node
->l
, node
->r
, node
->parent
);
124 controlreply(np
,"%p%s 0: %p, 1: %p, 2: %p, 3: %p, 4: %p", node
, node
->prefix
?"-":":",
125 node
->exts
[0], node
->exts
[1], node
->exts
[2], node
->exts
[3], node
->exts
[4]);
128 if ( i
== 0 ) controlreply(np
,"Invalid Level");
131 controlreply(np
,"too many... aborting...");
137 derefnode(iptree
, head
);
141 int nc_cmd_nodecount(void *source
, int cargc
, char **cargv
) {
142 nick
*np
= (nick
*)source
;
143 struct irc_in_addr sin
;
145 patricia_node_t
*head
;
149 controlreply(np
, "Syntax: nodecount <ipv4|ipv6|cidr4|cidr6>");
153 if (ipmask_parse(cargv
[0], &sin
, &bits
) == 0) {
154 controlreply(np
, "Invalid mask.");
159 head
= refnode(iptree
, &sin
, bits
);
161 count
= head
->usercount
;
163 derefnode(iptree
, head
);
165 controlreply(np
, "%d user(s) found.", count
);