Improved IPv6 support.

Sun, 17 Jul 2011 18:10:54 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 17 Jul 2011 18:10:54 +0200
changeset 1179
7661ab683f7b
parent 1177
5249187bb668
child 1180
566742748d48

Improved IPv6 support.

DebugClients/Python/DebugClientBase.py file | annotate | diff | comparison | revisions
DebugClients/Python3/DebugClientBase.py file | annotate | diff | comparison | revisions
DebugClients/Ruby/DebugClientBaseModule.rb file | annotate | diff | comparison | revisions
Debugger/DebugServer.py file | annotate | diff | comparison | revisions
Debugger/DebuggerInterfaceNone.py file | annotate | diff | comparison | revisions
Debugger/DebuggerInterfacePython.py file | annotate | diff | comparison | revisions
Debugger/DebuggerInterfaceRuby.py file | annotate | diff | comparison | revisions
--- a/DebugClients/Python/DebugClientBase.py	Sat Jul 16 15:03:09 2011 +0200
+++ b/DebugClients/Python/DebugClientBase.py	Sun Jul 17 18:10:54 2011 +0200
@@ -1061,12 +1061,22 @@
         if remoteAddress is None:                               # default: 127.0.0.1
             sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
             sock.connect((DebugProtocol.DebugAddress, port))
-        elif ":" in remoteAddress:                              # IPv6
-            sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
-            sock.connect((remoteAddress, port))
-        else:                                                   # IPv4
-            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-            sock.connect((remoteAddress, port))
+        else:
+            if "@@i" in remoteAddress:
+                remoteAddress, index = remoteAddress.split("@@i")
+            else:
+                index = 0
+            if ":" in remoteAddress:                              # IPv6
+                printerr(type(remoteAddress))
+                printerr(type(port))
+                sockaddr = socket.getaddrinfo(
+                    remoteAddress, port, 0, 0, socket.SOL_TCP)[0][-1]
+                sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
+                sockaddr = sockaddr[:-1] + (int(index),)
+                sock.connect(sockaddr)
+            else:                                                   # IPv4
+                sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+                sock.connect((remoteAddress, port))
 
         self.readstream = AsyncFile(sock, sys.stdin.mode, sys.stdin.name)
         self.writestream = AsyncFile(sock, sys.stdout.mode, sys.stdout.name)
@@ -1825,7 +1835,7 @@
                     del args[0]
                     del args[0]
                 elif args[0] == '-p':
-                    port = long(args[1])
+                    port = int(args[1])
                     del args[0]
                     del args[0]
                 elif args[0] == '-w':
@@ -1872,7 +1882,7 @@
             if sys.argv[1] == '':
                 del sys.argv[1]
             try:
-                port = long(sys.argv[1])
+                port = int(sys.argv[1])
             except (ValueError, IndexError):
                 port = -1
             try:
--- a/DebugClients/Python3/DebugClientBase.py	Sat Jul 16 15:03:09 2011 +0200
+++ b/DebugClients/Python3/DebugClientBase.py	Sun Jul 17 18:10:54 2011 +0200
@@ -1061,12 +1061,20 @@
         if remoteAddress is None:                               # default: 127.0.0.1
             sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
             sock.connect((DebugProtocol.DebugAddress, port))
-        elif ":" in remoteAddress:                              # IPv6
-            sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
-            sock.connect((remoteAddress, port))
-        else:                                                   # IPv4
-            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-            sock.connect((remoteAddress, port))
+        else:
+            if "@@i" in remoteAddress:
+                remoteAddress, index = remoteAddress.split("@@i")
+            else:
+                index = 0
+            if ":" in remoteAddress:                              # IPv6
+                sockaddr = socket.getaddrinfo(
+                    remoteAddress, port, 0, 0, socket.SOL_TCP)[0][-1]
+                sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
+                sockaddr = sockaddr[:-1] + (int(index),)
+                sock.connect(sockaddr)
+            else:                                                   # IPv4
+                sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+                sock.connect((remoteAddress, port))
 
         self.readstream = AsyncFile(sock, sys.stdin.mode, sys.stdin.name)
         self.writestream = AsyncFile(sock, sys.stdout.mode, sys.stdout.name)
--- a/DebugClients/Ruby/DebugClientBaseModule.rb	Sat Jul 16 15:03:09 2011 +0200
+++ b/DebugClients/Ruby/DebugClientBaseModule.rb	Sun Jul 17 18:10:54 2011 +0200
@@ -690,6 +690,14 @@
         if remoteAddress == nil
             sock = TCPSocket.new(DebugAddress, port)
         else
