diff --git a/src/core/servers-reconnect.c b/src/core/servers-reconnect.c index bb8b0b45..147f6436 100644 --- a/src/core/servers-reconnect.c +++ b/src/core/servers-reconnect.c @@ -293,6 +293,32 @@ static RECONNECT_REC *reconnect_find_tag(int tag) return NULL; } +static void reconnect_all(void) +{ + GSList *list; + SERVER_CONNECT_REC *conn; + RECONNECT_REC *rec; + + /* first move reconnects to another list so if server_connect() + fails and goes to reconnection list again, we won't get stuck + here forever */ + list = NULL; + while (reconnects != NULL) { + rec = reconnects->data; + + list = g_slist_append(list, rec->conn); + server_reconnect_destroy(rec, FALSE); + } + + + while (list != NULL) { + conn = list->data; + + CHAT_PROTOCOL(conn)->server_connect(conn); + list = g_slist_remove(list, conn); + } +} + /* SYNTAX: RECONNECT */ static void cmd_reconnect(const char *data, SERVER_REC *server) { @@ -315,6 +341,12 @@ static void cmd_reconnect(const char *data, SERVER_REC *server) return; } + if (g_strcasecmp(data, "all") == 0) { + /* reconnect all servers in reconnect queue */ + reconnect_all(); + return; + } + if (*data == '\0') { /* reconnect to first server in reconnection list */ if (reconnects == NULL)