summaryrefslogtreecommitdiffstats
path: root/lib/libc/asr/getaddrinfo_async.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/asr/getaddrinfo_async.c')
-rw-r--r--lib/libc/asr/getaddrinfo_async.c53
1 files changed, 16 insertions, 37 deletions
diff --git a/lib/libc/asr/getaddrinfo_async.c b/lib/libc/asr/getaddrinfo_async.c
index 2919c970743..7eb502256b8 100644
--- a/lib/libc/asr/getaddrinfo_async.c
+++ b/lib/libc/asr/getaddrinfo_async.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: getaddrinfo_async.c,v 1.4 2012/07/13 14:05:12 eric Exp $ */
+/* $OpenBSD: getaddrinfo_async.c,v 1.5 2012/08/18 11:19:51 eric Exp $ */
/*
* Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
*
@@ -110,15 +110,11 @@ getaddrinfo_async_run(struct async *as, struct async_res *ar)
*/
as->as_count = 0;
- async_set_state(as, ASR_STATE_HALT);
- ar->ar_errno = 0;
- ar->ar_h_errno = NETDB_SUCCESS;
- ar->ar_gai_errno = 0;
if (as->as.ai.hostname == NULL &&
as->as.ai.servname == NULL) {
- ar->ar_h_errno = NO_RECOVERY;
ar->ar_gai_errno = EAI_NONAME;
+ async_set_state(as, ASR_STATE_HALT);
break;
}
@@ -128,23 +124,23 @@ getaddrinfo_async_run(struct async *as, struct async_res *ar)
ai->ai_canonname ||
ai->ai_addr ||
ai->ai_next) {
- ar->ar_h_errno = NO_RECOVERY;
ar->ar_gai_errno = EAI_BADHINTS;
+ async_set_state(as, ASR_STATE_HALT);
break;
}
if (ai->ai_flags & ~AI_MASK ||
(ai->ai_flags & AI_CANONNAME && ai->ai_flags & AI_FQDN)) {
- ar->ar_h_errno = NO_RECOVERY;
ar->ar_gai_errno = EAI_BADFLAGS;
+ async_set_state(as, ASR_STATE_HALT);
break;
}
if (ai->ai_family != PF_UNSPEC &&
ai->ai_family != PF_INET &&
ai->ai_family != PF_INET6) {
- ar->ar_h_errno = NO_RECOVERY;
ar->ar_gai_errno = EAI_FAMILY;
+ async_set_state(as, ASR_STATE_HALT);
break;
}
@@ -152,23 +148,23 @@ getaddrinfo_async_run(struct async *as, struct async_res *ar)
ai->ai_socktype != SOCK_DGRAM &&
ai->ai_socktype != SOCK_STREAM &&
ai->ai_socktype != SOCK_RAW) {
- ar->ar_h_errno = NO_RECOVERY;
ar->ar_gai_errno = EAI_SOCKTYPE;
+ async_set_state(as, ASR_STATE_HALT);
break;
}
if (ai->ai_protocol &&
ai->ai_protocol != IPPROTO_UDP &&
ai->ai_protocol != IPPROTO_TCP) {
- ar->ar_h_errno = NO_RECOVERY;
ar->ar_gai_errno = EAI_PROTOCOL;
+ async_set_state(as, ASR_STATE_HALT);
break;
}
if (ai->ai_socktype == SOCK_RAW &&
as->as.ai.servname != NULL) {
- ar->ar_h_errno = NO_RECOVERY;
ar->ar_gai_errno = EAI_SERVICE;
+ async_set_state(as, ASR_STATE_HALT);
break;
}
@@ -179,8 +175,8 @@ getaddrinfo_async_run(struct async *as, struct async_res *ar)
MATCH_PROTO(ai->ai_protocol, i))
break;
if (matches[i].family == -1) {
- ar->ar_h_errno = NO_RECOVERY;
ar->ar_gai_errno = EAI_BADHINTS;
+ async_set_state(as, ASR_STATE_HALT);
break;
}
@@ -194,11 +190,13 @@ getaddrinfo_async_run(struct async *as, struct async_res *ar)
(as->as.ai.port_tcp == -1 && as->as.ai.port_udp == -1) ||
(ai->ai_protocol && (as->as.ai.port_udp == -1 ||
as->as.ai.port_tcp == -1))) {
- ar->ar_h_errno = NO_RECOVERY;
ar->ar_gai_errno = EAI_SERVICE;
+ async_set_state(as, ASR_STATE_HALT);
break;
}
+ ar->ar_gai_errno = 0;
+
/* If hostname is NULL, use local address */
if (as->as.ai.hostname == NULL) {
for(family = iter_family(as, 1);
@@ -217,17 +215,14 @@ getaddrinfo_async_run(struct async *as, struct async_res *ar)
/* This can't fail */
sockaddr_from_str(&sa.sa, family, str);
if ((r = add_sockaddr(as, &sa.sa, NULL))) {
- ar->ar_errno = errno;
- ar->ar_h_errno = NETDB_INTERNAL;
ar->ar_gai_errno = r;
- async_set_state(as, ASR_STATE_HALT);
break;
}
}
if (ar->ar_gai_errno == 0 && as->as_count == 0) {
- ar->ar_h_errno = NO_DATA;
ar->ar_gai_errno = EAI_NODATA;
}
+ async_set_state(as, ASR_STATE_HALT);
break;
}
@@ -241,21 +236,16 @@ getaddrinfo_async_run(struct async *as, struct async_res *ar)
continue;
if ((r = add_sockaddr(as, &sa.sa, NULL))) {
- ar->ar_errno = errno;
- ar->ar_h_errno = NETDB_INTERNAL;
ar->ar_gai_errno = r;
- async_set_state(as, ASR_STATE_HALT);
- break;
}
-
- async_set_state(as, ASR_STATE_HALT);
break;
}
- if (ar->ar_gai_errno || as->as_count)
+ if (ar->ar_gai_errno || as->as_count) {
+ async_set_state(as, ASR_STATE_HALT);
break;
+ }
if (ai->ai_flags & AI_NUMERICHOST) {
- ar->ar_h_errno = NO_RECOVERY;
ar->ar_gai_errno = EAI_FAIL;
async_set_state(as, ASR_STATE_HALT);
break;
@@ -273,8 +263,6 @@ getaddrinfo_async_run(struct async *as, struct async_res *ar)
break;
}
if (r > (int)sizeof(fqdn)) {
- ar->ar_errno = EINVAL;
- ar->ar_h_errno = NO_RECOVERY;
ar->ar_gai_errno = EAI_OVERFLOW;
async_set_state(as, ASR_STATE_HALT);
break;
@@ -293,12 +281,9 @@ getaddrinfo_async_run(struct async *as, struct async_res *ar)
as->as.ai.hints.ai_family, as->as.ai.hints.ai_flags,
as->as_ctx);
if (as->as.ai.subq == NULL) {
- ar->ar_errno = errno;
if (errno == EINVAL) {
- ar->ar_h_errno = NO_RECOVERY;
ar->ar_gai_errno = EAI_FAIL;
} else {
- ar->ar_h_errno = NETDB_INTERNAL;
ar->ar_gai_errno = EAI_MEMORY;
}
async_set_state(as, ASR_STATE_HALT);
@@ -317,8 +302,6 @@ getaddrinfo_async_run(struct async *as, struct async_res *ar)
if (r == ASYNC_YIELD) {
if ((r = add_sockaddr(as, &ar->ar_sa.sa,
ar->ar_cname))) {
- ar->ar_errno = errno;
- ar->ar_h_errno = NETDB_INTERNAL;
ar->ar_gai_errno = r;
async_set_state(as, ASR_STATE_HALT);
}
@@ -352,12 +335,9 @@ getaddrinfo_async_run(struct async *as, struct async_res *ar)
/*
* No result found. Maybe we can try again.
*/
- ar->ar_errno = 0;
if (as->as.ai.flags & ASYNC_AGAIN) {
- ar->ar_h_errno = TRY_AGAIN;
ar->ar_gai_errno = EAI_AGAIN;
} else {
- ar->ar_h_errno = NO_DATA;
ar->ar_gai_errno = EAI_NODATA;
}
async_set_state(as, ASR_STATE_HALT);
@@ -379,7 +359,6 @@ getaddrinfo_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;