File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / dhcp / minires / res_comp.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Oct 9 09:06:54 2012 UTC (12 years, 6 months ago) by misho
Branches: dhcp, MAIN
CVS tags: v4_1_R7p0, v4_1_R7, v4_1_R4, HEAD
dhcp 4.1 r7

    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.1.1.1 2012/10/09 09:06:54 misho 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>