Add feature SPLIT
Add split.c split.h m_split.c
-diff -r 2da61ac38fa1 include/handlers.h
---- a/include/handlers.h Sun Jan 18 14:18:36 2009 +0100
-+++ b/include/handlers.h Sun Jan 18 15:26:56 2009 +0100
+NOTE: feature SPLIT is default enabled as that is just easier when working on this patch.
+
+diff -r bc3532fbd97a include/handlers.h
+--- a/include/handlers.h Tue Jan 20 17:24:09 2009 +0100
++++ b/include/handlers.h Tue Jan 20 17:25:52 2009 +0100
@@ -139,6 +139,7 @@
extern int m_registered(struct Client*, struct Client*, int, char*[]);
extern int m_sethost(struct Client*, struct Client*, int, char*[]);
extern int ms_squit(struct Client*, struct Client*, int, char*[]);
extern int ms_stats(struct Client*, struct Client*, int, char*[]);
extern int ms_topic(struct Client*, struct Client*, int, char*[]);
-diff -r 2da61ac38fa1 include/ircd_features.h
---- a/include/ircd_features.h Sun Jan 18 14:18:36 2009 +0100
-+++ b/include/ircd_features.h Sun Jan 18 15:26:56 2009 +0100
-@@ -109,6 +109,7 @@
- FEAT_SETHOST,
+diff -r bc3532fbd97a include/ircd_features.h
+--- a/include/ircd_features.h Tue Jan 20 17:24:09 2009 +0100
++++ b/include/ircd_features.h Tue Jan 20 17:25:52 2009 +0100
+@@ -110,6 +110,10 @@
FEAT_SETHOST_USER,
FEAT_SETHOST_AUTO,
-+ FEAT_SPLIT,
++ /* SPLIT */
++ FEAT_SPLIT,
++ FEAT_SPLIT_AUTO_EXPIRE,
++
/* HEAD_IN_SAND Features */
FEAT_HIS_SNOTICES,
-@@ -137,6 +138,7 @@
+ FEAT_HIS_SNOTICES_OPER_ONLY,
+@@ -137,6 +141,7 @@
FEAT_HIS_STATS_q,
FEAT_HIS_STATS_R,
FEAT_HIS_STATS_r,
FEAT_HIS_STATS_s,
FEAT_HIS_STATS_t,
FEAT_HIS_STATS_T,
-diff -r 2da61ac38fa1 include/msg.h
---- a/include/msg.h Sun Jan 18 14:18:36 2009 +0100
-+++ b/include/msg.h Sun Jan 18 15:26:56 2009 +0100
+diff -r bc3532fbd97a include/msg.h
+--- a/include/msg.h Tue Jan 20 17:24:09 2009 +0100
++++ b/include/msg.h Tue Jan 20 17:25:53 2009 +0100
@@ -332,6 +332,10 @@
#define TOK_JUPE "JU"
#define CMD_JUPE MSG_JUPE, TOK_JUPE
#define MSG_OPMODE "OPMODE" /* OPMO */
#define TOK_OPMODE "OM"
#define CMD_OPMODE MSG_OPMODE, TOK_OPMODE
-diff -r 2da61ac38fa1 include/numeric.h
---- a/include/numeric.h Sun Jan 18 14:18:36 2009 +0100
-+++ b/include/numeric.h Sun Jan 18 15:26:56 2009 +0100
+diff -r bc3532fbd97a include/numeric.h
+--- a/include/numeric.h Tue Jan 20 17:24:09 2009 +0100
++++ b/include/numeric.h Tue Jan 20 17:25:53 2009 +0100
@@ -117,6 +117,7 @@
RPL_STATSVLINE 227 unreal */
#define RPL_STATSALINE 226 /* Hybrid, Undernet */
#define RPL_STATSQLINE 228 /* Undernet extension */
+#define RPL_STATSSPLIT 229 /* QuakeNet extension */
+ #define RPL_STATSHEADER 230 /* QuakeNet extension */
/* RPL_SERVICEINFO 231 unused */
- /* RPL_ENDOFSERVICES 232 unused */
-@@ -177,6 +178,8 @@
+@@ -178,6 +179,8 @@
#define RPL_STATSDLINE 275 /* Undernet extension */
#define RPL_STATSRLINE 276 /* Undernet extension */
#define RPL_GLIST 280 /* Undernet extension */
#define RPL_ENDOFGLIST 281 /* Undernet extension */
#define RPL_JUPELIST 282 /* Undernet extension - jupe -Kev */
-@@ -440,6 +443,7 @@
+@@ -441,6 +444,7 @@
/* ERR_GHOSTEDCLIENT 503 efnet */
/* ERR_VWORLDWARN 503 austnet */
#define ERR_SILELISTFULL 511 /* Undernet extension */
/* ERR_NOTIFYFULL 512 aircd */
/* ERR_TOOMANYWATCH 512 Numeric List: Dalnet */
-diff -r 2da61ac38fa1 include/split.h
+diff -r bc3532fbd97a include/split.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/include/split.h Sun Jan 18 15:26:56 2009 +0100
-@@ -0,0 +1,121 @@
++++ b/include/split.h Tue Jan 20 17:25:53 2009 +0100
+@@ -0,0 +1,120 @@
+/* TODO: ifndef ? */
+#ifndef INCLUDED_jupe_h
+#define INCLUDED_jupe_h
+struct Client;
+struct StatDesc;
+
-+#define SPLIT_MAX_EXPIRE 604800 /**< Maximum split expiration time (7 days). */
-+#define SPLIT_AUTO_EXPIRE 604800 /**< Expireation time used for auto created entries. */
++#define SPLIT_MAX_EXPIRE 2419200 /**< Maximum split expiration time (4 weeks). */
+
+/* Describes a SPLIT server entry. */
+struct Split {
+
+/* TODO: endif ? */
+#endif /* INCLUDED_jupe_h */
-diff -r 2da61ac38fa1 ircd/Makefile.in
---- a/ircd/Makefile.in Sun Jan 18 14:18:36 2009 +0100
-+++ b/ircd/Makefile.in Sun Jan 18 15:26:56 2009 +0100
+diff -r bc3532fbd97a ircd/Makefile.in
+--- a/ircd/Makefile.in Tue Jan 20 17:24:09 2009 +0100
++++ b/ircd/Makefile.in Tue Jan 20 17:25:53 2009 +0100
@@ -173,6 +173,7 @@
m_sethost.c \
m_settime.c \
uping.o: uping.c ../config.h ../include/uping.h ../include/ircd_defs.h \
../include/ircd_events.h ../config.h ../include/res.h \
../include/client.h ../include/dbuf.h ../include/msgq.h \
-diff -r 2da61ac38fa1 ircd/ircd.c
---- a/ircd/ircd.c Sun Jan 18 14:18:36 2009 +0100
-+++ b/ircd/ircd.c Sun Jan 18 15:26:56 2009 +0100
+diff -r bc3532fbd97a ircd/ircd.c
+--- a/ircd/ircd.c Tue Jan 20 17:24:09 2009 +0100
++++ b/ircd/ircd.c Tue Jan 20 17:25:53 2009 +0100
@@ -55,6 +55,7 @@
#include "s_misc.h"
#include "s_stats.h"
event_loop();
return 0;
-diff -r 2da61ac38fa1 ircd/ircd_features.c
---- a/ircd/ircd_features.c Sun Jan 18 14:18:36 2009 +0100
-+++ b/ircd/ircd_features.c Sun Jan 18 15:26:56 2009 +0100
-@@ -363,6 +363,7 @@
- F_B(SETHOST, 0, 0, 0),
+diff -r bc3532fbd97a ircd/ircd_features.c
+--- a/ircd/ircd_features.c Tue Jan 20 17:24:09 2009 +0100
++++ b/ircd/ircd_features.c Tue Jan 20 17:25:53 2009 +0100
+@@ -364,6 +364,10 @@
F_B(SETHOST_USER, 0, 0, 0),
F_B(SETHOST_AUTO, 0, 0, 0),
-+ F_B(SPLIT, 0, 1, 0),
++ /* SPLIT */
++ F_B(SPLIT, 0, 1, 0),
++ F_I(SPLIT_AUTO_EXPIRE, 0, 604800, 0),
++
/* HEAD_IN_SAND Features */
F_B(HIS_SNOTICES, 0, 1, 0),
-@@ -391,6 +392,7 @@
+ F_B(HIS_SNOTICES_OPER_ONLY, 0, 1, 0),
+@@ -391,6 +395,7 @@
F_B(HIS_STATS_q, 0, 1, 0),
F_B(HIS_STATS_R, 0, 1, 0),
F_B(HIS_STATS_r, 0, 1, 0),
F_B(HIS_STATS_s, 0, 1, 0),
F_B(HIS_STATS_t, 0, 1, 0),
F_B(HIS_STATS_T, 0, 1, 0),
-diff -r 2da61ac38fa1 ircd/m_endburst.c
---- a/ircd/m_endburst.c Sun Jan 18 14:18:36 2009 +0100
-+++ b/ircd/m_endburst.c Sun Jan 18 15:26:56 2009 +0100
+diff -r bc3532fbd97a ircd/m_endburst.c
+--- a/ircd/m_endburst.c Tue Jan 20 17:24:09 2009 +0100
++++ b/ircd/m_endburst.c Tue Jan 20 17:25:53 2009 +0100
@@ -85,6 +85,7 @@
#include "client.h"
#include "hash.h"
if (MyConnect(sptr))
sendcmdto_one(&me, CMD_END_OF_BURST_ACK, sptr, "");
-diff -r 2da61ac38fa1 ircd/m_reburst.c
---- a/ircd/m_reburst.c Sun Jan 18 14:18:36 2009 +0100
-+++ b/ircd/m_reburst.c Sun Jan 18 15:26:56 2009 +0100
+diff -r bc3532fbd97a ircd/m_reburst.c
+--- a/ircd/m_reburst.c Tue Jan 20 17:24:09 2009 +0100
++++ b/ircd/m_reburst.c Tue Jan 20 17:25:53 2009 +0100
@@ -102,6 +102,7 @@
#include "ircd_snprintf.h"
#include "gline.h"
default:
break;
}
-diff -r 2da61ac38fa1 ircd/m_split.c
+diff -r bc3532fbd97a ircd/m_split.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/ircd/m_split.c Sun Jan 18 15:26:56 2009 +0100
++++ b/ircd/m_split.c Tue Jan 20 17:25:53 2009 +0100
@@ -0,0 +1,374 @@
+/*
+ * IRC - Internet Relay Chat, ircd/m_split.c
+
+ return split_list(sptr, parv[1]);
+}
-diff -r 2da61ac38fa1 ircd/parse.c
---- a/ircd/parse.c Sun Jan 18 14:18:36 2009 +0100
-+++ b/ircd/parse.c Sun Jan 18 15:26:56 2009 +0100
+diff -r bc3532fbd97a ircd/parse.c
+--- a/ircd/parse.c Tue Jan 20 17:24:09 2009 +0100
++++ b/ircd/parse.c Tue Jan 20 17:25:53 2009 +0100
@@ -505,6 +505,13 @@
0, MAXPARA, MFLG_SLOW, 0, NULL,
/* UNREG, CLIENT, SERVER, OPER, SERVICE */
},
{
MSG_OPMODE,
-diff -r 2da61ac38fa1 ircd/s_conf.c
---- a/ircd/s_conf.c Sun Jan 18 14:18:36 2009 +0100
-+++ b/ircd/s_conf.c Sun Jan 18 15:26:56 2009 +0100
+diff -r bc3532fbd97a ircd/s_conf.c
+--- a/ircd/s_conf.c Tue Jan 20 17:24:09 2009 +0100
++++ b/ircd/s_conf.c Tue Jan 20 17:25:53 2009 +0100
@@ -53,6 +53,7 @@
#include "s_debug.h"
#include "s_misc.h"
return ret;
}
-diff -r 2da61ac38fa1 ircd/s_debug.c
---- a/ircd/s_debug.c Sun Jan 18 14:18:36 2009 +0100
-+++ b/ircd/s_debug.c Sun Jan 18 15:26:57 2009 +0100
+diff -r bc3532fbd97a ircd/s_debug.c
+--- a/ircd/s_debug.c Tue Jan 20 17:24:09 2009 +0100
++++ b/ircd/s_debug.c Tue Jan 20 17:25:53 2009 +0100
@@ -48,6 +48,7 @@
#include "s_user.h"
#include "s_stats.h"
send_reply(cptr, SND_EXPLICIT | RPL_STATSDEBUG,
":Hash: client %d(%zu), chan is the same", HASHSIZE,
-diff -r 2da61ac38fa1 ircd/s_err.c
---- a/ircd/s_err.c Sun Jan 18 14:18:36 2009 +0100
-+++ b/ircd/s_err.c Sun Jan 18 15:26:57 2009 +0100
+diff -r bc3532fbd97a ircd/s_err.c
+--- a/ircd/s_err.c Tue Jan 20 17:24:09 2009 +0100
++++ b/ircd/s_err.c Tue Jan 20 17:25:53 2009 +0100
@@ -490,7 +490,7 @@
/* 228 */
{ RPL_STATSQLINE, "Q %s :%s", "228" },
- { 0 },
+ { RPL_STATSSPLIT, "S %s %d %d %d %d %c :%s", "229" },
/* 230 */
- { 0 },
+ { RPL_STATSHEADER, 0, "230" },
/* 231 */
@@ -588,9 +588,9 @@
/* 277 */
- { 0 },
+ { RPL_ENDOFSPLITLIST, ":End of Split List", "279" },
/* 280 */
- { RPL_GLIST, "%s%s%s%s%s %Tu %Tu %Tu %s %s%c :%s", "280" },
+ { RPL_GLIST, "%s%s%s%s%s %Tu %Tu %Tu %s %s%s%c :%s", "280" },
/* 281 */
@@ -1052,7 +1052,7 @@
/* 509 */
/* 511 */
{ ERR_SILELISTFULL, "%s :Your silence list is full", "511" },
/* 512 */
-diff -r 2da61ac38fa1 ircd/s_misc.c
---- a/ircd/s_misc.c Sun Jan 18 14:18:36 2009 +0100
-+++ b/ircd/s_misc.c Sun Jan 18 15:26:57 2009 +0100
+diff -r bc3532fbd97a ircd/s_misc.c
+--- a/ircd/s_misc.c Tue Jan 20 17:24:09 2009 +0100
++++ b/ircd/s_misc.c Tue Jan 20 17:25:53 2009 +0100
@@ -53,6 +53,7 @@
#include "s_stats.h"
#include "s_user.h"
assert(killer);
if (MyConnect(victim))
{
-@@ -497,6 +499,14 @@
+@@ -497,6 +499,15 @@
sendto_opmask_butone(0, SNO_NETWORK, "Net break: %C %C (%s)",
cli_serv(victim)->up, victim, comment);
dump_map(victim, "*", 0, report_lost_links, 0);
+ if (feature_bool(FEAT_SPLIT)) {
++ /* TODO: remote & local SQUIT ? servername oper is on? */
+ ircd_snprintf(0, splitreason, sizeof(splitreason),
+ "Net break: %C %C (%s%s%s%s)", cli_serv(victim)->up, victim,
+ IsUser(killer) ? "SQUIT by " : "", IsUser(killer) ? cli_name(killer) : "",
}
/*
-diff -r 2da61ac38fa1 ircd/s_serv.c
---- a/ircd/s_serv.c Sun Jan 18 14:18:36 2009 +0100
-+++ b/ircd/s_serv.c Sun Jan 18 15:26:57 2009 +0100
+diff -r bc3532fbd97a ircd/s_serv.c
+--- a/ircd/s_serv.c Tue Jan 20 17:24:09 2009 +0100
++++ b/ircd/s_serv.c Tue Jan 20 17:25:53 2009 +0100
@@ -54,6 +54,7 @@
#include "s_misc.h"
#include "s_user.h"
/*
* Pass on my client information to the new server
-diff -r 2da61ac38fa1 ircd/s_stats.c
---- a/ircd/s_stats.c Sun Jan 18 14:18:36 2009 +0100
-+++ b/ircd/s_stats.c Sun Jan 18 15:26:57 2009 +0100
+diff -r bc3532fbd97a ircd/s_stats.c
+--- a/ircd/s_stats.c Tue Jan 20 17:24:09 2009 +0100
++++ b/ircd/s_stats.c Tue Jan 20 17:25:53 2009 +0100
@@ -52,6 +52,7 @@
#include "s_stats.h"
#include "s_user.h"
#include "struct.h"
#include "userload.h"
-@@ -633,7 +634,10 @@
+@@ -668,7 +669,10 @@
send_usage, 0,
"System resource usage (Debug only)." },
#endif
stats_sline, 0,
"Spoofed hosts information." },
{ 'T', "motds", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), FEAT_HIS_STATS_T,
-diff -r 2da61ac38fa1 ircd/split.c
+diff -r bc3532fbd97a ircd/split.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/ircd/split.c Sun Jan 18 15:26:57 2009 +0100
-@@ -0,0 +1,746 @@
++++ b/ircd/split.c Tue Jan 20 17:25:53 2009 +0100
+@@ -0,0 +1,771 @@
+/*
+ * IRC - Internet Relay Chat, ircd/split.c
+ * Copyright (C) 1990 Jarkko Oikarinen and
+ /* TODO: some limit for servername length? HOSTLEN? */
+ DupString(asplit->sp_server, server); /* copy vital information */
+ /* TODO: some limit for reason length? QUITLEN TOPICLEN? */
++ /* TODO: prefix the reason here with the opername/ID? */
+ DupString(asplit->sp_reason, reason);
+ /* TODO: what we use creation for and do we need it? */
+ asplit->sp_creation = creation;
+ asplit->sp_expire = expire;
+ /* TODO: are we using nettime etc.? CurrentTime is used. */
++ /* TODO: TStime() is CurrentTime + TSoffset */
+ asplit->sp_lastmod = lastmod;
+ asplit->sp_lifetime = lifetime;
+ /* CHECK: does this make it active upon creation regardless of the flags given? */
+ SplitIsActive(split) && !SplitIsRemoving(split) ? '+' : '-', /* always !- not !+ */
+ split->sp_server, split->sp_creation, split->sp_expire,
+ split->sp_lastmod, split->sp_lifetime,
++ /* TODO: does reason ? reason : split->sp_reason work too? */
+ reason != NULL ? reason : split->sp_reason);
+}
+
+ * 60 seconds?
+ * no no no! - see above
+ */
++ /* TODO: raise error with timestamps to SNO_OLDSNO?
++ * in the form of
++ * Nick collision on nick (nick 1232368192 <- hub.xx.quakenet.org 1232368192 (Same user@host))
++ */
+ return 0;
+ }
+
++ /* TODO: add opername */
+ /* inform ops and log it */
+ sendto_opmask_butone(0, SNO_NETWORK, "%s adding%sSPLIT for %s, expiring at %Tu: %s",
+ (feature_bool(FEAT_HIS_SNOTICES) || IsServer(sptr)) ?
+ * and not when a server is introduced.
+ * so between net junction and end of burst,
+ * we can get SPLITs for a linked server.
++ * also more than one server can be bursting at a time.
+ */
+ /* TODO: should we free it here or let that be done in end of burst?
+ * only when that is the ONLY situation we can get to this point!
+ pos ? ";" : "", pos ? " and" : "", reason);
+ }
+
++ /* TODO: add opername */
+ /* All right, inform ops... */
+ sendto_opmask_butone(0, SNO_NETWORK, "%s modifying SPLIT for %s:%s",
+ (feature_bool(FEAT_HIS_SNOTICES) || IsServer(sptr)) ?
+ /* CHECK: turn bit SPLIT_ACTIVE off? */
+ split->sp_flags |= SPLIT_ACTIVE;
+
++ /* TODO: add opername? */
+ /* inform ops and log it */
+ sendto_opmask_butone(0, SNO_NETWORK, "%s removing SPLIT for %s, expiring at %Tu: %s (%s)",
+ (feature_bool(FEAT_HIS_SNOTICES) || IsServer(sptr)) ?
+ "%#C removing SPLIT for %s, expiring at %Tu: %s (%s)",
+ sptr, split->sp_server, split->sp_expire, split->sp_reason, reason);
+
-+ /* TODO: the reason supplied for removing this SPLIT does not go upstream
-+ * either propagate manually here, or update the record or?
-+ */
+ /* propagate it */
+ split_propagate(cptr, sptr, split, reason);
+
+{
+ assert(0 != split);
+
++ /* TODO: also check if the server in SPLIT entry is linked atm? */
+ /* past lifetime */
+ if (split->sp_lifetime <= CurrentTime)
+ return 1;
+ struct DLink *lp;
+ struct Split *split;
+ int count = 0;
-+ time_t creation = CurrentTime, expire = CurrentTime + SPLIT_AUTO_EXPIRE,
++ time_t creation = CurrentTime, expire = CurrentTime + feature_int(FEAT_SPLIT_AUTO_EXPIRE),
+ lastmod = CurrentTime, lifetime = expire;
+ unsigned int flags = SPLIT_ACTIVE;
+
+
+ Debug((DEBUG_DEBUG, "split_break(\"%s\", \"%s\")", cli_name(server), reason));
+
++ /* bad auto expire value */
++ if (feature_int(FEAT_SPLIT_AUTO_EXPIRE) <= 0)
++ return 0;
++
+ /* find the SPLIT for this server */
+ if (!(split = split_find(cli_name(server)))) {
+ split_make(cli_name(server), reason, creation, expire, lastmod, lifetime, flags);
+ struct Client *server;
+ struct Split *split;
+ struct Split *asplit;
-+ time_t creation = CurrentTime, expire = CurrentTime + SPLIT_AUTO_EXPIRE,
++ time_t creation = CurrentTime, expire = CurrentTime + feature_int(FEAT_SPLIT_AUTO_EXPIRE),
+ lastmod = CurrentTime, lifetime = expire;
+ unsigned int flags = SPLIT_ACTIVE;
+ char reason[BUFSIZE];
+ if (!feature_bool(FEAT_SPLIT))
+ return;
+
++ /* bad auto expire value */
++ if (feature_int(FEAT_SPLIT_AUTO_EXPIRE) <= 0)
++ return;
++
+ ircd_snprintf(0, reason, sizeof(reason),
+ "Generated upon loading conf file on %s", cli_name(&me));
+
+ /* we have a SPLIT for this server already */
+ if (split = split_find(conf->name))
+ continue;
++ /* TODO: use SNO_OLDSNO here?
++ * just like nickcollisions on local users go there?
++ * or at least change the source / message format?
++ * /REHASH goes to SNO_OLDSNO? so this too?
++ * if oper did rehash, add his name here?
++ */
+ /* inform ops and log it */
+ sendto_opmask_butone(0, SNO_NETWORK, "%C adding SPLIT for %s, expiring at %Tu: %s",
+ &me, conf->name, expire, reason);
+ struct Split *split;
+ struct Split *ssplit;
+
-+ send_reply(sptr, SND_EXPLICIT | RPL_STATSSPLIT,
-+ "S servername creation expire lastmod lifetime active :reason");
++ /* send header so the client knows what we are showing */
++ send_reply(sptr, SND_EXPLICIT | RPL_STATSHEADER,
++ "S Server Creation Expire Lastmod Lifetime Status :Reason");
++
+ for (split = GlobalSplitList; split; split = split->sp_next)
+ send_reply(sptr, RPL_STATSSPLIT, split->sp_server,
+ split->sp_creation, split->sp_expire, split->sp_lastmod, split->sp_lifetime,