<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/">
  <channel rdf:about="http://blog.gmane.org/gmane.network.irc.undernet-ircu.cvs">
    <title>gmane.network.irc.undernet-ircu.cvs</title>
    <link>http://blog.gmane.org/gmane.network.irc.undernet-ircu.cvs</link>
    <description/>
    <syn:updatePeriod>hourly</syn:updatePeriod>
    <syn:updateFrequency>1</syn:updateFrequency>
    <syn:updateBase>1901-01-01T00:00+00:00</syn:updateBase>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/507"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/506"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/505"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/504"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/503"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/502"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/501"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/500"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/499"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/498"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/497"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/496"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/495"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/494"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/493"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/492"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/491"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/490"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/489"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/488"/>
      </rdf:Seq>
    </items>
    <image rdf:resource="http://gmane.org/img/gmane-25t.png"/>
    <textinput rdf:resource=""/>
  </channel>
  <image rdf:about="http://gmane.org/img/gmane-25t.png">
    <title>Gmane</title>
    <url>http://gmane.org/img/gmane-25t.png</url>
    <link>http://gmane.org</link>
  </image>
  <item rdf:about="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/507">
    <title>[SCM] Undernet IRC Server Source Code. branch mp/operlesscreated. u2.10.12.14-20-g0f95807</title>
    <link>http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/507</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Undernet IRC Server Source Code.".

The branch, mp/operless has been created
        at  0f95807a799957705413aaa0d7a267c795b23dd0 (commit)

- Log -----------------------------------------------------------------
commit 0f95807a799957705413aaa0d7a267c795b23dd0
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Thu Nov 29 21:41:27 2012 -0500

    Support logging WHOX use over the network.

diff --git a/ChangeLog b/ChangeLog
index abca7fd..1202583 100644
--- a/ChangeLog
+++ b/ChangeLog
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,3 +1,39 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+2012-11-04  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
+* doc/readme.features (WHOX_LOG_CHANNEL): Document this.
+(WHOX_LOG_FILE): Document this.
+(WHOX_LOG_SERVER): Document this.
+
+* include/ircd_features.h (FEAT_WHOX_LOG_CHANNEL): Define value.
+(FEAT_WHOX_LOG_FILE): Likewise.
+(FEAT_WHOX_LOG_SERVER): Likewise.
+
+* include/whocmds.h (whox_check_server): Declare new function.
+(whox_start_log): Likewise.
+(whox_end_log): Likewise.
+(do_who): Add new 'whox' parameter.
+
+* ircd/ircd_features.c (WHOX_LOG_CHANNEL): Define behavior.
+(WHOX_LOG_FILE): Likewise.
+(WHOX_LOG_SERVER): Likewise.
+
+* ircd/m_endburst.c (ms_end_of_burst_ack): Call
+whox_check_server() when a server finishes its net burst.
+
+* ircd/m_who.c (maybe_do_who): New function to consolidate a bunch
+of cut-and-paste code.  Among the fixes, only compare realhost for
+WHOX uses.
+(m_who): Call whox_start_log() instead of directly calling
+log_write() to report WHOX usage, and call whox_end_log() when
+done.  Pass the 'whox' argument to do_who().
+
+* ircd/whocmds.c (whox_check_server): Implement new function.
+(log_whox): New local function.
+(whox_start_log): Implement new function.
+(whox_end_log): Implement new function.
+(do_who): Add 'whox' parameter, and use it to determine whether to
+log clients whos real IP address is shown via WHOX use.
+
 2012-11-03  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
 * include/numeric.h (RPL_WHOISACTUALLY): Remove this.
diff --git a/doc/readme.features b/doc/readme.features
index de1b332..88d377e 100644
--- a/doc/readme.features
+++ b/doc/readme.features
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -444,6 +444,37 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; until the entire network has been upgraded.  It is not required that
 all servers set this to "TRUE" in order for the features to be used,
 as long as all servers are running u2.10.11 or above.
 
+WHOX_LOG_CHANNEL
+ * Type: string
+ * Default: none
+
+If this is set, all uses of /WHO with the X flag (which shows
+information to IRC operators that is normally hidden by the
+head-in-sand features) are logged to the named channel.  This channel
+should generally be a GLINEd "badchan", or otherwise protected against
+untrusted parties seeing the information.
+
+WHOX_LOG_FILE
+ * Type: string
+ * Default: "whox.log"
+
+If WHOX_LOG_CHANNEL and WHOX_LOG_SERVER are both set, this file is
+used to log uses of /WHO with the X flag when WHOX_LOG_SERVER is not
+linked to the network.  (This file is not persistent; ircu will clear
+it out once WHOX_LOG_SERVER is relinked and ircu has sent the logged
+data.)
+
+WHOX_LOG_SERVER
+ * Type: string
+ * Default: none
+
+If this and WHOX_LOG_CHANNEL are both set, uses of /WHO with the X
+flag are only logged to WHOX_LOG_CHANNEL when WHOX_LOG_SERVER is
+linked to the network.  If the WHOX_LOG_SERVER server is not
+connected, uses are logged to a temporary file that is played back
+when the server (re-)links.  This makes it easier to record these uses
+of /WHO in one place.
+
 HIS_MAP
  * Type: boolean
  * Default: TRUE
diff --git a/include/ircd_features.h b/include/ircd_features.h
index 42c54ac..c31751c 100644
--- a/include/ircd_features.h
+++ b/include/ircd_features.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -99,6 +99,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; enum Feature {
 
   /* features that affect all operators */
   FEAT_CONFIG_OPERCMDS,
+  FEAT_WHOX_LOG_CHANNEL,
+  FEAT_WHOX_LOG_FILE,
+  FEAT_WHOX_LOG_SERVER,
 
   /* HEAD_IN_SAND Features */
   FEAT_HIS_SNOTICES,
diff --git a/include/whocmds.h b/include/whocmds.h
index 357a175..e91be24 100644
--- a/include/whocmds.h
+++ b/include/whocmds.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -86,7 +86,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct Channel;
 /*
  * Prototypes
  */
+extern void whox_check_server(struct Client *sptr);
+extern void whox_start_log(struct Client *sptr, const char flags[], const char nicks[]);
+extern void whox_end_log(void);
 extern void do_who(struct Client* sptr, struct Client* acptr, struct Channel* repchan,
-                   int fields, char* qrt);
+                   int fields, char* qrt, int whox);
 
 #endif /* INCLUDED_whocmds_h */
diff --git a/ircd/ircd_features.c b/ircd/ircd_features.c
index 6d64f89..b8c6d3a 100644
--- a/ircd/ircd_features.c
+++ b/ircd/ircd_features.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -364,6 +364,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static struct FeatureDesc {
 
   /* features that affect all operators */
   F_B(CONFIG_OPERCMDS, 0, 0, 0),
+  F_S(WHOX_LOG_CHANNEL, FEAT_NULL, 0, 0),
+  F_S(WHOX_LOG_FILE, 0, "whox.log", 0),
+  F_S(WHOX_LOG_SERVER, FEAT_NULL, 0, 0),
 
   /* HEAD_IN_SAND Features */
   F_B(HIS_SNOTICES, 0, 1, 0),
diff --git a/ircd/m_endburst.c b/ircd/m_endburst.c
index 46d51ae..66ac814 100644
--- a/ircd/m_endburst.c
+++ b/ircd/m_endburst.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -92,6 +92,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #include "numeric.h"
 #include "numnicks.h"
 #include "send.h"
+#include "whocmds.h"
 
 /* #include &amp;lt;assert.h&amp;gt; -- Now using assert in ircd_log.h */
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -154,6 +155,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int ms_end_of_burst_ack(struct Client *cptr, struct Client *sptr, int parc, char
        sptr);
   sendcmdto_serv_butone(sptr, CMD_END_OF_BURST_ACK, cptr, "");
   ClearBurstAck(sptr);
+  whox_check_server(sptr);
 
   return 0;
 }
diff --git a/ircd/m_who.c b/ircd/m_who.c
index 49df475..4ca9541 100644
--- a/ircd/m_who.c
+++ b/ircd/m_who.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -122,6 +122,40 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void move_marker(void)
 #define CheckMark(x, y) ((x == y) ? 0 : (x = y))
 #define Process(cptr) CheckMark(cli_marker(cptr), who_marker)
 
+static int maybe_do_who(struct Client *sptr, struct Client *acptr, struct Channel *chptr, char *mymask, int minlen, char *qrt, struct irc_in_addr *imask, unsigned char ibits, int bitsel, int matchsel, int fields, int counter)
+{
+  if (!(IsUser(acptr) &amp;amp;&amp;amp; Process(acptr)))
+    return 0;           /* Now Process() is at the beginning, if we fail
+                           we'll never have to show this acptr in this query */
+  if ((bitsel &amp;amp; WHOSELECT_OPER) &amp;amp;&amp;amp; !SeeOper(sptr,acptr))
+    return 0;
+  if (matchsel
+      &amp;amp;&amp;amp; (!(matchsel &amp;amp; WHO_FIELD_NIC)
+          || matchexec(cli_name(acptr), mymask, minlen))
+      &amp;amp;&amp;amp; (!(matchsel &amp;amp; WHO_FIELD_UID)
+          || matchexec(cli_user(acptr)-&amp;gt;username, mymask, minlen))
+      &amp;amp;&amp;amp; (!(matchsel &amp;amp; WHO_FIELD_SER)
+          || (!(HasFlag(cli_user(acptr)-&amp;gt;server, FLAG_MAP))))
+      &amp;amp;&amp;amp; (!(matchsel &amp;amp; WHO_FIELD_HOS)
+          || matchexec(cli_user(acptr)-&amp;gt;host, mymask, minlen))
+      &amp;amp;&amp;amp; (!(matchsel &amp;amp; WHO_FIELD_HOS)
+          || !HasHiddenHost(acptr)
+          || !(bitsel &amp;amp; WHOSELECT_EXTRA)
+          || matchexec(cli_user(acptr)-&amp;gt;realhost, mymask, minlen))
+      &amp;amp;&amp;amp; (!(matchsel &amp;amp; WHO_FIELD_REN)
+          || matchexec(cli_info(acptr), mymask, minlen))
+      &amp;amp;&amp;amp; (!(matchsel &amp;amp; WHO_FIELD_NIP)
+          || (HasHiddenHost(acptr) &amp;amp;&amp;amp; !(bitsel &amp;amp; WHOSELECT_EXTRA))
+          || !ipmask_check(&amp;amp;cli_ip(acptr), imask, ibits))
+      &amp;amp;&amp;amp; (!(matchsel &amp;amp; WHO_FIELD_ACC)
+          || matchexec(cli_user(acptr)-&amp;gt;account, mymask, minlen)))
+    return 0;
+  if (!SHOW_MORE(sptr, counter))
+    return 1;
+  do_who(sptr, acptr, chptr, fields, qrt, bitsel &amp;amp; WHOSELECT_EXTRA);
+  return 0;
+}
+
 /*
  * m_who - generic message handler
  *
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -155,6 +189,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int m_who(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
   char *p;                      /* Scratch char pointer                     */
   char *qrt;                    /* Pointer to the query type                */
   static char mymask[512];      /* To save the mask before corrupting it    */
+  static char whox_buf[512];    /* Holds a partial line for logging         */
 
   /* Let's find where is our mask, and if actually contains something */
   mask = ((parc &amp;gt; 1) ? parv[1] : 0);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -186,8 +221,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int m_who(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
         case 'X':
           if (HasPriv(sptr, PRIV_WHOX) &amp;amp;&amp;amp; IsAnOper(sptr)) {
               bitsel |= WHOSELECT_EXTRA;
-              log_write(LS_WHO, L_INFO, LOG_NOSNOTICE, "%#C WHO %s %s", sptr,
-                        (BadPtr(parv[3]) ? parv[1] : parv[3]), parv[2]);
+              whox_start_log(sptr, parv[2],
+                             (BadPtr(parv[3]) ? parv[1] : parv[3]));
           }
           continue;
         case 'n':
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -342,7 +377,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int m_who(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
               continue;
             if (!(isthere || (SHOW_MORE(sptr, counter))))
               break;
-            do_who(sptr, acptr, chptr, fields, qrt);
+            do_who(sptr, acptr, chptr, fields, qrt, bitsel &amp;amp; WHOSELECT_EXTRA);
           }
         }
       }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -352,7 +387,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int m_who(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
             ((!(bitsel &amp;amp; WHOSELECT_OPER)) || SeeOper(sptr,acptr)) &amp;amp;&amp;amp;
             Process(acptr) &amp;amp;&amp;amp; SHOW_MORE(sptr, counter))
         {
-          do_who(sptr, acptr, 0, fields, qrt);
+          do_who(sptr, acptr, 0, fields, qrt, bitsel &amp;amp; WHOSELECT_EXTRA);
         }
       }
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -393,36 +428,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int m_who(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
         chptr = chan-&amp;gt;channel;
         for (member = chptr-&amp;gt;members; member; member = member-&amp;gt;next_member)
         {
-          acptr = member-&amp;gt;user;
-          if (!(IsUser(acptr) &amp;amp;&amp;amp; Process(acptr)))
-            continue;           /* Now Process() is at the beginning, if we fail
-                                   we'll never have to show this acptr in this query */
-   if ((bitsel &amp;amp; WHOSELECT_OPER) &amp;amp;&amp;amp; !SeeOper(sptr,acptr))
-    continue;
-          if ((mask) &amp;amp;&amp;amp;
-              ((!(matchsel &amp;amp; WHO_FIELD_NIC))
-              || matchexec(cli_name(acptr), mymask, minlen))
-              &amp;amp;&amp;amp; ((!(matchsel &amp;amp; WHO_FIELD_UID))
-              || matchexec(cli_user(acptr)-&amp;gt;username, mymask, minlen))
-              &amp;amp;&amp;amp; ((!(matchsel &amp;amp; WHO_FIELD_SER))
-              || (!(HasFlag(cli_user(acptr)-&amp;gt;server, FLAG_MAP))))
-              &amp;amp;&amp;amp; ((!(matchsel &amp;amp; WHO_FIELD_HOS))
-              || matchexec(cli_user(acptr)-&amp;gt;host, mymask, minlen))
-              &amp;amp;&amp;amp; ((!(matchsel &amp;amp; WHO_FIELD_HOS))
-      || !HasHiddenHost(acptr)
-      || !IsAnOper(sptr)
-              || matchexec(cli_user(acptr)-&amp;gt;realhost, mymask, minlen))
-              &amp;amp;&amp;amp; ((!(matchsel &amp;amp; WHO_FIELD_REN))
-              || matchexec(cli_info(acptr), mymask, minlen))
-              &amp;amp;&amp;amp; ((!(matchsel &amp;amp; WHO_FIELD_NIP))
-      || (HasHiddenHost(acptr) &amp;amp;&amp;amp; !IsAnOper(sptr))
-              || !ipmask_check(&amp;amp;cli_ip(acptr), &amp;amp;imask, ibits))
-              &amp;amp;&amp;amp; ((!(matchsel &amp;amp; WHO_FIELD_ACC))
-              || matchexec(cli_user(acptr)-&amp;gt;account, mymask, minlen)))
-            continue;
-          if (!SHOW_MORE(sptr, counter))
+          if (maybe_do_who(sptr, member-&amp;gt;user, member-&amp;gt;channel, mymask,
+                           minlen, qrt, &amp;amp;imask, ibits, bitsel, matchsel,
+                           fields, counter))
             break;
-          do_who(sptr, acptr, chptr, fields, qrt);
         }
       }
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -431,39 +440,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int m_who(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
     if ((!(counter &amp;lt; 1)) &amp;amp;&amp;amp; matchsel)
       for (acptr = cli_prev(&amp;amp;me); acptr; acptr = cli_prev(acptr))
       {
-        if (!(IsUser(acptr) &amp;amp;&amp;amp; Process(acptr)))
-          continue;
-if ((bitsel &amp;amp; WHOSELECT_OPER) &amp;amp;&amp;amp; !SeeOper(sptr,acptr))
-  continue;
-        if (!(SEE_USER(sptr, acptr, bitsel)))
-          continue;
-        if ((mask) &amp;amp;&amp;amp;
-            ((!(matchsel &amp;amp; WHO_FIELD_NIC))
-            || matchexec(cli_name(acptr), mymask, minlen))
-            &amp;amp;&amp;amp; ((!(matchsel &amp;amp; WHO_FIELD_UID))
-            || matchexec(cli_user(acptr)-&amp;gt;username, mymask, minlen))
-            &amp;amp;&amp;amp; ((!(matchsel &amp;amp; WHO_FIELD_SER))
-                || (!(HasFlag(cli_user(acptr)-&amp;gt;server, FLAG_MAP))))
-            &amp;amp;&amp;amp; ((!(matchsel &amp;amp; WHO_FIELD_HOS))
-            || matchexec(cli_user(acptr)-&amp;gt;host, mymask, minlen))
-            &amp;amp;&amp;amp; ((!(matchsel &amp;amp; WHO_FIELD_HOS))
-    || !HasHiddenHost(acptr)
-    || !IsAnOper(sptr)
-            || matchexec(cli_user(acptr)-&amp;gt;realhost, mymask, minlen))
-            &amp;amp;&amp;amp; ((!(matchsel &amp;amp; WHO_FIELD_REN))
-            || matchexec(cli_info(acptr), mymask, minlen))
-            &amp;amp;&amp;amp; ((!(matchsel &amp;amp; WHO_FIELD_NIP))
-    || (HasHiddenHost(acptr) &amp;amp;&amp;amp; !IsAnOper(sptr))
-            || !ipmask_check(&amp;amp;cli_ip(acptr), &amp;amp;imask, ibits))
-            &amp;amp;&amp;amp; ((!(matchsel &amp;amp; WHO_FIELD_ACC))
-            || matchexec(cli_user(acptr)-&amp;gt;account, mymask, minlen)))
-          continue;
-        if (!SHOW_MORE(sptr, counter))
+        if (maybe_do_who(sptr, acptr, 0, mymask, minlen, qrt, &amp;amp;imask, ibits,
+                         bitsel, matchsel, fields, counter))
           break;
-        do_who(sptr, acptr, 0, fields, qrt);
       }
   }
 
+  if (bitsel &amp;amp; WHOSELECT_EXTRA)
+      whox_end_log();
   /* Make a clean mask suitable to be sent in the "end of" */
   if (mask &amp;amp;&amp;amp; (p = strchr(mask, ' ')))
     *p = '\0';
diff --git a/ircd/whocmds.c b/ircd/whocmds.c
index 0b166ba..35feac6 100644
--- a/ircd/whocmds.c
+++ b/ircd/whocmds.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -33,6 +33,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #include "ircd.h"
 #include "ircd_chattr.h"
 #include "ircd_features.h"
+#include "ircd_log.h"
 #include "ircd_reply.h"
 #include "ircd_snprintf.h"
 #include "ircd_string.h"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -54,22 +55,134 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #include "whowas.h"
 #include "msg.h"
 
+#include &amp;lt;errno.h&amp;gt;
 #include &amp;lt;fcntl.h&amp;gt;
+#include &amp;lt;stdarg.h&amp;gt;
 #include &amp;lt;stdio.h&amp;gt;
 #include &amp;lt;stdlib.h&amp;gt;
 #include &amp;lt;string.h&amp;gt;
 #include &amp;lt;sys/stat.h&amp;gt;
 #include &amp;lt;unistd.h&amp;gt;
 
