1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/*
2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Taken from OpenSSH 3.8.1p1
4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Copyright (C) 2000-2003 Damien Miller.  All rights reserved.
6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Copyright (C) 1999 WIDE Project.  All rights reserved.
7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Redistribution and use in source and binary forms, with or without
9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * modification, are permitted provided that the following conditions
10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * are met:
11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *    documentation and/or other materials provided with the distribution.
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 3. Neither the name of the project nor the names of its contributors
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *    may be used to endorse or promote products derived from this software
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *    without specific prior written permission.
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * SUCH DAMAGE.
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/*
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Pseudo-implementation of RFC2553 name / address resolution functions
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * But these functions are not implemented correctly. The minimum subset
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * is implemented for ssh use only. For example, this routine assumes
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * that ai_family is AF_INET. Don't use it for another purpose.
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "includes.h"
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* RCSID("$.Id: fake-rfc2553.c,v 1.5 2003/09/22 02:08:23 dtucker Exp $");*/
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef HAVE_GETNAMEINFO
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint getnameinfo(const struct sockaddr *sa, size_t salen, char *host,
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                size_t hostlen, char *serv, size_t servlen, int flags)
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	struct sockaddr_in *sin = (struct sockaddr_in *)sa;
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	struct hostent *hp;
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	char tmpserv[16];
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (serv != NULL) {
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		snprintf(tmpserv, sizeof(tmpserv), "%d", ntohs(sin->sin_port));
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		if (strlcpy(serv, tmpserv, servlen) >= servlen)
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			return (EAI_MEMORY);
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (host != NULL) {
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		if (flags & NI_NUMERICHOST) {
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			if (strlcpy(host, inet_ntoa(sin->sin_addr),
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			    hostlen) >= hostlen)
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				return (EAI_MEMORY);
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			else
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				return (0);
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		} else {
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			hp = gethostbyaddr((char *)&sin->sin_addr,
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			    sizeof(struct in_addr), AF_INET);
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			if (hp == NULL)
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				return (EAI_NODATA);
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			if (strlcpy(host, hp->h_name, hostlen) >= hostlen)
73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				return (EAI_MEMORY);
74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			else
75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				return (0);
76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		}
77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	return (0);
79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* !HAVE_GETNAMEINFO */
81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef HAVE_GAI_STRERROR
83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef HAVE_CONST_GAI_STRERROR_PROTO
84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectconst char *
85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectchar *
87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectgai_strerror(int err)
89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	switch (err) {
91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	case EAI_NODATA:
92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		return ("no address associated with name");
93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	case EAI_MEMORY:
94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		return ("memory allocation failure.");
95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	case EAI_NONAME:
96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		return ("nodename nor servname provided, or not known");
97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	default:
98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		return ("unknown/invalid error.");
99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* !HAVE_GAI_STRERROR */
102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef HAVE_FREEADDRINFO
104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid
105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectfreeaddrinfo(struct addrinfo *ai)
106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	struct addrinfo *next;
108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	for(; ai != NULL;) {
110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		next = ai->ai_next;
111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		free(ai);
112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		ai = next;
113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* !HAVE_FREEADDRINFO */
116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef HAVE_GETADDRINFO
118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic struct
119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectaddrinfo *malloc_ai(int port, u_long addr, const struct addrinfo *hints)
120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	struct addrinfo *ai;
122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	ai = malloc(sizeof(*ai) + sizeof(struct sockaddr_in));
124f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (ai == NULL)
125f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		return (NULL);
126f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
127f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	memset(ai, '\0', sizeof(*ai) + sizeof(struct sockaddr_in));
128f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
129f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	ai->ai_addr = (struct sockaddr *)(ai + 1);
130f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* XXX -- ssh doesn't use sa_len */
131f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	ai->ai_addrlen = sizeof(struct sockaddr_in);
132f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	ai->ai_addr->sa_family = ai->ai_family = AF_INET;
133f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
134f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	((struct sockaddr_in *)(ai)->ai_addr)->sin_port = port;
135f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	((struct sockaddr_in *)(ai)->ai_addr)->sin_addr.s_addr = addr;
136f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
137f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* XXX: the following is not generally correct, but does what we want */
138f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (hints->ai_socktype)
139f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		ai->ai_socktype = hints->ai_socktype;
140f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	else
141f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		ai->ai_socktype = SOCK_STREAM;
142f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
143f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (hints->ai_protocol)
144f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		ai->ai_protocol = hints->ai_protocol;
145f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
146f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	return (ai);
147f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
148f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
149f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint
150f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectgetaddrinfo(const char *hostname, const char *servname,
151f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    const struct addrinfo *hints, struct addrinfo **res)
152f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
153f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	struct hostent *hp;
154f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	struct servent *sp;
155f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	struct in_addr in;
156f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	int i;
157f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	long int port;
158f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	u_long addr;
159f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
160f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	port = 0;
161f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (servname != NULL) {
162f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		char *cp;
163f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
164f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		port = strtol(servname, &cp, 10);
165f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		if (port > 0 && port <= 65535 && *cp == '\0')
166f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			port = htons(port);
167f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		else if ((sp = getservbyname(servname, NULL)) != NULL)
168f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			port = sp->s_port;
169f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		else
170f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			port = 0;
171f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
172f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
173f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (hints && hints->ai_flags & AI_PASSIVE) {
174f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		addr = htonl(0x00000000);
175f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		if (hostname && inet_aton(hostname, &in) != 0)
176f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			addr = in.s_addr;
177f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		*res = malloc_ai(port, addr, hints);
178f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		if (*res == NULL)
179f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			return (EAI_MEMORY);
180f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		return (0);
181f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
182f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
183f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (!hostname) {
184f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		*res = malloc_ai(port, htonl(0x7f000001), hints);
185f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		if (*res == NULL)
186f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			return (EAI_MEMORY);
187f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		return (0);
188f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
189f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
190f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (inet_aton(hostname, &in)) {
191f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		*res = malloc_ai(port, in.s_addr, hints);
192f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		if (*res == NULL)
193f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			return (EAI_MEMORY);
194f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		return (0);
195f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
196f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
197f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* Don't try DNS if AI_NUMERICHOST is set */
198f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (hints && hints->ai_flags & AI_NUMERICHOST)
199f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		return (EAI_NONAME);
200f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
201f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	hp = gethostbyname(hostname);
202f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (hp && hp->h_name && hp->h_name[0] && hp->h_addr_list[0]) {
203f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		struct addrinfo *cur, *prev;
204f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
205f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		cur = prev = *res = NULL;
206f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		for (i = 0; hp->h_addr_list[i]; i++) {
207f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			struct in_addr *in = (struct in_addr *)hp->h_addr_list[i];
208f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
209f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			cur = malloc_ai(port, in->s_addr, hints);
210f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			if (cur == NULL) {
211f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				if (*res != NULL)
212f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project					freeaddrinfo(*res);
213f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				return (EAI_MEMORY);
214f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			}
215f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			if (prev)
216f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				prev->ai_next = cur;
217f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			else
218f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				*res = cur;
219f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
220f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			prev = cur;
221f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		}
222f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		return (0);
223f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
224f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
225f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	return (EAI_NODATA);
226f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
227f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* !HAVE_GETADDRINFO */
228