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