11 #include "llvm/Support/Errno.h"
12 #include "llvm/Support/FileSystem.h"
15 #include <sys/socket.h>
24 #define SUN_LEN(ptr) \
25 (offsetof(struct sockaddr_un, sun_path) + strlen((ptr)->sun_path))
27 #endif // #ifdef __ANDROID__
30 static const int kType = SOCK_STREAM;
32 static bool SetSockAddr(llvm::StringRef name,
const size_t name_offset,
33 sockaddr_un *saddr_un, socklen_t &saddr_un_len) {
34 if (name.size() + name_offset >
sizeof(saddr_un->sun_path))
37 memset(saddr_un, 0,
sizeof(*saddr_un));
40 memcpy(saddr_un->sun_path + name_offset, name.data(), name.size());
46 saddr_un_len = SUN_LEN(saddr_un);
49 offsetof(
struct sockaddr_un, sun_path) + name_offset + name.size();
51 #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__)
52 saddr_un->sun_len = saddr_un_len;
58 DomainSocket::DomainSocket(
bool should_close,
bool child_processes_inherit)
59 :
Socket(ProtocolUnixDomain, should_close, child_processes_inherit) {}
62 bool child_processes_inherit)
63 :
Socket(protocol, true, child_processes_inherit) {}
67 :
Socket(ProtocolUnixDomain, listen_socket.m_should_close_fd,
68 listen_socket.m_child_processes_inherit) {
74 socklen_t saddr_un_len;
76 return Status(
"Failed to set socket address");
83 (
struct sockaddr *)&saddr_un, saddr_un_len) < 0)
91 socklen_t saddr_un_len;
93 return Status(
"Failed to set socket address");
101 if (::bind(
GetNativeSocket(), (
struct sockaddr *)&saddr_un, saddr_un_len) ==
123 llvm::sys::fs::remove(name);
130 struct sockaddr_un saddr_un;
131 saddr_un.sun_family = AF_UNIX;
132 socklen_t sock_addr_len =
sizeof(
struct sockaddr_un);
133 if (::getpeername(
m_socket, (
struct sockaddr *)&saddr_un, &sock_addr_len) !=
137 if (sock_addr_len <= offsetof(
struct sockaddr_un, sun_path))
141 sock_addr_len - offsetof(
struct sockaddr_un, sun_path) -
143 name = name.rtrim(
'\0');
153 return llvm::formatv(
155 GetNameOffset() == 0 ?
"unix-connect" :
"unix-abstract-connect", name);