* 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_log.h"
#include "ircd_reply.h"
#include "ircd_string.h"
#include "msg.h"
#include "s_user.h"
#include "send.h"
-#include <assert.h>
+/* #include <assert.h> -- Now using assert in ircd_log.h */
+
+
+/*
+ * Old P10:
+ * Sending [:defiant.atomicrevs.net RPING Z Gte- 953863987 524184 :<No client start time>] to
+ * alphatest.atomicrevs.net
+ * Full P10:
+ * Parsing: j RI Z jAA 953865133 0 :<No client start time>
+ */
/*
* ms_rping - server message handler
*/
int ms_rping(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
{
- struct Client *acptr;
+ struct Client* destination = 0;
+ assert(0 != cptr);
+ assert(0 != sptr);
+ assert(IsServer(cptr));
+ /*
+ * shouldn't happen
+ */
if (!IsPrivileged(sptr))
return 0;
- if (parc < (IsAnOper(sptr) ? (MyConnect(sptr) ? 2 : 3) : 6))
- {
- return need_more_params(sptr, "RPING");
- return 0;
- }
- if (MyUser(sptr))
- {
- if (parc == 2)
- parv[parc++] = me.name;
- else if (!(acptr = find_match_server(parv[2])))
- {
- parv[3] = parv[2];
- parv[2] = me.name;
- parc++;
+ if (IsServer(sptr)) {
+ if (parc < 6) {
+ /*
+ * PROTOCOL ERROR
+ */
+ return need_more_params(sptr, "RPING");
}
- else
- parv[2] = acptr->name;
- if (parc == 3)
- parv[parc++] = "<No client start time>";
- }
-
- if (IsAnOper(sptr))
- {
- if (hunt_server(1, cptr, sptr, "%s%s " TOK_RPING " %s %s :%s", 2, parc, parv) !=
- HUNTED_ISME)
- return 0;
- if (!(acptr = find_match_server(parv[1])) || !IsServer(acptr))
- {
- sendto_one(sptr, err_str(ERR_NOSUCHSERVER), me.name, parv[0], parv[1]);
- return 0;
+ if ((destination = FindNServer(parv[1]))) {
+ /*
+ * if it's not for me, pass it on
+ */
+ if (IsMe(destination))
+ sendcmdto_one(&me, CMD_RPONG, sptr, "%s %s %s %s :%s", cli_name(sptr),
+ parv[2], parv[3], parv[4], parv[5]);
+ else
+ sendcmdto_one(sptr, CMD_RPING, destination, "%C %s %s %s :%s",
+ destination, parv[2], parv[3], parv[4], parv[5]);
}
- sendto_one(acptr, ":%s RPING %s %s %s :%s",
- me.name, NumServ(acptr), sptr->name, militime(0, 0), parv[3]);
}
- else
- {
- if (hunt_server(1, cptr, sptr, "%s%s " TOK_RPING " %s %s %s %s :%s", 1, parc, parv)
- != HUNTED_ISME)
+ else {
+ if (parc < 3) {
+ return need_more_params(sptr, "RPING");
+ }
+ /*
+ * Haven't made it to the start server yet, if I'm not the start server
+ * pass it on.
+ */
+ if (hunt_server_cmd(sptr, CMD_RPING, cptr, 1, "%s %C :%s", 2, parc, parv)
+ != HUNTED_ISME)
return 0;
- sendto_one(cptr, ":%s RPONG %s %s %s %s :%s", me.name, parv[0],
- parv[2], parv[3], parv[4], parv[5]);
+ /*
+ * otherwise ping the destination from here
+ */
+ if ((destination = find_match_server(parv[1]))) {
+ assert(IsServer(destination) || IsMe(destination));
+ sendcmdto_one(&me, CMD_RPING, destination, "%C %C %s :%s", destination,
+ sptr, militime(0, 0), parv[3]);
+ }
+ else
+ send_reply(sptr, ERR_NOSUCHSERVER, parv[1]);
}
return 0;
}
* mo_rping - oper message handler
* -- by Run
*
+ *
+ * Receive:
+ * RPING blah.*
+ * RPING blah.* :<start time>
+ * RPING blah.* server.* :<start time>
+ *
* parv[0] = sender (sptr->name thus)
- * if sender is a person: (traveling towards start server)
- * parv[1] = pinged server[mask]
- * parv[2] = start server (current target)
- * parv[3] = optional remark
- * if sender is a server: (traveling towards pinged server)
- * parv[1] = pinged server (current target)
- * parv[2] = original sender (person)
- * parv[3] = start time in s
- * parv[4] = start time in us
- * parv[5] = the optional remark
+ * parv[1] = pinged server name or mask (required)
+ * parv[2] = start server name or mask (optional, defaults to me)
+ * parv[3] = client start time (optional)
+ *
+ * Send: NumNick(sptr) RPING blah.* server.net :<start time> (hunt_server)
+ * NumServ(&me) RPING NumServ(blah.bar.net) NumNick(sptr) :<start time> (here)
*/
int mo_rping(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
{
- struct Client *acptr;
+ struct Client* acptr = 0;
+ const char* start_time = "<No client start time>";
- if (!IsPrivileged(sptr))
- return 0;
+ assert(0 != cptr);
+ assert(0 != sptr);
+ assert(cptr == sptr);
+ assert(IsAnOper(sptr));
- if (parc < (IsAnOper(sptr) ? (MyConnect(sptr) ? 2 : 3) : 6))
- {
+ if (parc < 2)
return need_more_params(sptr, "RPING");
- return 0;
- }
- if (MyUser(sptr))
- {
- if (parc == 2)
- parv[parc++] = me.name;
- else if (!(acptr = find_match_server(parv[2])))
- {
- parv[3] = parv[2];
- parv[2] = me.name;
- parc++;
- }
- else
- parv[2] = acptr->name;
- if (parc == 3)
- parv[parc++] = "<No client start time>";
- }
- if (IsAnOper(sptr))
- {
- if (hunt_server(1, cptr, sptr, "%s%s " TOK_RPING " %s %s :%s", 2, parc, parv) !=
- HUNTED_ISME)
+ if (parc > 2) {
+ if ((acptr = find_match_server(parv[2])) && !IsMe(acptr)) {
+ parv[2] = cli_name(acptr);
+ if (3 == parc) {
+ /*
+ * const_cast<char*>(start_time);
+ */
+ parv[parc++] = (char*) start_time;
+ }
+ hunt_server_cmd(sptr, CMD_RPING, cptr, 1, "%s %C :%s", 2, parc, parv);
return 0;
- if (!(acptr = find_match_server(parv[1])) || !IsServer(acptr))
- {
- sendto_one(sptr, err_str(ERR_NOSUCHSERVER), me.name, parv[0], parv[1]);
- return 0;
- }
- sendto_one(acptr, ":%s RPING %s %s %s :%s",
- me.name, NumServ(acptr), sptr->name, militime(0, 0), parv[3]);
- }
- else
- {
- if (hunt_server(1, cptr, sptr, "%s%s " TOK_RPING " %s %s %s %s :%s", 1, parc, parv)
- != HUNTED_ISME)
- return 0;
- sendto_one(cptr, ":%s RPONG %s %s %s %s :%s", me.name, parv[0],
- parv[2], parv[3], parv[4], parv[5]);
- }
- return 0;
-}
-
-#if 0
-/*
- * m_rping -- by Run
- *
- * parv[0] = sender (sptr->name thus)
- * if sender is a person: (traveling towards start server)
- * parv[1] = pinged server[mask]
- * parv[2] = start server (current target)
- * parv[3] = optional remark
- * if sender is a server: (traveling towards pinged server)
- * parv[1] = pinged server (current target)
- * parv[2] = original sender (person)
- * parv[3] = start time in s
- * parv[4] = start time in us
- * parv[5] = the optional remark
- */
-int m_rping(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
-{
- struct Client *acptr;
-
- if (!IsPrivileged(sptr))
- return 0;
-
- if (parc < (IsAnOper(sptr) ? (MyConnect(sptr) ? 2 : 3) : 6))
- {
- return need_more_params(sptr, "RPING");
- return 0;
- }
- if (MyUser(sptr))
- {
- if (parc == 2)
- parv[parc++] = me.name;
- else if (!(acptr = find_match_server(parv[2])))
- {
- parv[3] = parv[2];
- parv[2] = me.name;
- parc++;
}
else
- parv[2] = acptr->name;
- if (parc == 3)
- parv[parc++] = "<No client start time>";
+ start_time = parv[2];
}
- if (IsAnOper(sptr))
- {
- if (hunt_server(1, cptr, sptr, "%s%s " TOK_RPING " %s %s :%s", 2, parc, parv) !=
- HUNTED_ISME)
- return 0;
- if (!(acptr = find_match_server(parv[1])) || !IsServer(acptr))
- {
- sendto_one(sptr, err_str(ERR_NOSUCHSERVER), me.name, parv[0], parv[1]);
- return 0;
- }
- sendto_one(acptr, ":%s RPING %s %s %s :%s",
- me.name, NumServ(acptr), sptr->name, militime(0, 0), parv[3]);
+ if ((acptr = find_match_server(parv[1]))) {
+ assert(IsServer(acptr) || IsMe(acptr));
+ sendcmdto_one(&me, CMD_RPING, acptr, "%C %C %s :%s", acptr, sptr,
+ militime(0, 0), start_time);
}
else
- {
- if (hunt_server(1, cptr, sptr, "%s%s " TOK_RPING " %s %s %s %s :%s", 1, parc, parv)
- != HUNTED_ISME)
- return 0;
- sendto_one(cptr, ":%s RPONG %s %s %s %s :%s", me.name, parv[0],
- parv[2], parv[3], parv[4], parv[5]);
- }
+ send_reply(sptr, ERR_NOSUCHSERVER, parv[1]);
+
return 0;
}
-#endif /* 0 */
-