diff options
-rw-r--r-- | lib/libc/net/getaddrinfo.c | 79 |
1 files changed, 50 insertions, 29 deletions
diff --git a/lib/libc/net/getaddrinfo.c b/lib/libc/net/getaddrinfo.c index af79644..44a745f 100644 --- a/lib/libc/net/getaddrinfo.c +++ b/lib/libc/net/getaddrinfo.c @@ -1,3 +1,6 @@ +/* $FreeBSD$ */ +/* $KAME: getaddrinfo.c,v 1.10 2000/07/05 02:59:28 itojun Exp $ */ + /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. * All rights reserved. @@ -25,8 +28,6 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * $FreeBSD$ */ /* @@ -195,7 +196,7 @@ typedef union { struct res_target { struct res_target *next; const char *name; /* domain name */ - int class, type; /* class and type of query */ + int qclass, qtype; /* class and type of query */ u_char *answer; /* buffer to put answer */ int anslen; /* size of answer buffer */ int n; /* result length */ @@ -256,7 +257,9 @@ static char *ai_errlist[] = { "System error returned in errno", /* EAI_SYSTEM */ "Invalid value for hints", /* EAI_BADHINTS */ "Resolved protocol is unknown", /* EAI_PROTOCOL */ +#ifdef EAI_RESNULL "Argument res is NULL", /* EAI_RESNULL */ +#endif "Unknown error", /* EAI_MAX */ }; @@ -393,8 +396,10 @@ getaddrinfo(hostname, servname, hints, res) if (hostname == NULL && servname == NULL) return EAI_NONAME; +#ifdef EAI_RESNULL if (res == NULL) return EAI_RESNULL; /* xxx */ +#endif if (hints) { /* error check for hints */ if (hints->ai_addrlen || hints->ai_canonname || @@ -529,9 +534,9 @@ getaddrinfo(hostname, servname, hints, res) goto good; if (pai->ai_flags & AI_NUMERICHOST) - ERR(EAI_NONAME); + ERR(EAI_NODATA); if (hostname == NULL) - ERR(EAI_NONAME); + ERR(EAI_NODATA); #if 1 /* XXX: temporarily, behave as if AI_ADDRCONFIG is specified */ @@ -812,17 +817,33 @@ explore_numeric(pai, hostname, servname, res) if (afd == NULL) return 0; - if ((afd->a_af == AF_INET - ? inet_aton(hostname, (struct in_addr *)pton) - : inet_pton(afd->a_af, hostname, pton)) == 1) { - if (pai->ai_family == afd->a_af || - pai->ai_family == PF_UNSPEC /*?*/) { - GET_AI(cur->ai_next, afd, pton); - GET_PORT(cur->ai_next, servname); - while (cur && cur->ai_next) - cur = cur->ai_next; - } else - ERR(EAI_FAMILY); /*xxx*/ + switch (afd->a_af) { +#if 1 /*X/Open spec*/ + case AF_INET: + if (inet_aton(hostname, (struct in_addr *)pton) == 1) { + if (pai->ai_family == afd->a_af || + pai->ai_family == PF_UNSPEC /*?*/) { + GET_AI(cur->ai_next, afd, pton); + GET_PORT(cur->ai_next, servname); + while (cur && cur->ai_next) + cur = cur->ai_next; + } else + ERR(EAI_FAMILY); /*xxx*/ + } + break; +#endif + default: + if (inet_pton(afd->a_af, hostname, pton) == 1) { + if (pai->ai_family == afd->a_af || + pai->ai_family == PF_UNSPEC /*?*/) { + GET_AI(cur->ai_next, afd, pton); + GET_PORT(cur->ai_next, servname); + while (cur && cur->ai_next) + cur = cur->ai_next; + } else + ERR(EAI_FAMILY); /*xxx*/ + } + break; } *res = sentinel.ai_next; @@ -891,7 +912,7 @@ explore_numeric_scope(pai, hostname, servname, res) sin6 = (struct sockaddr_in6 *)(void *)cur->ai_addr; if ((scopeid = ip6_str2scopeid(scope, sin6)) == -1) { free(hostname2); - return(EAI_NONAME); /* XXX: is return OK? */ + return(EAI_NODATA); /* XXX: is return OK? */ } sin6->sin6_scope_id = scopeid; } @@ -1406,25 +1427,25 @@ _dns_getaddrinfo(pai, hostname, res) switch (pai->ai_family) { case AF_UNSPEC: /* prefer IPv6 */ - q.class = C_IN; - q.type = T_AAAA; + q.qclass = C_IN; + q.qtype = T_AAAA; q.answer = buf.buf; q.anslen = sizeof(buf); q.next = &q2; - q2.class = C_IN; - q2.type = T_A; + q2.qclass = C_IN; + q2.qtype = T_A; q2.answer = buf2.buf; q2.anslen = sizeof(buf2); break; case AF_INET: - q.class = C_IN; - q.type = T_A; + q.qclass = C_IN; + q.qtype = T_A; q.answer = buf.buf; q.anslen = sizeof(buf); break; case AF_INET6: - q.class = C_IN; - q.type = T_AAAA; + q.qclass = C_IN; + q.qtype = T_AAAA; q.answer = buf.buf; q.anslen = sizeof(buf); break; @@ -1433,14 +1454,14 @@ _dns_getaddrinfo(pai, hostname, res) } if (res_searchN(hostname, &q) < 0) return EAI_NODATA; - ai = getanswer(&buf, q.n, q.name, q.type, pai); + ai = getanswer(&buf, q.n, q.name, q.qtype, pai); if (ai) { cur->ai_next = ai; while (cur && cur->ai_next) cur = cur->ai_next; } if (q.next) { - ai = getanswer(&buf2, q2.n, q2.name, q2.type, pai); + ai = getanswer(&buf2, q2.n, q2.name, q2.qtype, pai); if (ai) cur->ai_next = ai; } @@ -1672,8 +1693,8 @@ res_queryN(name, target) hp->rcode = NOERROR; /* default */ /* make it easier... */ - class = t->class; - type = t->type; + class = t->qclass; + type = t->qtype; answer = t->answer; anslen = t->anslen; #ifdef DEBUG |