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