|
|
|
@ -49,6 +49,7 @@ |
|
|
|
|
#include <sys/types.h> |
|
|
|
|
#include <unistd.h> |
|
|
|
|
|
|
|
|
|
#include <grpc/support/alloc.h> |
|
|
|
|
#include <grpc/support/host_port.h> |
|
|
|
|
#include <grpc/support/log.h> |
|
|
|
|
#include <grpc/support/port_platform.h> |
|
|
|
@ -216,6 +217,16 @@ static int set_socket_dualstack(int fd) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static grpc_error *error_for_fd(int fd, const struct sockaddr *addr) { |
|
|
|
|
if (fd >= 0) return GRPC_ERROR_NONE; |
|
|
|
|
char *addr_str; |
|
|
|
|
grpc_sockaddr_to_string(&addr_str, addr, 0); |
|
|
|
|
grpc_error *err = grpc_error_set_str(GRPC_OS_ERROR(errno, "socket"), |
|
|
|
|
GRPC_ERROR_STR_TARGET_ADDRESS, addr_str); |
|
|
|
|
gpr_free(err); |
|
|
|
|
return err; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
grpc_error *grpc_create_dualstack_socket(const struct sockaddr *addr, int type, |
|
|
|
|
int protocol, |
|
|
|
|
grpc_dualstack_mode *dsmode, |
|
|
|
@ -236,7 +247,7 @@ grpc_error *grpc_create_dualstack_socket(const struct sockaddr *addr, int type, |
|
|
|
|
/* If this isn't an IPv4 address, then return whatever we've got. */ |
|
|
|
|
if (!grpc_sockaddr_is_v4mapped(addr, NULL)) { |
|
|
|
|
*dsmode = GRPC_DSMODE_IPV6; |
|
|
|
|
return *newfd >= 0 ? GRPC_ERROR_NONE : GRPC_OS_ERROR(errno, "socket"); |
|
|
|
|
return error_for_fd(*newfd, addr); |
|
|
|
|
} |
|
|
|
|
/* Fall back to AF_INET. */ |
|
|
|
|
if (*newfd >= 0) { |
|
|
|
@ -246,10 +257,7 @@ grpc_error *grpc_create_dualstack_socket(const struct sockaddr *addr, int type, |
|
|
|
|
} |
|
|
|
|
*dsmode = family == AF_INET ? GRPC_DSMODE_IPV4 : GRPC_DSMODE_NONE; |
|
|
|
|
*newfd = socket(family, type, protocol); |
|
|
|
|
if (*newfd == -1) { |
|
|
|
|
return GRPC_OS_ERROR(errno, "socket"); |
|
|
|
|
} |
|
|
|
|
return GRPC_ERROR_NONE; |
|
|
|
|
return error_for_fd(*newfd, addr); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
|