From 69671d55a353eec8ff74735f1c4b606ee6292135 Mon Sep 17 00:00:00 2001 From: Jeremy Fincher Date: Thu, 12 Feb 2004 00:49:13 +0000 Subject: [PATCH] Handle EINPROGRESS more appropriately (i.e., actually try to work :)) --- src/socketDrivers.py | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/socketDrivers.py b/src/socketDrivers.py index 112363ff6..3ec3b720f 100644 --- a/src/socketDrivers.py +++ b/src/socketDrivers.py @@ -41,6 +41,7 @@ import fix import time import atexit +import select import socket from itertools import imap @@ -139,17 +140,29 @@ class SocketDriver(drivers.IrcDriver): self.conn.connect(self.server) self.conn.settimeout(conf.supybot.drivers.poll()) except socket.error, e: - if e.args[0] != 115: - log.warning('Error connecting to %s: %s', self.irc.server, e) + if e.args[0] == 115: + now = time.time() + when = now + 60 + log.info('Connection in progress, scheduling connectedness ' + 'check for %s', when) + schedule.addEvent(self._checkAndWriteOrReconnect, when) + else: + log.warning('Error connecting to %s: %s', + self.irc.server, e.args[1]) self.reconnect(wait=True) self.connected = True self.reconnectWaitPeriodsIndex = 0 - def die(self): - log.info('Driver for %s dying.', self.irc) - self.conn.close() - # self.irc.die() Kill off the ircs yourself, jerk! - + def _checkAndWriteOrReconnect(self): + (_, w, _) = select.select([], [self.conn], [], 0) + if w: + log.info('Socket is writable, it might be connected.') + self.connected = True + self.reconnectWaitPeriodsIndex = 0 + else: + log.warning('Error connecting to %s: Timed out.', self.irc.server) + self.reconnect() + def _scheduleReconnect(self): when = time.time() + self.reconnectWaits[self.reconnectWaitsIndex] when = log.timestamp(when) @@ -157,6 +170,11 @@ class SocketDriver(drivers.IrcDriver): log.info('Scheduling reconnect to %s at %s', self.server, when) schedule.addEvent(self.reconnect, when) + def die(self): + log.info('Driver for %s dying.', self.irc) + self.conn.close() + # self.irc.die() Kill off the ircs yourself, jerk! + def name(self): return '%s%s' % (self.__class__.__name__, self.server)