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