summaryrefslogtreecommitdiff
path: root/src/irc/core
diff options
context:
space:
mode:
authorTimo Sirainen <cras@irssi.org>2001-11-16 23:42:09 +0000
committercras <cras@dbcabf3a-b0e7-0310-adc4-f8d773084564>2001-11-16 23:42:09 +0000
commit7545f463bd279359a56521ff6114634dc4d0ea6f (patch)
tree268a9310d7878cfd7791b7958c5613e2288d12c4 /src/irc/core
parent15933dcea016248e78fc021658a7ddef1f4eb809 (diff)
downloadirssi-7545f463bd279359a56521ff6114634dc4d0ea6f.zip
Allow replies to redirections come in a bit different order than expected -
default is if 3 replies to other redirections are received, abort the expected one. This is because some IRC bouncers reply to some of the commands (PING) themself immediately. git-svn-id: http://svn.irssi.org/repos/irssi/trunk@2036 dbcabf3a-b0e7-0310-adc4-f8d773084564
Diffstat (limited to 'src/irc/core')
-rw-r--r--src/irc/core/servers-redirect.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/irc/core/servers-redirect.c b/src/irc/core/servers-redirect.c
index 424e7e7e..a6a1a38d 100644
--- a/src/irc/core/servers-redirect.c
+++ b/src/irc/core/servers-redirect.c
@@ -28,6 +28,11 @@
#define DEFAULT_REDIRECT_TIMEOUT 60
+/* Allow 2 non-expected redirections to come before the expected one
+ before aborting it. Some IRC bouncers/proxies reply to eg. PINGs
+ immediately. */
+#define MAX_FAILURE_COUNT 2
+
typedef struct {
char *name;
int refcount;
@@ -40,6 +45,7 @@ typedef struct {
struct _REDIRECT_REC {
REDIRECT_CMD_REC *cmd;
time_t created;
+ int failures;
int destroyed;
char *arg;
@@ -411,8 +417,10 @@ static REDIRECT_REC *redirect_find(IRC_SERVER_REC *server, const char *event,
next = tmp->next;
if (rec->destroyed ||
(rec->remote && (now-rec->created) > rec->cmd->timeout) ||
- (!rec->remote && redirect != NULL))
- redirect_abort(server, rec);
+ (!rec->remote && redirect != NULL)) {
+ if (rec->remote || ++rec->failures >= MAX_FAILURE_COUNT)
+ redirect_abort(server, rec);
+ }
}
return redirect;