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