mirror of
https://github.com/irssi/irssi.git
synced 2024-09-01 04:14:16 -04:00
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
This commit is contained in:
parent
1528cfc9d7
commit
abe4e30256
@ -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;
|
||||
|
||||
/* send command */
|
||||
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));
|
||||
irc_server_send_data(server, cmd, len);
|
||||
|
||||
/* add to rawlog without [CR+]LF (/RAWQUOTE might not have
|
||||
added the CR) */
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user