X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fnetwork%2Fgetaddrinfo.c;h=64ad259acae870fada78af1ea4d1731929e56209;hb=c5f4b2dfea320356f69445dc1adf8f73596a3c36;hp=ba26847a1c02e6be4578898d1b0d6a2dc55a2635;hpb=187bcc3bf40bf187c5d76d206b04028fa8ca403b;p=musl diff --git a/src/network/getaddrinfo.c b/src/network/getaddrinfo.c index ba26847a..64ad259a 100644 --- a/src/network/getaddrinfo.c +++ b/src/network/getaddrinfo.c @@ -16,13 +16,8 @@ int getaddrinfo(const char *restrict host, const char *restrict serv, const stru char canon[256], *outcanon; int nservs, naddrs, nais, canon_len, i, j, k; int family = AF_UNSPEC, flags = 0, proto = 0, socktype = 0; - struct aibuf { - struct addrinfo ai; - union sa { - struct sockaddr_in sin; - struct sockaddr_in6 sin6; - } sa; - } *out; + int no_family = 0; + struct aibuf *out; if (!host && !serv) return EAI_NONAME; @@ -72,12 +67,23 @@ int getaddrinfo(const char *restrict host, const char *restrict serv, const stru pthread_setcancelstate( PTHREAD_CANCEL_DISABLE, &cs); int r = connect(s, ta[i], tl[i]); + int saved_errno = errno; pthread_setcancelstate(cs, 0); close(s); if (!r) continue; + errno = saved_errno; } - if (errno != EAFNOSUPPORT) return EAI_SYSTEM; - if (family == tf[i]) return EAI_NONAME; + switch (errno) { + case EADDRNOTAVAIL: + case EAFNOSUPPORT: + case EHOSTUNREACH: + case ENETDOWN: + case ENETUNREACH: + break; + default: + return EAI_SYSTEM; + } + if (family == tf[i]) no_family = 1; family = tf[1-i]; } } @@ -88,6 +94,8 @@ int getaddrinfo(const char *restrict host, const char *restrict serv, const stru naddrs = __lookup_name(addrs, canon, host, family, flags); if (naddrs < 0) return naddrs; + if (no_family) return EAI_NODATA; + nais = nservs * naddrs; canon_len = strlen(canon); out = calloc(1, nais * sizeof(*out) + canon_len + 1); @@ -101,6 +109,7 @@ int getaddrinfo(const char *restrict host, const char *restrict serv, const stru } for (k=i=0; iai; return 0; }