From 299f7d70a7c7629775fb378d85312d304ea9f83c Mon Sep 17 00:00:00 2001 From: Nathan Phillip Brink Date: Sat, 8 Jan 2011 18:26:24 -0500 Subject: [PATCH] Throttle everything sent to the IRCd. Fixes being killed for Excess Flooding on freenode. --- src/connection.c | 12 ++++++++---- 1 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/connection.c b/src/connection.c index c793e18..9b4e821 100644 --- a/src/connection.c +++ b/src/connection.c @@ -23,6 +23,7 @@ static SSL_CTX *sslctx = NULL; static int ssl_cx_idx; static BIO *errbio = NULL; extern char *conf_ssl_certfile; +static int cn_want_write(connection_t *cn); static int SSLize(connection_t *cn, int *nc); static SSL_CTX *SSL_init_context(void); /* SSH like trust management */ @@ -331,7 +332,8 @@ void write_line_fast(connection_t *cn, char *line) int r; char *nline = bip_strdup(line); - if (cn->partial) { + if (cn->partial + || !cn_want_write(cn)) { list_add_first(cn->outgoing, nline); } else { r = write_socket(cn, nline); @@ -353,13 +355,15 @@ void write_line_fast(connection_t *cn, char *line) void write_lines(connection_t *cn, list_t *lines) { list_append(cn->outgoing, lines); - real_write_all(cn); + if (cn_want_write(cn)) + real_write_all(cn); } void write_line(connection_t *cn, char *line) { list_add_last(cn->outgoing, bip_strdup(line)); - real_write_all(cn); + if (cn_want_write(cn)) + real_write_all(cn); } list_t *read_lines(connection_t *cn, int *error) @@ -718,7 +722,7 @@ static int check_event_write(fd_set *fds, connection_t *cn, int *nc) /* token generation interval: 1200ms */ #define TOKEN_INTERVAL 1200 -int cn_want_write(connection_t *cn) +static int cn_want_write(connection_t *cn) { if (cn->anti_flood) { struct timeval tv; -- 1.7.2.2