Index: runtime/bin/socket_linux.cc |
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc |
index 976bd0fb483aef539b8a06733c64cfb328c26d38..aed842f71f888363909a0593784ca4625f1b6cf0 100644 |
--- a/runtime/bin/socket_linux.cc |
+++ b/runtime/bin/socket_linux.cc |
@@ -101,6 +101,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); |
} |
@@ -410,6 +426,29 @@ 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 | SOCK_CLOEXEC | SOCK_NONBLOCK, 0)); |
+ if (fd < 0) return -1; |
+ |
+ 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; |
+ } |
+ |
+ return fd; |
+} |
+ |
+ |
bool ServerSocket::StartAccept(intptr_t fd) { |
USE(fd); |
return true; |