Ejemplo n.º 1
0
void irc_unqueue(irc_t *irc) {
    irc_queued_t *entry;
    size_t        events = 0;

    /* Only when enough time has passed */
    if (difftime(time(NULL), irc->lastunqueue) <= IRC_FLOOD_INTERVAL) {
        irc_manager_wake(irc->manager);
        return;
    }

    while (events != IRC_FLOOD_LINES && (entry = list_shift(irc->queue))) {
        const size_t              targetlen = string_length(entry->target);
        const char               *target    = string_contents(entry->target);
        const irc_command_func_t *func      = &irc_commands[entry->command];

        /* If there is a payload we use the extended call */
        if (entry->payload) {
            size_t      payloadlen = string_length(entry->payload);
            const char *payload    = string_contents(entry->payload);
            size_t      corelen    = func->baselen + targetlen + 63; /* 63 is MAX_HOST_LENGTH */

            /* Split payload for 512 byte IRC line limit */
            while (corelen + payloadlen > 512) {
                char truncate[512];
                size_t size = sizeof(truncate) - corelen;
                strncpy(truncate, payload, size);
                truncate[size] = '\0';
                func->extended(irc, target, truncate);
                /* Flood protection */
                if (++events == IRC_FLOOD_LINES) {
                    /* Construct a new partial payload */
                    char *move = string_move(entry->payload);
                    entry->payload = string_create(move + (payload - move) + size);
                    free(move);
                    list_prepend(irc->queue, entry);
                    break;
                }
                payloadlen -= size;
                payload += size;
            }
            func->extended(irc, target, payload);
            events++;
            string_destroy(entry->payload);
        } else {
            /* Otherwise we do a standard call */
            func->standard(irc, target);
            events++;
        }
        string_destroy(entry->target);
        free(entry);
    }

    /* Flood protection */
    if (events == IRC_FLOOD_LINES) {
        irc->lastunqueue = time(NULL);
        irc_manager_wake(irc->manager);
    }
}
Ejemplo n.º 2
0
xml_token_type_t
xml_get_tag_attributes(xml_reader_t *xr, xml_node_t *node)
{
	string_t tokenValue, attrName, attrValue;
	xml_token_type_t token;

	string_init(&tokenValue);
	string_init(&attrName);
	string_init(&attrValue);

	token = xml_get_token(xr, &tokenValue);
	while (1) {
		if (token == RightAngle || token == RightAngleQ || token == RightAngleSlash)
			break;

		if (token != Identifier) {
			xml_parse_error(xr, "Unexpected token in tag attributes");
			token = None;
			break;
		}

		string_move(&attrName, &tokenValue);

		token = xml_get_token(xr, &tokenValue);
		if (token != Equals) {
			xml_node_add_attr(node, attrName.string, NULL);
			continue;
		}

		token = xml_get_token(xr, &tokenValue);
		if (token != QuotedString) {
			xml_parse_error(xr, "Attribute value not a quoted string!");
			token = None;
			break;
		}

		xml_debug("  attr %s=%s\n", attrName.string, tokenValue.string);
		xml_node_add_attr(node, attrName.string, tokenValue.string);

		token = xml_get_token(xr, &tokenValue);
	}

	string_destroy(&tokenValue);
	string_destroy(&attrName);
	string_destroy(&attrValue);
	return token;
}