11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*	$NetBSD: res_comp.c,v 1.6 2004/05/22 23:47:09 christos Exp $	*/
21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 1985, 1993
51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    The Regents of the University of California.  All rights reserved.
61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without
81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions
91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met:
101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    documentation and/or other materials provided with the distribution.
151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 3. All advertising materials mentioning features or use of this software
161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    must display the following acknowledgement:
171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 	This product includes software developed by the University of
181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 	California, Berkeley and its contributors.
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 4. Neither the name of the University nor the names of its contributors
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    may be used to endorse or promote products derived from this software
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    without specific prior written permission.
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE.
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Portions Copyright (c) 1993 by Digital Equipment Corporation.
381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this software for any
401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * purpose with or without fee is hereby granted, provided that the above
411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * copyright notice and this permission notice appear in all copies, and that
421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * the name of Digital Equipment Corporation not be used in advertising or
431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * publicity pertaining to distribution of the document or software without
441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * specific, written prior permission.
451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SOFTWARE.
541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Portions Copyright (c) 1996-1999 by Internet Software Consortium.
591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this software for any
611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * purpose with or without fee is hereby granted, provided that the above
621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * copyright notice and this permission notice appear in all copies.
631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/cdefs.h>
731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if defined(LIBC_SCCS) && !defined(lint)
741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef notdef
751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char sccsid[] = "@(#)res_comp.c	8.1 (Berkeley) 6/4/93";
761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char rcsid[] = "Id: res_comp.c,v 1.1.2.1.4.1 2004/03/09 08:33:54 marka Exp";
771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else
781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__RCSID("$NetBSD: res_comp.c,v 1.6 2004/05/22 23:47:09 christos Exp $");
791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* LIBC_SCCS and not lint */
811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/types.h>
831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/param.h>
841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <netinet/in.h>
85569fb9887d00104509df79fa77d92e3cf9afe7dbCalin Juravle#include <arpa/nameser.h>
861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <ctype.h>
871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef ANDROID_CHANGES
881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "resolv_private.h"
891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else
901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <resolv.h>
911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stdio.h>
931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <string.h>
941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <unistd.h>
951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Expand compressed domain name 'src' to full domain name.
981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 'msg' is a pointer to the begining of the message,
991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 'eom' points to the first location after the message,
1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 'dst' is a pointer to a buffer of size 'dstsiz' for the result.
1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return size of compressed name or -1 if there was an error.
1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint
1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectdn_expand(const u_char *msg, const u_char *eom, const u_char *src,
1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	  char *dst, int dstsiz)
1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int n = ns_name_uncompress(msg, eom, src, dst, (size_t)dstsiz);
1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (n > 0 && dst[0] == '.')
1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		dst[0] = '\0';
1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (n);
1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Pack domain name 'exp_dn' in presentation form into 'comp_dn'.
1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return the size of the compressed name or -1.
1171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 'length' is the size of the array pointed to by 'comp_dn'.
1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint
1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectdn_comp(const char *src, u_char *dst, int dstsiz,
1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	u_char **dnptrs, u_char **lastdnptr)
1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (ns_name_compress(src, dst, (size_t)dstsiz,
1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				 (const u_char **)dnptrs,
1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				 (const u_char **)lastdnptr));
1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Skip over a compressed domain name. Return the size or -1.
1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint
1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectdn_skipname(const u_char *ptr, const u_char *eom) {
1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	const u_char *saveptr = ptr;
1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (ns_name_skip(&ptr, eom) == -1)
1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (-1);
1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (ptr - saveptr);
1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Verify that a domain name uses an acceptable character set.
1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Note the conspicuous absence of ctype macros in these definitions.  On
1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * non-ASCII hosts, we can't depend on string literals or ctype macros to
1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * tell us anything about network-format data.  The rest of the BIND system
1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * is not careful about this, but for some reason, we're doing it right here.
1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
1503773d35eb98e22b5edab4d82fb72bdf86ff80494David 'Digit' Turner
1513773d35eb98e22b5edab4d82fb72bdf86ff80494David 'Digit' Turner/* BIONIC: We also accept underscores in the middle of labels.
1523773d35eb98e22b5edab4d82fb72bdf86ff80494David 'Digit' Turner *         This extension is needed to make resolution on some VPN networks
1533773d35eb98e22b5edab4d82fb72bdf86ff80494David 'Digit' Turner *         work properly.
1543773d35eb98e22b5edab4d82fb72bdf86ff80494David 'Digit' Turner */
1553773d35eb98e22b5edab4d82fb72bdf86ff80494David 'Digit' Turner
1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define PERIOD 0x2e
1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	hyphenchar(c) ((c) == 0x2d)
1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define bslashchar(c) ((c) == 0x5c)
1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define periodchar(c) ((c) == PERIOD)
1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define asterchar(c) ((c) == 0x2a)
1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define alphachar(c) (((c) >= 0x41 && (c) <= 0x5a) \
1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		   || ((c) >= 0x61 && (c) <= 0x7a))
1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define digitchar(c) ((c) >= 0x30 && (c) <= 0x39)
1643773d35eb98e22b5edab4d82fb72bdf86ff80494David 'Digit' Turner#define underscorechar(c)  ((c) == 0x5f)
1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define borderchar(c) (alphachar(c) || digitchar(c))
1673773d35eb98e22b5edab4d82fb72bdf86ff80494David 'Digit' Turner#define middlechar(c) (borderchar(c) || hyphenchar(c) || underscorechar(c))
1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	domainchar(c) ((c) > 0x20 && (c) < 0x7f)
1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint
1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_hnok(const char *dn) {
1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int pch = PERIOD, ch = *dn++;
1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	while (ch != '\0') {
1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		int nch = *dn++;
1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (periodchar(ch)) {
1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			;
1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		} else if (periodchar(pch)) {
1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (!borderchar(ch))
1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				return (0);
1821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		} else if (periodchar(nch) || nch == '\0') {
1831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (!borderchar(ch))
1841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				return (0);
1851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		} else {
1861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (!middlechar(ch))
1871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				return (0);
1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		pch = ch, ch = nch;
1901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
1911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (1);
1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
1951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * hostname-like (A, MX, WKS) owners can have "*" as their first label
1961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * but must otherwise be as a host name.
1971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
1981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint
1991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_ownok(const char *dn) {
2001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (asterchar(dn[0])) {
2011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (periodchar(dn[1]))
2021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			return (res_hnok(dn+2));
2031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (dn[1] == '\0')
2041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			return (1);
2051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
2061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (res_hnok(dn));
2071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
2081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
2101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SOA RNAMEs and RP RNAMEs can have any printable character in their first
2111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * label, but the rest of the name has to look like a host name.
2121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
2131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint
2141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_mailok(const char *dn) {
2151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int ch, escaped = 0;
2161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* "." is a valid missing representation */
2181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (*dn == '\0')
2191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (1);
2201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* otherwise <label>.<hostname> */
2221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	while ((ch = *dn++) != '\0') {
2231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (!domainchar(ch))
2241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			return (0);
2251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (!escaped && periodchar(ch))
2261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			break;
2271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (escaped)
2281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			escaped = 0;
2291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		else if (bslashchar(ch))
2301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			escaped = 1;
2311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
2321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (periodchar(ch))
2331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (res_hnok(dn));
2341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (0);
2351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
2361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
2381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This function is quite liberal, since RFC 1034's character sets are only
2391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * recommendations.
2401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
2411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint
2421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_dnok(const char *dn) {
2431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int ch;
2441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	while ((ch = *dn++) != '\0')
2461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (!domainchar(ch))
2471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			return (0);
2481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (1);
2491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
2501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef BIND_4_COMPAT
2521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
2531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This module must export the following externally-visible symbols:
2541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	___putlong
2551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	___putshort
2561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	__getlong
2571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	__getshort
2581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Note that one _ comes from C and the others come from us.
2591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
2601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid __putlong(u_int32_t src, u_char *dst) { ns_put32(src, dst); }
2611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid __putshort(u_int16_t src, u_char *dst) { ns_put16(src, dst); }
2621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef __ultrix__
2631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectu_int32_t _getlong(const u_char *src) { return (ns_get32(src)); }
2641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectu_int16_t _getshort(const u_char *src) { return (ns_get16(src)); }
2651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /*__ultrix__*/
2661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /*BIND_4_COMPAT*/
267