[Lldb-commits] [lldb] r251879 - Provide ADB port forwarding support for abstract sockets.

Oleksiy Vyalov via lldb-commits lldb-commits at lists.llvm.org
Mon Nov 2 17:37:01 PST 2015


Author: ovyalov
Date: Mon Nov  2 19:37:01 2015
New Revision: 251879

URL: http://llvm.org/viewvc/llvm-project?rev=251879&view=rev
Log:
Provide ADB port forwarding support for abstract sockets.

http://reviews.llvm.org/D14262


Modified:
    lldb/trunk/include/lldb/Host/posix/ConnectionFileDescriptorPosix.h
    lldb/trunk/source/Host/posix/ConnectionFileDescriptorPosix.cpp
    lldb/trunk/source/Plugins/Platform/Android/AdbClient.cpp
    lldb/trunk/source/Plugins/Platform/Android/AdbClient.h
    lldb/trunk/source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.cpp
    lldb/trunk/source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.h

Modified: lldb/trunk/include/lldb/Host/posix/ConnectionFileDescriptorPosix.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/posix/ConnectionFileDescriptorPosix.h?rev=251879&r1=251878&r2=251879&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Host/posix/ConnectionFileDescriptorPosix.h (original)
+++ lldb/trunk/include/lldb/Host/posix/ConnectionFileDescriptorPosix.h Mon Nov  2 19:37:01 2015
@@ -34,6 +34,17 @@ class SocketAddress;
 class ConnectionFileDescriptor : public Connection
 {
   public:
+    static const char* LISTEN_SCHEME;
+    static const char* ACCEPT_SCHEME;
+    static const char* UNIX_ACCEPT_SCHEME;
+    static const char* CONNECT_SCHEME;
+    static const char* TCP_CONNECT_SCHEME;
+    static const char* UDP_SCHEME;
+    static const char* UNIX_CONNECT_SCHEME;
+    static const char* UNIX_ABSTRACT_CONNECT_SCHEME;
+    static const char* FD_SCHEME;
+    static const char* FILE_SCHEME;
+
     ConnectionFileDescriptor(bool child_processes_inherit = false);
 
     ConnectionFileDescriptor(int fd, bool owns_fd);

Modified: lldb/trunk/source/Host/posix/ConnectionFileDescriptorPosix.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/posix/ConnectionFileDescriptorPosix.cpp?rev=251879&r1=251878&r2=251879&view=diff
==============================================================================
--- lldb/trunk/source/Host/posix/ConnectionFileDescriptorPosix.cpp (original)
+++ lldb/trunk/source/Host/posix/ConnectionFileDescriptorPosix.cpp Mon Nov  2 19:37:01 2015
@@ -53,6 +53,31 @@
 using namespace lldb;
 using namespace lldb_private;
 
+const char* ConnectionFileDescriptor::LISTEN_SCHEME = "listen";
+const char* ConnectionFileDescriptor::ACCEPT_SCHEME = "accept";
+const char* ConnectionFileDescriptor::UNIX_ACCEPT_SCHEME = "unix-accept";
+const char* ConnectionFileDescriptor::CONNECT_SCHEME = "connect";
+const char* ConnectionFileDescriptor::TCP_CONNECT_SCHEME = "tcp-connect";
+const char* ConnectionFileDescriptor::UDP_SCHEME = "udp";
+const char* ConnectionFileDescriptor::UNIX_CONNECT_SCHEME = "unix-connect";
+const char* ConnectionFileDescriptor::UNIX_ABSTRACT_CONNECT_SCHEME = "unix-abstract-connect";
+const char* ConnectionFileDescriptor::FD_SCHEME = "fd";
+const char* ConnectionFileDescriptor::FILE_SCHEME = "file";
+
+namespace {
+
+const char*
+GetURLAddress(const char *url, const char *scheme)
+{
+    const auto prefix = std::string(scheme) + "://";
+    if (strstr(url, prefix.c_str()) != url)
+        return nullptr;
+
+    return url + prefix.size();
+}
+
+}
+
 ConnectionFileDescriptor::ConnectionFileDescriptor(bool child_processes_inherit)
     : Connection()
     , m_pipe()
@@ -154,51 +179,51 @@ ConnectionFileDescriptor::Connect(const
 
     if (s && s[0])
     {
-        if (strstr(s, "listen://") == s)
+        const char *addr = nullptr;
+        if ((addr = GetURLAddress(s, LISTEN_SCHEME)))
         {
             // listen://HOST:PORT
-            return SocketListenAndAccept(s + strlen("listen://"), error_ptr);
+            return SocketListenAndAccept(addr, error_ptr);
         }
-        else if (strstr(s, "accept://") == s)
+        else if ((addr = GetURLAddress(s, ACCEPT_SCHEME)))
         {
             // unix://SOCKNAME
-            return NamedSocketAccept(s + strlen("accept://"), error_ptr);
+            return NamedSocketAccept(addr, error_ptr);
         }
-        else if (strstr(s, "unix-accept://") == s)
+        else if ((addr = GetURLAddress(s, UNIX_ACCEPT_SCHEME)))
         {
             // unix://SOCKNAME
-            return NamedSocketAccept(s + strlen("unix-accept://"), error_ptr);
+            return NamedSocketAccept(addr, error_ptr);
         }
-        else if (strstr(s, "connect://") == s)
+        else if ((addr = GetURLAddress(s, CONNECT_SCHEME)))
         {
-            return ConnectTCP(s + strlen("connect://"), error_ptr);
+            return ConnectTCP(addr, error_ptr);
         }
-        else if (strstr(s, "tcp-connect://") == s)
+        else if ((addr = GetURLAddress(s, TCP_CONNECT_SCHEME)))
         {
-            return ConnectTCP(s + strlen("tcp-connect://"), error_ptr);
+            return ConnectTCP(addr, error_ptr);
         }
-        else if (strstr(s, "udp://") == s)
+        else if ((addr = GetURLAddress(s, UDP_SCHEME)))
         {
-            return ConnectUDP(s + strlen("udp://"), error_ptr);
+            return ConnectUDP(addr, error_ptr);
         }
-        else if (strstr(s, "unix-connect://") == s)
+        else if ((addr = GetURLAddress(s, UNIX_CONNECT_SCHEME)))
         {
             // unix-connect://SOCKNAME
-            return NamedSocketConnect(s + strlen("unix-connect://"), error_ptr);
+            return NamedSocketConnect(addr, error_ptr);
         }
-        else if (strstr(s, "unix-abstract-connect://") == s)
+        else if ((addr = GetURLAddress(s, UNIX_ABSTRACT_CONNECT_SCHEME)))
         {
             // unix-abstract-connect://SOCKNAME
-            return UnixAbstractSocketConnect(s + strlen("unix-abstract-connect://"), error_ptr);
+            return UnixAbstractSocketConnect(addr, error_ptr);
         }
 #ifndef LLDB_DISABLE_POSIX
-        else if (strstr(s, "fd://") == s)
+        else if ((addr = GetURLAddress(s, FD_SCHEME)))
         {
             // Just passing a native file descriptor within this current process
             // that is already opened (possibly from a service or other source).
-            s += strlen("fd://");
             bool success = false;
-            int fd = StringConvert::ToSInt32(s, -1, 0, &success);
+            int fd = StringConvert::ToSInt32(addr, -1, 0, &success);
 
             if (success)
             {
@@ -244,21 +269,21 @@ ConnectionFileDescriptor::Connect(const
                         m_read_sp.reset(new File(fd, false));
                         m_write_sp.reset(new File(fd, false));
                     }
-                    m_uri.assign(s);
+                    m_uri.assign(addr);
                     return eConnectionStatusSuccess;
                 }
             }
 
             if (error_ptr)
-                error_ptr->SetErrorStringWithFormat("invalid file descriptor: \"fd://%s\"", s);
+                error_ptr->SetErrorStringWithFormat("invalid file descriptor: \"%s\"", s);
             m_read_sp.reset();
             m_write_sp.reset();
             return eConnectionStatusError;
         }
-        else if (strstr(s, "file://") == s)
+        else if ((addr = GetURLAddress(s, FILE_SCHEME)))
         {
             // file:///PATH
-            const char *path = s + strlen("file://");
+            const char *path = addr;
             int fd = -1;
             do
             {

Modified: lldb/trunk/source/Plugins/Platform/Android/AdbClient.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/Android/AdbClient.cpp?rev=251879&r1=251878&r2=251879&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/Android/AdbClient.cpp (original)
+++ lldb/trunk/source/Plugins/Platform/Android/AdbClient.cpp Mon Nov  2 19:37:01 2015
@@ -50,6 +50,9 @@ const size_t kMaxPushData = 2*1024;
 // Default mode for pushed files.
 const uint32_t kDefaultMode = 0100770; // S_IFREG | S_IRWXU | S_IRWXG
 
+const char * kSocketNamespaceAbstract = "localabstract";
+const char * kSocketNamespaceFileSystem = "localfilesystem";
+
 }  // namespace
 
 Error
@@ -145,10 +148,17 @@ AdbClient::SetPortForwarding (const uint
 }
 
 Error
-AdbClient::SetPortForwarding (const uint16_t local_port, const char* remote_socket_name)
+AdbClient::SetPortForwarding (const uint16_t local_port,
+                              const char* remote_socket_name,
+                              const UnixSocketNamespace socket_namespace)
 {
     char message[PATH_MAX];
-    snprintf (message, sizeof (message), "forward:tcp:%d;localfilesystem:%s", local_port, remote_socket_name);
+    const char * sock_namespace_str = (socket_namespace == UnixSocketNamespaceAbstract) ?
+        kSocketNamespaceAbstract : kSocketNamespaceFileSystem;
+    snprintf (message, sizeof (message), "forward:tcp:%d;%s:%s",
+              local_port,
+              sock_namespace_str,
+              remote_socket_name);
 
     const auto error = SendDeviceMessage (message);
     if (error.Fail ())

Modified: lldb/trunk/source/Plugins/Platform/Android/AdbClient.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/Android/AdbClient.h?rev=251879&r1=251878&r2=251879&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/Android/AdbClient.h (original)
+++ lldb/trunk/source/Plugins/Platform/Android/AdbClient.h Mon Nov  2 19:37:01 2015
@@ -33,6 +33,12 @@ namespace platform_android {
 class AdbClient
 {
 public:
+    enum UnixSocketNamespace
+    {
+        UnixSocketNamespaceAbstract,
+        UnixSocketNamespaceFileSystem,
+    };
+
     using DeviceIDList = std::list<std::string>;
 
     static Error
@@ -51,7 +57,9 @@ public:
     SetPortForwarding (const uint16_t local_port, const uint16_t remote_port);
 
     Error
-    SetPortForwarding (const uint16_t local_port, const char* remote_socket_name);
+    SetPortForwarding (const uint16_t local_port,
+                       const char* remote_socket_name,
+                       const UnixSocketNamespace socket_namespace);
 
     Error
     DeletePortForwarding (const uint16_t local_port);

Modified: lldb/trunk/source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.cpp?rev=251879&r1=251878&r2=251879&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.cpp (original)
+++ lldb/trunk/source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.cpp Mon Nov  2 19:37:01 2015
@@ -11,7 +11,6 @@
 #include "lldb/Core/Error.h"
 #include "lldb/Core/Log.h"
 #include "lldb/Host/common/TCPSocket.h"
-#include "AdbClient.h"
 #include "PlatformAndroidRemoteGDBServer.h"
 #include "Utility/UriParser.h"
 
@@ -27,6 +26,7 @@ static Error
 ForwardPortWithAdb (const uint16_t local_port,
                     const uint16_t remote_port,
                     const char* remote_socket_name,
+                    const llvm::Optional<AdbClient::UnixSocketNamespace>& socket_namespace,
                     std::string& device_id)
 {
     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_PLATFORM));
@@ -49,7 +49,11 @@ ForwardPortWithAdb (const uint16_t local
 
     if (log)
         log->Printf("Forwarding remote socket \"%s\" to local TCP port %d", remote_socket_name, local_port);
-    return adb.SetPortForwarding(local_port, remote_socket_name);
+
+    if (!socket_namespace)
+        return Error("Invalid socket namespace");
+
+    return adb.SetPortForwarding(local_port, remote_socket_name, *socket_namespace);
 }
 
 static Error
@@ -129,6 +133,12 @@ PlatformAndroidRemoteGDBServer::ConnectR
     if (host != "localhost")
         m_device_id = host;
 
+    m_socket_namespace.reset();
+    if (scheme == ConnectionFileDescriptor::UNIX_CONNECT_SCHEME)
+        m_socket_namespace = AdbClient::UnixSocketNamespaceFileSystem;
+    else if (scheme == ConnectionFileDescriptor::UNIX_ABSTRACT_CONNECT_SCHEME)
+        m_socket_namespace = AdbClient::UnixSocketNamespaceAbstract;
+
     std::string connect_url;
     auto error = MakeConnectURL (g_remote_platform_pid,
                                  (remote_port < 0) ? 0 : remote_port,
@@ -196,7 +206,11 @@ PlatformAndroidRemoteGDBServer::MakeConn
         if (error.Fail())
             return error;
 
-        error = ForwardPortWithAdb(local_port, remote_port, remote_socket_name, m_device_id);
+        error = ForwardPortWithAdb(local_port,
+                                   remote_port,
+                                   remote_socket_name,
+                                   m_socket_namespace,
+                                   m_device_id);
         if (error.Success())
         {
             m_port_forwards[pid] = local_port;

Modified: lldb/trunk/source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.h?rev=251879&r1=251878&r2=251879&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.h (original)
+++ lldb/trunk/source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.h Mon Nov  2 19:37:01 2015
@@ -19,6 +19,10 @@
 // Project includes
 #include "Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h"
 
+#include "llvm/ADT/Optional.h"
+
+#include "AdbClient.h"
+
 namespace lldb_private {
 namespace platform_android {
 
@@ -38,6 +42,7 @@ public:
 protected:
     std::string m_device_id;
     std::map<lldb::pid_t, uint16_t> m_port_forwards;
+    llvm::Optional<AdbClient::UnixSocketNamespace> m_socket_namespace;
 
     bool
     LaunchGDBServer (lldb::pid_t &pid, std::string &connect_url) override;




More information about the lldb-commits mailing list