Ignore:
Timestamp:
May 22, 2019, 4:09:18 PM (5 years ago)
Author:
coas-nagasima
Message:

ファイルディスクリプタ処理を更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • asp3_tinet_ecnl_arm/trunk/musl-1.1.18/src/network/lookup_name.c

    r352 r387  
    1111#include <pthread.h>
    1212#include <errno.h>
     13#include <resolv.h>
    1314#include "lookup.h"
    1415#include "stdio_impl.h"
     
    185186        if (dots >= conf.ndots || name[l-1]=='.') *search = 0;
    186187
     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
    187192        /* This can never happen; the caller already checked length. */
    188193        if (l >= 256) return EAI_NONAME;
     
    311316        if (!cnt && !(flags & AI_NUMERICHOST)) {
    312317                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);
    314319        }
    315320        if (cnt<=0) return cnt ? cnt : EAI_NONAME;
     
    352357         * So far the label/precedence table cannot be customized. */
    353358        for (i=0; i<cnt; i++) {
     359                int family = buf[i].family;
    354360                int key = 0;
    355                 struct sockaddr_in6 sa, da = {
     361                struct sockaddr_in6 sa6 = { 0 }, da6 = {
    356362                        .sin6_family = AF_INET6,
    357363                        .sin6_scope_id = buf[i].scopeid,
    358364                        .sin6_port = 65535
    359365                };
    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;
    362376                } else {
    363                         memcpy(da.sin6_addr.s6_addr,
     377                        memcpy(sa6.sin6_addr.s6_addr,
    364378                                "\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);
    369389                int dlabel = dpolicy->label;
    370390                int dprec = dpolicy->prec;
    371391                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);
    373393                if (fd >= 0) {
    374                         if (!connect(fd, (void *)&da, sizeof da)) {
     394                        if (!connect(fd, da, dalen)) {
    375395                                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))
    379401                                                key |= DAS_MATCHINGSCOPE;
    380                                         if (dlabel == labelof(&sa.sin6_addr))
     402                                        if (dlabel == labelof(&sa6.sin6_addr))
    381403                                                key |= DAS_MATCHINGLABEL;
    382                                         prefixlen = prefixmatch(&sa.sin6_addr,
    383                                                 &da.sin6_addr);
     404                                        prefixlen = prefixmatch(&sa6.sin6_addr,
     405                                                &da6.sin6_addr);
    384406                                }
    385407                        }
Note: See TracChangeset for help on using the changeset viewer.