static void mr_pong(struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { assert(source_p == client_p); if(parc == 2 && *parv[1] != '\0') { if(ConfigFileEntry.ping_cookie && !source_p->localClient->registration) { unsigned long incoming_ping = strtoul(parv[1], NULL, 10); if(incoming_ping) { if(source_p->localClient->random_ping == incoming_ping) { char buf[USERLEN + 1]; strlcpy(buf, source_p->username, sizeof(buf)); SetPingCookie(source_p); register_local_user(client_p, source_p, source_p->name, buf); } else { sendto_one(source_p, form_str(ERR_WRONGPONG), me.name, source_p->name, source_p->localClient->random_ping); return; } } } } else sendto_one(source_p, form_str(ERR_NOORIGIN), me.name, parv[0]); }
/*! \brief PONG command handler * * \param source_p Pointer to allocated Client struct from which the message * originally comes from. This can be a local or remote client. * \param parc Integer holding the number of supplied arguments. * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL * pointers. * \note Valid arguments for this command are: * - parv[0] = command * - parv[1] = origin/ping cookie */ static int mr_pong(struct Client *source_p, int parc, char *parv[]) { assert(MyConnect(source_p)); if (parc == 2 && !EmptyString(parv[1])) { if (ConfigGeneral.ping_cookie && source_p->connection->random_ping) { unsigned int incoming_ping = strtoul(parv[1], NULL, 10); if (source_p->connection->random_ping == incoming_ping) { SetPingCookie(source_p); if (!source_p->connection->registration) register_local_user(source_p); } else sendto_one_numeric(source_p, &me, ERR_WRONGPONG, source_p->connection->random_ping); } } else sendto_one_numeric(source_p, &me, ERR_NOORIGIN); return 0; }