30 #include "absl/status/status.h"
31 #include "absl/strings/str_cat.h"
32 #include "absl/strings/str_format.h"
42 #ifdef GRPC_HAVE_UNIX_SOCKET
46 #ifdef GRPC_HAVE_UNIX_SOCKET
49 const grpc_sockaddr*
addr =
50 reinterpret_cast<const grpc_sockaddr*
>(resolved_addr->
addr);
51 if (
addr->sa_family != AF_UNIX) {
55 const auto* unix_addr =
reinterpret_cast<const struct sockaddr_un*
>(
addr);
57 if (unix_addr->sun_path[0] ==
'\0' && unix_addr->sun_path[1] !=
'\0') {
58 scheme =
"unix-abstract";
60 resolved_addr->
len -
sizeof(unix_addr->sun_family) - 1);
63 path = unix_addr->sun_path;
79 0, 0, 0, 0, 0xff, 0xff};
83 GPR_ASSERT(resolved_addr != resolved_addr4_out);
84 const grpc_sockaddr*
addr =
85 reinterpret_cast<const grpc_sockaddr*
>(resolved_addr->
addr);
86 grpc_sockaddr_in* addr4_out =
87 resolved_addr4_out ==
nullptr
89 :
reinterpret_cast<grpc_sockaddr_in*
>(resolved_addr4_out->
addr);
90 if (
addr->sa_family == GRPC_AF_INET6) {
91 const grpc_sockaddr_in6*
addr6 =
92 reinterpret_cast<const grpc_sockaddr_in6*
>(
addr);
95 if (resolved_addr4_out !=
nullptr) {
97 memset(resolved_addr4_out, 0,
sizeof(*resolved_addr4_out));
98 addr4_out->sin_family = GRPC_AF_INET;
102 resolved_addr4_out->
len =
103 static_cast<socklen_t
>(
sizeof(grpc_sockaddr_in));
113 GPR_ASSERT(resolved_addr != resolved_addr6_out);
114 const grpc_sockaddr*
addr =
115 reinterpret_cast<const grpc_sockaddr*
>(resolved_addr->
addr);
116 grpc_sockaddr_in6* addr6_out =
117 reinterpret_cast<grpc_sockaddr_in6*
>(resolved_addr6_out->
addr);
118 if (
addr->sa_family == GRPC_AF_INET) {
119 const grpc_sockaddr_in*
addr4 =
120 reinterpret_cast<const grpc_sockaddr_in*
>(
addr);
121 memset(resolved_addr6_out, 0,
sizeof(*resolved_addr6_out));
122 addr6_out->sin6_family = GRPC_AF_INET6;
124 memcpy(&addr6_out->sin6_addr.s6_addr[12], &
addr4->sin_addr, 4);
125 addr6_out->sin6_port =
addr4->sin_port;
126 resolved_addr6_out->
len =
static_cast<socklen_t
>(
sizeof(grpc_sockaddr_in6));
134 const grpc_sockaddr*
addr;
137 resolved_addr = &addr4_normalized;
139 addr =
reinterpret_cast<const grpc_sockaddr*
>(resolved_addr->
addr);
140 if (
addr->sa_family == GRPC_AF_INET) {
142 const grpc_sockaddr_in*
addr4 =
143 reinterpret_cast<const grpc_sockaddr_in*
>(
addr);
144 if (
addr4->sin_addr.s_addr != 0) {
149 }
else if (
addr->sa_family == GRPC_AF_INET6) {
151 const grpc_sockaddr_in6*
addr6 =
152 reinterpret_cast<const grpc_sockaddr_in6*
>(
addr);
154 for (
i = 0;
i < 16;
i++) {
174 grpc_sockaddr_in* wild_out =
175 reinterpret_cast<grpc_sockaddr_in*
>(resolved_wild_out->
addr);
177 memset(resolved_wild_out, 0,
sizeof(*resolved_wild_out));
178 wild_out->sin_family = GRPC_AF_INET;
180 resolved_wild_out->
len =
static_cast<socklen_t
>(
sizeof(grpc_sockaddr_in));
185 grpc_sockaddr_in6* wild_out =
186 reinterpret_cast<grpc_sockaddr_in6*
>(resolved_wild_out->
addr);
188 memset(resolved_wild_out, 0,
sizeof(*resolved_wild_out));
189 wild_out->sin6_family = GRPC_AF_INET6;
191 resolved_wild_out->
len =
static_cast<socklen_t
>(
sizeof(grpc_sockaddr_in6));
196 const int save_errno = errno;
199 resolved_addr = &addr_normalized;
201 const grpc_sockaddr*
addr =
202 reinterpret_cast<const grpc_sockaddr*
>(resolved_addr->
addr);
204 #ifdef GRPC_HAVE_UNIX_SOCKET
205 if (
addr->sa_family == GRPC_AF_UNIX) {
206 const sockaddr_un* addr_un =
reinterpret_cast<const sockaddr_un*
>(
addr);
207 bool abstract = addr_un->sun_path[0] ==
'\0';
209 int len = resolved_addr->
len -
sizeof(
addr->sa_family);
215 size_t maxlen =
sizeof(addr_un->sun_path);
216 if (
strnlen(addr_un->sun_path, maxlen) == maxlen) {
225 const void* ip =
nullptr;
228 if (
addr->sa_family == GRPC_AF_INET) {
229 const grpc_sockaddr_in*
addr4 =
230 reinterpret_cast<const grpc_sockaddr_in*
>(
addr);
231 ip = &
addr4->sin_addr;
233 }
else if (
addr->sa_family == GRPC_AF_INET6) {
234 const grpc_sockaddr_in6*
addr6 =
235 reinterpret_cast<const grpc_sockaddr_in6*
>(
addr);
240 char ntop_buf[GRPC_INET6_ADDRSTRLEN];
242 sizeof(ntop_buf)) !=
nullptr) {
243 if (sin6_scope_id != 0) {
262 if (resolved_addr->
len == 0) {
267 resolved_addr = &addr_normalized;
270 if (scheme ==
nullptr || strcmp(
"unix", scheme) == 0) {
284 const grpc_sockaddr*
addr =
285 reinterpret_cast<const grpc_sockaddr*
>(resolved_addr->
addr);
286 switch (
addr->sa_family) {
298 const grpc_sockaddr*
addr =
299 reinterpret_cast<const grpc_sockaddr*
>(resolved_addr->
addr);
300 return addr->sa_family;
304 const grpc_sockaddr*
addr =
305 reinterpret_cast<const grpc_sockaddr*
>(resolved_addr->
addr);
306 switch (
addr->sa_family) {
309 (
reinterpret_cast<const grpc_sockaddr_in*
>(
addr))->sin_port);
312 (
reinterpret_cast<const grpc_sockaddr_in6*
>(
addr))->sin6_port);
313 #ifdef GRPC_HAVE_UNIX_SOCKET
325 grpc_sockaddr*
addr =
reinterpret_cast<grpc_sockaddr*
>(resolved_addr->
addr);
326 switch (
addr->sa_family) {
329 (
reinterpret_cast<grpc_sockaddr_in*
>(
addr))->sin_port =
334 (
reinterpret_cast<grpc_sockaddr_in6*
>(
addr))->sin6_port =
346 const grpc_sockaddr*
addr =
347 reinterpret_cast<const grpc_sockaddr*
>(resolved_addr->
addr);
348 if (
addr->sa_family == GRPC_AF_INET) {
349 const grpc_sockaddr_in*
addr4 =
350 reinterpret_cast<const grpc_sockaddr_in*
>(
addr);
351 const char* addr_bytes =
reinterpret_cast<const char*
>(&
addr4->sin_addr);
353 }
else if (
addr->sa_family == GRPC_AF_INET6) {
354 const grpc_sockaddr_in6*
addr6 =
355 reinterpret_cast<const grpc_sockaddr_in6*
>(
addr);
356 const char* addr_bytes =
reinterpret_cast<const char*
>(&
addr6->
sin6_addr);
365 grpc_sockaddr*
addr =
reinterpret_cast<grpc_sockaddr*
>(address->
addr);
366 if (
addr->sa_family == GRPC_AF_INET) {
367 grpc_sockaddr_in*
addr4 =
reinterpret_cast<grpc_sockaddr_in*
>(
addr);
368 if (mask_bits == 0) {
371 }
else if (mask_bits >= 32) {
376 }
else if (
addr->sa_family == GRPC_AF_INET6) {
377 grpc_sockaddr_in6*
addr6 =
reinterpret_cast<grpc_sockaddr_in6*
>(
addr);
378 if (mask_bits == 0) {
381 }
else if (mask_bits >= 128) {
389 if (mask_bits <= 32) {
395 }
else if (mask_bits <= 64) {
401 }
else if (mask_bits <= 96) {
418 auto*
addr =
reinterpret_cast<const grpc_sockaddr*
>(address->
addr);
420 reinterpret_cast<const grpc_sockaddr*
>(subnet_address->
addr);
421 if (
addr->sa_family != subnet_addr->sa_family)
return false;
424 addr =
reinterpret_cast<grpc_sockaddr*
>((&masked_address)->
addr);
426 if (
addr->sa_family == GRPC_AF_INET) {
427 auto*
addr4 =
reinterpret_cast<const grpc_sockaddr_in*
>(
addr);
428 auto* subnet_addr4 =
reinterpret_cast<const grpc_sockaddr_in*
>(subnet_addr);
429 if (memcmp(&
addr4->sin_addr, &subnet_addr4->sin_addr,
430 sizeof(
addr4->sin_addr)) == 0) {
433 }
else if (
addr->sa_family == GRPC_AF_INET6) {
434 auto*
addr6 =
reinterpret_cast<const grpc_sockaddr_in6*
>(
addr);
436 reinterpret_cast<const grpc_sockaddr_in6*
>(subnet_addr);