diff options
Diffstat (limited to 'lib/libc/asr/asr_resolver.c')
-rw-r--r-- | lib/libc/asr/asr_resolver.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/lib/libc/asr/asr_resolver.c b/lib/libc/asr/asr_resolver.c index 6afd10a8d80..7de2e3acb5c 100644 --- a/lib/libc/asr/asr_resolver.c +++ b/lib/libc/asr/asr_resolver.c @@ -1,4 +1,4 @@ -/* $OpenBSD: asr_resolver.c,v 1.5 2012/07/29 20:33:21 eric Exp $ */ +/* $OpenBSD: asr_resolver.c,v 1.6 2012/08/18 11:19:51 eric Exp $ */ /* * Copyright (c) 2012 Eric Faurot <eric@openbsd.org> * @@ -473,16 +473,21 @@ getaddrinfo(const char *hostname, const char *servname, { struct async *as; struct async_res ar; + int saved_errno = errno; as = getaddrinfo_async(hostname, servname, hints, NULL); - if (as == NULL) - return ((errno == ENOMEM) ? EAI_MEMORY : EAI_SYSTEM); + if (as == NULL) { + if (errno == ENOMEM) { + errno = saved_errno; + return (EAI_MEMORY); + } + return (EAI_SYSTEM); + } async_run_sync(as, &ar); - errno = ar.ar_errno; - h_errno = ar.ar_h_errno; *res = ar.ar_addrinfo; + errno = (ar.ar_gai_errno == EAI_SYSTEM) ? ar.ar_errno : saved_errno; return (ar.ar_gai_errno); } @@ -493,16 +498,21 @@ getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, { struct async *as; struct async_res ar; + int saved_errno = errno; as = getnameinfo_async(sa, salen, host, hostlen, serv, servlen, flags, NULL); - if (as == NULL) - return ((errno == ENOMEM) ? EAI_MEMORY : EAI_SYSTEM); + if (as == NULL) { + if (errno == ENOMEM) { + errno = saved_errno; + return (EAI_MEMORY); + } + return (EAI_SYSTEM); + } async_run_sync(as, &ar); - errno = ar.ar_errno; - h_errno = ar.ar_h_errno; + errno = (ar.ar_gai_errno == EAI_SYSTEM) ? ar.ar_errno : saved_errno; return (ar.ar_gai_errno); } |