]> jfr.im git - irc/quakenet/newserv.git/blob - trusts/trusts.c
Convert trusts to nsmalloc.
[irc/quakenet/newserv.git] / trusts / trusts.c
1 #include <stdio.h>
2 #include <string.h>
3 #include "../core/hooks.h"
4 #include "../core/error.h"
5 #include "../core/nsmalloc.h"
6 #include "trusts.h"
7
8 int trusts_loaddb(void);
9 void trusts_closedb(void);
10 void trusts_registerevents(void);
11 void trusts_deregisterevents(void);
12
13 static void statusfn(int, void *);
14
15 static int loaded, unloaded;
16 static sstring *tgextnames[MAXTGEXTS];
17
18 int trusts_thext, trusts_nextuserext;
19
20 void _init(void) {
21 trusts_thext = registernickext("trustth");
22 if(trusts_thext == -1) {
23 Error("trusts", ERR_ERROR, "Unable to register first nick extension.");
24 return;
25 }
26
27 trusts_nextuserext = registernickext("trustnext");
28 if(trusts_thext == -1) {
29 releasenickext(trusts_thext);
30 Error("trusts", ERR_ERROR, "Unable to register second nick extension.");
31 return;
32 }
33
34 if(!trusts_loaddb())
35 return;
36 loaded = 1;
37
38 registerhook(HOOK_CORE_STATSREQUEST, statusfn);
39 trusts_registerevents();
40 }
41
42 void trusts_unload(void) {
43 if(unloaded)
44 return;
45
46 unloaded = 1;
47
48 if(trusts_thext != -1) {
49 releasenickext(trusts_thext);
50 releasenickext(trusts_nextuserext);
51 }
52
53 if(loaded) {
54 deregisterhook(HOOK_CORE_STATSREQUEST, statusfn);
55 trusts_deregisterevents();
56 }
57
58 trusts_closedb();
59 }
60
61 void _fini(void) {
62 trusts_unload();
63 nscheckfreeall(POOL_TRUSTS);
64 }
65
66 static void statusfn(int hooknum, void *arg) {
67 if((long)arg > 10) {
68 char message[100];
69 int groupcount = 0, hostcount = 0, usercount = 0;
70 trustgroup *tg;
71 trusthost *th;
72
73 for(tg=tglist;tg;tg=tg->next) {
74 usercount+=tg->count;
75 groupcount++;
76 for(th=tg->hosts;th;th=th->next)
77 hostcount++;
78 }
79
80 snprintf(message, sizeof(message), "Trusts :%7d groups, %7d hosts, %7d users", groupcount, hostcount, usercount);
81 triggerhook(HOOK_CORE_STATSREPLY, message);
82 }
83 }
84
85 int findtgext(const char *name) {
86 int i;
87
88 for(i=0;i<MAXTGEXTS;i++)
89 if(tgextnames[i] && !strcmp(name, tgextnames[i]->content))
90 return i;
91
92 return -1;
93 }
94
95 int registertgext(const char *name) {
96 int i;
97
98 if(findtgext(name) != -1) {
99 Error("trusts", ERR_WARNING, "Tried to register duplicate trust group extension: %s.", name);
100 return -1;
101 }
102
103 for(i=0;i<MAXNICKEXTS;i++) {
104 if(!tgextnames[i]) {
105 tgextnames[i] = getsstring(name, 100);
106 return i;
107 }
108 }
109
110 Error("trusts", ERR_WARNING, "Tried to register too many trust group extensions: %s.", name);
111 return -1;
112 }
113
114 void releasetgext(int index) {
115 trustgroup *tg;
116
117 freesstring(tgextnames[index]);
118 tgextnames[index] = NULL;
119
120 for(tg=tglist;tg;tg=tg->next)
121 tg->exts[index] = NULL;
122 }