Ejemplo n.º 1
0
void *irc_handle_message_async(void *args)
{
    struct async_message_handle_ctx *data = (struct async_message_handle_ctx *)args;

    pthread_mutex_lock(&lock);
    irc_handle_message(data->buff, data->fd);
    free(data->buff);
    free(data);
    pthread_mutex_unlock(&lock);

    return NULL;
}
Ejemplo n.º 2
0
static uint8_t
irc_parse (void)
{
    char *message;
    IRCDEBUG ("ircparse stage=%d\n", STATE->stage);

    switch (STATE->stage) {
    case IRC_SEND_USERNICK:
	if (strstr_P (uip_appdata, PSTR (" 433 "))) {
	    IRCDEBUG ("nickname already in use, try alternative one.");
	    STATE->stage = IRC_SEND_ALTNICK;
	    return 0;
	}

	if (strstr_P (uip_appdata, PSTR (" 001 "))) {
	    IRCDEBUG ("remote host accepted connection.");
	    STATE->stage = IRC_SEND_JOIN;
	    return 0;
	}

	if (strstr_P (uip_appdata, PSTR ("NOTICE AUTH"))) {
	    IRCDEBUG ("ignoring auth fluff ...");
	    return 0;
	}
	break;

    case IRC_SEND_ALTNICK:
	if (strstr_P (uip_appdata, PSTR (" 443 "))) {
	    IRCDEBUG ("nickname already also in use, stop.");
	    return 1;
	}

	if (strstr_P (uip_appdata, PSTR (" 001 "))) {
	    IRCDEBUG ("remote host accepted connection.");
	    STATE->stage = IRC_SEND_JOIN;
	    return 0;
	}
	break;

    case IRC_SEND_JOIN:
    case IRC_CONNECTED:
	message = strstr_P (uip_appdata, irc_privmsg_str);
	if (message) {
	    message += sizeof (irc_privmsg_str) - 1;
	    irc_handle_message (message);
	}

#ifdef IRC_GREET_SUPPORT
	/* :[email protected] JOIN :#ethersex */
	if (((char *)uip_appdata)[0] == ':'
	    && strstr_P (uip_appdata, irc_joinmsg_str)) {
	    IRCDEBUG ("found join");
	    char *nick = uip_appdata + 1;
	    char *endptr = strchr (nick, '!');

	    if (endptr) {
		*endptr = 0;
		IRCDEBUG ("greeting %s", nick);
		if (strcmp_P (nick, PSTR (CONF_IRC_NICKNAME)))
		    snprintf_P (STATE->outbuf, ECMD_OUTPUTBUF_LENGTH,
				irc_send_greet, nick);
	    }
	}
#endif	/* IRC_GREET_SUPPORT */

	if (strncmp_P (uip_appdata, PSTR ("PING :"), 6) == 0) {
	  /* Send PONG back to server, FIXME this doesn't support rexmits,
	     let's hope the packet will make it through (or the server
	     at least PINGs once more) ... */
	  ((char *)uip_appdata)[1] = 'O'; /* PING -> PONG */
	  uip_send (uip_appdata, uip_len);
	  IRCDEBUG ("replying pong ...\n");
	}

	return 0;
    }

    /* Reset connection */
    IRCDEBUG ("unknown server reply, stop.");
    return 1;
}