diff options
author | Dag-Erling Smørgrav <des@FreeBSD.org> | 2004-09-24 19:48:50 +0000 |
---|---|---|
committer | Dag-Erling Smørgrav <des@FreeBSD.org> | 2004-09-24 19:48:50 +0000 |
commit | 29d75632bd276029d874c42e613218086eebd6dd (patch) | |
tree | bb3edb8dcc07615d426eb359f46c1741e4c22575 /contrib/bind/bin/nslookup | |
parent | 8540155e95215c1e3287e1c7de8ec20d820b7692 (diff) |
Notes
Diffstat (limited to 'contrib/bind/bin/nslookup')
-rw-r--r-- | contrib/bind/bin/nslookup/Makefile | 98 | ||||
-rw-r--r-- | contrib/bind/bin/nslookup/commands.l | 273 | ||||
-rw-r--r-- | contrib/bind/bin/nslookup/debug.c | 657 | ||||
-rw-r--r-- | contrib/bind/bin/nslookup/getinfo.c | 1104 | ||||
-rw-r--r-- | contrib/bind/bin/nslookup/list.c | 705 | ||||
-rw-r--r-- | contrib/bind/bin/nslookup/main.c | 1327 | ||||
-rw-r--r-- | contrib/bind/bin/nslookup/nslookup.help | 33 | ||||
-rw-r--r-- | contrib/bind/bin/nslookup/pathnames.h | 73 | ||||
-rw-r--r-- | contrib/bind/bin/nslookup/res.h | 227 | ||||
-rw-r--r-- | contrib/bind/bin/nslookup/send.c | 404 | ||||
-rw-r--r-- | contrib/bind/bin/nslookup/skip.c | 219 | ||||
-rw-r--r-- | contrib/bind/bin/nslookup/subr.c | 603 |
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 ; -} |