Author: ovyalov Date: Thu Oct 22 12:50:33 2015 New Revision: 251034 URL: http://llvm.org/viewvc/llvm-project?rev=251034&view=rev Log: Add support for abstract domain sockets.
http://reviews.llvm.org/D13970 Added: lldb/trunk/include/lldb/Host/linux/AbstractSocket.h lldb/trunk/source/Host/linux/AbstractSocket.cpp Modified: lldb/trunk/include/lldb/Host/Socket.h lldb/trunk/include/lldb/Host/posix/ConnectionFileDescriptorPosix.h lldb/trunk/include/lldb/Host/posix/DomainSocket.h lldb/trunk/source/Host/CMakeLists.txt lldb/trunk/source/Host/common/Socket.cpp lldb/trunk/source/Host/posix/ConnectionFileDescriptorPosix.cpp lldb/trunk/source/Host/posix/DomainSocket.cpp Modified: lldb/trunk/include/lldb/Host/Socket.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/Socket.h?rev=251034&r1=251033&r2=251034&view=diff ============================================================================== --- lldb/trunk/include/lldb/Host/Socket.h (original) +++ lldb/trunk/include/lldb/Host/Socket.h Thu Oct 22 12:50:33 2015 @@ -45,7 +45,8 @@ public: { ProtocolTcp, ProtocolUdp, - ProtocolUnixDomain + ProtocolUnixDomain, + ProtocolUnixAbstract } SocketProtocol; static const NativeSocket kInvalidSocketValue; @@ -69,6 +70,8 @@ public: static Error UdpConnect(llvm::StringRef host_and_port, bool child_processes_inherit, Socket *&send_socket, Socket *&recv_socket); static Error UnixDomainConnect(llvm::StringRef host_and_port, bool child_processes_inherit, Socket *&socket); static Error UnixDomainAccept(llvm::StringRef host_and_port, bool child_processes_inherit, Socket *&socket); + static Error UnixAbstractConnect(llvm::StringRef host_and_port, bool child_processes_inherit, Socket *&socket); + static Error UnixAbstractAccept(llvm::StringRef host_and_port, bool child_processes_inherit, Socket *&socket); int GetOption (int level, int option_name, int &option_value); int SetOption (int level, int option_name, int option_value); Added: lldb/trunk/include/lldb/Host/linux/AbstractSocket.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/linux/AbstractSocket.h?rev=251034&view=auto ============================================================================== --- lldb/trunk/include/lldb/Host/linux/AbstractSocket.h (added) +++ lldb/trunk/include/lldb/Host/linux/AbstractSocket.h Thu Oct 22 12:50:33 2015 @@ -0,0 +1,28 @@ +//===-- AbstractSocket.h ----------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_AbstractSocket_h_ +#define liblldb_AbstractSocket_h_ + +#include "lldb/Host/posix/DomainSocket.h" + +namespace lldb_private +{ + class AbstractSocket: public DomainSocket + { + public: + AbstractSocket(bool child_processes_inherit, Error &error); + + protected: + size_t GetNameOffset() const override; + void DeleteSocketFile(llvm::StringRef name) override; + }; +} + +#endif // ifndef liblldb_AbstractSocket_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=251034&r1=251033&r2=251034&view=diff ============================================================================== --- lldb/trunk/include/lldb/Host/posix/ConnectionFileDescriptorPosix.h (original) +++ lldb/trunk/include/lldb/Host/posix/ConnectionFileDescriptorPosix.h Thu Oct 22 12:50:33 2015 @@ -84,6 +84,8 @@ class ConnectionFileDescriptor : public lldb::ConnectionStatus NamedSocketAccept(const char *socket_name, Error *error_ptr); + lldb::ConnectionStatus UnixAbstractSocketConnect(const char *socket_name, Error *error_ptr); + lldb::IOObjectSP m_read_sp; lldb::IOObjectSP m_write_sp; Modified: lldb/trunk/include/lldb/Host/posix/DomainSocket.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/posix/DomainSocket.h?rev=251034&r1=251033&r2=251034&view=diff ============================================================================== --- lldb/trunk/include/lldb/Host/posix/DomainSocket.h (original) +++ lldb/trunk/include/lldb/Host/posix/DomainSocket.h Thu Oct 22 12:50:33 2015 @@ -22,6 +22,13 @@ namespace lldb_private Error Connect(llvm::StringRef name) override; Error Listen(llvm::StringRef name, int backlog) override; Error Accept(llvm::StringRef name, bool child_processes_inherit, Socket *&socket) override; + + protected: + DomainSocket(SocketProtocol protocol, bool child_processes_inherit, Error &error); + + virtual size_t GetNameOffset() const; + virtual void DeleteSocketFile(llvm::StringRef name); + private: DomainSocket(NativeSocket socket); }; Modified: lldb/trunk/source/Host/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/CMakeLists.txt?rev=251034&r1=251033&r2=251034&view=diff ============================================================================== --- lldb/trunk/source/Host/CMakeLists.txt (original) +++ lldb/trunk/source/Host/CMakeLists.txt Thu Oct 22 12:50:33 2015 @@ -121,6 +121,7 @@ else() android/HostInfoAndroid.cpp android/LibcGlue.cpp android/ProcessLauncherAndroid.cpp + linux/AbstractSocket.cpp linux/Host.cpp linux/HostInfoLinux.cpp linux/HostThreadLinux.cpp @@ -129,6 +130,7 @@ else() ) else() add_host_subdirectory(linux + linux/AbstractSocket.cpp linux/Host.cpp linux/HostInfoLinux.cpp linux/HostThreadLinux.cpp Modified: lldb/trunk/source/Host/common/Socket.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/Socket.cpp?rev=251034&r1=251033&r2=251034&view=diff ============================================================================== --- lldb/trunk/source/Host/common/Socket.cpp (original) +++ lldb/trunk/source/Host/common/Socket.cpp Thu Oct 22 12:50:33 2015 @@ -30,6 +30,10 @@ #include <sys/un.h> #endif +#ifdef __linux__ +#include "lldb/Host/linux/AbstractSocket.h" +#endif + #ifdef __ANDROID_NDK__ #include <linux/tcp.h> #include <bits/error_constants.h> @@ -189,6 +193,44 @@ Error Socket::UnixDomainAccept(llvm::Str #endif return error; } + +Error +Socket::UnixAbstractConnect(llvm::StringRef name, bool child_processes_inherit, Socket *&socket) +{ + Error error; +#ifdef __linux__ + std::unique_ptr<Socket> connect_socket(new AbstractSocket(child_processes_inherit, error)); + if (error.Fail()) + return error; + + error = connect_socket->Connect(name); + if (error.Success()) + socket = connect_socket.release(); +#else + error.SetErrorString("Abstract domain sockets are not supported on this platform."); +#endif + return error; +} + +Error +Socket::UnixAbstractAccept(llvm::StringRef name, bool child_processes_inherit, Socket *&socket) +{ + Error error; +#ifdef __linux__ + std::unique_ptr<Socket> listen_socket(new AbstractSocket(child_processes_inherit, error)); + if (error.Fail()) + return error; + + error = listen_socket->Listen(name, 5); + if (error.Fail()) + return error; + + error = listen_socket->Accept(name, child_processes_inherit, socket); +#else + error.SetErrorString("Abstract domain sockets are not supported on this platform."); +#endif + return error; +} bool Socket::DecodeHostAndPort(llvm::StringRef host_and_port, Added: lldb/trunk/source/Host/linux/AbstractSocket.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/linux/AbstractSocket.cpp?rev=251034&view=auto ============================================================================== --- lldb/trunk/source/Host/linux/AbstractSocket.cpp (added) +++ lldb/trunk/source/Host/linux/AbstractSocket.cpp Thu Oct 22 12:50:33 2015 @@ -0,0 +1,31 @@ +//===-- AbstractSocket.cpp --------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Host/linux/AbstractSocket.h" + +#include "llvm/ADT/StringRef.h" + +using namespace lldb; +using namespace lldb_private; + +AbstractSocket::AbstractSocket(bool child_processes_inherit, Error &error) + : DomainSocket(ProtocolUnixAbstract, child_processes_inherit, error) +{ +} + +size_t +AbstractSocket::GetNameOffset() const +{ + return 1; +} + +void +AbstractSocket::DeleteSocketFile(llvm::StringRef name) +{ +} Modified: lldb/trunk/source/Host/posix/ConnectionFileDescriptorPosix.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/posix/ConnectionFileDescriptorPosix.cpp?rev=251034&r1=251033&r2=251034&view=diff ============================================================================== --- lldb/trunk/source/Host/posix/ConnectionFileDescriptorPosix.cpp (original) +++ lldb/trunk/source/Host/posix/ConnectionFileDescriptorPosix.cpp Thu Oct 22 12:50:33 2015 @@ -186,6 +186,11 @@ ConnectionFileDescriptor::Connect(const // unix-connect://SOCKNAME return NamedSocketConnect(s + strlen("unix-connect://"), error_ptr); } + else if (strstr(s, "unix-abstract-connect://") == s) + { + // unix-abstract-connect://SOCKNAME + return UnixAbstractSocketConnect(s + strlen("unix-abstract-connect://"), error_ptr); + } #ifndef LLDB_DISABLE_POSIX else if (strstr(s, "fd://") == s) { @@ -754,6 +759,23 @@ ConnectionFileDescriptor::NamedSocketCon if (error_ptr) *error_ptr = error; m_write_sp.reset(socket); + m_read_sp = m_write_sp; + if (error.Fail()) + { + return eConnectionStatusError; + } + m_uri.assign(socket_name); + return eConnectionStatusSuccess; +} + +lldb::ConnectionStatus +ConnectionFileDescriptor::UnixAbstractSocketConnect(const char *socket_name, Error *error_ptr) +{ + Socket *socket = nullptr; + Error error = Socket::UnixAbstractConnect(socket_name, m_child_processes_inherit, socket); + if (error_ptr) + *error_ptr = error; + m_write_sp.reset(socket); m_read_sp = m_write_sp; if (error.Fail()) { Modified: lldb/trunk/source/Host/posix/DomainSocket.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/posix/DomainSocket.cpp?rev=251034&r1=251033&r2=251034&view=diff ============================================================================== --- lldb/trunk/source/Host/posix/DomainSocket.cpp (original) +++ lldb/trunk/source/Host/posix/DomainSocket.cpp Thu Oct 22 12:50:33 2015 @@ -29,14 +29,19 @@ namespace { const int kDomain = AF_UNIX; const int kType = SOCK_STREAM; -void SetSockAddr(llvm::StringRef name, sockaddr_un* saddr_un) +bool SetSockAddr(llvm::StringRef name, const size_t name_offset, sockaddr_un* saddr_un) { + if (name.size() + name_offset > sizeof(saddr_un->sun_path)) + return false; + saddr_un->sun_family = kDomain; - ::strncpy(saddr_un->sun_path, name.data(), sizeof(saddr_un->sun_path) - 1); - saddr_un->sun_path[sizeof(saddr_un->sun_path) - 1] = '\0'; + memset(saddr_un->sun_path, 0, sizeof(saddr_un->sun_path)); + + strncpy(&saddr_un->sun_path[name_offset], name.data(), name.size()); #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) saddr_un->sun_len = SUN_LEN (saddr_un); #endif + return true; } } @@ -51,14 +56,20 @@ DomainSocket::DomainSocket(bool child_pr { } +DomainSocket::DomainSocket(SocketProtocol protocol, bool child_processes_inherit, Error &error) + : Socket(CreateSocket(kDomain, kType, 0, child_processes_inherit, error), protocol, true) +{ +} + Error DomainSocket::Connect(llvm::StringRef name) { sockaddr_un saddr_un; - SetSockAddr(name, &saddr_un); + if (!SetSockAddr(name, GetNameOffset(), &saddr_un)) + return Error("Failed to set socket address"); Error error; - if (::connect(GetNativeSocket(), (struct sockaddr *)&saddr_un, SUN_LEN (&saddr_un)) < 0) + if (::connect(GetNativeSocket(), (struct sockaddr *)&saddr_un, sizeof(saddr_un)) < 0) SetLastError (error); return error; @@ -68,12 +79,13 @@ Error DomainSocket::Listen(llvm::StringRef name, int backlog) { sockaddr_un saddr_un; - SetSockAddr(name, &saddr_un); + if (!SetSockAddr(name, GetNameOffset(), &saddr_un)) + return Error("Failed to set socket address"); - FileSystem::Unlink(FileSpec{name, true}); + DeleteSocketFile(name); Error error; - if (::bind(GetNativeSocket(), (struct sockaddr *)&saddr_un, SUN_LEN (&saddr_un)) == 0) + if (::bind(GetNativeSocket(), (struct sockaddr *)&saddr_un, sizeof(saddr_un)) == 0) if (::listen(GetNativeSocket(), backlog) == 0) return error; @@ -91,3 +103,15 @@ DomainSocket::Accept(llvm::StringRef nam return error; } + +size_t +DomainSocket::GetNameOffset() const +{ + return 0; +} + +void +DomainSocket::DeleteSocketFile(llvm::StringRef name) +{ + FileSystem::Unlink(FileSpec{name, true}); +} _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits