Annotation of embedaddon/dhcp/minires/res_comp.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (c) 1985, 1993
! 3: * The Regents of the University of California. All rights reserved.
! 4: *
! 5: * Redistribution and use in source and binary forms, with or without
! 6: * modification, are permitted provided that the following conditions
! 7: * are met:
! 8: * 1. Redistributions of source code must retain the above copyright
! 9: * notice, this list of conditions and the following disclaimer.
! 10: * 2. Redistributions in binary form must reproduce the above copyright
! 11: * notice, this list of conditions and the following disclaimer in the
! 12: * documentation and/or other materials provided with the distribution.
! 13: * 3. All advertising materials mentioning features or use of this software
! 14: * must display the following acknowledgement:
! 15: * This product includes software developed by the University of
! 16: * California, Berkeley and its contributors.
! 17: * 4. Neither the name of the University nor the names of its contributors
! 18: * may be used to endorse or promote products derived from this software
! 19: * without specific prior written permission.
! 20: *
! 21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
! 22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
! 25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 31: * SUCH DAMAGE.
! 32: */
! 33:
! 34: /*
! 35: * Portions Copyright (c) 1993 by Digital Equipment Corporation.
! 36: *
! 37: * Permission to use, copy, modify, and distribute this software for any
! 38: * purpose with or without fee is hereby granted, provided that the above
! 39: * copyright notice and this permission notice appear in all copies, and that
! 40: * the name of Digital Equipment Corporation not be used in advertising or
! 41: * publicity pertaining to distribution of the document or software without
! 42: * specific, written prior permission.
! 43: *
! 44: * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
! 45: * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
! 46: * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
! 47: * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
! 48: * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
! 49: * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
! 50: * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
! 51: * SOFTWARE.
! 52: */
! 53:
! 54: /*
! 55: * Portions Copyright (c) 2004,2009
! 56: * by Internet Systems Consortium, Inc. ("ISC")
! 57: * Portions Copyright (c) 1996-2003 by Internet Software Consortium
! 58: *
! 59: * Permission to use, copy, modify, and distribute this software for any
! 60: * purpose with or without fee is hereby granted, provided that the above
! 61: * copyright notice and this permission notice appear in all copies.
! 62: *
! 63: * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
! 64: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
! 65: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
! 66: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
! 67: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
! 68: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
! 69: * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
! 70: *
! 71: * Internet Systems Consortium, Inc.
! 72: * 950 Charter Street
! 73: * Redwood City, CA 94063
! 74: * <info@isc.org>
! 75: * https://www.isc.org/
! 76: */
! 77:
! 78: #if defined(LIBC_SCCS) && !defined(lint)
! 79: static const char sccsid[] = "@(#)res_comp.c 8.1 (Berkeley) 6/4/93";
! 80: static const char rcsid[] = "$Id: res_comp.c,v 1.3.786.2 2009-07-24 22:04:52 sar Exp $";
! 81: #endif /* LIBC_SCCS and not lint */
! 82:
! 83: #include <sys/types.h>
! 84: #include <sys/param.h>
! 85: #include <netinet/in.h>
! 86: #include <ctype.h>
! 87: #include <stdio.h>
! 88: #include <string.h>
! 89: #include <unistd.h>
! 90: #include <sys/socket.h>
! 91:
! 92: #include "minires/minires.h"
! 93: #include "arpa/nameser.h"
! 94:
! 95: /*
! 96: * Expand compressed domain name 'comp_dn' to full domain name.
! 97: * 'msg' is a pointer to the begining of the message,
! 98: * 'eomorig' points to the first location after the message,
! 99: * 'exp_dn' is a pointer to a buffer of size 'length' for the result.
! 100: * Return size of compressed name or -1 if there was an error.
! 101: */
! 102: int
! 103: dn_expand(const u_char *msg, const u_char *eom, const u_char *src,
! 104: char *dst, unsigned dstsiz)
! 105: {
! 106: int n = ns_name_uncompress(msg, eom, src, dst, (size_t)dstsiz);
! 107:
! 108: if (n > 0 && dst[0] == '.')
! 109: dst[0] = '\0';
! 110: return (n);
! 111: }
! 112:
! 113: /*
! 114: * Pack domain name 'exp_dn' in presentation form into 'comp_dn'.
! 115: * Return the size of the compressed name or -1.
! 116: * 'length' is the size of the array pointed to by 'comp_dn'.
! 117: */
! 118: int
! 119: dn_comp(const char *src, u_char *dst, unsigned dstsiz,
! 120: u_char **dnptrs, u_char **lastdnptr)
! 121: {
! 122: return (ns_name_compress(src, dst, (size_t)dstsiz,
! 123: (const u_char **)dnptrs,
! 124: (const u_char **)lastdnptr));
! 125: }
! 126:
! 127: /*
! 128: * Skip over a compressed domain name. Return the size or -1.
! 129: */
! 130: int
! 131: dn_skipname(const u_char *ptr, const u_char *eom) {
! 132: const u_char *saveptr = ptr;
! 133:
! 134: if (ns_name_skip(&ptr, eom) == -1)
! 135: return (-1);
! 136: return (ptr - saveptr);
! 137: }
! 138:
! 139: /*
! 140: * Verify that a domain name uses an acceptable character set.
! 141: */
! 142:
! 143: #if 0
! 144: /*
! 145: * Note the conspicuous absence of ctype macros in these definitions. On
! 146: * non-ASCII hosts, we can't depend on string literals or ctype macros to
! 147: * tell us anything about network-format data. The rest of the BIND system
! 148: * is not careful about this, but for some reason, we're doing it right here.
! 149: */
! 150: #define PERIOD 0x2e
! 151: #define hyphenchar(c) ((c) == 0x2d)
! 152: #define bslashchar(c) ((c) == 0x5c)
! 153: #define periodchar(c) ((c) == PERIOD)
! 154: #define asterchar(c) ((c) == 0x2a)
! 155: #define alphachar(c) (((c) >= 0x41 && (c) <= 0x5a) \
! 156: || ((c) >= 0x61 && (c) <= 0x7a))
! 157: #define digitchar(c) ((c) >= 0x30 && (c) <= 0x39)
! 158:
! 159: #define borderchar(c) (alphachar(c) || digitchar(c))
! 160: #define middlechar(c) (borderchar(c) || hyphenchar(c))
! 161: #define domainchar(c) ((c) > 0x20 && (c) < 0x7f)
! 162:
! 163: int
! 164: res_hnok(const char *dn) {
! 165: int ppch = '\0', pch = PERIOD, ch = *dn++;
! 166:
! 167: while (ch != '\0') {
! 168: int nch = *dn++;
! 169:
! 170: if (periodchar(ch)) {
! 171: (void)NULL;
! 172: } else if (periodchar(pch)) {
! 173: if (!borderchar(ch))
! 174: return (0);
! 175: } else if (periodchar(nch) || nch == '\0') {
! 176: if (!borderchar(ch))
! 177: return (0);
! 178: } else {
! 179: if (!middlechar(ch))
! 180: return (0);
! 181: }
! 182: ppch = pch, pch = ch, ch = nch;
! 183: }
! 184: return (1);
! 185: }
! 186:
! 187: /*
! 188: * hostname-like (A, MX, WKS) owners can have "*" as their first label
! 189: * but must otherwise be as a host name.
! 190: */
! 191: int
! 192: res_ownok(const char *dn) {
! 193: if (asterchar(dn[0])) {
! 194: if (periodchar(dn[1]))
! 195: return (res_hnok(dn+2));
! 196: if (dn[1] == '\0')
! 197: return (1);
! 198: }
! 199: return (res_hnok(dn));
! 200: }
! 201:
! 202: /*
! 203: * SOA RNAMEs and RP RNAMEs can have any printable character in their first
! 204: * label, but the rest of the name has to look like a host name.
! 205: */
! 206: int
! 207: res_mailok(const char *dn) {
! 208: int ch, escaped = 0;
! 209:
! 210: /* "." is a valid missing representation */
! 211: if (*dn == '\0')
! 212: return (1);
! 213:
! 214: /* otherwise <label>.<hostname> */
! 215: while ((ch = *dn++) != '\0') {
! 216: if (!domainchar(ch))
! 217: return (0);
! 218: if (!escaped && periodchar(ch))
! 219: break;
! 220: if (escaped)
! 221: escaped = 0;
! 222: else if (bslashchar(ch))
! 223: escaped = 1;
! 224: }
! 225: if (periodchar(ch))
! 226: return (res_hnok(dn));
! 227: return (0);
! 228: }
! 229:
! 230: /*
! 231: * This function is quite liberal, since RFC 1034's character sets are only
! 232: * recommendations.
! 233: */
! 234: int
! 235: res_dnok(const char *dn) {
! 236: int ch;
! 237:
! 238: while ((ch = *dn++) != '\0')
! 239: if (!domainchar(ch))
! 240: return (0);
! 241: return (1);
! 242: }
! 243: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>