+/* ":&amp;lt;server&amp;gt; PRIVMSG #channel :&amp;lt;message&amp;gt;\r\n" must not exceed BUFSIZE. */
+#define WHOX_LOG_LEN (BUFSIZE - HOSTLEN - 2)
+
+static FILE *whox_log;
+static struct Client *whox_sptr;
+static int whox_pos;
+static int whox_limit;
+static char whox_line[BUFSIZE];
+
+/** If \a sptr is WHOX_LOG_SERVER, send previously logged /whox uses.
+ *
+ * &amp;lt; at &amp;gt;param[in] sptr Server that has finished linking.
+ */
+void whox_check_server(struct Client *sptr)
+{
+  struct Channel *chptr;
+  char buf[BUFSIZE];
+
+  if (!whox_log
+      || ircd_strcmp(cli_name(sptr), feature_str(FEAT_WHOX_LOG_SERVER))
+      || !(chptr = FindChannel(feature_str(FEAT_WHOX_LOG_CHANNEL))))
+    return;
+
+  rewind(whox_log);
+  while (fgets(buf, sizeof(buf), whox_log)) {
+    sendcmdto_channel_butone(&amp;amp;me, CMD_PRIVATE, chptr, NULL, SKIP_DEAF |
+                             SKIP_BURST, "%H :%s", chptr, buf);
+  }
+  fclose(whox_log);
+  whox_log = NULL;
+  unlink(feature_str(FEAT_WHOX_LOG_FILE));
+}
+
+/** Log text describing a /whox use.
+ *
+ * &amp;lt; at &amp;gt;param[in] sptr Client that used /whox.
+ * &amp;lt; at &amp;gt;param[in] format ircd_snprintf() format string.
+ * &amp;lt; at &amp;gt;param[in] ... Format arguments.
+ */
+static void log_whox(struct Client* sptr, const char *format, ...)
+{
+  va_list ap;
+  struct Client *srv;
+  struct Channel *chptr;
+  const char *srv_name;
+  const char *log_name;
+  char buf[BUFSIZE];
+
+  chptr = FindChannel(feature_str(FEAT_WHOX_LOG_CHANNEL));
+  if (!chptr)
+    return;
+
+  /* Do we only log to the network if some server is linked? */
+  srv_name = feature_str(FEAT_WHOX_LOG_SERVER);
+  if (srv_name &amp;amp;&amp;amp; !(srv = FindServer(srv_name))) {
+    /* If no log file configured, exit, even if there was a log file
+     * already open (i.e. the admin turned off that config option).
+     */
+    if (!(log_name = feature_str(FEAT_WHOX_LOG_FILE)))
+      return;
+
+    /* Do we need to open the log file? */
+    if (!whox_log &amp;amp;&amp;amp; !(whox_log = fopen(log_name, "a+"))) {
+      log_write(LS_WHO, L_ERROR, 0, "Unable to open WHOX_LOG_FILE: %s",
+                strerror(errno));
+      return;
+    }
+  }
+
+  va_start(ap, format);
+  ircd_vsnprintf(NULL, buf, sizeof(buf), format, ap);
+  va_end(ap);
+
+  if (whox_log) {
+    fputs(buf, whox_log);
+    fputc('\n', whox_log);
+  } else {
+    sendcmdto_channel_butone(&amp;amp;me, CMD_PRIVATE, chptr, NULL, SKIP_DEAF |
+                             SKIP_BURST, "%H :%s", chptr, buf);
+  }
+}
+
+void whox_start_log(struct Client *sptr, const char flags[], const char nicks[])
+{
+  struct Channel *chptr;
+
+  log_write(LS_WHO, L_INFO, LOG_NOSNOTICE, "%#C WHO %s %s", sptr, nicks, flags);
+  chptr = FindChannel(feature_str(FEAT_WHOX_LOG_CHANNEL));
+  whox_pos = 0;
+  if (chptr) {
+    whox_sptr = sptr;
+    log_whox(sptr, "%#C WHO %s %s", sptr, nicks, flags);
+    whox_limit = BUFSIZE - strlen(cli_name(&amp;amp;me)) - strlen(chptr-&amp;gt;chname)
+        - strlen(": PRIVMSG  : ..\r\n");
+  } else {
+    whox_sptr = NULL;
+    whox_limit = 0;
+  }
+}
+
+void whox_end_log(void)
+{
+  if (whox_pos &amp;gt; 0) {
+    whox_line[whox_pos] = '\0';
+    log_whox(whox_sptr, " ..%s", whox_line);
+  }
+}
+
 /** Send a WHO reply to a client who asked.
  * &amp;lt; at &amp;gt;param[in] sptr Client who is searching for other users.
  * &amp;lt; at &amp;gt;param[in] acptr Client who may be shown to \a sptr.
  * &amp;lt; at &amp;gt;param[in] repchan Shared channel that provides visibility.
  * &amp;lt; at &amp;gt;param[in] fields Bitmask of WHO_FIELD_* values, indicating what to show.
  * &amp;lt; at &amp;gt;param[in] qrt Query type string (ignored unless \a fields &amp;amp; WHO_FIELD_QTY).
+ * &amp;lt; at &amp;gt;param[in] whox Non-zero flag to indicate private information
+ *   should be shown because an operator used /WHO with the X flag.
  */
 void do_who(struct Client* sptr, struct Client* acptr, struct Channel* repchan,
-            int fields, char* qrt)
+            int fields, char* qrt, int whox)
 {
   char *p1;
   struct Membership *chan = 0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -129,11 +242,27 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void do_who(struct Client* sptr, struct Client* acptr, struct Channel* repchan,
 
   if (fields &amp;amp; WHO_FIELD_NIP)
   {
-    const char* p2 = HasHiddenHost(acptr) &amp;amp;&amp;amp; !IsAnOper(sptr) ?
+    const char* p2 = HasHiddenHost(acptr) &amp;amp;&amp;amp; !whox ?
       feature_str(FEAT_HIDDEN_IP) :
       ircd_ntoa(&amp;amp;cli_ip(acptr));
     *(p1++) = ' ';
     while ((*p2) &amp;amp;&amp;amp; (*(p1++) = *(p2++)));
+
+    if (HasHiddenHost(acptr) &amp;amp;&amp;amp; whox &amp;amp;&amp;amp; whox_sptr) {
+      const char *acct = cli_account(acptr);
+      int len = strlen(acct);
+
+      if (whox_pos + len + 2 &amp;gt;= whox_limit) {
+        whox_line[whox_pos] = '\0';
+        log_whox(whox_sptr, " ..%s", whox_line);
+        whox_pos = 0;
+      }
+
+      if (whox_pos &amp;gt; 0)
+        whox_line[whox_pos++] = ' ';
+      strcpy(whox_line + whox_pos, acct);
+      whox_pos += len;
+    }
   }
 
   if (!fields || (fields &amp;amp; WHO_FIELD_HOS))
commit 95c0b3ea7677e2db3512cd80b57a04eed6a8a3fc
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Thu Nov 29 21:41:01 2012 -0500

    Remove WHOISACTUALLY from WHOIS and WHOWAS responses.

diff --git a/ChangeLog b/ChangeLog
index e9291bb..abca7fd 100644
--- a/ChangeLog
+++ b/ChangeLog
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,3 +1,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+2012-11-03  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
+* include/numeric.h (RPL_WHOISACTUALLY): Remove this.
+
+* ircd/m_whois.c (do_whois): Remove the RPL_WHOISACTUALLY line.
+
+* ircd/m_whowas.c (m_whowas): Likewise.
+
+* ircd/s_err.c (replyTable): Remove the RPL_WHOISACTUALLY string.
+
 2012-10-15  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
 * include/IPcheck.h (IPcheck_connect_fail): Add new 'disconnect'
diff --git a/include/numeric.h b/include/numeric.h
index bb18601..26449cd 100644
--- a/include/numeric.h
+++ b/include/numeric.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -254,7 +254,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; extern const struct Numeric* get_error_numeric(int err);
 /*RPL_COMMANDSYNTAX    334   Dalnet */
 /*RPL_LISTSYNTAX     334   unreal */
 /*      RPL_CHANPASSOK       338           IRCnet extension (?)*/
-#defineRPL_WHOISACTUALLY    338/* Undernet extension, dalnet */
+/*RPL_WHOISACTUALLY    338   older Undernet, dalnet */
 /*RPL_BADCHANPASS     339           IRCnet extension (?) */
 #define RPL_USERIP           340        /* Undernet extension */
 #define RPL_INVITING         341
diff --git a/ircd/m_whois.c b/ircd/m_whois.c
index 01c9db5..8bca15b 100644
--- a/ircd/m_whois.c
+++ b/ircd/m_whois.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -211,10 +211,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void do_whois(struct Client* sptr, struct Client *acptr, int parc)
     if (IsAccount(acptr))
       send_reply(sptr, RPL_WHOISACCOUNT, name, user-&amp;gt;account);
 
-    if (HasHiddenHost(acptr) &amp;amp;&amp;amp; (IsAnOper(sptr) || acptr == sptr))
-      send_reply(sptr, RPL_WHOISACTUALLY, name, user-&amp;gt;username,
-                 user-&amp;gt;realhost, ircd_ntoa(&amp;amp;cli_ip(acptr)));
-
     /* Hint: if your looking to add more flags to a user, eg +h, here's
      *       probably a good place to add them :)
      */
diff --git a/ircd/m_whowas.c b/ircd/m_whowas.c
index eee2745..6005748 100644
--- a/ircd/m_whowas.c
+++ b/ircd/m_whowas.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -138,8 +138,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int m_whowas(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
       {
 send_reply(sptr, RPL_WHOWASUSER, temp-&amp;gt;name, temp-&amp;gt;username,
    temp-&amp;gt;hostname, temp-&amp;gt;realname);
-        if (IsAnOper(sptr) &amp;amp;&amp;amp; temp-&amp;gt;realhost)
-          send_reply(sptr, RPL_WHOISACTUALLY, temp-&amp;gt;name, temp-&amp;gt;username, temp-&amp;gt;realhost, "&amp;lt;untracked&amp;gt;");
         send_reply(sptr, RPL_WHOISSERVER, temp-&amp;gt;name,
                    (feature_bool(FEAT_HIS_WHOIS_SERVERNAME) &amp;amp;&amp;amp; !IsOper(sptr)) ?
                      feature_str(FEAT_HIS_SERVERNAME) :
diff --git a/ircd/s_err.c b/ircd/s_err.c
index dc45c2e..17c374f 100644
--- a/ircd/s_err.c
+++ b/ircd/s_err.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -708,7 +708,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static Numeric replyTable[] = {
 /* 337 */
   { 0 },
 /* 338 */
-  { RPL_WHOISACTUALLY, "%s %s&amp;lt; at &amp;gt;%s %s :Actual user&amp;lt; at &amp;gt;host, Actual IP", "338" },
+  { 0 },
 /* 339 */
   { 0 },
 /* 340 */
-----------------------------------------------------------------------


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Entrope</dc:creator>
    <dc:date>2012-11-30T02:49:11</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/506">
    <title>[SCM] Undernet IRC Server Source Code. branchu2_10_12_branch updated. u2.10.12.14-18-g894ccd3</title>
    <link>http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/506</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Undernet IRC Server Source Code.".

The branch, u2_10_12_branch has been updated
       via  894ccd3b8d5acb0067562d26bf72228d3e617203 (commit)
       via  2cf13869e6194d21a1f245aa251b33cb03b77bb6 (commit)
       via  799a75d7db8e63bec3e93ea00b018d3dd4d2f823 (commit)
       via  35fdd100a6c9e9ab362980d22e140ea18b793a6d (commit)
       via  fa78a87f4d4bf4411effdb4e3ba1072625294a9a (commit)
       via  72b0c799c590095ad78de705f36e9553bd41fa67 (commit)
       via  384fa2237ccf0348190d655a6ea4cb8131d05354 (commit)
       via  c3e49ba3f999d28a480f8f66cc633d9ea968099f (commit)
       via  bf526bb00c2fb89a400b330a9bbab71845a6b119 (commit)
       via  541252724db32192e85571306ebc60949048a093 (commit)
       via  9f3569b567de6a5585cffde153885d1611f6c7b6 (commit)
       via  dc84c4782beab4f9ed5e63f988fc9e4c73141da0 (commit)
       via  9a5a983eb43fc918ad5835622afa382817b3ecc5 (commit)
      from  246a65025b51a3c5fb6900b2af4cbf22793d1416 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 894ccd3b8d5acb0067562d26bf72228d3e617203
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Mon Nov 5 21:48:21 2012 -0500

    Add a parameter to IPcheck_connect_fail() to support IAuth IP spoofing.
    
    Before, the "connected" count for the client's true IP address would be
    incremented but never decremented.  This matches them up properly.

diff --git a/ChangeLog b/ChangeLog
index 972cefe..e9291bb 100644
--- a/ChangeLog
+++ b/ChangeLog
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,3 +1,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+2012-10-15  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
+* include/IPcheck.h (IPcheck_connect_fail): Add new 'disconnect'
+parameter.  This treats the failure as a disconnection from the
+client's current IP address.
+
+* ircd/IPcheck.c (ip_registry_connect_fail): Likewise.
+(IPcheck_connect_fail): Pass it through.
+
+* ircd/m_nick.c (m_nick): Pass zero for the new parameter.
+(ms_nick): Likewise.
+
+* ircd/s_auth.c (preregister_user): Likewise.
+(iauth_cmd_ip_address): Pass one for the new parameter.
+
 2012-06-20  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
 * ircd/ircd_string.c (ipmask_parse): Return zero if there is junk
diff --git a/include/IPcheck.h b/include/IPcheck.h
index 493ef43..91693ac 100644
--- a/include/IPcheck.h
+++ b/include/IPcheck.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -18,7 +18,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct irc_in_addr;
  */
 extern void IPcheck_init(void);
 extern int IPcheck_local_connect(const struct irc_in_addr *ip, time_t *next_target_out);
-extern void IPcheck_connect_fail(const struct Client *cptr);
+extern void IPcheck_connect_fail(const struct Client *cptr, int disconnect);
 extern void IPcheck_connect_succeeded(struct Client *cptr);
 extern int IPcheck_remote_connect(struct Client *cptr, int is_burst);
 extern void IPcheck_disconnect(struct Client *cptr);
diff --git a/ircd/IPcheck.c b/ircd/IPcheck.c
index 373958e..67b3485 100644
--- a/ircd/IPcheck.c
+++ b/ircd/IPcheck.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -373,13 +373,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int ip_registry_check_remote(struct Client* cptr, int is_burst)
  * of their own.  This "undoes" the effect of ip_registry_check_local()
  * so the client's address is not penalized for the failure.
  * &amp;lt; at &amp;gt;param[in] addr Address of rejected client.
+ * &amp;lt; at &amp;gt;param[in] disconnect If true, also count the client as disconnecting.
  */
-void ip_registry_connect_fail(const struct irc_in_addr *addr)
+void ip_registry_connect_fail(const struct irc_in_addr *addr, int disconnect)
 {
   struct IPRegistryEntry* entry = ip_registry_find(addr);
-  if (entry &amp;amp;&amp;amp; 0 == --entry-&amp;gt;attempts) {
-    Debug((DEBUG_DNS, "IPcheck noting local connection failure for %s.", ircd_ntoa(&amp;amp;entry-&amp;gt;addr)));
-    ++entry-&amp;gt;attempts;
+  if (entry) {
+    if (0 == --entry-&amp;gt;attempts) {
+      Debug((DEBUG_DNS, "IPcheck noting local connection failure for %s.", ircd_ntoa(&amp;amp;entry-&amp;gt;addr)));
+      ++entry-&amp;gt;attempts;
+    }
+    if (disconnect) {
+      assert(entry-&amp;gt;connected &amp;gt; 0);
+      entry-&amp;gt;connected--;
+    }
   }
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -521,11 +528,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int IPcheck_remote_connect(struct Client *cptr, int is_burst)
  * of their own.  This "undoes" the effect of ip_registry_check_local()
  * so the client's address is not penalized for the failure.
  * &amp;lt; at &amp;gt;param[in] cptr Client who has been rejected.
+ * &amp;lt; at &amp;gt;param[in] disconnect If true, also count the client as disconnecting.
  */
-void IPcheck_connect_fail(const struct Client *cptr)
+void IPcheck_connect_fail(const struct Client *cptr, int disconnect)
 {
   assert(IsIPChecked(cptr));
-  ip_registry_connect_fail(&amp;amp;cli_ip(cptr));
+  ip_registry_connect_fail(&amp;amp;cli_ip(cptr), disconnect);
 }
 
 /** Handle a client that has successfully connected.
diff --git a/ircd/m_nick.c b/ircd/m_nick.c
index fe13d4e..b612f86 100644
--- a/ircd/m_nick.c
+++ b/ircd/m_nick.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -246,7 +246,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int m_nick(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
    */
   if (IsUnknown(acptr) &amp;amp;&amp;amp; MyConnect(acptr)) {
     ServerStats-&amp;gt;is_ref++;
-    IPcheck_connect_fail(acptr);
+    IPcheck_connect_fail(acptr, 0);
     exit_client(cptr, acptr, &amp;amp;me, "Overridden by other sign on");
     return set_nick_name(cptr, sptr, nick, parc, parv);
   }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -376,7 +376,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int ms_nick(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
   if (IsUnknown(acptr) &amp;amp;&amp;amp; MyConnect(acptr))
   {
     ServerStats-&amp;gt;is_ref++;
-    IPcheck_connect_fail(acptr);
+    IPcheck_connect_fail(acptr, 0);
     exit_client(cptr, acptr, &amp;amp;me, "Overridden by other sign on");
     return set_nick_name(cptr, sptr, nick, parc, parv);
   }
diff --git a/ircd/s_auth.c b/ircd/s_auth.c
index e250ae6..924bd50 100644
--- a/ircd/s_auth.c
+++ b/ircd/s_auth.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -529,7 +529,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int preregister_user(struct Client *cptr)
     /* Can this ever happen? */
   case ACR_BAD_SOCKET:
     ++ServerStats-&amp;gt;is_ref;
-    IPcheck_connect_fail(cptr);
+    IPcheck_connect_fail(cptr, 0);
     return exit_client(cptr, cptr, &amp;amp;me, "Unknown error -- Try again");
   }
   return 0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1828,7 +1828,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int iauth_cmd_ip_address(struct IAuth *iauth, struct Client *cli,
     memcpy(&amp;amp;auth-&amp;gt;original, &amp;amp;cli_ip(cli), sizeof(auth-&amp;gt;original));
 
   /* Undo original IP connection in IPcheck. */
-  IPcheck_connect_fail(cli);
+  IPcheck_connect_fail(cli, 1);
   ClearIPChecked(cli);
 
   /* Update the IP and charge them as a remote connect. */
commit 2cf13869e6194d21a1f245aa251b33cb03b77bb6
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Wed Jun 20 20:20:25 2012 -0400

    Improve ipmask_parse()'s handling of invalid IPv6 inputs.

diff --git a/ChangeLog b/ChangeLog
index 2548586..972cefe 100644
--- a/ChangeLog
+++ b/ChangeLog
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,3 +1,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+2012-06-20  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
+* ircd/ircd_string.c (ipmask_parse): Return zero if there is junk
+after eight valid IPv6 address elements.
+
 2012-06-13  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
 * ircd/s_stats.c (stats_configured_links): Correctly distinguish
diff --git a/ircd/ircd_string.c b/ircd/ircd_string.c
index b5b32cf..f27db15 100644
--- a/ircd/ircd_string.c
+++ b/ircd/ircd_string.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -622,6 +622,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; ipmask_parse(const char *input, struct irc_in_addr *ip, unsigned char *pbits)
     default:
       return 0;
     }
+    if (input[pos] != '\0')
+      return 0;
   finish:
     if (colon &amp;lt; 8) {
       unsigned int jj;
commit 799a75d7db8e63bec3e93ea00b018d3dd4d2f823
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Wed Jun 13 21:38:53 2012 -0400

    Fix the display of local Operator blocks in /stats o.
    
    This only makes a difference for Operator blocks with "local = yes;"
    that use a Class block with "local = no;", but that is a supported
    way to set things up.

diff --git a/ChangeLog b/ChangeLog
index 840e3db..2548586 100644
--- a/ChangeLog
+++ b/ChangeLog
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,3 +1,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+2012-06-13  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
+* ircd/s_stats.c (stats_configured_links): Correctly distinguish
+local Operator blocks from global Operator blocks.
+
 2012-05-31  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
 * ircd/m_gline.c (ms_gline): If the mask was empty after removing
diff --git a/ircd/s_stats.c b/ircd/s_stats.c
index b373c91..7a600ce 100644
--- a/ircd/s_stats.c
+++ b/ircd/s_stats.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -114,12 +114,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; stats_configured_links(struct Client *sptr, const struct StatDesc* sd,
                    (name[0] == ':' ? "0" : ""), (tmp-&amp;gt;name ? tmp-&amp;gt;name : "*"),
                    port, get_conf_class(tmp));
       else if (tmp-&amp;gt;status &amp;amp; CONF_OPERATOR)
-        send_reply(sptr, RPL_STATSOLINE,
-                   ((FlagHas(&amp;amp;tmp-&amp;gt;privs_dirty, PRIV_PROPAGATE)
-                     &amp;amp;&amp;amp; FlagHas(&amp;amp;tmp-&amp;gt;privs, PRIV_PROPAGATE))
-                    || (FlagHas(&amp;amp;tmp-&amp;gt;conn_class-&amp;gt;privs_dirty, PRIV_PROPAGATE)
-                        &amp;amp;&amp;amp; FlagHas(&amp;amp;tmp-&amp;gt;conn_class-&amp;gt;privs, PRIV_PROPAGATE)))
-                   ? 'O' : 'o', username, host, name, get_conf_class(tmp));
+      {
+        int global = FlagHas(&amp;amp;tmp-&amp;gt;privs_dirty, PRIV_PROPAGATE)
+            ? FlagHas(&amp;amp;tmp-&amp;gt;privs, PRIV_PROPAGATE)
+            : FlagHas(&amp;amp;tmp-&amp;gt;conn_class-&amp;gt;privs, PRIV_PROPAGATE);
+        send_reply(sptr, RPL_STATSOLINE, global ? 'O' : 'o',
+                   username, host, name, get_conf_class(tmp));
+      }
     }
   }
 }
commit 35fdd100a6c9e9ab362980d22e140ea18b793a6d
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Thu May 31 22:39:43 2012 -0400

    Reject G-line masks like + (with no target).  Fixes SF#2965021.

diff --git a/ChangeLog b/ChangeLog
index d955283..840e3db 100644
--- a/ChangeLog
+++ b/ChangeLog
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,5 +1,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 2012-05-31  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
+* ircd/m_gline.c (ms_gline): If the mask was empty after removing
+the command character(s), reject the command.
+(mo_gline): Likewise.
+
+2012-05-31  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
 * include/channel.h (infochanmodes): Add +d channel mode.
 
 * include/client.h (infousermodes): Add +O user mode.
diff --git a/ircd/m_gline.c b/ircd/m_gline.c
index 18bc31d..9b6f661 100644
--- a/ircd/m_gline.c
+++ b/ircd/m_gline.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -167,6 +167,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; ms_gline(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
     break;
   }
 
+  /* Is there no mask left? */
+  if (mask[0] == '\0')
+    return need_more_params(sptr, "GLINE");
+
   /* Now, let's figure out if it's a local or global G-line */
   if (action == GLINE_LOCAL_ACTIVATE || action == GLINE_LOCAL_DEACTIVATE ||
       (target[0] == '*' &amp;amp;&amp;amp; target[1] == '\0'))
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -477,6 +481,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mo_gline(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
     break;
   }
 
+  /* Is there no mask left? */
+  if (mask[0] == '\0')
+    return need_more_params(sptr, "GLINE");
+
   /* Now let's figure out which is the target server */
   if (!target) /* no target, has to be me... */
     acptr = &amp;amp;me;
commit fa78a87f4d4bf4411effdb4e3ba1072625294a9a
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Thu May 31 22:34:12 2012 -0400

    Add missing modes from RPL_MYINFO (SF#2967675).
    
    In particular, add the +d channel mode and +O user mode.

diff --git a/ChangeLog b/ChangeLog
index f3e6f8e..d955283 100644
--- a/ChangeLog
+++ b/ChangeLog
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,5 +1,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 2012-05-31  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
+* include/channel.h (infochanmodes): Add +d channel mode.
+
+* include/client.h (infousermodes): Add +O user mode.
+
+2012-05-31  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
 * ircd/gline.c (gline_add): Add length checks for badchan and
 realname G-lines, comparable to the existing check for traditional
 G-lines.
diff --git a/include/channel.h b/include/channel.h
index 7cafdf8..57ed5dc 100644
--- a/include/channel.h
+++ b/include/channel.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -117,7 +117,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct Client;
 #define MODE_WPARAS     (MODE_CHANOP|MODE_VOICE|MODE_BAN|MODE_KEY|MODE_LIMIT|MODE_APASS|MODE_UPASS)
 
 /** Available Channel modes */
-#define infochanmodes feature_bool(FEAT_OPLEVELS) ? "AbiklmnopstUvrDR" : "biklmnopstvrDR"
+#define infochanmodes feature_bool(FEAT_OPLEVELS) ? "AbiklmnopstUvrDdR" : "biklmnopstvrDdR"
 /** Available Channel modes that take parameters */
 #define infochanmodeswithparams feature_bool(FEAT_OPLEVELS) ? "AbkloUv" : "bklov"
 
diff --git a/include/client.h b/include/client.h
index d889fd3..f93a3ee 100644
--- a/include/client.h
+++ b/include/client.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -90,7 +90,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef unsigned long flagpage_t;
 #define FlagClr(set,flag) ((set)-&amp;gt;bits[FLAGSET_INDEX(flag)] &amp;amp;= ~FLAGSET_MASK(flag))
 
 /** String containing valid user modes, in no particular order. */
-#define infousermodes "dioswkgx"
+#define infousermodes "diOoswkgx"
 
 /** Operator privileges. */
 enum Priv
commit 72b0c799c590095ad78de705f36e9553bd41fa67
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Thu May 31 22:41:28 2012 -0400

    Add more G-line length tests.  Resolves SF#2985922.
    
    Also remove the extra space noted in the same bug report.

diff --git a/ChangeLog b/ChangeLog
index ac1643b..f3e6f8e 100644
--- a/ChangeLog
+++ b/ChangeLog
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,5 +1,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 2012-05-31  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
+* ircd/gline.c (gline_add): Add length checks for badchan and
+realname G-lines, comparable to the existing check for traditional
+G-lines.
+
+* ircd/s_err.c (ERR_LONGMASK): Remove extra space in format string.
+
+2012-05-31  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
 * ircd/m_server.c (check_loop_and_lh): Mention the mechanism used
 to control HUB.
 
diff --git a/ircd/gline.c b/ircd/gline.c
index 4f95526..9c3d297 100644
--- a/ircd/gline.c
+++ b/ircd/gline.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -24,6 +24,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #include "config.h"
 
 #include "gline.h"
+#include "channel.h"
 #include "client.h"
 #include "ircd.h"
 #include "ircd_alloc.h"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -448,13 +449,21 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gline_add(struct Client *cptr, struct Client *sptr, char *userhost,
   if (*userhost == '#' || *userhost == '&amp;amp;') {
     if ((flags &amp;amp; GLINE_LOCAL) &amp;amp;&amp;amp; !HasPriv(sptr, PRIV_LOCAL_BADCHAN))
       return send_reply(sptr, ERR_NOPRIVILEGES);
+    /* Allow maximum channel name length, plus margin for wildcards. */
+    if (strlen(userhost+1) &amp;gt;= CHANNELLEN + 6)
+      return send_reply(sptr, ERR_LONGMASK);
 
     flags |= GLINE_BADCHAN;
     user = userhost;
     host = NULL;
   } else if (*userhost == '$') {
     switch (userhost[1]) {
-      case 'R': flags |= GLINE_REALNAME; break;
+      case 'R':
+        /* Allow REALLEN for the real name, plus margin for wildcards. */
+        if (strlen(userhost+2) &amp;gt;= REALLEN + 6)
+          return send_reply(sptr, ERR_LONGMASK);
+        flags |= GLINE_REALNAME;
+        break;
       default:
         /* uh, what to do here? */
         /* The answer, my dear Watson, is we throw a protocol_violation()
diff --git a/ircd/s_err.c b/ircd/s_err.c
index b05affb..dc45c2e 100644
--- a/ircd/s_err.c
+++ b/ircd/s_err.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1068,7 +1068,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static Numeric replyTable[] = {
 /* 517 */
   { ERR_DISABLED, "%s :Command disabled.", "517" },
 /* 518 */
-  { ERR_LONGMASK, " :Mask is too long", "518" },
+  { ERR_LONGMASK, ":Mask is too long", "518" },
 /* 519 */
   { ERR_TOOMANYUSERS, "%d :Too many users affected by mask", "519" },
 /* 520 */
commit 384fa2237ccf0348190d655a6ea4cb8131d05354
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Thu May 31 21:19:37 2012 -0400

    Clarify the "I'm a leaf, define HUB" message.

diff --git a/ChangeLog b/ChangeLog
index 6400d2d..ac1643b 100644
--- a/ChangeLog
+++ b/ChangeLog
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,3 +1,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+2012-05-31  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
+* ircd/m_server.c (check_loop_and_lh): Mention the mechanism used
+to control HUB.
+
 2012-05-09  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
 * ircd/s_user.c (set_user_mode): When a user deopers, revoke their
diff --git a/ircd/m_server.c b/ircd/m_server.c
index a38b7b8..aae44c5 100644
--- a/ircd/m_server.c
+++ b/ircd/m_server.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -429,7 +429,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; check_loop_and_lh(struct Client* cptr, struct Client *sptr, time_t *ghost, const
     else /* I_AM_NOT_HUB */
     {
       ServerStats-&amp;gt;is_ref++;
-      return exit_client(cptr, LHcptr, &amp;amp;me, "I'm a leaf, define HUB");
+      return exit_client(cptr, LHcptr, &amp;amp;me, "I'm a leaf, define the HUB feature");
     }
   }
 
commit c3e49ba3f999d28a480f8f66cc633d9ea968099f
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Thu May 31 21:18:55 2012 -0400

    Clear privileges when deopering.
    
    ircd/s_user.c (set_user_mode): When a user deopers, revoke their oper
      privileges in addition to their oper user mode.

diff --git a/ChangeLog b/ChangeLog
index 988981e..6400d2d 100644
--- a/ChangeLog
+++ b/ChangeLog
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,5 +1,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 2012-05-09  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
+* ircd/s_user.c (set_user_mode): When a user deopers, revoke their
+oper privileges in addition to their oper user mode.
+
+2012-05-09  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
 * ircd/m_who.c (m_who): Only set WHOSELECT_EXTRA for current
 opers.  Because privileges are kept after -o, this would let
 de-opered clients use WHOX.
diff --git a/ircd/s_user.c b/ircd/s_user.c
index a19691d..1f0e0d9 100644
--- a/ircd/s_user.c
+++ b/ircd/s_user.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1128,7 +1128,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int set_user_mode(struct Client *cptr, struct Client *sptr, int parc,
   {
     if ((FlagHas(&amp;amp;setflags, FLAG_OPER) || FlagHas(&amp;amp;setflags, FLAG_LOCOP)) &amp;amp;&amp;amp;
         !IsAnOper(sptr))
+    {
       det_confs_butmask(sptr, CONF_CLIENT &amp;amp; ~CONF_OPERATOR);
+      client_set_privs(sptr, NULL);
+    }
 
     if (SendServNotice(sptr))
     {
commit bf526bb00c2fb89a400b330a9bbab71845a6b119
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Thu May 31 21:22:49 2012 -0400

    Only allow current opers to WHOX.
    
    ircd/m_who.c (m_who): Only set WHOSELECT_EXTRA for current opers.

diff --git a/ChangeLog b/ChangeLog
index aa32341..988981e 100644
--- a/ChangeLog
+++ b/ChangeLog
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,3 +1,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+2012-05-09  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
+* ircd/m_who.c (m_who): Only set WHOSELECT_EXTRA for current
+opers.  Because privileges are kept after -o, this would let
+de-opered clients use WHOX.
+
 2012-05-07  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
 * include/client.h (cli_account): New helper macro to return the
diff --git a/ircd/m_who.c b/ircd/m_who.c
index f344e6f..49df475 100644
--- a/ircd/m_who.c
+++ b/ircd/m_who.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -184,10 +184,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int m_who(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
           continue;
         case 'x':
         case 'X':
-          bitsel |= WHOSELECT_EXTRA;
-          if (HasPriv(sptr, PRIV_WHOX))
-    log_write(LS_WHO, L_INFO, LOG_NOSNOTICE, "%#C WHO %s %s", sptr,
-      (BadPtr(parv[3]) ? parv[1] : parv[3]), parv[2]);
+          if (HasPriv(sptr, PRIV_WHOX) &amp;amp;&amp;amp; IsAnOper(sptr)) {
+              bitsel |= WHOSELECT_EXTRA;
+              log_write(LS_WHO, L_INFO, LOG_NOSNOTICE, "%#C WHO %s %s", sptr,
+                        (BadPtr(parv[3]) ? parv[1] : parv[3]), parv[2]);
+          }
           continue;
         case 'n':
         case 'N':
commit 541252724db32192e85571306ebc60949048a093
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Thu May 31 21:22:21 2012 -0400

    Log account rather than ident upon exit.
    
    This fixes SourceForge bug #2992882.

diff --git a/ChangeLog b/ChangeLog
index 9d8aa47..aa32341 100644
--- a/ChangeLog
+++ b/ChangeLog
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,5 +1,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 2012-05-07  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
+* include/client.h (cli_account): New helper macro to return the
+client's account name, or "0" for unstamped clients.
+
+* ircd/s_misc.c (exit_client): Use that when logging the client's
+exit.
+
+2012-05-07  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
 * ircd/gline.c (count_users): Use the client's real host, rather
 than their masked host, for +x users.
 
diff --git a/include/client.h b/include/client.h
index 26f0481..d889fd3 100644
--- a/include/client.h
+++ b/include/client.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -317,6 +317,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct Client {
 #define cli_username(cli)((cli)-&amp;gt;cli_username)
 /** Get client realname (information field). */
 #define cli_info(cli)((cli)-&amp;gt;cli_info)
+/** Get client account string. */
+#define cli_account(cli)(cli_user(cli) ? cli_user(cli)-&amp;gt;account : "0")
 
 /** Get number of incoming bytes queued for client. */
 #define cli_count(cli)con_count(cli_connect(cli))
diff --git a/ircd/s_misc.c b/ircd/s_misc.c
index b5324fa..111e9c7 100644
--- a/ircd/s_misc.c
+++ b/ircd/s_misc.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -389,7 +389,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int exit_client(struct Client *cptr,
 cli_firsttime(victim), on_for,
 cli_user(victim)-&amp;gt;username, cli_sockhost(victim),
                 ircd_ntoa(&amp;amp;cli_ip(victim)),
-                IsAccount(victim) ? cli_username(victim) : "0",
+                cli_account(victim),
                 NumNick(victim), /* two %s's */
                 cli_name(victim), cli_info(victim));
 
commit 9f3569b567de6a5585cffde153885d1611f6c7b6
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Thu May 31 21:22:03 2012 -0400

    Make gline.c's count_users() use real host for masked users.
    
    This fixes SourceForge bug #2992886.

diff --git a/ChangeLog b/ChangeLog
index eb65436..9d8aa47 100644
--- a/ChangeLog
+++ b/ChangeLog
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,3 +1,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+2012-05-07  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
+* ircd/gline.c (count_users): Use the client's real host, rather
+than their masked host, for +x users.
+
 2012-04-29  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
 * ircd/crule.c (crule_connected): Fix logic for ignoring
diff --git a/ircd/gline.c b/ircd/gline.c
index d25dbfa..4f95526 100644
--- a/ircd/gline.c
+++ b/ircd/gline.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -371,7 +371,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; count_users(char *mask, int flags)
       continue;
 
     ircd_snprintf(0, namebuf, sizeof(namebuf), "%s&amp;lt; at &amp;gt;%s",
-  cli_user(acptr)-&amp;gt;username, cli_user(acptr)-&amp;gt;host);
+  cli_user(acptr)-&amp;gt;username, cli_user(acptr)-&amp;gt;realhost);
     ircd_snprintf(0, ipbuf, sizeof(ipbuf), "%s&amp;lt; at &amp;gt;%s", cli_user(acptr)-&amp;gt;username,
   ircd_ntoa(&amp;amp;cli_ip(acptr)));
 
commit dc84c4782beab4f9ed5e63f988fc9e4c73141da0
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Thu May 31 21:21:28 2012 -0400

    Correctly skip non-servers when evaluating C-rules.
    
    IsMe(acptr) implies !IsServer(acptr), contrary to the apparent
    assumption in crule_connected() and crule_via().

diff --git a/ChangeLog b/ChangeLog
index f2f8282..eb65436 100644
--- a/ChangeLog
+++ b/ChangeLog
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,5 +1,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 2012-04-29  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
+* ircd/crule.c (crule_connected): Fix logic for ignoring
+non-server Client structures.
+(crule_via): Likewise.
+
+2012-04-29  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
 * */.cvsignore: Rename to .gitignore.
 
 * ircd/.cvsignore: Likewise, and add *.o because git does not
diff --git a/ircd/crule.c b/ircd/crule.c
index 6cfb8ab..1a1fd21 100644
--- a/ircd/crule.c
+++ b/ircd/crule.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -228,7 +228,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int crule_connected(int numargs, void *crulearg[])
   /* taken from m_links */
   for (acptr = GlobalClientList; acptr; acptr = cli_next(acptr))
   {
-    if (!IsServer(acptr) &amp;amp;&amp;amp; !IsMe(acptr))
+    if (!IsServer(acptr) || IsMe(acptr))
       continue;
     if (match((char *)crulearg[0], cli_name(acptr)))
       continue;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -276,7 +276,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int crule_via(int numargs, void *crulearg[])
   /* adapted from m_links */
   for (acptr = GlobalClientList; acptr; acptr = cli_next(acptr))
   {
-    if (!IsServer(acptr) &amp;amp;&amp;amp; !IsMe(acptr))
+    if (!IsServer(acptr) || IsMe(acptr))
       continue;
     if (match((char *)crulearg[1], cli_name(acptr)))
       continue;
commit 9a5a983eb43fc918ad5835622afa382817b3ecc5
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Thu May 31 21:20:58 2012 -0400

    Rename .cvsignore files to .gitignore.
    
    Also add *.o to ircd/.gitignore because git does not ignore that
    pattern by default.

diff --git a/.cvsignore b/.gitignore
similarity index 100%
rename from .cvsignore
rename to .gitignore
diff --git a/ChangeLog b/ChangeLog
index 2699fe6..f2f8282 100644
--- a/ChangeLog
+++ b/ChangeLog
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,4 +1,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
-2011-01-23  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+2012-04-29  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
+* */.cvsignore: Rename to .gitignore.
+
+* ircd/.cvsignore: Likewise, and add *.o because git does not
+ignore any patterns by default.
+
+2012-01-23  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
 * ircd/ircd_res.c (proc_answer): Delete unread variable
 query_class.
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -16,12 +23,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 * ircd/s_stats.c (stats_configured_links): Delete unread variable
 pass.
 
-2011-01-23  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+2012-01-23  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
 * ircd/gline.c (gline_modify): Notify opers using SNO_AUTO rather
 than SNO_GLINE if a G-line had, and still has, an AUTO prefix.
 
-2011-01-19  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+2012-01-19  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
 * doc/readme.iauth: Document the new 'd' IAuth command.
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -31,7 +38,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 (iauth_cmd_soft_done): New IAuth command handler.
 (iauth_parse): Call it.
 
-2011-01-19  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+2012-01-19  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
 * ircd/s_auth.c (start_auth): Call start_dns_query() and
 start_auth_query() after start_iauth_query() rather than
diff --git a/include/.cvsignore b/include/.gitignore
similarity index 100%
rename from include/.cvsignore
rename to include/.gitignore
diff --git a/ircd/.cvsignore b/ircd/.gitignore
similarity index 96%
rename from ircd/.cvsignore
rename to ircd/.gitignore
index 5e6f631..e20d06c 100644
--- a/ircd/.cvsignore
+++ b/ircd/.gitignore
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,3 +1,4 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+*.o
 Makefile
 stamp-m
 version.c
diff --git a/ircd/test/.cvsignore b/ircd/test/.gitignore
similarity index 100%
rename from ircd/test/.cvsignore
rename to ircd/test/.gitignore
-----------------------------------------------------------------------

Summary of changes:
 .cvsignore =&amp;gt; .gitignore             |    0
 ChangeLog                            |   95 ++++++++++++++++++++++++++++++++--
 include/{.cvsignore =&amp;gt; .gitignore}   |    0
 include/IPcheck.h                    |    2 +-
 include/channel.h                    |    2 +-
 include/client.h                     |    4 +-
 ircd/{.cvsignore =&amp;gt; .gitignore}      |    1 +
 ircd/IPcheck.c                       |   20 +++++--
 ircd/crule.c                         |    4 +-
 ircd/gline.c                         |   13 ++++-
 ircd/ircd_string.c                   |    2 +
 ircd/m_gline.c                       |    8 +++
 ircd/m_nick.c                        |    4 +-
 ircd/m_server.c                      |    2 +-
 ircd/m_who.c                         |    9 ++--
 ircd/s_auth.c                        |    4 +-
 ircd/s_err.c                         |    2 +-
 ircd/s_misc.c                        |    2 +-
 ircd/s_stats.c                       |   13 +++--
 ircd/s_user.c                        |    3 +
 ircd/test/{.cvsignore =&amp;gt; .gitignore} |    0
 21 files changed, 156 insertions(+), 34 deletions(-)
 rename .cvsignore =&amp;gt; .gitignore (100%)
 rename include/{.cvsignore =&amp;gt; .gitignore} (100%)
 rename ircd/{.cvsignore =&amp;gt; .gitignore} (96%)
 rename ircd/test/{.cvsignore =&amp;gt; .gitignore} (100%)


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Entrope</dc:creator>
    <dc:date>2012-11-30T02:48:37</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/505">
    <title>[SCM] Undernet IRC Server Source Code. annotated tagu2.10.12.14 created. u2.10.12.14</title>
    <link>http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/505</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Undernet IRC Server Source Code.".

The annotated tag, u2.10.12.14 has been created
        at  16fe36bdc7152a417d53c9dc023da6a2f52aedbe (tag)
   tagging  b3e7a2bbceb4d17cdab3ce7579fcaac2aa77868d (commit)
 tagged by  Michael Poole
        on  Thu May 31 21:49:58 2012 -0400

- Log -----------------------------------------------------------------
ircu2 version u2.10.12.14

(no author) (2):
      Standard project directories initialized by cvs2svn.
      This commit was manufactured by cvs2svn to create branch

Alex Badea (29):
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Author: Gavin Grieve &amp;lt;ggrieve&amp;lt; at &amp;gt;ihug.co.nz&amp;gt; (by way of Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;)
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Author: beware &amp;lt;steendijk&amp;lt; at &amp;gt;tomaatnet.nl&amp;gt; &amp;amp;&amp;amp; Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Author: beware &amp;lt;steendijk&amp;lt; at &amp;gt;tomaatnet.nl&amp;gt;
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Author: Jean-Edouard Babin &amp;lt;Jeb&amp;lt; at &amp;gt;jeb.com.fr&amp;gt; (by way of Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;)
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Author: Alex Badea &amp;lt;decampos&amp;lt; at &amp;gt;users.sourceforge.net&amp;gt;
      Author: Alex Badea &amp;lt;vamposdecampos&amp;lt; at &amp;gt;gmail.com&amp;gt;
      Author: Alex Badea &amp;lt;vamposdecampos&amp;lt; at &amp;gt;gmail.com&amp;gt;
      Author: Alex Badea &amp;lt;vamposdecampos&amp;lt; at &amp;gt;gmail.com&amp;gt;
      Author: Diane Bruce &amp;lt;db&amp;lt; at &amp;gt;db.net&amp;gt; (by way of Vampire- &amp;lt;vamposdecampos&amp;lt; at &amp;gt;gmail.com&amp;gt;)
      Author: Alex Badea &amp;lt;vamposdecampos&amp;lt; at &amp;gt;gmail.com&amp;gt;
      Author: Alex Badea &amp;lt;vamposdecampos&amp;lt; at &amp;gt;gmail.com&amp;gt;

Andrew Miller (23):
      Author: Andrew Miller
      Author: Andrew Miller &amp;lt;a1kmm&amp;lt; at &amp;gt;mware.virtualave.net&amp;gt;
      Repository : :pserver:a1kmm&amp;lt; at &amp;gt;coder-com.undernet.org:/home/coder-com/cvs
      - Don't allow unknown clients to flood.
      - Let handshaking servers flood.
      - Added some tools to detect memory leaks.
      - Added IsConnecting() to our list of things to treat like servers.
      - Also add a ChangeLog for the last two commits, and increase the
      - Fixed a few memory related issues, mostly to do with conf handling.
      - Lets put messages from connecting links through the right handler.
      - Now server connections really work, and don't lose part of the burst
      - The general consensus was my change justified a patchlevel increase.
      - The big forward port. I probably broke lots of stuff, so please look over any
      - Forgot to commit ChangeLog.
      - Added some more .cvsignore files.
      - Changed a few %l to %ld in ircd_snprintf'd strings.
      Remove "debug only" since meminfo is no longer debug only.
      Make the resolver better able to handle unexpected record types. Also check for
      Fix a wrong error message.
      Implement tracker item #1031606(relating to wildcards in /list).
      Don't propagate local invites remotely.
      Add a changelog for the last change.
      1) strdup =&amp;gt; DupString

Bleep (63):
      This commit was generated by cvs2svn to compensate for changes in r2,
      Author: Isomer &amp;lt;perry&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: David M &amp;lt;captjay&amp;lt; at &amp;gt;superlink.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Run &amp;lt;carlo&amp;lt; at &amp;gt;alinoe.com&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author:     David M &amp;lt;captj&amp;lt; at &amp;gt;superlink.net&amp;gt;
      Author:     Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author:      Run &amp;lt;carlo&amp;lt; at &amp;gt;alinoe.com&amp;gt;
      Author: Run &amp;lt;carlo&amp;lt; at &amp;gt;alinoe.com&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Gte &amp;lt;gte&amp;lt; at &amp;gt;atomicrevs.demon.co.uk&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Maniac &amp;lt;maniac&amp;lt; at &amp;gt;cetlink.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Gte &amp;lt;gte&amp;lt; at &amp;gt;atomicrevs.demon.co.uk&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Liandrin
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Gte &amp;lt;gte&amp;lt; at &amp;gt;atomicrevs.demon.co.uk&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Poptix &amp;lt;poptix&amp;lt; at &amp;gt;unknown.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;tomh&amp;lt; at &amp;gt;inxpress.net&amp;gt;
      Author: Bleep &amp;lt;helveytw&amp;lt; at &amp;gt;home.com&amp;gt;
      Author:      Bleep &amp;lt;helveytw&amp;lt; at &amp;gt;home.com&amp;gt;
      Author:      Bleep &amp;lt;helveytw&amp;lt; at &amp;gt;home.com&amp;gt;
      Author:     Bleep &amp;lt;helveytw&amp;lt; at &amp;gt;home.com&amp;gt;
      Author:      Bleep &amp;lt;helveytw&amp;lt; at &amp;gt;home.com&amp;gt;
      Author:      Bleep &amp;lt;helveytw&amp;lt; at &amp;gt;home.com&amp;gt;
      Author:      Bleep &amp;lt;helveytw&amp;lt; at &amp;gt;home.com&amp;gt;
      Author:      Bleep &amp;lt;helveytw&amp;lt; at &amp;gt;home.com&amp;gt;
      Author:      Bleep &amp;lt;helveytw&amp;lt; at &amp;gt;home.com&amp;gt;
      Author:      Bleep &amp;lt;helveytw&amp;lt; at &amp;gt;home.com&amp;gt;
      Author:      Bleep &amp;lt;helveytw&amp;lt; at &amp;gt;home.com&amp;gt;
      Author:      Bleep &amp;lt;helveytw&amp;lt; at &amp;gt;home.com&amp;gt;
      Author:      Bleep &amp;lt;twhelvey1&amp;lt; at &amp;gt;home.com&amp;gt;

Danny Mitchell (6):
      Lets hope that I did this right :)
      Author: WT
      Author: WT
      Author: WildThang &amp;amp; Bleep
      Author: WildThang
      Author: WildThang

Greg Sikorski (10):
      Author: Gte- &amp;lt;gte&amp;lt; at &amp;gt;atomicrevs.demon.co.uk&amp;gt;
      Author: Gte &amp;lt;gte&amp;lt; at &amp;gt;atomicrevs.demon.co.uk&amp;gt;
      Author: Gte &amp;lt;gte&amp;lt; at &amp;gt;atomicrevs.demon.co.uk&amp;gt;
      Author: Gte &amp;lt;gte&amp;lt; at &amp;gt;atomicrevs.demon.co.uk&amp;gt;
      Author: Greg Sikorski &amp;lt;gte&amp;lt; at &amp;gt;atomicrevs.demon.co.uk&amp;gt;
      Author: Greg Sikorski &amp;lt;gte&amp;lt; at &amp;gt;atomicrevs.demon.co.uk&amp;gt;
      Author: Greg Sikorski &amp;lt;gte&amp;lt; at &amp;gt;atomicrevs.demon.co.uk&amp;gt;
      Author: Greg Sikorski &amp;lt;gte&amp;lt; at &amp;gt;atomicrevs.demon.co.uk&amp;gt;
      Author: Greg Sikorski &amp;lt;gte&amp;lt; at &amp;gt;atomicrevs.demon.co.uk&amp;gt;
      * ircd/os_bsd.c: Added os_set_tos for BSD users.

Jeekay (2):
      Author:Diane Bruce  &amp;lt;db&amp;lt; at &amp;gt;db.net&amp;gt;
      Missed the ChangeLog entry for the parse.c commit

Jochen Meesters (7):
      Author: beware
      Author: beware
      Author: Dianora
      Author: Spike
      Author: beware (by Spike)
      Author: netski (By Spike)
      Author: beware (by Spike)

Joseph Bongaarts (35):
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;trms.com&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;trms.com&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;trms.com&amp;gt;
      Author: Run &amp;lt;carlo&amp;lt; at &amp;gt;alinoe.com&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;trms.com&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;trms.com&amp;gt;
      Author:Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: notnet &amp;lt;net&amp;lt; at &amp;gt;astrolink.org&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: John Buttery &amp;lt;john&amp;lt; at &amp;gt;io.com&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Run &amp;lt;run&amp;lt; at &amp;gt;alinoe.com&amp;gt; By way of Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Reed Loden &amp;lt;reed&amp;lt; at &amp;gt;redmagnet.com&amp;gt; By way of Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: A1kmm &amp;lt;a1kmm&amp;lt; at &amp;gt;mware.virtualave.net&amp;gt; by way of Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Brian Cline &amp;lt;clineb&amp;lt; at &amp;gt;cs.winthrop.edu&amp;gt; By way of Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;
      Author: Ghostwolf &amp;lt;foxxe&amp;lt; at &amp;gt;wtfs.net&amp;gt;

Kevin L. Mitchell (240):
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: net &amp;lt;simms&amp;lt; at &amp;gt;LUCIDA.QC.CA&amp;gt; (by way of Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;)
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Diane Bruce &amp;lt;db&amp;lt; at &amp;gt;tfm.com&amp;gt; (by way of Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;)
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Braden &amp;lt;dbtem&amp;lt; at &amp;gt;yahoo.com&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: delete &amp;lt;delete&amp;lt; at &amp;gt;cyberabuse.org&amp;gt;
      Author: delete &amp;lt;delete&amp;lt; at &amp;gt;cyberabuse.org&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: John Buttery &amp;lt;john&amp;lt; at &amp;gt;io.com&amp;gt; (By way of Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;)
      Author: R33D33R &amp;lt;reed&amp;lt; at &amp;gt;redmagnet.com&amp;gt; (by way of Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;)
      Author: Carlo Wood &amp;lt;carlo&amp;lt; at &amp;gt;alinoe.com&amp;gt; (by way of Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;)
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt; (by way of Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;)
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Gavin Grieve &amp;lt;hektik&amp;lt; at &amp;gt;dimebox.net&amp;gt; (by way of Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;)
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      refine the list of source files a bit; include CVS version information
      let's try this again...*without* CVS substituting part of my sed lines!
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Jan Krueger &amp;lt;jast&amp;lt; at &amp;gt;heapsort.de&amp;gt; (by way of Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;)
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
      Set TOS to the value of FEAT_TOS_SERVER, not to FEAT_TOS_SERVER...
      Bump MAXBANS and MAXSILES, bump PATCHLEVEL for release
      Fix minor issue in IsLocOp() test

Michael Poole (646):
      2004-05-09  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
      2004-05-09  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
      2004-05-09  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
      2004-05-10  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
      Forward port of delayed-join.patch from Quakenet's "Asuka" patch set
      Forward port of asuka-topicburst.patch from Quakenet's "Asuka" patch
      Implement a per-connection-class default usermode option.
      Do not treat all MODEs from servers as user mode changes.
      Fix memory counting bugs for jupes and glines.
      Forward port NICKLEN feature from 2.10.11.
      Forward port IPCHECK_CLONE_LIMIT, IPCHECK_CLONE_PERIOD,
      Forward port SOCKSENDBUF, SOCKRECVBUF features from 2.10.11.
      Fix uid bug in chroot wrapper.
      Forward port IPcheck bug fixes and asserts from 2.10.11.
      Forward port /invite changes from 2.10.11.
      Forward port format string fix for m_settime.c
      Forward port USERHOST and USERIP self-visibility fixes from 2.10.11.
      Burst glines/jupes early
      Forward port change to clear invites when wiping a channel during burst
      Forward port various channel and /list updates
      Forward port 2.10.11 fixes for pre-registration client timeouts
      Forward port 2.10.11 rehash fixes.
      Forward port 2.10.11 /whois CPU limiter.
      Forward port 2.10.11 fixes for registration failures.
      Finish forward porting s_user.c changes.
      Forward port gline fixes from 2.10.11.
      On remote whois, show +s local channels with a * prefix to opers.
      Include part of Isomer's realname gline fixes that I left out of a
      Remove entirely obsolete patch files.
      Get rid of CONF_LOCOP; use PRIV_PROPAGATE instead.
      Document operator privilege settings.
      Forward port account timestamp feature from 2.10.11.
      Change default NICKLEN per CFV-0243.
      Replace privilege-controlling Feature settings with
      Remove two unused functions from res_adns.c, so that CFLAGS=-Wall
      Implement invitation announcements (RPL_ISSUEDINVITE).
      Include channel name in the status message sent to channel operators.
      Apply landonf&amp;lt; at &amp;gt;sf.net's patch for ircu to configure itself on OS X.
      Apply hikari's pluggable crypt mechanism patch
      forward port Alex Badea's gline patch from 2.10.11
      Forward port missing fixes from Kev, beware and someone else.
      Get rid of warnings about undefined crypt() and assignment in if().
      implement IAUTH client code to query a separate server before allowing
      Apply minor fixes from patches&amp;lt; at &amp;gt;, SF tracker, and others.
      Remove unused file iauth.h and elaborate on why fileio.h is needed.
      Update doc/readme.features to describe new-style conf blocks rather
      Import new (much simpler) resolver code from Hybrid.
      Fix warnings from gcc -pedantic.
      do not kick net riders if channel keys match; do kick them if they try
      clarify code and comment for previous net rider kick change
      Fixes to improve portability (especially to OS X, Solaris, OpenBSD).
      Fix "make depend" output, since a build tool erroneously set $(srcdir)
      Change tokenizer to reduce number of lexer states and be
      IPv6 support (hopefully with fewer future transition pains)
      New resolver code cleanups
      Fix an IPv6 support bug that prevents an IPv6 server from properly
      Send "XXYYY:o" instead of "XXYYY:0" for ops when oplevels are disabled.
      Fix bug in flag checking discovered by ratty
      Remove redundant and unused definitions from config.h.in.
      Fix msg_tree_parse() to not confuse 0 (the digit) with P (the letter).
      Make server blocks default to leaf.
      Set default SOCKSENDBUF and SOCKRECVBUF to SERVER_TCP_WINDOW.
      Fix buggy references to sub-expressions in grammar.
      Don't rate limit /gline messages
      Similar to Kev's patch dated 2004-08-26, allow specification of local
      Fix support for IPv4-only hosts.
      Remove unused features and their documentation.
      Implement chkconf-like option for ircd.
      Fix oplevel, chkconf and ipv6 bugs.
      Announce oplevels in CHANMODES.
      Fix CHANMODES and add CHANNELLEN, STATUSMSG to 005 message.
      Fix bug #916138 so -l doesn't gobble an argument.
      Fix GLINE logging (Bug #750927).
      Don't allow remote servers to send messages to our &amp;amp;channels (Bug #721494)
      Add new feature FEAT_HIS_WHOIS_LOCALCHAN.
      Clean up comments and channel prefix list in a test file.
      Do not allowed banned users to change a (-t) channel's topic.
      Send RPL_TRACEEND at end of trace output.
      Allow /stats to accept long names for the displayed statistics.
      Only let services (not normal opers) force a change of +A or +u.
      Consolidate duplicated code in add_listener(), and make sure
      Make default virtual host work for .12, and make IPv4-only
      Use +U instead of +u for user passwords (avoiding collisions with a
      Missed one instance of +u -- convert to +U.
      Make IAuth protocol work again and add a bit of debugging to it.
      Fix typos in example.conf feature entries.
      Make "counting" fields of ConnectionClass unsigned.
      Report configuration file name for "ircd -k".
      Fix bugs exposed by hikari's update to configure.in.
      Add Doxyfile and update .cvsignore files to ignore doxygen output.
      Doxyfile s_auth.h.
      Clean up s_auth.c in preparation for Doxygenation.
      Doxyfy s_auth.c
      Remove unused types and variables from s_bsd.h so I don't have to document them.
      Doxyfy s_bsd.c.
      Doxyfy list.h, removing the unused delist_conf() function.
      Doxyfy s_conf.h and s_conf.c.
      Doxyfy s_debug.h and s_debug.c.
      Doxyfy numeric.h and s_err.c, getting rid of the unused err_str() and
      Doxyfy s_misc.h and s_misc.c.
      Doxyfy s_numeric.c.
      Doxyfy s_serv.c.
      Doxyfy s_stats.h and s_stats.c.
      Doxyfy s_user.h and s_user.c.
      Doxyfy send.h and send.c.  Move opsarray[] declaration to send.h and
      Move check_if_ipmask() from support.* to match.*.
      Doxyfy uping.h and uping.c.
      Doxyfy userload.h and userload.c.
      Doxyfy whocmds.h and whocmds.c.
      Doxyfy whowas.h and whowas.c.
      Doxyfy struct.h.
      Doxyfy ircd_snprintf.h and ircd_snprintf.c.
      Doxyfy parse.c.
      Doxyfy ircd_reslib.h and ircd_reslib.c.
      Doxyfy res.h and ircd_res.c.
      Doxyfy ircd_log.h and ircd_log.c.
      Doxyfy match.h and match.c.
      Doxyfy gline.h and gline.c.
      Doxyfy ircd_events.h and ircd_events.c.
      Doxyfy ircd_features.h and ircd_features.c.
      Doxyfy crule.c.
      Doxyfy ircd.h and ircd.c.
      Fix wrong typename escapes to prevent doxygen auto-linking (&amp;amp; -&amp;gt; %).
      Doxyfy ircd_auth.c.
      Doxyfy ircd_string.h and ircd_string.c.
      Squash errors from doxygen (fix typos and unescaped command characters).
      Compile fixes for ircd_string.c (whoops).
      Doxyfy ircd_osdep.h and os_generic.c.
      Doxyfy msgq.h and msgq.c.
      Doxyfy IPcheck.c and fix a bug when handling IPv6 clones from the same
      Doxyfy list.h and list.c.
      Doxyfy ircd_relay.c.
      Doxyfy numnicks.h and numnicks.c.
      Doxyfy motd.h and motd.c.
      Doxyfy listener.h and listener.c.
      Doxyfy jupe.h and jupe.c.
      Doxyfy memdebug.c.
      Doxyfy opercmds.c.
      Doxyfy packet.c.
      Doxyfy querycmds.h and querycmds.c.
      Doxyfy random.h and random.c.
      Doxyfy class.h and class.c.
      Doxyfy client.h and client.c.
      Doxyfy dbuf.h and dbuf.c.
      Doxyfy destruct_event.c.
      Doxyfy engine_*.c.
      Doxyfy fileio.h and fileio.c.
      Doxyfy ircd_alloc.h and ircd_alloc.c.
      Doxyfy ircd_chattr.h.
      Doxyfy ircd_defs.h.
      Doxyfy ircd_md5.h and ircd_md5.c.
      Doxyfy ircd_reply.h and ircd_reply.c.
      Doxyfy ircd_signal.c.
      Doxyfy msg.h.
      Doxyfy hash.h and hash.c.
      Doxyfy ircd_handler.h.
      Fix typos in doxygen comment blocks.
      Remove the unused and unreferenced ircd_xopen.h.
      Add file-level doxygen comment blocks where they were missing.
      Add ChangeLog entry for all the recent doxygen commenting.
      Remove adns library from repository.
      Get rid of "Good" and "Broken" prefixes on MD5 functions.
      Adapt random.c to use ircd_md5 interface and keep a larger pool.
      Replace old hash function with one based on CRC-32.
      Fix indexing of table for new hash function.
      Forward port leaf and hub conf support; refactor and doxyfy m_server.c.
      Wipe out all modes in a wiped-out channel by default.
      Get rid of CONF_LEAF and CONF_HUB, and follow up with code cleanups.
      Add some left-out fields for RPL_STATSCLINE.
      Clean up struct Client, struct Connection, and user flags.
      Clear information leaks from one conf block to another.
      Fix use of uninitialized variable.
      Track in-progress LISTs by next hash bucket to send, rather than a
      Look up server configuration by directly connected server name.
      Get rid of the unused RPL_STATMEM and RPL_STATMEMTOT.
      Add support for CIDR-based MOTD masks.
      Simplify crule_via()'s lookup for the directly connected server name.
      Allow Client and Operator blocks to be CIDR-based.
      Convert the ban parts of struct SLink into struct Ban.
      Update names for ban flags.
      Test resolved host names against aconf-&amp;gt;host, not the (NULL) aconf-&amp;gt;name.
      Add CIDR ban support.
      Add comments explaining why we set banstr to NULL in two places.
      Fix forwarding of INVITE when FEAT_ANNOUNCE_INVITES is on.
      Fix debug level for epoll sleep delays (should be DEBUG_ENGINE).
      Fix minor error in FLAGSET_MASK definition (pointed out by froo).
      Depend on autoconf 2.50 since we use new macros like AC_LINK_IFELSE
      Add an "exception" flag to struct Ban.  (This is not to support ban
      Implement silence exceptions.
      Convert connection byte counters to 64-bit integers.
      Fix memory leaks from ircd_crypt and epoll support.
      Regenerate files built from other files.
      Assign timestamp before it might be used in exit_new_server().
      Avoid making an epoll_ctl() call that will always fail with EBADF.
      Fix resolver code when IPv6 is enabled (or at least make it capable of working).
      Ignore redundant CREATEs (fixes bug #1037963).
      Allow OPMODE to change +A and +U passwords rather than crashing.
      Remove obsolete tools/crypter script.  Allow Client blocks to
      Allow the resolver source address to be specified in the configuration.
      Add new server flag (+6) to indicate IPv6 address format support.  If
      Miscellaneous bugfixes from recent commits, and a file omitted from last commit.
      Allow TOPIC from off-channel services.  Preserve user's visibility in
      Fix typo in previous commit.
      Make UWorld servers work when not directly connected to them.  Fix a
      Fix bugs and memory leaks in ban management.
      Fix thinko that should have been obvious.
      Remove kqueue assertion that is violated whenever a local client disconnects.
      Fix another typo that should have been obvious.
      Add missing "break;" when setting FLAG_ACCOUNT on a user.
      Move unreg, privs, capab and active fields from struct Client to struct Connection.
      Convert irc_in_addr_* to macros.  Add test program for that code.  Fix
      Eliminate use of TRUE and FALSE and functions from &amp;lt;arpa/inet.h&amp;gt;.
      Add ChangeLog entry for last commit (oops!)
      Remove unused macros and #include &amp;lt;arpa/inet.h&amp;gt;s.
      Improve support for IPv4 vs IPv6 virtual hosts (fixes SF bugs #1087699, #1087668).
      Fix an infinite loop in ircd.c and skip clone checking for 0.0.0.0 clients.
      Update .cvsignore and Makefile dependencies.
      Fix automatic outbound connections (again; hopefully for good).
      Improve Doxygen documentation on zombies.  Re-insert documentation of LOG feature.
      Update RELEASE.NOTES for ircu2.10.12.
      More RELEASE.NOTES updates; add missing feature docs; +U typo fix.
      More RELEASE.NOTES updates and operator privilege documentation.
      Add timestamps to S&amp;lt;-&amp;gt;S INVITE messages and use them.
      Changes to fix the compile for FreeBSD 5.3.
      Fix ircd/test/Makefile for BSD.
      Fix typos and kqueue() engine.
      Fail earlier if no lex or yacc is found; fix resolver DNS bug.
      Configuration fixes.  Repair automatic outbound connects.
      Fix error in MyCalloc definition; memdebug compile fixes.
      Clean up redundant portions of Makefile install rules.
      Prevent "GLINE +test", "GLINE +test" from creating duplicate G-lines.
      Always initialize MOTD hostmask pointer.
      Fix a resolver crash and an v4-compatible address parsing crash.
      Warn on $YACC configure-time failure, rather than error out.
      Fix /stats U and TOS settings for outbound server connects.
      Fix an IPcheck registry bug for IPv4 clients and a crash bug in /silence.
      Make Client blocks more forgiving and fix a bug in Kill reason parsing.
      Fix another SILENCE crash.
      Put 0 before addresses like ::1 in "STATS c" and "STATS i".
      Fix handling of invalid IPs in Client blocks; pretty up /stats i.
      Make PRIV_LIST_CHAN work as it should (affecting LIST, not WHOIS, NAMES, etc).
      Fix comment's descrption of "whox" privilege.
      Define a privilege (off by default) that allows opers to use OPMODE
      Add '6' to server options when compiled with IPv6 support (and related
      Fix buglet in yesterday's handling of "*" as an IP mask.
      Fix crash when /oper operator badpass.  Fix comment explaining the
      Avoid syntax error when importing leaf servers from an old config.
      Add assertions to try to catch IPcheck counting errors.
      Properly preserve empty +A channels.
      Fix the "mode.mode &amp;amp; MODE_APASS" vs "mode.apass[0]" bug another place.
      Remove unused files.  Update snomask.html documentation.
      Fix typos in various comments.
      Fix typos in comments and strings to reduce future slumming for credit.
      Avoid spurious kqueue() engine warnings.
      Fix DNS-related timer assertion failure.
      Give credit where credit is due for the timer fix.
      Fix previous DNS fix; make BURST lines shorter again.
      Revert to earlier version of the DNS timeout fix.
      Remove limit and keys when a channel is wiped out during burst.
      Propagate +6 flag across network.  Show correct error when outbound connections fail.
      Avoid sending numeric oplevels when forwarding a -A channel's burst.
      Reed Loden's patch to add /stats J, listing nick jupes.  (Plus documentation.)
      Remove redundant check for being banned in ms_part().
      Alphabetize HIS_STATS_? features, but remove HIS_STATS_h.
      Fix Doxygen comment typo; clarify username handling.
      Return accurate privilege information for remote opers.
      Allow flagging of pseudo-commands as "fast".
      Make CAP handling comply with draft-mitchell-irc-capabilities-02.xml.
      Update Jupe block in example.conf for CFV-0255.
      Add configure-time option to set optimization level.
      Regenerate configure for the last commit to configure.in.
      Remove unet_PIPE_CFLAGS macro.
      Regenerate aclocal.m4 and configure to match acinclude.m4 and configure.in changes.
      Make Client block passwords work again (reported by Reed).
      Split RPL_APASSWARN and ERR_NOTMANAGER into multiple messages to avoid
      Clear channel manager bit when wiping out local chanops in a burst.
      Add option to debug Client block selections.  Fix related buglet in
      Fix bugs spotted in beta testing: Quarantine blocks not working or
      Fix /rehash memory leaks and realname Kill blocks.
      Correctly match users against new IP-based G-lines.
      Make realname Kill blocks more predictable, and add username="x" field.
      Update linesync for 2.10.12 config syntax.
      Improve screening for invalid input to linesync.
      Fix ability to kick and deop users on -A channels when OPLEVELS enabled.
      Avoid intepreting non-IP-based hostmasks as IP-based.
      Fix typos in match.c and m_whowas.c; add Kill checking for "ircd -k -c ..."
      Make --enable-profile work (subject to the compiler's limits).
      Regenerate configure because of last commit.
      Fix IPv4-based /who and update "ircd -?" usage text.
      Fix silence bugs found by coekie and ban application bug found by xplora.
      Add missing }; in example Kill block (spotted by `Beee).
      Allow more than one _functioning_ name= in a UWorld block.
      Fix sporadic spurious (and mysterious) config file parsing failures.
      Fix memory leaks when removing bans or applying overlapped bans.
      Make certain parse error messages more useful.
      Add autoconnect option for Connect block.
      Fix core when oper /whowas's non-+x user.
      Ignore invalid or nonsensical bits in default usermodes.
      Quash lexer warning.
      Properly handle classes with no "usermodes" option; count always-invisible users.
      Report non-existent class names as configuration errors earlier.
      Fix several bugs in iauth code.
      Fix more IAuth bugs and add IAUTH log target.
      Prohibit same +A and +U pass; fix IAuth crash (#1193808), invite
      Fix a crash in /stats i &amp;lt;server&amp;gt; &amp;lt;mask&amp;gt;.
      Remap oplevel numeric range.
      Give users who join a +AU channel using the user pass level 1 ops.
      Do not spuriously promote remote users to global operator status.
      Fix base64toip() bugs (PR#1197043).
      Apply patches #1197032, #1194116.
      Revert mode source when opping a user on channel creation (bug #1197510).
      Use v4compat addresses when !defined(IPV6).
      Add some automated test scripts and fix bugs exposed by them.
      Avoid sending MODE +o to local channel creator, and more code coverage.
      Simplify CFLAGS handling in configure and expose crypt() on NetBSD
      Regenerate configure script
      Add debugging statements to IPcheck.
      Fix the dereference of a free()'d struct in m_endburst.c.
      Reduce number of branches in register_user().
      Reflect local vs global status in output of "/stats o".
      Correctly match globs that end in escaped wildcards.
      Show LIST_CHAN privilege, count User structs better, text: line-&amp;gt;block.
      Numeric reply bug fixes and cleanup.
      Remove unused code and variables.
      Report memory used by listener structures.
      Add new test scripts and generally improve code coverage of tests.
      Reject strings containing '?' as not being IP masks.
      Fix some memory counting buglets.
      Add missing header to ircd_string.h; add debug logging to test scripts.
      Make struct Ban monolithic and improve memory statistics counting.
      "/stats z" formatting tweaks.
      Remove the unused (and deceptively named) get_sockhost().
      Rewrite DNS lookup API to remove a memory leak and keep it from coming back.
      Never count servers in IPcheck.
      Add a C version of the configuration file converter.
      Localize FD_SETSIZE manipulation to engine_select.c.
      Add CHANNELLEN feature, analogous to NICKLEN feature.
      Don't spam the network with local-interest protocol violations.
      Disable/undocument CAP, remove USE_POLL comment in select() engine.
      Make ircd.conf accept "*" as vhost like .11 did.  Fix comment in channel.c.
      Use HIS_SERVERNAME instead of cli_name(&amp;amp;me) for a variety of
      Update oplevels appropriately on +A/-A.
      Fix bug introduced to /whois yesterday.
      Fix HIS_SERVER* handling when they are defaulted.
      Update documentation to reflect impending release.
      Check a few possibilities for socklen_t (fixes SF#1236456).
      Regenerate configure from previous commit.
      Fix the irregular IP ban bug harder.
      Cosmetic changes to banning bare IPv6 addresses and kicking +D-hidden users.
      Minor code and output cleanups for the week of 2005-08-15.
      Switch more uses of &amp;amp;me to &amp;amp;his for channel localcasts.
      Avoid overwriting part of a server-set ban's banstr field.
      Convert a &amp;amp;me to &amp;amp;his in ms_kick().
      Convert a &amp;amp;me to &amp;amp;his in do_settopic().
      Substitute HIS_SERVERNAME in KILLs; fix SF bug #1263777.
      Fix bugs in rehashing pseudo commands and in kill handling.
      Bump patchlevel; add more epoll support; assertion check in
      Mention epoll event engine in "ircd -v" output.
      Accept +A/+U from servers regardless of FEAT_OPLEVELS.
      Silence channel manager once Apass set; fix /stats y links count.
      Fix previous commit (off-by-one in wrong direction).
      The last class link-count tweaks for the night.  I promise.
      Use SetOpLevel() to set oplevels; give oplevel 1 when op are hacked.
      Make keys and passwords behave more uniformly.
      Document +D and +d channel modes in release notes.
      Make references to channel password lengths consistent.
      Rework JOIN handler to make keys, apass, and upass consistent.
      Whoops, missed a case here.  Fix.
      Further reorganize and streamline join handling.
      Remove bits of old and dead code from gline handling.
      Fix IP mask parsing some more (hopefully for good).
      Be more conservative when handling empty keys.
      Fix previous commit and parsing of ipmasks like 127/8.
      Check client hostnames against ban masks more rigorously.
      Fix bug in last commit to find_ban().
      Rip out clean_channelname() and reject invalid names where appropriate.
      Fix another miscomparison in find_ban().
      Increment patchlevel to reflect the pre-release code freeze.
      Document the branching scheme for 2.10.12.
      Regenerate "make depend" dependencies.
      Fix bug #1299105 (overzealous IPv4 G-line checking).
      Fix bug #1298149 and a similar desynch for channel keys.
      Support showing join-delayed users in /WHO output.
      Fix desync when an oplevel deop is bounced (#1298140).
      Fix pseudo handling on rehash (#1305452).
      Fix uninitialized variable warning about 'chan'.
      Use correct oplevel when bouncing a chanop being kicked.
      Bump patchlevel on release branch.
      Properly match against accounts when searching users.
      Bump patchlevel and fix init_class() dropping configured classes.
      Only send remote KICK to users if target is not join-delayed.
      Do not leak connection class structures after they are removed from ircd.conf.
      Fix setting of FLAG_DOID and buglet from last commit.
      Properly support /names -D #channel server.*.
      Handle join requests for too-long channel names.
      Forward port patch from 2.10.11 (reported by Reed).
      Add a flag to /stats that makes a /stats available to local opers.
      Make os_get_rusage() conditional on DEBUGMODE.
      Fix default privileges for global opers.
      Bump patchlevel for release of ircu2.10.12.01.
      Tweak readme.cvs to make it easier to find the update's tag.
      Bump patchlevel for 2.10.12pre02.
      Bump patchlevel for 2.10.12*pre*02.
      Update .cvsignore files.
      Fix walk_lchan joins when channel key is OVERRIDE.
      Make empty -A channels into zombies ("zannels") to avoid +A hijacks.
      Do not send MODE_WASDELJOINS changes to remote servers.
      Allow oplevel 999 to kick and deop other oplevel 999, making Apass
      Allow a (single) CNAME follow when doing A and AAAA lookups.
      Update patchlevel for 2.10.12.02 release.
      Bump patchlevel for pre03 development.
      Fix bugs relating to joining zannels for a quick release.
      Bump patchlevel for 2.10.12.pre04.
      Fix test for whether a client's own server is kicking him.
      Limit nick changes when speaking is limited.
      Make DESTRUCT crossing CREATE or BURST not send a BURST.
      Always allow remote users to send to a channel.
      Fix revealing of remote users when they send to a channel.
      Stop sending nicknames as the first argument to KILL.
      Fix handling of NAMES #a,#b.
      Delete obsolete convert-conf.py.
      Add ZANNELS feature; tweak recreate after bogus DESTRUCT.
      Document ZANNELS feature (and more fully document OPLEVELS).
      Add HIS_MODEWHO feature.
      Update patchlevel for 2.10.12.04 release.
      Update patchlevel for pre05.
      Fix buglet in Feature section and print original input F: lines.
      Display IPv6 support flag with the other per-server flags.
      Count a join to a new channel as a target change.
      Update dependencies for version.c.
      Minor config file fixes (example, conversion, and error reporting).
      Fix a possible net ride.
      Fix build on Solaris 10.
      Regenerate files derived from configure.in (revision 1.34.2.1).
      Update config.* files to recognize new targets.
      Fix portability problems in ircd-patch script.
      Backport convert-conf fix from head; remove bogus /dev/poll assertion.
      Fix config conversion bugs (functional and documentation).
      Fix display of absent passwords during "ircd -k -c ....".
      Fix topic bursting for +t channels; update TOPIC command's dox comments.
      Fix bug #1394480 (WHOWAS missing printf argument for real IP).
      Do not try to destroy a channel's nonexistent destruct event.
      Send channel TS when sending an on-join op for a user.
      Completely wipe out inappropriately resurrected channels.
      Do not send JOIN for zombies given ops or voice.
      Recognize ZANNELS feature for compatibility.
      Do not send +r usermode to auth-on-connect users.
      Minor Solaris build tweaks: VPATH, example.conf, warning.
      Update files for 2.10.12.05 release.
      Update patchlevel to 2.10.12.pre06.
      Remove self-op code for Apass/Upass joins.
      Scan all Connect blocks for next auto-reconnect time.
      Fix backtracking bug in matching after an escape.
      Add os_socketpair() function; clean up blocking tests.
      Add infrastructure to handle child processes exiting.
      Fix display with %hu format.
      Implement a progressive iauth system.
      Handle NXDOMAIN DNS errors.
      Fix some other bugs when IAuth is not enabled.
      Reject broad silences to make it harder to deduce someone's IP.
      Fix /uping on IPv6-enabled FreeBSD builds (#1435373).
      Avoid needless server panics when BUFFERPOOL is configured too small
      Apply coekie's patch for bug #1428190.
      Avoid unwanted races for mode handling during burst processing.
      Fix bug #1444405 by allowing other servers to overwrite keys and Upass.
      Do not convert F:FEATURENAME to "FEATURENAME" = ;
      Resolve bug #1457429.
      Update iauth-test script to match the documented iauth protocol.
      Allow both *!*&amp;lt; at &amp;gt;1.2.3.* and *!*&amp;lt; at &amp;gt;1.2.3.0/22 to be banned at the same time.
      Update patchlevel.h for 2.10.12.06 release.
      Update patchlevel for pre07.
      Fix documentation cruft and typo.
      Use SIZEOF_LONG_LONG instead of HAVE_LONG_LONG.
      Fix an assertion failure when client endpoint name lookup fails.
      Fix Admin block documentation and behavior (SF bug#1477672).
      Fix new auth system timeout bugs (SF bug#1469462).
      Fix client password checks when iauth is disabled.
      Avoid doing needless work for unregistered client PONGs.
      Revert last change -- read_packet() makes it fail.
      Do not let ident or DNS timeouts kill a client.
      Give iauth its full share of time to respond.
      Avoid repeating PONG handling that may already have been done.
      Mention per-Connect block "vhost" option.
      Fix months in three ChangeLog entries.
      Only check passwords on user ports.
      Install convert-conf utility under ${prefix}.
      Fix error causing misbehavior when client never sends anything.
      Fix assertion failures and other misbehaviors in new auth code.
      Comment updates and /stats response fixups.
      Clear "DNS request pending" flag when aborting a DNS lookup.
      Fix ping timeout handling for outbound server connections.
      Allow ircd.conf to control the list_chan privilege.
      Make /stats g slightly more informative.
      Allow (but ignore) additional arguments in server GLINE messages.
      Fix /whois handling of secret local channels for locops.
      Fix bug in PASS handling.
      Bump patchlevel for u2.10.12.07 release.
      Bump patchlevel for u2.10.12.08 development.
      Fix two authorization stage memory leaks.
      Fix inverted test in previous commit.
      Fix a minor memory leak when iauth is configured.
      Do not leak AuthRequest structs for clients who fail registration.
      Bump patchlevel for 2.10.12.08 release.
      Bump patchlevel for pre09 development.
      Fix doxygen comment typo.
      Report two kinds of configuration file bugs.
      Fix convert-conf for H: lines without C: lines.
      Allow -A channels to have oplevels as well.  Allow showing oplevels in /who.
      Do not list version.c in itself.
      Do not accept NICK on server ports.
      Convert listeners to use a flagset in preparation for IPv4/IPv6 selection.
      Allow per-port specification of address family, and use separate
      Show socket families in /stats p.
      Fix privilege check for juping servers.
      Document "/WHO #channel d" to include join-delayed users.
      Generate hidden hostname appropriately for bursted users with timestamped accounts.
      Add channel name to PV message for redundant CREATE.
      Properly handle member modes like XXYYY:ov in bursts.
      Merge end-of-December changes from HEAD to u2_10_12_branch.
      Add ChangeLog message for a file accidentally included in the last commit.
      Pass the other two USER parameters to iauth.
      Bump patchlevel for 2.10.12.09 release.
      Bump patchlevel to pre10.
      A rather belated happy new year!
      Limit ISUPPORT to 16 total items per line.
      Update INSTALL file for 2.10.12.
      Life would be interesting if we accepted host&amp;lt; at &amp;gt;ip syntax.. but we don't.
      Add test framework, with no scripts yet.
      Fix SF bug #1640796; add a test for it.
      Avoid improper reuse of a va_list.
      Author: Jeannot Langlois
      Allow specification of DNS vhost and server in ircd.conf.
      Make IPv4-only sockaddr_from_irc() work properly.
      Fix ipbuf size in count_users().
      Update tests/ircd*.conf so that irc.example.net is a hub for two other servers.
      Fix SourceForge bug #1674539, and add a test for it.
      Bump PATCHLEVEL for u2.10.12.10 release.
      Bump PATCHLEVEL for pre11 development.
      Fix maxlinks=0 in find_conf_exact(), so /oper to such a class works.
      Warn when using -x with a non-DEBUGMODE ircd.
      Clarify example.conf maxlinks, example Class blocks and Operator password.
      Do not leave core files on "umkpasswd --help".
      Avoid extra decrements of links.inuse.
      Allow multiple host entries in Operator and Motd blocks.
      Do not try to listen on (corrupt) IPv4 versions of IPv6 native addresses.
      Allow multiple server entries in a CRule and multiple vhosts in a Port.
      Properly quote m4 function/macro names when defining them.
      Fix documentation for iauth I command.
      Fix listener address for Port blocks with no host listed.
      Do not try twice to process silences that were both added and deleted.
      Check for missing parameters to iauth messages (SF bug#1685648).
      Only check /stats subcommands with STAT_FLAG_LOCONLY on the hunted server.
      Add new line to ASLL output to resolve SF bug #1687382.
      Avoid triggering warnings about strict-aliasing violations.
      Move some permission checks from set_user_mode() to its callers.
      Allow clients and iauth to request usermodes during registration.
      Fix on-connect host hiding for users with IAuth account stamps.
      Fix resolver after /rehash with no "dns server" directives.
      Correctly free members of the iauth string list.
      Fix bugs reported in SF#1691357.
      Fix SF#1696425 by failing configure if MAXCONNECTIONS is too small.
      Fix SF#1696437 by prohibiting not-all-alphabetic pseudo commands.
      Fix SF#1701346 by taking weibe's suggestion action (making SETTIME consistent with all other oper commands).
      Fix SF#1701350 by taking weibe's suggestion action (reporting insufficient privileges).
      Fix SF#1701361 by taking one of weibe's suggestion actions (adding %s to ERR_DONTCHEAT).
      Fix SF#1704419 by properly hiding hidden ports.
      Fix SF#1704424 by sending ERR_NOSUCHNICK as wiebe suggests.
      Fix SF#1704458 by sending a protocol violation on the input in question.
      Fix SF#1706004 by reporting the new value after /set and /reset.
      Fix SF#1706014 by not giving in-burst servers special lenience.
      Complain to the client when it sends a line that is too long.
      Fix confusion over whether 0.0.0.0-like addresses are IPv4.
      Remove duplicate end-of-stats replies for /stats iauth and /stats iauthconf.
      Get rid of ms_names(); clean up m_names() to be more uniform.
      Quash an initializer warning in the initial user-mode array.
      At paulr's suggestion, make WHO and WHOIS more similar w.r.t. ERR_QUERYTOOLONG.
      Move whisper()'s away message checking to the cprivmsg path.
      Consistently rebuild version.c; optimize how it is generated.
      Properly handle removing and adding a key in the same command.
      Do not include unregistered +i clients in /lusers's invisible count.
      Match 127.*.*.* masks against IPs in the usually expected manner.
      Clean up sendwallto_group_butone() macro usage.
      Fix dependencies for generating version.h.
      Clean up / regularize parts of m*_gline().
      Require force for many-victim realname G-lines; clean up gline.c.
      Convert lexer to read using fileio.[ch] functions (thanks, Solaris!).
      Fix a few bugs that made LIST work confusingly with T and C qualifiers.
      Support /LIST M to show modes in channels (using the list_chan privilege).
      Avoid a warning about signedness mismatch in umkpasswd.
      Handle iauth stderr EOF events like iauth stdout EOF events.
      Make "/stats flag server param" work as intended again.
      Show users on second (and later) lines of RPL_NAMREPLY correctly.
      Once again allow MODE #channel -b+b *!*&amp;lt; at &amp;gt;*.example.com *!*&amp;lt; at &amp;gt;*.foo.example.com
      Update test scripts to run properly with newer POE; add test for SF#1840011.
      Bump PATCHLEVEL for u2.10.12.11 release.
      Bump PATCHLEVEL for u2.10.12.pre12 development.
      Through the dubious magic of autoconf, install man files in the proper directory.
      Bump PATCHLEVEL for .12 release.
      Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
      Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
      Do not accept strings like 0.0.0.0.0 as IP masks.
      Fix an error in backtracking (apparently exacerbated by escapes).
      Update the match() unit test to catch buffer over-reads.
      Properly handle net rider kicks that are received after a normal kick for the same user.
      Author: Entrope &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
      Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
      Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
      Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
      Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
      Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
      Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
      Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
      Forward port a patch by Dianora to add rudimentary spam bot detection to ircu.
      Optimize order of checks in if() to minimize calls to match_it().
      Fix SourceForge bug #1706672.
      Fix SourceForge bug #1722030.
      Unconditionally set +6 flag on self.
      Attempt to fix SF bug #2568366 (sending JOIN before hitting a target limit).
      Fix SF bug #2694761 (iauth class assignment did not work correctly).
      Fix SF bug #2596914 (/mode +v nick:level gives oplevel).
      Fix SF bug #2721107 (Gline lifetime changes from servers change the reason.)
      Remove errant \ from previous commit.  (Whoops!)
      Fix SourceForge bug #2816618 (default user modes in connection class do not work).
      Fix usermodes harder when they are set early during registration.
      Provide /stats F to report even defaulted feature values.
      Make OPMODE ignore ban count and length checks.
      Improve the clean-up of outdated IAuth instances on rehash (SF bug #2789656).
      Fix the build for the new xquery files.
      Fix SF bug #2793176 by making sure check_loop_and_lh() returns non-1 when it kills a server.
      Fix SF bug #2803888 by checking for conversion between +D and +d on every mode buffer flush.
      Fix SF bug #2895252 by changing the trailing space to a nul character.
      Fix SF bug #2852954 by removing the spurious assertion.
      Attempt to fix SF bug #2874316 by invalidating a file descriptor that the system claims is bad.
      Revert the accidental commit to list.c, and commit the correct file (s_bsd.c).
      Fix SourceForge bug #2789732 by discarding pending events for deleted sockets.
      Fix oplevel handling in bursts, fixing SF bugs #2596869 and #2597518.
      If a server sends us a new, expired G-line, create it deactivated (fixes SF #2840365).
      Restrict the visibility of /silence lists (fixing SF #2701725).
      Accept topic changes from servers that do not send topic-set timestamps (fixes SF #2897520).
      Delete the outdated man pages in doc/, and the libs/ directory.
      Revert r1340 (it was apparently always buggy).
      Bump patch level to u2.10.12.13-rc2.
      Fix compilation problems when _SC_PAGE_SIZE is not defined by the OS.
      Clarify the link rejection message for unauthorized hubs.
      Treat G-line-related times as network times, rather than local times.
      When IAuth provides creation timestamp, exclude it from the name.

Perry Lorier (104):
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Perry Lorier &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Perry Lorier &amp;lt;Isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Perry Lorier &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Perry Lorier &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: ZenShadow &amp;lt;grep&amp;lt; at &amp;gt;doyle.net&amp;gt;
      Author: Isomer / ZenShadow
      Author: Isomer / ZenShadow
      Author: ZenShadow
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;Isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: net &amp;lt;simms&amp;lt; at &amp;gt;LUCIDA.QC.CA&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;perry&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author:  Patrick Desbiens &amp;lt;delete&amp;lt; at &amp;gt;dovation.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: jv &amp;lt;unknown&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: mbuna &amp;lt;mbuna&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Vampire- &amp;lt;unknown&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;Isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;
      Author: Carlo Wood &amp;lt;run&amp;lt; at &amp;gt;alinoe.com&amp;gt; (Via Isomer &amp;lt;isomer&amp;lt; at &amp;gt;undernet.org&amp;gt;)
      Author: Carlo Wood (Via Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;)
      Author: Carlo Wood (via Isomer &amp;lt;isomer&amp;lt; at &amp;gt;coders.net&amp;gt;)
      Author: Carlo Wood &amp;lt;run&amp;lt; at &amp;gt;alinoe.com&amp;gt;
      Author: Carlo Wood (run&amp;lt; at &amp;gt;alinoe.com&amp;gt; (Via Isomer&amp;gt;
      Author: LordLuke &amp;lt;lordluke&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: LordLuke &amp;lt;lordluke&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Reed L.  &amp;lt;reed&amp;lt; at &amp;gt;redmagnet.com&amp;gt;
      Author: Andres Miller &amp;lt;a1kmm&amp;lt; at &amp;gt;mware.virtualave.net&amp;gt;
      Author: A1kmm
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Added vampires Lazy Link patches, and uh, where'd the template go?
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Author: Alex Badea &amp;lt;vampire&amp;lt; at &amp;gt;p16.pub.ro&amp;gt;
      Author: Jeekay &amp;lt;jeekay&amp;lt; at &amp;gt;irc.planetarion.com&amp;gt;
      Author:  Jeekay  &amp;lt;jeekay&amp;lt; at &amp;gt;irc.planetarion.com&amp;gt;
      Author: Unknown
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Isomer &amp;lt;Isomer&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Perry Lorier &amp;lt;isomer&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Perry Lorier &amp;lt;isomer&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Perry Lorier &amp;lt;isomer&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Perry Lorier &amp;lt;isomer&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Isomer &amp;lt;Isomer&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Perry Lorier &amp;lt;isomer&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Perry Lorier &amp;lt;isomer&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: Isomer &amp;lt;isomer&amp;lt; at &amp;gt;undernet.org&amp;gt;

Stephane Thiell (2):
      Author: Stephane Thiell &amp;lt;mbuna&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: beware &amp;lt;steendijk&amp;lt; at &amp;gt;tomaatnet.nl&amp;gt; (by way of mbuna &amp;lt;mbuna&amp;lt; at &amp;gt;undernet.org&amp;gt;)

Thomas Helvey (6):
      Remove HEAD_IN_SAND macros, rebuild dependencies
      Removed resolver cache, cleanup client code
      fix coredump in feature lookup code
      Cleanup code so it builds with C++ again
      Author: Thomas Helvey &amp;lt;tom.helvey&amp;lt; at &amp;gt;cox.net&amp;gt; Message: Add hasher, fix bugster
      Author: Bleep &amp;lt;tom.helvey&amp;lt; at &amp;gt;cox.net&amp;gt;

hikari (10):
      Author: Fredrik Soderblom &amp;lt;froo&amp;lt; at &amp;gt;quakenet.org&amp;gt; via hikari
      Author: hikari &amp;lt;shadow&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: hikari &amp;lt;shadow&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: hikari &amp;lt;hikari&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: hikari &amp;lt;hikari&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: hikari &amp;lt;hikari&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: hikari &amp;lt;hikari&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: hikari &amp;lt;hikari&amp;lt; at &amp;gt;undernet.org&amp;gt;
      Author: hikari &amp;lt;hikari&amp;lt; at &amp;gt;hikari.org.uk&amp;gt;
      Author: hikari &amp;lt;hikari&amp;lt; at &amp;gt;undernet.org&amp;gt;

-----------------------------------------------------------------------


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Entrope</dc:creator>
    <dc:date>2012-06-01T01:50:45</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/504">
    <title>[SCM] Undernet IRC Server Source Code. tag u2.10.11.07created. b1a7f14aa49ce9bda8e91c917d8676aa4072e8fb</title>
    <link>http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/504</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Undernet IRC Server Source Code.".

The tag, u2.10.11.07 has been created
        at  b1a7f14aa49ce9bda8e91c917d8676aa4072e8fb (commit)

- Log -----------------------------------------------------------------
commit b1a7f14aa49ce9bda8e91c917d8676aa4072e8fb
Author: Kevin Mitchell &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
Date:   Mon Sep 13 18:54:35 2004 +0000

    Author: Kev &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
    Log message:
    
    Bah, couple of documentation changes...
    
    
    git-svn-id: https://undernet-ircu.svn.sourceforge.net/svnroot/undernet-ircu/ircu2/branches/u2_10_11_07&amp;lt; at &amp;gt;1140 c9e4aea6-c8fd-4c43-8297-357d70d61c8c
-----------------------------------------------------------------------


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Entrope</dc:creator>
    <dc:date>2012-06-01T01:50:42</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/503">
    <title>[SCM] Undernet IRC Server Source Code. branch pclientcreated. 1c128471f5f275fe2c0b181e25df59f8a54797b8</title>
    <link>http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/503</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Undernet IRC Server Source Code.".

The branch, pclient has been created
        at  1c128471f5f275fe2c0b181e25df59f8a54797b8 (commit)

- Log -----------------------------------------------------------------
commit 1c128471f5f275fe2c0b181e25df59f8a54797b8
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Wed Jan 25 22:45:47 2012 -0500

    Add missing #include lines for m_{un,}zombie.c.
    
    This is necessary to get the declaration for {un,}zombie_client().

diff --git a/ircd/m_unzombie.c b/ircd/m_unzombie.c
index 12e0550..32adefa 100644
--- a/ircd/m_unzombie.c
+++ b/ircd/m_unzombie.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -32,6 +32,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #include "msg.h"
 #include "numnicks.h"
 #include "s_debug.h"
+#include "s_misc.h"
 #include "s_user.h"
 #include "send.h"
 
diff --git a/ircd/m_zombie.c b/ircd/m_zombie.c
index 3fe4c98..cd4b26d 100644
--- a/ircd/m_zombie.c
+++ b/ircd/m_zombie.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -32,6 +32,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #include "msg.h"
 #include "numnicks.h"
 #include "s_debug.h"
+#include "s_misc.h"
 #include "s_user.h"
 #include "send.h"
 
commit 9412dbaac7863c35650ba7862da88a5df9a61896
Author: Jan KrÃ¼ger &amp;lt;jk&amp;lt; at &amp;gt;jk.gs&amp;gt;
Date:   Tue May 10 03:54:50 2011 +0200

    Test code for zombie feature
    
    Not for production use.
    
    Use /quit ZOMBIE to zombiefy your current client.
    
    Use /quit UNZOMBIE to attempt to reattach to a client with nick 'jast'.

diff --git a/ircd/m_quit.c b/ircd/m_quit.c
index 9ccc361..8b4db6a 100644
--- a/ircd/m_quit.c
+++ b/ircd/m_quit.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -90,6 +90,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #include "s_misc.h"
 #include "ircd_reply.h"
 
+#include "hash.h"
+
 /* #include &amp;lt;assert.h&amp;gt; -- Now using assert in ircd_log.h */
 #include &amp;lt;string.h&amp;gt;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -105,6 +107,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int m_quit(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
   assert(0 != sptr);
   assert(cptr == sptr);
 
+  if (!strcmp(parv[parc - 1], "ZOMBIE")) {
+    zombie_client(&amp;amp;me, &amp;amp;me, sptr);
+    return 0;
+  }
+  if (!strcmp(parv[parc - 1], "UNZOMBIE")) {
+    struct Client *victim = FindUser("jast");
+    if (victim) {
+      unzombie_client(&amp;amp;me, &amp;amp;me, sptr, victim);
+      return 0;
+    }
+  }
+
   if (cli_user(sptr)) {
     struct Membership* chan;
     for (chan = cli_user(sptr)-&amp;gt;channel; chan; chan = chan-&amp;gt;next_channel) {
commit dfec9980b8826328f7d3fee4fa0e0d8c732483cd
Author: Jan KrÃ¼ger &amp;lt;jk&amp;lt; at &amp;gt;jk.gs&amp;gt;
Date:   Tue May 10 22:29:34 2011 +0200

    Implement initial support for zombie mode
    
    This allows users to regain their status on the network after a ping
    timeout. When a user pings out, the client structure is marked as a
    zombie (FLAG_NOTCONN). Now the user has 15 minutes to reattach to that
    client structure, using a separate Login on Connect feature.
    
    When a user turns into a zombie, a ZO token is sent across the network;
    the zombie status is reported in net bursts as the +Z umode.
    
    &amp;gt; YY ZO YYXXX
    
    When a user re-attaches, he regains all previous state information
    (except oper privileges which are cleared), but retains his current
    numnick.
    
    &amp;gt; ZZ ZU ZZQQQ YYXXX
    
    Here, ZZQQQ takes over all the state information of YYXXX.
    
    Zombie mode is designed to be completely transparent to other users in
    the sense that the user's disappearance should not be noticeable. The
    current implementation silently drops all messages addressed to the
    zombie in order to achieve this.

diff --git a/include/client.h b/include/client.h
index 26f0481..b37a64c 100644
--- a/include/client.h
+++ b/include/client.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -166,6 +166,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; enum Flag
     FLAG_DEBUG,                     /**&amp;lt; send global debug/anti-hack info */
     FLAG_ACCOUNT,                   /**&amp;lt; account name has been set */
     FLAG_HIDDENHOST,                /**&amp;lt; user's host is hidden */
+    FLAG_NOTCONN,                   /**&amp;lt; nobody is connected to this client */
     FLAG_LAST_FLAG,                 /**&amp;lt; number of flags */
     FLAG_LOCAL_UMODES = FLAG_LOCOP, /**&amp;lt; First local mode flag */
     FLAG_GLOBAL_UMODES = FLAG_OPER  /**&amp;lt; First global mode flag */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -579,6 +580,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct Client {
 #define IsAccount(x)            HasFlag(x, FLAG_ACCOUNT)
 /** Return non-zero if the client has set mode +x (hidden host). */
 #define IsHiddenHost(x)         HasFlag(x, FLAG_HIDDENHOST)
+/** Return non-zero if nobody is connected to this client structure */
+#define IsNotConn(x)            HasFlag(x, FLAG_NOTCONN)
 /** Return non-zero if the client has an active PING request. */
 #define IsPingSent(x)           HasFlag(x, FLAG_PINGSENT)
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -625,6 +628,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct Client {
 #define SetAccount(x)           SetFlag(x, FLAG_ACCOUNT)
 /** Mark a client as having mode +x (hidden host). */
 #define SetHiddenHost(x)        SetFlag(x, FLAG_HIDDENHOST)
+/** Mark a client as not having anyone connected to it */
+#define SetNotConn(x)           SetFlag(x, FLAG_NOTCONN)
 /** Mark a client as having a pending PING. */
 #define SetPingSent(x)          SetFlag(x, FLAG_PINGSENT)
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -658,6 +663,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct Client {
 #define ClearServNotice(x)      ClrFlag(x, FLAG_SERVNOTICE)
 /** Remove mode +x (hidden host) from the client. */
 #define ClearHiddenHost(x)      ClrFlag(x, FLAG_HIDDENHOST)
+/** Mark client as having someone connected to it */
+#define ClearNotConn(x)         ClrFlag(x, FLAG_NOTCONN)
 /** Clear the client's pending PING flag. */
 #define ClearPingSent(x)        ClrFlag(x, FLAG_PINGSENT)
 /** Clear the client's HUB flag. */
diff --git a/include/handlers.h b/include/handlers.h
index 1b96ee2..fc0f230 100644
--- a/include/handlers.h
+++ b/include/handlers.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -219,6 +219,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; 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*[]);
 extern int ms_trace(struct Client*, struct Client*, int, char*[]);
+extern int ms_unzombie(struct Client*, struct Client*, int, char*[]);
 extern int ms_uping(struct Client*, struct Client*, int, char*[]);
 extern int ms_version(struct Client*, struct Client*, int, char*[]);
 extern int ms_wallchops(struct Client*, struct Client*, int, char*[]);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -228,6 +229,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; extern int ms_wallvoices(struct Client*, struct Client*, int, char*[]);
 extern int ms_whois(struct Client*, struct Client*, int, char*[]);
 extern int ms_xquery(struct Client*, struct Client*, int, char*[]);
 extern int ms_xreply(struct Client*, struct Client*, int, char*[]);
+extern int ms_zombie(struct Client*, struct Client*, int, char*[]);
 
 #endif /* INCLUDED_handlers_h */
 
diff --git a/include/msg.h b/include/msg.h
index 18b5ba3..35e5893 100644
--- a/include/msg.h
+++ b/include/msg.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -336,6 +336,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct Client;
 #define TOK_ACCOUNT"AC"
 #define CMD_ACCOUNTMSG_ACCOUNT, TOK_ACCOUNT
 
+#define MSG_ZOMBIE"ZOMBIE"/* ZOMB */
+#define TOK_ZOMBIE"ZO"
+#define CMD_ZOMBIEMSG_ZOMBIE, TOK_ZOMBIE
+
+#define MSG_UNZOMBIE"UNZOMBIE"/* UZMB */
+#define TOK_UNZOMBIE"ZU"
+#define CMD_UNZOMBIEMSG_UNZOMBIE, TOK_UNZOMBIE
+
 #define MSG_ASLL               "ASLL"          /* ASLL */
 #define TOK_ASLL               "LL"
 #define CMD_ASLL               MSG_ASLL, TOK_ASLL
diff --git a/include/s_bsd.h b/include/s_bsd.h
index 8b2231d..41bbd53 100644
--- a/include/s_bsd.h
+++ b/include/s_bsd.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -63,6 +63,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; extern unsigned int deliver_it(struct Client *cptr, struct MsgQ *buf);
 extern int connect_server(struct ConfItem* aconf, struct Client* by);
 extern int  net_close_unregistered_connections(struct Client* source);
 extern void close_connection(struct Client *cptr);
+extern void connection_switch_to_client(struct Client *source,
+struct Client *target);
 extern void add_connection(struct Listener* listener, int fd);
 extern int  read_message(time_t delay);
 extern void init_server_identity(void);
diff --git a/include/s_misc.h b/include/s_misc.h
index 1fb82b0..fd11b8a 100644
--- a/include/s_misc.h
+++ b/include/s_misc.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -76,6 +76,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct ServerStatistics {
 
 extern int check_registered(struct Client *sptr);
 extern int check_registered_user(struct Client *sptr);
+extern void zombie_client(struct Client *cptr, struct Client *killer,
+ struct Client *victim);
+extern void unzombie_client(struct Client *cptr, struct Client *sptr,
+    struct Client *acptr, struct Client *victim);
 extern int exit_client(struct Client *cptr, struct Client *bcptr,
     struct Client *sptr, const char *comment);
 extern char *myctime(time_t value);
diff --git a/include/s_user.h b/include/s_user.h
index 63ed134..185e984 100644
--- a/include/s_user.h
+++ b/include/s_user.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -74,6 +74,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; extern int set_nick_name(struct Client* cptr, struct Client* sptr,
                          const char* nick, int parc, char* parv[]);
 extern void send_umode_out(struct Client* cptr, struct Client* sptr,
                           struct Flags* old, int prop);
+extern void send_umode(struct Client *cptr, struct Client *sptr, struct Flags *old,
+                       int sendset);
 extern int whisper(struct Client* source, const char* nick,
                    const char* channel, const char* text, int is_notice);
 extern void send_user_info(struct Client* to, char* names, int rpl,
diff --git a/ircd/Makefile.in b/ircd/Makefile.in
index 01b69ca..dfd01c5 100644
--- a/ircd/Makefile.in
+++ b/ircd/Makefile.in
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -174,6 +174,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; IRCD_SRC = \
 m_time.c \
 m_topic.c \
 m_trace.c \
+m_unzombie.c \
 m_uping.c \
 m_user.c \
 m_userhost.c \
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -188,6 +189,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; IRCD_SRC = \
 m_whowas.c \
 m_xquery.c \
 m_xreply.c \
+m_zombie.c \
 match.c \
 memdebug.c \
 motd.c \
diff --git a/ircd/ircd.c b/ircd/ircd.c
index 7048e7d..c296795 100644
--- a/ircd/ircd.c
+++ b/ircd/ircd.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -339,6 +339,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void check_pings(struct Event* ev) {
     if (!cptr)
       continue;
      
+    /* We don't need to check zombies here */
+    if (IsNotConn(cptr)) {
+      assert(IsUser(cptr));
+      /* for now: reap after fixed time (15 minutes) */
+      if ((CurrentTime - cli_user(cptr)-&amp;gt;last) &amp;gt;= 900) {
+        SetFlag(cptr, FLAG_DEADSOCKET);
+        /* this will be used as exit message */
+        ircd_strncpy(cli_info(cptr), "Ping timeout", REALLEN);
+      } else
+        continue;
+    }
+
     assert(&amp;amp;me != cptr);  /* I should never be in the local client array! */
    
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -419,6 +431,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void check_pings(struct Event* ev) {
         sendto_opmask_butone(0, SNO_OLDSNO,
                              "No response from %s, closing link",
                              cli_name(cptr));
+      /*
+       * Keep client structure around when a user pings out, so that they can
+       * reconnect to it later
+       */
+      if (IsUser(cptr) &amp;amp;&amp;amp; IsAccount(cptr)) {
+        zombie_client(&amp;amp;me, &amp;amp;me, cptr);
+        continue;
+      }
       exit_client_msg(cptr, cptr, &amp;amp;me, "Ping timeout");
       continue;
     }
diff --git a/ircd/m_unzombie.c b/ircd/m_unzombie.c
new file mode 100644
index 0000000..12e0550
--- /dev/null
+++ b/ircd/m_unzombie.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,80 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+/*
+ * IRC - Internet Relay Chat, ircd/m_unzombie.c
+ * Copyright (C) 2011 Jan Krueger &amp;lt;jk&amp;lt; at &amp;gt;jk.gs&amp;gt;
+ *
+ * See file AUTHORS in IRC package for additional names of
+ * the programmers.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 1, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * $Id$
+ */
+
+#include "config.h"
+
+#include "client.h"
+#include "ircd.h"
+#include "ircd_log.h"
+#include "ircd_reply.h"
+#include "ircd_string.h"
+#include "msg.h"
+#include "numnicks.h"
+#include "s_debug.h"
+#include "s_user.h"
+#include "send.h"
+
+#include &amp;lt;stdlib.h&amp;gt;
+#include &amp;lt;string.h&amp;gt;
+
+/** Handle an UNZOMBIE message from a server connection.
+ *
+ * \a parv has the following elements:
+ * \li \a parv[1] is the numnick of the client attaching to the zombie
+ * \li \a parv[2] is the numnick of the zombie
+ *
+ * See &amp;lt; at &amp;gt;ref m_functions for discussion of the arguments.
+ * &amp;lt; at &amp;gt;param[in] cptr Client that sent us the message.
+ * &amp;lt; at &amp;gt;param[in] sptr Original source of message.
+ * &amp;lt; at &amp;gt;param[in] parc Number of arguments.
+ * &amp;lt; at &amp;gt;param[in] parv Argument vector.
+ */
+int ms_unzombie(struct Client* cptr, struct Client* sptr, int parc,
+       char* parv[])
+{
+  struct Client *acptr;
+  struct Client *victim;
+
+  if (parc &amp;lt; 3)
+    return need_more_params(sptr, "UNZOMBIE");
+
+  if (!IsServer(sptr))
+    return protocol_violation(cptr, "UNZOMBIE from non-server %s",
+      cli_name(sptr));
+
+  if (!(acptr = findNUser(parv[1])))
+    return 0; /* If this is colliding with a QUIT, let the QUIT win */
+
+  if (!(victim = findNUser(parv[2])))
+    /* TODO send error */
+    ;
+
+  if (!IsNotConn(victim))
+    return protocol_violation(cptr, "UNZOMBIE trying to attach to non-zombie %s",
+      cli_name(victim));
+  assert(IsAccount(victim));
+
+  unzombie_client(cptr, sptr, acptr, victim);
+  return 0;
+}
diff --git a/ircd/m_zombie.c b/ircd/m_zombie.c
new file mode 100644
index 0000000..3fe4c98
--- /dev/null
+++ b/ircd/m_zombie.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,73 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+/*
+ * IRC - Internet Relay Chat, ircd/m_zombie.c
+ * Copyright (C) 2011 Jan Krueger &amp;lt;jk&amp;lt; at &amp;gt;jk.gs&amp;gt;
+ *
+ * See file AUTHORS in IRC package for additional names of
+ * the programmers.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 1, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * $Id$
+ */
+
+#include "config.h"
+
+#include "client.h"
+#include "ircd.h"
+#include "ircd_log.h"
+#include "ircd_reply.h"
+#include "ircd_string.h"
+#include "msg.h"
+#include "numnicks.h"
+#include "s_debug.h"
+#include "s_user.h"
+#include "send.h"
+
+#include &amp;lt;stdlib.h&amp;gt;
+#include &amp;lt;string.h&amp;gt;
+
+/** Handle a ZOMBIE message from a server connection.
+ *
+ * \a parv has the following elements:
+ * \li \a parv[1] is the numnick of the client to act on
+ *
+ * See &amp;lt; at &amp;gt;ref m_functions for discussion of the arguments.
+ * &amp;lt; at &amp;gt;param[in] cptr Client that sent us the message.
+ * &amp;lt; at &amp;gt;param[in] sptr Original source of message.
+ * &amp;lt; at &amp;gt;param[in] parc Number of arguments.
+ * &amp;lt; at &amp;gt;param[in] parv Argument vector.
+ */
+int ms_zombie(struct Client* cptr, struct Client* sptr, int parc,
+       char* parv[])
+{
+  struct Client *acptr;
+
+  if (parc &amp;lt; 2)
+    return need_more_params(sptr, "ZOMBIE");
+
+  if (!IsServer(sptr))
+    return protocol_violation(cptr, "ZOMBIE from non-server %s",
+      cli_name(sptr));
+
+  if (!(acptr = findNUser(parv[1])))
+    return 0; /* Ignore for a user that QUIT; probably crossed (however unlikely) */
+
+  if (!IsAccount(acptr))
+    return protocol_violation(cptr, "ZOMBIE for user without account (%s)",
+      cli_name(acptr));
+
+  zombie_client(cptr, sptr, acptr);
+  return 0;
+}
diff --git a/ircd/parse.c b/ircd/parse.c
index b79ebb8..2cb1ffc 100644
--- a/ircd/parse.c
+++ b/ircd/parse.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -611,6 +611,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct Message msgtab[] = {
     { m_ignore, m_ignore, ms_account, m_ignore, m_ignore }
   },
   {
+    MSG_ZOMBIE,
+    TOK_ZOMBIE,
+    0, MAXPARA, MFLG_SLOW, 0, NULL,
+    /* UNREG, CLIENT, SERVER, OPER, SERVICE */
+    { m_ignore, m_ignore, ms_zombie, m_ignore, m_ignore }
+  },
+  {
+    MSG_UNZOMBIE,
+    TOK_UNZOMBIE,
+    0, MAXPARA, MFLG_SLOW, 0, NULL,
+    /* UNREG, CLIENT, SERVER, OPER, SERVICE */
+    { m_ignore, m_ignore, ms_unzombie, m_ignore, m_ignore }
+  },
+  {
     MSG_ASLL,
     TOK_ASLL,
     0, MAXPARA, MFLG_SLOW, 0, NULL,
diff --git a/ircd/s_bsd.c b/ircd/s_bsd.c
index 7e3205a..ca5ca9d 100644
--- a/ircd/s_bsd.c
+++ b/ircd/s_bsd.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -431,6 +431,34 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void close_connection(struct Client *cptr)
   }
 }
 
+/**
+ * Switches a client's connection over to a different, zombied client.
+ *
+ * &amp;lt; at &amp;gt;param source client to attach to zombied client
+ * &amp;lt; at &amp;gt;param target zombied client
+ */
+void connection_switch_to_client(struct Client *source, struct Client *target)
+{
+  assert(IsNotConn(target));
+  assert(MyConnect(source));
+  assert(-1 &amp;lt; cli_fd(source));
+  cli_connect(target) = cli_connect(source);
+  /* conveniently, this makes it much easier to get rid of source later on */
+  cli_from(target) = target;
+  LocalClientArray[cli_fd(source)] = target;
+
+  /* make main loop remove source soonish */
+  SetFlag(source, FLAG_DEADSOCKET);
+
+  /* need to copy over data from old client */
+  cli_user(target)-&amp;gt;server = cli_user(source)-&amp;gt;server;
+  strcpy(cli_yxx(target), cli_yxx(source));
+  cli_hopcount(target) = cli_hopcount(source);
+  cli_ip(target) = cli_ip(source);
+  strcpy(cli_username(target), cli_username(source));
+  strcpy(cli_user(target)-&amp;gt;realhost, cli_user(source)-&amp;gt;realhost);
+}
+
 /** Close all unregistered connections.
  * &amp;lt; at &amp;gt;param source Oper who requested the close.
  * &amp;lt; at &amp;gt;return Number of closed connections.
diff --git a/ircd/s_misc.c b/ircd/s_misc.c
index b5324fa..8b5ddca 100644
--- a/ircd/s_misc.c
+++ b/ircd/s_misc.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -319,6 +319,91 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void exit_downlinks(struct Client *cptr, struct Client *sptr, char *comme
   }
 }
 
+/**
+ * Marks a local client as disconnected, and close its link if it is a local client.
+ *
+ * &amp;lt; at &amp;gt;param cptr server that notified us
+ * &amp;lt; at &amp;gt;param killer origin of decision to zombie \a victim
+ * &amp;lt; at &amp;gt;param victim zombied client
+ */
+void zombie_client(struct Client *cptr, struct Client *killer, struct Client *victim)
+{
+  assert(IsServer(cptr) || IsMe(cptr));
+  assert(IsServer(killer) || IsMe(killer));
+  assert(IsUser(victim));
+
+  /*
+   * Stop a running /LIST clean
+   */
+  if (MyUser(victim) &amp;amp;&amp;amp; cli_listing(victim)) {
+    MyFree(cli_listing(victim));
+    cli_listing(victim) = NULL;
+  }
+
+  if (MyConnect(victim))
+    close_connection(victim);
+  /* need this so that main loop doesn't exit the client */
+  ClrFlag(victim, FLAG_DEADSOCKET);
+
+  SetNotConn(victim);
+  sendcmdto_serv_butone(killer, CMD_ZOMBIE, cptr, "%C", victim);
+}
+
+/**
+ * Attaches a client to a zombied client, removing the superfluous client in the process.
+ *
+ * &amp;lt; at &amp;gt;param cptr server that notified us
+ * &amp;lt; at &amp;gt;param sptr origin server of unzombie operation
+ * &amp;lt; at &amp;gt;param acptr client that is attaching to \a victim
+ * &amp;lt; at &amp;gt;param victim zombied client that someone is attaching to
+ */
+void unzombie_client(struct Client *cptr, struct Client *sptr, struct Client *acptr, struct Client *victim)
+{
+  assert(IsServer(cptr) || IsMe(cptr));
+  assert(IsServer(sptr) || IsMe(sptr));
+  assert(IsUser(acptr));
+  assert(IsNotConn(victim));
+
+  if (MyConnect(acptr))
+    connection_switch_to_client(acptr, victim);
+
+  ClearOper(victim);
+  ClearNotConn(victim);
+
+  if (MyConnect(victim)) {
+    /* inform client about "new" modes */
+    struct Flags setflags = cli_flags(acptr);
+    struct Membership *chan;
+    sendcmdto_one(acptr, CMD_NICK, victim, "%C", victim);
+    send_umode(victim, victim, &amp;amp;setflags, ALL_UMODES);
+
+    /*
+     * mark current client as zombie on all channels so that it does not show
+     * up in the memberships we'll resend below
+     */
+    for (chan = cli_user(acptr)-&amp;gt;channel; chan; chan = chan-&amp;gt;next_channel) {
+      SetZombie(chan);
+    }
+
+    /* resend channel memberships */
+    for (chan = cli_user(victim)-&amp;gt;channel; chan; chan = chan-&amp;gt;next_channel) {
+      struct Channel *chptr = chan-&amp;gt;channel;
+      /* pretty unlikely to happen but let's handle this anyway */
+      if (IsZombie(chan))
+        continue;
+      sendcmdto_one(victim, CMD_JOIN, victim, ":%H", chptr);
+      if (chptr-&amp;gt;topic[0]) {
+        send_reply(victim, RPL_TOPIC, chptr-&amp;gt;chname, chptr-&amp;gt;topic);
+        send_reply(victim, RPL_TOPICWHOTIME, chptr-&amp;gt;chname, chptr-&amp;gt;topic_nick,
+   chptr-&amp;gt;topic_time);
+      }
+      do_names(victim, chptr, NAMES_ALL|NAMES_EON); /* send /names list */
+    }
+  }
+
+  sendcmdto_serv_butone(sptr, CMD_UNZOMBIE, cptr, "%C %C", acptr, victim);
+}
+
 /* exit_client, rewritten 25-9-94 by Run */
 /**
  * Exits a client of *any* type (user, server, etc)
diff --git a/ircd/s_user.c b/ircd/s_user.c
index a19691d..7880291 100644
--- a/ircd/s_user.c
+++ b/ircd/s_user.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -499,7 +499,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static const struct UserMode {
   { FLAG_CHSERV,      'k' },
   { FLAG_DEBUG,       'g' },
   { FLAG_ACCOUNT,     'r' },
-  { FLAG_HIDDENHOST,  'x' }
+  { FLAG_HIDDENHOST,  'x' },
+  { FLAG_NOTCONN,     'Z' }
 };
 
 /** Length of #userModeList. */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1084,6 +1085,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int set_user_mode(struct Client *cptr, struct Client *sptr, int parc,
 }
 /* There is no -r */
 break;
+      case 'Z':
+if (what == MODE_ADD)
+  SetNotConn(sptr);
+else
+  ClearNotConn(sptr);
+break;
       default:
         send_reply(sptr, ERR_UMODEUNKNOWNFLAG, *m);
         break;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1102,6 +1109,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int set_user_mode(struct Client *cptr, struct Client *sptr, int parc,
       ClearLocOp(sptr);
     if (!FlagHas(&amp;amp;setflags, FLAG_ACCOUNT) &amp;amp;&amp;amp; IsAccount(sptr))
       ClrFlag(sptr, FLAG_ACCOUNT);
+    if (!FlagHas(&amp;amp;setflags, FLAG_NOTCONN) &amp;amp;&amp;amp; IsNotConn(sptr))
+      ClrFlag(sptr, FLAG_NOTCONN);
     /*
      * new umode; servers can set it, local users cannot;
      * prevents users from /kick'ing or /mode -o'ing
diff --git a/ircd/send.c b/ircd/send.c
index 1afbaec..faa88c3 100644
--- a/ircd/send.c
+++ b/ircd/send.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -106,7 +106,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void dead_link(struct Client *to, char *notice)
 static int can_send(struct Client* to)
 {
   assert(0 != to);
-  return (IsDead(to) || IsMe(to) || -1 == cli_fd(to)) ? 0 : 1;
+  return (IsDead(to) || IsMe(to) || IsNotConn(to) || -1 == cli_fd(to)) ? 0 : 1;
 }
 
 /** Close the connection with the highest sendq.
-----------------------------------------------------------------------


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Entrope</dc:creator>
    <dc:date>2012-01-26T03:48:36</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/502">
    <title>[SCM] Undernet IRC Server Source Code. branch antifloodcreated. 8864617996e0bd38a44067073b36e0382aedacc2</title>
    <link>http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/502</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Undernet IRC Server Source Code.".

The branch, antiflood has been created
        at  8864617996e0bd38a44067073b36e0382aedacc2 (commit)

- Log -----------------------------------------------------------------
commit 8864617996e0bd38a44067073b36e0382aedacc2
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Wed Jan 25 22:25:38 2012 -0500

    Minor cleanups for the channel anti-flood changes.
    
    include/channel.h (STATUS_FLOOD_NOTICED): Move closer to its macros.
      (SetFloodNoticed): Fix typo.
      (NOTICE): Delete this.
      (flood_attack_channel): Update name of the first parameter.
    
    ircd/channel.c (client_can_send_to_channel): Flatten a nested if.
      (flood_attack_channel): Update parameter name.
    
    ircd/ircd_relay.c (relay_channel_message): Remove dead store to perm.
      (relay_channel_message): Likewise.

diff --git a/include/channel.h b/include/channel.h
index 4c4c663..c35a4cd 100644
--- a/include/channel.h
+++ b/include/channel.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -146,8 +146,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef enum ChannelGetType {
 #define MODE_ADD       0x40000000
 #define MODE_DEL       0x20000000
 
-#define STATUS_FLOOD_NOTICED 0x10000000 /* XXX is this really free ? */
-
 /* used in ListingArgs.flags */
 
 #define LISTARG_TOPICLIMITS     0x0001
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -234,15 +232,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct Membership {
 #define ClearBurstJoined(x) ((x)-&amp;gt;status &amp;amp;= ~CHFL_BURST_JOINED)
 #define ClearDelayedJoin(x) ((x)-&amp;gt;status &amp;amp;= ~CHFL_DELAYED)
 
-/* Channel flood control -Dianora */
-/* Sort later if needed */
+/* Channel flood control */
+#define STATUS_FLOOD_NOTICED 0x10000000
 #define IsSetFloodNoticed(x) ((x)-&amp;gt;status &amp;amp; STATUS_FLOOD_NOTICED)
-#define SetFloodNoticed(x)   ((x)-&amp;gt;status != STATUS_FLOOD_NOTICED)
+#define SetFloodNoticed(x)   ((x)-&amp;gt;status |= STATUS_FLOOD_NOTICED)
 #define ClearFloodNoticed(x) ((x)-&amp;gt;status &amp;amp;= ~STATUS_FLOOD_NOTICED)
 
-/* XXX NOTICE might not belong in channel.h ;-) */
-#define NOTICE 1
-
 /** Mode information for a channel */
 struct Mode {
   unsigned int mode;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -285,7 +280,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct Channel {
   struct SLink*      invites;   /**&amp;lt; List of invites on this channel */
   struct Ban*        banlist;      /**&amp;lt; List of bans on this channel */
   struct Mode        mode;   /**&amp;lt; This channels mode */
-  int     status;
+  int     status;       /**&amp;lt; Anti-flood status */
   char               topic[TOPICLEN + 1]; /**&amp;lt; Channels topic */
   char               topic_nick[NICKLEN + 1]; /**&amp;lt; Nick of the person who set
 *  The topic
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -464,6 +459,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; extern struct Ban *find_ban(struct Client *cptr, struct Ban *banlist);
 extern int apply_ban(struct Ban **banlist, struct Ban *newban, int free);
 extern void free_ban(struct Ban *ban);
 
-int flood_attack_channel(int p_or_n, struct Client *source_p,
+int flood_attack_channel(int is_notice, struct Client *source_p,
                      struct Channel *chptr);
 #endif /* INCLUDED_channel_h */
diff --git a/ircd/channel.c b/ircd/channel.c
index ca44469..31bfa29 100644
--- a/ircd/channel.c
+++ b/ircd/channel.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -763,12 +763,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int client_can_send_to_channel(struct Client *cptr, struct Channel *chptr, int r
     if ((chptr-&amp;gt;mode.mode &amp;amp; (MODE_NOPRIVMSGS|MODE_MODERATED)) ||
 ((chptr-&amp;gt;mode.mode &amp;amp; MODE_REGONLY) &amp;amp;&amp;amp; !IsAccount(cptr)))
       return 0;
-    else {
-      if (find_ban(cptr, chptr-&amp;gt;banlist))
-return 0;
-      else 
-return CHFL_CAN_SEND;
-    }
+    else if (find_ban(cptr, chptr-&amp;gt;banlist))
+      return 0;
+    else
+      return CHFL_CAN_SEND;
   }
   return member_can_send_to_channel(member, reveal);
 }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3663,12 +3661,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void RevealDelayedJoinIfNeeded(struct Client *sptr, struct Channel *chptr)
  * Side effects: check for flood attack on target chptr
  * modified from Hybrid by Dianora
  *
- * &amp;lt; at &amp;gt;param[in] flag 0 if PRIVMSG 1 if NOTICE. RFC says NOTICE must not auto reply
- * &amp;lt; at &amp;gt;param[in] source_p source Client 
+ * &amp;lt; at &amp;gt;param[in] is_notice 0 if PRIVMSG, 1 if NOTICE (RFC says NOTICE
+ *   must not auto reply)
+ * &amp;lt; at &amp;gt;param[in] source_p source Client
  * &amp;lt; at &amp;gt;param[in] pointer to target channel
  * &amp;lt; at &amp;gt;param[out] 1 if target is under flood attack
  */
-int flood_attack_channel(int p_or_n, struct Client *source_p,
+int flood_attack_channel(int is_notice, struct Client *source_p,
                      struct Channel *chptr)
 {
   int delta;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3701,7 +3700,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int flood_attack_channel(int p_or_n, struct Client *source_p,
         /* Add a bit of penalty */
         chptr-&amp;gt;received_number_of_privmsgs += 2;
       }
-      if (MyUser(source_p) &amp;amp;&amp;amp; (p_or_n != NOTICE))
+      if (MyUser(source_p) &amp;amp;&amp;amp; !is_notice)
         sendcmdto_one(&amp;amp;me, CMD_NOTICE, source_p,
   "%s :*** Message to %s throttled due to flooding", cli_name(source_p),
 chptr-&amp;gt;chname);
diff --git a/ircd/ircd_relay.c b/ircd/ircd_relay.c
index 1da202c..07d4a7a 100644
--- a/ircd/ircd_relay.c
+++ b/ircd/ircd_relay.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -86,7 +86,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 void relay_channel_message(struct Client* sptr, const char* name, const char* text)
 {
   struct Channel* chptr;
-  int perm=0;
+  int perm;
+
   assert(0 != sptr);
   assert(0 != name);
   assert(0 != text);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -126,7 +127,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void relay_channel_message(struct Client* sptr, const char* name, const char* te
 void relay_channel_notice(struct Client* sptr, const char* name, const char* text)
 {
   struct Channel* chptr;
-  int perm=0;
+  int perm;
+
   assert(0 != sptr);
   assert(0 != name);
   assert(0 != text);
commit b714bd2b740b13c11a1dd0c96afe84ccb24cf740
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Wed Jan 25 22:24:17 2012 -0500

    - First pass at adding anti channel flood code to ircu
    
    [Code by Diane Bruce &amp;lt;db&amp;lt; at &amp;gt;db.net&amp;gt;.  Conflicts resolved, with one tweak,
    by Entrope: Reorder the test in ircd_relay.c to change less code.  The
    old change conflicted with delayed join handling.]
    
    Conflicts:
    
    include/ircd_features.h
    ircd/channel.c
    ircd/ircd_features.c
    ircd/ircd_relay.c

diff --git a/include/channel.h b/include/channel.h
index 7cafdf8..4c4c663 100644
--- a/include/channel.h
+++ b/include/channel.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -146,6 +146,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef enum ChannelGetType {
 #define MODE_ADD       0x40000000
 #define MODE_DEL       0x20000000
 
+#define STATUS_FLOOD_NOTICED 0x10000000 /* XXX is this really free ? */
+
 /* used in ListingArgs.flags */
 
 #define LISTARG_TOPICLIMITS     0x0001
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -232,6 +234,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct Membership {
 #define ClearBurstJoined(x) ((x)-&amp;gt;status &amp;amp;= ~CHFL_BURST_JOINED)
 #define ClearDelayedJoin(x) ((x)-&amp;gt;status &amp;amp;= ~CHFL_DELAYED)
 
+/* Channel flood control -Dianora */
+/* Sort later if needed */
+#define IsSetFloodNoticed(x) ((x)-&amp;gt;status &amp;amp; STATUS_FLOOD_NOTICED)
+#define SetFloodNoticed(x)   ((x)-&amp;gt;status != STATUS_FLOOD_NOTICED)
+#define ClearFloodNoticed(x) ((x)-&amp;gt;status &amp;amp;= ~STATUS_FLOOD_NOTICED)
+
+/* XXX NOTICE might not belong in channel.h ;-) */
+#define NOTICE 1
+
 /** Mode information for a channel */
 struct Mode {
   unsigned int mode;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -274,10 +285,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct Channel {
   struct SLink*      invites;   /**&amp;lt; List of invites on this channel */
   struct Ban*        banlist;      /**&amp;lt; List of bans on this channel */
   struct Mode        mode;   /**&amp;lt; This channels mode */
+  int     status;
   char               topic[TOPICLEN + 1]; /**&amp;lt; Channels topic */
   char               topic_nick[NICKLEN + 1]; /**&amp;lt; Nick of the person who set
 *  The topic
 */
+  time_t first_received_message_time; /**&amp;lt; channel flood control */
+  int    received_number_of_privmsgs; /**&amp;lt; number of possible flooding messages */
   char               chname[1];   /**&amp;lt; Dynamically allocated string of the 
      * channel name
      */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -450,4 +464,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; extern struct Ban *find_ban(struct Client *cptr, struct Ban *banlist);
 extern int apply_ban(struct Ban **banlist, struct Ban *newban, int free);
 extern void free_ban(struct Ban *ban);
 
+int flood_attack_channel(int p_or_n, struct Client *source_p,
+                     struct Channel *chptr);
 #endif /* INCLUDED_channel_h */
diff --git a/include/ircd_features.h b/include/ircd_features.h
index 42c54ac..a9a2e33 100644
--- a/include/ircd_features.h
+++ b/include/ircd_features.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -156,6 +156,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; enum Feature {
   FEAT_NETWORK,
   FEAT_URL_CLIENTS,
   FEAT_URLREG,
+  FEAT_CHANNEL_FLOOD_COUNT,
 
   FEAT_LAST_F
 };
diff --git a/ircd/channel.c b/ircd/channel.c
index 9c0f192..ca44469 100644
--- a/ircd/channel.c
+++ b/ircd/channel.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -623,7 +623,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int is_chan_op(struct Client *cptr, struct Channel *chptr)
  * &amp;lt; at &amp;gt;param chptrThe channel to check.
  *
  * &amp;lt; at &amp;gt;returns True if the client (cptr) is a zombie on the channel (chptr),
- *     False otherwise.
+ *    False otherwise.
  *
  * &amp;lt; at &amp;gt;see \ref zombie
  */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -640,7 +640,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int is_zombie(struct Client *cptr, struct Channel *chptr)
 
 /** Returns if a user has voice on a channel.
  *
- * &amp;lt; at &amp;gt;param cptr The client
+ * &amp;lt; at &amp;gt;param cptrThe client
  * &amp;lt; at &amp;gt;param chptrThe channel
  *
  * &amp;lt; at &amp;gt;returns True if the client (cptr) is voiced on (chptr) and is not a zombie.
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -657,6 +657,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int has_voice(struct Client* cptr, struct Channel* chptr)
   return 0;
 }
 
+/* XXX Maybe move this into channel.h ? - Dianora */
+#define CHFL_CAN_SEND0x800000
+
 /** Can this member send to a channel
  *
  * A user can speak on a channel iff:
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -673,9 +676,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int has_voice(struct Client* cptr, struct Channel* chptr)
  *
  * &amp;lt; at &amp;gt;param memberThe membership of the user
  * &amp;lt; at &amp;gt;param revealIf true, the user will be "revealed" on a delayed
- * joined channel.
+ *joined channel.
  *
- * &amp;lt; at &amp;gt;returns True if the client can speak on the channel.
+ * &amp;lt; at &amp;gt;returns CHFL_CAN_SEND or CHFL_VOICED_OR_OPPED if
+ *    the client can speak on the channel.
+ *    0 if the client cannot speak on the channel.
  */
 int member_can_send_to_channel(struct Membership* member, int reveal)
 {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -689,7 +694,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int member_can_send_to_channel(struct Membership* member, int reveal)
   {
     if (IsDelayedJoin(member) &amp;amp;&amp;amp; reveal)
       RevealDelayedJoin(member);
-    return 1;
+    return CHFL_CAN_SEND;
   }
 
   /* Discourage using the Apass to get op.  They should use the Upass. */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -698,7 +703,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int member_can_send_to_channel(struct Membership* member, int reveal)
 
   /* If you have voice or ops, you can speak. */
   if (IsVoicedOrOpped(member))
-    return 1;
+    return CHFL_VOICED_OR_OPPED;
 
   /*
    * If it's moderated, and you aren't a privileged user, you can't
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -718,9 +723,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int member_can_send_to_channel(struct Membership* member, int reveal)
   if (IsDelayedJoin(member) &amp;amp;&amp;amp; reveal)
     RevealDelayedJoin(member);
 
-  return 1;
+  return CHFL_CAN_SEND;
 }
 
+
 /** Check if a client can send to a channel.
  *
  * Has the added check over member_can_send_to_channel() of servers can
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -731,11 +737,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int member_can_send_to_channel(struct Membership* member, int reveal)
  * &amp;lt; at &amp;gt;param reveal If the user should be revealed (see 
  * member_can_send_to_channel())
  *
- * &amp;lt; at &amp;gt;returns true if the client is allowed to speak on the channel, false 
- * otherwise
+ * &amp;lt; at &amp;gt;returns CHFL_CAN_SEND
+ *    if the client is allowed to speak on the channel, 0otherwise
  *
  * &amp;lt; at &amp;gt;see member_can_send_to_channel()
  */
+
 int client_can_send_to_channel(struct Client *cptr, struct Channel *chptr, int reveal)
 {
   struct Membership *member;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -744,7 +751,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int client_can_send_to_channel(struct Client *cptr, struct Channel *chptr, int r
    * Servers can always speak on channels.
    */
   if (IsServer(cptr))
-    return 1;
+    return CHFL_CAN_SEND;
 
   member = find_channel_member(cptr, chptr);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -756,8 +763,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int client_can_send_to_channel(struct Client *cptr, struct Channel *chptr, int r
     if ((chptr-&amp;gt;mode.mode &amp;amp; (MODE_NOPRIVMSGS|MODE_MODERATED)) ||
 ((chptr-&amp;gt;mode.mode &amp;amp; MODE_REGONLY) &amp;amp;&amp;amp; !IsAccount(cptr)))
       return 0;
-    else
-      return !find_ban(cptr, chptr-&amp;gt;banlist);
+    else {
+      if (find_ban(cptr, chptr-&amp;gt;banlist))
+return 0;
+      else 
+return CHFL_CAN_SEND;
+    }
   }
   return member_can_send_to_channel(member, reveal);
 }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3647,3 +3658,58 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void RevealDelayedJoinIfNeeded(struct Client *sptr, struct Channel *chptr)
   if (member &amp;amp;&amp;amp; IsDelayedJoin(member))
     RevealDelayedJoin(member);
 }
+
+/** Check whether a channel is being flooded or not
+ * Side effects: check for flood attack on target chptr
+ * modified from Hybrid by Dianora
+ *
+ * &amp;lt; at &amp;gt;param[in] flag 0 if PRIVMSG 1 if NOTICE. RFC says NOTICE must not auto reply
+ * &amp;lt; at &amp;gt;param[in] source_p source Client 
+ * &amp;lt; at &amp;gt;param[in] pointer to target channel
+ * &amp;lt; at &amp;gt;param[out] 1 if target is under flood attack
+ */
+int flood_attack_channel(int p_or_n, struct Client *source_p,
+                     struct Channel *chptr)
+{
+  int delta;
+
+  if (feature_int(FEAT_CHANNEL_FLOOD_COUNT) != 0)
+  {
+    if ((chptr-&amp;gt;first_received_message_time + 1) &amp;lt; CurrentTime)
+    {
+      delta = CurrentTime - chptr-&amp;gt;first_received_message_time;
+      chptr-&amp;gt;received_number_of_privmsgs -= delta;
+      chptr-&amp;gt;first_received_message_time = CurrentTime;
+      if (chptr-&amp;gt;received_number_of_privmsgs &amp;lt;= 0)
+      {
+        chptr-&amp;gt;received_number_of_privmsgs = 0;
+        ClearFloodNoticed(chptr);
+      }
+    }
+
+    if ((chptr-&amp;gt;received_number_of_privmsgs &amp;gt;=
+    feature_int(FEAT_CHANNEL_FLOOD_COUNT))
+|| IsSetFloodNoticed(chptr))
+    {
+      if (!IsSetFloodNoticed(chptr))
+      {
+        sendto_opmask_butone(0, SNO_OLDSNO,
+                             "Possible Flooder %s target: %s",
+                             cli_name(source_p), chptr-&amp;gt;chname);
+        SetFloodNoticed(chptr);
+
+        /* Add a bit of penalty */
+        chptr-&amp;gt;received_number_of_privmsgs += 2;
+      }
+      if (MyUser(source_p) &amp;amp;&amp;amp; (p_or_n != NOTICE))
+        sendcmdto_one(&amp;amp;me, CMD_NOTICE, source_p,
+  "%s :*** Message to %s throttled due to flooding", cli_name(source_p),
+chptr-&amp;gt;chname);
+      return(1);
+    }
+    else
+      chptr-&amp;gt;received_number_of_privmsgs++;
+  }
+
+  return(0);
+}
diff --git a/ircd/ircd_features.c b/ircd/ircd_features.c
index 6d64f89..715d11c 100644
--- a/ircd/ircd_features.c
+++ b/ircd/ircd_features.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -421,6 +421,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static struct FeatureDesc {
   F_S(NETWORK, 0, "UnderNet", 0),
   F_S(URL_CLIENTS, 0, "ftp://ftp.undernet.org/pub/irc/clients", 0),
   F_S(URLREG, 0, "http://cservice.undernet.org/live/", 0),
+  F_I(CHANNEL_FLOOD_COUNT, 0, 3, 0),
 
 #undef F_S
 #undef F_B
diff --git a/ircd/ircd_relay.c b/ircd/ircd_relay.c
index b7a751d..1da202c 100644
--- a/ircd/ircd_relay.c
+++ b/ircd/ircd_relay.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -86,6 +86,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 void relay_channel_message(struct Client* sptr, const char* name, const char* text)
 {
   struct Channel* chptr;
+  int perm=0;
   assert(0 != sptr);
   assert(0 != name);
   assert(0 != text);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -97,7 +98,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void relay_channel_message(struct Client* sptr, const char* name, const char* te
   /*
    * This first: Almost never a server/service
    */
-  if (!client_can_send_to_channel(sptr, chptr, 0)) {
+  perm = client_can_send_to_channel(sptr, chptr, 1);
+
+  if (perm == 0) {
     send_reply(sptr, ERR_CANNOTSENDTOCHAN, chptr-&amp;gt;chname);
     return;
   }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -105,6 +108,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void relay_channel_message(struct Client* sptr, const char* name, const char* te
       check_target_limit(sptr, chptr, chptr-&amp;gt;chname, 0))
     return;
 
+  /* Chanops and Voiced get a free pass */
+  if (((perm &amp;amp; CHFL_VOICED_OR_OPPED) == 0)
+      &amp;amp;&amp;amp; flood_attack_channel(0, sptr, chptr))
+    return;
   RevealDelayedJoinIfNeeded(sptr, chptr);
   sendcmdto_channel_butone(sptr, CMD_PRIVATE, chptr, cli_from(sptr),
    SKIP_DEAF | SKIP_BURST, "%H :%s", chptr, text);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -119,6 +126,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void relay_channel_message(struct Client* sptr, const char* name, const char* te
 void relay_channel_notice(struct Client* sptr, const char* name, const char* text)
 {
   struct Channel* chptr;
+  int perm=0;
   assert(0 != sptr);
   assert(0 != name);
   assert(0 != text);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -128,13 +136,19 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void relay_channel_notice(struct Client* sptr, const char* name, const char* tex
   /*
    * This first: Almost never a server/service
    */
-  if (!client_can_send_to_channel(sptr, chptr, 0))
+  perm = client_can_send_to_channel(sptr, chptr, 1);
+
+  if (perm == 0)
     return;
 
   if ((chptr-&amp;gt;mode.mode &amp;amp; MODE_NOPRIVMSGS) &amp;amp;&amp;amp;
       check_target_limit(sptr, chptr, chptr-&amp;gt;chname, 0))
     return;
 
+  /* Chanops and Voiced get a free pass */
+  if (((perm &amp;amp; CHFL_VOICED_OR_OPPED) == 0)
+      &amp;amp;&amp;amp; flood_attack_channel(1, sptr, chptr))
+    return;
   RevealDelayedJoinIfNeeded(sptr, chptr);
   sendcmdto_channel_butone(sptr, CMD_NOTICE, chptr, cli_from(sptr),
    SKIP_DEAF | SKIP_BURST, "%H :%s", chptr, text);
-----------------------------------------------------------------------


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Entrope</dc:creator>
    <dc:date>2012-01-26T03:48:33</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/501">
    <title>[SCM] Undernet IRC Server Source Code. branchu2_10_12_branch updated. 246a65025b51a3c5fb6900b2af4cbf22793d1416</title>
    <link>http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/501</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Undernet IRC Server Source Code.".

The branch, u2_10_12_branch has been updated
       via  246a65025b51a3c5fb6900b2af4cbf22793d1416 (commit)
       via  27bbf399c2c4e7e5f3ae281a786b95cb9b1aa678 (commit)
       via  29a8ddb8ef24a23c7aa8d31b90474a6ec536e4cc (commit)
      from  8a0fce5ce44018405ec3aab7115f7b7028c90329 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 246a65025b51a3c5fb6900b2af4cbf22793d1416
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Mon Jan 23 21:06:56 2012 -0500

    Delete local variables that are set but never read.
    
    gcc 4.6 complains about these with -Wall.

diff --git a/ChangeLog b/ChangeLog
index ff00129..2699fe6 100644
--- a/ChangeLog
+++ b/ChangeLog
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,5 +1,23 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 2011-01-23  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
+* ircd/ircd_res.c (proc_answer): Delete unread variable
+query_class.
+
+* ircd/m_nick.c (m_nick): Delete unread variable client_name.
+
+* ircd/m_ping.c (m_ping): Delete unread variable origin.
+
+* ircd/m_whois.c (do_whois): Delete unread variable name.
+
+* ircd/parse.c (parse_client): Delete unread variable noprefix.
+
+* ircd/s_conf.c (killcomment): Delete unread variable tm.
+
+* ircd/s_stats.c (stats_configured_links): Delete unread variable
+pass.
+
+2011-01-23  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
 * ircd/gline.c (gline_modify): Notify opers using SNO_AUTO rather
 than SNO_GLINE if a G-line had, and still has, an AUTO prefix.
 
diff --git a/ircd/ircd_res.c b/ircd/ircd_res.c
index 88b0efa..627e12e 100644
--- a/ircd/ircd_res.c
+++ b/ircd/ircd_res.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -633,7 +633,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; proc_answer(struct reslist *request, HEADER* header, char* buf, char* eob)
 {
   char hostbuf[HOSTLEN + 100]; /* working buffer */
   unsigned char *current;      /* current position in buf */
-  int query_class;             /* answer class */
   int type;                    /* answer type */
   int n;                       /* temp count */
   int rd_length;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -687,9 +686,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; proc_answer(struct reslist *request, HEADER* header, char* buf, char* eob)
     type = irc_ns_get16(current);
     current += TYPE_SIZE;
 
-    query_class = irc_ns_get16(current);
+    /* We do not use the class or TTL values. */
     current += CLASS_SIZE;
-
     current += TTL_SIZE;
 
     rd_length = irc_ns_get16(current);
diff --git a/ircd/m_nick.c b/ircd/m_nick.c
index b1fa7fd..fe13d4e 100644
--- a/ircd/m_nick.c
+++ b/ircd/m_nick.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -146,7 +146,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int m_nick(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
   char           nick[NICKLEN + 2];
   char*          arg;
   char*          s;
-  const char*    client_name;
 
   assert(0 != cptr);
   assert(cptr == sptr);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -154,11 +153,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int m_nick(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
   if (IsServerPort(cptr))
     return exit_client(cptr, cptr, &amp;amp;me, "Use a different port");
 
-  /*
-   * parv[0] will be empty for clients connecting for the first time
-   */
-  client_name = (*(cli_name(sptr))) ? cli_name(sptr) : "*";
-
   if (parc &amp;lt; 2) {
     send_reply(sptr, ERR_NONICKNAMEGIVEN);
     return 0;
diff --git a/ircd/m_ping.c b/ircd/m_ping.c
index c1393d4..95d7479 100644
--- a/ircd/m_ping.c
+++ b/ircd/m_ping.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -178,14 +178,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int m_ping(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
 int mo_ping(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
 {
   struct Client* acptr;
-  char *destination, *origin;
+  char *destination;
   assert(0 != cptr);
   assert(cptr == sptr);
 
   if (parc &amp;lt; 2 || EmptyString(parv[1]))
     return send_reply(sptr, ERR_NOORIGIN);
 
-  origin = parv[1];
   destination = parv[2];        /* Will get NULL or pointer (parc &amp;gt;= 2!!) */
 
   if (!EmptyString(destination) &amp;amp;&amp;amp; 0 != ircd_strcmp(destination, cli_name(&amp;amp;me))) {
diff --git a/ircd/m_whois.c b/ircd/m_whois.c
index f38d6ad..01c9db5 100644
--- a/ircd/m_whois.c
+++ b/ircd/m_whois.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -235,7 +235,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int do_wilds(struct Client* sptr, char *nick, int count, int parc)
 {
   struct Client *acptr; /* Current client we're considering */
   struct User *user; /* the user portion of the client */
-  const char *name; /* the name of this client */
   struct Membership* chan; 
   int invis; /* does +i apply? */
   int member;/* Is this user on any channels? */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -273,7 +272,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int do_wilds(struct Client* sptr, char *nick, int count, int parc)
      *   the target user(s) are on;
      */
     user = cli_user(acptr);
-    name = (!*(cli_name(acptr))) ? "?" : cli_name(acptr);
     assert(user);
 
     invis = (acptr != sptr) &amp;amp;&amp;amp; IsInvisible(acptr);
diff --git a/ircd/parse.c b/ircd/parse.c
index 65b7d02..b79ebb8 100644
--- a/ircd/parse.c
+++ b/ircd/parse.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -824,7 +824,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; parse_client(struct Client *cptr, char *buffer, char *bufend)
   char*           s;
   int             i;
   int             paramcount;
-  int             noprefix = 0;
   struct Message* mptr;
   MessageHandler  handler = 0;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -842,8 +841,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; parse_client(struct Client *cptr, char *buffer, char *bufend)
     while (*ch == ' ')
       ch++;                     /* Advance to command */
   }
-  else
-    noprefix = 1;
   if (*ch == '\0')
   {
     ServerStats-&amp;gt;is_empt++;
diff --git a/ircd/s_conf.c b/ircd/s_conf.c
index 96f2b99..7db9ff2 100644
--- a/ircd/s_conf.c
+++ b/ircd/s_conf.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -94,7 +94,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void killcomment(struct Client* sptr, const char* filename)
   FBFILE*     file = 0;
   char        line[80];
   struct stat sb;
-  struct tm*  tm;
 
   if (NULL == (file = fbopen(filename, "r"))) {
     send_reply(sptr, ERR_NOMOTD);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -103,7 +102,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void killcomment(struct Client* sptr, const char* filename)
     return;
   }
   fbstat(&amp;amp;sb, file);
-  tm = localtime((time_t*) &amp;amp;sb.st_mtime);        /* NetBSD needs cast */
   while (fbgets(line, sizeof(line) - 1, file)) {
     char* end = line + strlen(line);
     while (end &amp;gt; line) {
diff --git a/ircd/s_stats.c b/ircd/s_stats.c
index c3f01cd..b373c91 100644
--- a/ircd/s_stats.c
+++ b/ircd/s_stats.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -90,14 +90,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; stats_configured_links(struct Client *sptr, const struct StatDesc* sd,
   struct ConfItem *tmp;
   unsigned short int port;
   int maximum;
-  char *host, *pass, *name, *username, *hub_limit;
+  char *host, *name, *username, *hub_limit;
 
   for (tmp = GlobalConfList; tmp; tmp = tmp-&amp;gt;next)
   {
     if ((tmp-&amp;gt;status &amp;amp; sd-&amp;gt;sd_funcdata))
     {
       host = BadPtr(tmp-&amp;gt;host) ? null : tmp-&amp;gt;host;
-      pass = BadPtr(tmp-&amp;gt;passwd) ? null : tmp-&amp;gt;passwd;
       name = BadPtr(tmp-&amp;gt;name) ? null : tmp-&amp;gt;name;
       username = BadPtr(tmp-&amp;gt;username) ? null : tmp-&amp;gt;username;
       hub_limit = BadPtr(tmp-&amp;gt;hub_limit) ? null : tmp-&amp;gt;hub_limit;
commit 27bbf399c2c4e7e5f3ae281a786b95cb9b1aa678
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Mon Jan 23 07:57:10 2012 -0500

    Send "modifying global" messages to SNO_AUTO when appropriate.

diff --git a/ChangeLog b/ChangeLog
index 478d9e4..ff00129 100644
--- a/ChangeLog
+++ b/ChangeLog
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,3 +1,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+2011-01-23  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
+* ircd/gline.c (gline_modify): Notify opers using SNO_AUTO rather
+than SNO_GLINE if a G-line had, and still has, an AUTO prefix.
+
 2011-01-19  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
 * doc/readme.iauth: Document the new 'd' IAuth command.
diff --git a/ircd/gline.c b/ircd/gline.c
index d2b2b9b..d25dbfa 100644
--- a/ircd/gline.c
+++ b/ircd/gline.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -697,7 +697,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gline_modify(struct Client *cptr, struct Client *sptr, struct Gline *gline,
      time_t lastmod, time_t lifetime, unsigned int flags)
 {
   char buf[BUFSIZE], *op = "";
-  int pos = 0;
+  int pos = 0, non_auto = 0;
 
   assert(gline);
   assert(!GlineIsLocal(gline));
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -841,6 +841,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gline_modify(struct Client *cptr, struct Client *sptr, struct Gline *gline,
 
   /* Now, handle reason changes... */
   if (flags &amp;amp; GLINE_REASON) {
+    non_auto = non_auto || ircd_strncmp(gline-&amp;gt;gl_reason, "AUTO", 4);
     MyFree(gline-&amp;gt;gl_reason); /* release old reason */
     DupString(gline-&amp;gt;gl_reason, reason); /* store new reason */
     if (pos &amp;lt; BUFSIZE)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -850,7 +851,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gline_modify(struct Client *cptr, struct Client *sptr, struct Gline *gline,
   }
 
   /* All right, inform ops... */
-  sendto_opmask_butone(0, SNO_GLINE, "%s modifying global %s for %s%s%s:%s",
+  non_auto = non_auto || ircd_strncmp(gline-&amp;gt;gl_reason, "AUTO", 4);
+  sendto_opmask_butone(0, non_auto ? SNO_GLINE : SNO_AUTO,
+       "%s modifying global %s for %s%s%s:%s",
        (feature_bool(FEAT_HIS_SNOTICES) || IsServer(sptr)) ?
        cli_name(sptr) : cli_name((cli_user(sptr))-&amp;gt;server),
        GlineIsBadChan(gline) ? "BADCHAN" : "GLINE",
commit 29a8ddb8ef24a23c7aa8d31b90474a6ec536e4cc
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Mon Jan 23 07:43:29 2012 -0500

    Add missing ChangeLog entries for last two commits.

diff --git a/ChangeLog b/ChangeLog
index edc2416..478d9e4 100644
--- a/ChangeLog
+++ b/ChangeLog
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,3 +1,19 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+2011-01-19  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
+* doc/readme.iauth: Document the new 'd' IAuth command.
+
+* ircd/s_auth.c (AuthRequestFlag): Add "soft done" flag.
+(auth_ping_timeout): Do not impose Authorization Timeout on
+clients with the "soft done" flag set.
+(iauth_cmd_soft_done): New IAuth command handler.
+(iauth_parse): Call it.
+
+2011-01-19  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
+* ircd/s_auth.c (start_auth): Call start_dns_query() and
+start_auth_query() after start_iauth_query() rather than
+before.
+
 2011-08-17  Kevin L. Mitchell &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
 
 * include/client.h: Fix minor issue in IsLocOp() test
-----------------------------------------------------------------------

Summary of changes:
 ChangeLog       |   39 +++++++++++++++++++++++++++++++++++++++
 ircd/gline.c    |    7 +++++--
 ircd/ircd_res.c |    4 +---
 ircd/m_nick.c   |    6 ------
 ircd/m_ping.c   |    3 +--
 ircd/m_whois.c  |    2 --
 ircd/parse.c    |    3 ---
 ircd/s_conf.c   |    2 --
 ircd/s_stats.c  |    3 +--
 9 files changed, 47 insertions(+), 22 deletions(-)


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Entrope</dc:creator>
    <dc:date>2012-01-26T02:57:35</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/500">
    <title>[SCM] Undernet IRC Server Source Code. branchu2_10_12_branch updated. 8a0fce5ce44018405ec3aab7115f7b7028c90329</title>
    <link>http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/500</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Undernet IRC Server Source Code.".

The branch, u2_10_12_branch has been updated
       via  8a0fce5ce44018405ec3aab7115f7b7028c90329 (commit)
       via  3cfdd224928b767bf33e7de2507b6cad3bcfe3ba (commit)
      from  b3e7a2bbceb4d17cdab3ce7579fcaac2aa77868d (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 8a0fce5ce44018405ec3aab7115f7b7028c90329
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Thu Jan 19 21:50:27 2012 -0500

    Support a "soft done" message from IAuth.
    
    This lets clients onto the network if a login-on-connect response
    times out, without requiring the IAuth process to know ircu's
    authorization deadline.

diff --git a/doc/readme.iauth b/doc/readme.iauth
index 8b4aea7..54a011f 100644
--- a/doc/readme.iauth
+++ b/doc/readme.iauth
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -446,6 +446,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; Next State: GONE
 Comments: Indicates that the specified client should be disconnected
   for the reason given.  Operators should be notified.
 
+d - "Soft" Done Checking
+Syntax: d &amp;lt;id&amp;gt; &amp;lt;remoteip&amp;gt; &amp;lt;remoteport&amp;gt;
+Example: d 5 192.168.1.10 23367
+States: REGISTER, HURRY
+Next State: -
+Comments: Indicates that the iauth instance has no objection to letting
+  the specified client onto the network, but that some further work is
+  in process.  In particular, an account stamp and/or connection class
+  might be available later.
+Compatibility: This is an Undernet extension and ircd does not support
+  this message.
+
 D - Done Checking
 Syntax: D &amp;lt;id&amp;gt; &amp;lt;remoteip&amp;gt; &amp;lt;remoteport&amp;gt; [class]
 Example: D 5 192.168.1.10 23367
diff --git a/ircd/s_auth.c b/ircd/s_auth.c
index ff245d6..e250ae6 100644
--- a/ircd/s_auth.c
+++ b/ircd/s_auth.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -84,6 +84,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; enum AuthRequestFlag {
     AR_IAUTH_HURRY,     /**&amp;lt; we told iauth to hurry up */
     AR_IAUTH_USERNAME,  /**&amp;lt; iauth sent a username (preferred or forced) */
     AR_IAUTH_FUSERNAME, /**&amp;lt; iauth sent a forced username */
+    AR_IAUTH_SOFT_DONE, /**&amp;lt; iauth has no objection to client */
     AR_PASSWORD_CHECKED, /**&amp;lt; client password already checked */
     AR_NUM_FLAGS
 };
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -791,7 +792,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int auth_ping_timeout(struct Client *cptr)
 
   /* Check for iauth timeout. */
   if (FlagHas(&amp;amp;auth-&amp;gt;flags, AR_IAUTH_PENDING)) {
-    if (IAuthHas(iauth, IAUTH_REQUIRED)) {
+    if (IAuthHas(iauth, IAUTH_REQUIRED)
+        &amp;amp;&amp;amp; !FlagHas(&amp;amp;auth-&amp;gt;flags, AR_IAUTH_SOFT_DONE)) {
       sendheader(cptr, REPORT_FAIL_IAUTH);
       return exit_client_msg(cptr, cptr, &amp;amp;me, "Authorization Timeout");
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1880,6 +1882,22 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static struct ConfItem *auth_find_class_conf(const char *class_name)
   return aconf;
 }
 
+/** Tentatively accept a client in IAuth.
+ * &amp;lt; at &amp;gt;param[in] iauth Active IAuth session.
+ * &amp;lt; at &amp;gt;param[in] cli Client referenced by command.
+ * &amp;lt; at &amp;gt;param[in] parc Number of parameters.
+ * &amp;lt; at &amp;gt;param[in] params Optional class name for client.
+ * &amp;lt; at &amp;gt;return Negative (CPTR_KILLED) if the connection is refused, one otherwise.
+ */
+static int iauth_cmd_soft_done(struct IAuth *iauth, struct Client *cli,
+       int parc, char **params)
+{
+  /* Clear iauth pending flag. */
+  assert(cli_auth(cli) != NULL);
+  FlagSet(&amp;amp;cli_auth(cli)-&amp;gt;flags, AR_IAUTH_SOFT_DONE);
+  return 1;
+}
+
 /** Accept a client in IAuth.
  * &amp;lt; at &amp;gt;param[in] iauth Active IAuth session.
  * &amp;lt; at &amp;gt;param[in] cli Client referenced by command.
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2099,6 +2117,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void iauth_parse(struct IAuth *iauth, char *message)
   case 'I': handler = iauth_cmd_ip_address; has_cli = 1; break;
   case 'M': handler = iauth_cmd_usermode; has_cli = 1; break;
   case 'C': handler = iauth_cmd_challenge; has_cli = 1; break;
+  case 'd': handler = iauth_cmd_soft_done; has_cli = 1; break;
   case 'D': handler = iauth_cmd_done_client; has_cli = 1; break;
   case 'R': handler = iauth_cmd_done_account; has_cli = 1; break;
   case 'k': /* The 'k' command indicates the user should be booted
commit 3cfdd224928b767bf33e7de2507b6cad3bcfe3ba
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Thu Jan 19 21:48:30 2012 -0500

    Move DNS and auth lookups after starting IAuth.
    
    When start_dns_query() ran before start_iauth_query(), clients from
    localhost would not have their IAuth 'N' message sent because ircu had
    not started the IAuth query for that client.

diff --git a/ircd/s_auth.c b/ircd/s_auth.c
index 2a00dd1..ff245d6 100644
--- a/ircd/s_auth.c
+++ b/ircd/s_auth.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1020,12 +1020,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void start_auth(struct Client* client)
   }
   auth-&amp;gt;port = remote.port;
 
-  /* Try to start DNS lookup. */
-  start_dns_query(auth);
-
-  /* Try to start ident lookup. */
-  start_auth_query(auth);
-
   /* Set required client inputs for users. */
   if (IsUserPort(client)) {
     cli_user(client) = make_user(client);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1037,6 +1031,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void start_auth(struct Client* client)
     start_iauth_query(auth);
   }
 
+  /* Try to start DNS lookup. */
+  start_dns_query(auth);
+
+  /* Try to start ident lookup. */
+  start_auth_query(auth);
+
   /* Add client to GlobalClientList. */
   add_client_to_list(client);
 
-----------------------------------------------------------------------

Summary of changes:
 doc/readme.iauth |   12 ++++++++++++
 ircd/s_auth.c    |   33 ++++++++++++++++++++++++++-------
 2 files changed, 38 insertions(+), 7 deletions(-)


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Entrope</dc:creator>
    <dc:date>2012-01-20T02:56:17</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/499">
    <title>[SCM] Undernet IRC Server Source Code. branchu2_10_12_branch updated. b3e7a2bbceb4d17cdab3ce7579fcaac2aa77868d</title>
    <link>http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/499</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Undernet IRC Server Source Code.".

The branch, u2_10_12_branch has been updated
       via  b3e7a2bbceb4d17cdab3ce7579fcaac2aa77868d (commit)
      from  b6f0b0f286a14781eb07d8aa08c9e500eefb8082 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit b3e7a2bbceb4d17cdab3ce7579fcaac2aa77868d
Author: Kevin L. Mitchell &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
Date:   Wed Aug 17 18:54:46 2011 -0500

    Fix minor issue in IsLocOp() test

diff --git a/ChangeLog b/ChangeLog
index 73d3d07..edc2416 100644
--- a/ChangeLog
+++ b/ChangeLog
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,3 +1,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+2011-08-17  Kevin L. Mitchell &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
+
+* include/client.h: Fix minor issue in IsLocOp() test
+
+* include/patchlevel.h (PATCHLEVEL): bump patchlevel to 14
+
 2011-05-15  Michael Poole  &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
 * ircd/s_auth.c (iauth_cmd_done_account): Do not copy the
diff --git a/include/client.h b/include/client.h
index 7110dd0..26f0481 100644
--- a/include/client.h
+++ b/include/client.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -556,7 +556,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct Client {
 /** Return non-zero if the client caused a net.burst. */
 #define IsJunction(x)           HasFlag(x, FLAG_JUNCTION)
 /** Return non-zero if the client has set mode +O (local operator) locally. */
-#define IsLocOp(x)              (MyUser(x) &amp;amp;&amp;amp; HasFlag(x, FLAG_LOCOP))
+#define IsLocOp(x)              (MyConnect(x) &amp;amp;&amp;amp; HasFlag(x, FLAG_LOCOP))
 /** Return non-zero if the client has set mode +o (global operator). */
 #define IsOper(x)               HasFlag(x, FLAG_OPER)
 /** Return non-zero if the client has an active UDP ping request. */
diff --git a/include/patchlevel.h b/include/patchlevel.h
index dcdffbe..df0484b 100644
--- a/include/patchlevel.h
+++ b/include/patchlevel.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -18,7 +18,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  * $Id$
  *
  */
-#define PATCHLEVEL "13"
+#define PATCHLEVEL "14"
 
 #define RELEASE ".12."
 
-----------------------------------------------------------------------

Summary of changes:
 ChangeLog            |    6 ++++++
 include/client.h     |    2 +-
 include/patchlevel.h |    2 +-
 3 files changed, 8 insertions(+), 2 deletions(-)


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Kevin L. Mitchell</dc:creator>
    <dc:date>2011-08-17T23:55:18</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/498">
    <title>[SCM] Undernet IRC Server Source Code. branchu2_10_12_branch updated. b6f0b0f286a14781eb07d8aa08c9e500eefb8082</title>
    <link>http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/498</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Undernet IRC Server Source Code.".

The branch, u2_10_12_branch has been updated
       via  b6f0b0f286a14781eb07d8aa08c9e500eefb8082 (commit)
      from  0c7218df03ccb43d5e594e69eb03c250330283b5 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit b6f0b0f286a14781eb07d8aa08c9e500eefb8082
Author: Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
Date:   Sun May 15 17:05:19 2011 -0400

    When IAuth provides creation timestamp, exclude it from the name.

diff --git a/ChangeLog b/ChangeLog
index 604aacd..73d3d07 100644
--- a/ChangeLog
+++ b/ChangeLog
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,3 +1,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+2011-05-15  Michael Poole  &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
+* ircd/s_auth.c (iauth_cmd_done_account): Do not copy the
+account's creation timestamp into the account name.
+
 2010-07-05  Kevin L. Mitchell  &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
 
 * include/patchlevel.h (PATCHLEVEL): bump patchlevel from -rc2 to
diff --git a/ircd/s_auth.c b/ircd/s_auth.c
index de47b33..2a00dd1 100644
--- a/ircd/s_auth.c
+++ b/ircd/s_auth.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1953,8 +1953,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int iauth_cmd_done_account(struct IAuth *iauth, struct Client *cli,
   }
   /* If account has a creation timestamp, use it. */
   assert(cli_user(cli) != NULL);
-  if (params[0][len] == ':')
+  if (params[0][len] == ':') {
     cli_user(cli)-&amp;gt;acc_create = strtoul(params[0] + len + 1, NULL, 10);
+    params[0][len] = '\0';
+  }
 
   /* Copy account name to User structure. */
   ircd_strncpy(cli_user(cli)-&amp;gt;account, params[0], ACCOUNTLEN);
-----------------------------------------------------------------------

Summary of changes:
 ChangeLog     |    5 +++++
 ircd/s_auth.c |    4 +++-
 2 files changed, 8 insertions(+), 1 deletions(-)


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Entrope</dc:creator>
    <dc:date>2011-05-15T21:06:49</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/497">
    <title>[SCM] Undernet Coder Committee web site repository.branch master updated. 53baf6dff48edfac561e3664d26516d35b29ca74</title>
    <link>http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/497</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Undernet Coder Committee web site repository.".

The branch, master has been updated
       via  53baf6dff48edfac561e3664d26516d35b29ca74 (commit)
      from  1ded5a7b3a4c8122cf5f762d500915616244af9d (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 53baf6dff48edfac561e3664d26516d35b29ca74
Author: Kevin L. Mitchell &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
Date:   Thu Jan 13 12:00:10 2011 -0500

    Ignore configuration and the sum file

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..3b684da
--- /dev/null
+++ b/.gitignore
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,2 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+conf.php
+linesync.sum
-----------------------------------------------------------------------

Summary of changes:
 .cvsignore =&amp;gt; .gitignore |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
 copy .cvsignore =&amp;gt; .gitignore (100%)


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Kevin L. Mitchell</dc:creator>
    <dc:date>2011-01-13T17:00:19</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/496">
    <title>[SCM] Undernet IRC Server Source Code. branch masterupdated. d3f3d514c104acf4628fcd94f18b5d34623d7b4e</title>
    <link>http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/496</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Undernet IRC Server Source Code.".

The branch, master has been updated
       via  d3f3d514c104acf4628fcd94f18b5d34623d7b4e (commit)
      from  3b2deffc22f7ddd857d76db4b980b63e602d05ec (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit d3f3d514c104acf4628fcd94f18b5d34623d7b4e
Author: Kevin L. Mitchell &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
Date:   Thu Jan 13 11:36:53 2011 -0500

    Testing success of migration and the email script

diff --git a/README b/README
index e722967..e14ff5d 100644
--- a/README
+++ b/README
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -138,3 +138,4 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; set rlim_fd_cur = 8192
 For more useful hints see http://www.sean.de/Solaris/soltune.html
 
 Created by Sengaia &amp;lt;sengaia&amp;lt; at &amp;gt;undernet.org&amp;gt; on July 20, 2002.
+
-----------------------------------------------------------------------

Summary of changes:
 README |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Kevin L. Mitchell</dc:creator>
    <dc:date>2011-01-13T16:37:02</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/495">
    <title>SF.net SVN: undernet-ircu:[1950] homepage/trunk/index.php</title>
    <link>http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/495</link>
    <description>&lt;pre&gt;Revision: 1950
          http://undernet-ircu.svn.sourceforge.net/undernet-ircu/?rev=1950&amp;amp;view=rev
Author:   klmitch
Date:     2010-07-05 22:39:27 +0000 (Mon, 05 Jul 2010)

Log Message:
-----------
SourceForge changed the way release notes are done

Modified Paths:
--------------
    homepage/trunk/index.php

Modified: homepage/trunk/index.php
===================================================================
--- homepage/trunk/index.php2010-07-05 21:30:48 UTC (rev 1949)
+++ homepage/trunk/index.php2010-07-05 22:39:27 UTC (rev 1950)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -24,7 +24,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                                   &amp;lt;td&amp;gt;
                                   &amp;lt;a href="http://prdownloads.sourceforge.net/undernet-ircu/&amp;lt;?= $current_release ?&amp;gt;.tar.gz?download"&amp;gt;
                                   &amp;lt;font face="Verdana" size="2"&amp;gt;&amp;lt;?= $current_release ?&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
-                                  &amp;lt;td&amp;gt;&amp;lt;font face="Verdana" size="2"&amp;gt;[&amp;lt;/font&amp;gt;&amp;lt;a href="http://sourceforge.net/project/shownotes.php?group_id=63470&amp;amp;amp;release_id=&amp;lt;?= $current_release_id ?&amp;gt;"&amp;gt;&amp;lt;span style="text-decoration: none"&amp;gt;&amp;lt;font face="Verdana" size="2"&amp;gt;release 
+                                  &amp;lt;td&amp;gt;&amp;lt;font face="Verdana" size="2"&amp;gt;[&amp;lt;/font&amp;gt;&amp;lt;a href="&amp;lt;?= $current_release_id ?&amp;gt;"&amp;gt;&amp;lt;span style="text-decoration: none"&amp;gt;&amp;lt;font face="Verdana" size="2"&amp;gt;release 
                                   notes&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;font face="Verdana" size="2"&amp;gt;]&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;
                                 &amp;lt;/tr&amp;gt;
                                 &amp;lt;tr&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -33,7 +33,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                                   &amp;lt;td&amp;gt;
                                   &amp;lt;a href="http://prdownloads.sourceforge.net/undernet-ircu/&amp;lt;?= $required_release ?&amp;gt;.tar.gz?download"&amp;gt;
                                   &amp;lt;font face="Verdana" size="2"&amp;gt;&amp;lt;?= $required_release ?&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
-                                  &amp;lt;td&amp;gt;&amp;lt;font face="Verdana" size="2"&amp;gt;[&amp;lt;/font&amp;gt;&amp;lt;a href="http://sourceforge.net/project/shownotes.php?group_id=63470&amp;amp;amp;release_id=&amp;lt;?= $required_release_id ?&amp;gt;"&amp;gt;&amp;lt;span style="text-decoration: none"&amp;gt;&amp;lt;font face="Verdana" size="2"&amp;gt;release 
+                                  &amp;lt;td&amp;gt;&amp;lt;font face="Verdana" size="2"&amp;gt;[&amp;lt;/font&amp;gt;&amp;lt;a href="&amp;lt;?= $required_release_id ?&amp;gt;"&amp;gt;&amp;lt;span style="text-decoration: none"&amp;gt;&amp;lt;font face="Verdana" size="2"&amp;gt;release 
                                   notes&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;font face="Verdana" size="2"&amp;gt;]&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;
                                 &amp;lt;/tr&amp;gt;
                               &amp;lt;/table&amp;gt;


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
&lt;/pre&gt;</description>
    <dc:creator>klmitch&lt; at &gt;users.sourceforge.net</dc:creator>
    <dc:date>2010-07-05T22:39:27</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/494">
    <title>SF.net SVN: undernet-ircu:[1948]ircu2/branches/u2_10_12_branch</title>
    <link>http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/494</link>
    <description>&lt;pre&gt;Revision: 1948
          http://undernet-ircu.svn.sourceforge.net/undernet-ircu/?rev=1948&amp;amp;view=rev
Author:   klmitch
Date:     2010-07-05 21:28:54 +0000 (Mon, 05 Jul 2010)

Log Message:
-----------
Bump MAXBANS and MAXSILES, bump PATCHLEVEL for release

Modified Paths:
--------------
    ircu2/branches/u2_10_12_branch/ChangeLog
    ircu2/branches/u2_10_12_branch/include/patchlevel.h
    ircu2/branches/u2_10_12_branch/ircd/ircd_features.c

Modified: ircu2/branches/u2_10_12_branch/ChangeLog
===================================================================
--- ircu2/branches/u2_10_12_branch/ChangeLog2010-04-18 23:15:10 UTC (rev 1947)
+++ ircu2/branches/u2_10_12_branch/ChangeLog2010-07-05 21:28:54 UTC (rev 1948)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,3 +1,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+2010-07-05  Kevin L. Mitchell  &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
+
+* include/patchlevel.h (PATCHLEVEL): bump patchlevel from -rc2 to
+actual 13
+
+* ircd/ircd_features.c: bump MAXBANS from 45 to 50, and MAXSILES
+from 15 to 25
+
 2010-03-28  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
 * ircd/gline.c: Replace CurrentTime with TStime(), and remove the

Modified: ircu2/branches/u2_10_12_branch/include/patchlevel.h
===================================================================
--- ircu2/branches/u2_10_12_branch/include/patchlevel.h2010-04-18 23:15:10 UTC (rev 1947)
+++ ircu2/branches/u2_10_12_branch/include/patchlevel.h2010-07-05 21:28:54 UTC (rev 1948)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -18,7 +18,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  * $Id$
  *
  */
-#define PATCHLEVEL "13-rc2"
+#define PATCHLEVEL "13"
 
 #define RELEASE ".12."
 

Modified: ircu2/branches/u2_10_12_branch/ircd/ircd_features.c
===================================================================
--- ircu2/branches/u2_10_12_branch/ircd/ircd_features.c2010-04-18 23:15:10 UTC (rev 1947)
+++ ircu2/branches/u2_10_12_branch/ircd/ircd_features.c2010-07-05 21:28:54 UTC (rev 1948)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -331,8 +331,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
   F_I(MAXCHANNELSPERUSER, 0, 10, 0),
   F_I(NICKLEN, 0, 12, 0),
   F_I(AVBANLEN, 0, 40, 0),
-  F_I(MAXBANS, 0, 45, 0),
-  F_I(MAXSILES, 0, 15, 0),
+  F_I(MAXBANS, 0, 50, 0),
+  F_I(MAXSILES, 0, 25, 0),
   F_I(HANGONGOODLINK, 0, 300, 0),
   F_I(HANGONRETRYDELAY, 0, 10, 0),
   F_I(CONNECTTIMEOUT, 0, 90, 0),


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
&lt;/pre&gt;</description>
    <dc:creator>klmitch&lt; at &gt;users.sourceforge.net</dc:creator>
    <dc:date>2010-07-05T21:28:54</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/493">
    <title>SF.net SVN: undernet-ircu:[1949] ircu2/tags/u2_10_12_13/</title>
    <link>http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/493</link>
    <description>&lt;pre&gt;Revision: 1949
          http://undernet-ircu.svn.sourceforge.net/undernet-ircu/?rev=1949&amp;amp;view=rev
Author:   klmitch
Date:     2010-07-05 21:30:48 +0000 (Mon, 05 Jul 2010)

Log Message:
-----------
Release u2.10.12.13

Added Paths:
-----------
    ircu2/tags/u2_10_12_13/


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
&lt;/pre&gt;</description>
    <dc:creator>klmitch&lt; at &gt;users.sourceforge.net</dc:creator>
    <dc:date>2010-07-05T21:30:49</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/492">
    <title>SF.net SVN: undernet-ircu:[1947]ircu2/branches/u2_10_12_branch</title>
    <link>http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/492</link>
    <description>&lt;pre&gt;Revision: 1947
          http://undernet-ircu.svn.sourceforge.net/undernet-ircu/?rev=1947&amp;amp;view=rev
Author:   entrope
Date:     2010-04-18 23:15:10 +0000 (Sun, 18 Apr 2010)

Log Message:
-----------
Treat G-line-related times as network times, rather than local times.

Modified Paths:
--------------
    ircu2/branches/u2_10_12_branch/ChangeLog
    ircu2/branches/u2_10_12_branch/ircd/gline.c
    ircu2/branches/u2_10_12_branch/ircd/m_gline.c

Modified: ircu2/branches/u2_10_12_branch/ChangeLog
===================================================================
--- ircu2/branches/u2_10_12_branch/ChangeLog2010-03-09 03:05:38 UTC (rev 1946)
+++ ircu2/branches/u2_10_12_branch/ChangeLog2010-04-18 23:15:10 UTC (rev 1947)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,3 +1,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+2010-03-28  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
+* ircd/gline.c: Replace CurrentTime with TStime(), and remove the
+uses of TSoffset, so that all G-line-related times are assumed to
+be in network time.
+
+* ircd/m_gline.c: Likewise.
+
 2010-03-08  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
 * ircd/m_server.c (enum lh_type): New type.

Modified: ircu2/branches/u2_10_12_branch/ircd/gline.c
===================================================================
--- ircu2/branches/u2_10_12_branch/ircd/gline.c2010-03-09 03:05:38 UTC (rev 1946)
+++ ircu2/branches/u2_10_12_branch/ircd/gline.c2010-04-18 23:15:10 UTC (rev 1947)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -86,11 +86,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     /* Figure out the next pointer in list... */\
     if ((((next) = (gl)-&amp;gt;gl_next) || 1) &amp;amp;&amp;amp;\
 /* Then see if it's expired */\
-(gl)-&amp;gt;gl_lifetime &amp;lt;= CurrentTime)\
+(gl)-&amp;gt;gl_lifetime &amp;lt;= TStime())                  \
       /* Record has expired, so free the G-line */\
       gline_free((gl));\
     /* See if we need to expire the G-line */\
-    else if ((((gl)-&amp;gt;gl_expire &amp;gt; CurrentTime) ||        \
+    else if ((((gl)-&amp;gt;gl_expire &amp;gt; TStime()) ||\
       (((gl)-&amp;gt;gl_flags &amp;amp;= ~GLINE_ACTIVE) &amp;amp;&amp;amp; 0) ||\
       ((gl)-&amp;gt;gl_state = GLOCAL_GLOBAL)) &amp;amp;&amp;amp; 0)\
       ; /* empty statement */\
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -341,7 +341,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 GlineIsRemActive(gline) ? '+' : '-', gline-&amp;gt;gl_user,
 gline-&amp;gt;gl_host ? "&amp;lt; at &amp;gt;" : "",
 gline-&amp;gt;gl_host ? gline-&amp;gt;gl_host : "",
-gline-&amp;gt;gl_expire - CurrentTime, gline-&amp;gt;gl_lastmod,
+gline-&amp;gt;gl_expire - TStime(), gline-&amp;gt;gl_lastmod,
 gline-&amp;gt;gl_lifetime, gline-&amp;gt;gl_reason);
 
   return 0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -499,11 +499,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
    * expiration time for greater than GLINE_MAX_EXPIRE.
    */
   if (!(flags &amp;amp; GLINE_FORCE) &amp;amp;&amp;amp;
-      (expire &amp;lt;= CurrentTime || expire &amp;gt; CurrentTime + GLINE_MAX_EXPIRE)) {
+      (expire &amp;lt;= TStime() || expire &amp;gt; TStime() + GLINE_MAX_EXPIRE)) {
     if (!IsServer(sptr) &amp;amp;&amp;amp; MyConnect(sptr))
       send_reply(sptr, ERR_BADEXPIRE, expire);
     return 0;
-  } else if (expire &amp;lt;= CurrentTime) {
+  } else if (expire &amp;lt;= TStime()) {
     /* This expired G-line was forced to be added, so mark it inactive. */
     flags &amp;amp;= ~GLINE_ACTIVE;
   }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -525,7 +525,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
        (flags &amp;amp; GLINE_BADCHAN) ? "BADCHAN" : "GLINE", user,
        (flags &amp;amp; (GLINE_BADCHAN|GLINE_REALNAME)) ? "" : "&amp;lt; at &amp;gt;",
        (flags &amp;amp; (GLINE_BADCHAN|GLINE_REALNAME)) ? "" : host,
-       expire + TSoffset, reason);
+       expire, reason);
 
   /* and log it */
   log_write(LS_GLINE, L_INFO, LOG_NOSNOTICE,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -534,7 +534,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     flags &amp;amp; GLINE_BADCHAN ? "BADCHAN" : "GLINE", user,
     flags &amp;amp; (GLINE_BADCHAN|GLINE_REALNAME) ? "" : "&amp;lt; at &amp;gt;",
     flags &amp;amp; (GLINE_BADCHAN|GLINE_REALNAME) ? "" : host,
-    expire + TSoffset, reason);
+    expire, reason);
 
   /* make the gline */
   agline = make_gline(user, host, reason, expire, lastmod, lifetime, flags);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -592,14 +592,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                        GlineIsBadChan(gline) ? "BADCHAN" : "GLINE",
                        gline-&amp;gt;gl_user, gline-&amp;gt;gl_host ? "&amp;lt; at &amp;gt;" : "",
                        gline-&amp;gt;gl_host ? gline-&amp;gt;gl_host : "",
-                       gline-&amp;gt;gl_expire + TSoffset, gline-&amp;gt;gl_reason);
-  
+                       gline-&amp;gt;gl_expire, gline-&amp;gt;gl_reason);
+
   log_write(LS_GLINE, L_INFO, LOG_NOSNOTICE,
     "%#C activating global %s for %s%s%s, expiring at %Tu: %s", sptr,
     GlineIsBadChan(gline) ? "BADCHAN" : "GLINE", gline-&amp;gt;gl_user,
     gline-&amp;gt;gl_host ? "&amp;lt; at &amp;gt;" : "",
     gline-&amp;gt;gl_host ? gline-&amp;gt;gl_host : "",
-    gline-&amp;gt;gl_expire + TSoffset, gline-&amp;gt;gl_reason);
+    gline-&amp;gt;gl_expire, gline-&amp;gt;gl_reason);
 
   if (!(flags &amp;amp; GLINE_LOCAL)) /* don't propagate local changes */
     gline_propagate(cptr, sptr, gline);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -660,14 +660,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
        msg, GlineIsBadChan(gline) ? "BADCHAN" : "GLINE",
        gline-&amp;gt;gl_user, gline-&amp;gt;gl_host ? "&amp;lt; at &amp;gt;" : "",
                        gline-&amp;gt;gl_host ? gline-&amp;gt;gl_host : "",
-       gline-&amp;gt;gl_expire + TSoffset, gline-&amp;gt;gl_reason);
+       gline-&amp;gt;gl_expire, gline-&amp;gt;gl_reason);
 
   log_write(LS_GLINE, L_INFO, LOG_NOSNOTICE,
     "%#C %s %s for %s%s%s, expiring at %Tu: %s", sptr, msg,
     GlineIsBadChan(gline) ? "BADCHAN" : "GLINE", gline-&amp;gt;gl_user,
     gline-&amp;gt;gl_host ? "&amp;lt; at &amp;gt;" : "",
     gline-&amp;gt;gl_host ? gline-&amp;gt;gl_host : "",
-    gline-&amp;gt;gl_expire + TSoffset, gline-&amp;gt;gl_reason);
+    gline-&amp;gt;gl_expire, gline-&amp;gt;gl_reason);
 
   if (!(flags &amp;amp; GLINE_LOCAL)) /* don't propagate local changes */
     gline_propagate(cptr, sptr, gline);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -727,7 +727,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
   /* first, check out the expiration time... */
   if ((flags &amp;amp; GLINE_EXPIRE) &amp;amp;&amp;amp; expire) {
     if (!(flags &amp;amp; GLINE_FORCE) &amp;amp;&amp;amp;
-(expire &amp;lt;= CurrentTime || expire &amp;gt; CurrentTime + GLINE_MAX_EXPIRE)) {
+(expire &amp;lt;= TStime() || expire &amp;gt; TStime() + GLINE_MAX_EXPIRE)) {
       if (!IsServer(sptr) &amp;amp;&amp;amp; MyConnect(sptr)) /* bad expiration time */
 send_reply(sptr, ERR_BADEXPIRE, expire);
       return 0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -768,7 +768,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       (action == GLINE_LOCAL_DEACTIVATE &amp;amp;&amp;amp;
        (gline-&amp;gt;gl_state == GLOCAL_DEACTIVATED)) ||
       /* can't activate an expired G-line */
-      IRCD_MAX(gline-&amp;gt;gl_expire, expire) &amp;lt;= CurrentTime)
+      IRCD_MAX(gline-&amp;gt;gl_expire, expire) &amp;lt;= TStime())
     action = GLINE_MODIFY; /* no activity state modifications */
 
   Debug((DEBUG_DEBUG,  "About to perform changes; flags 0x%04x, action %s",
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -873,7 +873,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
   flags &amp;amp; GLINE_OPERFORCE ? "!" : "", op,
   gline-&amp;gt;gl_user, gline-&amp;gt;gl_host ? "&amp;lt; at &amp;gt;" : "",
   gline-&amp;gt;gl_host ? gline-&amp;gt;gl_host : "",
-  gline-&amp;gt;gl_expire - CurrentTime, gline-&amp;gt;gl_lastmod,
+  gline-&amp;gt;gl_expire - TStime(), gline-&amp;gt;gl_lastmod,
   gline-&amp;gt;gl_lifetime, gline-&amp;gt;gl_reason);
 
   /* OK, let's do the G-line... */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1049,7 +1049,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     GlineIsRemActive(gline) ? '+' : '-', gline-&amp;gt;gl_user,
                     gline-&amp;gt;gl_host ? "&amp;lt; at &amp;gt;" : "",
                     gline-&amp;gt;gl_host ? gline-&amp;gt;gl_host : "",
-    gline-&amp;gt;gl_expire - CurrentTime, gline-&amp;gt;gl_lastmod,
+    gline-&amp;gt;gl_expire - TStime(), gline-&amp;gt;gl_lastmod,
                     gline-&amp;gt;gl_lifetime, gline-&amp;gt;gl_reason);
   }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1057,7 +1057,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     if (!GlineIsLocal(gline) &amp;amp;&amp;amp; gline-&amp;gt;gl_lastmod)
       sendcmdto_one(&amp;amp;me, CMD_GLINE, cptr, "* %c%s %Tu %Tu %Tu :%s",
     GlineIsRemActive(gline) ? '+' : '-', gline-&amp;gt;gl_user,
-    gline-&amp;gt;gl_expire - CurrentTime, gline-&amp;gt;gl_lastmod,
+    gline-&amp;gt;gl_expire - TStime(), gline-&amp;gt;gl_lastmod,
     gline-&amp;gt;gl_lifetime, gline-&amp;gt;gl_reason);
   }
 }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1077,7 +1077,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 GlineIsRemActive(gline) ? '+' : '-', gline-&amp;gt;gl_user,
 gline-&amp;gt;gl_host ? "&amp;lt; at &amp;gt;" : "",
                 gline-&amp;gt;gl_host ? gline-&amp;gt;gl_host : "",
-gline-&amp;gt;gl_expire - CurrentTime, gline-&amp;gt;gl_lastmod,
+gline-&amp;gt;gl_expire - TStime(), gline-&amp;gt;gl_lastmod,
 gline-&amp;gt;gl_lifetime, gline-&amp;gt;gl_reason);
 
   return 0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1104,8 +1104,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     send_reply(sptr, RPL_GLIST, gline-&amp;gt;gl_user,
                gline-&amp;gt;gl_host ? "&amp;lt; at &amp;gt;" : "",
                gline-&amp;gt;gl_host ? gline-&amp;gt;gl_host : "",
-       gline-&amp;gt;gl_expire + TSoffset, gline-&amp;gt;gl_lastmod,
-       gline-&amp;gt;gl_lifetime + TSoffset,
+       gline-&amp;gt;gl_expire, gline-&amp;gt;gl_lastmod,
+       gline-&amp;gt;gl_lifetime,
        GlineIsLocal(gline) ? cli_name(&amp;amp;me) : "*",
        gline-&amp;gt;gl_state == GLOCAL_ACTIVATED ? "&amp;gt;" :
        (gline-&amp;gt;gl_state == GLOCAL_DEACTIVATED ? "&amp;lt;" : ""),
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1115,8 +1115,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       send_reply(sptr, RPL_GLIST, gline-&amp;gt;gl_user,
  gline-&amp;gt;gl_host ? "&amp;lt; at &amp;gt;" : "",
  gline-&amp;gt;gl_host ? gline-&amp;gt;gl_host : "",
- gline-&amp;gt;gl_expire + TSoffset, gline-&amp;gt;gl_lastmod,
- gline-&amp;gt;gl_lifetime + TSoffset,
+ gline-&amp;gt;gl_expire, gline-&amp;gt;gl_lastmod,
+ gline-&amp;gt;gl_lifetime,
  GlineIsLocal(gline) ? cli_name(&amp;amp;me) : "*",
  gline-&amp;gt;gl_state == GLOCAL_ACTIVATED ? "&amp;gt;" :
  (gline-&amp;gt;gl_state == GLOCAL_DEACTIVATED ? "&amp;lt;" : ""),
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1125,8 +1125,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
     gliter(BadChanGlineList, gline, sgline) {
       send_reply(sptr, RPL_GLIST, gline-&amp;gt;gl_user, "", "",
- gline-&amp;gt;gl_expire + TSoffset, gline-&amp;gt;gl_lastmod,
- gline-&amp;gt;gl_lifetime + TSoffset,
+ gline-&amp;gt;gl_expire, gline-&amp;gt;gl_lastmod,
+ gline-&amp;gt;gl_lifetime,
  GlineIsLocal(gline) ? cli_name(&amp;amp;me) : "*",
  gline-&amp;gt;gl_state == GLOCAL_ACTIVATED ? "&amp;gt;" :
  (gline-&amp;gt;gl_state == GLOCAL_DEACTIVATED ? "&amp;lt;" : ""),
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1154,8 +1154,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     send_reply(sptr, RPL_STATSGLINE, 'G', gline-&amp;gt;gl_user,
        gline-&amp;gt;gl_host ? "&amp;lt; at &amp;gt;" : "",
        gline-&amp;gt;gl_host ? gline-&amp;gt;gl_host : "",
-       gline-&amp;gt;gl_expire + TSoffset, gline-&amp;gt;gl_lastmod,
-       gline-&amp;gt;gl_lifetime + TSoffset,
+       gline-&amp;gt;gl_expire, gline-&amp;gt;gl_lastmod,
+       gline-&amp;gt;gl_lifetime,
        gline-&amp;gt;gl_state == GLOCAL_ACTIVATED ? "&amp;gt;" :
        (gline-&amp;gt;gl_state == GLOCAL_DEACTIVATED ? "&amp;lt;" : ""),
        GlineIsRemActive(gline) ? '+' : '-',

Modified: ircu2/branches/u2_10_12_branch/ircd/m_gline.c
===================================================================
--- ircu2/branches/u2_10_12_branch/ircd/m_gline.c2010-03-09 03:05:38 UTC (rev 1946)
+++ ircu2/branches/u2_10_12_branch/ircd/m_gline.c2010-04-18 23:15:10 UTC (rev 1947)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -113,7 +113,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  * but you can't have everything in a macro ;)
  */
 #define abs_expire(exp)\
-  ((exp) &amp;gt;= CurrentTime - PASTWATCH ? (exp) : (exp) + CurrentTime)
+  ((exp) &amp;gt;= TStime() - PASTWATCH ? (exp) : (exp) + TStime())
 
 /*
  * ms_gline - server message handler
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -258,13 +258,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
    "target %s, mask %s, operforce %s, action %c, expire %Tu, "
    "lastmod %Tu, reason: %s", target, mask,
    flags &amp;amp; GLINE_OPERFORCE ? "YES" : "NO",
-   action == GLINE_ACTIVATE ? '+' :  '-', expire, CurrentTime,
+   action == GLINE_ACTIVATE ? '+' :  '-', expire, TStime(),
    reason));
 
     sendcmdto_one(sptr, CMD_GLINE, acptr, "%C %s%c%s %Tu %Tu :%s",
   acptr, flags &amp;amp; GLINE_OPERFORCE ? "!" : "",
   action == GLINE_ACTIVATE ? '+' : '-', mask,
-  expire - CurrentTime, CurrentTime, reason);
+  expire - TStime(), TStime(), reason);
 
     return 0; /* all done */
   }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -423,7 +423,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       return need_more_params(sptr, "GLINE");
 
     target = parv[2]; /* get the target... */
-    expire = strtol(parv[3], &amp;amp;end, 10) + CurrentTime; /* and the expiration */
+    expire = strtol(parv[3], &amp;amp;end, 10) + TStime(); /* and the expiration */
     if (*end != '\0')
       return send_reply(sptr, SND_EXPLICIT | ERR_BADEXPIRE, "%s :Bad expire time", parv[3]);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -460,7 +460,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     if (parc &amp;gt; 3) {
       /* get expiration and target */
       reason = parv[parc - 1];
-      expire = strtol(parv[parc - 2], &amp;amp;end, 10) + CurrentTime;
+      expire = strtol(parv[parc - 2], &amp;amp;end, 10) + TStime();
       if (*end != '\0')
         return send_reply(sptr, SND_EXPLICIT | ERR_BADEXPIRE, "%s :Bad expire time", parv[parc - 2]);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -554,7 +554,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       sendcmdto_one(sptr, CMD_GLINE, acptr, "%C %s%c%s %Tu %Tu :%s",
     acptr, flags &amp;amp; GLINE_OPERFORCE ? "!" : "",
     action == GLINE_ACTIVATE ? '+' : '-', mask,
-    expire - CurrentTime, CurrentTime, reason);
+    expire - TStime(), TStime(), reason);
 
       return 0; /* all done */
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -624,14 +624,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
   if (agline) /* modifying an existing G-line */
     return gline_modify(cptr, sptr, agline, action, reason, expire,
-CurrentTime, 0, flags);
+TStime(), 0, flags);
 
   assert(action != GLINE_LOCAL_ACTIVATE);
   assert(action != GLINE_LOCAL_DEACTIVATE);
   assert(action != GLINE_MODIFY);
 
   /* create a new G-line */
-  return gline_add(cptr, sptr, mask, reason, expire, CurrentTime, 0,
+  return gline_add(cptr, sptr, mask, reason, expire, TStime(), 0,
    flags | ((action == GLINE_ACTIVATE) ? GLINE_ACTIVE : 0));
 }
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
&lt;/pre&gt;</description>
    <dc:creator>entrope&lt; at &gt;users.sourceforge.net</dc:creator>
    <dc:date>2010-04-18T23:15:11</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/491">
    <title>SF.net SVN: undernet-ircu:[1946]ircu2/branches/u2_10_12_branch</title>
    <link>http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/491</link>
    <description>&lt;pre&gt;Revision: 1946
          http://undernet-ircu.svn.sourceforge.net/undernet-ircu/?rev=1946&amp;amp;view=rev
Author:   entrope
Date:     2010-03-09 03:05:38 +0000 (Tue, 09 Mar 2010)

Log Message:
-----------
Clarify the link rejection message for unauthorized hubs.

Make the function that makes that decision a little more maintainable.

Modified Paths:
--------------
    ircu2/branches/u2_10_12_branch/ChangeLog
    ircu2/branches/u2_10_12_branch/ircd/m_server.c

Modified: ircu2/branches/u2_10_12_branch/ChangeLog
===================================================================
--- ircu2/branches/u2_10_12_branch/ChangeLog2010-03-09 02:59:32 UTC (rev 1945)
+++ ircu2/branches/u2_10_12_branch/ChangeLog2010-03-09 03:05:38 UTC (rev 1946)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,5 +1,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 2010-03-08  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
+* ircd/m_server.c (enum lh_type): New type.
+(check_loop_and_lh): Use the enum instead of magic integers.
+Make the error message a little clearer when neither "hub" nor
+"maxhops" is specified for a server.  Clean up the control flow
+when we decide to reject the link.
+
+2010-03-08  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
 * ircd/test/ircd_match_t.c (_SC_PAGE_SIZE): Default to
 _SC_PAGESIZE if that is defined (as it is on some Unixes).
 

Modified: ircu2/branches/u2_10_12_branch/ircd/m_server.c
===================================================================
--- ircu2/branches/u2_10_12_branch/ircd/m_server.c2010-03-09 02:59:32 UTC (rev 1945)
+++ ircu2/branches/u2_10_12_branch/ircd/m_server.c2010-03-09 03:05:38 UTC (rev 1946)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -96,6 +96,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
   return prot;
 }
 
+/** Reason not to accept a server's new announcement. */
+enum lh_type {
+  ALLOWED, /**&amp;lt; The new server link is accepted. */
+  MAX_HOPS_EXCEEDED, /**&amp;lt; The path to the server is too long. */
+  NOT_ALLOWED_TO_HUB, /**&amp;lt; My peer is not allowed to hub for the server. */
+  I_AM_NOT_HUB /**&amp;lt; I have another active server link but not FEAT_HUB. */
+};
+
 /** Check whether the introduction of a new server would cause a loop
  * or be disallowed by leaf and hub configuration directives.
  * &amp;lt; at &amp;gt;param[in] cptr Neighbor who sent the message.
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -115,7 +123,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
   struct Client* acptr;
   struct Client* LHcptr = NULL;
   struct ConfItem* lhconf;
-  int active_lh_line = 0, ii;
+  enum lh_type active_lh_line = ALLOWED;
+  int ii;
 
   if (ghost)
     *ghost = 0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -130,18 +139,22 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     if (!feature_bool(FEAT_HUB))
       for (ii = 0; ii &amp;lt;= HighestFd; ii++)
         if (LocalClientArray[ii] &amp;amp;&amp;amp; IsServer(LocalClientArray[ii])) {
-          active_lh_line = 3;
+          active_lh_line = I_AM_NOT_HUB;
           break;
         }
   }
   else if (hop &amp;gt; lhconf-&amp;gt;maximum)
   {
-    active_lh_line = 1;
+    /* Because "maximum" should be 0 for non-hub links, check whether
+     * there is a hub mask -- if not, complain that the server isn't
+     * allowed to hub.
+     */
+    active_lh_line = lhconf-&amp;gt;hub_limit ? MAX_HOPS_EXCEEDED : NOT_ALLOWED_TO_HUB;
   }
   else if (lhconf-&amp;gt;hub_limit &amp;amp;&amp;amp; match(lhconf-&amp;gt;hub_limit, host))
   {
     struct Client *ac3ptr;
-    active_lh_line = 2;
+    active_lh_line = NOT_ALLOWED_TO_HUB;
     if (junction)
       for (ac3ptr = sptr; ac3ptr != &amp;amp;me; ac3ptr = cli_serv(ac3ptr)-&amp;gt;up)
         if (IsJunction(ac3ptr)) {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -192,7 +205,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
      */
     if (IsConnecting(acptr))
     {
-      if (!active_lh_line &amp;amp;&amp;amp; exit_client(cptr, acptr, &amp;amp;me,
+      if (active_lh_line == ALLOWED &amp;amp;&amp;amp; exit_client(cptr, acptr, &amp;amp;me,
           "Just connected via another link") == CPTR_KILLED)
         return CPTR_KILLED;
       /*
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -319,7 +332,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       else if (cli_from(c2ptr) == cptr || IsServer(sptr))
       {
         struct Client *killedptrfrom = cli_from(c2ptr);
-        if (active_lh_line)
+        if (active_lh_line != ALLOWED)
         {
           /*
            * If the L: or H: line also gets rid of this link,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -332,7 +345,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
            * line problem, we don't squit that.
            */
           if (cli_from(c2ptr) == cptr || (LHcptr &amp;amp;&amp;amp; a_kills_b_too(c2ptr, LHcptr)))
-            active_lh_line = 0;
+            active_lh_line = ALLOWED;
           else
           {
             /*
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -369,12 +382,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       }
       else
       {
-        if (active_lh_line)
+        if (active_lh_line != ALLOWED)
         {
           if (LHcptr &amp;amp;&amp;amp; a_kills_b_too(LHcptr, acptr))
             break;
           if (cli_from(acptr) == cptr || (LHcptr &amp;amp;&amp;amp; a_kills_b_too(acptr, LHcptr)))
-            active_lh_line = 0;
+            active_lh_line = ALLOWED;
           else
           {
             LHcptr = 0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -397,35 +410,27 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     }
   }
 
-  if (active_lh_line)
+  if (active_lh_line != ALLOWED)
   {
-    int killed = 0;
-    if (LHcptr)
-      killed = a_kills_b_too(LHcptr, sptr);
-    else
+    if (!LHcptr)
       LHcptr = sptr;
-    if (active_lh_line == 1)
+    if (active_lh_line == MAX_HOPS_EXCEEDED)
     {
-      if (exit_client_msg(cptr, LHcptr, &amp;amp;me,
-                          "Maximum hops exceeded for %s at %s",
-                          cli_name(cptr), host) == CPTR_KILLED)
-        return CPTR_KILLED;
+      return exit_client_msg(cptr, LHcptr, &amp;amp;me,
+                             "Maximum hops exceeded for %s at %s",
+                             cli_name(cptr), host);
     }
-    else if (active_lh_line == 2)
+    else if (active_lh_line == NOT_ALLOWED_TO_HUB)
     {
-      if (exit_client_msg(cptr, LHcptr, &amp;amp;me,
-                          "%s is not allowed to hub for %s",
-                          cli_name(cptr), host) == CPTR_KILLED)
-        return CPTR_KILLED;
+      return exit_client_msg(cptr, LHcptr, &amp;amp;me,
+                             "%s is not allowed to hub for %s",
+                             cli_name(cptr), host);
     }
-    else
+    else /* I_AM_NOT_HUB */
     {
       ServerStats-&amp;gt;is_ref++;
-      if (exit_client(cptr, LHcptr, &amp;amp;me, "I'm a leaf, define HUB") == CPTR_KILLED)
-        return CPTR_KILLED;
+      return exit_client(cptr, LHcptr, &amp;amp;me, "I'm a leaf, define HUB");
     }
-    /* We just squit somebody, and it wasn't cptr. */
-    return 0;
   }
 
   return 1;


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
&lt;/pre&gt;</description>
    <dc:creator>entrope&lt; at &gt;users.sourceforge.net</dc:creator>
    <dc:date>2010-03-09T03:05:38</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/490">
    <title>SF.net SVN: undernet-ircu:[1945]ircu2/branches/u2_10_12_branch</title>
    <link>http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/490</link>
    <description>&lt;pre&gt;Revision: 1945
          http://undernet-ircu.svn.sourceforge.net/undernet-ircu/?rev=1945&amp;amp;view=rev
Author:   entrope
Date:     2010-03-09 02:59:32 +0000 (Tue, 09 Mar 2010)

Log Message:
-----------
Fix compilation problems when _SC_PAGE_SIZE is not defined by the OS.

Modified Paths:
--------------
    ircu2/branches/u2_10_12_branch/ChangeLog
    ircu2/branches/u2_10_12_branch/ircd/test/ircd_match_t.c

Modified: ircu2/branches/u2_10_12_branch/ChangeLog
===================================================================
--- ircu2/branches/u2_10_12_branch/ChangeLog2010-03-04 13:52:35 UTC (rev 1944)
+++ ircu2/branches/u2_10_12_branch/ChangeLog2010-03-09 02:59:32 UTC (rev 1945)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,3 +1,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+2010-03-08  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
+
+* ircd/test/ircd_match_t.c (_SC_PAGE_SIZE): Default to
+_SC_PAGESIZE if that is defined (as it is on some Unixes).
+
 2010-03-04  Kevin L. Mitchell  &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
 
 * ircd/s_bsd.c: use feature_int() to get the integer value of the

Modified: ircu2/branches/u2_10_12_branch/ircd/test/ircd_match_t.c
===================================================================
--- ircu2/branches/u2_10_12_branch/ircd/test/ircd_match_t.c2010-03-04 13:52:35 UTC (rev 1944)
+++ ircu2/branches/u2_10_12_branch/ircd/test/ircd_match_t.c2010-03-09 02:59:32 UTC (rev 1945)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -20,6 +20,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 # endif
 #endif
 
+#if !defined(_SC_PAGE_SIZE)
+# if defined(_SC_PAGESIZE)
+#  define _SC_PAGE_SIZE _SC_PAGESIZE
+# else
+#  error I do not know how to request the page size from your OS.
+# endif
+#endif
+
 struct match_test {
   const char *glob;
   const char *should_match;


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
&lt;/pre&gt;</description>
    <dc:creator>entrope&lt; at &gt;users.sourceforge.net</dc:creator>
    <dc:date>2010-03-09T02:59:33</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/489">
    <title>[ undernet-ircu-Patches-2718854 ] Fix compilation onDarwin</title>
    <link>http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/489</link>
    <description>&lt;pre&gt;Patches item #2718854, was opened at 2009-03-28 13:51
Message generated for change (Comment added) made by bergha
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&amp;amp;atid=504082&amp;amp;aid=2718854&amp;amp;group_id=63470

Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: Miscellaneous
Group: u2.10.12
Status: Open
Resolution: None
Priority: 5
Private: No
Submitted By: David Herrmann (dvdhrm)
Assigned to: Nobody/Anonymous (nobody)
Summary: Fix compilation on Darwin

Initial Comment:
On Darwin (at least Mac OS X 10.5 and higher) the "getrusage()" function
is available but the "struct rusage" is not defined correctly, therefore, the
built failes.

This can be fixed by defining _DARWIN_C_SOURCE before including resource.h:

--- configure.in        (Revision 157)
+++ configure.in        (Arbeitskopie)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -189,6 +189,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     *-darwin*)
        AC_MSG_RESULT([Darwin (Mac OS X) ($host) found.])
        unet_poll_syscall=no
+       AC_DEFINE([_DARWIN_C_SOURCE], 1, [Define to enable POSIX compatibility on Darwin.])
        ;;
 
     *)


----------------------------------------------------------------------

Comment By: Anders Bergh (bergha)
Date: 2010-03-07 04:44

Message:
This solves compilation on Darwin, is it going to be added?

----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&amp;amp;atid=504082&amp;amp;aid=2718854&amp;amp;group_id=63470
&lt;/pre&gt;</description>
    <dc:creator>SourceForge.net</dc:creator>
    <dc:date>2010-03-07T03:44:56</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/488">
    <title>SF.net SVN: undernet-ircu:[1944]ircu2/branches/u2_10_12_branch</title>
    <link>http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/488</link>
    <description>&lt;pre&gt;Revision: 1944
          http://undernet-ircu.svn.sourceforge.net/undernet-ircu/?rev=1944&amp;amp;view=rev
Author:   klmitch
Date:     2010-03-04 13:52:35 +0000 (Thu, 04 Mar 2010)

Log Message:
-----------
Set TOS to the value of FEAT_TOS_SERVER, not to FEAT_TOS_SERVER...

Modified Paths:
--------------
    ircu2/branches/u2_10_12_branch/ChangeLog
    ircu2/branches/u2_10_12_branch/ircd/s_bsd.c

Modified: ircu2/branches/u2_10_12_branch/ChangeLog
===================================================================
--- ircu2/branches/u2_10_12_branch/ChangeLog2010-02-02 23:34:45 UTC (rev 1943)
+++ ircu2/branches/u2_10_12_branch/ChangeLog2010-03-04 13:52:35 UTC (rev 1944)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,3 +1,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+2010-03-04  Kevin L. Mitchell  &amp;lt;klmitch&amp;lt; at &amp;gt;mit.edu&amp;gt;
+
+* ircd/s_bsd.c: use feature_int() to get the integer value of the
+feature...and don't try to set the TOS to its index!
+
 2010-02-02  Michael Poole &amp;lt;mdpoole&amp;lt; at &amp;gt;troilus.org&amp;gt;
 
 * include/patchlevel.h (PATCHLEVEL): Bump to (u2.10.12.)13-rc2.

Modified: ircu2/branches/u2_10_12_branch/ircd/s_bsd.c
===================================================================
--- ircu2/branches/u2_10_12_branch/ircd/s_bsd.c2010-02-02 23:34:45 UTC (rev 1943)
+++ ircu2/branches/u2_10_12_branch/ircd/s_bsd.c2010-03-04 13:52:35 UTC (rev 1944)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -238,7 +238,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
   /*
    * Set the TOS bits - this is nonfatal if it doesn't stick.
    */
-  if (!os_set_tos(cli_fd(cptr), FEAT_TOS_SERVER)) {
+  if (!os_set_tos(cli_fd(cptr), feature_int(FEAT_TOS_SERVER))) {
     report_error(TOS_ERROR_MSG, cli_name(cptr), errno);
   }
   if ((result = os_connect_nonb(cli_fd(cptr), &amp;amp;aconf-&amp;gt;address)) == IO_FAILURE) {


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
&lt;/pre&gt;</description>
    <dc:creator>klmitch&lt; at &gt;users.sourceforge.net</dc:creator>
    <dc:date>2010-03-04T13:52:36</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/487">
    <title>[ undernet-ircu-Patches-2960029 ] SETHOST patch for10.12.13-rc2?</title>
    <link>http://comments.gmane.org/gmane.network.irc.undernet-ircu.cvs/487</link>
    <description>&lt;pre&gt;Patches item #2960029, was opened at 2010-02-27 01:40
Message generated for change (Tracker Item Submitted) made by ewnix
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&amp;amp;atid=504082&amp;amp;aid=2960029&amp;amp;group_id=63470

Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: None
Group: None
Status: Open
Resolution: None
Priority: 5
Private: No
Submitted By: phlux (ewnix)
Assigned to: Nobody/Anonymous (nobody)
Summary: SETHOST patch for 10.12.13-rc2?

Initial Comment:
Can someone update the SETHOST patch to work with 10.12.13-rc2?

----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&amp;amp;atid=504082&amp;amp;aid=2960029&amp;amp;group_id=63470
&lt;/pre&gt;</description>
    <dc:creator>SourceForge.net</dc:creator>
    <dc:date>2010-02-27T07:40:30</dc:date>
  </item>
  <textinput rdf:about="http://search.gmane.org/?group=$group=gmane.network.irc.undernet-ircu.cvs">
    <title>Search Engine</title>
    <description>Search the mailing list at Gmane</description>
    <name>query</name>
    <link>http://search.gmane.org/?group=$group=gmane.network.irc.undernet-ircu.cvs</link>
  </textinput>
</rdf:RDF>
