Ticket #1969: gajim-ipv6-20060727.patch

File gajim-ipv6-20060727.patch, 6.1 kB (added by didier@…, 2 years ago)

Add IPv6 support for transport (not for proxy)

  • src/common/xmpp/transports_nb.py

    diff -Nru gajim-20060727/src/common/xmpp/transports_nb.py gajim-20060727-ipv6/src/common/xmpp/transports_nb.py
    old new  
    6060                # -2 - disconnected 
    6161                self.state = 0 
    6262                 
     63                # server information (IPv6 or IPv4 addresses to try connect to) 
     64                self._addrinfo = None 
     65                # socket address information used to connect to server 
     66                self._serveraddr = None 
     67                 
    6368                # queue with messages to be send  
    6469                self.sendqueue = [] 
    6570                 
     
    9095                 
    9196        def read_timeout(self): 
    9297                if self.state == 0: 
    93                         self.idlequeue.unplug_idle(self.fd) 
    94                         if self.on_connect_failure: 
    95                                 self.on_connect_failure() 
     98                        # connect with this server address failed 
     99                        self.DEBUG("Failed to connect to %s:%d with address [%s]:%d (timeout)"%(self._server[0],self._server[1],self._serveraddr[0],self._serveraddr[1]),'info') 
     100                        self._addrinfo.pop(0) 
     101                        # try another server address if possible, otherwise failure 
     102                        if len(self._addrinfo) > 0: 
     103                                self.connect() 
     104                        else: 
     105                                self.idlequeue.unplug_idle(self.fd) 
     106                                if self.on_connect_failure: 
     107                                        self.on_connect_failure() 
    96108                else: 
    97109                        if self.on_timeout: 
    98110                                self.on_timeout() 
     
    105117                else:  
    106118                        self._server = server 
    107119                self.state = 0 
    108                 try: 
    109                         self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    110                         self._sock.setblocking(False) 
    111                 except: 
     120                 
     121                # get server addresses (either IPv6 or IPv4) if not already done 
     122                if self._addrinfo is None: 
     123                        self._addrinfo = socket.getaddrinfo(server[0], server[1], socket.AF_UNSPEC, socket.SOCK_STREAM) 
     124                 
     125                # try to connect to server with one of its addresses 
     126                self._sock = None 
     127                for res in self._addrinfo: 
     128                        af, socktype, proto, canonname, sa = res 
     129                 
     130                        self.DEBUG("Connect to %s:%d with address [%s]:%d"%(server[0],server[1],sa[0],sa[1]),'info') 
     131                        try: 
     132                                self._sock = socket.socket(af, socktype, proto) 
     133                                self._sock.setblocking(False) 
     134                        except socket.error, msg: 
     135                                self._sock = None 
     136                                self._addrinfo.pop(0) 
     137                                self.DEBUG("Failed to connect to %s:%d with address [%s]:%d (socket() failed)"%(server[0],server[1],sa[0],sa[1]),'info') 
     138                                continue 
     139 
     140                        self._serveraddr = sa 
     141                        break 
     142 
     143                # if socket creation failed and no more addresses are available, 
     144                # failure 
     145                if self._sock is None: 
    112146                        sys.exc_clear() 
    113147                        if self.on_connect_failure: 
    114148                                self.on_connect_failure() 
    115149                        return False 
     150 
     151                # if socket creation with one server address is successful, 
     152                # try to connect 
    116153                self.fd = self._sock.fileno() 
    117154                self.idlequeue.plug_idle(self, True, False) 
    118155                self.set_timeout(CONNECT_TIMEOUT_SECONDS) 
     
    285322                self._sock.setblocking(False) 
    286323                errnum = 0 
    287324                try: 
    288                         self._sock.connect(self._server) 
     325                        self._sock.connect(self._serveraddr) 
    289326                except socket.error, e: 
    290327                        errnum = e[0] 
    291328                        sys.exc_clear() 
     
    295332                # 10056  - already connected, only on win32 
    296333                # code 'WS*' is not available on GNU, so we use its numeric value 
    297334                elif errnum not in (0, 10056, errno.EISCONN):  
     335                        self.DEBUG("Failed to connect to %s:%d with address [%s]:%d (connect() failed with error %d)"%(self._server[0],self._server[1],self._serveraddr[0],self._serveraddr[1],errnum),'info') 
    298336                        self.remove_timeout() 
    299                         if self.on_connect_failure: 
    300                                 self.on_connect_failure() 
     337                        self._sock.close() 
     338                        self._addrinfo.pop(0) 
     339                        # try another server address if possible, otherwise failure 
     340                        if len(self._addrinfo) > 0: 
     341                                self.connect() 
     342                        else: 
     343                                if self.on_connect_failure: 
     344                                        self.on_connect_failure() 
    301345                        return 
     346                 
    302347                self.remove_timeout() 
    303348                self._owner.Connection=self 
    304349                self.state = 1 
  • src/common/xmpp/transports.py

    diff -Nru gajim-20060727/src/common/xmpp/transports.py gajim-20060727-ipv6/src/common/xmpp/transports.py
    old new  
    9494 
    9595    def connect(self,server=None): 
    9696        """ Try to connect. Returns non-empty string on success. """ 
    97         try: 
    98             if not server: server=self._server 
    99             self._sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    100             self._sock.connect(server) 
    101             self._send=self._sock.sendall 
    102             self._recv=self._sock.recv 
    103             self.DEBUG("Successfully connected to remote host %s"%`server`,'start') 
    104             return 'ok' 
    105         except: pass 
     97        if not server: server=self._server 
     98        s = None 
     99        for res in socket.getaddrinfo(server[0], server[1], socket.AF_UNSPEC, socket.SOCK_STREAM): 
     100            af, socktype, proto, canonname, sa = res 
     101            self.DEBUG("Connect to %s:%d with address [%s]:%d"%(server[0],server[1],sa[0],sa[1]),'info') 
     102            try: 
     103                s = socket.socket(af, socktype, proto) 
     104            except socket.error, msg: 
     105                self.DEBUG("Failed to connect to %s:%d with address [%s]:%d (socket() failed)"%(server[0],server[1],sa[0],sa[1]),'info') 
     106                s = None 
     107                continue 
     108            try: 
     109                s.connect(sa) 
     110            except socket.error, msg: 
     111                self.DEBUG("Failed to connect to %s:%d with address [%s]:%d (connect() failed)"%(server[0],server[1],sa[0],sa[1]),'info') 
     112                s.close() 
     113                s = None 
     114                continue 
     115            self.DEBUG("Successfully connected to remote host %s:%d with address [%s]:%d"%(server[0],server[1],sa[0],sa[1]),'info') 
     116            break 
     117        if s is None: 
     118            self.DEBUG("Failed to connect to remote host %s:%s"%(server[0],server[1]),'info') 
     119            pass 
     120        return 'ok' 
    106121 
    107122    def plugout(self): 
    108123        """ Disconnect from the remote server and unregister self.disconnected method from 
  • THANKS

    diff -Nru gajim-20060727/THANKS gajim-20060727-ipv6/THANKS
    old new  
    1010Christoph Neuroth 
    1111David Campey 
    1212Dennis Craven 
     13Didier Barvaux (IPv6 support) 
    1314Fabian Neumann 
    1415Filippos Papadopoulos 
    1516Francisco Alburquerque Parra (Membris Khan)