15#include "llvm/Support/Errno.h"
16#include "llvm/Support/Error.h"
17#include "llvm/Support/FileSystem.h"
22#include <sys/socket.h>
29static const int kType = SOCK_STREAM;
31static bool SetSockAddr(llvm::StringRef name,
const size_t name_offset,
32 sockaddr_un *saddr_un, socklen_t &saddr_un_len) {
33 if (name.size() + name_offset >
sizeof(saddr_un->sun_path))
36 memset(saddr_un, 0,
sizeof(*saddr_un));
39 memcpy(saddr_un->sun_path + name_offset, name.data(), name.size());
45 saddr_un_len = SUN_LEN(saddr_un);
48 offsetof(
struct sockaddr_un, sun_path) + name_offset + name.size();
50#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || \
52 saddr_un->sun_len = saddr_un_len;
67 :
Socket(protocol, true) {}
77 :
Socket(protocol, should_close) {
83 int type = SOCK_STREAM;
87 if (socketpair(AF_UNIX, type, 0, sockets) == -1)
88 return llvm::errorCodeToError(llvm::errnoAsErrorCode());
91 for (
int s : sockets) {
92 int r = fcntl(s, F_SETFD, FD_CLOEXEC | fcntl(s, F_GETFD));
98#if defined(SO_NOSIGPIPE)
101 LLDB_LOG(log,
"failed to set NO_SIGPIPE on fd {0}: {1}", sockets[0],
102 llvm::sys::StrError());
104 LLDB_LOG(log,
"failed to set NO_SIGPIPE on fd {0}: {1}", sockets[1],
105 llvm::sys::StrError());
108 return Pair(std::unique_ptr<DomainSocket>(
111 std::unique_ptr<DomainSocket>(
117 sockaddr_un saddr_un;
118 socklen_t saddr_un_len;
127 (
struct sockaddr *)&saddr_un,
135 sockaddr_un saddr_un;
136 socklen_t saddr_un_len;
146 if (::bind(
GetNativeSocket(), (
struct sockaddr *)&saddr_un, saddr_un_len) ==
157 std::function<
void(std::unique_ptr<Socket> socket)> sock_cb) {
168 std::unique_ptr<DomainSocket> sock_up(
new DomainSocket(conn_fd, *
this));
169 sock_cb(std::move(sock_up));
173 std::vector<MainLoopBase::ReadHandleUP> handles;
176 return error.ToError();
183 llvm::sys::fs::remove(name);
190 struct sockaddr_un saddr_un;
191 saddr_un.sun_family = AF_UNIX;
192 socklen_t sock_addr_len =
sizeof(
struct sockaddr_un);
193 if (::getpeername(
m_socket, (
struct sockaddr *)&saddr_un, &sock_addr_len) !=
197 if (sock_addr_len <= offsetof(
struct sockaddr_un, sun_path))
201 sock_addr_len - offsetof(
struct sockaddr_un, sun_path) -
203 name = name.rtrim(
'\0');
213 return llvm::formatv(
215 GetNameOffset() == 0 ?
"unix-connect" :
"unix-abstract-connect", name);
222 struct sockaddr_un addr;
223 memset(&addr, 0,
sizeof(
struct sockaddr_un));
224 addr.sun_family = AF_UNIX;
225 socklen_t addr_len =
sizeof(
struct sockaddr_un);
226 if (::getsockname(
m_socket, (
struct sockaddr *)&addr, &addr_len) != 0)
229 return {llvm::formatv(
"unix-connect://{0}", addr.sun_path)};
232llvm::Expected<std::unique_ptr<DomainSocket>>
235 struct sockaddr_un addr;
236 socklen_t addr_len =
sizeof(addr);
237 if (getsockname(sockfd, (
struct sockaddr *)&addr, &addr_len) == -1)
238 return llvm::createStringError(
"not a socket or error occurred");
239 if (addr.sun_family != AF_UNIX)
240 return llvm::createStringError(
"bad socket type");
242 if (addr_len > offsetof(
struct sockaddr_un, sun_path) &&
243 addr.sun_path[0] ==
'\0')
244 return std::make_unique<AbstractSocket>(sockfd, should_close);
246 return std::make_unique<DomainSocket>(sockfd, should_close);
static llvm::raw_ostream & error(Stream &strm)
static bool SetSockAddr(llvm::StringRef name, const size_t name_offset, sockaddr_un *saddr_un, socklen_t &saddr_un_len)
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
DomainSocket(NativeSocket socket, bool should_close)
Status Listen(llvm::StringRef name, int backlog) override
llvm::Expected< std::vector< MainLoopBase::ReadHandleUP > > Accept(MainLoopBase &loop, std::function< void(std::unique_ptr< Socket > socket)> sock_cb) override
std::pair< std::unique_ptr< DomainSocket >, std::unique_ptr< DomainSocket > > Pair
virtual size_t GetNameOffset() const
virtual void DeleteSocketFile(llvm::StringRef name)
Status Connect(llvm::StringRef name) override
static llvm::Expected< std::unique_ptr< DomainSocket > > FromBoundNativeSocket(NativeSocket sockfd, bool should_close)
std::string GetSocketName() const
std::string GetRemoteConnectionURI() const override
static llvm::Expected< Pair > CreatePair()
std::vector< std::string > GetListeningConnectionURI() const override
virtual ReadHandleUP RegisterReadObject(const lldb::IOObjectSP &object_sp, const Callback &callback, Status &error)=0
NativeSocket GetNativeSocket() const
static const NativeSocket kInvalidSocketValue
static NativeSocket CreateSocket(const int domain, const int type, const int protocol, Status &error)
static NativeSocket AcceptSocket(NativeSocket sockfd, struct sockaddr *addr, socklen_t *addrlen, Status &error)
static void SetLastError(Status &error)
static int SetOption(NativeSocket sockfd, int level, int option_name, int option_value)
Socket(SocketProtocol protocol, bool should_close)
static Status FromErrorString(const char *str)
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.