1d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/*
2d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Copyright (c) 1985
3d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    The Regents of the University of California.  All rights reserved.
4d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
5d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Portions copyright (c) 1999, 2000
6d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Intel Corporation.
7d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * All rights reserved.
8d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
9d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Redistribution and use in source and binary forms, with or without
10d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * modification, are permitted provided that the following conditions
11d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * are met:
12d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
13d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 1. Redistributions of source code must retain the above copyright
14d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    notice, this list of conditions and the following disclaimer.
15d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
16d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 2. Redistributions in binary form must reproduce the above copyright
17d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    notice, this list of conditions and the following disclaimer in the
18d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    documentation and/or other materials provided with the distribution.
19d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
20d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 3. All advertising materials mentioning features or use of this software
21d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    must display the following acknowledgement:
22d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
23d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    This product includes software developed by the University of
24d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    California, Berkeley, Intel Corporation, and its contributors.
25d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
26d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 4. Neither the name of University, Intel Corporation, or their respective
27d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    contributors may be used to endorse or promote products derived from
28d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    this software without specific prior written permission.
29d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
30d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THIS SOFTWARE IS PROVIDED BY THE REGENTS, INTEL CORPORATION AND
31d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
32d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
33d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS,
34d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * INTEL CORPORATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
35d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
36d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
37d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
38d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
39d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
40d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
41d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
42d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */
43d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
44d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/*
45d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Portions Copyright (c) 1993 by Digital Equipment Corporation.
46d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
47d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Permission to use, copy, modify, and distribute this software for any
48d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * purpose with or without fee is hereby granted, provided that the above
49d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * copyright notice and this permission notice appear in all copies, and that
50d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * the name of Digital Equipment Corporation not be used in advertising or
51d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * publicity pertaining to distribution of the document or software without
52d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * specific, written prior permission.
53d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
54d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
55d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
56d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
57d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
58d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
59d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
60d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
61d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * SOFTWARE.
62d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */
63d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
64d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/*
65d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Portions Copyright (c) 1995 by International Business Machines, Inc.
66d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
67d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * International Business Machines, Inc. (hereinafter called IBM) grants
68d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * permission under its copyrights to use, copy, modify, and distribute this
69d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Software with or without fee, provided that the above copyright notice and
70d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * all paragraphs of this notice appear in all copies, and that the name of IBM
71d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * not be used in connection with the marketing of any product incorporating
72d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * the Software or modifications thereof, without specific, written prior
73d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * permission.
74d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
75d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * To the extent it has a right to do so, IBM grants an immunity from suit
76d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * under its patents, if any, for the use, sale or manufacture of products to
77d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * the extent that such products are used for performing Domain Name System
78d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * dynamic updates in TCP/IP networks by means of the Software.  No immunity is
79d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * granted for any product per se or for any other function of any product.
80d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
81d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
82d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
83d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * PARTICULAR PURPOSE.  IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
84d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
85d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
86d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
87d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */
88d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
89d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/*
90d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Portions Copyright (c) 1996 by Internet Software Consortium.
91d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
92d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Permission to use, copy, modify, and distribute this software for any
93d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * purpose with or without fee is hereby granted, provided that the above
94d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * copyright notice and this permission notice appear in all copies.
95d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
96d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
97d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
98d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
99d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
100d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
101d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
102d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
103d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * SOFTWARE.
104d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */
105d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
106d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#if defined(LIBC_SCCS) && !defined(lint)
107d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic char sccsid[] = "@(#)res_debug.c 8.1 (Berkeley) 6/4/93";
108d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic char rcsid[] = "$Id: res_debug.c,v 1.1.1.1 2003/11/19 01:51:36 kyu3 Exp $";
109d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif /* LIBC_SCCS and not lint */
110d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
111d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <sys/types.h>
112d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <sys/param.h>
113d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <sys/socket.h>
114d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
115d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <netinet/in.h>
116d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <arpa/inet.h>
117d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <arpa/nameser.h>
118d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
119d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <ctype.h>
120d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <errno.h>
121d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <math.h>
122d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <netdb.h>
123d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <resolv.h>
124d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <stdio.h>
125d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <stdlib.h>
126d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <string.h>
127d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <time.h>
128d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
129d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define SPRINTF(x) sprintf x
130d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
131d7ce700605e1af0e455e31ec11f19ff21d26b525darylmextern const char *_res_opcodes[];
132d7ce700605e1af0e455e31ec11f19ff21d26b525darylmextern const char *_res_resultcodes[];
133d7ce700605e1af0e455e31ec11f19ff21d26b525darylmextern const char *_res_sectioncodes[];
134d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
135d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/*
136d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Print the current options.
137d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */
138d7ce700605e1af0e455e31ec11f19ff21d26b525darylmvoid
139d7ce700605e1af0e455e31ec11f19ff21d26b525darylmfp_resstat(struct __res_state *statp, FILE *file) {
140d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    u_long mask;
141d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
142d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    fprintf(file, ";; res options:");
143d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (!statp)
144d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        statp = &_res;
145d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    for (mask = 1;  mask != 0;  mask <<= 1)
146d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (statp->options & mask)
147d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            fprintf(file, " %s", p_option(mask));
148d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    putc('\n', file);
149d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
150d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
151d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic void
152d7ce700605e1af0e455e31ec11f19ff21d26b525darylmdo_section(ns_msg *handle, ns_sect section, int pflag, FILE *file) {
153d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int n, sflag, rrnum;
154d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    ns_opcode opcode;
155d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    ns_rr rr;
156d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
157d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    /*
158d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     * Print answer records.
159d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     */
160d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    sflag = (int)(_res.pfcode & pflag);
161d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (_res.pfcode && !sflag)
162d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        return;
163d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
164d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    opcode = ns_msg_getflag(*handle, ns_f_opcode);
165d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    rrnum = 0;
166d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    for (;;) {
167d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (ns_parserr(handle, section, rrnum, &rr)) {
168d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            if (errno != ENODEV)
169d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                fprintf(file, ";; ns_parserr: %s\n",
170d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                    strerror(errno));
171d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            else if (rrnum > 0 && sflag != 0 &&
172d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                 (_res.pfcode & RES_PRF_HEAD1))
173d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                putc('\n', file);
174d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            return;
175d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        }
176d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (rrnum == 0 && sflag != 0 && (_res.pfcode & RES_PRF_HEAD1))
177d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            fprintf(file, ";; %s SECTION:\n",
178d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                p_section(section, opcode));
179d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (section == ns_s_qd)
180d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            fprintf(file, ";;\t%s, type = %s, class = %s\n",
181d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                ns_rr_name(rr),
182d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                p_type(ns_rr_type(rr)),
183d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                p_class(ns_rr_class(rr)));
184d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        else {
185d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            char *buf;
186d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            buf = (char*)malloc(2024);
187d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            if (buf) {
188d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                n = ns_sprintrr(handle, &rr, NULL, NULL,
189d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                        buf, sizeof buf);
190d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                if (n < 0) {
191d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                    fprintf(file, ";; ns_sprintrr: %s\n",
192d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                        strerror(errno));
193d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                    free(buf);
194d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                    return;
195d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                }
196d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                fputs(buf, file);
197d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                fputc('\n', file);
198d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                free(buf);
199d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            }
200d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        }
201d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        rrnum++;
202d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
203d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
204d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
205d7ce700605e1af0e455e31ec11f19ff21d26b525darylmvoid
206d7ce700605e1af0e455e31ec11f19ff21d26b525darylmp_query(const u_char *msg) {
207d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    fp_query(msg, stdout);
208d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
209d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
210d7ce700605e1af0e455e31ec11f19ff21d26b525darylmvoid
211d7ce700605e1af0e455e31ec11f19ff21d26b525darylmfp_query(const u_char *msg, FILE *file) {
212d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    fp_nquery(msg, PACKETSZ, file);
213d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
214d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
215d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/*
216d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Print the contents of a query.
217d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * This is intended to be primarily a debugging routine.
218d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */
219d7ce700605e1af0e455e31ec11f19ff21d26b525darylmvoid
220d7ce700605e1af0e455e31ec11f19ff21d26b525darylmfp_nquery(const u_char *msg, int len, FILE *file) {
221d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    ns_msg handle;
222d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int qdcount, ancount, nscount, arcount;
223d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    u_int opcode, rcode, id;
224d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
225d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if ((_res.options & RES_INIT) == 0 && res_init() == -1)
226d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        return;
227d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
228d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (ns_initparse(msg, len, &handle) < 0) {
229d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        fprintf(file, ";; ns_initparse: %s\n", strerror(errno));
230d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        return;
231d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
232d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    opcode = ns_msg_getflag(handle, ns_f_opcode);
233d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    rcode = ns_msg_getflag(handle, ns_f_rcode);
234d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    id = ns_msg_id(handle);
235d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    qdcount = ns_msg_count(handle, ns_s_qd);
236d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    ancount = ns_msg_count(handle, ns_s_an);
237d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    nscount = ns_msg_count(handle, ns_s_ns);
238d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    arcount = ns_msg_count(handle, ns_s_ar);
239d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
240d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    /*
241d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     * Print header fields.
242d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     */
243d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEADX) || rcode)
244d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        fprintf(file,
245d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            ";; ->>HEADER<<- opcode: %s, status: %s, id: %d\n",
2467700f0f5c0ab90bf052e33fa0ddd2f2aa7e7893elpleahy            _res_opcodes[opcode], _res_resultcodes[rcode], (int)id);
247d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEADX))
248d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        putc(';', file);
249d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEAD2)) {
250d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        fprintf(file, "; flags:");
251d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (ns_msg_getflag(handle, ns_f_qr))
252d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            fprintf(file, " qr");
253d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (ns_msg_getflag(handle, ns_f_aa))
254d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            fprintf(file, " aa");
255d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (ns_msg_getflag(handle, ns_f_tc))
256d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            fprintf(file, " tc");
257d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (ns_msg_getflag(handle, ns_f_rd))
258d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            fprintf(file, " rd");
259d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (ns_msg_getflag(handle, ns_f_ra))
260d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            fprintf(file, " ra");
261d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (ns_msg_getflag(handle, ns_f_z))
262d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            fprintf(file, " ??");
263d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (ns_msg_getflag(handle, ns_f_ad))
264d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            fprintf(file, " ad");
265d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (ns_msg_getflag(handle, ns_f_cd))
266d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            fprintf(file, " cd");
267d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
268d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEAD1)) {
269d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        fprintf(file, "; %s: %d",
270d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            p_section(ns_s_qd, (int)opcode), qdcount);
271d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        fprintf(file, ", %s: %d",
272d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            p_section(ns_s_an, (int)opcode), ancount);
273d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        fprintf(file, ", %s: %d",
274d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            p_section(ns_s_ns, (int)opcode), nscount);
275d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        fprintf(file, ", %s: %d",
276d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            p_section(ns_s_ar, (int)opcode), arcount);
277d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
278d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if ((!_res.pfcode) || (_res.pfcode &
279d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        (RES_PRF_HEADX | RES_PRF_HEAD2 | RES_PRF_HEAD1))) {
280d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        putc('\n',file);
281d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
282d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    /*
283d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     * Print the various sections.
284d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     */
285d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    do_section(&handle, ns_s_qd, RES_PRF_QUES, file);
286d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    do_section(&handle, ns_s_an, RES_PRF_ANS, file);
287d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    do_section(&handle, ns_s_ns, RES_PRF_AUTH, file);
288d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    do_section(&handle, ns_s_ar, RES_PRF_ADD, file);
289d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (qdcount == 0 && ancount == 0 &&
290d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        nscount == 0 && arcount == 0)
291d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        putc('\n', file);
292d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
293d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
294d7ce700605e1af0e455e31ec11f19ff21d26b525darylmconst u_char *
295d7ce700605e1af0e455e31ec11f19ff21d26b525darylmp_cdnname(const u_char *cp, const u_char *msg, int len, FILE *file) {
296d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    char name[MAXDNAME];
297d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int n;
298d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
299d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if ((n = dn_expand(msg, msg + len, cp, name, sizeof name)) < 0)
300d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        return (NULL);
301d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (name[0] == '\0')
302d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        putc('.', file);
303d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    else
304d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        fputs(name, file);
305d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    return (cp + n);
306d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
307d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
308d7ce700605e1af0e455e31ec11f19ff21d26b525darylmconst u_char *
309d7ce700605e1af0e455e31ec11f19ff21d26b525darylmp_cdname(const u_char *cp, const u_char *msg, FILE *file) {
310d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    return (p_cdnname(cp, msg, PACKETSZ, file));
311d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
312d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
313d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* Return a fully-qualified domain name from a compressed name (with
314d7ce700605e1af0e455e31ec11f19ff21d26b525darylm   length supplied).  */
315d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
316d7ce700605e1af0e455e31ec11f19ff21d26b525darylmconst u_char *
317d7ce700605e1af0e455e31ec11f19ff21d26b525darylmp_fqnname(
318d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    const u_char *cp,
319d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    const u_char *msg,
320d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int msglen,
321d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    char *name,
322d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int namelen
323d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    )
324d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{
325d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int n, newlen;
326d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
327d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if ((n = dn_expand(msg, cp + msglen, cp, name, namelen)) < 0)
328d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        return (NULL);
329d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    newlen = (int)strlen(name);
330d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (newlen == 0 || name[newlen - 1] != '.') {
331d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (newlen + 1 >= namelen)  /* Lack space for final dot */
332d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            return (NULL);
333d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        else
334d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            strcpy(name + newlen, ".");
335d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
336d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    return (cp + n);
337d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
338d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
339d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* XXX: the rest of these functions need to become length-limited, too. */
340d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
341d7ce700605e1af0e455e31ec11f19ff21d26b525darylmconst u_char *
342d7ce700605e1af0e455e31ec11f19ff21d26b525darylmp_fqname(const u_char *cp, const u_char *msg, FILE *file) {
343d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    char name[MAXDNAME];
344d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    const u_char *n;
345d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
346d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    n = p_fqnname(cp, msg, MAXCDNAME, name, sizeof name);
347d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (n == NULL)
348d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        return (NULL);
349d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    fputs(name, file);
350d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    return (n);
351d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
352d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
353d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/*
354d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Names of RR classes and qclasses.  Classes and qclasses are the same, except
355d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * that C_ANY is a qclass but not a class.  (You can ask for records of class
356d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * C_ANY, but you can't have any records of that class in the database.)
357d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */
358d7ce700605e1af0e455e31ec11f19ff21d26b525darylmconst struct res_sym __p_class_syms[] = {
359d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {C_IN,      "IN"},
360d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {C_CHAOS,   "CHAOS"},
361d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {C_HS,      "HS"},
362d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {C_HS,      "HESIOD"},
363d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {C_ANY,     "ANY"},
364d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {C_NONE,    "NONE"},
365d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {C_IN,      (char *)0}
366d7ce700605e1af0e455e31ec11f19ff21d26b525darylm};
367d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
368d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/*
369d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Names of message sections.
370d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */
371d7ce700605e1af0e455e31ec11f19ff21d26b525darylmconst struct res_sym __p_default_section_syms[] = {
372d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {ns_s_qd,   "QUERY"},
373d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {ns_s_an,   "ANSWER"},
374d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {ns_s_ns,   "AUTHORITY"},
375d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {ns_s_ar,   "ADDITIONAL"},
376d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {0,             (char *)0}
377d7ce700605e1af0e455e31ec11f19ff21d26b525darylm};
378d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
379d7ce700605e1af0e455e31ec11f19ff21d26b525darylmconst struct res_sym __p_update_section_syms[] = {
380d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {S_ZONE,    "ZONE"},
381d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {S_PREREQ,  "PREREQUISITE"},
382d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {S_UPDATE,  "UPDATE"},
383d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {S_ADDT,    "ADDITIONAL"},
384d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {0,             (char *)0}
385d7ce700605e1af0e455e31ec11f19ff21d26b525darylm};
386d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
387d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/*
388d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Names of RR types and qtypes.  Types and qtypes are the same, except
389d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * that T_ANY is a qtype but not a type.  (You can ask for records of type
390d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * T_ANY, but you can't have any records of that type in the database.)
391d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */
392d7ce700605e1af0e455e31ec11f19ff21d26b525darylmconst struct res_sym __p_type_syms[] = {
393d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_A,       "A",        "address"},
394d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_NS,      "NS",       "name server"},
395d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_MD,      "MD",       "mail destination (deprecated)"},
396d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_MF,      "MF",       "mail forwarder (deprecated)"},
397d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_CNAME,   "CNAME",    "canonical name"},
398d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_SOA,     "SOA",      "start of authority"},
399d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_MB,      "MB",       "mailbox"},
400d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_MG,      "MG",       "mail group member"},
401d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_MR,      "MR",       "mail rename"},
402d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_NULL,    "NULL",     "null"},
403d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_WKS,     "WKS",      "well-known service (deprecated)"},
404d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_PTR,     "PTR",      "domain name pointer"},
405d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_HINFO,   "HINFO",    "host information"},
406d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_MINFO,   "MINFO",    "mailbox information"},
407d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_MX,      "MX",       "mail exchanger"},
408d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_TXT,     "TXT",      "text"},
409d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_RP,      "RP",       "responsible person"},
410d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_AFSDB,   "AFSDB",    "DCE or AFS server"},
411d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_X25,     "X25",      "X25 address"},
412d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_ISDN,    "ISDN",     "ISDN address"},
413d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_RT,      "RT",       "router"},
414d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_NSAP,    "NSAP",     "nsap address"},
415d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_NSAP_PTR,    "NSAP_PTR", "domain name pointer"},
416d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_SIG,     "SIG",      "signature"},
417d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_KEY,     "KEY",      "key"},
418d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_PX,      "PX",       "mapping information"},
419d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_GPOS,    "GPOS",     "geographical position (withdrawn)"},
420d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_AAAA,    "AAAA",     "IPv6 address"},
421d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_LOC,     "LOC",      "location"},
422d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_NXT,     "NXT",      "next valid name (unimplemented)"},
423d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_EID,     "EID",      "endpoint identifier (unimplemented)"},
424d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_NIMLOC,  "NIMLOC",   "NIMROD locator (unimplemented)"},
425d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_SRV,     "SRV",      "server selection"},
426d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_ATMA,    "ATMA",     "ATM address (unimplemented)"},
427d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_IXFR,    "IXFR",     "incremental zone transfer"},
428d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_AXFR,    "AXFR",     "zone transfer"},
429d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_MAILB,   "MAILB",    "mailbox-related data (deprecated)"},
430d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_MAILA,   "MAILA",    "mail agent (deprecated)"},
431d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_NAPTR,   "NAPTR",    "URN Naming Authority"},
432d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {T_ANY,     "ANY",      "\"any\""},
433d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {0,         NULL,       NULL}
434d7ce700605e1af0e455e31ec11f19ff21d26b525darylm};
435d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
436d7ce700605e1af0e455e31ec11f19ff21d26b525darylmint
437d7ce700605e1af0e455e31ec11f19ff21d26b525darylmsym_ston(const struct res_sym *syms, const char *name, int *success) {
438d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    for ((void)NULL; syms->name != 0; syms++) {
439d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (strcasecmp (name, syms->name) == 0) {
440d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            if (success)
441d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                *success = 1;
442d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            return (syms->number);
443d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        }
444d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
445d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (success)
446d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        *success = 0;
447d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    return (syms->number);      /* The default value. */
448d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
449d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
450d7ce700605e1af0e455e31ec11f19ff21d26b525darylmconst char *
451d7ce700605e1af0e455e31ec11f19ff21d26b525darylmsym_ntos(const struct res_sym *syms, int number, int *success) {
452d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    static char unname[20];
453d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
454d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    for ((void)NULL; syms->name != 0; syms++) {
455d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (number == syms->number) {
456d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            if (success)
457d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                *success = 1;
458d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            return (syms->name);
459d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        }
460d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
461d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
462d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    sprintf(unname, "%d", number);
463d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (success)
464d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        *success = 0;
465d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    return (unname);
466d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
467d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
468d7ce700605e1af0e455e31ec11f19ff21d26b525darylmconst char *
469d7ce700605e1af0e455e31ec11f19ff21d26b525darylmsym_ntop(const struct res_sym *syms, int number, int *success) {
470d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    static char unname[20];
471d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
472d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    for ((void)NULL; syms->name != 0; syms++) {
473d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (number == syms->number) {
474d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            if (success)
475d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                *success = 1;
476d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            return (syms->humanname);
477d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        }
478d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
479d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    sprintf(unname, "%d", number);
480d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (success)
481d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        *success = 0;
482d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    return (unname);
483d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
484d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
485d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/*
486d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Return a string for the type.
487d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */
488d7ce700605e1af0e455e31ec11f19ff21d26b525darylmconst char *
489d7ce700605e1af0e455e31ec11f19ff21d26b525darylmp_type(int type) {
490d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    return (sym_ntos(__p_type_syms, type, (int *)0));
491d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
492d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
493d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/*
494d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Return a string for the type.
495d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */
496d7ce700605e1af0e455e31ec11f19ff21d26b525darylmconst char *
497d7ce700605e1af0e455e31ec11f19ff21d26b525darylmp_section(int section, int opcode) {
498d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    const struct res_sym *symbols;
499d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
500d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    switch (opcode) {
501d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    case ns_o_update:
502d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        symbols = __p_update_section_syms;
503d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        break;
504d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    default:
505d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        symbols = __p_default_section_syms;
506d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        break;
507d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
508d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    return (sym_ntos(symbols, section, (int *)0));
509d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
510d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
511d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/*
512d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Return a mnemonic for class.
513d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */
514d7ce700605e1af0e455e31ec11f19ff21d26b525darylmconst char *
515d7ce700605e1af0e455e31ec11f19ff21d26b525darylmp_class(int class) {
516d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    return (sym_ntos(__p_class_syms, class, (int *)0));
517d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
518d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
519d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/*
520d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Return a mnemonic for an option
521d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */
522d7ce700605e1af0e455e31ec11f19ff21d26b525darylmconst char *
523d7ce700605e1af0e455e31ec11f19ff21d26b525darylmp_option(u_long option) {
524d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    static char nbuf[40];
525d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
526d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    switch (option) {
527d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    case RES_INIT:      return "init";
528d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    case RES_DEBUG:     return "debug";
529d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    case RES_AAONLY:    return "aaonly(unimpl)";
530d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    case RES_USEVC:     return "usevc";
531d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    case RES_PRIMARY:   return "primry(unimpl)";
532d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    case RES_IGNTC:     return "igntc";
533d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    case RES_RECURSE:   return "recurs";
534d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    case RES_DEFNAMES:  return "defnam";
535d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    case RES_STAYOPEN:  return "styopn";
536d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    case RES_DNSRCH:    return "dnsrch";
537d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    case RES_INSECURE1: return "insecure1";
538d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    case RES_INSECURE2: return "insecure2";
5399d66ee4d177307ca59f08d242e592ec95a325d26Stefan Kaeser    default:        sprintf(nbuf, "?0x%lx?", (unsigned long)option);
540d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                return (nbuf);
541d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
542d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
543d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
544d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/*
545d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Return a mnemonic for a time to live.
546d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */
547d7ce700605e1af0e455e31ec11f19ff21d26b525darylmconst char *
548d7ce700605e1af0e455e31ec11f19ff21d26b525darylmp_time(u_int32_t value) {
549d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    static char nbuf[40];
550d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
551d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (ns_format_ttl(value, nbuf, sizeof nbuf) < 0)
552d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        sprintf(nbuf, "%u", value);
553d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    return (nbuf);
554d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
555d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
556d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
557d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/*
558d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * routines to convert between on-the-wire RR format and zone file format.
559d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Does not contain conversion to/from decimal degrees; divide or multiply
560d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * by 60*60*1000 for that.
561d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */
562d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
563d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic unsigned int poweroften[10] = {1, 10, 100, 1000, 10000, 100000,
564d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                      1000000,10000000,100000000,1000000000};
565d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
566d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* takes an XeY precision/size value, returns a string representation. */
567d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic const char *
568d7ce700605e1af0e455e31ec11f19ff21d26b525darylmprecsize_ntoa(
569d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    u_int8_t prec
570d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    )
571d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{
572d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    static char retbuf[sizeof "90000000.00"];
573d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    unsigned long val;
574d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int mantissa, exponent;
575d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
576d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    mantissa = (int)((prec >> 4) & 0x0f) % 10;
577d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    exponent = (int)((prec >> 0) & 0x0f) % 10;
578d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
579d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    val = mantissa * poweroften[exponent];
580d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
581d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    (void) sprintf(retbuf, "%ld.%.2ld", val/100, val%100);
582d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    return (retbuf);
583d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
584d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
585d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* converts ascii size/precision X * 10**Y(cm) to 0xXY.  moves pointer. */
586d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic u_int8_t
587d7ce700605e1af0e455e31ec11f19ff21d26b525darylmprecsize_aton(
588d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    char **strptr
589d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    )
590d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{
591d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    unsigned int mval = 0, cmval = 0;
592d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    u_int8_t retval = 0;
593d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    char *cp;
594d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int exponent;
595d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int mantissa;
596d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
597d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    cp = *strptr;
598d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
599d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    while (isdigit(*cp))
600d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        mval = mval * 10 + (*cp++ - '0');
601d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
602d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (*cp == '.') {       /* centimeters */
603d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        cp++;
604d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (isdigit(*cp)) {
605d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            cmval = (*cp++ - '0') * 10;
606d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            if (isdigit(*cp)) {
607d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                cmval += (*cp++ - '0');
608d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            }
609d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        }
610d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
611d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    cmval = (mval * 100) + cmval;
612d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
613d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    for (exponent = 0; exponent < 9; exponent++)
614d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (cmval < poweroften[exponent+1])
615d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            break;
616d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
617d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    mantissa = cmval / poweroften[exponent];
618d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (mantissa > 9)
619d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        mantissa = 9;
620d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
621d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    retval = (u_int8_t)((mantissa << 4) | exponent);
622d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
623d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    *strptr = cp;
624d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
625d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    return (retval);
626d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
627d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
628d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* converts ascii lat/lon to unsigned encoded 32-bit number.  moves pointer. */
629d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic u_int32_t
630d7ce700605e1af0e455e31ec11f19ff21d26b525darylmlatlon2ul(
631d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    char **latlonstrptr,
632d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int *which
633d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    )
634d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{
635d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    char *cp;
636d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    u_int32_t retval;
637d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int deg = 0, min = 0, secs = 0, secsfrac = 0;
638d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
639d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    cp = *latlonstrptr;
640d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
641d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    while (isdigit(*cp))
642d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        deg = deg * 10 + (*cp++ - '0');
643d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
644d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    while (isspace(*cp))
645d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        cp++;
646d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
647d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (!(isdigit(*cp)))
648d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        goto fndhemi;
649d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
650d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    while (isdigit(*cp))
651d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        min = min * 10 + (*cp++ - '0');
652d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
653d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    while (isspace(*cp))
654d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        cp++;
655d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
656d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (!(isdigit(*cp)))
657d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        goto fndhemi;
658d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
659d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    while (isdigit(*cp))
660d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        secs = secs * 10 + (*cp++ - '0');
661d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
662d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (*cp == '.') {       /* decimal seconds */
663d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        cp++;
664d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (isdigit(*cp)) {
665d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            secsfrac = (*cp++ - '0') * 100;
666d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            if (isdigit(*cp)) {
667d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                secsfrac += (*cp++ - '0') * 10;
668d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                if (isdigit(*cp)) {
669d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                    secsfrac += (*cp++ - '0');
670d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                }
671d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            }
672d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        }
673d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
674d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
675d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    while (!isspace(*cp))   /* if any trailing garbage */
676d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        cp++;
677d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
678d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    while (isspace(*cp))
679d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        cp++;
680d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
681d7ce700605e1af0e455e31ec11f19ff21d26b525darylm fndhemi:
682d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    switch (*cp) {
683d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    case 'N': case 'n':
684d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    case 'E': case 'e':
685d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        retval = ((unsigned)1<<31)
686d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            + (((((deg * 60) + min) * 60) + secs) * 1000)
687d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            + secsfrac;
688d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        break;
689d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    case 'S': case 's':
690d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    case 'W': case 'w':
691d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        retval = ((unsigned)1<<31)
692d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            - (((((deg * 60) + min) * 60) + secs) * 1000)
693d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            - secsfrac;
694d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        break;
695d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    default:
696d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        retval = 0; /* invalid value -- indicates error */
697d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        break;
698d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
699d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
700d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    switch (*cp) {
701d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    case 'N': case 'n':
702d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    case 'S': case 's':
703d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        *which = 1; /* latitude */
704d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        break;
705d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    case 'E': case 'e':
706d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    case 'W': case 'w':
707d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        *which = 2; /* longitude */
708d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        break;
709d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    default:
710d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        *which = 0; /* error */
711d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        break;
712d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
713d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
714d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    cp++;           /* skip the hemisphere */
715d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
716d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    while (!isspace(*cp))   /* if any trailing garbage */
717d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        cp++;
718d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
719d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    while (isspace(*cp))    /* move to next field */
720d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        cp++;
721d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
722d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    *latlonstrptr = cp;
723d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
724d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    return (retval);
725d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
726d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
727d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* converts a zone file representation in a string to an RDATA on-the-wire
728d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * representation. */
729d7ce700605e1af0e455e31ec11f19ff21d26b525darylmint
730d7ce700605e1af0e455e31ec11f19ff21d26b525darylmloc_aton(
731d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    const char *ascii,
732d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    u_char *binary
733d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    )
734d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{
735d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    const char *cp, *maxcp;
736d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    u_char *bcp;
737d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
738d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    u_int32_t latit = 0, longit = 0, alt = 0;
739d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    u_int32_t lltemp1 = 0, lltemp2 = 0;
740d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int altmeters = 0, altfrac = 0, altsign = 1;
741d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    u_int8_t hp = 0x16; /* default = 1e6 cm = 10000.00m = 10km */
742d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    u_int8_t vp = 0x13; /* default = 1e3 cm = 10.00m */
743d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    u_int8_t siz = 0x12;    /* default = 1e2 cm = 1.00m */
744d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int which1 = 0, which2 = 0;
745d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
746d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    cp = ascii;
747d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    maxcp = cp + strlen(ascii);
748d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
749d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    lltemp1 = latlon2ul((char **)&cp, &which1);
750d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
751d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    lltemp2 = latlon2ul((char **)&cp, &which2);
752d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
753d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    switch (which1 + which2) {
754d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    case 3:         /* 1 + 2, the only valid combination */
755d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if ((which1 == 1) && (which2 == 2)) { /* normal case */
756d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            latit = lltemp1;
757d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            longit = lltemp2;
758d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        } else if ((which1 == 2) && (which2 == 1)) { /* reversed */
759d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            longit = lltemp1;
760d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            latit = lltemp2;
761d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        } else {    /* some kind of brokenness */
762d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            return (0);
763d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        }
764d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        break;
765d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    default:        /* we didn't get one of each */
766d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        return (0);
767d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
768d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
769d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    /* altitude */
770d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (*cp == '-') {
771d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        altsign = -1;
772d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        cp++;
773d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
774d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
775d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (*cp == '+')
776d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        cp++;
777d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
778d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    while (isdigit(*cp))
779d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        altmeters = altmeters * 10 + (*cp++ - '0');
780d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
781d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (*cp == '.') {       /* decimal meters */
782d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        cp++;
783d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (isdigit(*cp)) {
784d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            altfrac = (*cp++ - '0') * 10;
785d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            if (isdigit(*cp)) {
786d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                altfrac += (*cp++ - '0');
787d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            }
788d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        }
789d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
790d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
791d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    alt = (10000000 + (altsign * (altmeters * 100 + altfrac)));
792d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
793d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    while (!isspace(*cp) && (cp < maxcp)) /* if trailing garbage or m */
794d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        cp++;
795d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
796d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    while (isspace(*cp) && (cp < maxcp))
797d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        cp++;
798d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
799d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (cp >= maxcp)
800d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        goto defaults;
801d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
802d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    siz = precsize_aton((char **)&cp);
803d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
804d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    while (!isspace(*cp) && (cp < maxcp))   /* if trailing garbage or m */
805d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        cp++;
806d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
807d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    while (isspace(*cp) && (cp < maxcp))
808d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        cp++;
809d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
810d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (cp >= maxcp)
811d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        goto defaults;
812d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
813d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    hp = precsize_aton((char **)&cp);
814d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
815d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    while (!isspace(*cp) && (cp < maxcp))   /* if trailing garbage or m */
816d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        cp++;
817d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
818d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    while (isspace(*cp) && (cp < maxcp))
819d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        cp++;
820d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
821d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (cp >= maxcp)
822d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        goto defaults;
823d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
824d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    vp = precsize_aton((char **)&cp);
825d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
826d7ce700605e1af0e455e31ec11f19ff21d26b525darylm defaults:
827d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
828d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    bcp = binary;
829d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    *bcp++ = (u_int8_t) 0;  /* version byte */
830d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    *bcp++ = siz;
831d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    *bcp++ = hp;
832d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    *bcp++ = vp;
833d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    PUTLONG(latit,bcp);
834d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    PUTLONG(longit,bcp);
835d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    PUTLONG(alt,bcp);
836d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
837d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    return (16);        /* size of RR in octets */
838d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
839d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
840d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* takes an on-the-wire LOC RR and formats it in a human readable format. */
841d7ce700605e1af0e455e31ec11f19ff21d26b525darylmconst char *
842d7ce700605e1af0e455e31ec11f19ff21d26b525darylmloc_ntoa(
843d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    const u_char *binary,
844d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    char *ascii
845d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    )
846d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{
847d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    static char *error = "?";
848d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    const u_char *cp = binary;
849d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
850d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int latdeg, latmin, latsec, latsecfrac;
851d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int longdeg, longmin, longsec, longsecfrac;
852d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    char northsouth, eastwest;
853d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int altmeters, altfrac, altsign;
854d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
855d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    const u_int32_t referencealt = 100000 * 100;
856d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
857d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int32_t latval, longval, altval;
858d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    u_int32_t templ;
859d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    u_int8_t sizeval, hpval, vpval, versionval;
860d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
861d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    char *sizestr, *hpstr, *vpstr;
862d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
863d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    versionval = *cp++;
864d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
865d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (versionval) {
866d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        (void) sprintf(ascii, "; error: unknown LOC RR version");
867d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        return (ascii);
868d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
869d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
870d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    sizeval = *cp++;
871d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
872d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    hpval = *cp++;
873d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    vpval = *cp++;
874d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
875d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    GETLONG(templ, cp);
876d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    latval = (templ - ((unsigned)1<<31));
877d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
878d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    GETLONG(templ, cp);
879d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    longval = (templ - ((unsigned)1<<31));
880d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
881d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    GETLONG(templ, cp);
882d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (templ < referencealt) { /* below WGS 84 spheroid */
883d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        altval = referencealt - templ;
884d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        altsign = -1;
885d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    } else {
886d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        altval = templ - referencealt;
887d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        altsign = 1;
888d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
889d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
890d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (latval < 0) {
891d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        northsouth = 'S';
892d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        latval = -latval;
893d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    } else
894d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        northsouth = 'N';
895d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
896d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    latsecfrac = latval % 1000;
897d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    latval = latval / 1000;
898d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    latsec = latval % 60;
899d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    latval = latval / 60;
900d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    latmin = latval % 60;
901d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    latval = latval / 60;
902d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    latdeg = latval;
903d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
904d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (longval < 0) {
905d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        eastwest = 'W';
906d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        longval = -longval;
907d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    } else
908d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        eastwest = 'E';
909d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
910d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    longsecfrac = longval % 1000;
911d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    longval = longval / 1000;
912d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    longsec = longval % 60;
913d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    longval = longval / 60;
914d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    longmin = longval % 60;
915d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    longval = longval / 60;
916d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    longdeg = longval;
917d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
918d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    altfrac = altval % 100;
919d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    altmeters = (altval / 100) * altsign;
920d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
921d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if ((sizestr = strdup(precsize_ntoa(sizeval))) == NULL)
922d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        sizestr = error;
923d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if ((hpstr = strdup(precsize_ntoa(hpval))) == NULL)
924d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        hpstr = error;
925d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if ((vpstr = strdup(precsize_ntoa(vpval))) == NULL)
926d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        vpstr = error;
927d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
928d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    sprintf(ascii,
929d7ce700605e1af0e455e31ec11f19ff21d26b525darylm          "%d %.2d %.2d.%.3d %c %d %.2d %.2d.%.3d %c %d.%.2dm %sm %sm %sm",
930d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        latdeg, latmin, latsec, latsecfrac, northsouth,
931d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        longdeg, longmin, longsec, longsecfrac, eastwest,
932d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        altmeters, altfrac, sizestr, hpstr, vpstr);
933d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
934d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (sizestr != error)
935d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        free(sizestr);
936d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (hpstr != error)
937d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        free(hpstr);
938d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (vpstr != error)
939d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        free(vpstr);
940d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
941d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    return (ascii);
942d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
943d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
944d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
945d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* Return the number of DNS hierarchy levels in the name. */
946d7ce700605e1af0e455e31ec11f19ff21d26b525darylmint
947d7ce700605e1af0e455e31ec11f19ff21d26b525darylmdn_count_labels(const char *name) {
948d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int i, len, count;
949d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
950d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    len = (int)strlen(name);
951d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    for (i = 0, count = 0; i < len; i++) {
952d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        /* XXX need to check for \. or use named's nlabels(). */
953d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (name[i] == '.')
954d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            count++;
955d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
956d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
957d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    /* don't count initial wildcard */
958d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (name[0] == '*')
959d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (count)
960d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            count--;
961d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
962d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    /* don't count the null label for root. */
963d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    /* if terminating '.' not found, must adjust */
964d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    /* count to include last label */
965d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (len > 0 && name[len-1] != '.')
966d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        count++;
967d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    return (count);
968d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
969d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
970d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
971d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/*
972d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Make dates expressed in seconds-since-Jan-1-1970 easy to read.
973d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * SIG records are required to be printed like this, by the Secure DNS RFC.
974d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */
975d7ce700605e1af0e455e31ec11f19ff21d26b525darylmchar *
976d7ce700605e1af0e455e31ec11f19ff21d26b525darylmp_secstodate (u_long secs) {
977d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    static char output[15];     /* YYYYMMDDHHMMSS and null */
978d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    time_t clock = (time_t)secs;
979d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    struct tm *time;
980d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
981d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    time = gmtime(&clock);
982d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    time->tm_year += 1900;
983d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    time->tm_mon += 1;
984d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    sprintf(output, "%04d%02d%02d%02d%02d%02d",
985d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        time->tm_year, time->tm_mon, time->tm_mday,
986d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        time->tm_hour, time->tm_min, time->tm_sec);
987d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    return (output);
988d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
989