Index: runtime/bin/socket_macos.cc |
diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc |
index 205793bc11689161d110091970eb11f8c7faff9f..83517908a1a5e837e9fe31c024fd6ddea6b75186 100644 |
--- a/runtime/bin/socket_macos.cc |
+++ b/runtime/bin/socket_macos.cc |
@@ -109,6 +109,22 @@ intptr_t Socket::CreateBindConnect(const RawAddr& addr, |
} |
+intptr_t Socket::CreateConnectUnix(const RawAddr& addr) { |
+ intptr_t fd = Create(addr); |
+ if (fd < 0) { |
+ return fd; |
+ } |
+ |
+ intptr_t result = TEMP_FAILURE_RETRY( |
+ connect(fd, &addr.addr, sizeof(struct sockaddr_un))); |
+ if (result == 0 || errno == EINPROGRESS) { |
+ return fd; |
+ } |
+ VOID_TEMP_FAILURE_RETRY(close(fd)); |
+ return -1; |
+} |
+ |
+ |
intptr_t Socket::Available(intptr_t fd) { |
return FDUtils::AvailableBytes(fd); |
} |
@@ -416,6 +432,32 @@ intptr_t ServerSocket::CreateBindListen(const RawAddr& addr, |
} |
+intptr_t ServerSocket::CreateBindListenUnix(const RawAddr& addr, |
+ intptr_t backlog) { |
+ intptr_t fd; |
+ |
+ fd = NO_RETRY_EXPECTED( |
+ socket(addr.ss.ss_family, SOCK_STREAM, 0)); |
+ if (fd < 0) return -1; |
+ |
+ FDUtils::SetCloseOnExec(fd); |
+ |
+ if (NO_RETRY_EXPECTED( |
+ bind(fd, &addr.addr, sizeof(struct sockaddr_un))) < 0) { |
+ VOID_TEMP_FAILURE_RETRY(close(fd)); |
+ return -1; |
+ } |
+ |
+ if (NO_RETRY_EXPECTED(listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) { |
+ VOID_TEMP_FAILURE_RETRY(close(fd)); |
+ return -1; |
+ } |
+ |
+ FDUtils::SetNonBlocking(fd); |
+ return fd; |
+} |
+ |
+ |
bool ServerSocket::StartAccept(intptr_t fd) { |
USE(fd); |
return true; |