summaryrefslogtreecommitdiff
path: root/contrib/bind/bin/nslookup
diff options
context:
space:
mode:
authorDag-Erling Smørgrav <des@FreeBSD.org>2004-09-24 19:48:50 +0000
committerDag-Erling Smørgrav <des@FreeBSD.org>2004-09-24 19:48:50 +0000
commit29d75632bd276029d874c42e613218086eebd6dd (patch)
treebb3edb8dcc07615d426eb359f46c1741e4c22575 /contrib/bind/bin/nslookup
parent8540155e95215c1e3287e1c7de8ec20d820b7692 (diff)
Notes
Diffstat (limited to 'contrib/bind/bin/nslookup')
-rw-r--r--contrib/bind/bin/nslookup/Makefile98
-rw-r--r--contrib/bind/bin/nslookup/commands.l273
-rw-r--r--contrib/bind/bin/nslookup/debug.c657
-rw-r--r--contrib/bind/bin/nslookup/getinfo.c1104
-rw-r--r--contrib/bind/bin/nslookup/list.c705
-rw-r--r--contrib/bind/bin/nslookup/main.c1327
-rw-r--r--contrib/bind/bin/nslookup/nslookup.help33
-rw-r--r--contrib/bind/bin/nslookup/pathnames.h73
-rw-r--r--contrib/bind/bin/nslookup/res.h227
-rw-r--r--contrib/bind/bin/nslookup/send.c404
-rw-r--r--contrib/bind/bin/nslookup/skip.c219
-rw-r--r--contrib/bind/bin/nslookup/subr.c603
12 files changed, 0 insertions, 5723 deletions
diff --git a/contrib/bind/bin/nslookup/Makefile b/contrib/bind/bin/nslookup/Makefile
deleted file mode 100644
index 27073c15623b..000000000000
--- a/contrib/bind/bin/nslookup/Makefile
+++ /dev/null
@@ -1,98 +0,0 @@
-## Copyright (c) 1996,1999 by Internet Software Consortium
-##
-## Permission to use, copy, modify, and distribute this software for any
-## purpose with or without fee is hereby granted, provided that the above
-## copyright notice and this permission notice appear in all copies.
-##
-## THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
-## ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
-## OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
-## CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
-## DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
-## PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
-## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-## SOFTWARE.
-
-# $Id: Makefile,v 8.28 2002/05/21 00:44:59 marka Exp $
-
-DESTDIR=
-CC= cc
-SHELL= /bin/sh
-
-CDEBUG= -g -Wall
-
-#(net2 and its descendents)
-SYSTYPE = freebsd
-TOP = ../..
-INCL = ${TOP}/include
-PORTINCL = ${TOP}/port/${SYSTYPE}/include
-LIBBIND = ${TOP}/lib/libbind.a
-A=a
-O=o
-EXE=
-LEX = lex -I
-SYSLIBS =-lutil
-LIBL=-ll
-DESTBIN = /usr/local/bin
-DESTSBIN = /usr/local/sbin
-DESTEXEC = /usr/local/libexec
-DESTMAN = /usr/share/man
-DESTHELP= /usr/share/misc
-STRIP=-s
-INSTALL_EXEC=
-INSTALL_LIB=-o bin -g bin
-
-LDFLAGS=
-DEFS= -D_PATH_HELPFILE=\"${DESTHELP}/nslookup.help\"
-CFLAGS= ${CDEBUG}
-CPPFLAGS= -I${PORTINCL} -I${INCL} ${DEFS}
-
-PROG= nslookup
-CSRCS= main.c getinfo.c debug.c send.c skip.c list.c subr.c
-SRCS= ${CSRCS} commands.l
-OBJS= main.${O} getinfo.${O} debug.${O} send.${O} skip.${O} list.${O} \
- subr.${O} commands.${O}
-
-all: ${PROG}${EXE}
-
-${PROG}${EXE}: ${OBJS} ${LIBBIND} Makefile
- ${CC} ${CDEBUG} ${LDFLAGS} ${BOUNDS} -o ${PROG}${EXE} ${OBJS} \
- ${LIBBIND} ${LIBL} ${SYSLIBS}
-
-.c.${O}:
- ${CC} ${CPPFLAGS} ${CFLAGS} ${BOUNDS} -c $*.c
-
-distclean: clean
- rm -f commands.c
-
-clean: FRC
- rm -f ${PROG}${EXE} ${OBJS} core .depend
- rm -f *.BAK *.CKP *~ *.orig
- rm -f lex.yy.c lex.yy.o
-
-depend: ${SRCS}
- mkdep ${CPPFLAGS} -I${INCL} -I${PORTINCL} ${DEFS} ${CSRCS}
-
-${DESTDIR}${DESTHELP}:
- mkdir -p ${DESTDIR}${DESTHELP}
-
-${DESTDIR}${DESTBIN}:
- mkdir -p ${DESTDIR}${DESTBIN}
-
-install: ${DESTDIR}${DESTBIN} ${DESTDIR}${DESTHELP} ${PROG}${EXE}
- ${INSTALL} ${STRIP} -c ${INSTALL_EXEC} -m 755 ${PROG}${EXE} ${DESTDIR}${DESTBIN}/${PROG}${EXE}
- ${INSTALL} -c ${INSTALL_LIB} -m 444 nslookup.help ${DESTDIR}${DESTHELP}/
-
-links: FRC
- @set -e; ln -s SRC/*.[chl] SRC/nslookup.help .
-
-tags: FRC
- ctags ${CSRCS} *.h
-
-commands.c: commands.l
- ${LEX} -t $< > $@ || rm $@
-
-FRC:
-
-# DO NOT DELETE THIS LINE -- mkdep uses it.
-# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.
diff --git a/contrib/bind/bin/nslookup/commands.l b/contrib/bind/bin/nslookup/commands.l
deleted file mode 100644
index 313c1d0fe649..000000000000
--- a/contrib/bind/bin/nslookup/commands.l
+++ /dev/null
@@ -1,273 +0,0 @@
-%{
-/* $FreeBSD$ */
-/*
- * Copyright (c) 1985
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Portions Copyright (c) 1993 by Digital Equipment Corporation.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies, and that
- * the name of Digital Equipment Corporation not be used in advertising or
- * publicity pertaining to distribution of the document or software without
- * specific, written prior permission.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
- * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)commands.l 5.13 (Berkeley) 7/24/90";
-#endif /* not lint */
-
-/*
- *******************************************************************************
- *
- * commands.l
- *
- * Andrew Cherenson CS298-26 Fall 1985
- *
- * Lex input file for the nslookup program command interpreter.
- * When a sequence is recognized, the associated action
- * routine is called. The action routine may need to
- * parse the string for additional information.
- *
- * Recognized commands: (identifiers are shown in uppercase)
- *
- * server NAME - set default server to NAME, using default server
- * lserver NAME - set default server to NAME, using initial server
- * finger [NAME] - finger the optional NAME
- * exit - exit the program
- * root - set default server to the root
- * ls NAME - list the domain NAME
- * set OPTION - set an option
- * help - print help information
- * ? - print help information
- * NAME - print info about the host/domain NAME
- * using default server.
- * NAME1 NAME2 - as above, but use NAME2 as server
- *
- *
- * yylex Results:
- * 0 upon end-of-file.
- * 1 after each command.
- *
- *******************************************************************************
- */
-
-#include "port_before.h"
-#include <sys/types.h>
-#include <netinet/in.h>
-#include <histedit.h>
-#include "port_after.h"
-#include <resolv.h>
-#include "res.h"
-
-extern char rootServerName[];
-extern void PrintHelp();
-
-#define YY_INPUT(buf, result, max_size) \
- { \
- nslookup_yy_input((char *)buf, &result, \
- max_size, yy_current_buffer->yy_is_interactive); \
- }
-
-const char *
-nslookup_prompt()
-{
- return ("> ");
-}
-
-int
-nslookup_yy_input(buf, result, max_size, intr)
- char * buf;
- int * result;
- int max_size;
- int intr;
-{
- static EditLine *el = NULL;
- static History *hist = NULL;
- HistEvent he;
- int num = 0;
- const char *bp = NULL;
-
- if (intr) {
- if (!el) {
- el = el_init("nslookup", yyin, yyout, stderr);
- hist = history_init();
- history(hist, &he, H_EVENT, 100);
- el_set(el, EL_HIST, history, hist);
- el_set(el, EL_EDITOR, "emacs");
- el_set(el, EL_PROMPT, nslookup_prompt);
- el_set(el, EL_SIGNAL, 1);
- el_source(el, NULL);
- }
-
- if ((bp = el_gets(el, &num)) == NULL || num == 0) {
- *result = 0;
- return;
- }
-
- *result = (num > max_size) ? max_size : num;
- strncpy(buf, bp, *result);
- history(hist, &he, H_ENTER, bp);
- } else {
- if ( ((*result = fread( buf, 1, max_size, yyin )) == 0)
- && ferror( yyin ) )
- yy_fatal_error( "input in flex scanner failed" );
- }
-
- return;
-}
-
-%}
-WS [ \t]
-FLET [:A-Za-z0-9.*\\_]
-LET [:A-Za-z0-9.*_]
-NAME [:A-Za-z0-9.*=_/-]
-%%
-^{WS}*server{WS}+{LET}{NAME}*{WS}*$ {
- /*
- * 0 == use current server to find
- * the new one.
- * 1 == use original server to find
- * the new one.
- */
- SetDefaultServer((char*)yytext, 0);
- return(1);
- }
-^{WS}*lserver{WS}+{LET}{NAME}*{WS}*$ {
- SetDefaultServer((char*)yytext, 1);
- return(1);
- }
-^{WS}*exit{WS}*$ {
- return(0);
- }
-^{WS}*root{WS}*$ {
- SetDefaultServer(rootServerName, 1);
- return(1);
- }
-^{WS}*finger({WS}+{LET}{NAME}*)?{WS}+>>?{WS}*{NAME}+{WS}*$ {
- /*
- * 2nd arg.
- * 0 == output to stdout
- * 1 == output to file
- */
- Finger((char*)yytext, 1);
- return(1);
- }
-^{WS}*finger({WS}+{LET}{NAME}*)?{WS}*$ {
- Finger((char*)yytext, 0);
- return(1);
- }
-^{WS}*ls{WS}+(("-a"|"-d"|"-h"|"-m"|"-s"){WS}+)?{LET}{NAME}*{WS}+>>?{WS}+{NAME}+{WS}*$ {
- /*
- * 2nd arg.
- * 0 == output to stdout
- * 1 == output to file
- */
- ListHosts((char*)yytext, 1);
- return(1);
- }
-^{WS}*ls{WS}+(("-a"|"-d"|"-h"|"-m"|"-s"){WS}+)?{LET}{NAME}*{WS}*$ {
- ListHosts((char*)yytext, 0);
- return(1);
- }
-^{WS}*ls{WS}+-t{WS}+({LET}{NAME}*{WS}+)?{LET}{NAME}*{WS}+>>?{WS}+{NAME}+{WS}*$ {
- /*
- * 2nd arg.
- * 0 == output to stdout
- * 1 == output to file
- */
- ListHostsByType((char*)yytext, 1);
- return(1);
- }
-^{WS}*ls{WS}+-t{WS}+({LET}{NAME}*{WS}+)?{LET}{NAME}*{WS}*$ {
- ListHostsByType((char*)yytext, 0);
- return(1);
- }
-^{WS}*set{WS}+{NAME}+{WS}*$ {
- SetOption((char*)yytext);
- return(1);
- }
-^{WS}*help{WS}*$ {
- PrintHelp();
- return(1);
- }
-^{WS}*"?"{WS}*$ {
- extern void PrintHelp();
-
- PrintHelp();
- return(1);
- }
-^{WS}*{FLET}{NAME}*{WS}+>>?{WS}*{NAME}+{WS}*$ {
- /*
- * 0 == output to stdout
- * 1 == output to file
- */
- LookupHost((char*)yytext, 1);
- return(1);
- }
-^{WS}*{FLET}{NAME}*{WS}*$ {
- LookupHost((char*)yytext, 0);
- return(1);
- }
-^{WS}*{FLET}{NAME}*{WS}+{LET}{NAME}*{WS}+>>?{WS}*{NAME}+{WS}*$ {
- /*
- * 0 == output to stdout
- * 1 == output to file
- */
- LookupHostWithServer((char*)yytext, 1);
- return(1);
- }
-^{WS}*{FLET}{NAME}*{WS}+{LET}{NAME}*{WS}*$ {
- LookupHostWithServer((char*)yytext, 0);
- return(1);
- }
-^{WS}*\n {
- return(1);
- }
-^.*\n {
- printf("Unrecognized command: %s",
- (char*)yytext);
- return(1);
- }
-\n { ; }
-%%
diff --git a/contrib/bind/bin/nslookup/debug.c b/contrib/bind/bin/nslookup/debug.c
deleted file mode 100644
index 1d99ddc50eb4..000000000000
--- a/contrib/bind/bin/nslookup/debug.c
+++ /dev/null
@@ -1,657 +0,0 @@
-/* $FreeBSD$ */
-/*
- * Copyright (c) 1985, 1989
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Portions Copyright (c) 1993 by Digital Equipment Corporation.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies, and that
- * the name of Digital Equipment Corporation not be used in advertising or
- * publicity pertaining to distribution of the document or software without
- * specific, written prior permission.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
- * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- */
-
-#ifndef lint
-static const char sccsid[] = "@(#)debug.c 5.26 (Berkeley) 3/21/91";
-static const char rcsid[] = "$Id: debug.c,v 8.19 2001/09/25 04:50:26 marka Exp $";
-#endif /* not lint */
-
-/*
- *******************************************************************************
- *
- * debug.c --
- *
- * Routines to print out packets received from a name server query.
- *
- * Modified version of 4.3BSD BIND res_debug.c 5.30 6/27/90
- *
- *******************************************************************************
- */
-
-#include "port_before.h"
-
-#include <sys/param.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-#include <arpa/inet.h>
-
-#include <netdb.h>
-#include <resolv.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "port_after.h"
-
-#include "res.h"
-
-/*
- * Imported from res_debug.c
- */
-#ifndef HAVE_DECL_RES_OPCODES
-extern char *_res_opcodes[];
-#endif
-
-/*
- * Used to highlight the start of a record when printing it.
- */
-#define INDENT " -> "
-
-/*
- * Print the contents of a query.
- * This is intended to be primarily a debugging routine.
- */
-
-void
-Print_query(const u_char *msg, const u_char *eom, int printHeader) {
- Fprint_query(msg, eom, printHeader, stdout);
-}
-
-void
-Fprint_query(const u_char *msg, const u_char *eom, int printHeader, FILE *file)
-{
- const u_char *cp;
- const HEADER *hp;
- int n;
- u_int class, type = 0;
-
- /*
- * Print header fields.
- */
- hp = (const HEADER *)msg;
- cp = msg + HFIXEDSZ;
- if (printHeader || (res.options & RES_DEBUG2)) {
- fprintf(file," HEADER:\n");
- fprintf(file,"\topcode = %s", _res_opcodes[hp->opcode]);
- fprintf(file,", id = %d", ntohs(hp->id));
- fprintf(file,", rcode = %s\n", p_rcode(hp->rcode));
- fprintf(file,"\theader flags: ");
- if (hp->qr) {
- fprintf(file," response");
- } else {
- fprintf(file," query");
- }
- if (hp->aa)
- fprintf(file,", auth. answer");
- if (hp->tc)
- fprintf(file,", truncation");
- if (hp->rd)
- fprintf(file,", want recursion");
- if (hp->ra)
- fprintf(file,", recursion avail.");
- if (hp->unused)
- fprintf(file,", UNUSED-QUERY_BIT");
- if (hp->ad)
- fprintf(file,", authentic data");
- if (hp->cd)
- fprintf(file,", checking disabled");
- fprintf(file,"\n\tquestions = %d", ntohs(hp->qdcount));
- fprintf(file,", answers = %d", ntohs(hp->ancount));
- fprintf(file,", authority records = %d", ntohs(hp->nscount));
- fprintf(file,", additional = %d\n\n", ntohs(hp->arcount));
- }
-
- /*
- * Print question records.
- */
- n = ntohs(hp->qdcount);
- if (n > 0) {
- fprintf(file," QUESTIONS:\n");
- while (--n >= 0) {
- fprintf(file,"\t");
- cp = Print_cdname(cp, msg, eom, file);
- if (cp == NULL)
- return;
- type = ns_get16((const u_char*)cp);
- cp += INT16SZ;
- class = ns_get16((const u_char*)cp);
- cp += INT16SZ;
- fprintf(file,", type = %s", p_type(type));
- fprintf(file,", class = %s\n", p_class(class));
- }
- }
- /*
- * Print authoritative answer records
- */
- n = ntohs(hp->ancount);
- if (n > 0) {
- fprintf(file," ANSWERS:\n");
- if (type == ns_t_a && n > MAXADDRS) {
- printf("Limiting response to MAX Addrs = %d \n",
- MAXADDRS);
- n = MAXADDRS;
- }
- while (--n >= 0) {
- fprintf(file, INDENT);
- cp = Print_rr(cp, msg, eom, file);
- if (cp == NULL)
- return;
- }
- }
- /*
- * print name server records
- */
- n = ntohs(hp->nscount);
- if (n > 0) {
- fprintf(file," AUTHORITY RECORDS:\n");
- while (--n >= 0) {
- fprintf(file, INDENT);
- cp = Print_rr(cp, msg, eom, file);
- if (cp == NULL)
- return;
- }
- }
- /*
- * print additional records
- */
- n = ntohs(hp->arcount);
- if (n > 0) {
- fprintf(file," ADDITIONAL RECORDS:\n");
- while (--n >= 0) {
- fprintf(file, INDENT);
- cp = Print_rr(cp, msg, eom, file);
- if (cp == NULL)
- return;
- }
- }
- fprintf(file,"\n------------\n");
-}
-
-static const u_char *
-Print_cdname_sub(const u_char *cp, const u_char *msg, const u_char *eom,
- FILE *file, int format)
-{
- char name[MAXDNAME];
- int n;
-
- n = dn_expand(msg, eom, cp, name, sizeof name);
- if (n < 0)
- return (NULL);
- if (name[0] == '\0')
- strcpy(name, "(root)");
- if (format)
- fprintf(file, "%-30s", name);
- else
- fputs(name, file);
- return (cp + n);
-}
-
-const u_char *
-Print_cdname(const u_char *cp, const u_char *msg, const u_char *eom,
- FILE *file)
-{
- return (Print_cdname_sub(cp, msg, eom, file, 0));
-}
-
-const u_char *
-Print_cdname2(const u_char *cp, const u_char *msg, const u_char *eom,
- FILE *file)
-{
- return (Print_cdname_sub(cp, msg, eom, file, 1));
-}
-
-#define BOUNDS_CHECK(ptr, count) \
- do { \
- if ((ptr) + (count) > eom) { \
- fprintf(file, "(form error.)\n"); \
- return (NULL); \
- } \
- } while (0)
-
-/*
- * Print resource record fields in human readable form (not master file form).
- */
-const u_char *
-Print_rr(const u_char *ocp, const u_char *msg, const u_char *eom, FILE *file) {
- u_int type, class;
- int dlen, n, c, debug;
- u_long rrttl, ttl;
- struct in_addr inaddr;
- const u_char *cp, *cp1, *cp2;
-
- if ((cp = Print_cdname(ocp, msg, eom, file)) == NULL) {
- fprintf(file, "(name truncated?)\n");
- return (NULL); /* compression error */
- }
-
- BOUNDS_CHECK(cp, 3 * INT16SZ + INT32SZ);
- NS_GET16(type, cp);
- NS_GET16(class, cp);
- NS_GET32(rrttl, cp);
- NS_GET16(dlen, cp);
- BOUNDS_CHECK(cp, dlen);
-
- debug = res.options & (RES_DEBUG|RES_DEBUG2);
- if (debug) {
- if (res.options & RES_DEBUG2)
- fprintf(file,"\n\ttype = %s, class = %s, dlen = %d",
- p_type(type), p_class(class), dlen);
- if (type == T_SOA)
- fprintf(file,"\n\tttl = %lu (%s)",
- rrttl, p_time(rrttl));
- putc('\n', file);
- }
-
- cp1 = cp;
-
- /*
- * Print type specific data, if appropriate
- */
- switch (type) {
- case T_A:
- BOUNDS_CHECK(cp, INADDRSZ);
- memcpy(&inaddr, cp, INADDRSZ);
- fprintf(file,"\tinternet address = %s\n", inet_ntoa(inaddr));
- cp += dlen;
- break;
-
- case T_CNAME:
- fprintf(file,"\tcanonical name = ");
- goto doname;
-
- case T_MG:
- fprintf(file,"\tmail group member = ");
- goto doname;
-
- case T_MB:
- fprintf(file,"\tmail box = ");
- goto doname;
-
- case T_MR:
- fprintf(file,"\tmailbox rename = ");
- goto doname;
-
- case T_MX:
- BOUNDS_CHECK(cp, INT16SZ);
- fprintf(file,"\tpreference = %u",ns_get16((const u_char*)cp));
- cp += INT16SZ;
- fprintf(file,", mail exchanger = ");
- goto doname;
-
- case T_NAPTR:
- BOUNDS_CHECK(cp, 2 * INT16SZ);
- fprintf(file, "\torder = %u",ns_get16((const u_char*)cp));
- cp += INT16SZ;
- fprintf(file,", preference = %u\n", ns_get16((const u_char*)cp));
- cp += INT16SZ;
- /* Flags */
- BOUNDS_CHECK(cp, 1);
- n = *cp++;
- BOUNDS_CHECK(cp, n);
- fprintf(file,"\tflags = \"%.*s\"\n", (int)n, cp);
- cp += n;
- /* Service */
- BOUNDS_CHECK(cp, 1);
- n = *cp++;
- BOUNDS_CHECK(cp, n);
- fprintf(file,"\tservices = \"%.*s\"\n", (int)n, cp);
- cp += n;
- /* Regexp */
- BOUNDS_CHECK(cp, 1);
- n = *cp++;
- BOUNDS_CHECK(cp, n);
- fprintf(file,"\trule = \"%.*s\"\n", (int)n, cp);
- cp += n;
- /* Replacement */
- fprintf(file,"\treplacement = ");
- cp = Print_cdname(cp, msg, eom, file);
- if (cp == NULL) {
- fprintf(file, "(replacement truncated?)\n");
- return (NULL); /* compression error */
- }
- (void) putc('\n', file);
- break;
-
- case T_SRV:
- BOUNDS_CHECK(cp, 3 * INT16SZ);
- fprintf(file, "\tpriority = %u",ns_get16((const u_char*)cp));
- cp += INT16SZ;
- fprintf(file,", weight = %u", ns_get16((const u_char*)cp));
- cp += INT16SZ;
- fprintf(file,", port= %u\n", ns_get16((const u_char*)cp));
- cp += INT16SZ;
-
- fprintf(file,"\thost = ");
- goto doname;
-
- case T_PX:
- BOUNDS_CHECK(cp, INT16SZ);
- fprintf(file,"\tpreference = %u",ns_get16((const u_char*)cp));
- cp += INT16SZ;
- fprintf(file,", RFC 822 = ");
- cp = Print_cdname(cp, msg, eom, file);
- if (cp == NULL) {
- fprintf(file, "(name truncated?)\n");
- return (NULL); /* compression error */
- }
- fprintf(file,"\nX.400 = ");
- cp = Print_cdname(cp, msg, eom, file);
- if (cp == NULL) {
- fprintf(file, "(name truncated?)\n");
- return (NULL); /* compression error */
- }
- (void) putc('\n', file);
- break;
-
- case T_RT:
- BOUNDS_CHECK(cp, INT16SZ);
- fprintf(file,"\tpreference = %u",ns_get16((const u_char*)cp));
- cp += INT16SZ;
- fprintf(file,", router = ");
- goto doname;
-
- case T_AFSDB:
- BOUNDS_CHECK(cp, INT16SZ);
- fprintf(file,"\tsubtype = %d",ns_get16((const u_char*)cp));
- cp += INT16SZ;
- fprintf(file,", DCE/AFS server = ");
- goto doname;
-
- case T_NS:
- fprintf(file,"\tnameserver = ");
- goto doname;
-
- case T_PTR:
- fprintf(file,"\tname = ");
- doname:
- cp = Print_cdname(cp, msg, eom, file);
- if (cp == NULL) {
- fprintf(file, "(name truncated?)\n");
- return (NULL); /* compression error */
- }
- (void) putc('\n', file);
- break;
-
- case T_HINFO:
- cp2 = cp + dlen;
- BOUNDS_CHECK(cp, 1);
- if ((n = *cp++) != 0) {
- BOUNDS_CHECK(cp, n);
- fprintf(file,"\tCPU = %.*s", n, cp);
- cp += n;
- }
- if ((cp < cp2) && ((n = *cp++) != 0)) {
- BOUNDS_CHECK(cp, n);
- fprintf(file,"\tOS = %.*s\n", n, cp);
- cp += n;
- } else fprintf(file, "\n*** Warning *** OS-type missing\n");
- break;
-
- case T_ISDN:
- cp2 = cp + dlen;
- BOUNDS_CHECK(cp, 1);
- n = *cp++;
- if (n != 0) {
- BOUNDS_CHECK(cp, n);
- fprintf(file,"\tISDN = \"%.*s", n, cp);
- cp += n;
- }
- if ((cp < cp2) && (n = *cp++)) {
- BOUNDS_CHECK(cp, n);
- fprintf(file,"-%.*s\"\n", n, cp);
- cp += n;
- } else fprintf(file,"\"\n");
- break;
-
- case T_SOA:
- if (!debug)
- putc('\n', file);
- fprintf(file,"\torigin = ");
- cp = Print_cdname(cp, msg, eom, file);
- if (cp == NULL) {
- fprintf(file, "(name truncated?)\n");
- return (NULL); /* compression error */
- }
- fprintf(file,"\n\tmail addr = ");
- cp = Print_cdname(cp, msg, eom, file);
- if (cp == NULL) {
- fprintf(file, "(name truncated?)\n");
- return (NULL); /* compression error */
- }
- BOUNDS_CHECK(cp, 5 * INT32SZ);
- fprintf(file,"\n\tserial = %lu", ns_get32((const u_char*)cp));
- cp += INT32SZ;
- ttl = ns_get32((const u_char*)cp);
- fprintf(file,"\n\trefresh = %lu (%s)", ttl, p_time(ttl));
- cp += INT32SZ;
- ttl = ns_get32((const u_char*)cp);
- fprintf(file,"\n\tretry = %lu (%s)", ttl, p_time(ttl));
- cp += INT32SZ;
- ttl = ns_get32((const u_char*)cp);
- fprintf(file,"\n\texpire = %lu (%s)", ttl, p_time(ttl));
- cp += INT32SZ;
- ttl = ns_get32((const u_char*)cp);
- fprintf(file,
- "\n\tminimum ttl = %lu (%s)\n", ttl, p_time(ttl));
- cp += INT32SZ;
- break;
-
- case T_MINFO:
- if (!debug)
- putc('\n', file);
- fprintf(file,"\trequests = ");
- cp = Print_cdname(cp, msg, eom, file);
- if (cp == NULL) {
- fprintf(file, "(name truncated?)\n");
- return (NULL); /* compression error */
- }
- fprintf(file,"\n\terrors = ");
- cp = Print_cdname(cp, msg, eom, file);
- if (cp == NULL) {
- fprintf(file, "(name truncated?)\n");
- return (NULL); /* compression error */
- }
- (void) putc('\n', file);
- break;
-
- case T_RP:
- if (!debug)
- putc('\n', file);
- fprintf(file,"\tmailbox = ");
- cp = Print_cdname(cp, msg, eom, file);
- if (cp == NULL) {
- fprintf(file, "(name truncated?)\n");
- return (NULL); /* compression error */
- }
- fprintf(file,"\n\ttext = ");
- cp = Print_cdname(cp, msg, eom, file);
- if (cp == NULL) {
- fprintf(file, "(name truncated?)\n");
- return (NULL); /* compression error */
- }
- (void) putc('\n', file);
- break;
-
- case T_TXT:
- (void) fputs("\ttext = ", file);
- cp2 = cp1 + dlen;
- while (cp < cp2) {
- (void) putc('"', file);
- n = (unsigned char) *cp++;
- if (n != 0) {
- for (c = n; c > 0 && cp < cp2; c--) {
- if ((*cp == '\n') || (*cp == '"') || (*cp == '\\'))
- (void) putc('\\', file);
- (void) putc(*cp++, file);
- }
- }
- (void) putc('"', file);
- if (cp < cp2)
- (void) putc(' ', file);
- }
- (void) putc('\n', file);
- break;
-
- case T_X25:
- (void) fputs("\tX25 = \"", file);
- cp2 = cp1 + dlen;
- while (cp < cp2) {
- n = (unsigned char) *cp++;
- if (n != 0) {
- for (c = n; c > 0 && cp < cp2; c--)
- if (*cp == '\n') {
- (void) putc('\\', file);
- (void) putc(*cp++, file);
- } else
- (void) putc(*cp++, file);
- }
- }
- (void) fputs("\"\n", file);
- break;
-
- case T_NSAP:
- fprintf(file, "\tnsap = %s\n", inet_nsap_ntoa(dlen, cp, NULL));
- cp += dlen;
- break;
-
- case T_AAAA: {
- char t[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"];
-
- BOUNDS_CHECK(cp, IN6ADDRSZ);
- fprintf(file, "\tIPv6 address = %s\n",
- inet_ntop(AF_INET6, cp, t, sizeof t));
- cp += IN6ADDRSZ;
- break;
- }
-
- case T_WKS: {
- struct protoent *protoPtr;
-
- BOUNDS_CHECK(cp, INADDRSZ + 1);
- if (!debug)
- (void) putc('\n', file);
- memcpy(&inaddr, cp, INADDRSZ);
- cp += INADDRSZ;
- if ((protoPtr = getprotobynumber(*cp)) != NULL) {
- fprintf(file,"\tinet address = %s, protocol = %s\n\t",
- inet_ntoa(inaddr), protoPtr->p_name);
- } else {
- fprintf(file,"\tinet address = %s, protocol = %d\n\t",
- inet_ntoa(inaddr), *cp);
- }
- cp++;
- n = 0;
- while (cp < cp1 + dlen) {
- c = *cp++;
- do {
- struct servent *s;
-
- if (c & 0200) {
- s = getservbyport((int)htons(n),
- protoPtr ? protoPtr->p_name : NULL);
- if (s != NULL) {
- fprintf(file," %s", s->s_name);
- } else {
- fprintf(file," #%d", n);
- }
- }
- c <<= 1;
- } while (++n & 07);
- }
- putc('\n',file);
- break;
- }
-
- case T_NULL:
- fprintf(file, "\tNULL (dlen %d)\n", dlen);
- cp += dlen;
- break;
-
- case T_NXT:
- case T_SIG:
- case T_KEY:
- default: {
- char buf[2048]; /* XXX need to malloc/realloc. */
- char rrname[NS_MAXDNAME];
-
- cp2 = p_fqnname(ocp, msg, NS_MAXCDNAME, rrname, sizeof rrname);
- if (cp2 == NULL) {
- fprintf(file, "(name truncated?)\n");
- return (NULL); /* compression error */
- }
-
- if (ns_sprintrrf(msg, eom - msg, rrname, (ns_class)class,
- (ns_type)type, rrttl, cp1, dlen, NULL, NULL,
- buf, sizeof buf) < 0) {
- perror("ns_sprintrrf");
- } else {
- fprintf(file,
- "\trecord type %s, interpreted as:\n%s\n",
- p_type(type), buf);
- }
- cp += dlen;
- }
- }
- if (res.options & RES_DEBUG && type != T_SOA) {
- fprintf(file,"\tttl = %lu (%s)\n", rrttl, p_time(rrttl));
- }
- if (cp != cp1 + dlen) {
- fprintf(file,
- "\n*** Error: record size incorrect (%d != %d)\n\n",
- cp - cp1, dlen);
- cp = NULL;
- }
- return (cp);
-}
diff --git a/contrib/bind/bin/nslookup/getinfo.c b/contrib/bind/bin/nslookup/getinfo.c
deleted file mode 100644
index d074179df4ee..000000000000
--- a/contrib/bind/bin/nslookup/getinfo.c
+++ /dev/null
@@ -1,1104 +0,0 @@
-/* $FreeBSD$ */
-/*
- * Copyright (c) 1985, 1989
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Portions Copyright (c) 1993 by Digital Equipment Corporation.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies, and that
- * the name of Digital Equipment Corporation not be used in advertising or
- * publicity pertaining to distribution of the document or software without
- * specific, written prior permission.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
- * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- */
-
-#ifndef lint
-static const char sccsid[] = "@(#)getinfo.c 5.26 (Berkeley) 3/21/91";
-static const char rcsid[] = "$Id: getinfo.c,v 8.29.8.2 2003/06/02 09:24:39 marka Exp $";
-#endif /* not lint */
-
-/*
- ******************************************************************************
- *
- * getinfo.c --
- *
- * Routines to create requests to name servers
- * and interpret the answers.
- *
- * Adapted from 4.3BSD BIND gethostnamadr.c
- *
- ******************************************************************************
- */
-
-#include "port_before.h"
-
-#include <sys/param.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-#include <arpa/inet.h>
-
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "port_after.h"
-
-#include <resolv.h>
-
-#include "res.h"
-
-static char *addr_list[MAXADDRS + 1];
-static int addr_len[MAXADDRS + 1];
-static int addr_type[MAXADDRS + 1];
-
-static char *host_aliases[MAXALIASES];
-static int host_aliases_len[MAXALIASES];
-static u_char hostbuf[MAXDNAME];
-
-typedef struct {
- char *name;
- char *domain[MAXDOMAINS];
- int numDomains;
- char *address[MAXADDRS];
- char len[MAXADDRS];
- char type[MAXADDRS];
- int numAddresses;
-} ServerTable;
-
-ServerTable server[MAXSERVERS];
-
-typedef union {
- HEADER qb1;
- u_char qb2[NS_MAXMSG];
-} querybuf;
-
-typedef union {
- int32_t al;
- char ac;
-} align;
-
-#define GetShort(cp) ns_get16(cp); cp += INT16SZ;
-
-
-/*
- ******************************************************************************
- *
- * GetAnswer --
- *
- * Interprets an answer packet and retrieves the following
- * information:
- *
- * Results:
- * SUCCESS the info was retrieved.
- * NO_INFO the packet did not contain an answer.
- * NONAUTH non-authoritative information was found.
- * ERROR the answer was malformed.
- * Other errors returned in the packet header.
- *
- ******************************************************************************
- */
-
-static int
-GetAnswer(union res_sockaddr_union *nsAddrPtr, int queryType,
- char *msg, int msglen, Boolean iquery, HostInfo *hostPtr,
- Boolean isServer, Boolean merge)
-{
- register HEADER *headerPtr;
- register const u_char *cp;
- querybuf answer;
- char **aliasPtr;
- u_char *eom, *bp, *ep;
- char **addrPtr;
- int *lenPtr;
- int *typePtr;
- char *namePtr;
- char *dnamePtr;
- int type, class;
- int qdcount, ancount, arcount, nscount;
- int origClass = 0;
- int numAliases = 0;
- int numAddresses = 0;
- int n, i, j, k, l, m;
- int dlen;
- int status;
- int numServers;
- size_t s;
- Boolean haveAnswer;
- Boolean printedAnswers = FALSE;
- int oldAliases;
- char **newAliases;
- int oldServers;
- ServerInfo **newServers;
- int oldAddresses;
- AddrInfo **newAddresses;
-
-
- /*
- * If the hostPtr was used before, free up the calloc'd areas.
- */
- if (!merge)
- FreeHostInfoPtr(hostPtr);
-
- status = SendRequest(nsAddrPtr, (u_char *)msg, msglen, (u_char *) &answer,
- sizeof(answer), &n);
-
- if (status != SUCCESS) {
- if (res.options & RES_DEBUG2)
- printf("SendRequest failed\n");
- return (status);
- }
- eom = (u_char *) &answer + n;
-
- headerPtr = (HEADER *) &answer;
-
- if (headerPtr->rcode != NOERROR) {
- return (headerPtr->rcode);
- }
-
- qdcount = ntohs(headerPtr->qdcount);
- ancount = ntohs(headerPtr->ancount);
- arcount = ntohs(headerPtr->arcount);
- nscount = ntohs(headerPtr->nscount);
-
- /*
- * If there are no answer, n.s. or additional records
- * then return with an error.
- */
- if (ancount == 0 && nscount == 0 && arcount == 0) {
- return (NO_INFO);
- }
-
-
- bp = hostbuf;
- ep = hostbuf + sizeof(hostbuf);
- cp = (u_char *) &answer + HFIXEDSZ;
-
- /* Skip over question section. */
- while (qdcount-- > 0) {
- n = dn_skipname(cp, eom);
- if (n < 0)
- return (ERROR);
- cp += n + QFIXEDSZ;
- if (cp > eom)
- return (ERROR);
- }
-
- aliasPtr = host_aliases;
- addrPtr = addr_list;
- lenPtr = addr_len;
- typePtr = addr_type;
- haveAnswer = FALSE;
-
- /*
- * Scan through the answer resource records.
- * Answers for address query types are saved.
- * Other query type answers are just printed.
- */
- if (ancount != 0) {
-
- if (headerPtr->ad)
- printf("Answer crypto-validated by server:\n");
-
- if (!isServer && !headerPtr->aa) {
- printf("Non-authoritative answer:\n");
- }
-
- if (queryType != T_A && queryType != T_AAAA && /* A6? */
- !(iquery && queryType == T_PTR)) {
- while (--ancount >= 0 && cp < eom) {
- if ((cp = Print_rr(cp, (u_char *)&answer,
- eom, stdout)) == NULL) {
- return(ERROR);
- }
- }
- printedAnswers = TRUE;
- } else {
- while (--ancount >= 0 && cp < eom) {
- n = dn_expand(answer.qb2, eom, cp, (char *)bp, ep - bp);
- if (n < 0)
- return(ERROR);
- cp += n;
- if (cp + 3 * INT16SZ + INT32SZ > eom)
- return (ERROR);
- type = GetShort(cp);
- class = GetShort(cp);
- cp += INT32SZ; /* skip TTL */
- dlen = GetShort(cp);
- if (cp + dlen > eom)
- return (ERROR);
- if (type == T_CNAME) {
- /*
- * Found an alias.
- */
- cp += dlen;
- if (aliasPtr >= &host_aliases[MAXALIASES-1]) {
- continue;
- }
- *aliasPtr++ = (char *)bp;
- s = strlen((char *)bp) + 1;
- host_aliases_len[numAliases] = s;
- numAliases++;
- bp += s;
- continue;
- } else if (type == T_PTR) {
- /*
- * Found a "pointer" to the real name.
- */
- n = dn_expand(answer.qb2, eom, cp, (char *)bp, ep - bp);
- if (n < 0) {
- cp += n;
- continue;
- }
- cp += n;
- s = strlen((char *)bp) + 1;
- hostPtr->name = Calloc(1, s);
- memcpy(hostPtr->name, bp, s);
- haveAnswer = TRUE;
- break;
- } else if (type != T_A && type != T_AAAA) {
- cp += dlen;
- continue;
- }
- if (type == T_A && dlen != INADDRSZ)
- return (ERROR);
- if (type == T_AAAA && dlen != 16)
- return (ERROR);
- if (haveAnswer) {
- /*
- * If we've already got 1 address, we aren't interested
- * in addresses with a different class.
- */
- if (class != origClass) {
- cp += dlen;
- continue;
- }
- } else {
- /*
- * First address: record its class so we only save
- * additonal ones with the same attributes.
- */
- origClass = class;
- if (hostPtr->name == NULL) {
- s = strlen((char *)bp) + 1;
- hostPtr->name = Calloc(1, s);
- memcpy(hostPtr->name, bp, s);
- }
- }
- bp += (((size_t)bp) % sizeof(align));
-
- if (bp + dlen >= &hostbuf[sizeof(hostbuf)]) {
- if (res.options & RES_DEBUG) {
- printf("Size (%d) too big\n", dlen);
- }
- break;
- }
- if (numAddresses >= MAXADDRS) {
- printf("MAXADDRS exceeded: skipping address\n");
- cp += dlen;
- continue;
- }
- memcpy(*addrPtr++ = (char *)bp, cp, dlen);
- *lenPtr++ = dlen;
- *typePtr++ = (class == C_IN) ?
- ((type == T_A) ? AF_INET : AF_INET6) :
- AF_UNSPEC;
- bp += dlen;
- cp += dlen;
- numAddresses++;
- haveAnswer = TRUE;
- }
- }
- }
-
- if ((queryType == T_A || queryType == T_AAAA || queryType == T_PTR) &&
- haveAnswer) {
-
- /*
- * Go through the alias and address lists and return them
- * in the hostPtr variable.
- */
-
- oldAliases = 0;
- if (merge && hostPtr->aliases != NULL) {
- while (hostPtr->aliases[oldAliases] != NULL)
- oldAliases++;
- }
- if (numAliases > 0) {
- newAliases =
- (char **) Calloc(1 + numAliases + oldAliases, sizeof(char *));
- if (merge && hostPtr->aliases != NULL) {
- memcpy(newAliases, hostPtr->aliases,
- oldAliases * sizeof(char *));
- free(hostPtr->aliases);
- }
- hostPtr->aliases = newAliases;
- k = oldAliases;
- for (i = 0; i < numAliases; i++) {
- for (l = 0; l < k; l++)
- if (!strcasecmp(hostPtr->aliases[l], host_aliases[i]))
- break;
- if (l < k)
- continue;
- hostPtr->aliases[k] = Calloc(1, host_aliases_len[i]);
- memcpy(hostPtr->aliases[k], host_aliases[i],
- host_aliases_len[i]);
- k++;
- }
- hostPtr->aliases[k] = NULL;
- }
- oldAddresses = 0;
- if (merge && hostPtr->addrList != NULL) {
- while (hostPtr->addrList[oldAddresses] != NULL)
- oldAddresses++;
- }
- if (numAddresses > 0) {
- newAddresses =
- (AddrInfo **)Calloc(1+numAddresses, sizeof(AddrInfo *));
- if (merge && hostPtr->addrList != NULL) {
- memcpy(newAddresses, hostPtr->addrList,
- oldAddresses * sizeof(char *));
- free(hostPtr->addrList);
- }
- hostPtr->addrList = newAddresses;
- k = oldAddresses;
- for (i = 0; i < numAddresses; i++) {
- for (l = 0; l < k; l++)
- if (hostPtr->addrList[l]->addrType == addr_type[i] &&
- hostPtr->addrList[l]->addrLen == addr_len[i] &&
- !memcmp(hostPtr->addrList[l]->addr, addr_list[i],
- addr_len[i]))
- break;
- if (l < k)
- continue;
- hostPtr->addrList[k] = (AddrInfo*)Calloc(1, sizeof(AddrInfo));
- hostPtr->addrList[k]->addr = Calloc(1, addr_len[i]);
- hostPtr->addrList[k]->addrType = addr_type[i];
- hostPtr->addrList[k]->addrLen = addr_len[i];
- memcpy(hostPtr->addrList[k]->addr, addr_list[i], addr_len[i]);
- k++;
- }
- hostPtr->addrList[k] = NULL;
- }
-#ifdef verbose
- if (headerPtr->aa || nscount == 0) {
- hostPtr->servers = NULL;
- return (SUCCESS);
- }
-#else
- hostPtr->servers = NULL;
- return (SUCCESS);
-#endif
- }
-
- /*
- * At this point, for the T_A query type, only empty answers remain.
- * For other query types, additional information might be found
- * in the additional resource records part.
- */
-
- if (!headerPtr->aa && (queryType != T_A) && (queryType != T_AAAA) &&
- (nscount > 0 || arcount > 0)) {
- if (printedAnswers) {
- putchar('\n');
- }
- printf("Authoritative answers can be found from:\n");
- }
-
- cp = res_skip((u_char *)&answer, 2, eom);
-
- numServers = 0;
- if (queryType != T_A && queryType != T_AAAA) {
- /*
- * If we don't need to save the record, just print it.
- */
- while (--nscount >= 0 && cp < eom) {
- if ((cp = Print_rr(cp, (u_char *) &answer,
- eom, stdout)) == NULL) {
- return(ERROR);
- }
- }
- } else {
- while (--nscount >= 0 && cp < eom) {
- /*
- * Go through the NS records and retrieve the names of hosts
- * that serve the requested domain.
- */
-
- n = dn_expand(answer.qb2, eom, cp, (char *)bp, ep - bp);
- if (n < 0) {
- return(ERROR);
- }
- cp += n;
- s = strlen((char *)bp) + 1;
- dnamePtr = Calloc(1, s); /* domain name */
- memcpy(dnamePtr, bp, s);
-
- if (cp + 3 * INT16SZ + INT32SZ > eom)
- return (ERROR);
- type = GetShort(cp);
- class = GetShort(cp);
- cp += INT32SZ; /* skip TTL */
- dlen = GetShort(cp);
- if (cp + dlen > eom)
- return (ERROR);
-
- if (type != T_NS) {
- cp += dlen;
- } else {
- Boolean found;
-
- n = dn_expand(answer.qb2, eom, cp, (char *)bp, ep - bp);
- if (n < 0) {
- return(ERROR);
- }
- cp += n;
- s = strlen((char *)bp) + 1;
- namePtr = Calloc(1, s); /* server host name */
- memcpy(namePtr, bp, s);
-
- /*
- * Store the information keyed by the server host name.
- */
- found = FALSE;
- for (j = 0; j < numServers; j++) {
- if (strcasecmp(namePtr, server[j].name) == 0) {
- found = TRUE;
- free(namePtr);
- break;
- }
- }
- if (found) {
- server[j].numDomains++;
- if (server[j].numDomains <= MAXDOMAINS) {
- server[j].domain[server[j].numDomains-1] = dnamePtr;
- }
- } else {
- if (numServers >= MAXSERVERS) {
- break;
- }
- server[numServers].name = namePtr;
- server[numServers].domain[0] = dnamePtr;
- server[numServers].numDomains = 1;
- server[numServers].numAddresses = 0;
- numServers++;
- }
- }
- }
- }
-
- /*
- * Additional resource records contain addresses of servers.
- */
- cp = res_skip((u_char*)&answer, 3, eom);
-
- if (queryType != T_A && queryType != T_AAAA) {
- /*
- * If we don't need to save the record, just print it.
- */
- while (--arcount >= 0 && cp < eom) {
- if ((cp = Print_rr(cp, (u_char *) &answer,
- eom, stdout)) == NULL) {
- return(ERROR);
- }
- }
- } else {
- while (--arcount >= 0 && cp < eom) {
- n = dn_expand(answer.qb2, eom, cp, (char *)bp, ep - bp);
- if (n < 0) {
- break;
- }
- cp += n;
- if (cp + 3 * INT16SZ + INT32SZ > eom)
- return (ERROR);
- type = GetShort(cp);
- class = GetShort(cp);
- cp += INT32SZ; /* skip TTL */
- dlen = GetShort(cp);
- if (cp + dlen > eom)
- return (ERROR);
-
- if (type != T_A && type != T_AAAA) {
- cp += dlen;
- continue;
- } else {
- if (type == T_A && dlen != INADDRSZ)
- return (ERROR);
- if (type == T_AAAA && dlen != 16)
- return (ERROR);
- for (j = 0; j < numServers; j++) {
- if (strcasecmp((char *)bp, server[j].name) == 0) {
- server[j].numAddresses++;
- if (server[j].numAddresses <= MAXADDRS) {
- server[j].address[server[j].numAddresses-1] =
- Calloc(1,dlen);
- memcpy(server[j].address[server[j].numAddresses-1],
- cp, dlen);
- server[j].len[server[j].numAddresses-1] = dlen;
- server[j].type[server[j].numAddresses-1] =
- (type == T_A) ? AF_INET : AF_INET6;
- break;
- }
- }
- }
- cp += dlen;
- }
- }
- }
-
- /*
- * If we are returning name server info, transfer it to the hostPtr.
- */
- oldServers = 0;
- if (merge && hostPtr->servers != NULL) {
- while (hostPtr->servers[oldServers] != NULL)
- oldServers++;
- }
- if (numServers > 0) {
- newServers = (ServerInfo **) Calloc(numServers+oldServers+1,
- sizeof(ServerInfo *));
- if (merge && hostPtr->servers != NULL) {
- memcpy(newServers, hostPtr->servers,
- oldServers * sizeof(ServerInfo *));
- free(hostPtr->servers);
- }
- hostPtr->servers = newServers;
- k = oldServers;
- for (i = 0; i < numServers; i++) {
- for (l = 0; l < k; l++)
- if (!strcasecmp(hostPtr->servers[l]->name, server[i].name))
- break;
- if (l < k) {
- free(server[i].name);
- for (j = 0; j < server[i].numDomains; j++)
- free(server[i].domain[j]);
- } else {
- hostPtr->servers[l] = (ServerInfo *)
- Calloc(1, sizeof(ServerInfo));
- hostPtr->servers[l]->name = server[i].name;
- k++;
-
- hostPtr->servers[l]->domains = (char **)
- Calloc(server[i].numDomains+1,sizeof(char *));
- for (j = 0; j < server[i].numDomains; j++) {
- hostPtr->servers[l]->domains[j] = server[i].domain[j];
- }
- hostPtr->servers[l]->domains[j] = NULL;
- }
-
-
- oldAddresses = 0;
- if (merge && hostPtr->servers[l]->addrList != NULL)
- while (hostPtr->servers[l]->addrList[oldAddresses] != NULL)
- oldAddresses++;
- newAddresses = (AddrInfo **)
- Calloc(server[i].numAddresses+oldAddresses+1,
- sizeof(AddrInfo *));
- if (merge && hostPtr->servers[l]->addrList != NULL) {
- memcpy(newAddresses, hostPtr->servers[l]->addrList,
- sizeof(AddrInfo *) * oldAddresses);
- free(hostPtr->servers[l]->addrList);
- }
- hostPtr->servers[l]->addrList = newAddresses;
- m = oldAddresses;
- for (j = 0; j < server[l].numAddresses; j++) {
- for (n = 0; n < m; n++)
- if (hostPtr->servers[l]->addrList[n]->addrType ==
- server[i].type[j] &&
- hostPtr->servers[l]->addrList[n]->addrLen ==
- server[i].len[j] &&
- !memcmp(hostPtr->servers[l]->addrList[n]->addr,
- server[i].address[j], server[i].len[j]))
- break;
- if (n < m) {
- free(server[i].address[j]);
- continue;
- }
- hostPtr->servers[l]->addrList[m] =
- (AddrInfo*)Calloc(1, sizeof(AddrInfo));
- hostPtr->servers[l]->addrList[m]->addr =
- server[i].address[j];
- hostPtr->servers[l]->addrList[m]->addrType =
- server[i].type[j];
- hostPtr->servers[l]->addrList[m]->addrLen =
- server[i].len[j];
- m++;
- }
- hostPtr->servers[l]->addrList[m] = NULL;
- }
- hostPtr->servers[k] = NULL;
- }
-
- switch (queryType) {
- case T_AAAA:
- case T_A:
- return NONAUTH;
- case T_PTR:
- if (iquery)
- return NO_INFO;
- /* fall through */
- default:
- return SUCCESS;
- }
-}
-
-/*
-*******************************************************************************
-*
-* GetHostInfo --
-*
-* Retrieves host name, address and alias information
-* for a domain.
-*
-* Algorithm from res_nsearch().
-*
-* Results:
-* ERROR - res_nmkquery failed.
-* + return values from GetAnswer()
-*
-*******************************************************************************
-*/
-
-int
-GetHostInfoByName(nsAddrPtr, queryClass, queryType, name, hostPtr, isServer,
- merge)
- union res_sockaddr_union *nsAddrPtr;
- int queryClass;
- int queryType;
- const char *name;
- HostInfo *hostPtr;
- Boolean isServer;
- Boolean merge;
-{
- int n;
- register int result;
- register char **domain;
- const char *cp;
- Boolean got_nodata = FALSE;
- union res_sockaddr_union ina;
- Boolean tried_as_is = FALSE;
- char tmp[NS_MAXDNAME];
-
- /* Catch explicit addresses */
- if ((queryType == T_A) && IsAddr(name, &ina)) {
- hostPtr->name = Calloc(strlen(name)+3, 1);
- (void)sprintf(hostPtr->name,"[%s]",name);
- switch (ina.sin.sin_family) {
- case AF_INET:
- hostPtr->aliases = NULL;
- hostPtr->servers = NULL;
- hostPtr->addrList = (AddrInfo **)Calloc(2, sizeof(AddrInfo *));
- hostPtr->addrList[0] = (AddrInfo *)Calloc(1, sizeof(AddrInfo));
- hostPtr->addrList[0]->addr = Calloc(INT32SZ, sizeof(char));
- memcpy(hostPtr->addrList[0]->addr, &ina.sin.sin_addr, INADDRSZ);
- hostPtr->addrList[0]->addrType = AF_INET;
- hostPtr->addrList[0]->addrLen = INADDRSZ;
- hostPtr->addrList[1] = NULL;
- break;
- case AF_INET6:
- hostPtr->aliases = NULL;
- hostPtr->servers = NULL;
- hostPtr->addrList = (AddrInfo **)Calloc(2, sizeof(AddrInfo *));
- hostPtr->addrList[0] = (AddrInfo *)Calloc(1, sizeof(AddrInfo));
- hostPtr->addrList[0]->addr = Calloc(1, 16);
- memcpy(hostPtr->addrList[0]->addr, &ina.sin6.sin6_addr, 16);
- hostPtr->addrList[0]->addrType = AF_INET6;
- hostPtr->addrList[0]->addrLen = 16;
- hostPtr->addrList[1] = NULL;
- break;
- }
- return(SUCCESS);
- }
-
- result = NXDOMAIN;
- for (cp = name, n = 0; *cp; cp++)
- if (*cp == '.')
- n++;
- if (n == 0 && (cp = res_hostalias(&res, name, tmp, sizeof tmp))) {
- printf("Aliased to \"%s\"\n\n", cp);
- return (GetHostDomain(nsAddrPtr, queryClass, queryType,
- cp, (char *)NULL, hostPtr, isServer, merge));
- }
-
- /*
- * If there are dots in the name already, let's just give it a try
- * 'as is'. The threshold can be set with the "ndots" option.
- */
- if (n >= (int)res.ndots) {
- result = GetHostDomain(nsAddrPtr, queryClass, queryType,
- name, (char *)NULL, hostPtr, isServer,
- merge);
- if (result == SUCCESS)
- return (result);
- if (result == NO_INFO)
- got_nodata++;
- tried_as_is++;
- }
-
- /*
- * We do at least one level of search if
- * - there is no dot and RES_DEFNAME is set, or
- * - there is at least one dot, there is no trailing dot,
- * and RES_DNSRCH is set.
- */
- if ((n == 0 && (res.options & RES_DEFNAMES) != 0) ||
- (n != 0 && *--cp != '.' && (res.options & RES_DNSRCH) != 0))
- for (domain = res.dnsrch; *domain != NULL; domain++) {
- result = GetHostDomain(nsAddrPtr, queryClass, queryType,
- name, *domain, hostPtr, isServer,
- merge);
- /*
- * If no server present, give up.
- * If name isn't found in this domain,
- * keep trying higher domains in the search list
- * (if that's enabled).
- * On a NO_INFO error, keep trying, otherwise
- * a wildcard entry of another type could keep us
- * from finding this entry higher in the domain.
- * If we get some other error (negative answer or
- * server failure), then stop searching up,
- * but try the input name below in case it's fully-qualified.
- */
- if (result == SUCCESS || result == NO_RESPONSE)
- return result;
- if (result == NO_INFO)
- got_nodata++;
- if ((result != NXDOMAIN && result != NO_INFO) ||
- (res.options & RES_DNSRCH) == 0)
- break;
- }
- /* if we have not already tried the name "as is", do that now.
- * note that we do this regardless of how many dots were in the
- * name or whether it ends with a dot.
- */
- if (!tried_as_is &&
- (result = GetHostDomain(nsAddrPtr, queryClass, queryType,
- name, (char *)NULL, hostPtr, isServer, merge)
- ) == SUCCESS)
- return (result);
- if (got_nodata)
- result = NO_INFO;
- return (result);
-}
-
-/*
- * Perform a query on the concatenation of name and domain,
- * removing a trailing dot from name if domain is NULL.
- */
-int
-GetHostDomain(nsAddrPtr, queryClass, queryType, name, domain, hostPtr,
- isServer, merge)
- union res_sockaddr_union *nsAddrPtr;
- int queryClass;
- int queryType;
- const char *name;
- char *domain;
- HostInfo *hostPtr;
- Boolean isServer;
- Boolean merge;
-{
- querybuf buf;
- char nbuf[2*MAXDNAME+2];
- const char *longname = nbuf;
- int n;
-
- if (domain == NULL) {
- /*
- * Check for trailing '.';
- * copy without '.' if present.
- */
- n = strlen(name) - 1;
- if (name[n] == '.' && n < (int)sizeof(nbuf) - 1) {
- memcpy(nbuf, name, n);
- nbuf[n] = '\0';
- } else
- longname = name;
- } else {
- (void)sprintf(nbuf, "%.*s.%.*s",
- MAXDNAME, name, MAXDNAME, domain);
- longname = nbuf;
- }
- n = res_nmkquery(&res, QUERY, longname, queryClass, queryType,
- NULL, 0, 0, buf.qb2, sizeof(buf));
- if (n < 0) {
- if (res.options & RES_DEBUG) {
- printf("Res_nmkquery failed\n");
- }
- return (ERROR);
- }
-
- n = GetAnswer(nsAddrPtr, queryType, (char *)&buf, n, 0, hostPtr,
- isServer, merge);
-
- /*
- * GetAnswer didn't find a name, so set it to the specified one.
- */
- if (n == NONAUTH) {
- if (hostPtr->name == NULL) {
- size_t len = strlen(longname) + 1;
-
- hostPtr->name = Calloc(len, sizeof(char));
- memcpy(hostPtr->name, longname, len);
- }
- }
- return(n);
-}
-
-
-/*
-*******************************************************************************
-*
-* GetHostInfoByAddr --
-*
-* Performs a PTR lookup in in-addr.arpa to find the host name
-* that corresponds to the given address.
-*
-* Results:
-* ERROR - res_nmkquery failed.
-* + return values from GetAnswer()
-*
-*******************************************************************************
-*/
-
-int
-GetHostInfoByAddr(union res_sockaddr_union *nsAddrPtr,
- union res_sockaddr_union *address,
- HostInfo * hostPtr)
-{
- int n;
- querybuf buf;
- char qbuf[MAXDNAME];
- char qbuf2[MAXDNAME];
- char *p = NULL;
- int ismapped = 0;
-
- switch (address->sin.sin_family) {
- case AF_INET:
- p = (char *) &address->sin.sin_addr.s_addr;
- mapped:
- (void)sprintf(qbuf, "%u.%u.%u.%u.in-addr.arpa",
- ((unsigned)p[3 + (ismapped ? 12 : 0)] & 0xff),
- ((unsigned)p[2 + (ismapped ? 12 : 0)] & 0xff),
- ((unsigned)p[1 + (ismapped ? 12 : 0)] & 0xff),
- ((unsigned)p[0 + (ismapped ? 12 : 0)] & 0xff));
- break;
- case AF_INET6:
- p = (char *)address->sin6.sin6_addr.s6_addr;
- if (IN6_IS_ADDR_V4MAPPED(&address->sin6.sin6_addr) ||
- IN6_IS_ADDR_V4COMPAT(&address->sin6.sin6_addr)) {
- ismapped = 1;
- goto mapped;
- }
- (void)sprintf(qbuf,
- "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x."
- "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x."
- "ip6.arpa",
- p[15] & 0xf, (p[15] >> 4) & 0xf,
- p[14] & 0xf, (p[14] >> 4) & 0xf,
- p[13] & 0xf, (p[13] >> 4) & 0xf,
- p[12] & 0xf, (p[12] >> 4) & 0xf,
- p[11] & 0xf, (p[11] >> 4) & 0xf,
- p[10] & 0xf, (p[10] >> 4) & 0xf,
- p[9] & 0xf, (p[9] >> 4) & 0xf,
- p[8] & 0xf, (p[8] >> 4) & 0xf,
- p[7] & 0xf, (p[7] >> 4) & 0xf,
- p[6] & 0xf, (p[6] >> 4) & 0xf,
- p[5] & 0xf, (p[5] >> 4) & 0xf,
- p[4] & 0xf, (p[4] >> 4) & 0xf,
- p[3] & 0xf, (p[3] >> 4) & 0xf,
- p[2] & 0xf, (p[2] >> 4) & 0xf,
- p[1] & 0xf, (p[1] >> 4) & 0xf,
- p[0] & 0xf, (p[0] >> 4) & 0xf);
- (void)sprintf(qbuf2,
- "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x."
- "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x."
- "ip6.int",
- p[15] & 0xf, (p[15] >> 4) & 0xf,
- p[14] & 0xf, (p[14] >> 4) & 0xf,
- p[13] & 0xf, (p[13] >> 4) & 0xf,
- p[12] & 0xf, (p[12] >> 4) & 0xf,
- p[11] & 0xf, (p[11] >> 4) & 0xf,
- p[10] & 0xf, (p[10] >> 4) & 0xf,
- p[9] & 0xf, (p[9] >> 4) & 0xf,
- p[8] & 0xf, (p[8] >> 4) & 0xf,
- p[7] & 0xf, (p[7] >> 4) & 0xf,
- p[6] & 0xf, (p[6] >> 4) & 0xf,
- p[5] & 0xf, (p[5] >> 4) & 0xf,
- p[4] & 0xf, (p[4] >> 4) & 0xf,
- p[3] & 0xf, (p[3] >> 4) & 0xf,
- p[2] & 0xf, (p[2] >> 4) & 0xf,
- p[1] & 0xf, (p[1] >> 4) & 0xf,
- p[0] & 0xf, (p[0] >> 4) & 0xf);
- break;
- }
- n = res_nmkquery(&res, QUERY, qbuf, C_IN, T_PTR, NULL, 0, NULL,
- buf.qb2, sizeof buf);
- if (n < 0) {
- if (res.options & RES_DEBUG) {
- printf("res_nmkquery() failed\n");
- }
- return (ERROR);
- }
- n = GetAnswer(nsAddrPtr, T_PTR, (char *) &buf, n, 1, hostPtr, 1, 0);
- if (n == SUCCESS) {
- switch (address->sin.sin_family) {
- case AF_INET:
- hostPtr->addrList = (AddrInfo **)Calloc(2, sizeof(AddrInfo *));
- hostPtr->addrList[0] = (AddrInfo *)Calloc(1, sizeof(AddrInfo));
- hostPtr->addrList[0]->addr = Calloc(INT32SZ, sizeof(char));
- memcpy(hostPtr->addrList[0]->addr, p, INADDRSZ);
- hostPtr->addrList[0]->addrType = AF_INET;
- hostPtr->addrList[0]->addrLen = 4;
- hostPtr->addrList[1] = NULL;
- break;
- case AF_INET6:
- hostPtr->addrList = (AddrInfo **)Calloc(2, sizeof(AddrInfo *));
- hostPtr->addrList[0] = (AddrInfo *)Calloc(1, sizeof(AddrInfo));
- hostPtr->addrList[0]->addr = Calloc(16, sizeof(char));
- memcpy(hostPtr->addrList[0]->addr, p, 16);
- hostPtr->addrList[0]->addrType = AF_INET6;
- hostPtr->addrList[0]->addrLen = 16;
- hostPtr->addrList[1] = NULL;
- break;
- }
- }
- if (n == SUCCESS || ismapped || address->sin.sin_family != AF_INET6)
- return n;
- n = res_nmkquery(&res, QUERY, qbuf2, C_IN, T_PTR, NULL, 0, NULL,
- buf.qb2, sizeof buf);
- if (n < 0) {
- if (res.options & RES_DEBUG) {
- printf("res_nmkquery() failed\n");
- }
- return (ERROR);
- }
- n = GetAnswer(nsAddrPtr, T_PTR, (char *) &buf, n, 1, hostPtr, 1, 0);
- if (n == SUCCESS) {
- hostPtr->addrList = (AddrInfo **)Calloc(2, sizeof(AddrInfo *));
- hostPtr->addrList[0] = (AddrInfo *)Calloc(1, sizeof(AddrInfo));
- hostPtr->addrList[0]->addr = Calloc(16, sizeof(char));
- memcpy(hostPtr->addrList[0]->addr, p, 16);
- hostPtr->addrList[0]->addrType = AF_INET6;
- hostPtr->addrList[0]->addrLen = 16;
- hostPtr->addrList[1] = NULL;
- }
- return n;
-}
-
-/*
-*******************************************************************************
-*
-* FreeHostInfoPtr --
-*
-* Deallocates all the calloc'd areas for a HostInfo variable.
-*
-*******************************************************************************
-*/
-
-void
-FreeHostInfoPtr(hostPtr)
- register HostInfo *hostPtr;
-{
- int i, j;
-
- if (hostPtr->name != NULL) {
- free(hostPtr->name);
- hostPtr->name = NULL;
- }
-
- if (hostPtr->aliases != NULL) {
- i = 0;
- while (hostPtr->aliases[i] != NULL) {
- free(hostPtr->aliases[i]);
- i++;
- }
- free((char *)hostPtr->aliases);
- hostPtr->aliases = NULL;
- }
-
- if (hostPtr->addrList != NULL) {
- i = 0;
- while (hostPtr->addrList[i] != NULL) {
- free(hostPtr->addrList[i]->addr);
- free(hostPtr->addrList[i]);
- i++;
- }
- free((char *)hostPtr->addrList);
- hostPtr->addrList = NULL;
- }
-
- if (hostPtr->servers != NULL) {
- i = 0;
- while (hostPtr->servers[i] != NULL) {
-
- if (hostPtr->servers[i]->name != NULL) {
- free(hostPtr->servers[i]->name);
- }
-
- if (hostPtr->servers[i]->domains != NULL) {
- j = 0;
- while (hostPtr->servers[i]->domains[j] != NULL) {
- free(hostPtr->servers[i]->domains[j]);
- j++;
- }
- free((char *)hostPtr->servers[i]->domains);
- }
-
- if (hostPtr->servers[i]->addrList != NULL) {
- j = 0;
- while (hostPtr->servers[i]->addrList[j] != NULL) {
- free(hostPtr->servers[i]->addrList[j]->addr);
- free(hostPtr->servers[i]->addrList[j]);
- j++;
- }
- free((char *)hostPtr->servers[i]->addrList);
- }
- free((char *)hostPtr->servers[i]);
- i++;
- }
- free((char *)hostPtr->servers);
- hostPtr->servers = NULL;
- }
-}
diff --git a/contrib/bind/bin/nslookup/list.c b/contrib/bind/bin/nslookup/list.c
deleted file mode 100644
index 3255a1923a0d..000000000000
--- a/contrib/bind/bin/nslookup/list.c
+++ /dev/null
@@ -1,705 +0,0 @@
-/*
- * Copyright (c) 1985, 1989
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Portions Copyright (c) 1993 by Digital Equipment Corporation.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies, and that
- * the name of Digital Equipment Corporation not be used in advertising or
- * publicity pertaining to distribution of the document or software without
- * specific, written prior permission.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
- * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- */
-
-#ifndef lint
-static const char sccsid[] = "@(#)list.c 5.23 (Berkeley) 3/21/91";
-static const char rcsid[] = "$Id: list.c,v 8.27 2002/04/09 05:55:17 marka Exp $";
-#endif /* not lint */
-
-/*
- *******************************************************************************
- *
- * list.c --
- *
- * Routines to obtain info from name and finger servers.
- *
- * Adapted from 4.3BSD BIND ns_init.c and from finger.c.
- *
- *******************************************************************************
- */
-
-#include "port_before.h"
-
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <sys/uio.h>
-
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-#include <arpa/inet.h>
-
-#include <ctype.h>
-#include <errno.h>
-#include <limits.h>
-#include <netdb.h>
-#include <resolv.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "port_after.h"
-
-#include "res.h"
-
-extern char *pager;
-
-typedef union {
- HEADER qb1;
- u_char qb2[PACKETSZ];
-} querybuf;
-
-extern HostInfo *defaultPtr;
-extern HostInfo curHostInfo;
-extern int curHostValid;
-extern int queryType;
-extern int queryClass;
-
-static int sockFD = -1;
-int ListSubr();
-
-/*
- * During a listing to a file, hash marks are printed
- * every HASH_SIZE records.
- */
-
-#define HASH_SIZE 50
-
-
-/*
- *******************************************************************************
- *
- * ListHosts --
- * ListHostsByType --
- *
- * Requests the name server to do a zone transfer so we
- * find out what hosts it knows about.
- *
- * For ListHosts, there are five types of output:
- * - Internet addresses (default)
- * - cpu type and operating system (-h option)
- * - canonical and alias names (-a option)
- * - well-known service names (-s option)
- * - ALL records (-d option)
- * ListHostsByType prints records of the default type or of a speicific
- * type.
- *
- * To see all types of information sorted by name, do the following:
- * ls -d domain.edu > file
- *
- * Results:
- * SUCCESS the listing was successful.
- * ERROR the server could not be contacted because
- * a socket could not be obtained or an error
- * occured while receiving, or the output file
- * could not be opened.
- *
- *******************************************************************************
- */
-
-void
-ListHostsByType(char *string, int putToFile) {
- char *namePtr, name[NAME_LEN], option[NAME_LEN];
- int i, j, qtype, result;
-
- /*
- * Parse the command line. It maybe of the form "ls -t domain"
- * or "ls -t type domain".
- */
-
- /* simulate sscanf(string, " ls -t %s %s", option, name) */
- i = matchString(" ls -t ", string);
- if (i > 0) {
- j = pickString(string + i, option, sizeof option);
- if (j > 0) {
- j = pickString(string + i + j, name, sizeof name);
- if (j > 0)
- i = 2;
- else
- i = 1;
- } else {
- i = 0;
- }
- }
-
- if (putToFile && i == 2 && name[0] == '>')
- i--;
- if (i == 2) {
- qtype = StringToType(option, -1, stderr);
- if (qtype == -1)
- return;
- namePtr = name;
- } else if (i == 1) {
- namePtr = option;
- qtype = queryType;
- } else {
- fprintf(stderr, "*** ls: invalid request %s\n", string);
- return;
- }
- result = ListSubr(qtype, namePtr, putToFile ? string : NULL);
- if (result != SUCCESS)
- fprintf(stderr, "*** Can't list domain %s: %s\n",
- namePtr, DecodeError(result));
-}
-
-void
-ListHosts(char *string, int putToFile) {
- char *namePtr, name[NAME_LEN], option[NAME_LEN];
- int i, j, qtype, result;
-
- /*
- * Parse the command line. It maybe of the form "ls domain",
- * "ls -X domain".
- */
-
- /* simulate i = sscanf(string, " ls %s %s", option, name) */
- i = matchString(" ls ", string);
- if (i > 0) {
- j = pickString(string + i, option, sizeof option);
- if (j > 0) {
- j = pickString(string + i + j, name, sizeof name);
- if (j > 0)
- i = 2;
- else
- i = 1;
- } else {
- i = 0;
- }
- }
-
- if (putToFile && i == 2 && name[0] == '>')
- i--;
- if (i == 2) {
- if (strcmp("-a", option) == 0)
- qtype = T_CNAME;
- else if (strcmp("-h", option) == 0)
- qtype = T_HINFO;
- else if (strcmp("-m", option) == 0)
- qtype = T_MX;
- else if (strcmp("-p", option) == 0)
- qtype = T_PX;
- else if (strcmp("-s", option) == 0)
- qtype = T_WKS;
- else if (strcmp("-d", option) == 0)
- qtype = T_ANY;
- else if (strcmp("-n", option) == 0)
- qtype = T_NAPTR;
- else
- qtype = T_A;
- namePtr = name;
- } else if (i == 1) {
- namePtr = option;
- qtype = T_A;
- } else {
- fprintf(stderr, "*** ls: invalid request %s\n",string);
- return;
- }
- result = ListSubr(qtype, namePtr, putToFile ? string : NULL);
- if (result != SUCCESS)
- fprintf(stderr, "*** Can't list domain %s: %s\n",
- namePtr, DecodeError(result));
-}
-
-int
-ListSubr(int qtype, char *domain, char *cmd) {
- static u_char *answer = NULL;
- static int answerLen = 0;
-
- ns_msg handle;
- querybuf buf;
- struct sockaddr_storage sa;
- struct sockaddr_in *sin;
- struct sockaddr_in6 *sin6;
- HEADER *headerPtr;
- int msglen, amtToRead, numRead, soacnt;
- u_int len;
- int numAnswers = 0;
- int numRecords = 0;
- u_char tmp[INT16SZ], *cp;
- char soaname[2][NAME_LEN], file[PATH_MAX];
- enum { NO_ERRORS, ERR_READING_LEN, ERR_READING_MSG, ERR_PRINTING }
- error = NO_ERRORS;
- struct iovec iov[2];
- AddrInfo *AddrPtr;
- int salen = 0;
-
- /*
- * Create a query packet for the requested domain name.
- */
- msglen = res_nmkquery(&res, QUERY, domain, queryClass, T_AXFR,
- NULL, 0, 0, buf.qb2, sizeof buf);
- if (msglen < 0) {
- if (_res.options & RES_DEBUG)
- fprintf(stderr, "*** ls: res_nmkquery failed\n");
- return (ERROR);
- }
-
- /*
- * Check to see if we have the address of the server or the
- * address of a server who knows about this domain.
- *
- * For now, just use the first address in the list. XXX.
- */
-
- if (defaultPtr->addrList != NULL)
- AddrPtr = defaultPtr->addrList[0];
- else
- AddrPtr = defaultPtr->servers[0]->addrList[0];
-
- memset(&sa, 0, sizeof sa);
- switch (AddrPtr->addrType) {
- case AF_INET:
- sin = (struct sockaddr_in *)&sa;
- sin->sin_family = AddrPtr->addrType;
- sin->sin_port = htons(nsport);
- memcpy(&sin->sin_addr, AddrPtr->addr, AddrPtr->addrLen);
-#ifdef HAVE_SA_LEN
- sin->sin_len = sizeof(*sin);
-#endif
- salen = sizeof(struct sockaddr_in);
- break;
-
- case AF_INET6:
- sin6 = (struct sockaddr_in6 *)&sa;
- sin6->sin6_family = AddrPtr->addrType;
- sin6->sin6_port = htons(nsport);
- memcpy(&sin6->sin6_addr, AddrPtr->addr, AddrPtr->addrLen);
-#ifdef HAVE_SA_LEN
- sin6->sin6_len = sizeof(*sin6);
-#endif
- salen = sizeof(struct sockaddr_in6);
- break;
- }
-
- /*
- * Set up a virtual circuit to the server.
- */
- sockFD = socket(AddrPtr->addrType, SOCK_STREAM, 0);
- if (sockFD < 0) {
- perror("ls: socket");
- return (ERROR);
- }
- if (connect(sockFD, (struct sockaddr *)&sa, salen) < 0) {
- int e;
-
- if (errno == ECONNREFUSED)
- e = NO_RESPONSE;
- else {
- perror("ls: connect");
- e = ERROR;
- }
- (void) close(sockFD);
- sockFD = -1;
- return (e);
- }
-
- /*
- * Send length & message for zone transfer
- */
- ns_put16(msglen, tmp);
- iov[0].iov_base = (char *)tmp;
- iov[0].iov_len = INT16SZ;
- iov[1].iov_base = (char *)buf.qb2;
- iov[1].iov_len = msglen;
- if (writev(sockFD, iov, 2) != INT16SZ + msglen) {
- perror("ls: write");
- (void) close(sockFD);
- sockFD = -1;
- return(ERROR);
- }
-
- fprintf(stdout,"[%s]\n", (defaultPtr->addrList != NULL)
- ? defaultPtr->name : defaultPtr->servers[0]->name);
-
- if (cmd == NULL) {
- filePtr = stdout;
- } else {
- filePtr = OpenFile(cmd, file, sizeof file);
- if (filePtr == NULL) {
- fprintf(stderr, "*** Can't open %s for writing\n",
- file);
- (void) close(sockFD);
- sockFD = -1;
- return (ERROR);
- }
- fprintf(filePtr, "> %s\n", cmd);
- fprintf(filePtr, "[%s]\n", (defaultPtr->addrList != NULL)
- ? defaultPtr->name : defaultPtr->servers[0]->name);
- }
-
- soacnt = 0;
- while (soacnt < 2) {
- /*
- * Read the length of the response.
- */
-
- cp = tmp; amtToRead = INT16SZ;
- while (amtToRead > 0 &&
- (numRead = read(sockFD, cp, amtToRead)) > 0) {
- cp += numRead;
- amtToRead -= numRead;
- }
- if (numRead <= 0) {
- error = ERR_READING_LEN;
- break;
- }
-
- len = ns_get16(tmp);
- if (len == 0)
- break; /* nothing left to read */
-
- /*
- * If the server sent too much data to fit the existing
- * buffer, allocate a new one.
- */
- if (len > (u_int)answerLen) {
- if (answerLen != 0)
- free(answer);
- answerLen = len;
- answer = (u_char *)Malloc(answerLen);
- }
-
- /*
- * Read the response.
- */
- amtToRead = len; cp = answer;
- while (amtToRead > 0 &&
- (numRead = read(sockFD, cp, amtToRead)) > 0) {
- cp += numRead;
- amtToRead -= numRead;
- }
- if (numRead <= 0) {
- error = ERR_READING_MSG;
- break;
- }
-
- if (ns_initparse(answer, cp - answer, &handle) < 0) {
- perror("ns_initparse");
- error = ERR_PRINTING;
- break;
- }
- if (ns_msg_getflag(handle, ns_f_rcode) != ns_r_noerror ||
- ns_msg_count(handle, ns_s_an) == 0) {
- /* Signalled protocol error, or empty message. */
- error = ERR_PRINTING;
- break;
- }
-
- for (;;) {
- static char origin[NS_MAXDNAME], name_ctx[NS_MAXDNAME];
- const char *name;
- char buf[2048]; /* XXX need to malloc/realloc. */
- ns_rr rr;
-
- if (ns_parserr(&handle, ns_s_an, -1, &rr)) {
- if (errno != ENODEV) {
- perror("ns_parserr");
- error = ERR_PRINTING;
- }
- break;
- }
- name = ns_rr_name(rr);
- if (origin[0] == '\0' && name[0] != '\0') {
- if (strcmp(name, ".") != 0)
- strcpy(origin, name);
- fprintf(filePtr, "$ORIGIN %s.\n", origin);
- if (strcmp(name, ".") == 0)
- strcpy(origin, name);
- strcpy(name_ctx, "@");
- }
- if (qtype == T_ANY || (int)ns_rr_type(rr) == qtype) {
- if (ns_sprintrr(&handle, &rr, name_ctx, origin,
- buf, sizeof buf) < 0) {
- perror("ns_sprintrr");
- error = ERR_PRINTING;
- break;
- }
- strcpy(name_ctx, name);
- numRecords++;
- fputs(buf, filePtr);
- fputc('\n', filePtr);
- }
- if (ns_rr_type(rr) == T_SOA) {
- strcpy(soaname[soacnt], name);
- if (soacnt == 0)
- soacnt = 1;
- else if (ns_samename(soaname[0],
- soaname[1]) == 1) {
- soacnt = 2;
- /* This means we're finished.
- * But we've to reset origin and
- * name_ctx now ! */
- origin[0] = name_ctx[0] ='\0';
- }
- }
- }
- if (error != NO_ERRORS)
- break;
- numAnswers++;
- if (cmd != NULL && ((numAnswers % HASH_SIZE) == 0)) {
- fprintf(stdout, "#");
- fflush(stdout);
- }
- }
-
- if (cmd != NULL)
- fprintf(stdout, "%sReceived %d answer%s (%d record%s).\n",
- (numAnswers >= HASH_SIZE) ? "\n" : "",
- numAnswers, (numAnswers != 1) ? "s" : "",
- numRecords, (numRecords != 1) ? "s" : "");
-
- (void) close(sockFD);
- sockFD = -1;
- if (cmd != NULL && filePtr != NULL) {
- fclose(filePtr);
- filePtr = NULL;
- }
-
- switch (error) {
- case NO_ERRORS:
- return (SUCCESS);
-
- case ERR_READING_LEN:
- return (ERROR);
-
- case ERR_PRINTING:
- return (ERROR);
-
- case ERR_READING_MSG:
- headerPtr = (HEADER *) answer;
- fprintf(stderr,"*** ls: error receiving zone transfer:\n");
- fprintf(stderr,
- " result: %s, answers = %d, authority = %d, additional = %d\n",
- p_rcode(headerPtr->rcode),
- ntohs(headerPtr->ancount), ntohs(headerPtr->nscount),
- ntohs(headerPtr->arcount));
- return (ERROR);
- default:
- return (ERROR);
- }
-}
-
-/*
- *******************************************************************************
- *
- * Finger --
- *
- * Connects with the finger server for the current host
- * to request info on the specified person (long form)
- * who is on the system (short form).
- *
- * Results:
- * SUCCESS the finger server was contacted.
- * ERROR the server could not be contacted because
- * a socket could not be obtained or connected
- * to or the service could not be found.
- *
- *******************************************************************************
- */
-
-int
-Finger(string, putToFile)
- char *string;
- int putToFile;
-{
- struct servent *sp;
- struct sockaddr_storage sa;
- struct sockaddr_in *sin;
- struct sockaddr_in6 *sin6;
- FILE *f;
- int c;
- int lastc;
- char name[NAME_LEN];
- char file[PATH_MAX];
- int i;
- int salen = 0;
-
- /*
- * We need a valid current host info to get an inet address.
- */
- if (!curHostValid) {
- fprintf(stderr, "Finger: no current host defined.\n");
- return (ERROR);
- }
-
- /* simulate: sscanf("finger %s") ; */
-
- i = matchString(" finger ", string);
- if (i > 0) {
- i = pickString(string + i, name, sizeof name);
- if (i > 0) {
- i = 1 ;
- }
- /* note that if the argument to the finger command is
- bigger than sizeof name it will be treated as if there
- was no argument. */
- }
-
- if (i == 1) {
- if (putToFile && (name[0] == '>')) {
- name[0] = '\0';
- }
- } else {
- name[0] = '\0';
- }
-
- sp = getservbyname("finger", "tcp");
- if (sp == 0) {
- fprintf(stderr, "Finger: unknown service\n");
- return (ERROR);
- }
-
- memset(&sa, 0, sizeof sa);
- switch (curHostInfo.addrList[0]->addrType) {
- case AF_INET:
- sin = (struct sockaddr_in *)&sa;
- sin->sin_family = curHostInfo.addrList[0]->addrType;
- sin->sin_port = sp->s_port;
- memcpy(&sin->sin_addr, curHostInfo.addrList[0]->addr,
- curHostInfo.addrList[0]->addrLen);
-#ifdef HAVE_SA_LEN
- sin->sin_len = sizeof(*sin);
-#endif
- salen = sizeof(struct sockaddr_in);
- break;
-
- case AF_INET6:
- sin6 = (struct sockaddr_in6 *)&sa;
- sin6->sin6_family = curHostInfo.addrList[0]->addrType;
- sin6->sin6_port = sp->s_port;
- memcpy(&sin6->sin6_addr, curHostInfo.addrList[0]->addr,
- curHostInfo.addrList[0]->addrLen);
-#ifdef HAVE_SA_LEN
- sin6->sin6_len = sizeof(*sin6);
-#endif
- salen = sizeof(struct sockaddr_in6);
- break;
- }
-
- /*
- * Set up a virtual circuit to the host.
- */
-
- sockFD = socket(curHostInfo.addrList[0]->addrType, SOCK_STREAM, 0);
- if (sockFD < 0) {
- fflush(stdout);
- perror("finger: socket");
- return (ERROR);
- }
-
- if (connect(sockFD, (struct sockaddr *)&sa, salen) < 0) {
- fflush(stdout);
- perror("finger: connect");
- close(sockFD);
- sockFD = -1;
- return (ERROR);
- }
-
- if (!putToFile) {
- filePtr = stdout;
- } else {
- filePtr = OpenFile(string, file, sizeof file);
- if (filePtr == NULL) {
- fprintf(stderr, "*** Can't open %s for writing\n", file);
- close(sockFD);
- sockFD = -1;
- return(ERROR);
- }
- fprintf(filePtr,"> %s\n", string);
- }
- fprintf(filePtr, "[%s]\n", curHostInfo.name);
-
- if (name[0] != '\0') {
- write(sockFD, "/W ", 3);
- }
- write(sockFD, name, strlen(name));
- write(sockFD, "\r\n", 2);
- f = fdopen(sockFD, "r");
- lastc = '\n';
- while ((c = getc(f)) != EOF) {
- switch (c) {
- case 0210:
- case 0211:
- case 0212:
- case 0214:
- c -= 0200;
- break;
- case 0215:
- c = '\n';
- break;
- }
- putc(lastc = c, filePtr);
- }
- if (lastc != '\n') {
- putc('\n', filePtr);
- }
- putc('\n', filePtr);
-
- close(sockFD);
- sockFD = -1;
-
- if (putToFile) {
- fclose(filePtr);
- filePtr = NULL;
- }
- return (SUCCESS);
-}
-
-void
-ListHost_close(void) {
- if (sockFD != -1) {
- (void) close(sockFD);
- sockFD = -1;
- }
-}
diff --git a/contrib/bind/bin/nslookup/main.c b/contrib/bind/bin/nslookup/main.c
deleted file mode 100644
index 86f50d333424..000000000000
--- a/contrib/bind/bin/nslookup/main.c
+++ /dev/null
@@ -1,1327 +0,0 @@
-/* $FreeBSD$ */
-/*
- * Copyright (c) 1985, 1989
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Portions Copyright (c) 1993 by Digital Equipment Corporation.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies, and that
- * the name of Digital Equipment Corporation not be used in advertising or
- * publicity pertaining to distribution of the document or software without
- * specific, written prior permission.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
- * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- */
-
-/*
- * Portions Copyright (c) 1996-1999 by Internet Software Consortium.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
- * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
- * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- */
-
-#ifndef lint
-char copyright[] =
-"@(#) Copyright (c) 1985,1989 Regents of the University of California.\n\
- All rights reserved.\n\
- @(#) Portions Copyright (c) 1996-1999 Internet Software Consortium.\n";
-#endif /* not lint */
-
-#ifndef lint
-static const char sccsid[] = "@(#)main.c 5.42 (Berkeley) 3/3/91";
-static const char rcsid[] = "$Id: main.c,v 8.25 2003/01/26 11:38:56 marka Exp $";
-#endif /* not lint */
-
-/*
- ******************************************************************************
- *
- * main.c --
- *
- * Main routine and some action routines for the name server
- * lookup program.
- *
- * Andrew Cherenson
- * U.C. Berkeley Computer Science Div.
- * CS298-26, Fall 1985
- *
- ******************************************************************************
- */
-
-#include "port_before.h"
-
-#include <sys/param.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-#include <arpa/inet.h>
-
-#include <ctype.h>
-#include <errno.h>
-#include <limits.h>
-#include <netdb.h>
-#include <setjmp.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "port_after.h"
-
-#include <resolv.h>
-
-#include "res.h"
-#include "pathnames.h"
-
-int yylex(void);
-
-/*
- * Name of a top-level name server. Can be changed with
- * the "set root" command.
- */
-
-#ifndef ROOT_SERVER
-#define ROOT_SERVER "f.root-servers.net."
-#endif
-char rootServerName[NAME_LEN] = ROOT_SERVER;
-
-/*
- * Declare a resolver context.
- */
-
-struct __res_state res;
-
-
-/*
- * Info about the most recently queried host.
- */
-
-HostInfo curHostInfo;
-int curHostValid = FALSE;
-
-
-/*
- * Info about the default name server.
- */
-
-HostInfo *defaultPtr = NULL;
-char defaultServer[NAME_LEN];
-union res_sockaddr_union defaultAddr;
-
-
-/*
- * Initial name server query type is Address.
- */
-
-int queryType = T_A;
-int queryClass = C_IN;
-
-/*
- * Stuff for Interrupt (control-C) signal handler.
- */
-
-extern SIG_FN IntrHandler(int);
-FILE *filePtr;
-jmp_buf env;
-
-
-/*
- * Browser command for help.
- */
-const char *pager;
-
-static void CvtAddrToPtr(char *name);
-static void ReadRC(void);
-
-/*
- * Forward declarations.
- */
-static void LocalServer(HostInfo *defaultPtr);
-static void res_re_init(void);
-static void res_dnsrch(char *cp);
-static void Usage(void);
-static void ShowOptions(void);
-
-static void
-UnionFromAddr(union res_sockaddr_union *u, int family, void *addr) {
- memset(u, 0, sizeof *u);
- switch (family) {
- case AF_INET:
- u->sin.sin_family = AF_INET;
- u->sin.sin_port = htons(nsport);
- memcpy(&u->sin.sin_addr, addr, 4);
-#ifdef HAVE_SA_LEN
- u->sin.sin_len = sizeof(u->sin);
-#endif
- break;
- case AF_INET6:
- u->sin6.sin6_family = AF_INET6;
- u->sin6.sin6_port = htons(nsport);
- memcpy(&u->sin6.sin6_addr, addr, 16);
-#ifdef HAVE_SA_LEN
- u->sin6.sin6_len = sizeof(u->sin6);
-#endif
- break;
- default:
- abort();
- }
-}
-
-/*
- ******************************************************************************
- *
- * main --
- *
- * Initializes the resolver library and determines the address
- * of the initial name server. The yylex routine is used to
- * read and perform commands.
- *
- ******************************************************************************
- */
-
-int
-main(int argc, char **argv) {
- char *wantedHost = NULL;
- Boolean useLocalServer;
- int result;
- int i;
-
- /*
- * Initialize the resolver library routines.
- */
-
- if (res_ninit(&res) == -1) {
- fprintf(stderr,"*** Can't initialize resolver.\n");
- exit(1);
- }
-
- /*
- * Allocate space for the default server's host info and
- * find the server's address and name. If the resolver library
- * already has some addresses for a potential name server,
- * then use them. Otherwise, see if the current host has a server.
- * Command line arguments may override the choice of initial server.
- */
-
- defaultPtr = (HostInfo *) Calloc(1, sizeof(HostInfo));
-
- /*
- * Parse the arguments:
- * no args = go into interactive mode, use default host as server
- * 1 arg = use as host name to be looked up, default host will be server
- * non-interactive mode
- * 2 args = 1st arg:
- * if it is '-', then
- * ignore but go into interactive mode
- * else
- * use as host name to be looked up,
- * go into non-interactive mode
- * 2nd arg: name or inet address of server
- *
- * "Set" options are specified with a leading - and must come before
- * any arguments. For example, to find the well-known services for
- * a host, type "nslookup -query=wks host"
- */
-
- ReadRC(); /* look for options file */
-
- ++argv; --argc; /* skip prog name */
-
- while (argc && *argv[0] == '-' && argv[0][1]) {
- (void) SetOption (&(argv[0][1]));
- ++argv; --argc;
- }
- if (argc > 2) {
- Usage();
- }
- if (argc && *argv[0] != '-') {
- wantedHost = *argv; /* name of host to be looked up */
- }
-
- useLocalServer = FALSE;
- if (argc == 2) {
- int nscount = 0;
- union res_sockaddr_union u[MAXNS];
- struct addrinfo *answer = NULL;
- struct addrinfo *cur = NULL;
- struct addrinfo hint;
-
- /*
- * Use an explicit name server. If the hostname lookup fails,
- * default to the server(s) in resolv.conf.
- */
-
- memset(u, 0, sizeof(u));
- memset(&hint, 0, sizeof(hint));
- hint.ai_socktype = SOCK_DGRAM;
- if (!getaddrinfo(*++argv, NULL, &hint, &answer)) {
- for (cur = answer; cur != NULL; cur = cur->ai_next) {
- if (nscount == MAXNS)
- break;
- switch (cur->ai_addr->sa_family) {
- case AF_INET6:
- u[nscount].sin6 = *(struct sockaddr_in6*)cur->ai_addr;
- u[nscount++].sin6.sin6_port = htons(nsport);
- break;
- case AF_INET:
- u[nscount].sin = *(struct sockaddr_in*)cur->ai_addr;
- u[nscount++].sin.sin_port = htons(nsport);
- break;
- }
- }
- if (nscount != 0)
- res_setservers(&res, u, nscount);
- freeaddrinfo(answer);;
- }
- }
-
-
- if (res.nscount == 0 || useLocalServer) {
- LocalServer(defaultPtr);
- } else {
- int nscount = 0;
- union res_sockaddr_union u[MAXNS];
-
- nscount = res_getservers(&res, u, MAXNS);
- for (i = 0; i < nscount; i++) {
- if (u[i].sin.sin_family == AF_INET &&
- u[i].sin.sin_addr.s_addr == INADDR_ANY) {
- LocalServer(defaultPtr);
- break;
- } else {
- result = GetHostInfoByAddr(&u[i], &u[i], defaultPtr);
- if (result != SUCCESS) {
- char t[80];
- switch (u[i].sin.sin_family) {
- case AF_INET:
- inet_ntop(AF_INET, &u[i].sin.sin_addr, t, sizeof(t));
- break;
- case AF_INET6:
- inet_ntop(AF_INET6, &u[i].sin6.sin6_addr, t, sizeof(t));
- break;
- default:
- strcpy(t, "<UNKNOWN>");
- break;
- }
- fprintf(stderr,
- "*** Can't find server name for address %s: %s\n",
- t, DecodeError(result));
- } else {
- defaultAddr = u[i];
- break;
- }
- }
- }
-
- /*
- * If we have exhausted the list, tell the user about the
- * command line argument to specify an address.
- */
-
- if (i == res.nscount) {
- fprintf(stderr, "*** Default servers are not available\n");
- exit(1);
- }
-
- }
- strcpy(defaultServer, defaultPtr->name);
-
-
-#ifdef DEBUG
-#ifdef DEBUG2
- res.options |= RES_DEBUG2;
-#endif
- res.options |= RES_DEBUG;
- res.retry = 2;
-#endif /* DEBUG */
-
- /*
- * If we're in non-interactive mode, look up the wanted host and quit.
- * Otherwise, print the initial server's name and continue with
- * the initialization.
- */
-
- if (wantedHost != (char *) NULL) {
- LookupHost(wantedHost, 0);
- } else {
- PrintHostInfo(stdout, "Default Server:", defaultPtr);
-
- pager = getenv("PAGER");
- if (pager == NULL) {
- pager = _PATH_PAGERCMD;
- }
-
- /*
- * Setup the environment to allow the interrupt handler to return here.
- */
-
- (void) setjmp(env);
-
- /*
- * Return here after a longjmp.
- */
-
- signal(SIGINT, IntrHandler);
- signal(SIGPIPE, SIG_IGN);
-
- /*
- * Read and evaluate commands. The commands are described in commands.l
- * Yylex returns 0 when ^D or 'exit' is typed.
- */
-
- while(yylex());
- }
- exit(0);
-}
-
-
-static void
-LocalServer(defaultPtr)
- HostInfo *defaultPtr;
-{
- char hostName[NAME_LEN];
-
- (void) gethostname(hostName, sizeof(hostName));
-
- memset(&defaultAddr, 0, sizeof(defaultAddr));
- defaultAddr.sin.sin_addr.s_addr = htonl(INADDR_ANY);
- defaultAddr.sin.sin_family = AF_INET;
- defaultAddr.sin.sin_port = htons(nsport);
-#ifdef HAVE_SA_LEN
- defaultAddr.sin.sin_len = sizeof(defaultAddr.sin);
-#endif
- (void) GetHostInfoByName(&defaultAddr, C_IN, T_A,
- "0.0.0.0", defaultPtr, 1, 0);
- free(defaultPtr->name);
- defaultPtr->name = Calloc(1, sizeof(hostName)+1);
- strcpy(defaultPtr->name, hostName);
-}
-
-
-/*
- ******************************************************************************
- *
- * Usage --
- *
- * Lists the proper methods to run the program and exits.
- *
- ******************************************************************************
- */
-
-static void
-Usage(void) {
- fprintf(stderr, "Usage:\n");
- fprintf(stderr,
-" nslookup [-opt ...] # interactive mode using default server\n");
- fprintf(stderr,
-" nslookup [-opt ...] - server # interactive mode using 'server'\n");
- fprintf(stderr,
-" nslookup [-opt ...] host # just look up 'host' using default server\n");
- fprintf(stderr,
-" nslookup [-opt ...] host server # just look up 'host' using 'server'\n");
- exit(1);
-}
-
-/*
- ******************************************************************************
- *
- * IsAddr --
- *
- * Returns TRUE if the string looks like an Internet address.
- * A string with a trailing dot is not an address, even if it looks
- * like one.
- *
- ******************************************************************************
- */
-
-Boolean
-IsAddr(host, addrPtr)
- const char *host;
- union res_sockaddr_union *addrPtr;
- /* If return TRUE, contains IP address */
-{
- if (inet_pton(AF_INET6, host, &addrPtr->sin6.sin6_addr) == 1) {
- addrPtr->sin6.sin6_family = AF_INET6;
- addrPtr->sin6.sin6_port = htons(nsport);
-#ifdef HAVE_SA_LEN
- addrPtr->sin6.sin6_len = sizeof(addrPtr->sin6);
-#endif
- } else if (inet_pton(AF_INET, host, &addrPtr->sin.sin_addr) == 1) {
- addrPtr->sin.sin_family = AF_INET;
- addrPtr->sin.sin_port = htons(nsport);
-#ifdef HAVE_SA_LEN
- addrPtr->sin.sin_len = sizeof(addrPtr->sin);
-#endif
- } else
- return FALSE;
- return TRUE;
-}
-
-
-/*
- ******************************************************************************
- *
- * SetDefaultServer --
- *
- * Changes the default name server to the one specified by
- * the first argument. The command "server name" uses the current
- * default server to lookup the info for "name". The command
- * "lserver name" uses the original server to lookup "name".
- *
- * Side effects:
- * This routine will cause a core dump if the allocation requests fail.
- *
- * Results:
- * SUCCESS The default server was changed successfully.
- * NONAUTH The server was changed but addresses of
- * other servers who know about the requested server
- * were returned.
- * Errors No info about the new server was found or
- * requests to the current server timed-out.
- *
- ******************************************************************************
- */
-
-int
-SetDefaultServer(string, local)
- char *string;
- Boolean local;
-{
- register HostInfo *newDefPtr;
- union res_sockaddr_union servAddr;
- union res_sockaddr_union addr;
- char newServer[NAME_LEN];
- int result;
- int tresult;
- int i;
- int j;
-
- /*
- * Parse the command line. It maybe of the form "server name",
- * "lserver name" or just "name".
- */
-
- if (local) {
- i = matchString (" lserver ", string);
- if (i > 0) {
- j = pickString(string + i, newServer, sizeof newServer);
- if (j == 0) { /* value was too big for newServer variable */
- fprintf(stderr,
- "SetDefaultServer: invalid name: %s\n",
- string + i);
- return(ERROR);
- }
- }
- } else {
- i = matchString(" server ", string);
- if (i > 0) {
- j = pickString(string + i, newServer, sizeof newServer);
- if (j == 0) { /* value was too big for newServer variable */
- fprintf(stderr,
- "SetDefaultServer: invalid name: %s\n",
- string + i);
- return(ERROR);
- }
- }
- }
-
- if (i == 0) {
- i = pickString(string, newServer, sizeof newServer);
- if (i == 0) { /* value was too big for newServer variable */
- fprintf(stderr,"SetDefaultServer: invalid name: %s\n", string);
- return(ERROR);
- }
- }
-
- /*
- * Allocate space for a HostInfo variable for the new server. Don't
- * overwrite the old HostInfo struct because info about the new server
- * might not be found and we need to have valid default server info.
- */
-
- newDefPtr = (HostInfo *) Calloc(1, sizeof(HostInfo));
-
-
- /*
- * A 'local' lookup uses the original server that the program was
- * initialized with.
- *
- * Check to see if we have the address of the server or the
- * address of a server who knows about this domain.
- * XXX For now, just use the first address in the list.
- */
-
- if (local) {
- servAddr = defaultAddr;
- } else if (defaultPtr->addrList != NULL) {
- UnionFromAddr(&servAddr, defaultPtr->addrList[0]->addrType,
- defaultPtr->addrList[0]->addr);
- } else {
- UnionFromAddr(&servAddr, defaultPtr->servers[0]->addrList[0]->addrType,
- defaultPtr->servers[0]->addrList[0]->addr);
- }
-
- result = ERROR;
- if (IsAddr(newServer, &addr)) {
- result = GetHostInfoByAddr(&servAddr, &addr, newDefPtr);
- /* If we can't get the name, fall through... */
- }
- if (result != SUCCESS && result != NONAUTH) {
- result = GetHostInfoByName(&servAddr, C_IN, T_A,
- newServer, newDefPtr, 1, 0);
- if (result == SUCCESS || result == NONAUTH || result == NO_INFO)
- tresult = GetHostInfoByName(&servAddr, C_IN, T_AAAA,
- newServer, newDefPtr, 1, 1);
- if (result == NO_INFO)
- result = tresult;
- }
-
- /* If we ask for an A record and get none back, but get an NS
- record for the NS server, this is the NONAUTH case.
- We must check whether we got an IP address for the NS
- server or not. */
- if ((result == SUCCESS || result == NONAUTH) &&
- ((newDefPtr->addrList && newDefPtr->addrList[0] != 0) ||
- (newDefPtr->servers && newDefPtr->servers[0] &&
- newDefPtr->servers[0]->addrList[0] != 0))) {
- /*
- * Found info about the new server. Free the resources for
- * the old server.
- */
-
- FreeHostInfoPtr(defaultPtr);
- free((char *)defaultPtr);
- defaultPtr = newDefPtr;
- strcpy(defaultServer, defaultPtr->name);
- PrintHostInfo(stdout, "Default Server:", defaultPtr);
- return(SUCCESS);
- } else {
- fprintf(stderr, "*** Can't find address for server %s: %s\n",
- newServer, DecodeError(result));
- free((char *)newDefPtr);
-
- return(result);
- }
-}
-
-/*
- ******************************************************************************
- *
- * DoLoookup --
- *
- * Common subroutine for LookupHost and LookupHostWithServer.
- *
- * Results:
- * SUCCESS - the lookup was successful.
- * Misc. Errors - an error message is printed if the lookup failed.
- *
- ******************************************************************************
- */
-
-static int
-DoLookup(host, servPtr, serverName)
- char *host;
- HostInfo *servPtr;
- char *serverName;
-{
- int result;
- union res_sockaddr_union servAddr;
- union res_sockaddr_union addr;
-
- /* Skip escape character */
- if (host[0] == '\\')
- host++;
-
- /*
- * If the user gives us an address for an address query,
- * silently treat it as a PTR query. If the query type is already
- * PTR, then convert the address into the in-addr.arpa format.
- *
- * Use the address of the server if it exists, otherwise use the
- * address of a server who knows about this domain.
- * XXX For now, just use the first address in the list.
- */
-
- if (servPtr->addrList != NULL) {
- UnionFromAddr(&servAddr, servPtr->addrList[0]->addrType,
- servPtr->addrList[0]->addr);
- } else {
- UnionFromAddr(&servAddr, servPtr->servers[0]->addrList[0]->addrType,
- servPtr->servers[0]->addrList[0]->addr);
- }
-
- /*
- * RFC1123 says we "SHOULD check the string syntactically for a
- * dotted-decimal number before looking it up [...]" (p. 13).
- */
- if ((queryType == T_A || queryType == T_AAAA) && IsAddr(host, &addr)) {
- result = GetHostInfoByAddr(&servAddr, &addr, &curHostInfo);
- } else {
- if (queryType == T_PTR) {
- CvtAddrToPtr(host);
- }
- result = GetHostInfoByName(&servAddr, queryClass, queryType, host,
- &curHostInfo, 0, 0);
- }
-
- switch (result) {
- case SUCCESS:
- /*
- * If the query was for an address, then the &curHostInfo
- * variable can be used by Finger.
- * There's no need to print anything for other query types
- * because the info has already been printed.
- */
- if (queryType == T_A || queryType == T_AAAA) {
- curHostValid = TRUE;
- PrintHostInfo(filePtr, "Name:", &curHostInfo);
- }
- break;
-
- /*
- * No Authoritative answer was available but we got names
- * of servers who know about the host.
- */
- case NONAUTH:
- PrintHostInfo(filePtr, "Name:", &curHostInfo);
- break;
-
- case NO_INFO:
- fprintf(stderr, "*** No %s (%s) records available for %s\n",
- DecodeType(queryType), p_type(queryType), host);
- break;
-
- case TIME_OUT:
- fprintf(stderr, "*** Request to %s timed-out\n", serverName);
- break;
-
- default:
- fprintf(stderr, "*** %s can't find %s: %s\n", serverName, host,
- DecodeError(result));
- }
- return result;
-}
-
-/*
- ******************************************************************************
- *
- * LookupHost --
- *
- * Asks the default name server for information about the
- * specified host or domain. The information is printed
- * if the lookup was successful.
- *
- * Results:
- * ERROR - the output file could not be opened.
- * + results of DoLookup
- *
- ******************************************************************************
- */
-
-int
-LookupHost(string, putToFile)
- char *string;
- Boolean putToFile;
-{
- char host[NAME_LEN];
- char file[PATH_MAX];
- int result;
- int i;
-
- /*
- * Invalidate the current host information to prevent Finger
- * from using bogus info.
- */
-
- curHostValid = FALSE;
-
- /*
- * Parse the command string into the host and
- * optional output file name.
- *
- */
-
- i = pickString(string, host, sizeof host);
- if (i == 0) { /* string was too long for host variable */
- fprintf(stderr, "*** invalid name: %s\n", string);
- return(ERROR);
- }
-
- if (!putToFile) {
- filePtr = stdout;
- } else {
- filePtr = OpenFile(string, file, sizeof file);
- if (filePtr == NULL) {
- fprintf(stderr, "*** Can't open %s for writing\n", file);
- return(ERROR);
- }
- fprintf(filePtr,"> %s\n", string);
- }
-
- PrintHostInfo(filePtr, "Server:", defaultPtr);
-
- result = DoLookup(host, defaultPtr, defaultServer);
-
- if (putToFile) {
- fclose(filePtr);
- filePtr = NULL;
- }
- return(result);
-}
-
-/*
- ******************************************************************************
- *
- * LookupHostWithServer --
- *
- * Asks the name server specified in the second argument for
- * information about the host or domain specified in the first
- * argument. The information is printed if the lookup was successful.
- *
- * Address info about the requested name server is obtained
- * from the default name server. This routine will return an
- * error if the default server doesn't have info about the
- * requested server. Thus an error return status might not
- * mean the requested name server doesn't have info about the
- * requested host.
- *
- * Comments from LookupHost apply here, too.
- *
- * Results:
- * ERROR - the output file could not be opened.
- * + results of DoLookup
- *
- ******************************************************************************
- */
-
-int
-LookupHostWithServer(char *string, Boolean putToFile) {
- char file[PATH_MAX];
- char host[NAME_LEN];
- char server[NAME_LEN];
- int result;
- static HostInfo serverInfo;
- int i;
- int j;
- union res_sockaddr_union u;
-
- curHostValid = FALSE;
-
- i = pickString(string, host, sizeof host);
- if (i == 0) { /* value was too big for host variable */
- fprintf(stderr, "*** invalid name: %s\n", string);
- return(ERROR);
- }
-
- j = pickString(string + i, server, sizeof server);
- if (j == 0) { /* value was too big for server variable */
- fprintf(stderr, "*** invalid server name: %s\n", string + i);
- return(ERROR);
- }
-
- if (!putToFile) {
- filePtr = stdout;
- } else {
- filePtr = OpenFile(string, file, sizeof file);
- if (filePtr == NULL) {
- fprintf(stderr, "*** Can't open %s for writing\n", file);
- return(ERROR);
- }
- fprintf(filePtr,"> %s\n", string);
- }
-
- if (defaultPtr->addrList != NULL)
- UnionFromAddr(&u, defaultPtr->addrList[0]->addrType,
- defaultPtr->addrList[0]->addr);
- else
- UnionFromAddr(&u, defaultPtr->servers[0]->addrList[0]->addrType,
- defaultPtr->servers[0]->addrList[0]->addr);
- result = GetHostInfoByName(&u, C_IN, T_A, server, &serverInfo, 1, 0);
- if (result == NO_INFO)
- result = GetHostInfoByName(&u, C_IN, T_AAAA, server,
- &serverInfo, 1, 1);
-
- if (result != SUCCESS) {
- fprintf(stderr,"*** Can't find address for server %s: %s\n", server,
- DecodeError(result));
- } else {
- PrintHostInfo(filePtr, "Server:", &serverInfo);
-
- result = DoLookup(host, &serverInfo, server);
- }
- if (putToFile) {
- fclose(filePtr);
- filePtr = NULL;
- }
- return(result);
-}
-
-/*
- ******************************************************************************
- *
- * SetOption --
- *
- * This routine is used to change the state information
- * that affect the lookups. The command format is
- * set keyword[=value]
- * Most keywords can be abbreviated. Parsing is very simplistic--
- * A value must not be separated from its keyword by white space.
- *
- * Valid keywords: Meaning:
- * all lists current values of options.
- * ALL lists current values of options, including
- * hidden options.
- * [no]d2 turn on/off extra debugging mode.
- * [no]debug turn on/off debugging mode.
- * [no]defname use/don't use default domain name.
- * [no]search use/don't use domain search list.
- * domain=NAME set default domain name to NAME.
- * [no]ignore ignore/don't ignore trunc. errors.
- * query=value set default query type to value,
- * value is one of the query types in RFC883
- * without the leading T_. (e.g., A, HINFO)
- * [no]recurse use/don't use recursive lookup.
- * retry=# set number of retries to #.
- * root=NAME change root server to NAME.
- * time=# set timeout length to #.
- * [no]vc use/don't use virtual circuit.
- * port TCP/UDP port to server.
- *
- * Deprecated:
- * [no]primary use/don't use primary server.
- *
- * Results:
- * SUCCESS the command was parsed correctly.
- * ERROR the command was not parsed correctly.
- *
- ******************************************************************************
- */
-
-int
-SetOption(option)
- register char *option;
-{
- char type[NAME_LEN];
- char *ptr;
- int tmp;
- int i;
-
- while (isspace(*option))
- ++option;
- if (strncmp (option, "set ", 4) == 0)
- option += 4;
- while (isspace(*option))
- ++option;
-
- if (*option == 0) {
- fprintf(stderr, "*** Invalid set command\n");
- return(ERROR);
- } else {
- if (strncmp(option, "all", 3) == 0) {
- ShowOptions();
- } else if (strncmp(option, "ALL", 3) == 0) {
- ShowOptions();
- } else if (strncmp(option, "d2", 2) == 0) { /* d2 (more debug) */
- res.options |= (RES_DEBUG | RES_DEBUG2);
- } else if (strncmp(option, "nod2", 4) == 0) {
- res.options &= ~RES_DEBUG2;
- printf("d2 mode disabled; still in debug mode\n");
- } else if (strncmp(option, "def", 3) == 0) { /* defname */
- res.options |= RES_DEFNAMES;
- } else if (strncmp(option, "nodef", 5) == 0) {
- res.options &= ~RES_DEFNAMES;
- } else if (strncmp(option, "do", 2) == 0) { /* domain */
- ptr = strchr(option, '=');
- if (ptr != NULL) {
- i = pickString(++ptr, res.defdname, sizeof res.defdname);
- if (i == 0) { /* name too long or nothing there */
- fprintf(stderr, "** invalid 'domain' value: %s\n",
- ptr) ;
- return(ERROR);
- }
-
- res_re_init();
- }
- } else if (strncmp(option, "deb", 1) == 0) { /* debug */
- res.options |= RES_DEBUG;
- } else if (strncmp(option, "nodeb", 5) == 0) {
- res.options &= ~(RES_DEBUG | RES_DEBUG2);
- } else if (strncmp(option, "ig", 2) == 0) { /* ignore */
- res.options |= RES_IGNTC;
- } else if (strncmp(option, "noig", 4) == 0) {
- res.options &= ~RES_IGNTC;
- } else if (strncmp(option, "po", 2) == 0) { /* port */
- ptr = strchr(option, '=');
- if (ptr != NULL) {
- sscanf(++ptr, "%hu", &nsport);
- }
-#ifdef deprecated
- } else if (strncmp(option, "pri", 3) == 0) { /* primary */
- res.options |= RES_PRIMARY;
- } else if (strncmp(option, "nopri", 5) == 0) {
- res.options &= ~RES_PRIMARY;
-#endif
- } else if (strncmp(option, "q", 1) == 0 || /* querytype */
- strncmp(option, "ty", 2) == 0) { /* type */
- ptr = strchr(option, '=');
- if (ptr != NULL) {
- i = pickString(++ptr, type, sizeof type);
- if (i == 0) { /* value too big or nothing there */
- fprintf(stderr, "*** invalid type value: %s\n",
- ptr) ;
- return(ERROR);
- }
-
- i = StringToType(type, queryType, stderr);
- if (ns_t_xfr_p(i)) {
- fprintf(stderr, "*** qtype may not be a zone transfer\n");
- return(ERROR);
- }
-
- queryType = i;
- }
- } else if (strncmp(option, "cl", 2) == 0) { /* query class */
- ptr = strchr(option, '=');
- if (ptr != NULL) {
- i = pickString(++ptr, type, sizeof type);
- if (i == 0) { /* value too big or nothing there */
- fprintf(stderr, "*** invalid class : %s\n",
- ptr) ;
- return(ERROR);
- }
-
- queryClass = StringToClass(type, queryClass, stderr);
- }
- } else if (strncmp(option, "rec", 3) == 0) { /* recurse */
- res.options |= RES_RECURSE;
- } else if (strncmp(option, "norec", 5) == 0) {
- res.options &= ~RES_RECURSE;
- } else if (strncmp(option, "ret", 3) == 0) { /* retry */
- ptr = strchr(option, '=');
- if (ptr != NULL) {
- sscanf(++ptr, "%d", &tmp);
- if (tmp >= 0) {
- res.retry = tmp;
- }
- }
- } else if (strncmp(option, "ro", 2) == 0) { /* root */
- ptr = strchr(option, '=');
- if (ptr != NULL) {
- i = pickString(++ptr, rootServerName, sizeof rootServerName);
- if (i == 0) { /* value too big or nothing there */
- fprintf(stderr, "*** invalid root server name : %s\n",
- ptr) ;
- return(ERROR) ;
- }
- }
- } else if (strncmp(option, "sea", 3) == 0) { /* search list */
- res.options |= RES_DNSRCH;
- } else if (strncmp(option, "nosea", 5) == 0) {
- res.options &= ~RES_DNSRCH;
- } else if (strncmp(option, "srchl", 5) == 0) { /* domain search list */
- ptr = strchr(option, '=');
- if (ptr != NULL) {
- res_dnsrch(++ptr);
- }
- } else if (strncmp(option, "ti", 2) == 0) { /* timeout */
- ptr = strchr(option, '=');
- if (ptr != NULL) {
- sscanf(++ptr, "%d", &tmp);
- if (tmp >= 0) {
- res.retrans = tmp;
- }
- }
- } else if (strncmp(option, "v", 1) == 0) { /* vc */
- res.options |= RES_USEVC;
- } else if (strncmp(option, "nov", 3) == 0) {
- res.options &= ~RES_USEVC;
- } else {
- fprintf(stderr, "*** Invalid option: %s\n", option);
- return(ERROR);
- }
- }
- return(SUCCESS);
-}
-
-/*
- * Fake a reinitialization when the domain is changed.
- */
-static void
-res_re_init(void) {
- register char *cp, **pp;
- int n;
-
- /* find components of local domain that might be searched */
- pp = res.dnsrch;
- *pp++ = res.defdname;
- for (cp = res.defdname, n = 0; *cp; cp++)
- if (*cp == '.')
- n++;
- cp = res.defdname;
- for (; n >= LOCALDOMAINPARTS && pp < res.dnsrch + MAXDFLSRCH; n--) {
- cp = strchr(cp, '.');
- *pp++ = ++cp;
- }
- *pp = 0;
- res.options |= RES_INIT;
-}
-
-#define SRCHLIST_SEP '/'
-
-static void
-res_dnsrch(char *cp) {
- char **pp;
- int n;
-
- (void)strncpy(res.defdname, cp, sizeof(res.defdname) - 1);
- res.defdname[sizeof(res.defdname) - 1] = '\0';
- if ((cp = strchr(res.defdname, '\n')) != NULL)
- *cp = '\0';
- /*
- * Set search list to be blank-separated strings
- * on rest of line.
- */
- cp = res.defdname;
- pp = res.dnsrch;
- *pp++ = cp;
- for (n = 0; *cp && pp < res.dnsrch + MAXDNSRCH; cp++) {
- if (*cp == SRCHLIST_SEP) {
- *cp = '\0';
- n = 1;
- } else if (n) {
- *pp++ = cp;
- n = 0;
- }
- }
- if ((cp = strchr(pp[-1], SRCHLIST_SEP)) != NULL) {
- *cp = '\0';
- }
- *pp = NULL;
-}
-
-
-/*
- ******************************************************************************
- *
- * ShowOptions --
- *
- * Prints out the state information used by the resolver
- * library and other options set by the user.
- *
- ******************************************************************************
- */
-
-static void
-ShowOptions(void)
-{
- register char **cp;
-
- PrintHostInfo(stdout, "Default Server:", defaultPtr);
- if (curHostValid) {
- PrintHostInfo(stdout, "Host:", &curHostInfo);
- }
-
- printf("Set options:\n");
- printf(" %sdebug \t", (res.options & RES_DEBUG) ? "" : "no");
- printf(" %sdefname\t", (res.options & RES_DEFNAMES) ? "" : "no");
- printf(" %ssearch\t", (res.options & RES_DNSRCH) ? "" : "no");
- printf(" %srecurse\n", (res.options & RES_RECURSE) ? "" : "no");
-
- printf(" %sd2\t\t", (res.options & RES_DEBUG2) ? "" : "no");
- printf(" %svc\t\t", (res.options & RES_USEVC) ? "" : "no");
- printf(" %signoretc\t", (res.options & RES_IGNTC) ? "" : "no");
- printf(" port=%u\n", nsport);
-
- printf(" querytype=%s\t", p_type(queryType));
- printf(" class=%s\t", p_class(queryClass));
- printf(" timeout=%d\t", res.retrans);
- printf(" retry=%d\n", res.retry);
- printf(" root=%s\n", rootServerName);
- printf(" domain=%s\n", res.defdname);
-
- cp = res.dnsrch;
- if (cp != NULL) {
- printf(" srchlist=%s", *cp);
- for (cp++; *cp; cp++) {
- printf("%c%s", SRCHLIST_SEP, *cp);
- }
- putchar('\n');
- }
- putchar('\n');
-}
-#undef SRCHLIST_SEP
-
-/*
- ******************************************************************************
- *
- * PrintHelp --
- *
- * Displays the help file.
- *
- ******************************************************************************
- */
-
-void
-PrintHelp(void)
-{
- char cmd[PATH_MAX];
-
- sprintf(cmd, "%s %s", pager, _PATH_HELPFILE);
- system(cmd);
-}
-
-/*
- ******************************************************************************
- *
- * CvtAddrToPtr --
- *
- * Convert a dotted-decimal Internet address into the standard
- * PTR format (reversed address with .in-arpa. suffix).
- *
- * Assumes the argument buffer is large enougth to hold the result.
- *
- ******************************************************************************
- */
-
-static void
-CvtAddrToPtr(name)
- char *name;
-{
- const char *p;
- int ip[4];
- union res_sockaddr_union addr;
-
- if (IsAddr(name, &addr)) {
- switch (addr.sin.sin_family) {
- case AF_INET:
- p = inet_ntoa(addr.sin.sin_addr);
- if (sscanf(p, "%d.%d.%d.%d", &ip[0], &ip[1], &ip[2], &ip[3]) == 4)
- sprintf(name, "%d.%d.%d.%d.in-addr.arpa.",
- ip[3], ip[2], ip[1], ip[0]);
- break;
- case AF_INET6:
- sprintf(name,
- "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x."
- "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x."
- "ip6.arpa",
- addr.sin6.sin6_addr.s6_addr[15] & 0xf,
- (addr.sin6.sin6_addr.s6_addr[15] >> 4) & 0xf,
- addr.sin6.sin6_addr.s6_addr[14] & 0xf,
- (addr.sin6.sin6_addr.s6_addr[14] >> 4) & 0xf,
- addr.sin6.sin6_addr.s6_addr[13] & 0xf,
- (addr.sin6.sin6_addr.s6_addr[13] >> 4) & 0xf,
- addr.sin6.sin6_addr.s6_addr[12] & 0xf,
- (addr.sin6.sin6_addr.s6_addr[12] >> 4) & 0xf,
- addr.sin6.sin6_addr.s6_addr[11] & 0xf,
- (addr.sin6.sin6_addr.s6_addr[11] >> 4) & 0xf,
- addr.sin6.sin6_addr.s6_addr[10] & 0xf,
- (addr.sin6.sin6_addr.s6_addr[10] >> 4) & 0xf,
- addr.sin6.sin6_addr.s6_addr[9] & 0xf,
- (addr.sin6.sin6_addr.s6_addr[9] >> 4) & 0xf,
- addr.sin6.sin6_addr.s6_addr[8] & 0xf,
- (addr.sin6.sin6_addr.s6_addr[8] >> 4) & 0xf,
- addr.sin6.sin6_addr.s6_addr[7] & 0xf,
- (addr.sin6.sin6_addr.s6_addr[7] >> 4) & 0xf,
- addr.sin6.sin6_addr.s6_addr[6] & 0xf,
- (addr.sin6.sin6_addr.s6_addr[6] >> 4) & 0xf,
- addr.sin6.sin6_addr.s6_addr[5] & 0xf,
- (addr.sin6.sin6_addr.s6_addr[5] >> 4) & 0xf,
- addr.sin6.sin6_addr.s6_addr[4] & 0xf,
- (addr.sin6.sin6_addr.s6_addr[4] >> 4) & 0xf,
- addr.sin6.sin6_addr.s6_addr[3] & 0xf,
- (addr.sin6.sin6_addr.s6_addr[3] >> 4) & 0xf,
- addr.sin6.sin6_addr.s6_addr[2] & 0xf,
- (addr.sin6.sin6_addr.s6_addr[2] >> 4) & 0xf,
- addr.sin6.sin6_addr.s6_addr[1] & 0xf,
- (addr.sin6.sin6_addr.s6_addr[1] >> 4) & 0xf,
- addr.sin6.sin6_addr.s6_addr[0] & 0xf,
- (addr.sin6.sin6_addr.s6_addr[0] >> 4) & 0xf);
- break;
- }
- }
-}
-
-/*
- ******************************************************************************
- *
- * ReadRC --
- *
- * Use the contents of ~/.nslookuprc as options.
- *
- ******************************************************************************
- */
-
-static void
-ReadRC(void)
-{
- register FILE *fp;
- register char *cp;
- char buf[PATH_MAX];
-
- if ((cp = getenv("HOME")) != NULL &&
- (strlen(cp) + strlen(_PATH_NSLOOKUPRC)) < sizeof(buf)) {
-
- (void) strcpy(buf, cp);
- (void) strcat(buf, _PATH_NSLOOKUPRC);
-
- if ((fp = fopen(buf, "r")) != NULL) {
- while (fgets(buf, sizeof(buf), fp) != NULL) {
- if ((cp = strchr(buf, '\n')) != NULL) {
- *cp = '\0';
- }
- (void) SetOption(buf);
- }
- (void) fclose(fp);
- }
- }
-}
diff --git a/contrib/bind/bin/nslookup/nslookup.help b/contrib/bind/bin/nslookup/nslookup.help
deleted file mode 100644
index 31a66345a523..000000000000
--- a/contrib/bind/bin/nslookup/nslookup.help
+++ /dev/null
@@ -1,33 +0,0 @@
-$Id: nslookup.help,v 8.5 2000/03/30 23:25:35 vixie Exp $
-
-Commands: (identifiers are shown in uppercase, [] means optional)
-NAME - print info about the host/domain NAME using default server
-NAME1 NAME2 - as above, but use NAME2 as server
-help or ? - print info on common commands; see nslookup(1) for details
-set OPTION - set an option
- all - print options, current server and host
- [no]debug - print debugging information
- [no]d2 - print exhaustive debugging information
- [no]defname - append domain name to each query
- [no]recurse - ask for recursive answer to query
- [no]vc - always use a virtual circuit
- domain=NAME - set default domain name to NAME
- srchlist=N1[/N2/.../N6] - set domain to N1 and search list to N1,N2, etc.
- root=NAME - set root server to NAME
- retry=X - set number of retries to X
- timeout=X - set initial time-out interval to X seconds
- querytype=X - set query type, e.g., A,ANY,CNAME,HINFO,MX,PX,NS,PTR,SOA,TXT,WKS,SRV,NAPTR
- port=X - set port number to send query on
- type=X - synonym for querytype
- class=X - set query class to one of IN (Internet), CHAOS, HESIOD or ANY
-server NAME - set default server to NAME, using current default server
-lserver NAME - set default server to NAME, using initial server
-finger [USER] - finger the optional USER at the current default host
-root - set current default server to the root
-ls [opt] DOMAIN [> FILE] - list addresses in DOMAIN (optional: output to FILE)
- -a - list canonical names and aliases
- -h - list HINFO (CPU type and operating system)
- -s - list well-known services
- -d - list all records
- -t TYPE - list records of the given type (e.g., A,CNAME,MX, etc.)
-exit - exit the program, ^D also exits
diff --git a/contrib/bind/bin/nslookup/pathnames.h b/contrib/bind/bin/nslookup/pathnames.h
deleted file mode 100644
index 71f56cc18249..000000000000
--- a/contrib/bind/bin/nslookup/pathnames.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * ++Copyright++ 1990
- * -
- * Copyright (c) 1990
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * -
- * Portions Copyright (c) 1993 by Digital Equipment Corporation.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies, and that
- * the name of Digital Equipment Corporation not be used in advertising or
- * publicity pertaining to distribution of the document or software without
- * specific, written prior permission.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
- * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- * -
- * --Copyright--
- */
-
-/*
- * @(#)pathnames.h 5.1 (Berkeley) 5/28/90
- * $Id: pathnames.h,v 8.2 2000/11/08 06:47:32 marka Exp $
- */
-
-#define _PATH_NSLOOKUPRC "/.nslookuprc"
-#ifndef _PATH_PAGERCMD
-#define _PATH_PAGERCMD "more"
-#endif
-
-#ifndef _PATH_HELPFILE
-#if defined(BSD) && BSD >= 198810
-#define _PATH_HELPFILE "/usr/share/misc/nslookup.help"
-#else
-#define _PATH_HELPFILE "/usr/lib/nslookup.help"
-#endif
-#endif
-
diff --git a/contrib/bind/bin/nslookup/res.h b/contrib/bind/bin/nslookup/res.h
deleted file mode 100644
index fe9241de3bb3..000000000000
--- a/contrib/bind/bin/nslookup/res.h
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * ++Copyright++ 1985, 1989
- * -
- * Copyright (c) 1985, 1989
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * -
- * Portions Copyright (c) 1993 by Digital Equipment Corporation.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies, and that
- * the name of Digital Equipment Corporation not be used in advertising or
- * publicity pertaining to distribution of the document or software without
- * specific, written prior permission.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
- * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- * -
- * --Copyright--
- */
-
-/*
- * @(#)res.h 5.10 (Berkeley) 6/1/90
- * $Id: res.h,v 8.10 2002/04/09 05:55:22 marka Exp $
- */
-
-/*
- *******************************************************************************
- *
- * res.h --
- *
- * Definitions used by modules of the name server lookup program.
- *
- * Copyright (c) 1985
- * Andrew Cherenson
- * U.C. Berkeley
- * CS298-26 Fall 1985
- *
- *******************************************************************************
- */
-
-#define TRUE 1
-#define FALSE 0
-typedef int Boolean;
-
-#define MAXALIASES 35
-#define MAXADDRS 35
-#define MAXDOMAINS 35
-#define MAXSERVERS 10
-
-/*
- * Define return statuses in addtion to the ones defined in namserv.h
- * let SUCCESS be a synonym for NOERROR
- *
- * TIME_OUT - a socket connection timed out.
- * NO_INFO - the server didn't find any info about the host.
- * ERROR - one of the following types of errors:
- * dn_expand, res_mkquery failed
- * bad command line, socket operation failed, etc.
- * NONAUTH - the server didn't have the desired info but
- * returned the name(s) of some servers who should.
- * NO_RESPONSE - the server didn't respond.
- *
- */
-
-#ifdef ERROR
-#undef ERROR
-#endif
-
-#define SUCCESS 0
-#define TIME_OUT -1
-#define NO_INFO -2
-#define ERROR -3
-#define NONAUTH -4
-#define NO_RESPONSE -5
-
-/*
- * Define additional options for the resolver state structure.
- *
- * RES_DEBUG2 more verbose debug level
- */
-
-#define RES_DEBUG2 0x80000000
-
-/*
- * Maximum length of server, host and file names.
- */
-
-#define NAME_LEN 256
-
-
-/*
- * Modified struct hostent from <netdb.h>
- *
- * "Structures returned by network data base library. All addresses
- * are supplied in host order, and returned in network order (suitable
- * for use in system calls)."
- */
-
-typedef struct {
- int addrType;
- int addrLen;
- char *addr;
-} AddrInfo;
-
-typedef struct {
- char *name; /* official name of host */
- char **domains; /* domains it serves */
- AddrInfo **addrList; /* list of addresses from name server */
-} ServerInfo;
-
-typedef struct {
- char *name; /* official name of host */
- char **aliases; /* alias list */
- AddrInfo **addrList; /* list of addresses from name server */
- ServerInfo **servers;
-} HostInfo;
-
-
-/*
- * FilePtr is used for directing listings to a file.
- * It is global so the Control-C handler can close it.
- */
-
-extern FILE *filePtr;
-
-/*
- * TCP/UDP port of server.
- */
-extern unsigned short nsport;
-
-/*
- * Our resolver context.
- */
-extern struct __res_state res;
-
-/*
- * External routines:
- */
-
-/* XXX need prototypes */
-void Print_query(const u_char *msg, const u_char *eom, int printHeader);
-void Fprint_query(const u_char *msg, const u_char *eom, int printHeader,
- FILE *file);
-const u_char *Print_cdname(const u_char *cp, const u_char *msg,
- const u_char *eom, FILE *file);
-const u_char *Print_cdname2(const u_char *cp, const u_char *msg,
- const u_char *eom, FILE *file);
-const u_char *Print_rr(const u_char *ocp, const u_char *msg,
- const u_char *eom, FILE *file);
-extern const char *DecodeType(); /* descriptive version of p_type */
-extern const char *DecodeError();
-extern char *Calloc();
-extern char *Malloc();
-extern void NsError();
-extern void PrintServer();
-extern void PrintHostInfo();
-extern void FreeHostInfoPtr();
-extern FILE *OpenFile();
-extern int pickString(const char *, char *, size_t);
-extern int GetHostInfoByName(union res_sockaddr_union *, int, int,
- const char *, HostInfo *, Boolean, Boolean);
-extern int GetHostDomain(union res_sockaddr_union *, int, int,
- const char *, char *, HostInfo *, Boolean, Boolean);
-extern int matchString(const char *, const char *);
-extern int StringToType(char *, int, FILE *);
-extern int StringToClass(char *, int, FILE *);
-extern int SendRequest(union res_sockaddr_union *, const u_char *, int,
- u_char *, u_int, int *);
-extern void SendRequest_close(void);
-extern int SetDefaultServer(char *, Boolean);
-extern int Finger(char *, int);
-void ListHostsByType(char *, int);
-void ListHosts(char *, int);
-void ListHost_close(void);
-int SetOption(char *);
-int LookupHost(char *, Boolean);
-int LookupHostWithServer(char *, Boolean);
-const char * DecodeType(int);
-const char * DecodeError(int);
-FILE * OpenFile(char *, char *, size_t);
-void PrintHostInfo(FILE *, const char *, HostInfo *);
-char * Calloc(int, int);
-char * Malloc(int);
-SIG_FN IntrHandler(int);
-int ListSubr(int, char *, char *);
-void FreeHostInfoPtr(HostInfo *);
-unsigned char * res_skip(unsigned char *, int, unsigned char *);
-extern Boolean IsAddr(const char *, union res_sockaddr_union *);
-void PrintHelp(void);
-int GetHostInfoByAddr(union res_sockaddr_union *, union res_sockaddr_union *,
- HostInfo *);
-
diff --git a/contrib/bind/bin/nslookup/send.c b/contrib/bind/bin/nslookup/send.c
deleted file mode 100644
index 4afcb568afae..000000000000
--- a/contrib/bind/bin/nslookup/send.c
+++ /dev/null
@@ -1,404 +0,0 @@
-/*
- * Copyright (c) 1985, 1989
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Portions Copyright (c) 1993 by Digital Equipment Corporation.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies, and that
- * the name of Digital Equipment Corporation not be used in advertising or
- * publicity pertaining to distribution of the document or software without
- * specific, written prior permission.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
- * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- */
-
-#ifndef lint
-static const char sccsid[] = "@(#)send.c 5.18 (Berkeley) 3/2/91";
-static const char rcsid[] = "$Id: send.c,v 8.14.10.1 2003/06/02 05:59:56 marka Exp $";
-#endif /* not lint */
-
-/*
- ******************************************************************************
- *
- * send.c --
- *
- * Routine to send request packets to a name server.
- *
- * Based on "@(#)res_send.c 6.25 (Berkeley) 6/1/90".
- *
- ******************************************************************************
- */
-
-
-/*
- * Send query to name server and wait for reply.
- */
-
-#include "port_before.h"
-
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-#include <arpa/inet.h>
-
-#include <errno.h>
-#include <resolv.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "port_after.h"
-
-#include "res.h"
-
-static int s = -1; /* socket used for communications */
-
-unsigned short nsport = NAMESERVER_PORT;
-
-
-
-/*
- ******************************************************************************
- *
- * SendRequest --
- *
- * Sends a request packet to a name server whose address
- * is specified by the first argument and returns with
- * the answer packet.
- *
- * Results:
- * SUCCESS - the request was sent and an answer
- * was received.
- * TIME_OUT - the virtual circuit connection timed-out
- * or a reply to a datagram wasn't received.
- *
- *
- ******************************************************************************
- */
-
-int
-SendRequest(union res_sockaddr_union *nsAddrPtr, const u_char *buf,
- int buflen, u_char *answer, u_int anslen, int *trueLenPtr)
-{
- int n, try, v_circuit, resplen;
- ISC_SOCKLEN_T salen;
- int gotsomewhere = 0, connected = 0;
- int connreset = 0;
- u_short id, len;
- u_char *cp;
- fd_set dsmask;
- struct timeval timeout;
- const HEADER *hp = (const HEADER *) buf;
- HEADER *anhp = (HEADER *) answer;
- struct iovec iov[2];
- int terrno = ETIMEDOUT;
- char junk[512];
- struct sockaddr_storage sa;
- int family = nsAddrPtr->sin.sin_family;
- int clen = (family == AF_INET) ? sizeof(struct sockaddr_in) :
- sizeof(struct sockaddr_in6);
-
- if (res.options & RES_DEBUG2) {
- printf("------------\nSendRequest(), len %d\n", buflen);
- Print_query(buf, buf + buflen, 1);
- }
- v_circuit = (res.options & RES_USEVC) || buflen > PACKETSZ;
- id = hp->id;
- /*
- * Send request, RETRY times, or until successful
- */
- for (try = 0; try < res.retry; try++) {
- usevc:
- if (v_circuit) {
- int truncated = 0;
-
- /*
- * Use virtual circuit;
- * at most one attempt per server.
- */
- try = res.retry;
- if (s < 0) {
- s = socket(family, SOCK_STREAM, 0);
- if (s < 0) {
- terrno = errno;
- if (res.options & RES_DEBUG)
- perror("socket (vc) failed");
- continue;
- }
- if (connect(s, (struct sockaddr *)nsAddrPtr,
- clen) < 0) {
- terrno = errno;
- if (res.options & RES_DEBUG)
- perror("connect failed");
- (void) close(s);
- s = -1;
- continue;
- }
- }
- /*
- * Send length & message
- */
- ns_put16(buflen, (u_char *)&len);
- iov[0].iov_base = (caddr_t)&len;
- iov[0].iov_len = INT16SZ;
- DE_CONST(buf, iov[1].iov_base);
- iov[1].iov_len = buflen;
- if (writev(s, iov, 2) != INT16SZ + buflen) {
- terrno = errno;
- if (res.options & RES_DEBUG)
- perror("write failed");
- (void) close(s);
- s = -1;
- continue;
- }
- /*
- * Receive length & response
- */
- cp = answer;
- len = INT16SZ;
- while ((n = read(s, (char *)cp, (int)len)) > 0) {
- cp += n;
- if ((len -= n) <= 0)
- break;
- }
- if (n <= 0) {
- terrno = errno;
- if (res.options & RES_DEBUG)
- perror("read failed");
- (void) close(s);
- s = -1;
- /*
- * A long running process might get its TCP
- * connection reset if the remote server was
- * restarted. Requery the server instead of
- * trying a new one. When there is only one
- * server, this means that a query might work
- * instead of failing. We only allow one reset
- * per query to prevent looping.
- */
- if (terrno == ECONNRESET && !connreset) {
- connreset = 1;
- }
- continue;
- }
- cp = answer;
- if ((resplen = ns_get16((u_char*)cp)) > (int)anslen) {
- if (res.options & RES_DEBUG)
- fprintf(stderr, "response truncated\n");
- len = anslen;
- truncated = 1;
- } else
- len = resplen;
- while (len != 0 &&
- (n = read(s, (char *)cp, (int)len)) > 0) {
- cp += n;
- len -= n;
- }
- if (n <= 0) {
- terrno = errno;
- if (res.options & RES_DEBUG)
- perror("read failed");
- (void) close(s);
- s = -1;
- continue;
- }
- if (truncated) {
- /*
- * Flush rest of answer
- * so connection stays in synch.
- */
- anhp->tc = 1;
- len = resplen - anslen;
- while (len != 0) {
- n = (len > sizeof(junk) ?
- sizeof(junk) : len);
- if ((n = read(s, junk, n)) > 0)
- len -= n;
- else
- break;
- }
- }
- } else {
- /*
- * Use datagrams.
- */
- if (s < 0) {
- s = socket(family, SOCK_DGRAM, 0);
- if (s < 0) {
- terrno = errno;
- if (res.options & RES_DEBUG)
- perror("socket (dg) failed");
- continue;
- }
- }
-#if BSD >= 43
- if (connected == 0) {
- if (connect(s, (struct sockaddr *)nsAddrPtr,
- clen) < 0) {
- if (res.options & RES_DEBUG)
- perror("connect");
- continue;
- }
- connected = 1;
- }
- if (send(s, buf, buflen, 0) != buflen) {
- if (res.options & RES_DEBUG)
- perror("send");
- continue;
- }
-#else /* BSD */
- if (sendto(s, (const char *)buf, buflen, 0,
- (struct sockaddr *) nsAddrPtr,
- clen) != buflen) {
- if (res.options & RES_DEBUG)
- perror("sendto");
- continue;
- }
-#endif
-
- /*
- * Wait for reply
- */
- timeout.tv_sec = (res.retrans << try);
- if (timeout.tv_sec <= 0)
- timeout.tv_sec = 1;
- timeout.tv_usec = 0;
- wait:
- FD_ZERO(&dsmask);
- FD_SET(s, &dsmask);
- n = select(s+1, &dsmask, (fd_set *)NULL,
- (fd_set *)NULL, &timeout);
- if (n < 0) {
- if (res.options & RES_DEBUG)
- perror("select");
- continue;
- }
- if (n == 0) {
- /*
- * timeout
- */
- if (res.options & RES_DEBUG)
- printf("timeout\n");
-#if BSD >= 43
- gotsomewhere = 1;
-#endif
- continue;
- }
-
- salen = sizeof sa;
- resplen = recvfrom(s, (char *)answer, anslen, 0,
- (struct sockaddr *)&sa, &salen);
- if (resplen <= 0) {
- if (res.options & RES_DEBUG)
- perror("recvfrom");
- continue;
- }
- gotsomewhere = 1;
- if (id != anhp->id) {
- /*
- * response from old query, ignore it
- */
- if (res.options & RES_DEBUG2) {
- printf("------------\nOld answer:\n");
- Print_query(answer, answer+resplen, 1);
- }
- goto wait;
- }
- if (!(res.options & RES_IGNTC) && anhp->tc) {
- /*
- * get rest of answer;
- * use TCP with same server.
- */
- if (res.options & RES_DEBUG)
- printf("truncated answer\n");
- (void) close(s);
- s = -1;
- v_circuit = 1;
- goto usevc;
- }
- }
- if (res.options & RES_DEBUG) {
- if (res.options & RES_DEBUG2)
- printf("------------\nGot answer (%d bytes):\n",
- resplen);
- else
- printf("------------\nGot answer:\n");
- Print_query(answer, answer+resplen, 1);
- }
- (void) close(s);
- s = -1;
- *trueLenPtr = resplen;
- return (SUCCESS);
- }
- if (s >= 0) {
- (void) close(s);
- s = -1;
- }
- if (v_circuit == 0)
- if (gotsomewhere == 0)
- return NO_RESPONSE; /* no nameservers found */
- else
- return TIME_OUT; /* no answer obtained */
- else
- if (errno == ECONNREFUSED)
- return NO_RESPONSE;
- else
- return ERROR;
-}
-
-/*
- * This routine is for closing the socket if a virtual circuit is used and
- * the program wants to close it.
- *
- * Called from the interrupt handler.
- */
-void
-SendRequest_close(void) {
- if (s != -1) {
- (void) close(s);
- s = -1;
- }
-}
diff --git a/contrib/bind/bin/nslookup/skip.c b/contrib/bind/bin/nslookup/skip.c
deleted file mode 100644
index 4077523b2b35..000000000000
--- a/contrib/bind/bin/nslookup/skip.c
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Copyright (c) 1985, 1989
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Portions Copyright (c) 1993 by Digital Equipment Corporation.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies, and that
- * the name of Digital Equipment Corporation not be used in advertising or
- * publicity pertaining to distribution of the document or software without
- * specific, written prior permission.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
- * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- */
-
-#ifndef lint
-static const char sccsid[] = "@(#)skip.c 5.12 (Berkeley) 3/21/91";
-static const char rcsid[] = "$Id: skip.c,v 8.7 2001/06/20 12:30:35 marka Exp $";
-#endif /* not lint */
-
-/*
- *******************************************************************************
- *
- * skip.c --
- *
- * Routines to skip over portions of a query buffer.
- *
- * Note: this file has been submitted for inclusion in
- * BIND resolver library. When this has been done, this file
- * is no longer necessary (assuming there haven't been any
- * changes).
- *
- * Adapted from 4.3BSD BIND res_debug.c
- *
- *******************************************************************************
- */
-
-#include "port_before.h"
-
-#include <sys/param.h>
-
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-
-#include <resolv.h>
-#include <stdio.h>
-
-#include "port_after.h"
-#include "res.h"
-
-static unsigned char *res_skip_rr(unsigned char *cp, unsigned char *eom);
-
-
-/*
- *******************************************************************************
- *
- * res_skip --
- *
- * Skip the contents of a query.
- *
- * Interpretation of numFieldsToSkip argument:
- * res_skip returns pointer to:
- * 1 -> start of question records.
- * 2 -> start of authoritative answer records.
- * 3 -> start of additional records.
- * 4 -> first byte after end of additional records.
- *
- * Results:
- * (address) - success operation.
- * NULL - a resource record had an incorrect format.
- *
- *******************************************************************************
- */
-
-unsigned char *
-res_skip(msg, numFieldsToSkip, eom)
- unsigned char *msg;
- int numFieldsToSkip;
- unsigned char *eom;
-{
- register unsigned char *cp;
- register HEADER *hp;
- register int tmp;
- register int n;
-
- /*
- * Skip the header fields.
- */
- hp = (HEADER *)msg;
- cp = msg + HFIXEDSZ;
-
- /*
- * skip question records.
- */
- n = ntohs(hp->qdcount);
- if (n > 0) {
- while (--n >= 0 && cp < eom) {
- tmp = dn_skipname(cp, eom);
- if (tmp == -1) return(NULL);
- cp += tmp;
- cp += INT16SZ; /* type */
- cp += INT16SZ; /* class */
- }
- }
- if (--numFieldsToSkip <= 0) return(cp);
-
- /*
- * skip authoritative answer records
- */
- n = ntohs(hp->ancount);
- if (n > 0) {
- while (--n >= 0 && cp < eom) {
- cp = res_skip_rr(cp, eom);
- if (cp == NULL) return(NULL);
- }
- }
- if (--numFieldsToSkip == 0) return(cp);
-
- /*
- * skip name server records
- */
- n = ntohs(hp->nscount);
- if (n > 0) {
- while (--n >= 0 && cp < eom) {
- cp = res_skip_rr(cp, eom);
- if (cp == NULL) return(NULL);
- }
- }
- if (--numFieldsToSkip == 0) return(cp);
-
- /*
- * skip additional records
- */
- n = ntohs(hp->arcount);
- if (n > 0) {
- while (--n >= 0 && cp < eom) {
- cp = res_skip_rr(cp, eom);
- if (cp == NULL) return(NULL);
- }
- }
-
- return(cp);
-}
-
-
-/*
- *******************************************************************************
- *
- * res_skip_rr --
- *
- * Skip over resource record fields.
- *
- * Results:
- * (address) - success operation.
- * NULL - a resource record had an incorrect format.
- *******************************************************************************
- */
-
-static unsigned char *
-res_skip_rr(cp, eom)
- unsigned char *cp;
- unsigned char *eom;
-{
- int tmp;
- int dlen;
-
- if ((tmp = dn_skipname(cp, eom)) == -1)
- return (NULL); /* compression error */
- cp += tmp;
- if ((cp + RRFIXEDSZ) > eom)
- return (NULL);
- cp += INT16SZ; /* type */
- cp += INT16SZ; /* class */
- cp += INT32SZ; /* ttl */
- dlen = ns_get16(cp);
- cp += INT16SZ; /* dlen */
- cp += dlen;
- if (cp > eom)
- return (NULL);
- return (cp);
-}
diff --git a/contrib/bind/bin/nslookup/subr.c b/contrib/bind/bin/nslookup/subr.c
deleted file mode 100644
index ff9f1e9ffd82..000000000000
--- a/contrib/bind/bin/nslookup/subr.c
+++ /dev/null
@@ -1,603 +0,0 @@
-/*
- * Copyright (c) 1985, 1989
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Portions Copyright (c) 1993 by Digital Equipment Corporation.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies, and that
- * the name of Digital Equipment Corporation not be used in advertising or
- * publicity pertaining to distribution of the document or software without
- * specific, written prior permission.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
- * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- */
-
-#ifndef lint
-static const char sccsid[] = "@(#)subr.c 5.24 (Berkeley) 3/2/91";
-static const char rcsid[] = "$Id: subr.c,v 8.16 2002/04/09 05:55:24 marka Exp $";
-#endif /* not lint */
-
-/*
- *******************************************************************************
- *
- * subr.c --
- *
- * Miscellaneous subroutines for the name server
- * lookup program.
- *
- * Copyright (c) 1985
- * Andrew Cherenson
- * U.C. Berkeley
- * CS298-26 Fall 1985
- *
- *******************************************************************************
- */
-
-#include "port_before.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-#include <arpa/inet.h>
-
-#include <ctype.h>
-#include <netdb.h>
-#include <setjmp.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "port_after.h"
-
-#include "resolv.h"
-#include "res.h"
-
-/*
- *******************************************************************************
- *
- * IntrHandler --
- *
- * This routine is called whenever a control-C is typed.
- * It performs three main functions:
- * - closes an open socket connection,
- * - closes an open output file (used by LookupHost, et al.),
- * - jumps back to the main read-eval loop.
- *
- * If a user types a ^C in the middle of a routine that uses a socket,
- * the routine would not be able to close the socket. To prevent an
- * overflow of the process's open file table, the socket and output
- * file descriptors are closed by the interrupt handler.
- *
- * Side effects:
- * Open file descriptors are closed.
- * If filePtr is valid, it is closed.
- * Flow of control returns to the main() routine.
- *
- *******************************************************************************
- */
-
-SIG_FN
-IntrHandler(int sig)
-{
- extern jmp_buf env;
-#if defined(BSD) && BSD >= 199006 && !defined(RISCOS_BSD) && !defined(__osf__)
- extern FILE *yyin; /* scanner input file */
- extern void yyrestart(); /* routine to restart scanner after interrupt */
-#endif
- extern void ListHost_close(void);
-
- UNUSED(sig);
-
- SendRequest_close();
- ListHost_close();
- if (filePtr != NULL && filePtr != stdout) {
- fclose(filePtr);
- filePtr = NULL;
- }
- printf("\n");
-#if defined(BSD) && BSD >= 199006 && !defined(RISCOS_BSD) && !defined(__osf__)
- yyrestart(yyin);
-#endif
- longjmp(env, 1);
-}
-
-
-/*
- *******************************************************************************
- *
- * Malloc --
- * Calloc --
- *
- * Calls the malloc library routine with SIGINT blocked to prevent
- * corruption of malloc's data structures. We need to do this because
- * a control-C doesn't kill the program -- it causes a return to the
- * main command loop.
- *
- * NOTE: This method doesn't prevent the pointer returned by malloc
- * from getting lost, so it is possible to get "core leaks".
- *
- * If malloc fails, the program exits.
- *
- * Results:
- * (address) - address of new buffer.
- *
- *******************************************************************************
- */
-
-char *
-Malloc(size)
- int size;
-{
- char *ptr;
-
-#ifdef SYSV
-#if defined(SVR3) || defined(SVR4)
- sighold(SIGINT);
- ptr = malloc((unsigned) size);
- sigrelse(SIGINT);
-#else
- { SIG_FN (*old)();
- old = signal(SIGINT, SIG_IGN);
- ptr = malloc((unsigned) size);
- signal(SIGINT, old);
- }
-#endif
-#else
-#ifdef POSIX_SIGNALS
- { sigset_t sset;
- sigemptyset(&sset);
- sigaddset(&sset,SIGINT);
- sigprocmask(SIG_BLOCK,&sset,NULL);
- ptr = malloc((unsigned) size);
- sigprocmask(SIG_UNBLOCK,&sset,NULL);
- }
-#else
- { int saveMask;
- saveMask = sigblock(sigmask(SIGINT));
- ptr = malloc((unsigned) size);
- (void) sigsetmask(saveMask);
- }
-#endif
-#endif
- if (ptr == NULL) {
- fflush(stdout);
- fprintf(stderr, "*** Can't allocate memory\n");
- fflush(stderr);
- abort();
- /*NOTREACHED*/
- }
- return (ptr);
-}
-
-char *
-Calloc(num, size)
- register int num, size;
-{
- char *ptr = Malloc(num*size);
- memset(ptr, 0, num*size);
- return(ptr);
-}
-
-
-/*
- *******************************************************************************
- *
- * PrintHostInfo --
- *
- * Prints out the HostInfo structure for a host.
- *
- *******************************************************************************
- */
-
-void
-PrintHostInfo(file, title, hp)
- FILE *file;
- const char *title;
- register HostInfo *hp;
-{
- register AddrInfo **ap;
- register char **cp;
- register ServerInfo **sp;
- char comma;
- int i;
- char buf[80];
-
- fprintf(file, "%-7s %s", title, hp->name);
-
- if (hp->addrList != NULL) {
- if (hp->addrList[1] != NULL) {
- fprintf(file, "\nAddresses:");
- } else {
- fprintf(file, "\nAddress:");
- }
- comma = ' ';
- i = 0;
- for (ap = hp->addrList; ap && *ap; ap++) {
- i++;
- if (i > 4) {
- fprintf(file, "\n\t");
- comma = ' ';
- i = 0;
- }
- if (inet_ntop((*ap)->addrType, (*ap)->addr,
- buf, sizeof(buf)) != NULL) {
- fprintf(file,"%c %s", comma, buf);
- } else
- fprintf(file,"%c <UNKNOWN>", comma);
- comma = ',';
- }
- }
-
- if (hp->aliases != NULL) {
- fprintf(file, "\nAliases:");
- comma = ' ';
- i = 10;
- for (cp = hp->aliases; cp && *cp && **cp; cp++) {
- i += strlen(*cp) + 2;
- if (i > 75) {
- fprintf(file, "\n\t");
- comma = ' ';
- i = 10;
- }
- fprintf(file, "%c %s", comma, *cp);
- comma = ',';
- }
- }
-
- if (hp->servers != NULL) {
- fprintf(file, "\nServed by:\n");
- for (sp = hp->servers; *sp != NULL ; sp++) {
-
- fprintf(file, "- %s\n\t", (*sp)->name);
-
- comma = ' ';
- i = 0;
- for (ap = (*sp)->addrList; ap && *ap; ap++) {
- i++;
- if (i > 4) {
- fprintf(file, "\n\t");
- comma = ' ';
- i = 0;
- }
- if (inet_ntop((*ap)->addrType, (*ap)->addr,
- buf, sizeof(buf)) != NULL)
- fprintf(file,"%c %s", comma, buf);
- else
- fprintf(file,"%c <UNKNOWN>", comma);
- comma = ',';
- }
- fprintf(file, "\n\t");
-
- comma = ' ';
- i = 10;
- for (cp = (*sp)->domains; cp && *cp && **cp; cp++) {
- i += strlen(*cp) + 2;
- if (i > 75) {
- fprintf(file, "\n\t");
- comma = ' ';
- i = 10;
- }
- fprintf(file, "%c %s", comma, *cp);
- comma = ',';
- }
- fprintf(file, "\n");
- }
- }
-
- fprintf(file, "\n\n");
-}
-
-/*
- *******************************************************************************
- *
- * OpenFile --
- *
- * Parses a command string for a file name and opens
- * the file. The file name is copued to the argument FILE. The
- * parameter SIZE parameter includes space for a null byte.
- *
- * Results:
- * file pointer - the open was successful.
- * NULL - there was an error opening the file or
- * the input string was invalid.
- *
- *******************************************************************************
- */
-
-FILE *
-OpenFile(string, file, size)
- char *string;
- char *file;
- size_t size;
-{
- char *redirect;
- FILE *tmpPtr;
- int i;
-
- /*
- * Open an output file if we see '>' or >>'.
- * Check for overwrite (">") or concatenation (">>").
- */
-
- redirect = strchr(string, '>');
- if (redirect == NULL) {
- return(NULL);
- }
-
- tmpPtr = NULL;
- if (redirect[1] == '>') {
- i = pickString(redirect + 2, file, size);
- if (i > 0) {
- tmpPtr = fopen(file, "a+");
- }
- } else {
- i = pickString(redirect + 1, file, size);
- if (i > 0) {
- tmpPtr = fopen(file, "w");
- }
- }
-
- if (tmpPtr != NULL) {
- redirect[0] = '\0';
- }
-
- return(tmpPtr);
-}
-
-/*
- *******************************************************************************
- *
- * DecodeError --
- *
- * Converts an error code into a character string.
- *
- *******************************************************************************
- */
-
-const struct res_sym error_syms[] = {
- { NOERROR, "Success", NULL },
- { FORMERR, "Format error", NULL },
- { SERVFAIL, "Server failed", NULL },
- { NXDOMAIN, "Non-existent host/domain", NULL },
- { NOTIMP, "Not implemented", NULL },
- { REFUSED, "Query refused", NULL },
-#ifdef NOCHANGE
- { NOCHANGE, "No change", NULL },
-#endif
- { TIME_OUT, "Timed out", NULL },
- { NO_INFO, "No information", NULL },
- { ERROR, "Unspecified error", NULL },
- { NONAUTH, "Non-authoritative answer", NULL },
- { NO_RESPONSE, "No response from server", NULL },
- { 0, NULL, NULL }
-};
-
-const char *
-DecodeError(result)
- int result;
-{
- const char *string;
- int success;
-
- string = sym_ntos(error_syms, result, &success);
- if (success)
- return string;
- return ("BAD ERROR VALUE");
-}
-
-
-int
-StringToClass(class, dflt, errorfile)
- char *class;
- int dflt;
- FILE *errorfile;
-{
- int result, success;
-
- result = sym_ston(__p_class_syms, class, &success);
- if (success)
- return result;
-
- if (errorfile)
- fprintf(errorfile, "unknown query class: %s\n", class);
- return(dflt);
-}
-
-
-/*
- *******************************************************************************
- *
- * StringToType --
- *
- * Converts a string form of a query type name to its
- * corresponding integer value.
- *
- *******************************************************************************
- */
-
-int
-StringToType(type, dflt, errorfile)
- char *type;
- int dflt;
- FILE *errorfile;
-{
- int result, success;
-
- result = sym_ston(__p_type_syms, type, &success);
- if (success)
- return (result);
-
- if (errorfile)
- fprintf(errorfile, "unknown query type: %s\n", type);
- return (dflt);
-}
-
-/*
- *******************************************************************************
- *
- * DecodeType --
- *
- * Converts a query type to a descriptive name.
- * (A more verbose form of p_type.)
- *
- *
- *******************************************************************************
- */
-
-const char *
-DecodeType(type)
- int type;
-{
-
- return (sym_ntop(__p_type_syms, type, (int *)0));
-}
-
-
-
-
-/*
- * Skip over leading white space in SRC and then copy the next sequence of
- * non-whitespace characters into DEST. No more than (DEST_SIZE - 1)
- * characters are copied. DEST is always null-terminated. Returns 0 if no
- * characters could be copied into DEST. Returns the number of characters
- * in SRC that were processed (i.e. the count of characters in the leading
- * white space and the first non-whitespace sequence).
- *
- * int i;
- * char *p = " foo bar ", *q;
- * char buf[100];
- *
- * q = p + pickString(p, buf, sizeof buff);
- * assert (strcmp (q, " bar ") == 0) ;
- *
- */
-
-int
-pickString(const char *src, char *dest, size_t dest_size) {
- const char *start;
- const char *end ;
- size_t sublen ;
-
- if (dest_size == 0 || dest == NULL || src == NULL)
- return 0;
-
- for (start = src ; isspace(*start) ; start++)
- /* nada */ ;
-
- for (end = start ; *end != '\0' && !isspace(*end) ; end++)
- /* nada */ ;
-
- sublen = end - start ;
-
- if (sublen == 0 || sublen > (dest_size - 1))
- return 0;
-
- strncpy (dest, start, sublen);
-
- dest[sublen] = '\0' ;
-
- return (end - src);
-}
-
-
-
-
-/*
- * match the string FORMAT against the string SRC. Leading whitespace in
- * FORMAT will match any amount of (including no) leading whitespace in
- * SRC. Any amount of whitespace inside FORMAT matches any non-zero amount
- * of whitespace in SRC. Value returned is 0 if match didn't occur, or the
- * amount of characters in SRC that did match
- *
- * int i ;
- *
- * i = matchString(" a b c", "a b c") ;
- * assert (i == 5) ;
- * i = matchString("a b c", " a b c");
- * assert (i == 0) ; becasue no leading white space in format
- * i = matchString(" a b c", " a b c");
- * assert(i == 12);
- * i = matchString("aa bb ", "aa bb ddd sd");
- * assert(i == 16);
- */
-int
-matchString (const char *format, const char *src) {
- const char *f = format;
- const char *s = src;
-
- if (f == NULL || s == NULL)
- goto notfound;
-
- if (isspace(*f)) {
- while (isspace(*f))
- f++ ;
- while (isspace(*s))
- s++ ;
- }
-
- while (1) {
- if (isspace(*f)) {
- if (!isspace(*s))
- goto notfound;
- while(isspace(*s))
- s++;
- /* any amount of whitespace in the format string
- will match any amount of space in the source
- string. */
- while (isspace(*f))
- f++;
- } else if (*f == '\0') {
- return (s - src);
- } else if (*f != *s) {
- goto notfound;
- } else {
- s++ ;
- f++ ;
- }
- }
- notfound:
- return 0 ;
-}