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 <[email protected]>
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
@@ -1,3 +1,39 @@
+2012-11-04  Michael Poole <[email protected]>
+
+       * 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 <[email protected]>
 
        * 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
@@ -444,6 +444,37 @@ 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
@@ -99,6 +99,9 @@ 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
@@ -86,7 +86,10 @@ 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
@@ -364,6 +364,9 @@ 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
@@ -92,6 +92,7 @@
 #include "numeric.h"
 #include "numnicks.h"
 #include "send.h"
+#include "whocmds.h"
 
 /* #include <assert.h> -- Now using assert in ircd_log.h */
 
@@ -154,6 +155,7 @@ 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
@@ -122,6 +122,40 @@ 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) && 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 & WHOSELECT_OPER) && !SeeOper(sptr,acptr))
+    return 0;
+  if (matchsel
+      && (!(matchsel & WHO_FIELD_NIC)
+          || matchexec(cli_name(acptr), mymask, minlen))
+      && (!(matchsel & WHO_FIELD_UID)
+          || matchexec(cli_user(acptr)->username, mymask, minlen))
+      && (!(matchsel & WHO_FIELD_SER)
+          || (!(HasFlag(cli_user(acptr)->server, FLAG_MAP))))
+      && (!(matchsel & WHO_FIELD_HOS)
+          || matchexec(cli_user(acptr)->host, mymask, minlen))
+      && (!(matchsel & WHO_FIELD_HOS)
+          || !HasHiddenHost(acptr)
+          || !(bitsel & WHOSELECT_EXTRA)
+          || matchexec(cli_user(acptr)->realhost, mymask, minlen))
+      && (!(matchsel & WHO_FIELD_REN)
+          || matchexec(cli_info(acptr), mymask, minlen))
+      && (!(matchsel & WHO_FIELD_NIP)
+          || (HasHiddenHost(acptr) && !(bitsel & WHOSELECT_EXTRA))
+          || !ipmask_check(&cli_ip(acptr), imask, ibits))
+      && (!(matchsel & WHO_FIELD_ACC)
+          || matchexec(cli_user(acptr)->account, mymask, minlen)))
+    return 0;
+  if (!SHOW_MORE(sptr, counter))
+    return 1;
+  do_who(sptr, acptr, chptr, fields, qrt, bitsel & WHOSELECT_EXTRA);
+  return 0;
+}
+
 /*
  * m_who - generic message handler
  *
@@ -155,6 +189,7 @@ 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 > 1) ? parv[1] : 0);
@@ -186,8 +221,8 @@ int m_who(struct Client* cptr, struct Client* sptr, int 
parc, char* parv[])
         case 'X':
           if (HasPriv(sptr, PRIV_WHOX) && 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':
@@ -342,7 +377,7 @@ 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 & WHOSELECT_EXTRA);
           }
         }
       }
@@ -352,7 +387,7 @@ int m_who(struct Client* cptr, struct Client* sptr, int 
parc, char* parv[])
             ((!(bitsel & WHOSELECT_OPER)) || SeeOper(sptr,acptr)) &&
             Process(acptr) && SHOW_MORE(sptr, counter))
         {
-          do_who(sptr, acptr, 0, fields, qrt);
+          do_who(sptr, acptr, 0, fields, qrt, bitsel & WHOSELECT_EXTRA);
         }
       }
     }
@@ -393,36 +428,10 @@ int m_who(struct Client* cptr, struct Client* sptr, int 
parc, char* parv[])
         chptr = chan->channel;
         for (member = chptr->members; member; member = member->next_member)
         {
-          acptr = member->user;
-          if (!(IsUser(acptr) && 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 & WHOSELECT_OPER) && !SeeOper(sptr,acptr))
-           continue;
-          if ((mask) &&
-              ((!(matchsel & WHO_FIELD_NIC))
-              || matchexec(cli_name(acptr), mymask, minlen))
-              && ((!(matchsel & WHO_FIELD_UID))
-              || matchexec(cli_user(acptr)->username, mymask, minlen))
-              && ((!(matchsel & WHO_FIELD_SER))
-              || (!(HasFlag(cli_user(acptr)->server, FLAG_MAP))))
-              && ((!(matchsel & WHO_FIELD_HOS))
-              || matchexec(cli_user(acptr)->host, mymask, minlen))
-              && ((!(matchsel & WHO_FIELD_HOS))
-             || !HasHiddenHost(acptr)
-             || !IsAnOper(sptr)
-              || matchexec(cli_user(acptr)->realhost, mymask, minlen))
-              && ((!(matchsel & WHO_FIELD_REN))
-              || matchexec(cli_info(acptr), mymask, minlen))
-              && ((!(matchsel & WHO_FIELD_NIP))
-             || (HasHiddenHost(acptr) && !IsAnOper(sptr))
-              || !ipmask_check(&cli_ip(acptr), &imask, ibits))
-              && ((!(matchsel & WHO_FIELD_ACC))
-              || matchexec(cli_user(acptr)->account, mymask, minlen)))
-            continue;
-          if (!SHOW_MORE(sptr, counter))
+          if (maybe_do_who(sptr, member->user, member->channel, mymask,
+                           minlen, qrt, &imask, ibits, bitsel, matchsel,
+                           fields, counter))
             break;
-          do_who(sptr, acptr, chptr, fields, qrt);
         }
       }
     }
@@ -431,39 +440,14 @@ int m_who(struct Client* cptr, struct Client* sptr, int 
parc, char* parv[])
     if ((!(counter < 1)) && matchsel)
       for (acptr = cli_prev(&me); acptr; acptr = cli_prev(acptr))
       {
-        if (!(IsUser(acptr) && Process(acptr)))
-          continue;
-       if ((bitsel & WHOSELECT_OPER) && !SeeOper(sptr,acptr))
-         continue;
-        if (!(SEE_USER(sptr, acptr, bitsel)))
-          continue;
-        if ((mask) &&
-            ((!(matchsel & WHO_FIELD_NIC))
-            || matchexec(cli_name(acptr), mymask, minlen))
-            && ((!(matchsel & WHO_FIELD_UID))
-            || matchexec(cli_user(acptr)->username, mymask, minlen))
-            && ((!(matchsel & WHO_FIELD_SER))
-                || (!(HasFlag(cli_user(acptr)->server, FLAG_MAP))))
-            && ((!(matchsel & WHO_FIELD_HOS))
-            || matchexec(cli_user(acptr)->host, mymask, minlen))
-            && ((!(matchsel & WHO_FIELD_HOS))
-           || !HasHiddenHost(acptr)
-           || !IsAnOper(sptr)
-            || matchexec(cli_user(acptr)->realhost, mymask, minlen))
-            && ((!(matchsel & WHO_FIELD_REN))
-            || matchexec(cli_info(acptr), mymask, minlen))
-            && ((!(matchsel & WHO_FIELD_NIP))
-           || (HasHiddenHost(acptr) && !IsAnOper(sptr))
-            || !ipmask_check(&cli_ip(acptr), &imask, ibits))
-            && ((!(matchsel & WHO_FIELD_ACC))
-            || matchexec(cli_user(acptr)->account, mymask, minlen)))
-          continue;
-        if (!SHOW_MORE(sptr, counter))
+        if (maybe_do_who(sptr, acptr, 0, mymask, minlen, qrt, &imask, ibits,
+                         bitsel, matchsel, fields, counter))
           break;
-        do_who(sptr, acptr, 0, fields, qrt);
       }
   }
 
+  if (bitsel & WHOSELECT_EXTRA)
+      whox_end_log();
   /* Make a clean mask suitable to be sent in the "end of" */
   if (mask && (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
@@ -33,6 +33,7 @@
 #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"
@@ -54,22 +55,134 @@
 #include "whowas.h"
 #include "msg.h"
 
+#include <errno.h>
 #include <fcntl.h>
+#include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/stat.h>
 #include <unistd.h>
 
+/* ":<server> PRIVMSG #channel :<message>\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.
+ *
+ * @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(&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.
+ *
+ * @param[in] sptr Client that used /whox.
+ * @param[in] format ircd_snprintf() format string.
+ * @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 && !(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 && !(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(&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(&me)) - strlen(chptr->chname)
+        - strlen(": PRIVMSG  : ..\r\n");
+  } else {
+    whox_sptr = NULL;
+    whox_limit = 0;
+  }
+}
+
+void whox_end_log(void)
+{
+  if (whox_pos > 0) {
+    whox_line[whox_pos] = '\0';
+    log_whox(whox_sptr, " ..%s", whox_line);
+  }
+}
+
 /** Send a WHO reply to a client who asked.
  * @param[in] sptr Client who is searching for other users.
  * @param[in] acptr Client who may be shown to \a sptr.
  * @param[in] repchan Shared channel that provides visibility.
  * @param[in] fields Bitmask of WHO_FIELD_* values, indicating what to show.
  * @param[in] qrt Query type string (ignored unless \a fields & WHO_FIELD_QTY).
+ * @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;
@@ -129,11 +242,27 @@ void do_who(struct Client* sptr, struct Client* acptr, 
struct Channel* repchan,
 
   if (fields & WHO_FIELD_NIP)
   {
-    const char* p2 = HasHiddenHost(acptr) && !IsAnOper(sptr) ?
+    const char* p2 = HasHiddenHost(acptr) && !whox ?
       feature_str(FEAT_HIDDEN_IP) :
       ircd_ntoa(&cli_ip(acptr));
     *(p1++) = ' ';
     while ((*p2) && (*(p1++) = *(p2++)));
+
+    if (HasHiddenHost(acptr) && whox && whox_sptr) {
+      const char *acct = cli_account(acptr);
+      int len = strlen(acct);
+
+      if (whox_pos + len + 2 >= whox_limit) {
+        whox_line[whox_pos] = '\0';
+        log_whox(whox_sptr, " ..%s", whox_line);
+        whox_pos = 0;
+      }
+
+      if (whox_pos > 0)
+        whox_line[whox_pos++] = ' ';
+      strcpy(whox_line + whox_pos, acct);
+      whox_pos += len;
+    }
   }
 
   if (!fields || (fields & WHO_FIELD_HOS))
commit 95c0b3ea7677e2db3512cd80b57a04eed6a8a3fc
Author: Michael Poole <[email protected]>
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
@@ -1,3 +1,13 @@
+2012-11-03  Michael Poole <[email protected]>
+
+       * 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 <[email protected]>
 
        * 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
@@ -254,7 +254,7 @@ extern const struct Numeric* get_error_numeric(int err);
 /*     RPL_COMMANDSYNTAX    334           Dalnet */
 /*     RPL_LISTSYNTAX       334           unreal */
 /*      RPL_CHANPASSOK       338           IRCnet extension (?)*/
-#define        RPL_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
@@ -211,10 +211,6 @@ static void do_whois(struct Client* sptr, struct Client 
*acptr, int parc)
     if (IsAccount(acptr))
       send_reply(sptr, RPL_WHOISACCOUNT, name, user->account);
 
-    if (HasHiddenHost(acptr) && (IsAnOper(sptr) || acptr == sptr))
-      send_reply(sptr, RPL_WHOISACTUALLY, name, user->username,
-                 user->realhost, ircd_ntoa(&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
@@ -138,8 +138,6 @@ int m_whowas(struct Client* cptr, struct Client* sptr, int 
parc, char* parv[])
       {
        send_reply(sptr, RPL_WHOWASUSER, temp->name, temp->username,
                   temp->hostname, temp->realname);
-        if (IsAnOper(sptr) && temp->realhost)
-          send_reply(sptr, RPL_WHOISACTUALLY, temp->name, temp->username, 
temp->realhost, "<untracked>");
         send_reply(sptr, RPL_WHOISSERVER, temp->name,
                    (feature_bool(FEAT_HIS_WHOIS_SERVERNAME) && !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
@@ -708,7 +708,7 @@ static Numeric replyTable[] = {
 /* 337 */
   { 0 },
 /* 338 */
-  { RPL_WHOISACTUALLY, "%s %s@%s %s :Actual user@host, Actual IP", "338" },
+  { 0 },
 /* 339 */
   { 0 },
 /* 340 */
-----------------------------------------------------------------------


hooks/post-receive
-- 
Undernet IRC Server Source Code.
_______________________________________________
Patches mailing list
[email protected]
http://undernet.sbg.org/mailman/listinfo/patches

Reply via email to