]> jfr.im git - irc/quakenet/newserv.git/blame_incremental - splitlist/splitlist.c
GLINES: fix null pointer deref in trustgline / trustungline
[irc/quakenet/newserv.git] / splitlist / splitlist.c
... / ...
CommitLineData
1/* shroud's splitlist */
2
3#include <string.h>
4#include "../irc/irc.h"
5#include "splitlist.h"
6#include "../core/hooks.h"
7#include "../lib/version.h"
8
9MODULE_VERSION("");
10
11array splitlist;
12
13static void sphook_newserver(int hook, void *arg);
14static void sphook_lostserver(int hook, void *arg);
15
16void _init(void) {
17 registerhook(HOOK_SERVER_NEWSERVER, &sphook_newserver);
18 registerhook(HOOK_SERVER_LOSTSERVER, &sphook_lostserver);
19
20 array_init(&splitlist, sizeof(splitserver));
21 array_setlim1(&splitlist, 5);
22 array_setlim2(&splitlist, 5);
23
24 sp_addsplit("default.split.quakenet.org", getnettime(), SERVERTYPEFLAG_CRITICAL_SERVICE | SERVERTYPEFLAG_SERVICE);
25}
26
27void _fini(void) {
28 int i;
29
30 deregisterhook(HOOK_SERVER_NEWSERVER, &sphook_newserver);
31 deregisterhook(HOOK_SERVER_LOSTSERVER, &sphook_lostserver);
32
33 for (i = 0; i < splitlist.cursi; i++) {
34 freesstring(((splitserver*)splitlist.content)[i].name);
35 }
36
37 array_free(&splitlist);
38}
39
40static void sphook_newserver(int hook, void *arg) {
41 sp_deletesplit(serverlist[(long)arg].name->content);
42}
43
44static void sphook_lostserver(int hook, void *arg) {
45 server *server = &serverlist[(long)arg];
46 sp_addsplit(server->name->content, getnettime(), getservertype(server));
47}
48
49int sp_countsplitservers(flag_t orflags) {
50 int result = 0;
51 int i;
52
53 for (i = 0; i < splitlist.cursi; i++)
54 if((((splitserver*)splitlist.content)[i].type | orflags) != 0)
55 result++;
56
57 return result;
58}
59
60void sp_deletesplit(const char *name) {
61 int i;
62
63 if (splitlist.cursi == 0)
64 return;
65
66 for (i = splitlist.cursi - 1; i >= 0; i--) {
67 if (strcmp(name, ((splitserver*)splitlist.content)[i].name->content) == 0) {
68 freesstring(((splitserver*)splitlist.content)[i].name);
69 array_delslot(&splitlist, i);
70 }
71 }
72}
73
74void sp_addsplit(const char *name, time_t ts, flag_t type) {
75 int slot;
76 splitserver *srv;
77
78 slot = array_getfreeslot(&splitlist);
79
80 srv = &(((splitserver*)splitlist.content)[slot]);
81
82 srv->name = getsstring(name, HOSTLEN);
83 srv->ts = ts;
84 srv->type = type;
85}