# HG changeset patch # User Mikael Berthe # Date 1162850041 -3600 # Node ID dff25377c11f5d7d9daefae96c41aeefbe1ec9be # Parent 76c03fafabd35af5c02da8682026d061fe3bbde2 Auto-reconnect after a network/server failure diff -r 76c03fafabd3 -r dff25377c11f mcabber/src/jabglue.c --- a/mcabber/src/jabglue.c Sun Nov 05 18:05:14 2006 +0100 +++ b/mcabber/src/jabglue.c Mon Nov 06 22:54:01 2006 +0100 @@ -36,6 +36,8 @@ #define JABBERPORT 5222 #define JABBERSSLPORT 5223 +#define RECONNECTION_TIMEOUT 60L + jconn jc; enum enum_jstate jstate; @@ -43,6 +45,7 @@ '_', 'o', 'i', 'f', 'd', 'n', 'a', '\0' }; +static bool AutoConnection; static time_t LastPingTime; static unsigned int KeepaliveDelay; static enum imstatus mystatus = offline; @@ -122,6 +125,9 @@ jab_start(jc); } + if (jc) + AutoConnection = true; + return jc; } @@ -141,6 +147,7 @@ jab_delete(jc); jc = NULL; + AutoConnection = false; } inline void jb_reset_keepalive() @@ -166,16 +173,48 @@ KeepaliveDelay = delay; } +// check_connection() +// Check if we've been disconnected for a while (predefined timeout), +// and if so try to reconnect. +static void check_connection(void) +{ + static time_t disconnection_timestamp = 0L; + time_t now; + + // Are we totally disconnected? + if (jc && jc->state != JCONN_STATE_OFF) { + disconnection_timestamp = 0L; + return; + } + + // Maybe we're voluntarily offline... + if (!AutoConnection) + return; + + time(&now); + if (!disconnection_timestamp) { + disconnection_timestamp = now; + return; + } + + // If the reconnection_timeout is reached, try to reconnect. + if (now > disconnection_timestamp + RECONNECTION_TIMEOUT) { + mcabber_connect(); + disconnection_timestamp = 0L; + } +} + void jb_main() { time_t now; fd_set fds; long timeout; struct timeval tv; - static time_t last_eviqs_check = 0; + static time_t last_eviqs_check = 0L; if (!online) { safe_usleep(10000); + check_connection(); return; } @@ -1583,7 +1622,7 @@ const char *rname; enum imstatus ust; char bpprio; - time_t timestamp = 0; + time_t timestamp = 0L; xmlnode muc_packet; rname = strchr(from, JID_RESOURCE_SEPARATOR); @@ -1662,7 +1701,7 @@ char *body = NULL; char *enc = NULL; char *tmp = NULL; - time_t timestamp = 0; + time_t timestamp = 0L; body = xmlnode_get_tag_data(xmldata, "body");