--- /dev/null
+diff -ur ../ircu2.10.11/include/ircd_policy.h ./include/ircd_policy.h
+--- ../ircu2.10.11/include/ircd_policy.h Thu Sep 20 13:55:14 2001
++++ ./include/ircd_policy.h Wed Feb 27 14:12:12 2002
+@@ -38,8 +38,8 @@
+ *
+ * This is implemented as disallowing users from setting +s
+ */
+-#define HEAD_IN_SAND_SNOTICES
+-#define SERVNOTICE_OPER_ONLY
++#undef HEAD_IN_SAND_SNOTICES
++#undef SERVNOTICE_OPER_ONLY
+
+ /* CFV-165 - Hiding Nonessential information from non-opers
+ *
+@@ -48,8 +48,8 @@
+ * This is implemented by making all server wallops DESYNC's, and removing
+ * +g from normal users.
+ */
+-#define HEAD_IN_SAND_DESYNCS
+-#define DEBUG_OPER_ONLY
++#undef HEAD_IN_SAND_DESYNCS
++#undef DEBUG_OPER_ONLY
+
+ /* CFV-165 - Hiding Nonessential information from non-opers
+ *
+@@ -57,7 +57,7 @@
+ *
+ * This is implemented as disallowing users from setting +w
+ */
+-#define HEAD_IN_SAND_WALLOPS
++#undef HEAD_IN_SAND_WALLOPS
+ /* #define WALLOPS_OPER_ONLY */
+
+ /* CFV-165 - Hiding Nonessential information from non-opers
+@@ -65,13 +65,13 @@
+ * 5) Removal of /MAP from users.
+ *
+ */
+-#define HEAD_IN_SAND_MAP
++#undef HEAD_IN_SAND_MAP
+
+ /* CFV-165 - Hiding Nonessential information from non-opers
+ *
+ * 6) Removal of links from users
+ */
+-#define HEAD_IN_SAND_LINKS
++#undef HEAD_IN_SAND_LINKS
+
+ /* CFV-165 - Hiding Nonessential information from non-opers
+ *
+@@ -82,66 +82,66 @@
+ *
+ * 8) Removal of /TRACE from users.
+ */
+-#define HEAD_IN_SAND_TRACE
++#undef HEAD_IN_SAND_TRACE
+
+ /* CFV-165 - Hiding Nonessential information from non-opers
+ *
+ * 9-13) Removal of various stats from non users
+ */
+-#define HEAD_IN_SAND_STATS_L
+-#define HEAD_IN_SAND_STATS_C
+-#define HEAD_IN_SAND_STATS_G
+-#define HEAD_IN_SAND_STATS_H
+-#define HEAD_IN_SAND_STATS_K
+-#define HEAD_IN_SAND_STATS_F
+-#define HEAD_IN_SAND_STATS_I
+-#define HEAD_IN_SAND_STATS_M
+-#define HEAD_IN_SAND_STATS_m
+-#define HEAD_IN_SAND_STATS_O
+-#define HEAD_IN_SAND_STATS_P
+-#define HEAD_IN_SAND_STATS_R
+-#define HEAD_IN_SAND_STATS_D
+-#define HEAD_IN_SAND_STATS_d
+-#define HEAD_IN_SAND_STATS_E
+-#define HEAD_IN_SAND_STATS_t
+-#define HEAD_IN_SAND_STATS_T
+-#define HEAD_IN_SAND_STATS_U
+-#undef HEAD_IN_SAND_STATS_u
+-#undef HEAD_IN_SAND_STATS_W
+-#define HEAD_IN_SAND_STATS_X
+-#define HEAD_IN_SAND_STATS_Y
+-#define HEAD_IN_SAND_STATS_Z
++#undef HEAD_IN_SAND_STATS_L
++#undef HEAD_IN_SAND_STATS_C
++#undef HEAD_IN_SAND_STATS_G
++#undef HEAD_IN_SAND_STATS_H
++#undef HEAD_IN_SAND_STATS_K
++#undef HEAD_IN_SAND_STATS_F
++#undef HEAD_IN_SAND_STATS_I
++#undef HEAD_IN_SAND_STATS_M
++#undef HEAD_IN_SAND_STATS_m
++#undef HEAD_IN_SAND_STATS_O
++#undef HEAD_IN_SAND_STATS_P
++#undef HEAD_IN_SAND_STATS_R
++#undef HEAD_IN_SAND_STATS_D
++#undef HEAD_IN_SAND_STATS_d
++#undef HEAD_IN_SAND_STATS_E
++#undef HEAD_IN_SAND_STATS_t
++#undef HEAD_IN_SAND_STATS_T
++#undef HEAD_IN_SAND_STATS_U
++#undef HEAD_IN_SAND_STATS_u
++#undef HEAD_IN_SAND_STATS_W
++#undef HEAD_IN_SAND_STATS_X
++#undef HEAD_IN_SAND_STATS_Y
++#undef HEAD_IN_SAND_STATS_Z
+
+ /* CFV-165 - Hiding Nonessential information from non-opers
+ *
+ * 14) Removal of server names in net break sign-offs.
+ */
+
+-#define HEAD_IN_SAND_NETSPLIT
++#undef HEAD_IN_SAND_NETSPLIT
+
+ /* CFV-165 - Hiding Nonessential information from non-opers
+ *
+ * 15) Removal of server names in replies to /WHOIS
+ */
+
+-#define HEAD_IN_SAND_WHOIS_SERVERNAME
+-#define HEAD_IN_SAND_WHOIS_IDLETIME
+-#define HEAD_IN_SAND_WHO_SERVERNAME
+-#define HEAD_IN_SAND_WHO_HOPCOUNT
++#undef HEAD_IN_SAND_WHOIS_SERVERNAME
++#undef HEAD_IN_SAND_WHOIS_IDLETIME
++#undef HEAD_IN_SAND_WHO_SERVERNAME
++#undef HEAD_IN_SAND_WHO_HOPCOUNT
+
+ /* CFV-165 - Hiding Nonessential information from non-opers
+ *
+ */
+
+ /* don't show which server set a ban */
+-#define HEAD_IN_SAND_BANWHO
++#undef HEAD_IN_SAND_BANWHO
+
+ /* remap remote numerics to come from the local server */
+-#define HEAD_IN_SAND_REWRITE
++#undef HEAD_IN_SAND_REWRITE
+
+ /* disallow remote queries (*sob!*) */
+ /* (note, set this to 0 to reenable, not undef */
+-#define HEAD_IN_SAND_REMOTE 1
++#define HEAD_IN_SAND_REMOTE 0
+
+ #define HEAD_IN_SAND_SERVERNAME "*.undernet.org"
+ #define HEAD_IN_SAND_SERVERINFO "The Undernet Underworld"
--- /dev/null
+Index: doc/example.conf
+===================================================================
+RCS file: /home/coder-com/cvs/ircu2.10/doc/example.conf,v
+retrieving revision 1.15.2.3
+diff -u -r1.15.2.3 example.conf
+--- doc/example.conf 2002/02/04 22:06:11 1.15.2.3
++++ doc/example.conf 2002/02/11 09:17:57
+@@ -455,6 +455,7 @@
+ # F:NICKNAMEHISTORYLENGTH:800
+ # F:HOST_HIDING:FALSE
+ # F:HIDDEN_HOST:users.undernet.org
++# F:TOPIC_BURST:FALSE
+ # F:KILLCHASETIMELIMIT:30
+ # F:MAXCHANNELSPERUSER:10
+ # F:AVBANLEN:40
+Index: doc/readme.features
+===================================================================
+RCS file: /home/coder-com/cvs/ircu2.10/doc/readme.features,v
+retrieving revision 1.2.2.3
+diff -u -r1.2.2.3 readme.features
+--- doc/readme.features 2002/02/04 22:06:11 1.2.2.3
++++ doc/readme.features 2002/02/11 09:18:35
+@@ -235,6 +235,13 @@
+
+ This selects the suffix for the hidden hostmask (see HOST_HIDING).
+
++TOPIC_BURST
++ * Type: boolean
++ * Default: FALSE
++
++This selects whether topics are *sent* to other servers durring a burst.
++Note that receiving topics from servers is always enabled.
++
+ KILLCHASETIMELIMIT
+ * Type: integer
+ * Default: 30
+Index: include/ircd_features.h
+===================================================================
+RCS file: /home/coder-com/cvs/ircu2.10/include/ircd_features.h,v
+retrieving revision 1.11.2.3
+diff -u -r1.11.2.3 ircd_features.h
+--- include/ircd_features.h 2002/02/04 22:06:11 1.11.2.3
++++ include/ircd_features.h 2002/02/11 09:18:35
+@@ -44,6 +44,7 @@
+ FEAT_NICKNAMEHISTORYLENGTH,
+ FEAT_HOST_HIDING,
+ FEAT_HIDDEN_HOST,
++ FEAT_TOPIC_BURST,
+
+ /* features that probably should not be touched */
+ FEAT_KILLCHASETIMELIMIT,
+Index: ircd/channel.c
+===================================================================
+RCS file: /home/coder-com/cvs/ircu2.10/ircd/channel.c,v
+retrieving revision 1.73.2.5
+diff -u -r1.73.2.5 channel.c
+--- ircd/channel.c 2002/02/03 20:31:46 1.73.2.5
++++ ircd/channel.c 2002/02/11 09:23:28
+@@ -844,6 +844,10 @@
+ msgq_clean(mb);
+ } /* Continue when there was something
+ that didn't fit (full==1) */
++
++ if (feature_bool(FEAT_TOPIC_BURST) && *chptr->topic)
++ sendcmdto_one(&me, CMD_TOPIC, cptr, "%H %Tu :%s", chptr,
++ chptr->topic_time, chptr->topic);
+ }
+
+ /*
+Index: ircd/ircd_features.c
+===================================================================
+RCS file: /home/coder-com/cvs/ircu2.10/ircd/ircd_features.c,v
+retrieving revision 1.15.2.3
+diff -u -r1.15.2.3 ircd_features.c
+--- ircd/ircd_features.c 2002/02/04 22:06:11 1.15.2.3
++++ ircd/ircd_features.c 2002/02/11 09:23:30
+@@ -251,6 +251,7 @@
+ F_I(NICKNAMEHISTORYLENGTH, 0, 800, whowas_realloc),
+ F_B(HOST_HIDING, 0, 0, 0),
+ F_S(HIDDEN_HOST, FEAT_CASE, "users.undernet.org", 0),
++ F_B(TOPIC_BURST, 0, 0, 0),
+
+ /* features that probably should not be touched */
+ F_I(KILLCHASETIMELIMIT, 0, 30, 0),
+Index: ircd/m_topic.c
+===================================================================
+RCS file: /home/coder-com/cvs/ircu2.10/ircd/m_topic.c,v
+retrieving revision 1.9.2.1
+diff -u -r1.9.2.1 m_topic.c
+--- ircd/m_topic.c 2002/02/03 20:31:46 1.9.2.1
++++ ircd/m_topic.c 2002/02/11 09:23:30
+@@ -86,6 +86,7 @@
+ #include "hash.h"
+ #include "ircd.h"
+ #include "ircd_reply.h"
++#include "ircd_policy.h"
+ #include "ircd_string.h"
+ #include "msg.h"
+ #include "numeric.h"
+@@ -93,17 +94,24 @@
+ #include "send.h"
+
+ #include <assert.h>
++#include <stdlib.h>
+
+ static void do_settopic(struct Client *sptr, struct Client *cptr,
+- struct Channel *chptr,char *topic)
++ struct Channel *chptr, char *topic, time_t ts)
+ {
+ int newtopic;
++ struct Client *from;
+ /* if +n and not @'d, return an error and ignore the topic */
+- if ((chptr->mode.mode & MODE_TOPICLIMIT) != 0 && !is_chan_op(sptr, chptr))
++ if (!IsServer(sptr) && (chptr->mode.mode & MODE_TOPICLIMIT) != 0 && !is_chan_op(sptr, chptr))
+ {
+ send_reply(sptr, ERR_CHANOPRIVSNEEDED, chptr->chname);
+ return;
+ }
++#ifdef HEAD_IN_SAND_BANWHO /* Server-set topics are similar to bans */
++ from = IsServer(sptr) ? &me : sptr;
++#else
++ from = sptr;
++#endif
+ /* Note if this is just a refresh of an old topic, and don't
+ * send it to all the clients to save bandwidth. We still send
+ * it to other servers as they may have split and lost the topic.
+@@ -111,14 +119,14 @@
+ newtopic=ircd_strncmp(chptr->topic,topic,TOPICLEN)!=0;
+ /* setting a topic */
+ ircd_strncpy(chptr->topic, topic, TOPICLEN);
+- ircd_strncpy(chptr->topic_nick, cli_name(sptr), NICKLEN);
+- chptr->topic_time = CurrentTime;
++ ircd_strncpy(chptr->topic_nick, cli_name(from), NICKLEN);
++ chptr->topic_time = ts ? ts : CurrentTime;
+ /* Fixed in 2.10.11: Don't propergate local topics */
+ if (!IsLocalChannel(chptr->chname))
+- sendcmdto_serv_butone(sptr, CMD_TOPIC, cptr, "%H :%s", chptr,
+- chptr->topic);
++ sendcmdto_serv_butone(sptr, CMD_TOPIC, cptr, "%H %Tu :%s", chptr,
++ chptr->topic_time, chptr->topic);
+ if (newtopic)
+- sendcmdto_channel_butserv_butone(sptr, CMD_TOPIC, chptr, NULL,
++ sendcmdto_channel_butserv_butone(from, CMD_TOPIC, chptr, NULL,
+ "%H :%s", chptr, chptr->topic);
+ /* if this is the same topic as before we send it to the person that
+ * set it (so they knew it went through ok), but don't bother sending
+@@ -180,7 +188,7 @@
+ }
+ }
+ else
+- do_settopic(sptr,cptr,chptr,topic);
++ do_settopic(sptr,cptr,chptr,topic,0);
+ }
+ return 0;
+ }
+@@ -190,12 +198,14 @@
+ *
+ * parv[0] = sender prefix
+ * parv[1] = channel
++ * parv[parc - 2] = timestamp (optional)
+ * parv[parc - 1] = topic
+ */
+ int ms_topic(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
+ {
+ struct Channel *chptr;
+ char *topic = 0, *name, *p = 0;
++ time_t ts = 0;
+
+ if (parc < 3)
+ return need_more_params(sptr, "TOPIC");
+@@ -226,7 +236,9 @@
+ continue;
+ }
+
+- do_settopic(sptr,cptr,chptr,topic);
++ if (parc > 3 && (ts = atoi(parv[parc - 2])) && chptr->topic_time > ts)
++ continue;
++ do_settopic(sptr,cptr,chptr,topic,ts);
+ }
+ return 0;
+ }