Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions lldb/include/lldb/Host/linux/AbstractSocket.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ namespace lldb_private {
class AbstractSocket : public DomainSocket {
public:
AbstractSocket();
AbstractSocket(NativeSocket socket, bool should_close);

protected:
size_t GetNameOffset() const override;
Expand Down
3 changes: 3 additions & 0 deletions lldb/include/lldb/Host/posix/DomainSocket.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,11 @@ class DomainSocket : public Socket {

std::vector<std::string> GetListeningConnectionURI() const override;

static Socket *Create(NativeSocket sockfd, bool should_close, Status &error);

protected:
DomainSocket(SocketProtocol protocol);
DomainSocket(SocketProtocol protocol, NativeSocket socket, bool should_close);

virtual size_t GetNameOffset() const;
virtual void DeleteSocketFile(llvm::StringRef name);
Expand Down
3 changes: 3 additions & 0 deletions lldb/source/Host/linux/AbstractSocket.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ using namespace lldb_private;

AbstractSocket::AbstractSocket() : DomainSocket(ProtocolUnixAbstract) {}

AbstractSocket::AbstractSocket(NativeSocket socket, bool should_close)
: DomainSocket(ProtocolUnixAbstract, socket, should_close) {}

size_t AbstractSocket::GetNameOffset() const { return 1; }

void AbstractSocket::DeleteSocketFile(llvm::StringRef name) {}
28 changes: 28 additions & 0 deletions lldb/source/Host/posix/DomainSocket.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@

#include "lldb/Host/posix/DomainSocket.h"
#include "lldb/Utility/LLDBLog.h"
#ifdef __linux__
#include <lldb/Host/linux/AbstractSocket.h>
#endif

#include "llvm/Support/Errno.h"
#include "llvm/Support/FileSystem.h"
Expand Down Expand Up @@ -67,6 +70,12 @@ DomainSocket::DomainSocket(NativeSocket socket,
m_socket = socket;
}

DomainSocket::DomainSocket(SocketProtocol protocol, NativeSocket socket,
bool should_close)
: Socket(protocol, should_close) {
m_socket = socket;
}

Status DomainSocket::Connect(llvm::StringRef name) {
sockaddr_un saddr_un;
socklen_t saddr_un_len;
Expand Down Expand Up @@ -182,3 +191,22 @@ std::vector<std::string> DomainSocket::GetListeningConnectionURI() const {

return {llvm::formatv("unix-connect://{0}", addr.sun_path)};
}

Socket *DomainSocket::Create(NativeSocket sockfd, bool should_close,
Status &error) {
#ifdef __linux__
// Check if fd represents domain socket or abstract socket.
struct sockaddr_un addr;
socklen_t addr_len = sizeof(addr);
if (getsockname(sockfd, (struct sockaddr *)&addr, &addr_len) == -1) {
error = Status::FromErrorString(
"lldb-platform child: not a socket or error occurred");
return nullptr;
}

if (addr.sun_family == AF_UNIX && addr.sun_path[0] == '\0') {
return new AbstractSocket(sockfd, should_close);
}
#endif
return new DomainSocket(sockfd, should_close);
}
29 changes: 12 additions & 17 deletions lldb/tools/lldb-server/lldb-platform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -455,35 +455,29 @@ int main_platform(int argc, char *argv[]) {
lldb_private::Args inferior_arguments;
inferior_arguments.SetArguments(argc, const_cast<const char **>(argv));

Socket::SocketProtocol protocol = Socket::ProtocolUnixDomain;

Log *log = GetLog(LLDBLog::Platform);
if (fd != SharedSocket::kInvalidFD) {
// Child process will handle the connection and exit.
if (gdbserver_port)
protocol = Socket::ProtocolTcp;

Log *log = GetLog(LLDBLog::Platform);

NativeSocket sockfd;
error = SharedSocket::GetNativeSocket(fd, sockfd);
if (error.Fail()) {
LLDB_LOGF(log, "lldb-platform child: %s", error.AsCString());
return socket_error;
}

GDBRemoteCommunicationServerPlatform platform(protocol, gdbserver_port);
Socket *socket;
if (protocol == Socket::ProtocolTcp)
if (gdbserver_port) {
socket = new TCPSocket(sockfd, /*should_close=*/true);
else {
#if LLDB_ENABLE_POSIX
socket = new DomainSocket(sockfd, /*should_close=*/true);
#else
WithColor::error() << "lldb-platform child: Unix domain sockets are not "
"supported on this platform.";
return socket_error;
#endif
} else {
socket = DomainSocket::Create(sockfd, /*should_close=*/true, error);
if (error.Fail()) {
LLDB_LOGF(log, "Failed to create socket: %s\n", error.AsCString());
return socket_error;
}
}

Socket::SocketProtocol protocol = socket->GetSocketProtocol();
GDBRemoteCommunicationServerPlatform platform(protocol, gdbserver_port);
platform.SetConnection(
std::unique_ptr<Connection>(new ConnectionFileDescriptor(socket)));
client_handle(platform, inferior_arguments);
Expand All @@ -498,6 +492,7 @@ int main_platform(int argc, char *argv[]) {
return 1;
}

Socket::SocketProtocol protocol;
std::string address;
std::string gdb_address;
uint16_t platform_port = 0;
Expand Down
Loading