summaryrefslogtreecommitdiffstats
path: root/lib/libc/asr/getaddrinfo_async.c
diff options
context:
space:
mode:
authoreric <eric@openbsd.org>2012-09-05 15:56:13 +0000
committereric <eric@openbsd.org>2012-09-05 15:56:13 +0000
commitd95d6a5584802dfbfc6e7b3fad160cd435955680 (patch)
tree0ca365c85e6423d65fee6484a7b56e7da1c03161 /lib/libc/asr/getaddrinfo_async.c
parentHandle empty list properly in choose-list, based on fix from Thomas Adam. (diff)
downloadwireguard-openbsd-d95d6a5584802dfbfc6e7b3fad160cd435955680.tar.xz
wireguard-openbsd-d95d6a5584802dfbfc6e7b3fad160cd435955680.zip
Make hostaddr_async() return a linked list of struct addrinfo. First
round of a getaddrinfo_async() simplification. The goal is to make YP support easier to add, and eventually remove the whole hostaddr_async subquery.
Diffstat (limited to 'lib/libc/asr/getaddrinfo_async.c')
-rw-r--r--lib/libc/asr/getaddrinfo_async.c43
1 files changed, 20 insertions, 23 deletions
diff --git a/lib/libc/asr/getaddrinfo_async.c b/lib/libc/asr/getaddrinfo_async.c
index 7eb502256b8..a31fd31f9bc 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.5 2012/08/18 11:19:51 eric Exp $ */
+/* $OpenBSD: getaddrinfo_async.c,v 1.6 2012/09/05 15:56:13 eric Exp $ */
/*
* Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
*
@@ -298,36 +298,33 @@ getaddrinfo_async_run(struct async *as, struct async_res *ar)
if ((r = async_run(as->as.ai.subq, ar)) == ASYNC_COND)
return (ASYNC_COND);
- /* Got one more address, use it to extend the result list. */
- if (r == ASYNC_YIELD) {
- if ((r = add_sockaddr(as, &ar->ar_sa.sa,
- ar->ar_cname))) {
- ar->ar_gai_errno = r;
- async_set_state(as, ASR_STATE_HALT);
- }
- if (ar->ar_cname)
- free(ar->ar_cname);
- break;
- }
-
/*
* The subquery is done. Stop there if we have at least one
* answer.
*/
as->as.ai.subq = NULL;
- if (ar->ar_count) {
- async_set_state(as, ASR_STATE_HALT);
+ if (ar->ar_count == 0) {
+ /*
+ * No anwser for this domain, but we might be suggested
+ * to try again later, so remember this. Then search
+ * the next domain.
+ */
+ if (ar->ar_gai_errno == EAI_AGAIN)
+ as->as.ai.flags |= ASYNC_AGAIN;
+ async_set_state(as, ASR_STATE_SEARCH_DOMAIN);
break;
}
- /*
- * No anwser for this domain, but we might be suggested to
- * try again later, so remember this. Then search the next
- * domain.
- */
- if (ar->ar_gai_errno == EAI_AGAIN)
- as->as.ai.flags |= ASYNC_AGAIN;
- async_set_state(as, ASR_STATE_SEARCH_DOMAIN);
+ /* iterate over and expand results */
+
+ for(ai = ar->ar_addrinfo; ai; ai = ai->ai_next) {
+ r = add_sockaddr(as, ai->ai_addr, ai->ai_canonname);
+ if (r)
+ break;
+ }
+ freeaddrinfo(ar->ar_addrinfo);
+ ar->ar_gai_errno = r;
+ async_set_state(as, ASR_STATE_HALT);
break;
case ASR_STATE_NOT_FOUND: