diff options
Diffstat (limited to 'src/core/iomgr/tcp_server_posix.c')
-rw-r--r-- | src/core/iomgr/tcp_server_posix.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/core/iomgr/tcp_server_posix.c b/src/core/iomgr/tcp_server_posix.c index e362dd1e6c..d8b180f7f0 100644 --- a/src/core/iomgr/tcp_server_posix.c +++ b/src/core/iomgr/tcp_server_posix.c @@ -48,12 +48,14 @@ #include <netinet/tcp.h> #include <stdio.h> #include <sys/types.h> +#include <sys/un.h> #include <sys/socket.h> #include <unistd.h> #include <string.h> #include <errno.h> #include "src/core/iomgr/pollset_posix.h" +#include "src/core/iomgr/resolve_address.h" #include "src/core/iomgr/sockaddr_utils.h" #include "src/core/iomgr/socket_utils_posix.h" #include "src/core/iomgr/tcp_posix.h" @@ -73,6 +75,8 @@ typedef struct { int fd; grpc_fd *emfd; grpc_tcp_server *server; + gpr_uint8 addr[GRPC_MAX_SOCKADDR_SIZE]; + int addr_len; } server_port; /* the overall server */ @@ -121,6 +125,10 @@ void grpc_tcp_server_destroy(grpc_tcp_server *s) { /* delete ALL the things */ for (i = 0; i < s->nports; i++) { server_port *sp = &s->ports[i]; + if (((struct sockaddr *)sp->addr)->sa_family == AF_UNIX) { + struct sockaddr_un *un = (struct sockaddr_un *)sp->addr; + unlink(un->sun_path); + } grpc_fd_orphan(sp->emfd, NULL, NULL); } gpr_free(s->ports); @@ -170,8 +178,8 @@ static int prepare_socket(int fd, const struct sockaddr *addr, int addr_len) { } if (!grpc_set_socket_nonblocking(fd, 1) || !grpc_set_socket_cloexec(fd, 1) || - !grpc_set_socket_low_latency(fd, 1) || - !grpc_set_socket_reuse_addr(fd, 1)) { + (addr->sa_family != AF_UNIX && (!grpc_set_socket_low_latency(fd, 1) || + !grpc_set_socket_reuse_addr(fd, 1)))) { gpr_log(GPR_ERROR, "Unable to configure socket %d: %s", fd, strerror(errno)); goto error; @@ -265,6 +273,8 @@ static int add_socket_to_server(grpc_tcp_server *s, int fd, sp->server = s; sp->fd = fd; sp->emfd = grpc_fd_create(fd); + memcpy(sp->addr, addr, addr_len); + sp->addr_len = addr_len; GPR_ASSERT(sp->emfd); gpr_mu_unlock(&s->mu); } |