11305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* 21305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Copyright (C) 2000-2003 Damien Miller. All rights reserved. 31305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Copyright (C) 1999 WIDE Project. All rights reserved. 41305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 51305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Redistribution and use in source and binary forms, with or without 61305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * modification, are permitted provided that the following conditions 71305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * are met: 81305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 1. Redistributions of source code must retain the above copyright 91305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * notice, this list of conditions and the following disclaimer. 101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 2. Redistributions in binary form must reproduce the above copyright 111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * notice, this list of conditions and the following disclaimer in the 121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * documentation and/or other materials provided with the distribution. 131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 3. Neither the name of the project nor the names of its contributors 141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * may be used to endorse or promote products derived from this software 151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * without specific prior written permission. 161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * SUCH DAMAGE. 281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */ 291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* 311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Pseudo-implementation of RFC2553 name / address resolution functions 321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * But these functions are not implemented correctly. The minimum subset 341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * is implemented for ssh use only. For example, this routine assumes 351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * that ai_family is AF_INET. Don't use it for another purpose. 361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */ 371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "includes.h" 391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <stdlib.h> 411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <string.h> 421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <netinet/in.h> 441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <arpa/inet.h> 451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifndef HAVE_GETNAMEINFO 471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint getnameinfo(const struct sockaddr *sa, size_t salen, char *host, 481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood size_t hostlen, char *serv, size_t servlen, int flags) 491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood struct sockaddr_in *sin = (struct sockaddr_in *)sa; 511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood struct hostent *hp; 521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood char tmpserv[16]; 531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (sa->sa_family != AF_UNSPEC && sa->sa_family != AF_INET) 551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (EAI_FAMILY); 561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (serv != NULL) { 571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood snprintf(tmpserv, sizeof(tmpserv), "%d", ntohs(sin->sin_port)); 581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (strlcpy(serv, tmpserv, servlen) >= servlen) 591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (EAI_MEMORY); 601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (host != NULL) { 631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (flags & NI_NUMERICHOST) { 641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (strlcpy(host, inet_ntoa(sin->sin_addr), 651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood hostlen) >= hostlen) 661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (EAI_MEMORY); 671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood else 681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (0); 691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } else { 701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood hp = gethostbyaddr((char *)&sin->sin_addr, 711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood sizeof(struct in_addr), AF_INET); 721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (hp == NULL) 731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (EAI_NODATA); 741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (strlcpy(host, hp->h_name, hostlen) >= hostlen) 761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (EAI_MEMORY); 771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood else 781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (0); 791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (0); 821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif /* !HAVE_GETNAMEINFO */ 841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifndef HAVE_GAI_STRERROR 861305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifdef HAVE_CONST_GAI_STRERROR_PROTO 871305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodconst char * 881305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#else 891305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodchar * 901305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif 911305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodgai_strerror(int err) 921305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 931305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood switch (err) { 941305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood case EAI_NODATA: 951305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return ("no address associated with name"); 961305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood case EAI_MEMORY: 971305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return ("memory allocation failure."); 981305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood case EAI_NONAME: 991305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return ("nodename nor servname provided, or not known"); 1001305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood case EAI_FAMILY: 1011305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return ("ai_family not supported"); 1021305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood default: 1031305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return ("unknown/invalid error."); 1041305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 1051305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 1061305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif /* !HAVE_GAI_STRERROR */ 1071305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1081305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifndef HAVE_FREEADDRINFO 1091305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid 1101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfreeaddrinfo(struct addrinfo *ai) 1111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 1121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood struct addrinfo *next; 1131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood for(; ai != NULL;) { 1151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood next = ai->ai_next; 1161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood free(ai); 1171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood ai = next; 1181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 1191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 1201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif /* !HAVE_FREEADDRINFO */ 1211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifndef HAVE_GETADDRINFO 1231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodstatic struct 1241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodaddrinfo *malloc_ai(int port, u_long addr, const struct addrinfo *hints) 1251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 1261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood struct addrinfo *ai; 1271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood ai = malloc(sizeof(*ai) + sizeof(struct sockaddr_in)); 1291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (ai == NULL) 1301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (NULL); 1311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood memset(ai, '\0', sizeof(*ai) + sizeof(struct sockaddr_in)); 1331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood ai->ai_addr = (struct sockaddr *)(ai + 1); 1351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood /* XXX -- ssh doesn't use sa_len */ 1361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood ai->ai_addrlen = sizeof(struct sockaddr_in); 1371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood ai->ai_addr->sa_family = ai->ai_family = AF_INET; 1381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood ((struct sockaddr_in *)(ai)->ai_addr)->sin_port = port; 1401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood ((struct sockaddr_in *)(ai)->ai_addr)->sin_addr.s_addr = addr; 1411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood /* XXX: the following is not generally correct, but does what we want */ 1431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (hints->ai_socktype) 1441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood ai->ai_socktype = hints->ai_socktype; 1451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood else 1461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood ai->ai_socktype = SOCK_STREAM; 1471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (hints->ai_protocol) 1491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood ai->ai_protocol = hints->ai_protocol; 1501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (ai); 1521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 1531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint 1551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodgetaddrinfo(const char *hostname, const char *servname, 1561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood const struct addrinfo *hints, struct addrinfo **res) 1571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 1581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood struct hostent *hp; 1591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood struct servent *sp; 1601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood struct in_addr in; 1611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood int i; 1621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood long int port; 1631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood u_long addr; 1641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood port = 0; 1661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (hints && hints->ai_family != AF_UNSPEC && 1671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood hints->ai_family != AF_INET) 1681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (EAI_FAMILY); 1691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (servname != NULL) { 1701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood char *cp; 1711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood port = strtol(servname, &cp, 10); 1731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (port > 0 && port <= 65535 && *cp == '\0') 1741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood port = htons(port); 1751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood else if ((sp = getservbyname(servname, NULL)) != NULL) 1761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood port = sp->s_port; 1771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood else 1781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood port = 0; 1791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 1801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (hints && hints->ai_flags & AI_PASSIVE) { 1821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood addr = htonl(0x00000000); 1831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (hostname && inet_aton(hostname, &in) != 0) 1841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood addr = in.s_addr; 1851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *res = malloc_ai(port, addr, hints); 1861305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (*res == NULL) 1871305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (EAI_MEMORY); 1881305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (0); 1891305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 1901305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1911305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (!hostname) { 1921305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *res = malloc_ai(port, htonl(0x7f000001), hints); 1931305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (*res == NULL) 1941305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (EAI_MEMORY); 1951305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (0); 1961305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 1971305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1981305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (inet_aton(hostname, &in)) { 1991305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *res = malloc_ai(port, in.s_addr, hints); 2001305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (*res == NULL) 2011305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (EAI_MEMORY); 2021305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (0); 2031305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 2041305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2051305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood /* Don't try DNS if AI_NUMERICHOST is set */ 2061305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (hints && hints->ai_flags & AI_NUMERICHOST) 2071305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (EAI_NONAME); 2081305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2091305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood hp = gethostbyname(hostname); 2101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (hp && hp->h_name && hp->h_name[0] && hp->h_addr_list[0]) { 2111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood struct addrinfo *cur, *prev; 2121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood cur = prev = *res = NULL; 2141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood for (i = 0; hp->h_addr_list[i]; i++) { 2151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood struct in_addr *in = (struct in_addr *)hp->h_addr_list[i]; 2161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood cur = malloc_ai(port, in->s_addr, hints); 2181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (cur == NULL) { 2191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (*res != NULL) 2201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood freeaddrinfo(*res); 2211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (EAI_MEMORY); 2221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 2231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (prev) 2241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood prev->ai_next = cur; 2251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood else 2261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *res = cur; 2271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood prev = cur; 2291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 2301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (0); 2311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 2321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (EAI_NODATA); 2341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 2351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif /* !HAVE_GETADDRINFO */ 236