diff options
-rw-r--r-- | src/irc/core/servers-redirect.c | 71 | ||||
-rw-r--r-- | src/irc/core/servers-redirect.h | 6 |
2 files changed, 56 insertions, 21 deletions
diff --git a/src/irc/core/servers-redirect.c b/src/irc/core/servers-redirect.c index 0e1b2284..f2c1777f 100644 --- a/src/irc/core/servers-redirect.c +++ b/src/irc/core/servers-redirect.c @@ -25,6 +25,8 @@ #include "irc-servers.h" #include "servers-redirect.h" +#define DEFAULT_REDIRECT_TIMEOUT 60 + typedef struct { int refcount; @@ -151,7 +153,7 @@ void server_redirect_register_list(const char *command, rec = g_new0(REDIRECT_CMD_REC, 1); redirect_cmd_ref(rec); rec->remote = remote; - rec->timeout = timeout; + rec->timeout = timeout > 0 ? timeout : DEFAULT_REDIRECT_TIMEOUT; rec->start = start; rec->stop = stop; g_hash_table_insert(command_redirects, g_strdup(command), rec); @@ -365,10 +367,12 @@ static REDIRECT_REC *redirect_find(IRC_SERVER_REC *server, const char *event, for (tmp = server->redirects; tmp != NULL; tmp = tmp->next) { REDIRECT_REC *rec = tmp->data; - *signal = redirect_match(rec, event, args, match_stop); - if (*signal != NULL) { - redirect = rec; - break; + if (!rec->destroyed) { + *signal = redirect_match(rec, event, args, match_stop); + if (*signal != NULL) { + redirect = rec; + break; + } } } @@ -384,7 +388,7 @@ 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) || - (redirect != NULL && !rec->remote)) { + (!rec->remote && redirect != NULL)) { server->redirects = g_slist_remove(server->redirects, rec); if (!rec->destroyed && rec->failure_signal != NULL) { @@ -398,27 +402,27 @@ static REDIRECT_REC *redirect_find(IRC_SERVER_REC *server, const char *event, return redirect; } -const char *server_redirect_get_signal(IRC_SERVER_REC *server, - const char *event, - const char *args) +static const char * +server_redirect_get(IRC_SERVER_REC *server, const char *event, + const char *args, REDIRECT_REC **redirect, int *match_stop) { - REDIRECT_REC *redirect; const char *signal; - int match_stop; + + *redirect = NULL; + *match_stop = FALSE; if (server->redirects == NULL) return NULL; - match_stop = FALSE; if (server->redirect_continue == NULL) { /* find the redirection */ - redirect = redirect_find(server, event, args, - &signal, &match_stop); + *redirect = redirect_find(server, event, args, + &signal, match_stop); } else { /* redirection is already started, now we'll just need to keep redirecting until stop-event is found. */ - redirect = server->redirect_continue; - signal = redirect_match(redirect, event, NULL, &match_stop); + *redirect = server->redirect_continue; + signal = redirect_match(*redirect, event, NULL, match_stop); if (signal == NULL) { /* unknown event - redirect to the default signal. FIXME: if stop event isn't properly got, this @@ -426,10 +430,24 @@ const char *server_redirect_get_signal(IRC_SERVER_REC *server, we get eg. 10 different unknown events after this, or if one of them matches to another redirection, abort this. */ - signal = redirect->default_signal; + signal = (*redirect)->default_signal; } } + return signal; +} + +const char *server_redirect_get_signal(IRC_SERVER_REC *server, + const char *event, + const char *args) +{ + REDIRECT_REC *redirect; + const char *signal; + int match_stop; + + signal = server_redirect_get(server, event, args, + &redirect, &match_stop); + if (!match_stop || redirect == NULL) server->redirect_continue = redirect; else { @@ -443,6 +461,17 @@ const char *server_redirect_get_signal(IRC_SERVER_REC *server, return signal; } +const char *server_redirect_peek_signal(IRC_SERVER_REC *server, + const char *event, + const char *args) +{ + REDIRECT_REC *redirect; + int match_stop; + + return server_redirect_get(server, event, args, + &redirect, &match_stop); +} + static void sig_disconnected(IRC_SERVER_REC *server) { if (!IS_IRC_SERVER(server)) @@ -467,8 +496,8 @@ void servers_redirect_init(void) command_redirects = g_hash_table_new((GHashFunc) g_str_hash, (GCompareFunc) g_str_equal); /* WHOIS - register as remote command by default - with a timeout of one minute */ - server_redirect_register("whois", TRUE, 60, + with a default timeout */ + server_redirect_register("whois", TRUE, 0, "event 311", 1, /* Begins the WHOIS */ "event 401", 1, /* No such nick */ NULL, @@ -556,8 +585,8 @@ void servers_redirect_init(void) "event 472", -1, /* unknown mode (you should check I-mode's existance from 004 event instead of relying on this) */ NULL); - /* PING */ - server_redirect_register("ping", TRUE, 60, + /* PING - use default timeout */ + server_redirect_register("ping", TRUE, 0, NULL, "event 402", -1, /* no such server */ "event pong", -1, /* PONG */ diff --git a/src/irc/core/servers-redirect.h b/src/irc/core/servers-redirect.h index 88235600..0773895c 100644 --- a/src/irc/core/servers-redirect.h +++ b/src/irc/core/servers-redirect.h @@ -60,6 +60,12 @@ void server_redirect_command(IRC_SERVER_REC *server, const char *command, const char *server_redirect_get_signal(IRC_SERVER_REC *server, const char *event, const char *args); +/* Returns the redirection signal for specified event. + Doesn't change the server state in any way, so if you really wish to + use the signal, call server_redirect_get_signal() after this. */ +const char *server_redirect_peek_signal(IRC_SERVER_REC *server, + const char *event, + const char *args); /* Destroy redirection record */ void server_redirect_destroy(REDIRECT_REC *rec); |