]>
jfr.im git - irc/quakenet/newserv.git/blob - splitlist/splitlist_commands.c
868feca3f3fccab267584472c181c74b582704b8
1 /* oper commands for the splitlist */
6 #include "../lib/irc_string.h"
7 #include "../irc/irc.h"
8 #include "../irc/irc_config.h"
9 #include "../splitlist/splitlist.h"
10 #include "../serverlist/serverlist.h"
11 #include "../control/control.h"
12 #include "../lib/version.h"
13 #include "../lib/flags.h"
17 int spcmd_splitlist(void *source
, int cargc
, char **cargv
);
18 int spcmd_splitdel(void *source
, int cargc
, char **cargv
);
19 int spcmd_splitadd(void *source
, int cargc
, char **cargv
);
22 registercontrolhelpcmd("splitlist", NO_STAFF
, 0, &spcmd_splitlist
, "Usage: splitlist\nLists servers currently split from the network.");
23 registercontrolcmd("splitdel", 10, 1, &spcmd_splitdel
);
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"
28 " +c: Client server\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.");
39 deregistercontrolcmd("splitlist", &spcmd_splitlist
);
40 deregistercontrolcmd("splitdel", &spcmd_splitdel
);
41 deregistercontrolcmd("splitadd", &spcmd_splitadd
);
44 /* todo: add RELINK status */
45 int spcmd_splitlist(void *source
, int cargc
, char **cargv
) {
46 nick
*np
= (nick
*)source
;
50 if (splitlist
.cursi
== 0) {
51 controlreply(np
, "There currently aren't any registered splits.");
56 controlreply(np
, "Server Status Split for");
58 for (i
= 0; i
< splitlist
.cursi
; i
++) {
59 srv
= ((splitserver
*)splitlist
.content
)[i
];
61 controlreply(np
, "%s M.I.A. %s (%s)", srv
.name
->content
, longtoduration(getnettime() - srv
.ts
, 1), printflags(srv
.type
, servertypeflags
));
64 controlreply(np
, "--- End of splitlist");
69 int spcmd_splitdel(void *source
, int cargc
, char **cargv
) {
70 nick
*np
= (nick
*)source
;
75 controlreply(np
, "Syntax: splitdel <pattern>");
82 for (i
= splitlist
.cursi
- 1; i
>= 0; i
--) {
83 srv
= ((splitserver
*)splitlist
.content
)[i
];
85 if (match2strings(cargv
[0], srv
.name
->content
)) {
86 sp_deletesplit(srv
.name
->content
); /* inefficient .. but it doesn't matter */
92 controlwall(NO_OPERED
, NL_MISC
, "%s/%s used SPLITDEL on %s", np
->nick
, np
->authname
, cargv
[0]);
93 controlreply(np
, "%d %s deleted.", count
, count
!= 1 ? "splits" : "split");
98 static int doessplitalreadyexist(const char *servername
) {
102 for (i
= 0; i
< splitlist
.cursi
; i
++) {
103 srv
= ((splitserver
*)splitlist
.content
)[i
];
105 if (!strcasecmp(srv
.name
->content
, servername
))
112 int spcmd_splitadd(void *source
, int cargc
, char **cargv
) {
113 nick
*np
= (nick
*)source
;
114 unsigned long long num
;
116 flag_t servertype
= 0;
118 size_t servernamelen
;
123 controlreply(np
, "Usage: splitadd <servername> [+flags] [split time as unix timestamp]");
127 servername
= cargv
[0];
128 servernamelen
= strlen(servername
);
130 if (findserver(servername
) != -1) {
131 controlreply(np
, "Server %s is linked right now, refusing to add split.",
136 if (doessplitalreadyexist(servername
)) {
137 controlreply(np
, "There is a split for %s already.", servername
);
141 if (servernamelen
> SERVERLEN
) {
142 controlreply(np
, "Server name %s is too long (max: %d characters)",
143 servername
, SERVERLEN
);
149 if (setflags(&servertype
, (flag_t
)-1, cargv
[1], servertypeflags
,
150 REJECT_UNKNOWN
) != REJECT_NONE
) {
151 controlreply(np
, "Flag string %s contained invalid flags.", cargv
[1]);
155 /* Set up a fake server for getservertype. */
156 memset(&fake
, 0, sizeof(fake
));
158 fake
.name
= getsstring(servername
, servernamelen
);
159 servertype
= getservertype(&fake
);
160 freesstring(fake
.name
);
163 /* Handle timestamp */
165 splittime
= getnettime();
168 num
= strtoull(cargv
[2], &end
, 10);
169 if (errno
== ERANGE
) {
170 controlreply(np
, "%s is out of range for a timestamp.", cargv
[2]);
174 /* Truncation may happen here.
175 * However, there's no way to get the max time_t value, so we'll just try to
176 * find out after the fact.
178 splittime
= (time_t)num
;
180 if ((unsigned long long)splittime
< num
) {
181 controlreply(np
, "Tried to use %llu as split time value, but it's too "
182 "large for the system to handle", num
);
187 sp_addsplit(servername
, splittime
, servertype
);
188 controlreply(np
, "Added split for %s (%s ago) with flags %s.",
189 servername
, longtoduration(getnettime() - splittime
, 1),
190 printflags(servertype
, servertypeflags
));