Exemplo n.º 1
0
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]);
}
Exemplo n.º 2
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;
}