]> jfr.im git - irc/quakenet/newserv.git/blame - trusts/events.c
No longer allow db reloading on the fly.
[irc/quakenet/newserv.git] / trusts / events.c
CommitLineData
1bbe1ac3
CP
1#include "../core/hooks.h"
2#include "trusts.h"
3
1bbe1ac3
CP
4static void __newnick(int hooknum, void *arg) {
5 nick *sender = arg;
6 uint32_t host;
7 trusthost *th;
8
9 host = irc_in_addr_v4_to_int(&sender->p_ipaddr);
10 th = th_getbyhost(host);
11
12 settrusthost(sender, th);
13 if(!th) {
14 setnextbytrust(sender, NULL);
15 return;
16 }
17
18 setnextbytrust(sender, th->users);
19 th->users = sender;
20
21 triggerhook(HOOK_TRUSTS_NEWNICK, sender);
22}
23
24static void __lostnick(int hooknum, void *arg) {
25 nick *sender = arg, *np, *lp;
26 trusthost *th = gettrusthost(sender);
27
28 if(!th)
29 return;
30
31 triggerhook(HOOK_TRUSTS_LOSTNICK, sender);
32
33 /*
34 * we need to erase this nick from the trusthost list
35 * stored in the ->nextbytrust (ext) pointers in each nick
36 */
37
38 for(np=th->users,lp=NULL;np;lp=np,np=nextbytrust(np)) {
39 if(np != sender)
40 continue;
41
42 if(lp) {
43 setnextbytrust(lp, nextbytrust(np));
44 } else {
45 th->users = nextbytrust(np);
46 }
47
48 break;
49 }
50}
51
52static void __counthandler(int hooknum, void *arg) {
53 trusthost *th = gettrusthost((nick *)arg);
54
55 if(hooknum == HOOK_TRUSTS_NEWNICK) {
56 th->count++;
57 th->group->count++;
58 } else {
59 th->count--;
60 th->group->count--;
61 }
62}
63
64static void __dbloaded(int hooknum, void *arg) {
65 int i;
66 nick *np;
67
1bbe1ac3
CP
68 registerhook(HOOK_NICK_NEWNICK, __newnick);
69 registerhook(HOOK_NICK_LOSTNICK, __lostnick);
70
71 registerhook(HOOK_TRUSTS_NEWNICK, __counthandler);
72 registerhook(HOOK_TRUSTS_LOSTNICK, __counthandler);
73
74 /* we could do it by host, but hosts and ips are not bijective :( */
75 for(i=0;i<NICKHASHSIZE;i++)
76 for(np=nicktable[i];np;np=np->next)
77 __newnick(0, np);
78}
79
80void trusts_registerevents(void) {
81 registerhook(HOOK_TRUSTS_DB_LOADED, __dbloaded);
82
83 if(trustsdbloaded)
84 __dbloaded(0, NULL);
85}
86
87void trusts_deregisterevents(void) {
bf5b66e5 88 if(trustsdbloaded) {
1bbe1ac3
CP
89 deregisterhook(HOOK_NICK_NEWNICK, __newnick);
90 deregisterhook(HOOK_NICK_LOSTNICK, __lostnick);
91
92 deregisterhook(HOOK_TRUSTS_NEWNICK, __counthandler);
93 deregisterhook(HOOK_TRUSTS_LOSTNICK, __counthandler);
94 }
95
96 deregisterhook(HOOK_TRUSTS_DB_LOADED, __dbloaded);
97}