| Index: runtime/bin/socket_macos.cc
|
| diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc
|
| index da659ff7fe8ac3a607edab9286930cff3caad85c..239bb4536661b8c2b57dc695c9b86f0c21113009 100644
|
| --- a/runtime/bin/socket_macos.cc
|
| +++ b/runtime/bin/socket_macos.cc
|
| @@ -57,7 +57,7 @@ bool Socket::Initialize() {
|
| }
|
|
|
|
|
| -intptr_t Socket::Create(RawAddr addr) {
|
| +static intptr_t Create(RawAddr addr) {
|
| intptr_t fd;
|
| fd = NO_RETRY_EXPECTED(socket(addr.ss.ss_family, SOCK_STREAM, 0));
|
| if (fd < 0) {
|
| @@ -68,7 +68,7 @@ intptr_t Socket::Create(RawAddr addr) {
|
| }
|
|
|
|
|
| -intptr_t Socket::Connect(intptr_t fd, RawAddr addr, const intptr_t port) {
|
| +static intptr_t Connect(intptr_t fd, RawAddr addr, const intptr_t port) {
|
| SocketAddress::SetAddrPort(&addr, port);
|
| intptr_t result = TEMP_FAILURE_RETRY(
|
| connect(fd, &addr.addr, SocketAddress::GetAddrLength(&addr)));
|
| @@ -80,15 +80,34 @@ intptr_t Socket::Connect(intptr_t fd, RawAddr addr, const intptr_t port) {
|
| }
|
|
|
|
|
| -intptr_t Socket::CreateConnect(RawAddr addr, const intptr_t port) {
|
| - intptr_t fd = Socket::Create(addr);
|
| +intptr_t Socket::CreateConnect(const RawAddr& addr, const intptr_t port) {
|
| + intptr_t fd = Create(addr);
|
| if (fd < 0) {
|
| return fd;
|
| }
|
|
|
| FDUtils::SetNonBlocking(fd);
|
|
|
| - return Socket::Connect(fd, addr, port);
|
| + return Connect(fd, addr, port);
|
| +}
|
| +
|
| +
|
| +intptr_t Socket::CreateBindConnect(const RawAddr& addr,
|
| + const intptr_t port,
|
| + const RawAddr& source_addr) {
|
| + intptr_t fd = Create(addr);
|
| + if (fd < 0) {
|
| + return fd;
|
| + }
|
| +
|
| + intptr_t result = TEMP_FAILURE_RETRY(
|
| + bind(fd, &source_addr.addr, SocketAddress::GetAddrLength(&source_addr)));
|
| + if (result != 0 && errno != EINPROGRESS) {
|
| + VOID_TEMP_FAILURE_RETRY(close(fd));
|
| + return -1;
|
| + }
|
| +
|
| + return Connect(fd, addr, port);
|
| }
|
|
|
|
|
|
|