summaryrefslogtreecommitdiff
path: root/src/irc/core
diff options
context:
space:
mode:
authorTimo Sirainen <cras@irssi.org>2002-03-11 03:11:18 +0000
committercras <cras@dbcabf3a-b0e7-0310-adc4-f8d773084564>2002-03-11 03:11:18 +0000
commitabe4e30256e4babacdec8837abafc3eb0a19e321 (patch)
tree123cde60b6e20855cf3f21a1618ebe14cee2352d /src/irc/core
parent1528cfc9d7ab32ba9573382fa7aa80d0f8fc472f (diff)
downloadirssi-abe4e30256e4babacdec8837abafc3eb0a19e321.zip
Safer flood protection for lines longer than 100 chars. Maybe even a bit too
safe but generally you write lines less than 100 chars so it shouldn't really matter. Calculated (2 + line_length/100) in seconds. git-svn-id: http://svn.irssi.org/repos/irssi/trunk@2575 dbcabf3a-b0e7-0310-adc4-f8d773084564
Diffstat (limited to 'src/irc/core')
-rw-r--r--src/irc/core/irc-servers.c37
-rw-r--r--src/irc/core/irc-servers.h3
-rw-r--r--src/irc/core/irc.c8
3 files changed, 30 insertions, 18 deletions
diff --git a/src/irc/core/irc-servers.c b/src/irc/core/irc-servers.c
index be6e1229..1fc7faaa 100644
--- a/src/irc/core/irc-servers.c
+++ b/src/irc/core/irc-servers.c
@@ -297,6 +297,28 @@ static void sig_server_quit(IRC_SERVER_REC *server, const char *msg)
g_free(str);
}
+void irc_server_send_data(IRC_SERVER_REC *server, const char *data, int len)
+{
+ if (net_sendbuffer_send(server->handle, data, len) == -1) {
+ /* something bad happened */
+ server->connection_lost = TRUE;
+ return;
+ }
+
+ g_get_current_time(&server->last_cmd);
+
+ /* A bit kludgy way to do the flood protection. In ircnet, there
+ actually is 1sec / 100 bytes penalty, but we rather want to deal
+ with the max. 1000 bytes input buffer problem. If we send more
+ than that with the burst, we'll get excess flooded. */
+ if (len < 100)
+ server->wait_cmd.tv_sec = 0;
+ else {
+ memcpy(&server->wait_cmd, &server->last_cmd, sizeof(GTimeVal));
+ server->wait_cmd.tv_sec += 2 + len/100;
+ }
+}
+
static void server_cmd_timeout(IRC_SERVER_REC *server, GTimeVal *now)
{
REDIRECT_REC *redirect;
@@ -321,20 +343,13 @@ static void server_cmd_timeout(IRC_SERVER_REC *server, GTimeVal *now)
server->cmdcount--;
if (server->cmdqueue == NULL) return;
- /* send command */
+ /* get command */
cmd = server->cmdqueue->data;
redirect = server->cmdqueue->next->data;
- len = strlen(cmd);
-
- if (net_sendbuffer_send(server->handle, cmd, len) == -1) {
- /* something bad happened */
- g_warning("net_sendbuffer_send() failed: %s",
- g_strerror(errno));
- return;
- }
- server->wait_cmd.tv_sec = 0;
- memcpy(&server->last_cmd, now, sizeof(GTimeVal));
+ /* send command */
+ len = strlen(cmd);
+ irc_server_send_data(server, cmd, len);
/* add to rawlog without [CR+]LF (/RAWQUOTE might not have
added the CR) */
diff --git a/src/irc/core/irc-servers.h b/src/irc/core/irc-servers.h
index b0cd84b5..f6ee1821 100644
--- a/src/irc/core/irc-servers.h
+++ b/src/irc/core/irc-servers.h
@@ -106,6 +106,9 @@ void irc_server_purge_output(IRC_SERVER_REC *server, const char *target);
like "#a,#b,#c,#d x,b_chan_key,x,x" or just "#e,#f,#g" */
char *irc_server_get_channels(IRC_SERVER_REC *server);
+/* INTERNAL: */
+void irc_server_send_data(IRC_SERVER_REC *server, const char *data, int len);
+
void irc_servers_init(void);
void irc_servers_deinit(void);
diff --git a/src/irc/core/irc.c b/src/irc/core/irc.c
index 88816404..d7afaa23 100644
--- a/src/irc/core/irc.c
+++ b/src/irc/core/irc.c
@@ -82,13 +82,7 @@ void irc_send_cmd_full(IRC_SERVER_REC *server, const char *cmd,
}
if (send_now) {
- if (net_sendbuffer_send(server->handle, cmd, len) == -1) {
- /* something bad happened */
- server->connection_lost = TRUE;
- return;
- }
-
- g_get_current_time(&server->last_cmd);
+ irc_server_send_data(server, cmd, len);
return;
}