]>
Commit | Line | Data |
---|---|---|
c96aa815 P |
1 | /* oper commands for the splitlist */ |
2 | ||
719d21bb P |
3 | #include <errno.h> |
4 | #include <string.h> | |
5 | ||
c96aa815 P |
6 | #include "../lib/irc_string.h" |
7 | #include "../irc/irc.h" | |
719d21bb | 8 | #include "../irc/irc_config.h" |
c96aa815 | 9 | #include "../splitlist/splitlist.h" |
81f6c579 | 10 | #include "../serverlist/serverlist.h" |
c96aa815 | 11 | #include "../control/control.h" |
5857b2db | 12 | #include "../lib/version.h" |
719d21bb | 13 | #include "../lib/flags.h" |
5857b2db P |
14 | |
15 | MODULE_VERSION(""); | |
c96aa815 P |
16 | |
17 | int spcmd_splitlist(void *source, int cargc, char **cargv); | |
18 | int spcmd_splitdel(void *source, int cargc, char **cargv); | |
719d21bb | 19 | int spcmd_splitadd(void *source, int cargc, char **cargv); |
c96aa815 P |
20 | |
21 | void _init(void) { | |
81f6c579 | 22 | registercontrolhelpcmd("splitlist", NO_STAFF, 0, &spcmd_splitlist, "Usage: splitlist\nLists servers currently split from the network."); |
c96aa815 | 23 | registercontrolcmd("splitdel", 10, 1, &spcmd_splitdel); |
719d21bb P |
24 | registercontrolhelpcmd("splitadd", 10, 3, &spcmd_splitadd, |
25 | "Usage: splitadd <servername> [+flags] [split time as unix timestamp]\n" | |
26 | " Adds a server as split from the network.\n" | |
27 | " Flags:\n" | |
28 | " +c: Client server\n" | |
29 | " +h: Hub server\n" | |
30 | " +s: Service\n" | |
31 | " +Q: Q/CServe\n" | |
32 | " +S: S/spamscan\n" | |
33 | " +X: Other critical service\n" | |
34 | " If no flags are given, an attempt to figure them out based on name\n" | |
35 | " will be made, but it's likely not a good one.\n"); | |
c96aa815 P |
36 | } |
37 | ||
38 | void _fini(void) { | |
39 | deregistercontrolcmd("splitlist", &spcmd_splitlist); | |
40 | deregistercontrolcmd("splitdel", &spcmd_splitdel); | |
719d21bb | 41 | deregistercontrolcmd("splitadd", &spcmd_splitadd); |
c96aa815 P |
42 | } |
43 | ||
44 | /* todo: add RELINK status */ | |
45 | int spcmd_splitlist(void *source, int cargc, char **cargv) { | |
46 | nick *np = (nick*)source; | |
47 | int i; | |
48 | splitserver srv; | |
49 | ||
50 | if (splitlist.cursi == 0) { | |
51 | controlreply(np, "There currently aren't any registered splits."); | |
52 | ||
53 | return CMD_OK; | |
54 | } | |
55 | ||
56 | controlreply(np, "Server Status Split for"); | |
57 | ||
58 | for (i = 0; i < splitlist.cursi; i++) { | |
59 | srv = ((splitserver*)splitlist.content)[i]; | |
60 | ||
81f6c579 | 61 | controlreply(np, "%s M.I.A. %s (%s)", srv.name->content, longtoduration(getnettime() - srv.ts, 1), printflags(srv.type, servertypeflags)); |
c96aa815 P |
62 | } |
63 | ||
64 | controlreply(np, "--- End of splitlist"); | |
65 | ||
66 | return CMD_OK; | |
67 | } | |
68 | ||
69 | int spcmd_splitdel(void *source, int cargc, char **cargv) { | |
70 | nick *np = (nick*)source; | |
71 | int i, count; | |
72 | splitserver srv; | |
73 | ||
74 | if (cargc < 1) { | |
75 | controlreply(np, "Syntax: splitdel <pattern>"); | |
76 | ||
77 | return CMD_ERROR; | |
78 | } | |
79 | ||
80 | count = 0; | |
81 | ||
82 | for (i = splitlist.cursi - 1; i >= 0; i--) { | |
83 | srv = ((splitserver*)splitlist.content)[i]; | |
84 | ||
85 | if (match2strings(cargv[0], srv.name->content)) { | |
86 | sp_deletesplit(srv.name->content); /* inefficient .. but it doesn't matter */ | |
87 | count++; | |
88 | } | |
89 | } | |
90 | ||
91 | controlreply(np, "%d %s deleted.", count, count != 1 ? "splits" : "split"); | |
92 | ||
93 | return CMD_OK; | |
94 | } | |
719d21bb P |
95 | |
96 | int spcmd_splitadd(void *source, int cargc, char **cargv) { | |
97 | nick *np = (nick*)source; | |
98 | unsigned long long num; | |
99 | char *end; | |
100 | flag_t servertype = 0; | |
101 | char *servername; | |
102 | size_t servernamelen; | |
103 | time_t splittime; | |
104 | server fake; | |
105 | ||
106 | if (cargc < 1) { | |
107 | controlreply(np, "Usage: splitadd <servername> [+flags] [split time as unix timestamp]"); | |
108 | return CMD_ERROR; | |
109 | } | |
110 | ||
111 | servername = cargv[0]; | |
112 | servernamelen = strlen(servername); | |
113 | ||
114 | if (findserver(servername) != -1) { | |
115 | controlreply(np, "Server %s is linked right now, refusing to add split.", | |
116 | servername); | |
117 | return CMD_ERROR; | |
118 | } | |
119 | ||
120 | if (servernamelen > SERVERLEN) { | |
121 | controlreply(np, "Server name %s is too long (max: %d characters)", | |
122 | servername, SERVERLEN); | |
123 | return CMD_ERROR; | |
124 | } | |
125 | ||
126 | /* Handle flags */ | |
127 | if (cargc > 1) { | |
128 | if (setflags(&servertype, (flag_t)-1, cargv[1], servertypeflags, | |
129 | REJECT_UNKNOWN) != REJECT_NONE) { | |
130 | controlreply(np, "Flag string %s contained invalid flags.\n", cargv[1]); | |
131 | return CMD_ERROR; | |
132 | } | |
133 | } else { | |
134 | /* Set up a fake server for getservertype. */ | |
135 | memset(&fake, 0, sizeof(fake)); | |
136 | ||
137 | fake.name = getsstring(servername, servernamelen); | |
138 | servertype = getservertype(&fake); | |
139 | freesstring(fake.name); | |
140 | } | |
141 | ||
142 | /* Handle timestamp */ | |
143 | if (cargc < 3) { | |
144 | splittime = getnettime(); | |
145 | } else { | |
146 | errno = 0; | |
147 | num = strtoull(cargv[2], &end, 10); | |
148 | if (errno == ERANGE) { | |
149 | controlreply(np, "%s is out of range for a timestamp.\n", cargv[2]); | |
150 | return CMD_ERROR; | |
151 | } | |
152 | ||
153 | /* Truncation may happen here. | |
154 | * However, there's no way to get the max time_t value, so we'll just try to | |
155 | * find out after the fact. | |
156 | */ | |
157 | splittime = (time_t)num; | |
158 | ||
159 | if ((unsigned long long)splittime < num) { | |
160 | controlreply(np, "Tried to use %llu as split time value, but it's too " | |
161 | "large for the system to handle", num); | |
162 | return CMD_ERROR; | |
163 | } | |
164 | } | |
165 | ||
166 | sp_addsplit(servername, splittime, servertype); | |
167 | controlreply(np, "Added split for %s (%s ago) with flags %s.", | |
168 | servername, longtoduration(getnettime() - splittime, 1), | |
169 | printflags(servertype, servertypeflags)); | |
170 | ||
171 | return CMD_OK; | |
172 | } |