10e565888ee40264bfad5a700e0d62f4824d81c18Olivier Martin/** @file 20e565888ee40264bfad5a700e0d62f4824d81c18Olivier Martin Copyright (c) 1999 - 2014, Intel Corporation. All rights reserved.<BR> 30e565888ee40264bfad5a700e0d62f4824d81c18Olivier Martin This program and the accompanying materials are licensed and made available 40e565888ee40264bfad5a700e0d62f4824d81c18Olivier Martin under the terms and conditions of the BSD License which accompanies this 50e565888ee40264bfad5a700e0d62f4824d81c18Olivier Martin distribution. The full text of the license may be found at 60e565888ee40264bfad5a700e0d62f4824d81c18Olivier Martin http://opensource.org/licenses/bsd-license.php. 70e565888ee40264bfad5a700e0d62f4824d81c18Olivier Martin 80e565888ee40264bfad5a700e0d62f4824d81c18Olivier Martin THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 90e565888ee40264bfad5a700e0d62f4824d81c18Olivier Martin WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 100e565888ee40264bfad5a700e0d62f4824d81c18Olivier Martin**/ 11d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* 12d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Copyright (c) 1985, 1993 13d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * The Regents of the University of California. All rights reserved. 14d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 15d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Portions copyright (c) 1999, 2000 16d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Intel Corporation. 17d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * All rights reserved. 18d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 19d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Redistribution and use in source and binary forms, with or without 20d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * modification, are permitted provided that the following conditions 21d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * are met: 22d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 23d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 1. Redistributions of source code must retain the above copyright 24d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * notice, this list of conditions and the following disclaimer. 25d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 26d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 2. Redistributions in binary form must reproduce the above copyright 27d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * notice, this list of conditions and the following disclaimer in the 28d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * documentation and/or other materials provided with the distribution. 29d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 30d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 3. All advertising materials mentioning features or use of this software 31d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * must display the following acknowledgement: 32d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 33d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * This product includes software developed by the University of 34d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * California, Berkeley, Intel Corporation, and its contributors. 35d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 36d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 4. Neither the name of University, Intel Corporation, or their respective 37d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * contributors may be used to endorse or promote products derived from 38d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * this software without specific prior written permission. 39d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 40d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THIS SOFTWARE IS PROVIDED BY THE REGENTS, INTEL CORPORATION AND 41d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 42d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 43d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS, 44d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * INTEL CORPORATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 45d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 46d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 47d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 48d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 49d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 50d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 51d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 52d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 53d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 54d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* 55d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Portions Copyright (c) 1993 by Digital Equipment Corporation. 56d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 57d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Permission to use, copy, modify, and distribute this software for any 58d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * purpose with or without fee is hereby granted, provided that the above 59d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * copyright notice and this permission notice appear in all copies, and that 60d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * the name of Digital Equipment Corporation not be used in advertising or 61d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * publicity pertaining to distribution of the document or software without 62d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * specific, written prior permission. 63d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 64d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL 65d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES 66d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT 67d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 68d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 69d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS 70d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 71d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * SOFTWARE. 72d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 73d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 74d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* 75d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Portions Copyright (c) 1996 by Internet Software Consortium. 76d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 77d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Permission to use, copy, modify, and distribute this software for any 78d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * purpose with or without fee is hereby granted, provided that the above 79d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * copyright notice and this permission notice appear in all copies. 80d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 81d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS 82d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES 83d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE 84d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 85d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 86d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS 87d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 88d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * SOFTWARE. 89d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 90d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 91d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#if defined(LIBC_SCCS) && !defined(lint) 92d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic char sccsid[] = "@(#)res_comp.c 8.1 (Berkeley) 6/4/93"; 93d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic char orig_rcsid[] = "From: Id: res_comp.c,v 8.11 1997/05/21 19:31:04 halley Exp $"; 94d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic char rcsid[] = "$Id: res_comp.c,v 1.1.1.1 2003/11/19 01:51:35 kyu3 Exp $"; 95d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif /* LIBC_SCCS and not lint */ 96d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 97d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <sys/types.h> 98d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <sys/param.h> 99d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <netinet/in.h> 100d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <arpa/nameser.h> 101d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <ctype.h> 102d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <resolv.h> 103d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <stdio.h> 104d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <string.h> 105d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <unistd.h> 106d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 107d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define BIND_4_COMPAT 108d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 109d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* 110d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Expand compressed domain name 'comp_dn' to full domain name. 111d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 'msg' is a pointer to the begining of the message, 112d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 'eomorig' points to the first location after the message, 113d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 'exp_dn' is a pointer to a buffer of size 'length' for the result. 114d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Return size of compressed name or -1 if there was an error. 115d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 116d7ce700605e1af0e455e31ec11f19ff21d26b525darylmint 117d7ce700605e1af0e455e31ec11f19ff21d26b525darylmdn_expand(const u_char *msg, const u_char *eom, const u_char *src, 118d7ce700605e1af0e455e31ec11f19ff21d26b525darylm char *dst, int dstsiz) 119d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{ 120d7ce700605e1af0e455e31ec11f19ff21d26b525darylm int n = ns_name_uncompress(msg, eom, src, dst, (size_t)dstsiz); 121d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 122d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (n > 0 && dst[0] == '.') 123d7ce700605e1af0e455e31ec11f19ff21d26b525darylm dst[0] = '\0'; 124d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (n); 125d7ce700605e1af0e455e31ec11f19ff21d26b525darylm} 126d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 127d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* 128d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Pack domain name 'exp_dn' in presentation form into 'comp_dn'. 129d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Return the size of the compressed name or -1. 130d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 'length' is the size of the array pointed to by 'comp_dn'. 131d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 132d7ce700605e1af0e455e31ec11f19ff21d26b525darylmint 133d7ce700605e1af0e455e31ec11f19ff21d26b525darylmdn_comp(const char *src, u_char *dst, int dstsiz, 134d7ce700605e1af0e455e31ec11f19ff21d26b525darylm u_char **dnptrs, u_char **lastdnptr) 135d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{ 136d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (ns_name_compress(src, dst, (size_t)dstsiz, 137d7ce700605e1af0e455e31ec11f19ff21d26b525darylm (const u_char **)dnptrs, 138d7ce700605e1af0e455e31ec11f19ff21d26b525darylm (const u_char **)lastdnptr)); 139d7ce700605e1af0e455e31ec11f19ff21d26b525darylm} 140d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 141d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* 142d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Skip over a compressed domain name. Return the size or -1. 143d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 144d7ce700605e1af0e455e31ec11f19ff21d26b525darylmint 145d7ce700605e1af0e455e31ec11f19ff21d26b525darylmdn_skipname(const u_char *ptr, const u_char *eom) { 146d7ce700605e1af0e455e31ec11f19ff21d26b525darylm const u_char *saveptr = ptr; 147d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 148d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (ns_name_skip(&ptr, eom) == -1) 149d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (-1); 150d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return ((int)(ptr - saveptr)); 151d7ce700605e1af0e455e31ec11f19ff21d26b525darylm} 152d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 153d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* 154d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Verify that a domain name uses an acceptable character set. 155d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 156d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 157d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* 158d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Note the conspicuous absence of ctype macros in these definitions. On 159d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * non-ASCII hosts, we can't depend on string literals or ctype macros to 160d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * tell us anything about network-format data. The rest of the BIND system 161d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * is not careful about this, but for some reason, we're doing it right here. 162d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 163d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define PERIOD 0x2e 164d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define hyphenchar(c) ((c) == 0x2d) 165d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define bslashchar(c) ((c) == 0x5c) 166d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define periodchar(c) ((c) == PERIOD) 167d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define asterchar(c) ((c) == 0x2a) 168d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define alphachar(c) (((c) >= 0x41 && (c) <= 0x5a) \ 169d7ce700605e1af0e455e31ec11f19ff21d26b525darylm || ((c) >= 0x61 && (c) <= 0x7a)) 170d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define digitchar(c) ((c) >= 0x30 && (c) <= 0x39) 171d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 172d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define borderchar(c) (alphachar(c) || digitchar(c)) 173d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define middlechar(c) (borderchar(c) || hyphenchar(c)) 174d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define domainchar(c) ((c) > 0x20 && (c) < 0x7f) 175d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 176d7ce700605e1af0e455e31ec11f19ff21d26b525darylmint 177d7ce700605e1af0e455e31ec11f19ff21d26b525darylmres_hnok( 178d7ce700605e1af0e455e31ec11f19ff21d26b525darylm const char *dn 179d7ce700605e1af0e455e31ec11f19ff21d26b525darylm ) 180d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{ 1810e565888ee40264bfad5a700e0d62f4824d81c18Olivier Martin int pch = PERIOD, ch = *dn++; 182d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 183d7ce700605e1af0e455e31ec11f19ff21d26b525darylm while (ch != '\0') { 184d7ce700605e1af0e455e31ec11f19ff21d26b525darylm int nch = *dn++; 185d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 186d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (periodchar(ch)) { 187d7ce700605e1af0e455e31ec11f19ff21d26b525darylm (void)NULL; 188d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } else if (periodchar(pch)) { 189d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (!borderchar(ch)) 190d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (0); 191d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } else if (periodchar(nch) || nch == '\0') { 192d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (!borderchar(ch)) 193d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (0); 194d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } else { 195d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (!middlechar(ch)) 196d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (0); 197d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 1980e565888ee40264bfad5a700e0d62f4824d81c18Olivier Martin pch = ch; 1990e565888ee40264bfad5a700e0d62f4824d81c18Olivier Martin ch = nch; 200d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 201d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (1); 202d7ce700605e1af0e455e31ec11f19ff21d26b525darylm} 203d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 204d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* 205d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * hostname-like (A, MX, WKS) owners can have "*" as their first label 206d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * but must otherwise be as a host name. 207d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 208d7ce700605e1af0e455e31ec11f19ff21d26b525darylmint 209d7ce700605e1af0e455e31ec11f19ff21d26b525darylmres_ownok( 210d7ce700605e1af0e455e31ec11f19ff21d26b525darylm const char *dn 211d7ce700605e1af0e455e31ec11f19ff21d26b525darylm ) 212d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{ 213d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (asterchar(dn[0])) { 214d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (periodchar(dn[1])) 215d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (res_hnok(dn+2)); 216d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (dn[1] == '\0') 217d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (1); 218d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 219d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (res_hnok(dn)); 220d7ce700605e1af0e455e31ec11f19ff21d26b525darylm} 221d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 222d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* 223d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * SOA RNAMEs and RP RNAMEs can have any printable character in their first 224d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * label, but the rest of the name has to look like a host name. 225d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 226d7ce700605e1af0e455e31ec11f19ff21d26b525darylmint 227d7ce700605e1af0e455e31ec11f19ff21d26b525darylmres_mailok( 228d7ce700605e1af0e455e31ec11f19ff21d26b525darylm const char *dn 229d7ce700605e1af0e455e31ec11f19ff21d26b525darylm ) 230d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{ 231d7ce700605e1af0e455e31ec11f19ff21d26b525darylm int ch, escaped = 0; 232d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 233d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* "." is a valid missing representation */ 234d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (*dn == '\0') 235d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (1); 236d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 237d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* otherwise <label>.<hostname> */ 238d7ce700605e1af0e455e31ec11f19ff21d26b525darylm while ((ch = *dn++) != '\0') { 239d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (!domainchar(ch)) 240d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (0); 241d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (!escaped && periodchar(ch)) 242d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 243d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (escaped) 244d7ce700605e1af0e455e31ec11f19ff21d26b525darylm escaped = 0; 245d7ce700605e1af0e455e31ec11f19ff21d26b525darylm else if (bslashchar(ch)) 246d7ce700605e1af0e455e31ec11f19ff21d26b525darylm escaped = 1; 247d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 248d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (periodchar(ch)) 249d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (res_hnok(dn)); 250d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (0); 251d7ce700605e1af0e455e31ec11f19ff21d26b525darylm} 252d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 253d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* 254d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * This function is quite liberal, since RFC 1034's character sets are only 255d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * recommendations. 256d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 257d7ce700605e1af0e455e31ec11f19ff21d26b525darylmint 258d7ce700605e1af0e455e31ec11f19ff21d26b525darylmres_dnok( 259d7ce700605e1af0e455e31ec11f19ff21d26b525darylm const char *dn 260d7ce700605e1af0e455e31ec11f19ff21d26b525darylm ) 261d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{ 262d7ce700605e1af0e455e31ec11f19ff21d26b525darylm int ch; 263d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 264d7ce700605e1af0e455e31ec11f19ff21d26b525darylm while ((ch = *dn++) != '\0') 265d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (!domainchar(ch)) 266d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (0); 267d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (1); 268d7ce700605e1af0e455e31ec11f19ff21d26b525darylm} 269d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 270d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef BIND_4_COMPAT 271d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* 272d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * This module must export the following externally-visible symbols: 273d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ___putlong 274d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ___putshort 275d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * __getlong 276d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * __getshort 277d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Note that one _ comes from C and the others come from us. 278d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 279d7ce700605e1af0e455e31ec11f19ff21d26b525darylmvoid __putlong(u_int32_t src, u_char *dst) { ns_put32(src, dst); } 280d7ce700605e1af0e455e31ec11f19ff21d26b525darylmvoid __putshort(u_int16_t src, u_char *dst) { ns_put16(src, dst); } 281d7ce700605e1af0e455e31ec11f19ff21d26b525darylmu_int32_t _getlong(const u_char *src) { return (ns_get32(src)); } 282d7ce700605e1af0e455e31ec11f19ff21d26b525darylmu_int16_t _getshort(const u_char *src) { return (ns_get16(src)); } 283d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif /*BIND_4_COMPAT*/ 284