diff options
-rw-r--r-- | Makefile | 15 | ||||
-rw-r--r-- | build.json | 3 | ||||
-rw-r--r-- | src/core/iomgr/resolve_address_posix.c (renamed from src/core/iomgr/resolve_address.c) | 7 | ||||
-rw-r--r-- | src/core/iomgr/resolve_address_windows.c | 222 | ||||
-rw-r--r-- | src/core/iomgr/tcp_client_windows.c | 5 | ||||
-rw-r--r-- | src/core/iomgr/tcp_server_windows.c | 5 | ||||
-rw-r--r-- | src/core/support/cpu_windows.c | 2 | ||||
-rw-r--r-- | src/core/surface/init.c | 2 | ||||
-rw-r--r-- | vsprojects/vs2013/grpc.vcxproj | 4 | ||||
-rw-r--r-- | vsprojects/vs2013/grpc.vcxproj.filters | 5 | ||||
-rw-r--r-- | vsprojects/vs2013/grpc_shared.vcxproj | 4 | ||||
-rw-r--r-- | vsprojects/vs2013/grpc_shared.vcxproj.filters | 5 | ||||
-rw-r--r-- | vsprojects/vs2013/grpc_unsecure.vcxproj | 4 | ||||
-rw-r--r-- | vsprojects/vs2013/grpc_unsecure.vcxproj.filters | 5 |
14 files changed, 266 insertions, 22 deletions
@@ -2323,7 +2323,8 @@ LIBGRPC_SRC = \ src/core/iomgr/pollset_multipoller_with_poll_posix.c \ src/core/iomgr/pollset_posix.c \ src/core/iomgr/pollset_windows.c \ - src/core/iomgr/resolve_address.c \ + src/core/iomgr/resolve_address_posix.c \ + src/core/iomgr/resolve_address_windows.c \ src/core/iomgr/sockaddr_utils.c \ src/core/iomgr/socket_utils_common_posix.c \ src/core/iomgr/socket_utils_linux.c \ @@ -2463,7 +2464,8 @@ src/core/iomgr/pollset_multipoller_with_epoll.c: $(OPENSSL_DEP) src/core/iomgr/pollset_multipoller_with_poll_posix.c: $(OPENSSL_DEP) src/core/iomgr/pollset_posix.c: $(OPENSSL_DEP) src/core/iomgr/pollset_windows.c: $(OPENSSL_DEP) -src/core/iomgr/resolve_address.c: $(OPENSSL_DEP) +src/core/iomgr/resolve_address_posix.c: $(OPENSSL_DEP) +src/core/iomgr/resolve_address_windows.c: $(OPENSSL_DEP) src/core/iomgr/sockaddr_utils.c: $(OPENSSL_DEP) src/core/iomgr/socket_utils_common_posix.c: $(OPENSSL_DEP) src/core/iomgr/socket_utils_linux.c: $(OPENSSL_DEP) @@ -2620,7 +2622,8 @@ $(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_multipoller_with_epoll.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_multipoller_with_poll_posix.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_posix.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_windows.o: -$(OBJDIR)/$(CONFIG)/src/core/iomgr/resolve_address.o: +$(OBJDIR)/$(CONFIG)/src/core/iomgr/resolve_address_posix.o: +$(OBJDIR)/$(CONFIG)/src/core/iomgr/resolve_address_windows.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/sockaddr_utils.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/socket_utils_common_posix.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/socket_utils_linux.o: @@ -2792,7 +2795,8 @@ LIBGRPC_UNSECURE_SRC = \ src/core/iomgr/pollset_multipoller_with_poll_posix.c \ src/core/iomgr/pollset_posix.c \ src/core/iomgr/pollset_windows.c \ - src/core/iomgr/resolve_address.c \ + src/core/iomgr/resolve_address_posix.c \ + src/core/iomgr/resolve_address_windows.c \ src/core/iomgr/sockaddr_utils.c \ src/core/iomgr/socket_utils_common_posix.c \ src/core/iomgr/socket_utils_linux.c \ @@ -2927,7 +2931,8 @@ $(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_multipoller_with_epoll.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_multipoller_with_poll_posix.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_posix.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_windows.o: -$(OBJDIR)/$(CONFIG)/src/core/iomgr/resolve_address.o: +$(OBJDIR)/$(CONFIG)/src/core/iomgr/resolve_address_posix.o: +$(OBJDIR)/$(CONFIG)/src/core/iomgr/resolve_address_windows.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/sockaddr_utils.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/socket_utils_common_posix.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/socket_utils_linux.o: diff --git a/build.json b/build.json index 002cabe2bc..59eadce4ea 100644 --- a/build.json +++ b/build.json @@ -136,7 +136,8 @@ "src/core/iomgr/pollset_multipoller_with_poll_posix.c", "src/core/iomgr/pollset_posix.c", "src/core/iomgr/pollset_windows.c", - "src/core/iomgr/resolve_address.c", + "src/core/iomgr/resolve_address_posix.c", + "src/core/iomgr/resolve_address_windows.c", "src/core/iomgr/sockaddr_utils.c", "src/core/iomgr/socket_utils_common_posix.c", "src/core/iomgr/socket_utils_linux.c", diff --git a/src/core/iomgr/resolve_address.c b/src/core/iomgr/resolve_address_posix.c index ce9b157e31..f172ba9e21 100644 --- a/src/core/iomgr/resolve_address.c +++ b/src/core/iomgr/resolve_address_posix.c @@ -31,9 +31,8 @@ * */ -#ifndef _POSIX_SOURCE -#define _POSIX_SOURCE -#endif +#include <grpc/support/port_platform.h> +#ifdef GPR_POSIX_SOCKET #include "src/core/iomgr/sockaddr.h" #include "src/core/iomgr/resolve_address.h" @@ -233,3 +232,5 @@ void grpc_resolve_address(const char *name, const char *default_port, r->arg = arg; gpr_thd_new(&id, do_request, r, NULL); } + +#endif diff --git a/src/core/iomgr/resolve_address_windows.c b/src/core/iomgr/resolve_address_windows.c new file mode 100644 index 0000000000..c1c3a3beed --- /dev/null +++ b/src/core/iomgr/resolve_address_windows.c @@ -0,0 +1,222 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include <grpc/support/port_platform.h> +#ifdef GPR_WINSOCK_SOCKET + +#include "src/core/iomgr/sockaddr.h" +#include "src/core/iomgr/resolve_address.h" + +#include <sys/types.h> +#include <string.h> + +#include "src/core/iomgr/iomgr_internal.h" +#include "src/core/iomgr/sockaddr_utils.h" +#include "src/core/support/string.h" +#include <grpc/support/alloc.h> +#include <grpc/support/log.h> +#include <grpc/support/thd.h> +#include <grpc/support/time.h> + +typedef struct { + char *name; + char *default_port; + grpc_resolve_cb cb; + void *arg; +} request; + +static void split_host_port(const char *name, char **host, char **port) { + const char *host_start; + size_t host_len; + const char *port_start; + + *host = NULL; + *port = NULL; + + if (name[0] == '[') { + /* Parse a bracketed host, typically an IPv6 literal. */ + const char *rbracket = strchr(name, ']'); + if (rbracket == NULL) { + /* Unmatched [ */ + return; + } + if (rbracket[1] == '\0') { + /* ]<end> */ + port_start = NULL; + } else if (rbracket[1] == ':') { + /* ]:<port?> */ + port_start = rbracket + 2; + } else { + /* ]<invalid> */ + return; + } + host_start = name + 1; + host_len = rbracket - host_start; + if (memchr(host_start, ':', host_len) == NULL) { + /* Require all bracketed hosts to contain a colon, because a hostname or + IPv4 address should never use brackets. */ + return; + } + } else { + const char *colon = strchr(name, ':'); + if (colon != NULL && strchr(colon + 1, ':') == NULL) { + /* Exactly 1 colon. Split into host:port. */ + host_start = name; + host_len = colon - name; + port_start = colon + 1; + } else { + /* 0 or 2+ colons. Bare hostname or IPv6 litearal. */ + host_start = name; + host_len = strlen(name); + port_start = NULL; + } + } + + /* Allocate return values. */ + *host = gpr_malloc(host_len + 1); + memcpy(*host, host_start, host_len); + (*host)[host_len] = '\0'; + + if (port_start != NULL) { + *port = gpr_strdup(port_start); + } +} + +grpc_resolved_addresses *grpc_blocking_resolve_address( + const char *name, const char *default_port) { + struct addrinfo hints; + struct addrinfo *result = NULL, *resp; + char *host; + char *port; + int s; + size_t i; + grpc_resolved_addresses *addrs = NULL; + const gpr_timespec start_time = gpr_now(); + + /* parse name, splitting it into host and port parts */ + split_host_port(name, &host, &port); + if (host == NULL) { + gpr_log(GPR_ERROR, "unparseable host:port: '%s'", name); + goto done; + } + if (port == NULL) { + if (default_port == NULL) { + gpr_log(GPR_ERROR, "no port in name '%s'", name); + goto done; + } + port = gpr_strdup(default_port); + } + + /* Call getaddrinfo */ + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; /* ipv4 or ipv6 */ + hints.ai_socktype = SOCK_STREAM; /* stream socket */ + hints.ai_flags = AI_PASSIVE; /* for wildcard IP address */ + + s = getaddrinfo(host, port, &hints, &result); + if (s != 0) { + gpr_log(GPR_ERROR, "getaddrinfo: %s", gai_strerror(s)); + goto done; + } + + /* Success path: set addrs non-NULL, fill it in */ + addrs = gpr_malloc(sizeof(grpc_resolved_addresses)); + addrs->naddrs = 0; + for (resp = result; resp != NULL; resp = resp->ai_next) { + addrs->naddrs++; + } + addrs->addrs = gpr_malloc(sizeof(grpc_resolved_address) * addrs->naddrs); + i = 0; + for (resp = result; resp != NULL; resp = resp->ai_next) { + memcpy(&addrs->addrs[i].addr, resp->ai_addr, resp->ai_addrlen); + addrs->addrs[i].len = resp->ai_addrlen; + i++; + } + + /* Temporary logging, to help identify flakiness in dualstack_socket_test. */ + { + const gpr_timespec delay = gpr_time_sub(gpr_now(), start_time); + const int delay_ms = + delay.tv_sec * GPR_MS_PER_SEC + delay.tv_nsec / GPR_NS_PER_MS; + gpr_log(GPR_INFO, "logspam: getaddrinfo(%s, %s) resolved %d addrs in %dms:", + host, port, addrs->naddrs, delay_ms); + for (i = 0; i < addrs->naddrs; i++) { + char *buf; + grpc_sockaddr_to_string(&buf, (struct sockaddr *)&addrs->addrs[i].addr, + 0); + gpr_log(GPR_INFO, "logspam: [%d] %s", i, buf); + gpr_free(buf); + } + } + +done: + gpr_free(host); + gpr_free(port); + if (result) { + freeaddrinfo(result); + } + return addrs; +} + +/* Thread function to asynch-ify grpc_blocking_resolve_address */ +static void do_request(void *rp) { + request *r = rp; + grpc_resolved_addresses *resolved = + grpc_blocking_resolve_address(r->name, r->default_port); + void *arg = r->arg; + grpc_resolve_cb cb = r->cb; + gpr_free(r->name); + gpr_free(r->default_port); + gpr_free(r); + cb(arg, resolved); + grpc_iomgr_unref(); +} + +void grpc_resolved_addresses_destroy(grpc_resolved_addresses *addrs) { + gpr_free(addrs->addrs); + gpr_free(addrs); +} + +void grpc_resolve_address(const char *name, const char *default_port, + grpc_resolve_cb cb, void *arg) { + request *r = gpr_malloc(sizeof(request)); + gpr_thd_id id; + grpc_iomgr_ref(); + r->name = gpr_strdup(name); + r->default_port = gpr_strdup(default_port); + r->cb = cb; + r->arg = arg; + gpr_thd_new(&id, do_request, r, NULL); +} + +#endif diff --git a/src/core/iomgr/tcp_client_windows.c b/src/core/iomgr/tcp_client_windows.c index 2bd93c6af2..181d89cb6d 100644 --- a/src/core/iomgr/tcp_client_windows.c +++ b/src/core/iomgr/tcp_client_windows.c @@ -43,12 +43,13 @@ #include <grpc/support/slice_buffer.h> #include <grpc/support/useful.h> +#include "src/core/iomgr/alarm.h" +#include "src/core/iomgr/iocp_windows.h" #include "src/core/iomgr/tcp_client.h" #include "src/core/iomgr/tcp_windows.h" -#include "src/core/iomgr/socket_windows.h" -#include "src/core/iomgr/alarm.h" #include "src/core/iomgr/sockaddr.h" #include "src/core/iomgr/sockaddr_utils.h" +#include "src/core/iomgr/socket_windows.h" typedef struct { void(*cb)(void *arg, grpc_endpoint *tcp); diff --git a/src/core/iomgr/tcp_server_windows.c b/src/core/iomgr/tcp_server_windows.c index c6864efdc5..59319da26d 100644 --- a/src/core/iomgr/tcp_server_windows.c +++ b/src/core/iomgr/tcp_server_windows.c @@ -355,8 +355,9 @@ SOCKET grpc_tcp_server_get_socket(grpc_tcp_server *s, unsigned index) { return (index < s->nports) ? s->ports[index].socket->socket : INVALID_SOCKET; } -void grpc_tcp_server_start(grpc_tcp_server *s, grpc_pollset *pollset, - grpc_tcp_server_cb cb, void *cb_arg) { +void grpc_tcp_server_start(grpc_tcp_server *s, grpc_pollset **pollset, + size_t pollset_count, grpc_tcp_server_cb cb, + void *cb_arg) { size_t i; GPR_ASSERT(cb); gpr_mu_lock(&s->mu); diff --git a/src/core/support/cpu_windows.c b/src/core/support/cpu_windows.c index 9a460cc484..cb454ccd3b 100644 --- a/src/core/support/cpu_windows.c +++ b/src/core/support/cpu_windows.c @@ -35,8 +35,6 @@ #ifdef GPR_WIN32 -#include "src/core/support/cpu.h" - #include <grpc/support/log.h> unsigned gpr_cpu_num_cores(void) { diff --git a/src/core/surface/init.c b/src/core/surface/init.c index fa4614abc8..2d8f36e9c2 100644 --- a/src/core/surface/init.c +++ b/src/core/surface/init.c @@ -40,7 +40,7 @@ static gpr_once g_init = GPR_ONCE_INIT; static gpr_mu g_init_mu; static int g_initializations; -static void do_init() { +static void do_init(void) { gpr_mu_init(&g_init_mu); g_initializations = 0; } diff --git a/vsprojects/vs2013/grpc.vcxproj b/vsprojects/vs2013/grpc.vcxproj index b55c7f926b..89c0de333c 100644 --- a/vsprojects/vs2013/grpc.vcxproj +++ b/vsprojects/vs2013/grpc.vcxproj @@ -283,7 +283,9 @@ </ClCompile> <ClCompile Include="..\..\src\core\iomgr\pollset_windows.c"> </ClCompile> - <ClCompile Include="..\..\src\core\iomgr\resolve_address.c"> + <ClCompile Include="..\..\src\core\iomgr\resolve_address_posix.c"> + </ClCompile> + <ClCompile Include="..\..\src\core\iomgr\resolve_address_windows.c"> </ClCompile> <ClCompile Include="..\..\src\core\iomgr\sockaddr_utils.c"> </ClCompile> diff --git a/vsprojects/vs2013/grpc.vcxproj.filters b/vsprojects/vs2013/grpc.vcxproj.filters index 9505c37ef4..a2d9f30eda 100644 --- a/vsprojects/vs2013/grpc.vcxproj.filters +++ b/vsprojects/vs2013/grpc.vcxproj.filters @@ -145,7 +145,10 @@ <ClCompile Include="..\..\src\core\iomgr\pollset_windows.c"> <Filter>src\core\iomgr</Filter> </ClCompile> - <ClCompile Include="..\..\src\core\iomgr\resolve_address.c"> + <ClCompile Include="..\..\src\core\iomgr\resolve_address_posix.c"> + <Filter>src\core\iomgr</Filter> + </ClCompile> + <ClCompile Include="..\..\src\core\iomgr\resolve_address_windows.c"> <Filter>src\core\iomgr</Filter> </ClCompile> <ClCompile Include="..\..\src\core\iomgr\sockaddr_utils.c"> diff --git a/vsprojects/vs2013/grpc_shared.vcxproj b/vsprojects/vs2013/grpc_shared.vcxproj index dfb0899138..81a280d912 100644 --- a/vsprojects/vs2013/grpc_shared.vcxproj +++ b/vsprojects/vs2013/grpc_shared.vcxproj @@ -287,7 +287,9 @@ </ClCompile> <ClCompile Include="..\..\src\core\iomgr\pollset_windows.c"> </ClCompile> - <ClCompile Include="..\..\src\core\iomgr\resolve_address.c"> + <ClCompile Include="..\..\src\core\iomgr\resolve_address_posix.c"> + </ClCompile> + <ClCompile Include="..\..\src\core\iomgr\resolve_address_windows.c"> </ClCompile> <ClCompile Include="..\..\src\core\iomgr\sockaddr_utils.c"> </ClCompile> diff --git a/vsprojects/vs2013/grpc_shared.vcxproj.filters b/vsprojects/vs2013/grpc_shared.vcxproj.filters index 9505c37ef4..a2d9f30eda 100644 --- a/vsprojects/vs2013/grpc_shared.vcxproj.filters +++ b/vsprojects/vs2013/grpc_shared.vcxproj.filters @@ -145,7 +145,10 @@ <ClCompile Include="..\..\src\core\iomgr\pollset_windows.c"> <Filter>src\core\iomgr</Filter> </ClCompile> - <ClCompile Include="..\..\src\core\iomgr\resolve_address.c"> + <ClCompile Include="..\..\src\core\iomgr\resolve_address_posix.c"> + <Filter>src\core\iomgr</Filter> + </ClCompile> + <ClCompile Include="..\..\src\core\iomgr\resolve_address_windows.c"> <Filter>src\core\iomgr</Filter> </ClCompile> <ClCompile Include="..\..\src\core\iomgr\sockaddr_utils.c"> diff --git a/vsprojects/vs2013/grpc_unsecure.vcxproj b/vsprojects/vs2013/grpc_unsecure.vcxproj index 74fc6c96ec..0c81ec4768 100644 --- a/vsprojects/vs2013/grpc_unsecure.vcxproj +++ b/vsprojects/vs2013/grpc_unsecure.vcxproj @@ -232,7 +232,9 @@ </ClCompile> <ClCompile Include="..\..\src\core\iomgr\pollset_windows.c"> </ClCompile> - <ClCompile Include="..\..\src\core\iomgr\resolve_address.c"> + <ClCompile Include="..\..\src\core\iomgr\resolve_address_posix.c"> + </ClCompile> + <ClCompile Include="..\..\src\core\iomgr\resolve_address_windows.c"> </ClCompile> <ClCompile Include="..\..\src\core\iomgr\sockaddr_utils.c"> </ClCompile> diff --git a/vsprojects/vs2013/grpc_unsecure.vcxproj.filters b/vsprojects/vs2013/grpc_unsecure.vcxproj.filters index ea34d210bf..4b5370a573 100644 --- a/vsprojects/vs2013/grpc_unsecure.vcxproj.filters +++ b/vsprojects/vs2013/grpc_unsecure.vcxproj.filters @@ -91,7 +91,10 @@ <ClCompile Include="..\..\src\core\iomgr\pollset_windows.c"> <Filter>src\core\iomgr</Filter> </ClCompile> - <ClCompile Include="..\..\src\core\iomgr\resolve_address.c"> + <ClCompile Include="..\..\src\core\iomgr\resolve_address_posix.c"> + <Filter>src\core\iomgr</Filter> + </ClCompile> + <ClCompile Include="..\..\src\core\iomgr\resolve_address_windows.c"> <Filter>src\core\iomgr</Filter> </ClCompile> <ClCompile Include="..\..\src\core\iomgr\sockaddr_utils.c"> |