diff options
author | 2018-05-11 12:20:11 -0700 | |
---|---|---|
committer | 2018-05-11 12:20:11 -0700 | |
commit | 4fad281ce8affe27fb7428f264d2c3b9dfc45f2f (patch) | |
tree | ca96c9efd69afec56aa2e5fe072a9f758247d0a3 /src/core/lib/iomgr/tcp_server_utils_posix_common.cc | |
parent | ec445cc2bb270ed4acb1c710c3533fca14a50019 (diff) | |
parent | 61fdb46ac456027c79841949272ec540f66d2317 (diff) |
Merge remote-tracking branch 'upstream/master' into fork_exec_ctx_check
Diffstat (limited to 'src/core/lib/iomgr/tcp_server_utils_posix_common.cc')
-rw-r--r-- | src/core/lib/iomgr/tcp_server_utils_posix_common.cc | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/src/core/lib/iomgr/tcp_server_utils_posix_common.cc b/src/core/lib/iomgr/tcp_server_utils_posix_common.cc index 846f9cccb7..2d95aa66d6 100644 --- a/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +++ b/src/core/lib/iomgr/tcp_server_utils_posix_common.cc @@ -87,7 +87,7 @@ static grpc_error* add_socket_to_server(grpc_tcp_server* s, int fd, char* name; grpc_error* err = - grpc_tcp_server_prepare_socket(fd, addr, s->so_reuseport, &port); + grpc_tcp_server_prepare_socket(s, fd, addr, s->so_reuseport, &port); if (err == GRPC_ERROR_NONE) { GPR_ASSERT(port > 0); grpc_sockaddr_to_string(&addr_str, addr, 1); @@ -144,7 +144,7 @@ grpc_error* grpc_tcp_server_add_addr(grpc_tcp_server* s, } /* Prepare a recently-created socket for listening. */ -grpc_error* grpc_tcp_server_prepare_socket(int fd, +grpc_error* grpc_tcp_server_prepare_socket(grpc_tcp_server* s, int fd, const grpc_resolved_address* addr, bool so_reuseport, int* port) { grpc_resolved_address sockname_temp; @@ -170,10 +170,20 @@ grpc_error* grpc_tcp_server_prepare_socket(int fd, err = grpc_set_socket_no_sigpipe_if_possible(fd); if (err != GRPC_ERROR_NONE) goto error; - GPR_ASSERT(addr->len < ~(socklen_t)0); - if (bind(fd, - reinterpret_cast<struct sockaddr*>(const_cast<char*>(addr->addr)), - static_cast<socklen_t>(addr->len)) < 0) { + if (s->channel_args) { + for (size_t i = 0; i < s->channel_args->num_args; i++) { + if (0 == strcmp(s->channel_args->args[i].key, GRPC_ARG_SOCKET_MUTATOR)) { + GPR_ASSERT(s->channel_args->args[i].type == GRPC_ARG_POINTER); + grpc_socket_mutator* mutator = static_cast<grpc_socket_mutator*>( + s->channel_args->args[i].value.pointer.p); + err = grpc_set_socket_with_mutator(fd, mutator); + if (err != GRPC_ERROR_NONE) goto error; + } + } + } + + if (bind(fd, reinterpret_cast<grpc_sockaddr*>(const_cast<char*>(addr->addr)), + addr->len) < 0) { err = GRPC_OS_ERROR(errno, "bind"); goto error; } @@ -183,10 +193,10 @@ grpc_error* grpc_tcp_server_prepare_socket(int fd, goto error; } - sockname_temp.len = sizeof(struct sockaddr_storage); + sockname_temp.len = static_cast<socklen_t>(sizeof(struct sockaddr_storage)); - if (getsockname(fd, reinterpret_cast<struct sockaddr*>(sockname_temp.addr), - reinterpret_cast<socklen_t*>(&sockname_temp.len)) < 0) { + if (getsockname(fd, reinterpret_cast<grpc_sockaddr*>(sockname_temp.addr), + &sockname_temp.len) < 0) { err = GRPC_OS_ERROR(errno, "getsockname"); goto error; } |