added basic ssl support to ircu
[ircu2.10.12-pk.git] / ircd / m_whowas.c
index 47907c220ea744b1d8c2a889d062f1d9704dece7..eee2745cd1603ad365923d5c1e32ae3cfbb33c5e 100644 (file)
  *            note:   it is guaranteed that parv[0]..parv[parc-1] are all
  *                    non-NULL pointers.
  */
-#if 0
-/*
- * No need to include handlers.h here the signatures must match
- * and we don't need to force a rebuild of all the handlers everytime
- * we add a new one to the list. --Bleep
- */
-#include "handlers.h"
-#endif /* 0 */
+#include "config.h"
+
 #include "client.h"
 #include "hash.h"
 #include "ircd.h"
+#include "ircd_features.h"
+#include "ircd_log.h"
 #include "ircd_reply.h"
 #include "ircd_string.h"
 #include "msg.h"
 #include "send.h"
 #include "whowas.h"
 
-#include <assert.h>
+/* #include <assert.h> -- Now using assert in ircd_log.h */
 #include <stdlib.h>
 
 /*
  *
  * parv[0] = sender prefix
  * parv[1] = nickname queried
- * parv[2] = maximum returned items (optional, default is unlimitted)
+ * parv[2] = maximum returned items (optional, default is unlimited)
  * parv[3] = remote server target (Opers only, max returned items 20)
  */
 int m_whowas(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
@@ -120,76 +116,13 @@ int m_whowas(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
 
   if (parc < 2)
   {
-    sendto_one(sptr, err_str(ERR_NONICKNAMEGIVEN), me.name, parv[0]);
-    return 0;
-  }
-  if (parc > 2)
-    max = atoi(parv[2]);
-  if (parc > 3)
-    if (hunt_server(1, cptr, sptr, "%s%s " TOK_WHOWAS " %s %s :%s", 3, parc, parv))
-      return 0;
-
-  parv[1] = canonize(parv[1]);
-  if (!MyConnect(sptr) && (max > 20))
-    max = 20;                   /* Set max replies at 20 */
-  for (s = parv[1]; (nick = ircd_strtok(&p, s, ",")); s = 0)
-  {
-    /* Search through bucket, finding all nicknames that match */
-    found = 0;
-    for (temp = whowashash[hash_whowas_name(nick)]; temp; temp = temp->hnext)
-    {
-      if (0 == ircd_strcmp(nick, temp->name))
-      {
-        sendto_one(sptr, rpl_str(RPL_WHOWASUSER),
-            me.name, parv[0], temp->name, temp->username,
-            temp->hostname, temp->realname);
-        sendto_one(sptr, rpl_str(RPL_WHOISSERVER), me.name, parv[0],
-            temp->name, temp->servername, myctime(temp->logoff));
-        if (temp->away)
-          sendto_one(sptr, rpl_str(RPL_AWAY),
-              me.name, parv[0], temp->name, temp->away);
-        cur++;
-        found++;
-      }
-      if (max >= 0 && cur >= max)
-        break;
-    }
-    if (!found)
-      sendto_one(sptr, err_str(ERR_WASNOSUCHNICK), me.name, parv[0], nick);
-    /* To keep parv[1] intact for ENDOFWHOWAS */
-    if (p)
-      p[-1] = ',';
-  }
-  sendto_one(sptr, rpl_str(RPL_ENDOFWHOWAS), me.name, parv[0], parv[1]);
-  return 0;
-}
-
-
-#if 0
-/*
- * m_whowas
- *
- * parv[0] = sender prefix
- * parv[1] = nickname queried
- * parv[2] = maximum returned items (optional, default is unlimitted)
- * parv[3] = remote server target (Opers only, max returned items 20)
- */
-int m_whowas(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
-{
-  struct Whowas *temp;
-  int cur = 0;
-  int max = -1, found = 0;
-  char *p, *nick, *s;
-
-  if (parc < 2)
-  {
-    sendto_one(sptr, err_str(ERR_NONICKNAMEGIVEN), me.name, parv[0]);
+    send_reply(sptr, ERR_NONICKNAMEGIVEN);
     return 0;
   }
   if (parc > 2)
     max = atoi(parv[2]);
   if (parc > 3)
-    if (hunt_server(1, cptr, sptr, "%s%s " TOK_WHOWAS " %s %s :%s", 3, parc, parv))
+    if (hunt_server_cmd(sptr, CMD_WHOWAS, cptr, 1, "%s %s :%C", 3, parc, parv))
       return 0;
 
   parv[1] = canonize(parv[1]);
@@ -203,14 +136,17 @@ int m_whowas(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
     {
       if (0 == ircd_strcmp(nick, temp->name))
       {
-        sendto_one(sptr, rpl_str(RPL_WHOWASUSER),
-            me.name, parv[0], temp->name, temp->username,
-            temp->hostname, temp->realname);
-        sendto_one(sptr, rpl_str(RPL_WHOISSERVER), me.name, parv[0],
-            temp->name, temp->servername, myctime(temp->logoff));
+       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) :
+                     temp->servername,
+                  myctime(temp->logoff));
         if (temp->away)
-          sendto_one(sptr, rpl_str(RPL_AWAY),
-              me.name, parv[0], temp->name, temp->away);
+         send_reply(sptr, RPL_AWAY, temp->name, temp->away);
         cur++;
         found++;
       }
@@ -218,12 +154,11 @@ int m_whowas(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
         break;
     }
     if (!found)
-      sendto_one(sptr, err_str(ERR_WASNOSUCHNICK), me.name, parv[0], nick);
+      send_reply(sptr, ERR_WASNOSUCHNICK, nick);
     /* To keep parv[1] intact for ENDOFWHOWAS */
     if (p)
       p[-1] = ',';
   }
-  sendto_one(sptr, rpl_str(RPL_ENDOFWHOWAS), me.name, parv[0], parv[1]);
+  send_reply(sptr, RPL_ENDOFWHOWAS, parv[1]);
   return 0;
 }
-#endif /* 0 */