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