1d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* 2d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ++Copyright++ 1985, 1988, 1993 3d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * - 4d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Copyright (c) 1985, 1988, 1993 5d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * The Regents of the University of California. All rights reserved. 6d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 7d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Redistribution and use in source and binary forms, with or without 8d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * modification, are permitted provided that the following conditions 9d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * are met: 10d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 1. Redistributions of source code must retain the above copyright 11d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * notice, this list of conditions and the following disclaimer. 12d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 2. Redistributions in binary form must reproduce the above copyright 13d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * notice, this list of conditions and the following disclaimer in the 14d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * documentation and/or other materials provided with the distribution. 15d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 3. All advertising materials mentioning features or use of this software 16d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * must display the following acknowledgement: 17d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * This product includes software developed by the University of 18d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * California, Berkeley and its contributors. 19d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 4. Neither the name of the University nor the names of its contributors 20d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * may be used to endorse or promote products derived from this software 21d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * without specific prior written permission. 22d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 23d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * SUCH DAMAGE. 34d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * - 35d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Portions Copyright (c) 1993 by Digital Equipment Corporation. 36d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 37d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Permission to use, copy, modify, and distribute this software for any 38d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * purpose with or without fee is hereby granted, provided that the above 39d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * copyright notice and this permission notice appear in all copies, and that 40d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * the name of Digital Equipment Corporation not be used in advertising or 41d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * publicity pertaining to distribution of the document or software without 42d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * specific, written prior permission. 43d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 44d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL 45d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES 46d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT 47d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 48d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 49d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS 50d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 51d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * SOFTWARE. 52d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * - 53d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * --Copyright-- 54d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 55d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 56d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* 57d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Portions copyright (c) 1999, 2000 58d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Intel Corporation. 59d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * All rights reserved. 60d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 61d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Redistribution and use in source and binary forms, with or without 62d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * modification, are permitted provided that the following conditions 63d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * are met: 64d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 65d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 1. Redistributions of source code must retain the above copyright 66d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * notice, this list of conditions and the following disclaimer. 67d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 68d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 2. Redistributions in binary form must reproduce the above copyright 69d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * notice, this list of conditions and the following disclaimer in the 70d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * documentation and/or other materials provided with the distribution. 71d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 72d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 3. All advertising materials mentioning features or use of this software 73d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * must display the following acknowledgement: 74d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 75d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * This product includes software developed by Intel Corporation and 76d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * its contributors. 77d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 78d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 4. Neither the name of Intel Corporation or its contributors may be 79d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * used to endorse or promote products derived from this software 80d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * without specific prior written permission. 81d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 82d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION AND CONTRIBUTORS ``AS IS'' 83d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 84d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 85d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION OR CONTRIBUTORS BE 86d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 87d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 88d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 89d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 90d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 91d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 92d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THE POSSIBILITY OF SUCH DAMAGE. 93d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 94d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 95d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 96d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#if defined(LIBC_SCCS) && !defined(lint) 97d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic char sccsid[] = "@(#)gethostnamadr.c 8.1 (Berkeley) 6/4/93"; 98d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic char fromrcsid[] = "From: Id: gethnamaddr.c,v 8.23 1998/04/07 04:59:46 vixie Exp $"; 99d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic char rcsid[] = "$Id: gethostbydns.c,v 1.1.1.1 2003/11/19 01:51:27 kyu3 Exp $"; 100d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif /* LIBC_SCCS and not lint */ 101d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 102d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <sys/types.h> 103d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <sys/param.h> 104d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <sys/socket.h> 105d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <netinet/in.h> 106d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <arpa/inet.h> 107d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <arpa/nameser.h> 108d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 109d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <stdio.h> 110d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <unistd.h> 111d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <string.h> 112d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <netdb.h> 113d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <resolv.h> 114d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <ctype.h> 115d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <errno.h> 116d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef _ORG_FREEBSD_ 117d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <syslog.h> 118d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#else 119d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <stdlib.h> 120d7ce700605e1af0e455e31ec11f19ff21d26b525darylmu_int32_t _getlong(const u_char *src); 121d7ce700605e1af0e455e31ec11f19ff21d26b525darylmu_int16_t _getshort(const u_char *src); 122d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif 123d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 124d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include "res_config.h" 125d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include "Socklib_internals.h" 126d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 127d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define SPRINTF(x) ((size_t)sprintf x) 128d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 129d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define MAXALIASES 35 130d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define MAXADDRS 35 131d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 132d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic const char AskedForGot[] = 133d7ce700605e1af0e455e31ec11f19ff21d26b525darylm "gethostby*.gethostanswer: asked for \"%s\", got \"%s\""; 134d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 135d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic char *h_addr_ptrs[MAXADDRS + 1]; 136d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 137d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic struct hostent host; 138d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic char *host_aliases[MAXALIASES]; 139d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic char hostbuf[8*1024]; 140d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic u_char host_addr[16]; /* IPv4 or IPv6 */ 141d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 142d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef RESOLVSORT 143d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic void addrsort(char **, int); 144d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif 145d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 146d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#if PACKETSZ > 1024 147d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define MAXPACKET PACKETSZ 148d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#else 149d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define MAXPACKET 1024 150d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif 151d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 152d7ce700605e1af0e455e31ec11f19ff21d26b525darylmtypedef union { 153d7ce700605e1af0e455e31ec11f19ff21d26b525darylm HEADER hdr; 154d7ce700605e1af0e455e31ec11f19ff21d26b525darylm u_char buf[MAXPACKET]; 155d7ce700605e1af0e455e31ec11f19ff21d26b525darylm} querybuf; 156d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 157d7ce700605e1af0e455e31ec11f19ff21d26b525darylmtypedef union { 158d7ce700605e1af0e455e31ec11f19ff21d26b525darylm int32_t al; 159d7ce700605e1af0e455e31ec11f19ff21d26b525darylm char ac; 160d7ce700605e1af0e455e31ec11f19ff21d26b525darylm} align; 161d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 162d7ce700605e1af0e455e31ec11f19ff21d26b525darylmextern int h_errno; 163d7ce700605e1af0e455e31ec11f19ff21d26b525darylmint _dns_ttl_; 164d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 165d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef DEBUG_RES 166d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic void 167d7ce700605e1af0e455e31ec11f19ff21d26b525darylmdprintf(char *msg, int num) 168d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{ 169d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (_res.options & RES_DEBUG) { 170d7ce700605e1af0e455e31ec11f19ff21d26b525darylm int save = errno; 171d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 172d7ce700605e1af0e455e31ec11f19ff21d26b525darylm printf(msg, num); 173d7ce700605e1af0e455e31ec11f19ff21d26b525darylm errno = save; 174d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 175d7ce700605e1af0e455e31ec11f19ff21d26b525darylm} 176d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#else 177d7ce700605e1af0e455e31ec11f19ff21d26b525darylm# define dprintf(msg, num) /*nada*/ 178d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif 179d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 180d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define BOUNDED_INCR(x) \ 181d7ce700605e1af0e455e31ec11f19ff21d26b525darylm do { \ 182d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp += x; \ 183d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (cp > eom) { \ 184d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = NO_RECOVERY; \ 185d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); \ 186d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } \ 187d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } while (0) 188d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 189d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define BOUNDS_CHECK(ptr, count) \ 190d7ce700605e1af0e455e31ec11f19ff21d26b525darylm do { \ 191d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if ((ptr) + (count) > eom) { \ 192d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = NO_RECOVERY; \ 193d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); \ 194d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } \ 195d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } while (0) 196d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 197d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic struct hostent * 198d7ce700605e1af0e455e31ec11f19ff21d26b525darylmgethostanswer(const querybuf *answer, int anslen, const char *qname, int qtype) 199d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{ 200d7ce700605e1af0e455e31ec11f19ff21d26b525darylm register const HEADER *hp; 201d7ce700605e1af0e455e31ec11f19ff21d26b525darylm register const u_char *cp; 202d7ce700605e1af0e455e31ec11f19ff21d26b525darylm register int n; 203d7ce700605e1af0e455e31ec11f19ff21d26b525darylm const u_char *eom, *erdata; 204d7ce700605e1af0e455e31ec11f19ff21d26b525darylm char *bp, **ap, **hap; 205d7ce700605e1af0e455e31ec11f19ff21d26b525darylm int type, class, buflen, ancount, qdcount; 206d7ce700605e1af0e455e31ec11f19ff21d26b525darylm int haveanswer, had_error; 207d7ce700605e1af0e455e31ec11f19ff21d26b525darylm int toobig = 0; 208d7ce700605e1af0e455e31ec11f19ff21d26b525darylm char tbuf[MAXDNAME]; 209d7ce700605e1af0e455e31ec11f19ff21d26b525darylm const char *tname; 210d7ce700605e1af0e455e31ec11f19ff21d26b525darylm int (*name_ok)(const char *); 211d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 212d7ce700605e1af0e455e31ec11f19ff21d26b525darylm tname = qname; 213d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host.h_name = NULL; 214d7ce700605e1af0e455e31ec11f19ff21d26b525darylm eom = answer->buf + anslen; 215d7ce700605e1af0e455e31ec11f19ff21d26b525darylm switch (qtype) { 216d7ce700605e1af0e455e31ec11f19ff21d26b525darylm case T_A: 217d7ce700605e1af0e455e31ec11f19ff21d26b525darylm case T_AAAA: 218d7ce700605e1af0e455e31ec11f19ff21d26b525darylm name_ok = res_hnok; 219d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 220d7ce700605e1af0e455e31ec11f19ff21d26b525darylm case T_PTR: 221d7ce700605e1af0e455e31ec11f19ff21d26b525darylm name_ok = res_dnok; 222d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 223d7ce700605e1af0e455e31ec11f19ff21d26b525darylm default: 224d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = NO_RECOVERY; 225d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); /* XXX should be abort(); */ 226d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 227d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* 228d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * find first satisfactory answer 229d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 230d7ce700605e1af0e455e31ec11f19ff21d26b525darylm hp = &answer->hdr; 231d7ce700605e1af0e455e31ec11f19ff21d26b525darylm ancount = ntohs(hp->ancount); 232d7ce700605e1af0e455e31ec11f19ff21d26b525darylm qdcount = ntohs(hp->qdcount); 233d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bp = hostbuf; 234d7ce700605e1af0e455e31ec11f19ff21d26b525darylm buflen = sizeof hostbuf; 235d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp = answer->buf; 236d7ce700605e1af0e455e31ec11f19ff21d26b525darylm BOUNDED_INCR(HFIXEDSZ); 237d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (qdcount != 1) { 238d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = NO_RECOVERY; 239d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); 240d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 241d7ce700605e1af0e455e31ec11f19ff21d26b525darylm n = dn_expand(answer->buf, eom, cp, bp, buflen); 242d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if ((n < 0) || !(*name_ok)(bp)) { 243d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = NO_RECOVERY; 244d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); 245d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 246d7ce700605e1af0e455e31ec11f19ff21d26b525darylm BOUNDED_INCR(n + QFIXEDSZ); 247d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (qtype == T_A || qtype == T_AAAA) { 248d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* res_send() has already verified that the query name is the 249d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * same as the one we sent; this just gets the expanded name 250d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * (i.e., with the succeeding search-domain tacked on). 251d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 252d7ce700605e1af0e455e31ec11f19ff21d26b525darylm n = (int)strlen(bp) + 1; /* for the \0 */ 253d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (n >= MAXHOSTNAMELEN) { 254d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = NO_RECOVERY; 255d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); 256d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 257d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host.h_name = bp; 258d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bp += n; 259d7ce700605e1af0e455e31ec11f19ff21d26b525darylm buflen -= n; 260d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* The qname can be abbreviated, but h_name is now absolute. */ 261d7ce700605e1af0e455e31ec11f19ff21d26b525darylm qname = host.h_name; 262d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 263d7ce700605e1af0e455e31ec11f19ff21d26b525darylm ap = host_aliases; 264d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *ap = NULL; 265d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host.h_aliases = host_aliases; 266d7ce700605e1af0e455e31ec11f19ff21d26b525darylm hap = h_addr_ptrs; 267d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *hap = NULL; 268d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host.h_addr_list = h_addr_ptrs; 269d7ce700605e1af0e455e31ec11f19ff21d26b525darylm haveanswer = 0; 270d7ce700605e1af0e455e31ec11f19ff21d26b525darylm had_error = 0; 271d7ce700605e1af0e455e31ec11f19ff21d26b525darylm _dns_ttl_ = -1; 272d7ce700605e1af0e455e31ec11f19ff21d26b525darylm while (ancount-- > 0 && cp < eom && !had_error) { 273d7ce700605e1af0e455e31ec11f19ff21d26b525darylm n = dn_expand(answer->buf, eom, cp, bp, buflen); 274d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if ((n < 0) || !(*name_ok)(bp)) { 275d7ce700605e1af0e455e31ec11f19ff21d26b525darylm had_error++; 276d7ce700605e1af0e455e31ec11f19ff21d26b525darylm continue; 277d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 278d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp += n; /* name */ 279d7ce700605e1af0e455e31ec11f19ff21d26b525darylm BOUNDS_CHECK(cp, 3 * INT16SZ + INT32SZ); 280d7ce700605e1af0e455e31ec11f19ff21d26b525darylm type = _getshort(cp); 281d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp += INT16SZ; /* type */ 282d7ce700605e1af0e455e31ec11f19ff21d26b525darylm class = _getshort(cp); 283d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp += INT16SZ; /* class */ 284d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (qtype == T_A && type == T_A) 285d7ce700605e1af0e455e31ec11f19ff21d26b525darylm _dns_ttl_ = _getlong(cp); 286d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp += INT32SZ; /* TTL */ 287d7ce700605e1af0e455e31ec11f19ff21d26b525darylm n = _getshort(cp); 288d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp += INT16SZ; /* len */ 289d7ce700605e1af0e455e31ec11f19ff21d26b525darylm BOUNDS_CHECK(cp, n); 290d7ce700605e1af0e455e31ec11f19ff21d26b525darylm erdata = cp + n; 291d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (class != C_IN) { 292d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* XXX - debug? syslog? */ 293d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp += n; 294d7ce700605e1af0e455e31ec11f19ff21d26b525darylm continue; /* XXX - had_error++ ? */ 295d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 296d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if ((qtype == T_A || qtype == T_AAAA) && type == T_CNAME) { 297d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (ap >= &host_aliases[MAXALIASES-1]) 298d7ce700605e1af0e455e31ec11f19ff21d26b525darylm continue; 299d7ce700605e1af0e455e31ec11f19ff21d26b525darylm n = dn_expand(answer->buf, eom, cp, tbuf, sizeof tbuf); 300d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if ((n < 0) || !(*name_ok)(tbuf)) { 301d7ce700605e1af0e455e31ec11f19ff21d26b525darylm had_error++; 302d7ce700605e1af0e455e31ec11f19ff21d26b525darylm continue; 303d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 304d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp += n; 305d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (cp != erdata) { 306d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = NO_RECOVERY; 307d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); 308d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 309d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* Store alias. */ 310d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *ap++ = bp; 311d7ce700605e1af0e455e31ec11f19ff21d26b525darylm n = (int)strlen(bp) + 1; /* for the \0 */ 312d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (n >= MAXHOSTNAMELEN) { 313d7ce700605e1af0e455e31ec11f19ff21d26b525darylm had_error++; 314d7ce700605e1af0e455e31ec11f19ff21d26b525darylm continue; 315d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 316d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bp += n; 317d7ce700605e1af0e455e31ec11f19ff21d26b525darylm buflen -= n; 318d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* Get canonical name. */ 319d7ce700605e1af0e455e31ec11f19ff21d26b525darylm n = (int)strlen(tbuf) + 1; /* for the \0 */ 320d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (n > buflen || n >= MAXHOSTNAMELEN) { 321d7ce700605e1af0e455e31ec11f19ff21d26b525darylm had_error++; 322d7ce700605e1af0e455e31ec11f19ff21d26b525darylm continue; 323d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 324d7ce700605e1af0e455e31ec11f19ff21d26b525darylm strcpy(bp, tbuf); 325d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host.h_name = bp; 326d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bp += n; 327d7ce700605e1af0e455e31ec11f19ff21d26b525darylm buflen -= n; 328d7ce700605e1af0e455e31ec11f19ff21d26b525darylm continue; 329d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 330d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (qtype == T_PTR && type == T_CNAME) { 331d7ce700605e1af0e455e31ec11f19ff21d26b525darylm n = dn_expand(answer->buf, eom, cp, tbuf, sizeof tbuf); 332d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (n < 0 || !res_dnok(tbuf)) { 333d7ce700605e1af0e455e31ec11f19ff21d26b525darylm had_error++; 334d7ce700605e1af0e455e31ec11f19ff21d26b525darylm continue; 335d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 336d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp += n; 337d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (cp != erdata) { 338d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = NO_RECOVERY; 339d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); 340d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 341d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* Get canonical name. */ 342d7ce700605e1af0e455e31ec11f19ff21d26b525darylm n = (int)strlen(tbuf) + 1; /* for the \0 */ 343d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (n > buflen || n >= MAXHOSTNAMELEN) { 344d7ce700605e1af0e455e31ec11f19ff21d26b525darylm had_error++; 345d7ce700605e1af0e455e31ec11f19ff21d26b525darylm continue; 346d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 347d7ce700605e1af0e455e31ec11f19ff21d26b525darylm strcpy(bp, tbuf); 348d7ce700605e1af0e455e31ec11f19ff21d26b525darylm tname = bp; 349d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bp += n; 350d7ce700605e1af0e455e31ec11f19ff21d26b525darylm buflen -= n; 351d7ce700605e1af0e455e31ec11f19ff21d26b525darylm continue; 352d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 353d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (type != qtype) { 354d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef _ORG_FREEBSD_ 355d7ce700605e1af0e455e31ec11f19ff21d26b525darylm syslog(LOG_NOTICE|LOG_AUTH, 356d7ce700605e1af0e455e31ec11f19ff21d26b525darylm "gethostby*.gethostanswer: asked for \"%s %s %s\", got type \"%s\"", 357d7ce700605e1af0e455e31ec11f19ff21d26b525darylm qname, p_class(C_IN), p_type(qtype), 358d7ce700605e1af0e455e31ec11f19ff21d26b525darylm p_type(type)); 359d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif 360d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp += n; 361d7ce700605e1af0e455e31ec11f19ff21d26b525darylm continue; /* XXX - had_error++ ? */ 362d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 363d7ce700605e1af0e455e31ec11f19ff21d26b525darylm switch (type) { 364d7ce700605e1af0e455e31ec11f19ff21d26b525darylm case T_PTR: 365d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (strcasecmp(tname, bp) != 0) { 366d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef _ORG_FREEBSD_ 367d7ce700605e1af0e455e31ec11f19ff21d26b525darylm syslog(LOG_NOTICE|LOG_AUTH, 368d7ce700605e1af0e455e31ec11f19ff21d26b525darylm AskedForGot, qname, bp); 369d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif 370d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp += n; 371d7ce700605e1af0e455e31ec11f19ff21d26b525darylm continue; /* XXX - had_error++ ? */ 372d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 373d7ce700605e1af0e455e31ec11f19ff21d26b525darylm n = dn_expand(answer->buf, eom, cp, bp, buflen); 374d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if ((n < 0) || !res_hnok(bp)) { 375d7ce700605e1af0e455e31ec11f19ff21d26b525darylm had_error++; 376d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 377d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 378d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#if MULTI_PTRS_ARE_ALIASES 379d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp += n; 380d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (cp != erdata) { 381d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = NO_RECOVERY; 382d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); 383d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 384d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (!haveanswer) 385d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host.h_name = bp; 386d7ce700605e1af0e455e31ec11f19ff21d26b525darylm else if (ap < &host_aliases[MAXALIASES-1]) 387d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *ap++ = bp; 388d7ce700605e1af0e455e31ec11f19ff21d26b525darylm else 389d7ce700605e1af0e455e31ec11f19ff21d26b525darylm n = -1; 390d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (n != -1) { 391d7ce700605e1af0e455e31ec11f19ff21d26b525darylm n = (int)strlen(bp) + 1; /* for the \0 */ 392d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (n >= MAXHOSTNAMELEN) { 393d7ce700605e1af0e455e31ec11f19ff21d26b525darylm had_error++; 394d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 395d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 396d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bp += n; 397d7ce700605e1af0e455e31ec11f19ff21d26b525darylm buflen -= n; 398d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 399d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 400d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#else 401d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host.h_name = bp; 402d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (_res.options & RES_USE_INET6) { 403d7ce700605e1af0e455e31ec11f19ff21d26b525darylm n = strlen(bp) + 1; /* for the \0 */ 404d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (n >= MAXHOSTNAMELEN) { 405d7ce700605e1af0e455e31ec11f19ff21d26b525darylm had_error++; 406d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 407d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 408d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bp += n; 409d7ce700605e1af0e455e31ec11f19ff21d26b525darylm buflen -= n; 410d7ce700605e1af0e455e31ec11f19ff21d26b525darylm _map_v4v6_hostent(&host, &bp, &buflen); 411d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 412d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = NETDB_SUCCESS; 413d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (&host); 414d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif 415d7ce700605e1af0e455e31ec11f19ff21d26b525darylm case T_A: 416d7ce700605e1af0e455e31ec11f19ff21d26b525darylm case T_AAAA: 417d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (strcasecmp(host.h_name, bp) != 0) { 418d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef _ORG_FREEBSD_ 419d7ce700605e1af0e455e31ec11f19ff21d26b525darylm syslog(LOG_NOTICE|LOG_AUTH, 420d7ce700605e1af0e455e31ec11f19ff21d26b525darylm AskedForGot, host.h_name, bp); 421d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif 422d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp += n; 423d7ce700605e1af0e455e31ec11f19ff21d26b525darylm continue; /* XXX - had_error++ ? */ 424d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 425d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (n != host.h_length) { 426d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp += n; 427d7ce700605e1af0e455e31ec11f19ff21d26b525darylm continue; 428d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 429d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (!haveanswer) { 430d7ce700605e1af0e455e31ec11f19ff21d26b525darylm register int nn; 431d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 432d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host.h_name = bp; 433d7ce700605e1af0e455e31ec11f19ff21d26b525darylm nn = (int)strlen(bp) + 1; /* for the \0 */ 434d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bp += nn; 435d7ce700605e1af0e455e31ec11f19ff21d26b525darylm buflen -= nn; 436d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 437d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 438d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bp += sizeof(align) - ((size_t)bp % sizeof(align)); 439d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 440d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (bp + n >= &hostbuf[sizeof hostbuf]) { 441d7ce700605e1af0e455e31ec11f19ff21d26b525darylm dprintf("size (%d) too big\n", n); 442d7ce700605e1af0e455e31ec11f19ff21d26b525darylm had_error++; 443d7ce700605e1af0e455e31ec11f19ff21d26b525darylm continue; 444d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 445d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (hap >= &h_addr_ptrs[MAXADDRS-1]) { 446d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (!toobig++) 447d7ce700605e1af0e455e31ec11f19ff21d26b525darylm dprintf("Too many addresses (%d)\n", 448d7ce700605e1af0e455e31ec11f19ff21d26b525darylm MAXADDRS); 449d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp += n; 450d7ce700605e1af0e455e31ec11f19ff21d26b525darylm continue; 451d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 452d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *hap++ = bp; 453d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bcopy(cp, bp, n); 454d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bp += n; 455d7ce700605e1af0e455e31ec11f19ff21d26b525darylm buflen -= n; 456d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp += n; 457d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (cp != erdata) { 458d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = NO_RECOVERY; 459d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); 460d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 461d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 462d7ce700605e1af0e455e31ec11f19ff21d26b525darylm default: 463d7ce700605e1af0e455e31ec11f19ff21d26b525darylm dprintf("Impossible condition (type=%d)\n", type); 464d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = NO_RECOVERY; 465d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); 466d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* BIND has abort() here, too risky on bad data */ 467d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 468d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (!had_error) 469d7ce700605e1af0e455e31ec11f19ff21d26b525darylm haveanswer++; 470d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 471d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (haveanswer) { 472d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *ap = NULL; 473d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *hap = NULL; 474d7ce700605e1af0e455e31ec11f19ff21d26b525darylm# if defined(RESOLVSORT) 475d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* 476d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Note: we sort even if host can take only one address 477d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * in its return structures - should give it the "best" 478d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * address in that case, not some random one 479d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 480d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (_res.nsort && haveanswer > 1 && qtype == T_A) 481d7ce700605e1af0e455e31ec11f19ff21d26b525darylm addrsort(h_addr_ptrs, haveanswer); 482d7ce700605e1af0e455e31ec11f19ff21d26b525darylm# endif /*RESOLVSORT*/ 483d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (!host.h_name) { 484d7ce700605e1af0e455e31ec11f19ff21d26b525darylm n = (int)strlen(qname) + 1; /* for the \0 */ 485d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (n > buflen || n >= MAXHOSTNAMELEN) 486d7ce700605e1af0e455e31ec11f19ff21d26b525darylm goto no_recovery; 487d7ce700605e1af0e455e31ec11f19ff21d26b525darylm strcpy(bp, qname); 488d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host.h_name = bp; 489d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bp += n; 490d7ce700605e1af0e455e31ec11f19ff21d26b525darylm buflen -= n; 491d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 492d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (_res.options & RES_USE_INET6) 493d7ce700605e1af0e455e31ec11f19ff21d26b525darylm _map_v4v6_hostent(&host, &bp, &buflen); 494d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = NETDB_SUCCESS; 495d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (&host); 496d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 497d7ce700605e1af0e455e31ec11f19ff21d26b525darylm no_recovery: 498d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = NO_RECOVERY; 499d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); 500d7ce700605e1af0e455e31ec11f19ff21d26b525darylm} 501d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 502d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstruct hostent * 503d7ce700605e1af0e455e31ec11f19ff21d26b525darylm__dns_getanswer(const char *answer, int anslen, const char *qname, int qtype) 504d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{ 505d7ce700605e1af0e455e31ec11f19ff21d26b525darylm switch(qtype) { 506d7ce700605e1af0e455e31ec11f19ff21d26b525darylm case T_AAAA: 507d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host.h_addrtype = AF_INET6; 508d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host.h_length = IN6ADDRSZ; 509d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 510d7ce700605e1af0e455e31ec11f19ff21d26b525darylm case T_A: 511d7ce700605e1af0e455e31ec11f19ff21d26b525darylm default: 512d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host.h_addrtype = AF_INET; 513d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host.h_length = INADDRSZ; 514d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 515d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 516d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 517d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return(gethostanswer((const querybuf *)answer, anslen, qname, qtype)); 518d7ce700605e1af0e455e31ec11f19ff21d26b525darylm} 519d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 520d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstruct hostent * 521d7ce700605e1af0e455e31ec11f19ff21d26b525darylm_gethostbydnsname(const char *name, int af) 522d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{ 523d7ce700605e1af0e455e31ec11f19ff21d26b525darylm querybuf buf; 524d7ce700605e1af0e455e31ec11f19ff21d26b525darylm register const char *cp; 525d7ce700605e1af0e455e31ec11f19ff21d26b525darylm char *bp; 526d7ce700605e1af0e455e31ec11f19ff21d26b525darylm int n, size, type, len; 527d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 528d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if ((_res.options & RES_INIT) == 0 && res_init() == -1) { 529d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = NETDB_INTERNAL; 530d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); 531d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 532d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 533d7ce700605e1af0e455e31ec11f19ff21d26b525darylm switch (af) { 534d7ce700605e1af0e455e31ec11f19ff21d26b525darylm case AF_INET: 535d7ce700605e1af0e455e31ec11f19ff21d26b525darylm size = INADDRSZ; 536d7ce700605e1af0e455e31ec11f19ff21d26b525darylm type = T_A; 537d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 538d7ce700605e1af0e455e31ec11f19ff21d26b525darylm case AF_INET6: 539d7ce700605e1af0e455e31ec11f19ff21d26b525darylm size = IN6ADDRSZ; 540d7ce700605e1af0e455e31ec11f19ff21d26b525darylm type = T_AAAA; 541d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 542d7ce700605e1af0e455e31ec11f19ff21d26b525darylm default: 543d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = NETDB_INTERNAL; 544d7ce700605e1af0e455e31ec11f19ff21d26b525darylm errno = EAFNOSUPPORT; 545d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); 546d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 547d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 548d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host.h_addrtype = af; 549d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host.h_length = size; 550d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 551d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* 552d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * if there aren't any dots, it could be a user-level alias. 553d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * this is also done in res_query() since we are not the only 554d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * function that looks up host names. 555d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 556d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (!strchr(name, '.') && ( NULL != (cp = __hostalias(name)))) 557d7ce700605e1af0e455e31ec11f19ff21d26b525darylm name = cp; 558d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 559d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* 560d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * disallow names consisting only of digits/dots, unless 561d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * they end in a dot. 562d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 563d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (isdigit(name[0])) 564d7ce700605e1af0e455e31ec11f19ff21d26b525darylm for (cp = name;; ++cp) { 565d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (!*cp) { 566d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (*--cp == '.') 567d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 568d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* 569d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * All-numeric, no dot at the end. 570d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Fake up a hostent as if we'd actually 571d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * done a lookup. 572d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 573d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (inet_pton(af, name, host_addr) <= 0) { 574d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = HOST_NOT_FOUND; 575d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); 576d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 577d7ce700605e1af0e455e31ec11f19ff21d26b525darylm strncpy(hostbuf, name, MAXDNAME); 578d7ce700605e1af0e455e31ec11f19ff21d26b525darylm hostbuf[MAXDNAME] = '\0'; 579d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bp = hostbuf + MAXDNAME; 580d7ce700605e1af0e455e31ec11f19ff21d26b525darylm len = sizeof hostbuf - MAXDNAME; 581d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host.h_name = hostbuf; 582d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host.h_aliases = host_aliases; 583d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host_aliases[0] = NULL; 584d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_addr_ptrs[0] = (char *)host_addr; 585d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_addr_ptrs[1] = NULL; 586d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host.h_addr_list = h_addr_ptrs; 587d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (_res.options & RES_USE_INET6) 588d7ce700605e1af0e455e31ec11f19ff21d26b525darylm _map_v4v6_hostent(&host, &bp, &len); 589d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = NETDB_SUCCESS; 590d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (&host); 591d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 592d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (!isdigit(*cp) && *cp != '.') 593d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 594d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 595d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if ((isxdigit(name[0]) && strchr(name, ':') != NULL) || 596d7ce700605e1af0e455e31ec11f19ff21d26b525darylm name[0] == ':') 597d7ce700605e1af0e455e31ec11f19ff21d26b525darylm for (cp = name;; ++cp) { 598d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (!*cp) { 599d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (*--cp == '.') 600d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 601d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* 602d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * All-IPv6-legal, no dot at the end. 603d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Fake up a hostent as if we'd actually 604d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * done a lookup. 605d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 606d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (inet_pton(af, name, host_addr) <= 0) { 607d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = HOST_NOT_FOUND; 608d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); 609d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 610d7ce700605e1af0e455e31ec11f19ff21d26b525darylm strncpy(hostbuf, name, MAXDNAME); 611d7ce700605e1af0e455e31ec11f19ff21d26b525darylm hostbuf[MAXDNAME] = '\0'; 612d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bp = hostbuf + MAXDNAME; 613d7ce700605e1af0e455e31ec11f19ff21d26b525darylm len = sizeof hostbuf - MAXDNAME; 614d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host.h_name = hostbuf; 615d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host.h_aliases = host_aliases; 616d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host_aliases[0] = NULL; 617d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_addr_ptrs[0] = (char *)host_addr; 618d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_addr_ptrs[1] = NULL; 619d7ce700605e1af0e455e31ec11f19ff21d26b525darylm host.h_addr_list = h_addr_ptrs; 620d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = NETDB_SUCCESS; 621d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (&host); 622d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 623d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (!isxdigit(*cp) && *cp != ':' && *cp != '.') 624d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 625d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 626d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 627d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if ((n = res_search(name, C_IN, type, buf.buf, sizeof(buf))) < 0) { 628d7ce700605e1af0e455e31ec11f19ff21d26b525darylm dprintf("res_search failed (%d)\n", n); 629d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); 630d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 631d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (gethostanswer(&buf, n, name, type)); 632d7ce700605e1af0e455e31ec11f19ff21d26b525darylm} 633d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 634d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstruct hostent * 635d7ce700605e1af0e455e31ec11f19ff21d26b525darylm_gethostbydnsaddr(const char *addr, int len, int af) 636d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{ 637d7ce700605e1af0e455e31ec11f19ff21d26b525darylm const u_char *uaddr = (const u_char *)addr; 638d7ce700605e1af0e455e31ec11f19ff21d26b525darylm static const u_char mapped[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0xff,0xff }; 639d7ce700605e1af0e455e31ec11f19ff21d26b525darylm static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 }; 640d7ce700605e1af0e455e31ec11f19ff21d26b525darylm int n, size; 641d7ce700605e1af0e455e31ec11f19ff21d26b525darylm querybuf buf; 642d7ce700605e1af0e455e31ec11f19ff21d26b525darylm register struct hostent *hp; 643d7ce700605e1af0e455e31ec11f19ff21d26b525darylm char qbuf[MAXDNAME+1], *qp; 644d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef SUNSECURITY 645d7ce700605e1af0e455e31ec11f19ff21d26b525darylm register struct hostent *rhp; 646d7ce700605e1af0e455e31ec11f19ff21d26b525darylm char **haddr; 647d7ce700605e1af0e455e31ec11f19ff21d26b525darylm u_long old_options; 648d7ce700605e1af0e455e31ec11f19ff21d26b525darylm char hname2[MAXDNAME+1]; 649d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif /*SUNSECURITY*/ 650d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 651d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if ((_res.options & RES_INIT) == 0 && res_init() == -1) { 652d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = NETDB_INTERNAL; 653d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); 654d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 655d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (af == AF_INET6 && len == IN6ADDRSZ && 656d7ce700605e1af0e455e31ec11f19ff21d26b525darylm (!bcmp(uaddr, mapped, sizeof mapped) || 657d7ce700605e1af0e455e31ec11f19ff21d26b525darylm !bcmp(uaddr, tunnelled, sizeof tunnelled))) { 658d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* Unmap. */ 659d7ce700605e1af0e455e31ec11f19ff21d26b525darylm addr += sizeof mapped; 660d7ce700605e1af0e455e31ec11f19ff21d26b525darylm uaddr += sizeof mapped; 661d7ce700605e1af0e455e31ec11f19ff21d26b525darylm af = AF_INET; 662d7ce700605e1af0e455e31ec11f19ff21d26b525darylm len = INADDRSZ; 663d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 664d7ce700605e1af0e455e31ec11f19ff21d26b525darylm switch (af) { 665d7ce700605e1af0e455e31ec11f19ff21d26b525darylm case AF_INET: 666d7ce700605e1af0e455e31ec11f19ff21d26b525darylm size = INADDRSZ; 667d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 668d7ce700605e1af0e455e31ec11f19ff21d26b525darylm case AF_INET6: 669d7ce700605e1af0e455e31ec11f19ff21d26b525darylm size = IN6ADDRSZ; 670d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 671d7ce700605e1af0e455e31ec11f19ff21d26b525darylm default: 672d7ce700605e1af0e455e31ec11f19ff21d26b525darylm errno = EAFNOSUPPORT; 673d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = NETDB_INTERNAL; 674d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); 675d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 676d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (size != len) { 677d7ce700605e1af0e455e31ec11f19ff21d26b525darylm errno = EINVAL; 678d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = NETDB_INTERNAL; 679d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); 680d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 681d7ce700605e1af0e455e31ec11f19ff21d26b525darylm switch (af) { 682d7ce700605e1af0e455e31ec11f19ff21d26b525darylm case AF_INET: 683d7ce700605e1af0e455e31ec11f19ff21d26b525darylm (void) sprintf(qbuf, "%u.%u.%u.%u.in-addr.arpa", 684d7ce700605e1af0e455e31ec11f19ff21d26b525darylm (uaddr[3] & 0xff), 685d7ce700605e1af0e455e31ec11f19ff21d26b525darylm (uaddr[2] & 0xff), 686d7ce700605e1af0e455e31ec11f19ff21d26b525darylm (uaddr[1] & 0xff), 687d7ce700605e1af0e455e31ec11f19ff21d26b525darylm (uaddr[0] & 0xff)); 688d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 689d7ce700605e1af0e455e31ec11f19ff21d26b525darylm case AF_INET6: 690d7ce700605e1af0e455e31ec11f19ff21d26b525darylm qp = qbuf; 691d7ce700605e1af0e455e31ec11f19ff21d26b525darylm for (n = IN6ADDRSZ - 1; n >= 0; n--) { 692d7ce700605e1af0e455e31ec11f19ff21d26b525darylm qp += SPRINTF((qp, "%x.%x.", 693d7ce700605e1af0e455e31ec11f19ff21d26b525darylm uaddr[n] & 0xf, 694d7ce700605e1af0e455e31ec11f19ff21d26b525darylm (uaddr[n] >> 4) & 0xf)); 695d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 696d7ce700605e1af0e455e31ec11f19ff21d26b525darylm strcpy(qp, "ip6.int"); 697d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 698d7ce700605e1af0e455e31ec11f19ff21d26b525darylm default: 699d7ce700605e1af0e455e31ec11f19ff21d26b525darylm abort(); 700d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 701d7ce700605e1af0e455e31ec11f19ff21d26b525darylm n = res_query(qbuf, C_IN, T_PTR, (u_char *)buf.buf, sizeof buf.buf); 702d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (n < 0) { 703d7ce700605e1af0e455e31ec11f19ff21d26b525darylm dprintf("res_query failed (%d)\n", n); 704d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); 705d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 706d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if ( NULL == (hp = gethostanswer(&buf, n, qbuf, T_PTR))) 707d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); /* h_errno was set by gethostanswer() */ 708d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef SUNSECURITY 709d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (af == AF_INET) { 710d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* 711d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * turn off search as the name should be absolute, 712d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 'localhost' should be matched by defnames 713d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 714d7ce700605e1af0e455e31ec11f19ff21d26b525darylm strncpy(hname2, hp->h_name, MAXDNAME); 715d7ce700605e1af0e455e31ec11f19ff21d26b525darylm hname2[MAXDNAME] = '\0'; 716d7ce700605e1af0e455e31ec11f19ff21d26b525darylm old_options = _res.options; 717d7ce700605e1af0e455e31ec11f19ff21d26b525darylm _res.options &= ~RES_DNSRCH; 718d7ce700605e1af0e455e31ec11f19ff21d26b525darylm _res.options |= RES_DEFNAMES; 719d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (!(rhp = gethostbyname(hname2))) { 720d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef _ORG_FREEBSD_ 721d7ce700605e1af0e455e31ec11f19ff21d26b525darylm syslog(LOG_NOTICE|LOG_AUTH, 722d7ce700605e1af0e455e31ec11f19ff21d26b525darylm "gethostbyaddr: No A record for %s (verifying [%s])", 723d7ce700605e1af0e455e31ec11f19ff21d26b525darylm hname2, inet_ntoa(*((struct in_addr *)addr))); 724d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif 725d7ce700605e1af0e455e31ec11f19ff21d26b525darylm _res.options = old_options; 726d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = HOST_NOT_FOUND; 727d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); 728d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 729d7ce700605e1af0e455e31ec11f19ff21d26b525darylm _res.options = old_options; 730d7ce700605e1af0e455e31ec11f19ff21d26b525darylm for (haddr = rhp->h_addr_list; *haddr; haddr++) 731d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (!memcmp(*haddr, addr, INADDRSZ)) 732d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 733d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (!*haddr) { 734d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef _ORG_FREEBSD_ 735d7ce700605e1af0e455e31ec11f19ff21d26b525darylm syslog(LOG_NOTICE|LOG_AUTH, 736d7ce700605e1af0e455e31ec11f19ff21d26b525darylm "gethostbyaddr: A record of %s != PTR record [%s]", 737d7ce700605e1af0e455e31ec11f19ff21d26b525darylm hname2, inet_ntoa(*((struct in_addr *)addr))); 738d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif 739d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = HOST_NOT_FOUND; 740d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); 741d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 742d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 743d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif /*SUNSECURITY*/ 744d7ce700605e1af0e455e31ec11f19ff21d26b525darylm hp->h_addrtype = af; 745d7ce700605e1af0e455e31ec11f19ff21d26b525darylm hp->h_length = len; 746d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bcopy(addr, host_addr, len); 747d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_addr_ptrs[0] = (char *)host_addr; 748d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_addr_ptrs[1] = NULL; 749d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (af == AF_INET && (_res.options & RES_USE_INET6)) { 750d7ce700605e1af0e455e31ec11f19ff21d26b525darylm _map_v4v6_address((char*)host_addr, (char*)host_addr); 751d7ce700605e1af0e455e31ec11f19ff21d26b525darylm hp->h_addrtype = AF_INET6; 752d7ce700605e1af0e455e31ec11f19ff21d26b525darylm hp->h_length = IN6ADDRSZ; 753d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 754d7ce700605e1af0e455e31ec11f19ff21d26b525darylm h_errno = NETDB_SUCCESS; 755d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (hp); 756d7ce700605e1af0e455e31ec11f19ff21d26b525darylm} 757d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 758d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef RESOLVSORT 759d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic void 760d7ce700605e1af0e455e31ec11f19ff21d26b525darylmaddrsort(char **ap, int num) 761d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{ 762d7ce700605e1af0e455e31ec11f19ff21d26b525darylm short i, j; 763d7ce700605e1af0e455e31ec11f19ff21d26b525darylm char **p; 764d7ce700605e1af0e455e31ec11f19ff21d26b525darylm short aval[MAXADDRS]; 765d7ce700605e1af0e455e31ec11f19ff21d26b525darylm short needsort = 0; 766d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 767d7ce700605e1af0e455e31ec11f19ff21d26b525darylm p = ap; 768d7ce700605e1af0e455e31ec11f19ff21d26b525darylm for (i = 0; i < num; i++, p++) { 769d7ce700605e1af0e455e31ec11f19ff21d26b525darylm for (j = 0 ; (unsigned)j < _res.nsort; j++) 770d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (_res.sort_list[j].addr.s_addr == 771d7ce700605e1af0e455e31ec11f19ff21d26b525darylm (((struct in_addr *)(*p))->s_addr & _res.sort_list[j].mask)) 772d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 773d7ce700605e1af0e455e31ec11f19ff21d26b525darylm aval[i] = j; 774d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (needsort == 0 && i > 0 && j < aval[i-1]) 775d7ce700605e1af0e455e31ec11f19ff21d26b525darylm needsort = i; 776d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 777d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (!needsort) 778d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return; 779d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 780d7ce700605e1af0e455e31ec11f19ff21d26b525darylm while (needsort < num) { 781d7ce700605e1af0e455e31ec11f19ff21d26b525darylm for (j = needsort - 1; j >= 0; j--) { 782d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (aval[j] > aval[j+1]) { 783d7ce700605e1af0e455e31ec11f19ff21d26b525darylm char *hp; 784d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 785d7ce700605e1af0e455e31ec11f19ff21d26b525darylm i = aval[j]; 786d7ce700605e1af0e455e31ec11f19ff21d26b525darylm aval[j] = aval[j+1]; 787d7ce700605e1af0e455e31ec11f19ff21d26b525darylm aval[j+1] = i; 788d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 789d7ce700605e1af0e455e31ec11f19ff21d26b525darylm hp = ap[j]; 790d7ce700605e1af0e455e31ec11f19ff21d26b525darylm ap[j] = ap[j+1]; 791d7ce700605e1af0e455e31ec11f19ff21d26b525darylm ap[j+1] = hp; 792d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 793d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } else 794d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 795d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 796d7ce700605e1af0e455e31ec11f19ff21d26b525darylm needsort++; 797d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 798d7ce700605e1af0e455e31ec11f19ff21d26b525darylm} 799d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif 800d7ce700605e1af0e455e31ec11f19ff21d26b525darylmvoid 801d7ce700605e1af0e455e31ec11f19ff21d26b525darylm_sethostdnsent(int stayopen) 802d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{ 803d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if ((_res.options & RES_INIT) == 0 && res_init() == -1) 804d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return; 805d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (stayopen) 806d7ce700605e1af0e455e31ec11f19ff21d26b525darylm _res.options |= RES_STAYOPEN | RES_USEVC; 807d7ce700605e1af0e455e31ec11f19ff21d26b525darylm} 808d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 809d7ce700605e1af0e455e31ec11f19ff21d26b525darylmvoid 810d7ce700605e1af0e455e31ec11f19ff21d26b525darylm_endhostdnsent() 811d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{ 812d7ce700605e1af0e455e31ec11f19ff21d26b525darylm _res.options &= ~(RES_STAYOPEN | RES_USEVC); 813d7ce700605e1af0e455e31ec11f19ff21d26b525darylm res_close(); 814d7ce700605e1af0e455e31ec11f19ff21d26b525darylm} 815