static int last_reconnect_tag;
static int reconnect_timeout_tag;
static int reconnect_time;
+static int connect_timeout;
void reconnect_save_status(SERVER_CONNECT_REC *conn, SERVER_REC *server)
{
conn->away_reason = !server->usermode_away ? NULL :
g_strdup(server->away_reason);
+ if (!server->connected) {
+ /* default to channels/usermode from connect record
+ since server isn't fully connected yet */
+ g_free_not_null(conn->channels);
+ conn->channels = server->connrec->no_autojoin_channels ? NULL :
+ g_strdup(server->connrec->channels);
+
+ g_free_not_null(conn->channels);
+ conn->channels = g_strdup(server->connrec->channels);
+ }
+
signal_emit("server reconnect save status", 2, conn, server);
}
rec->next_connect = next_connect;
rec->conn = conn;
+ conn->reconnecting = TRUE;
server_connect_ref(conn);
reconnects = g_slist_append(reconnects, rec);
static int server_reconnect_timeout(void)
{
SERVER_CONNECT_REC *conn;
- GSList *list, *tmp;
+ GSList *list, *tmp, *next;
time_t now;
+ now = time(NULL);
+
+ /* timeout any connections that haven't gotten to connected-stage */
+ for (tmp = servers; tmp != NULL; tmp = next) {
+ SERVER_REC *server = tmp->data;
+
+ next = tmp->next;
+ if (!server->connected &&
+ server->connect_time + connect_timeout < now &&
+ connect_timeout > 0) {
+ server->connection_lost = TRUE;
+ server_disconnect(server);
+ }
+ }
+
/* If server_connect() removes the next reconnection in queue,
we're screwed. I don't think this should happen anymore, but just
to be sure we don't crash, do this safely. */
list = g_slist_copy(reconnects);
- now = time(NULL);
for (tmp = list; tmp != NULL; tmp = tmp->next) {
RECONNECT_REC *rec = tmp->data;
conn = rec->conn;
server_connect_ref(conn);
server_reconnect_destroy(rec);
- CHAT_PROTOCOL(conn)->server_connect(conn);
+ server_connect(conn);
server_connect_unref(conn);
}
}
dest->channels = g_strdup(src->channels);
dest->away_reason = g_strdup(src->away_reason);
+ dest->no_autojoin_channels = src->no_autojoin_channels;
+
+ dest->use_ssl = src->use_ssl;
+ dest->ssl_cert = g_strdup(src->ssl_cert);
+ dest->ssl_pkey = g_strdup(src->ssl_pkey);
+ dest->ssl_verify = src->ssl_verify;
+ dest->ssl_cafile = g_strdup(src->ssl_cafile);
+ dest->ssl_capath = g_strdup(src->ssl_capath);
return dest;
}
sserver->last_connect = server->connect_time == 0 ?
time(NULL) : server->connect_time;
sserver->last_failed = !server->connected;
- if (server->banned) sserver->banned = TRUE;
- if (server->dns_error) sserver->dns_error = TRUE;
+ sserver->banned = server->banned;
+ sserver->dns_error = server->dns_error;
}
if (sserver == NULL || conn->chatnet == NULL) {
while (list != NULL) {
conn = list->data;
- CHAT_PROTOCOL(conn)->server_connect(conn);
+ server_connect(conn);
server_connect_unref(conn);
list = g_slist_remove(list, conn);
}
}
-/* SYNTAX: RECONNECT <tag> */
+/* SYNTAX: RECONNECT <tag> [<quit message>] */
static void cmd_reconnect(const char *data, SERVER_REC *server)
{
SERVER_CONNECT_REC *conn;
RECONNECT_REC *rec;
- int tag;
+ char *tag, *msg;
+ void *free_arg;
+ int tagnum;
- if (*data == '\0' && server != NULL) {
- /* reconnect back to same server */
+ if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST, &tag, &msg))
+ return;
+
+ if (*tag != '\0' && strcmp(tag, "*") != 0)
+ server = server_find_tag(tag);
+
+ if (server != NULL) {
+ /* reconnect connected server */
conn = server_connect_copy_skeleton(server->connrec, TRUE);
if (server->connected)
reconnect_save_status(conn, server);
- signal_emit("command disconnect", 2, "* Reconnecting", server);
+
+ msg = g_strconcat("* ", *msg == '\0' ?
+ "Reconnecting" : msg, NULL);
+ signal_emit("command disconnect", 2, msg, server);
+ g_free(msg);
conn->reconnection = TRUE;
- CHAT_PROTOCOL(conn)->server_connect(conn);
+ server_connect(conn);
server_connect_unref(conn);
+ cmd_params_free(free_arg);
return;
}
- if (g_strcasecmp(data, "all") == 0) {
+ if (g_strcasecmp(tag, "all") == 0) {
/* reconnect all servers in reconnect queue */
reconnect_all();
+ cmd_params_free(free_arg);
return;
}
if (*data == '\0') {
/* reconnect to first server in reconnection list */
if (reconnects == NULL)
- cmd_return_error(CMDERR_NOT_CONNECTED);
+ cmd_param_error(CMDERR_NOT_CONNECTED);
rec = reconnects->data;
} else {
if (g_strncasecmp(data, "RECON-", 6) == 0)
data += 6;
- tag = atoi(data);
- rec = tag <= 0 ? NULL : reconnect_find_tag(tag);
+ tagnum = atoi(tag);
+ rec = tagnum <= 0 ? NULL : reconnect_find_tag(tagnum);
+ }
- if (rec == NULL) {
- signal_emit("server reconnect not found", 1, data);
- return;
- }
+ if (rec == NULL) {
+ signal_emit("server reconnect not found", 1, data);
+ } else {
+ conn = rec->conn;
+ server_connect_ref(conn);
+ server_reconnect_destroy(rec);
+ server_connect(conn);
+ server_connect_unref(conn);
}
- conn = rec->conn;
- server_connect_ref(conn);
- server_reconnect_destroy(rec);
- CHAT_PROTOCOL(conn)->server_connect(conn);
- server_connect_unref(conn);
+ cmd_params_free(free_arg);
}
static void cmd_disconnect(const char *data, SERVER_REC *server)
static void read_settings(void)
{
- reconnect_time = settings_get_int("server_reconnect_time");
+ reconnect_time = settings_get_time("server_reconnect_time")/1000;
+ connect_timeout = settings_get_time("server_connect_timeout")/1000;
}
void servers_reconnect_init(void)
{
- settings_add_int("server", "server_reconnect_time", 300);
+ settings_add_time("server", "server_reconnect_time", "5min");
+ settings_add_time("server", "server_connect_timeout", "5min");
reconnects = NULL;
last_reconnect_tag = 0;