diff options
Diffstat (limited to 'lib/libc/asr/getaddrinfo_async.c')
-rw-r--r-- | lib/libc/asr/getaddrinfo_async.c | 53 |
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; |