summaryrefslogtreecommitdiffstats
path: root/lib/libc/asr/getnameinfo_async.c
diff options
context:
space:
mode:
authoreric <eric@openbsd.org>2012-08-18 11:19:51 +0000
committereric <eric@openbsd.org>2012-08-18 11:19:51 +0000
commit4a5082305ae892265cda902a457048c17960f23d (patch)
treed6385f3c434e27fe6efd1938c9e5b746464aed71 /lib/libc/asr/getnameinfo_async.c
parentallow other targets to work like install -> realinstall (diff)
downloadwireguard-openbsd-4a5082305ae892265cda902a457048c17960f23d.tar.xz
wireguard-openbsd-4a5082305ae892265cda902a457048c17960f23d.zip
Improve error reporting in getnameinfo_async() and getaddrinfo_async().
They do not have to deal with h_errno at all. Also, errno is only kept for EAI_SYSTEM. Small code cleanup while there. Adapt getnameinfo() and getaddrinfo() wrappers to correctly save errno and overwrite it in the EAI_SYSTEM case. General errno handling issue reported by mikeb@.
Diffstat (limited to 'lib/libc/asr/getnameinfo_async.c')
-rw-r--r--lib/libc/asr/getnameinfo_async.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/lib/libc/asr/getnameinfo_async.c b/lib/libc/asr/getnameinfo_async.c
index 8ae109c6fa2..e32501f8337 100644
--- a/lib/libc/asr/getnameinfo_async.c
+++ b/lib/libc/asr/getnameinfo_async.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: getnameinfo_async.c,v 1.2 2012/04/25 20:28:25 eric Exp $ */
+/* $OpenBSD: getnameinfo_async.c,v 1.3 2012/08/18 11:19:51 eric Exp $ */
/*
* Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
*
@@ -112,13 +112,14 @@ getnameinfo_async_run(struct async *as, struct async_res *ar)
if (as->as.ni.flags & NI_NUMERICHOST) {
if (_numerichost(as) == -1) {
- ar->ar_errno = errno;
- if (ar->ar_errno == ENOMEM)
+ if (errno == ENOMEM)
ar->ar_gai_errno = EAI_MEMORY;
- else if (ar->ar_errno == ENOSPC)
+ else if (errno == ENOSPC)
ar->ar_gai_errno = EAI_OVERFLOW;
- else
+ else {
+ ar->ar_errno = errno;
ar->ar_gai_errno = EAI_SYSTEM;
+ }
} else
ar->ar_gai_errno = 0;
async_set_state(as, ASR_STATE_HALT);
@@ -140,7 +141,6 @@ getnameinfo_async_run(struct async *as, struct async_res *ar)
as->as.ni.sa.sa.sa_family,
as->as_ctx);
if (as->as.ni.subq == NULL) {
- ar->ar_errno = errno;
ar->ar_gai_errno = EAI_MEMORY;
async_set_state(as, ASR_STATE_HALT);
break;
@@ -163,13 +163,14 @@ getnameinfo_async_run(struct async *as, struct async_res *ar)
if (as->as.ni.flags & NI_NAMEREQD) {
ar->ar_gai_errno = EAI_NONAME;
} else if (_numerichost(as) == -1) {
- ar->ar_errno = errno;
- if (ar->ar_errno == ENOMEM)
+ if (errno == ENOMEM)
ar->ar_gai_errno = EAI_MEMORY;
- else if (ar->ar_errno == ENOSPC)
+ else if (errno == ENOSPC)
ar->ar_gai_errno = EAI_OVERFLOW;
- else
+ else {
+ ar->ar_errno = errno;
ar->ar_gai_errno = EAI_SYSTEM;
+ }
} else
ar->ar_gai_errno = 0;
} else {
@@ -190,7 +191,6 @@ getnameinfo_async_run(struct async *as, struct async_res *ar)
default:
ar->ar_errno = EOPNOTSUPP;
- ar->ar_h_errno = NETDB_INTERNAL;
ar->ar_gai_errno = EAI_SYSTEM;
async_set_state(as, ASR_STATE_HALT);
break;