Skip to content

Commit 1f41927

Browse files
committed
Move socket checking to static helper
1 parent b6c46b7 commit 1f41927

File tree

3 files changed

+35
-46
lines changed

3 files changed

+35
-46
lines changed

lldb/include/lldb/Host/posix/DomainSocket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ class DomainSocket : public Socket {
3131

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

34+
static Socket *Create(NativeSocket sockfd, bool should_close, Status &error);
35+
3436
protected:
3537
DomainSocket(SocketProtocol protocol);
3638
DomainSocket(SocketProtocol protocol, NativeSocket socket, bool should_close);

lldb/source/Host/posix/DomainSocket.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,19 @@
88

99
#include "lldb/Host/posix/DomainSocket.h"
1010
#include "lldb/Utility/LLDBLog.h"
11+
#ifdef __linux__
12+
#include <lldb/Host/linux/AbstractSocket.h>
13+
#endif
1114

1215
#include "llvm/Support/Errno.h"
1316
#include "llvm/Support/FileSystem.h"
1417

1518
#include <cstddef>
1619
#include <memory>
20+
#ifdef __linux__
1721
#include <sys/socket.h>
1822
#include <sys/un.h>
23+
#endif
1924

2025
using namespace lldb;
2126
using namespace lldb_private;
@@ -188,3 +193,22 @@ std::vector<std::string> DomainSocket::GetListeningConnectionURI() const {
188193

189194
return {llvm::formatv("unix-connect://{0}", addr.sun_path)};
190195
}
196+
197+
Socket *DomainSocket::Create(NativeSocket sockfd, bool should_close,
198+
Status &error) {
199+
#ifdef __linux__
200+
// Check if fd represents domain socket or abstract socket.
201+
struct sockaddr_un addr;
202+
socklen_t addr_len = sizeof(addr);
203+
if (getsockname(sockfd, (struct sockaddr *)&addr, &addr_len) == -1) {
204+
error = Status::FromErrorString(
205+
"lldb-platform child: not a socket or error occurred");
206+
return nullptr;
207+
}
208+
209+
if (addr.sun_family == AF_UNIX && addr.sun_path[0] == '\0') {
210+
return new AbstractSocket(sockfd, should_close);
211+
}
212+
#endif
213+
return new DomainSocket(sockfd, should_close);
214+
}

lldb/tools/lldb-server/lldb-platform.cpp

Lines changed: 9 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,11 @@
3939
#if LLDB_ENABLE_POSIX
4040
#include "lldb/Host/posix/DomainSocket.h"
4141
#endif
42-
#ifdef __linux__
43-
#include "lldb/Host/linux/AbstractSocket.h"
44-
#endif
4542
#include "lldb/Utility/FileSpec.h"
4643
#include "lldb/Utility/LLDBLog.h"
4744
#include "lldb/Utility/Status.h"
4845
#include "lldb/Utility/UriParser.h"
4946

50-
#if LLDB_ENABLE_POSIX
51-
#include <sys/socket.h>
52-
#include <sys/un.h>
53-
#endif
54-
5547
using namespace lldb;
5648
using namespace lldb_private;
5749
using namespace lldb_private::lldb_server;
@@ -464,58 +456,28 @@ int main_platform(int argc, char *argv[]) {
464456
inferior_arguments.SetArguments(argc, const_cast<const char **>(argv));
465457

466458
Log *log = GetLog(LLDBLog::Platform);
467-
Socket::SocketProtocol protocol = Socket::ProtocolUnixDomain;
468-
469459
if (fd != SharedSocket::kInvalidFD) {
470460
// Child process will handle the connection and exit.
471-
if (gdbserver_port) {
472-
protocol = Socket::ProtocolTcp;
473-
} else {
474-
#ifdef LLDB_ENABLE_POSIX
475-
// Check if fd represents domain socket or abstract socket.
476-
struct sockaddr_un addr;
477-
socklen_t addr_len = sizeof(addr);
478-
if (getsockname(fd, (struct sockaddr *)&addr, &addr_len) == -1) {
479-
LLDB_LOGF(log, "lldb-platform child: not a socket or error occurred");
480-
return socket_error;
481-
}
482-
483-
if (addr.sun_family == AF_UNIX && addr.sun_path[0] == '\0') {
484-
protocol = Socket::ProtocolUnixAbstract;
485-
}
486-
#endif
487-
}
488-
489461
NativeSocket sockfd;
490462
error = SharedSocket::GetNativeSocket(fd, sockfd);
491463
if (error.Fail()) {
492464
LLDB_LOGF(log, "lldb-platform child: %s", error.AsCString());
493465
return socket_error;
494466
}
495467

496-
GDBRemoteCommunicationServerPlatform platform(protocol, gdbserver_port);
497468
Socket *socket;
498-
if (protocol == Socket::ProtocolTcp) {
469+
if (gdbserver_port) {
499470
socket = new TCPSocket(sockfd, /*should_close=*/true);
500-
} else if (protocol == Socket::ProtocolUnixDomain) {
501-
#if LLDB_ENABLE_POSIX
502-
socket = new DomainSocket(sockfd, /*should_close=*/true);
503-
#else
504-
WithColor::error() << "lldb-platform child: Unix domain sockets are not "
505-
"supported on this platform.";
506-
return socket_error;
507-
#endif
508471
} else {
509-
#ifdef __linux__
510-
socket = new AbstractSocket(sockfd, /*should_close=*/true);
511-
#else
512-
WithColor::error()
513-
<< "lldb-platform child: Abstract domain sockets are not "
514-
"supported on this platform.";
515-
return socket_error;
516-
#endif
472+
socket = DomainSocket::Create(sockfd, /*should_close=*/true, error);
473+
if (error.Fail()) {
474+
LLDB_LOGF(log, "Failed to create socket: %s\n", error.AsCString());
475+
return socket_error;
476+
}
517477
}
518478

479+
Socket::SocketProtocol protocol = socket->GetSocketProtocol();
480+
GDBRemoteCommunicationServerPlatform platform(protocol, gdbserver_port);
519481
platform.SetConnection(
520482
std::unique_ptr<Connection>(new ConnectionFileDescriptor(socket)));
521483
client_handle(platform, inferior_arguments);
@@ -530,6 +492,7 @@ int main_platform(int argc, char *argv[]) {
530492
return 1;
531493
}
532494

495+
Socket::SocketProtocol protocol;
533496
std::string address;
534497
std::string gdb_address;
535498
uint16_t platform_port = 0;

0 commit comments

Comments
 (0)