+            if remoteAddress =~ /@@i/
+                remoteAddress, interface = remoteAddress.split("@@i")
+            else
+                interface = 0
+            end
+            if remoteAddress.downcase =~ /^fe80/
+                remoteAddress = "%s%%%s" % [remoteAddress, interface]
+            end
             sock = TCPSocket.new(remoteAddress, port)
         end
         
--- a/Debugger/DebugServer.py	Sat Jul 16 15:03:09 2011 +0200
+++ b/Debugger/DebugServer.py	Sun Jul 17 18:10:54 2011 +0200
@@ -10,7 +10,7 @@
 import os
 
 from PyQt4.QtCore import pyqtSignal, QModelIndex
-from PyQt4.QtNetwork import QTcpServer, QHostAddress, QHostInfo
+from PyQt4.QtNetwork import QTcpServer, QHostAddress, QHostInfo, QNetworkInterface
 
 from E5Gui.E5Application import e5App
 from E5Gui import E5MessageBox
@@ -150,13 +150,18 @@
         elif self.networkInterface == "allv6":
             hostAddress = QHostAddress("::")  # QHostAddress.AnyIPv6)
         else:
-            hostAddress = QHostAddress(Preferences.getDebugger("NetworkInterface"))
+            hostAddress = QHostAddress(self.networkInterface)
+        self.networkInterfaceName, self.networkInterfaceIndex = \
+            self.__getNetworkInterfaceAndIndex(self.networkInterface)
+        
         if Preferences.getDebugger("PassiveDbgEnabled"):
-            socket = Preferences.getDebugger("PassiveDbgPort")  # default: 42424
-            self.listen(hostAddress, socket)
+            sock = Preferences.getDebugger("PassiveDbgPort")  # default: 42424
+            self.listen(hostAddress, sock)
             self.passive = True
             self.passiveClientExited = False
         else:
+            if hostAddress.toString().lower().startswith("fe80"):
+                hostAddress.setScopeId(self.networkInterfaceName)
             self.listen(hostAddress)
             self.passive = False
         
@@ -205,7 +210,25 @@
             else:
                 return "{0}@@v6".format(QHostInfo.localHostName())
         else:
-            return self.networkInterface
+            return "{0}@@i{1}".format(self.networkInterface,
+                                      self.networkInterfaceIndex)
+        
+    def __getNetworkInterfaceAndIndex(self, address):
+        """
+        Private method to determine the network interface and the interface index.
+        
+        @param address address to determine the info for (string)
+        @return tuple of network interface name (string) and index (integer)
+        """
+        if address not in ["all", "allv6"]:
+            for networkInterface in QNetworkInterface.allInterfaces():
+                addressEntries = networkInterface.addressEntries()
+                if len(addressEntries) > 0:
+                    for addressEntry in addressEntries:
+                        if addressEntry.ip().toString().lower() == address.lower():
+                            return networkInterface.name(), networkInterface.index()
+        
+        return "", 0
         
     def preferencesChanged(self):
         """
--- a/Debugger/DebuggerInterfaceNone.py	Sat Jul 16 15:03:09 2011 +0200
+++ b/Debugger/DebuggerInterfaceNone.py	Sun Jul 17 18:10:54 2011 +0200
@@ -82,7 +82,7 @@
         """
         Public slot to handle a new connection.
         
-        @param sockreference to the socket object (QTcpSocket)
+        @param sock reference to the socket object (QTcpSocket)
         @return flag indicating success (boolean)
         """
         return False
--- a/Debugger/DebuggerInterfacePython.py	Sat Jul 16 15:03:09 2011 +0200
+++ b/Debugger/DebuggerInterfacePython.py	Sun Jul 17 18:10:54 2011 +0200
@@ -354,7 +354,7 @@
         """
         Public slot to handle a new connection.
         
-        @param sockreference to the socket object (QTcpSocket)
+        @param sock reference to the socket object (QTcpSocket)
         @return flag indicating success (boolean)
         """
         # If we already have a connection, refuse this one.  It will be closed
--- a/Debugger/DebuggerInterfaceRuby.py	Sat Jul 16 15:03:09 2011 +0200
+++ b/Debugger/DebuggerInterfaceRuby.py	Sun Jul 17 18:10:54 2011 +0200
@@ -323,7 +323,7 @@
         """
         Public slot to handle a new connection.
         
-        @param sockreference to the socket object (QTcpSocket)
+        @param sock reference to the socket object (QTcpSocket)
         @return flag indicating success (boolean)
         """
         # If we already have a connection, refuse this one.  It will be closed

eric ide

mercurial