diff options
author | 2012-08-18 11:19:51 +0000 | |
---|---|---|
committer | 2012-08-18 11:19:51 +0000 | |
commit | 4a5082305ae892265cda902a457048c17960f23d (patch) | |
tree | d6385f3c434e27fe6efd1938c9e5b746464aed71 /lib/libc/asr/getnameinfo_async.c | |
parent | allow other targets to work like install -> realinstall (diff) | |
download | wireguard-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.c | 22 |
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; |