- Timestamp:
- May 22, 2019, 4:09:18 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
asp3_tinet_ecnl_arm/trunk/musl-1.1.18/src/network/lookup_name.c
r352 r387 11 11 #include <pthread.h> 12 12 #include <errno.h> 13 #include <resolv.h> 13 14 #include "lookup.h" 14 15 #include "stdio_impl.h" … … 185 186 if (dots >= conf.ndots || name[l-1]=='.') *search = 0; 186 187 188 /* Strip final dot for canon, fail if multiple trailing dots. */ 189 if (name[l-1]=='.') l--; 190 if (!l || name[l-1]=='.') return EAI_NONAME; 191 187 192 /* This can never happen; the caller already checked length. */ 188 193 if (l >= 256) return EAI_NONAME; … … 311 316 if (!cnt && !(flags & AI_NUMERICHOST)) { 312 317 cnt = name_from_hosts(buf, canon, name, family); 313 if ( !cnt) cnt = name_from_dns_search(buf, canon, name, family);318 if (cnt<=0) cnt = name_from_dns_search(buf, canon, name, family); 314 319 } 315 320 if (cnt<=0) return cnt ? cnt : EAI_NONAME; … … 352 357 * So far the label/precedence table cannot be customized. */ 353 358 for (i=0; i<cnt; i++) { 359 int family = buf[i].family; 354 360 int key = 0; 355 struct sockaddr_in6 sa , da= {361 struct sockaddr_in6 sa6 = { 0 }, da6 = { 356 362 .sin6_family = AF_INET6, 357 363 .sin6_scope_id = buf[i].scopeid, 358 364 .sin6_port = 65535 359 365 }; 360 if (buf[i].family == AF_INET6) { 361 memcpy(da.sin6_addr.s6_addr, buf[i].addr, 16); 366 struct sockaddr_in sa4 = { 0 }, da4 = { 367 .sin_family = AF_INET, 368 .sin_port = 65535 369 }; 370 void *sa, *da; 371 socklen_t salen, dalen; 372 if (family == AF_INET6) { 373 memcpy(da6.sin6_addr.s6_addr, buf[i].addr, 16); 374 da = &da6; dalen = sizeof da6; 375 sa = &sa6; salen = sizeof sa6; 362 376 } else { 363 memcpy( da.sin6_addr.s6_addr,377 memcpy(sa6.sin6_addr.s6_addr, 364 378 "\0\0\0\0\0\0\0\0\0\0\xff\xff", 12); 365 memcpy(da.sin6_addr.s6_addr+12, buf[i].addr, 4); 366 } 367 const struct policy *dpolicy = policyof(&da.sin6_addr); 368 int dscope = scopeof(&da.sin6_addr); 379 memcpy(da6.sin6_addr.s6_addr+12, buf[i].addr, 4); 380 memcpy(da6.sin6_addr.s6_addr, 381 "\0\0\0\0\0\0\0\0\0\0\xff\xff", 12); 382 memcpy(da6.sin6_addr.s6_addr+12, buf[i].addr, 4); 383 memcpy(&da4.sin_addr, buf[i].addr, 4); 384 da = &da4; dalen = sizeof da4; 385 sa = &sa4; salen = sizeof sa4; 386 } 387 const struct policy *dpolicy = policyof(&da6.sin6_addr); 388 int dscope = scopeof(&da6.sin6_addr); 369 389 int dlabel = dpolicy->label; 370 390 int dprec = dpolicy->prec; 371 391 int prefixlen = 0; 372 int fd = socket( AF_INET6, SOCK_DGRAM|SOCK_CLOEXEC, IPPROTO_UDP);392 int fd = socket(family, SOCK_DGRAM|SOCK_CLOEXEC, IPPROTO_UDP); 373 393 if (fd >= 0) { 374 if (!connect(fd, (void *)&da, sizeof da)) {394 if (!connect(fd, da, dalen)) { 375 395 key |= DAS_USABLE; 376 if (!getsockname(fd, (void *)&sa, 377 &(socklen_t){sizeof sa})) { 378 if (dscope == scopeof(&sa.sin6_addr)) 396 if (!getsockname(fd, sa, &salen)) { 397 if (family == AF_INET) memcpy( 398 sa6.sin6_addr.s6_addr+12, 399 &sa4.sin_addr, 4); 400 if (dscope == scopeof(&sa6.sin6_addr)) 379 401 key |= DAS_MATCHINGSCOPE; 380 if (dlabel == labelof(&sa .sin6_addr))402 if (dlabel == labelof(&sa6.sin6_addr)) 381 403 key |= DAS_MATCHINGLABEL; 382 prefixlen = prefixmatch(&sa .sin6_addr,383 &da .sin6_addr);404 prefixlen = prefixmatch(&sa6.sin6_addr, 405 &da6.sin6_addr); 384 406 } 385 407 }
Note:
See TracChangeset
for help on using the changeset viewer.