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