diff --git a/plugins/DCC.py b/plugins/DCC.py index 6473864fb..76eb75f60 100644 --- a/plugins/DCC.py +++ b/plugins/DCC.py @@ -59,9 +59,16 @@ class DCC(callbacks.Privmsg): text = privmsgs.getArgs(args) def openChatPort(): try: - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.settimeout(60) host = ircutils.hostFromHostmask(irc.prefix) + try: + inet = utils.getSocket(host) + except socket.error, e: + s = 'Error connecting to %s: %s' + self.log.warning(s, host, e) + irc.replyError() + return + sock = socket.socket(inet, socket.SOCK_STREAM) + sock.settimeout(60) if conf.supybot.externalIP(): ip = conf.supybot.externalIP() else: diff --git a/src/socketDrivers.py b/src/socketDrivers.py index 91721abc9..0c98f100b 100644 --- a/src/socketDrivers.py +++ b/src/socketDrivers.py @@ -139,7 +139,13 @@ class SocketDriver(drivers.IrcDriver): self._scheduleReconnect() return self.irc.reset() - self.conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + inet = utils.getSocket(self.server[0]) + except socket.error, e: + log.warning('Error connecting to %s: %s', self.server[0], e) + self.reconnect(wait=True) + return + self.conn = socket.socket(inet, socket.SOCK_STREAM) # We allow more time for the connect here, since it might take longer. # At least 10 seconds. self.conn.settimeout(max(10, conf.supybot.drivers.poll()*10)) diff --git a/src/utils.py b/src/utils.py index bdd20f046..3704998e2 100755 --- a/src/utils.py +++ b/src/utils.py @@ -555,6 +555,21 @@ def changeFunctionName(f, name, doc=None): newf.__doc__ = doc return newf +def getSocket(host): + """Returns a socket of the correct AF_INET type (v4 or v6) in order to + communicate with host. + """ + try: + host = socket.gethostbyname(host) + except socket.error: + raise + if isIP(host): + return socket.socket(socket.INET, socket.SOCK_STREAM) + elif isIPV6(host): + return socket.socket(socket.INET6, socket.SOCK_STREAM) + else: + raise socket.error, 'Something wonky happened.' + _ipchars = string.digits + '.' def isIP(s): """Returns whether or not a given string is an IPV4 address. @@ -606,7 +621,7 @@ class InsensitivePreservingDict(UserDict.DictMixin, object): d[key] = s return d fromkeys = classmethod(fromkeys) - + def __getitem__(self, k): return self.data[self.key(k)][1] @@ -624,7 +639,7 @@ class InsensitivePreservingDict(UserDict.DictMixin, object): for (k, _) in self.iteritems(): L.append(k) return L - + def __reduce__(self): return (self.__class__, (dict(self.data.values()),)) @@ -632,7 +647,7 @@ def mungeEmailForWeb(s): s = s.replace('@', ' AT ') s = s.replace('.', ' DOT ') return s - + if __name__ == '__main__': import sys, doctest