Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 1 | /* |
| 2 | * |
Jan Tattermusch | 7897ae9 | 2017-06-07 22:57:36 +0200 | [diff] [blame] | 3 | * Copyright 2015 gRPC authors. |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 4 | * |
Jan Tattermusch | 7897ae9 | 2017-06-07 22:57:36 +0200 | [diff] [blame] | 5 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 6 | * you may not use this file except in compliance with the License. |
| 7 | * You may obtain a copy of the License at |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 8 | * |
Jan Tattermusch | 7897ae9 | 2017-06-07 22:57:36 +0200 | [diff] [blame] | 9 | * http://www.apache.org/licenses/LICENSE-2.0 |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 10 | * |
Jan Tattermusch | 7897ae9 | 2017-06-07 22:57:36 +0200 | [diff] [blame] | 11 | * Unless required by applicable law or agreed to in writing, software |
| 12 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 14 | * See the License for the specific language governing permissions and |
| 15 | * limitations under the License. |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 16 | * |
| 17 | */ |
| 18 | |
Alexander Polcyn | db3e898 | 2018-02-21 16:59:24 -0800 | [diff] [blame] | 19 | #include <grpc/support/port_platform.h> |
| 20 | |
murgatroid99 | 5407089 | 2016-08-08 17:01:18 -0700 | [diff] [blame] | 21 | #include "src/core/lib/iomgr/port.h" |
Muxi Yan | 67ff405 | 2018-05-15 12:36:10 -0700 | [diff] [blame] | 22 | #ifdef GRPC_POSIX_SOCKET_RESOLVE_ADDRESS |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 23 | |
Craig Tiller | 9533d04 | 2016-03-25 17:11:06 -0700 | [diff] [blame] | 24 | #include "src/core/lib/iomgr/sockaddr.h" |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 25 | |
murgatroid99 | 7871f73 | 2016-09-23 13:49:05 -0700 | [diff] [blame] | 26 | #include "src/core/lib/iomgr/resolve_address.h" |
| 27 | |
Craig Tiller | e1e4559 | 2016-03-11 08:01:58 -0800 | [diff] [blame] | 28 | #include <string.h> |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 29 | #include <sys/types.h> |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 30 | |
| 31 | #include <grpc/support/alloc.h> |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 32 | #include <grpc/support/log.h> |
Masood Malekghassemi | 701af60 | 2015-06-03 15:01:17 -0700 | [diff] [blame] | 33 | #include <grpc/support/string_util.h> |
nnoble | 0c475f0 | 2014-12-05 15:37:39 -0800 | [diff] [blame] | 34 | #include <grpc/support/time.h> |
Vijay Pai | d4d0a30 | 2018-01-25 13:24:03 -0800 | [diff] [blame] | 35 | |
Vijay Pai | ae376bf | 2018-01-25 22:54:02 -0800 | [diff] [blame] | 36 | #include "src/core/lib/gpr/host_port.h" |
Mark D. Roth | dbdf495 | 2018-01-18 11:21:12 -0800 | [diff] [blame] | 37 | #include "src/core/lib/gpr/string.h" |
Vijay Pai | d4d0a30 | 2018-01-25 13:24:03 -0800 | [diff] [blame] | 38 | #include "src/core/lib/gpr/useful.h" |
Vijay Pai | 87e2e6a | 2018-02-19 22:45:47 -0800 | [diff] [blame] | 39 | #include "src/core/lib/gprpp/thd.h" |
Craig Tiller | 6b7c1fb | 2017-07-19 15:45:03 -0700 | [diff] [blame] | 40 | #include "src/core/lib/iomgr/block_annotate.h" |
Craig Tiller | 9533d04 | 2016-03-25 17:11:06 -0700 | [diff] [blame] | 41 | #include "src/core/lib/iomgr/executor.h" |
| 42 | #include "src/core/lib/iomgr/iomgr_internal.h" |
Craig Tiller | 9533d04 | 2016-03-25 17:11:06 -0700 | [diff] [blame] | 43 | #include "src/core/lib/iomgr/unix_sockets_posix.h" |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 44 | |
kpayson64 | 539f506 | 2018-03-12 19:16:30 -0700 | [diff] [blame] | 45 | static grpc_error* posix_blocking_resolve_address( |
Craig Tiller | baa14a9 | 2017-11-03 09:09:36 -0700 | [diff] [blame] | 46 | const char* name, const char* default_port, |
| 47 | grpc_resolved_addresses** addresses) { |
Yash Tibrewal | 8cf1470 | 2017-12-06 09:47:54 -0800 | [diff] [blame] | 48 | grpc_core::ExecCtx exec_ctx; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 49 | struct addrinfo hints; |
Craig Tiller | 4782d92 | 2017-11-10 09:53:21 -0800 | [diff] [blame] | 50 | struct addrinfo *result = nullptr, *resp; |
Craig Tiller | baa14a9 | 2017-11-03 09:09:36 -0700 | [diff] [blame] | 51 | char* host; |
| 52 | char* port; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 53 | int s; |
| 54 | size_t i; |
Craig Tiller | baa14a9 | 2017-11-03 09:09:36 -0700 | [diff] [blame] | 55 | grpc_error* err; |
Craig Tiller | ae7fe92 | 2015-02-13 23:16:32 -0800 | [diff] [blame] | 56 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 57 | if (name[0] == 'u' && name[1] == 'n' && name[2] == 'i' && name[3] == 'x' && |
| 58 | name[4] == ':' && name[5] != 0) { |
Craig Tiller | 5b15afd | 2016-05-04 15:00:14 -0700 | [diff] [blame] | 59 | return grpc_resolve_unix_domain_address(name + 5, addresses); |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 60 | } |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 61 | |
| 62 | /* parse name, splitting it into host and port parts */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 63 | gpr_split_host_port(name, &host, &port); |
Craig Tiller | 4782d92 | 2017-11-10 09:53:21 -0800 | [diff] [blame] | 64 | if (host == nullptr) { |
ncteisen | 4b36a3d | 2017-03-13 19:08:06 -0700 | [diff] [blame] | 65 | err = grpc_error_set_str( |
| 66 | GRPC_ERROR_CREATE_FROM_STATIC_STRING("unparseable host:port"), |
| 67 | GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(name)); |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 68 | goto done; |
| 69 | } |
Craig Tiller | 4782d92 | 2017-11-10 09:53:21 -0800 | [diff] [blame] | 70 | if (port == nullptr) { |
| 71 | if (default_port == nullptr) { |
ncteisen | 4b36a3d | 2017-03-13 19:08:06 -0700 | [diff] [blame] | 72 | err = grpc_error_set_str( |
| 73 | GRPC_ERROR_CREATE_FROM_STATIC_STRING("no port in name"), |
| 74 | GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(name)); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 75 | goto done; |
| 76 | } |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 77 | port = gpr_strdup(default_port); |
| 78 | } |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 79 | |
| 80 | /* Call getaddrinfo */ |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 81 | memset(&hints, 0, sizeof(hints)); |
| 82 | hints.ai_family = AF_UNSPEC; /* ipv4 or ipv6 */ |
| 83 | hints.ai_socktype = SOCK_STREAM; /* stream socket */ |
| 84 | hints.ai_flags = AI_PASSIVE; /* for wildcard IP address */ |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 85 | |
vjpai | 9839d28 | 2015-09-24 17:55:18 -0700 | [diff] [blame] | 86 | GRPC_SCHEDULING_START_BLOCKING_REGION; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 87 | s = getaddrinfo(host, port, &hints, &result); |
Yash Tibrewal | 8cf1470 | 2017-12-06 09:47:54 -0800 | [diff] [blame] | 88 | GRPC_SCHEDULING_END_BLOCKING_REGION; |
Vijay Pai | ba13055 | 2015-09-24 13:43:01 -0700 | [diff] [blame] | 89 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 90 | if (s != 0) { |
| 91 | /* Retry if well-known service name is recognized */ |
Craig Tiller | baa14a9 | 2017-11-03 09:09:36 -0700 | [diff] [blame] | 92 | const char* svc[][2] = {{"http", "80"}, {"https", "443"}}; |
Craig Tiller | b9d3596 | 2015-09-11 13:31:16 -0700 | [diff] [blame] | 93 | for (i = 0; i < GPR_ARRAY_SIZE(svc); i++) { |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 94 | if (strcmp(port, svc[i][0]) == 0) { |
vjpai | 9839d28 | 2015-09-24 17:55:18 -0700 | [diff] [blame] | 95 | GRPC_SCHEDULING_START_BLOCKING_REGION; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 96 | s = getaddrinfo(host, svc[i][1], &hints, &result); |
Yash Tibrewal | 8cf1470 | 2017-12-06 09:47:54 -0800 | [diff] [blame] | 97 | GRPC_SCHEDULING_END_BLOCKING_REGION; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 98 | break; |
| 99 | } |
Raul Silvera | 659be5a | 2015-03-04 11:51:11 -0800 | [diff] [blame] | 100 | } |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 101 | } |
Raul Silvera | 659be5a | 2015-03-04 11:51:11 -0800 | [diff] [blame] | 102 | |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 103 | if (s != 0) { |
Craig Tiller | 5b15afd | 2016-05-04 15:00:14 -0700 | [diff] [blame] | 104 | err = grpc_error_set_str( |
| 105 | grpc_error_set_str( |
ncteisen | 4b36a3d | 2017-03-13 19:08:06 -0700 | [diff] [blame] | 106 | grpc_error_set_str( |
| 107 | grpc_error_set_int( |
| 108 | GRPC_ERROR_CREATE_FROM_STATIC_STRING("OS Error"), |
| 109 | GRPC_ERROR_INT_ERRNO, s), |
| 110 | GRPC_ERROR_STR_OS_ERROR, |
| 111 | grpc_slice_from_static_string(gai_strerror(s))), |
| 112 | GRPC_ERROR_STR_SYSCALL, |
| 113 | grpc_slice_from_static_string("getaddrinfo")), |
ncteisen | bbb3801 | 2017-03-10 14:58:43 -0800 | [diff] [blame] | 114 | GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(name)); |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 115 | goto done; |
| 116 | } |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 117 | |
| 118 | /* Success path: set addrs non-NULL, fill it in */ |
Noah Eisen | 4d20a66 | 2018-02-09 09:34:04 -0800 | [diff] [blame] | 119 | *addresses = static_cast<grpc_resolved_addresses*>( |
| 120 | gpr_malloc(sizeof(grpc_resolved_addresses))); |
Craig Tiller | 5b15afd | 2016-05-04 15:00:14 -0700 | [diff] [blame] | 121 | (*addresses)->naddrs = 0; |
Craig Tiller | 4782d92 | 2017-11-10 09:53:21 -0800 | [diff] [blame] | 122 | for (resp = result; resp != nullptr; resp = resp->ai_next) { |
Craig Tiller | 5b15afd | 2016-05-04 15:00:14 -0700 | [diff] [blame] | 123 | (*addresses)->naddrs++; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 124 | } |
Noah Eisen | 4d20a66 | 2018-02-09 09:34:04 -0800 | [diff] [blame] | 125 | (*addresses)->addrs = static_cast<grpc_resolved_address*>( |
| 126 | gpr_malloc(sizeof(grpc_resolved_address) * (*addresses)->naddrs)); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 127 | i = 0; |
Craig Tiller | 4782d92 | 2017-11-10 09:53:21 -0800 | [diff] [blame] | 128 | for (resp = result; resp != nullptr; resp = resp->ai_next) { |
Craig Tiller | 5b15afd | 2016-05-04 15:00:14 -0700 | [diff] [blame] | 129 | memcpy(&(*addresses)->addrs[i].addr, resp->ai_addr, resp->ai_addrlen); |
| 130 | (*addresses)->addrs[i].len = resp->ai_addrlen; |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 131 | i++; |
| 132 | } |
Craig Tiller | 5b15afd | 2016-05-04 15:00:14 -0700 | [diff] [blame] | 133 | err = GRPC_ERROR_NONE; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 134 | |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 135 | done: |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 136 | gpr_free(host); |
| 137 | gpr_free(port); |
| 138 | if (result) { |
| 139 | freeaddrinfo(result); |
| 140 | } |
Craig Tiller | 5b15afd | 2016-05-04 15:00:14 -0700 | [diff] [blame] | 141 | return err; |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 142 | } |
| 143 | |
Craig Tiller | 5b15afd | 2016-05-04 15:00:14 -0700 | [diff] [blame] | 144 | typedef struct { |
Craig Tiller | baa14a9 | 2017-11-03 09:09:36 -0700 | [diff] [blame] | 145 | char* name; |
| 146 | char* default_port; |
| 147 | grpc_closure* on_done; |
| 148 | grpc_resolved_addresses** addrs_out; |
Craig Tiller | 5b15afd | 2016-05-04 15:00:14 -0700 | [diff] [blame] | 149 | grpc_closure request_closure; |
Craig Tiller | baa14a9 | 2017-11-03 09:09:36 -0700 | [diff] [blame] | 150 | void* arg; |
Craig Tiller | 5b15afd | 2016-05-04 15:00:14 -0700 | [diff] [blame] | 151 | } request; |
Craig Tiller | e1e4559 | 2016-03-11 08:01:58 -0800 | [diff] [blame] | 152 | |
David Garcia Quintas | 4bc3463 | 2015-10-07 16:12:35 -0700 | [diff] [blame] | 153 | /* Callback to be passed to grpc_executor to asynch-ify |
| 154 | * grpc_blocking_resolve_address */ |
Yash Tibrewal | 8cf1470 | 2017-12-06 09:47:54 -0800 | [diff] [blame] | 155 | static void do_request_thread(void* rp, grpc_error* error) { |
Noah Eisen | be82e64 | 2018-02-09 09:16:55 -0800 | [diff] [blame] | 156 | request* r = static_cast<request*>(rp); |
Yash Tibrewal | 8cf1470 | 2017-12-06 09:47:54 -0800 | [diff] [blame] | 157 | GRPC_CLOSURE_SCHED(r->on_done, grpc_blocking_resolve_address( |
| 158 | r->name, r->default_port, r->addrs_out)); |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 159 | gpr_free(r->name); |
| 160 | gpr_free(r->default_port); |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 161 | gpr_free(r); |
Nicolas Noble | b7ebd3b | 2014-11-26 16:33:03 -0800 | [diff] [blame] | 162 | } |
| 163 | |
kpayson64 | 539f506 | 2018-03-12 19:16:30 -0700 | [diff] [blame] | 164 | static void posix_resolve_address(const char* name, const char* default_port, |
| 165 | grpc_pollset_set* interested_parties, |
| 166 | grpc_closure* on_done, |
| 167 | grpc_resolved_addresses** addrs) { |
Noah Eisen | be82e64 | 2018-02-09 09:16:55 -0800 | [diff] [blame] | 168 | request* r = static_cast<request*>(gpr_malloc(sizeof(request))); |
ncteisen | 274bbbe | 2017-06-08 14:57:11 -0700 | [diff] [blame] | 169 | GRPC_CLOSURE_INIT(&r->request_closure, do_request_thread, r, |
Craig Tiller | 8ac417c | 2017-07-21 14:37:31 -0700 | [diff] [blame] | 170 | grpc_executor_scheduler(GRPC_EXECUTOR_SHORT)); |
Craig Tiller | a82950e | 2015-09-22 12:33:20 -0700 | [diff] [blame] | 171 | r->name = gpr_strdup(name); |
| 172 | r->default_port = gpr_strdup(default_port); |
Craig Tiller | 5b15afd | 2016-05-04 15:00:14 -0700 | [diff] [blame] | 173 | r->on_done = on_done; |
| 174 | r->addrs_out = addrs; |
Yash Tibrewal | 8cf1470 | 2017-12-06 09:47:54 -0800 | [diff] [blame] | 175 | GRPC_CLOSURE_SCHED(&r->request_closure, GRPC_ERROR_NONE); |
Craig Tiller | 190d360 | 2015-02-18 09:23:38 -0800 | [diff] [blame] | 176 | } |
Nicolas "Pixel" Noble | 94964fd | 2015-02-21 07:19:19 +0100 | [diff] [blame] | 177 | |
kpayson64 | 539f506 | 2018-03-12 19:16:30 -0700 | [diff] [blame] | 178 | grpc_address_resolver_vtable grpc_posix_resolver_vtable = { |
| 179 | posix_resolve_address, posix_blocking_resolve_address}; |
Nicolas "Pixel" Noble | 94964fd | 2015-02-21 07:19:19 +0100 | [diff] [blame] | 180 | #endif |