]> jfr.im git - irc/quakenet/snircd-patchqueue.git/blobdiff - split.patch
done some work on cansendtochan.patch, added nserverflag.patch, and probably some...
[irc/quakenet/snircd-patchqueue.git] / split.patch
index 92a35cd74a1848952cdecee9dda4dc6ab65476aa..02e416008195c1b7d043c2dcd0a6b63243caff47 100644 (file)
@@ -5,9 +5,11 @@ Add /stats S/split (make /STATS s/S case sensitive, s spoofhosts)
 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*[]);
@@ -32,18 +34,21 @@ diff -r 2da61ac38fa1 include/handlers.h
  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,
@@ -51,9 +56,9 @@ diff -r 2da61ac38fa1 include/ircd_features.h
    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
@@ -65,18 +70,18 @@ diff -r 2da61ac38fa1 include/msg.h
  #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 */
  
@@ -85,7 +90,7 @@ diff -r 2da61ac38fa1 include/numeric.h
  #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 */
  
@@ -93,10 +98,10 @@ diff -r 2da61ac38fa1 include/numeric.h
  #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
@@ -134,8 +139,7 @@ diff -r 2da61ac38fa1 include/split.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 {
@@ -218,9 +222,9 @@ diff -r 2da61ac38fa1 include/split.h
 +
 +/* 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 \
@@ -278,9 +282,9 @@ diff -r 2da61ac38fa1 ircd/Makefile.in
  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"
@@ -299,18 +303,21 @@ diff -r 2da61ac38fa1 ircd/ircd.c
    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),
@@ -318,9 +325,9 @@ diff -r 2da61ac38fa1 ircd/ircd_features.c
    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"
@@ -356,9 +363,9 @@ diff -r 2da61ac38fa1 ircd/m_endburst.c
    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"
@@ -378,9 +385,9 @@ diff -r 2da61ac38fa1 ircd/m_reburst.c
      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
@@ -756,9 +763,9 @@ diff -r 2da61ac38fa1 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 */
@@ -773,9 +780,9 @@ diff -r 2da61ac38fa1 ircd/parse.c
    },
    {
      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"
@@ -792,9 +799,9 @@ diff -r 2da61ac38fa1 ircd/s_conf.c
  
    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"
@@ -832,9 +839,9 @@ diff -r 2da61ac38fa1 ircd/s_debug.c
  
    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" },
@@ -842,7 +849,7 @@ diff -r 2da61ac38fa1 ircd/s_err.c
 -  { 0 },
 +  { RPL_STATSSPLIT, "S %s %d %d %d %d %c :%s", "229" },
  /* 230 */
-   { 0 },
+   { RPL_STATSHEADER, 0, "230" },
  /* 231 */
 @@ -588,9 +588,9 @@
  /* 277 */
@@ -854,7 +861,7 @@ diff -r 2da61ac38fa1 ircd/s_err.c
 -  { 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 */
@@ -865,9 +872,9 @@ diff -r 2da61ac38fa1 ircd/s_err.c
  /* 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"
@@ -884,11 +891,12 @@ diff -r 2da61ac38fa1 ircd/s_misc.c
    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) : "",
@@ -899,9 +907,9 @@ diff -r 2da61ac38fa1 ircd/s_misc.c
    }
  
    /*
-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"
@@ -918,9 +926,9 @@ diff -r 2da61ac38fa1 ircd/s_serv.c
  
    /*
     * 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"
@@ -929,7 +937,7 @@ diff -r 2da61ac38fa1 ircd/s_stats.c
  #include "struct.h"
  #include "userload.h"
  
-@@ -633,7 +634,10 @@
+@@ -668,7 +669,10 @@
      send_usage, 0,
      "System resource usage (Debug only)." },
  #endif
@@ -941,10 +949,10 @@ diff -r 2da61ac38fa1 ircd/s_stats.c
      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
@@ -1022,11 +1030,13 @@ diff -r 2da61ac38fa1 ircd/split.c
 +  /* 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? */
@@ -1056,6 +1066,7 @@ diff -r 2da61ac38fa1 ircd/split.c
 +    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);
 +}
 +
@@ -1121,9 +1132,14 @@ diff -r 2da61ac38fa1 ircd/split.c
 +       * 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)) ?
@@ -1188,6 +1204,7 @@ diff -r 2da61ac38fa1 ircd/split.c
 +   *       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!
@@ -1313,6 +1330,7 @@ diff -r 2da61ac38fa1 ircd/split.c
 +               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)) ?
@@ -1356,6 +1374,7 @@ diff -r 2da61ac38fa1 ircd/split.c
 +  /* 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)) ?
@@ -1367,9 +1386,6 @@ diff -r 2da61ac38fa1 ircd/split.c
 +    "%#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);
 +
@@ -1432,6 +1448,7 @@ diff -r 2da61ac38fa1 ircd/split.c
 +{
 +  assert(0 != split);
 +
++  /* TODO: also check if the server in SPLIT entry is linked atm? */
 +  /* past lifetime */
 +  if (split->sp_lifetime <= CurrentTime)
 +    return 1;
@@ -1573,7 +1590,7 @@ diff -r 2da61ac38fa1 ircd/split.c
 +  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;
 +
@@ -1581,6 +1598,10 @@ diff -r 2da61ac38fa1 ircd/split.c
 +
 +  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);
@@ -1604,7 +1625,7 @@ diff -r 2da61ac38fa1 ircd/split.c
 +  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];
@@ -1615,6 +1636,10 @@ diff -r 2da61ac38fa1 ircd/split.c
 +  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));
 +
@@ -1629,6 +1654,12 @@ diff -r 2da61ac38fa1 ircd/split.c
 +    /* 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);
@@ -1661,8 +1692,10 @@ diff -r 2da61ac38fa1 ircd/split.c
 +  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,