X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fnetwork%2Fgetaddrinfo.c;h=9df045f6ba0fb6078f92090dab10b274f2b9c552;hb=d32dadd60efb9d3b255351a3b532f8e4c3dd0db1;hp=ba26847a1c02e6be4578898d1b0d6a2dc55a2635;hpb=187bcc3bf40bf187c5d76d206b04028fa8ca403b;p=musl diff --git a/src/network/getaddrinfo.c b/src/network/getaddrinfo.c index ba26847a..9df045f6 100644 --- a/src/network/getaddrinfo.c +++ b/src/network/getaddrinfo.c @@ -16,13 +16,7 @@ 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; + struct aibuf *out; if (!host && !serv) return EAI_NONAME; @@ -72,11 +66,22 @@ 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; + } + switch (errno) { + case EADDRNOTAVAIL: + case EAFNOSUPPORT: + case EHOSTUNREACH: + case ENETDOWN: + case ENETUNREACH: + break; + default: + return EAI_SYSTEM; } - if (errno != EAFNOSUPPORT) return EAI_SYSTEM; if (family == tf[i]) return EAI_NONAME; family = tf[1-i]; } @@ -101,6 +106,7 @@ int getaddrinfo(const char *restrict host, const char *restrict serv, const stru } for (k=i=0; iai; return 0; }