]> jfr.im git - irc/quakenet/newserv.git/blame - trusts/trusts.c
TRUSTS: add whois handler to display basic trustgroup/host information in whois output
[irc/quakenet/newserv.git] / trusts / trusts.c
CommitLineData
2d4ba67d 1#include <stdio.h>
2129448c 2#include <string.h>
c4610da5 3#include "../lib/version.h"
1bbe1ac3
CP
4#include "../core/hooks.h"
5#include "../core/error.h"
45989eab 6#include "../core/nsmalloc.h"
82a316e7 7#include "../server/server.h"
1bbe1ac3 8#include "trusts.h"
2b6e02e2 9
c4610da5
GB
10MODULE_VERSION("");
11
1bbe1ac3
CP
12void trusts_registerevents(void);
13void trusts_deregisterevents(void);
14
2d4ba67d 15static void statusfn(int, void *);
1d08cad3 16static void whoisfn(int, void *);
2b6e02e2 17
2129448c 18static sstring *tgextnames[MAXTGEXTS];
1bbe1ac3
CP
19
20int trusts_thext, trusts_nextuserext;
b9c52ee0 21int trustsdbloaded;
1bbe1ac3 22
2b6e02e2 23void _init(void) {
1bbe1ac3
CP
24 trusts_thext = registernickext("trustth");
25 if(trusts_thext == -1) {
26 Error("trusts", ERR_ERROR, "Unable to register first nick extension.");
27 return;
28 }
29
30 trusts_nextuserext = registernickext("trustnext");
31 if(trusts_thext == -1) {
32 releasenickext(trusts_thext);
33 Error("trusts", ERR_ERROR, "Unable to register second nick extension.");
34 return;
35 }
36
2d4ba67d 37 registerhook(HOOK_CORE_STATSREQUEST, statusfn);
1d08cad3 38 registerhook(HOOK_CONTROL_WHOISREQUEST, &whoisfn);
1bbe1ac3 39 trusts_registerevents();
2b6e02e2
CP
40}
41
83bccee3 42void _fini(void) {
1bbe1ac3
CP
43 if(trusts_thext != -1) {
44 releasenickext(trusts_thext);
45 releasenickext(trusts_nextuserext);
46 }
47
b9c52ee0 48 deregisterhook(HOOK_CORE_STATSREQUEST, statusfn);
1d08cad3 49 deregisterhook(HOOK_CONTROL_WHOISREQUEST, &whoisfn);
b9c52ee0 50 trusts_deregisterevents();
2d4ba67d 51
45989eab 52 nscheckfreeall(POOL_TRUSTS);
45e8ce62
CP
53}
54
1d08cad3
P
55static void whoisfn(int hooknum, void *arg) {
56 trusthost *th;
57 char message[512];
58 nick *np = (nick *)arg;
59
60 if(!np)
61 return;
62
63 th = gettrusthost(np);
64
65 if(!th)
66 return;
67
68 snprintf(message, sizeof(message), "Trustgroup: %s (#%d)", th->group->name->content, th->group->id);
69 triggerhook(HOOK_CONTROL_WHOISREPLY, message);
70 if(th->group->trustedfor>0) {
71 snprintf(message, sizeof(message), "Trustgroup: Usage: %d/%d", th->group->count, th->group->trustedfor);
72 triggerhook(HOOK_CONTROL_WHOISREPLY, message);
73 }
74 if(th->maxpernode>0) {
75 snprintf(message, sizeof(message), "Trusthost : %s", CIDRtostr(np->p_ipaddr, th->nodebits));
76 triggerhook(HOOK_CONTROL_WHOISREPLY, message);
77
78 patricia_node_t *node;
79 int usercount = 0;
80
81 node = refnode(iptree, &(np->p_ipaddr), th->nodebits);
82 usercount = node->usercount;
83 derefnode(iptree, node);
84
85 snprintf(message, sizeof(message), "Trusthost : Usage: %d/%d", usercount, th->maxpernode);
86 triggerhook(HOOK_CONTROL_WHOISREPLY, message);
87 } else {
88 snprintf(message, sizeof(message), "Trusthost : %s", CIDRtostr(th->ip, th->bits));
89 triggerhook(HOOK_CONTROL_WHOISREPLY, message);
90 }
91}
92
2d4ba67d
CP
93static void statusfn(int hooknum, void *arg) {
94 if((long)arg > 10) {
95 char message[100];
bf5b66e5 96 int groupcount = 0, hostcount = 0, usercount = 0;
2d4ba67d
CP
97 trustgroup *tg;
98 trusthost *th;
99
100 for(tg=tglist;tg;tg=tg->next) {
bf5b66e5 101 usercount+=tg->count;
2d4ba67d
CP
102 groupcount++;
103 for(th=tg->hosts;th;th=th->next)
104 hostcount++;
105 }
106
bf5b66e5 107 snprintf(message, sizeof(message), "Trusts :%7d groups, %7d hosts, %7d users", groupcount, hostcount, usercount);
2d4ba67d
CP
108 triggerhook(HOOK_CORE_STATSREPLY, message);
109 }
2b6e02e2 110}
2129448c
CP
111
112int findtgext(const char *name) {
113 int i;
114
115 for(i=0;i<MAXTGEXTS;i++)
116 if(tgextnames[i] && !strcmp(name, tgextnames[i]->content))
117 return i;
118
119 return -1;
120}
121
122int registertgext(const char *name) {
123 int i;
124
125 if(findtgext(name) != -1) {
126 Error("trusts", ERR_WARNING, "Tried to register duplicate trust group extension: %s.", name);
127 return -1;
128 }
129
130 for(i=0;i<MAXNICKEXTS;i++) {
131 if(!tgextnames[i]) {
132 tgextnames[i] = getsstring(name, 100);
133 return i;
134 }
135 }
136
137 Error("trusts", ERR_WARNING, "Tried to register too many trust group extensions: %s.", name);
138 return -1;
139}
140
141void releasetgext(int index) {
142 trustgroup *tg;
143
144 freesstring(tgextnames[index]);
145 tgextnames[index] = NULL;
146
147 for(tg=tglist;tg;tg=tg->next)
148 tg->exts[index] = NULL;
149}
82a316e7
CP
150
151int trusts_fullyonline(void) {
152 if(myhub == -1)
153 return 0;
154
155 return serverlist[myhub].linkstate == LS_LINKED;
156}
157