summaryrefslogtreecommitdiffstats
path: root/contrib/bind9/lib/export/samples
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bind9/lib/export/samples')
-rw-r--r--contrib/bind9/lib/export/samples/Makefile-postinstall.in78
-rw-r--r--contrib/bind9/lib/export/samples/Makefile.in99
-rw-r--r--contrib/bind9/lib/export/samples/nsprobe.c1220
-rw-r--r--contrib/bind9/lib/export/samples/sample-async.c402
-rw-r--r--contrib/bind9/lib/export/samples/sample-gai.c77
-rw-r--r--contrib/bind9/lib/export/samples/sample-request.c265
-rw-r--r--contrib/bind9/lib/export/samples/sample-update.c755
-rw-r--r--contrib/bind9/lib/export/samples/sample.c384
8 files changed, 0 insertions, 3280 deletions
diff --git a/contrib/bind9/lib/export/samples/Makefile-postinstall.in b/contrib/bind9/lib/export/samples/Makefile-postinstall.in
deleted file mode 100644
index 5b1aafb..0000000
--- a/contrib/bind9/lib/export/samples/Makefile-postinstall.in
+++ /dev/null
@@ -1,78 +0,0 @@
-# Copyright (C) 2009, 2012 Internet Systems Consortium, Inc. ("ISC")
-#
-# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
-# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-# AND FITNESS. IN NO EVENT SHALL ISC 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-postinstall.in,v 1.3 2009/09/02 23:48:02 tbox Exp $
-
-srcdir = @srcdir@
-#prefix = @prefix@
-#exec_prefix = @exec_prefix@
-
-CDEFINES =
-CWARNINGS =
-
-DNSLIBS = -ldns @DNS_CRYPTO_LIBS@
-ISCLIBS = -lisc
-ISCCFGLIBS = -lisccfg
-IRSLIBS = -lirs
-
-LIBS = ${DNSLIBS} ${ISCCFGLIBS} ${ISCLIBS} @LIBS@
-
-SUBDIRS =
-
-TARGETS = sample@EXEEXT@ sample-async@EXEEXT@ sample-gai@EXEEXT@ \
- sample-update@EXEEXT@ sample-request@EXEEXT@ nsprobe@EXEEXT@ \
- dlvchecks@EXEEXT@
-
-OBJS = sample.@O@ sample-async.@O@ sample-gai.@O@ sample-update.@O@ \
- sample-request.@O@ nsprobe.@O@ dlvchecks.@O@
-
-SRCS = sample.c sample-async.c sample-gai.c sample-update.c \
- sample-request.c nsprobe.c dlvchecks..c
-
-@BIND9_MAKE_RULES@
-
-# The following two may depend on BIND9_MAKE_RULES
-CINCLUDES = -I@export_includedir@
-LDFLAGS = -L@export_libdir@
-
-sample@EXEEXT@: sample.@O@ ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- sample.@O@ ${LIBS}
-
-sample-async@EXEEXT@: sample-async.@O@ ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- sample-async.@O@ ${LIBS}
-
-sample-gai@EXEEXT@: sample-gai.@O@ ${IRSDEPLIBS} ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- sample-gai.@O@ ${IRSLIBS} ${LIBS}
-
-sample-update@EXEEXT@: sample-update.@O@ ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- sample-update.@O@ ${LIBS}
-
-sample-request@EXEEXT@: sample-request.@O@ ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- sample-request.@O@ ${LIBS}
-
-nsprobe@EXEEXT@: nsprobe.@O@ ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- nsprobe.@O@ ${LIBS}
-
-dlvchecks@EXEEXT@: dlvchecks.@O@ ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- dlvchecks.@O@ ${LIBS}
-
-clean distclean maintainer-clean::
- rm -f ${TARGETS}
diff --git a/contrib/bind9/lib/export/samples/Makefile.in b/contrib/bind9/lib/export/samples/Makefile.in
deleted file mode 100644
index 194aaeb..0000000
--- a/contrib/bind9/lib/export/samples/Makefile.in
+++ /dev/null
@@ -1,99 +0,0 @@
-# Copyright (C) 2009, 2012, 2013 Internet Systems Consortium, Inc. ("ISC")
-#
-# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
-# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-# AND FITNESS. IN NO EVENT SHALL ISC 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.in,v 1.4 2009/12/05 23:31:41 each Exp $
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-export_srcdir = @top_srcdir@/lib/export
-
-@BIND9_VERSION@
-
-@BIND9_MAKE_INCLUDES@
-
-CINCLUDES = -I${srcdir}/include -I../dns/include \
- -I${export_srcdir}/isc/include \
- ${DNS_INCLUDES} ${ISC_INCLUDES} \
- -I${top_srcdir}/lib/irs/include \
- -I../../irs/include
-
-CDEFINES =
-CWARNINGS =
-
-DNSLIBS = ../dns/libdns.@A@ @DNS_CRYPTO_LIBS@
-ISCLIBS = ../isc/libisc.@A@
-ISCCFGLIBS = ../isccfg/libisccfg.@A@
-IRSLIBS = ../irs/libirs.@A@
-
-DNSDEPLIBS = ../dns/libdns.@A@
-ISCDEPLIBS = ../isc/libisc.@A@
-ISCCFGDEPLIBS = ../isccfg/libisccfg.@A@
-IRSDEPLIBS = ../irs/libirs.@A@
-
-DEPLIBS = ${DNSDEPLIBS} ${ISCCFGDEPLIBS} ${ISCDEPLIBS}
-
-LIBS = ${DNSLIBS} ${ISCCFGLIBS} ${ISCLIBS} @LIBS@
-
-SUBDIRS =
-
-TARGETS = sample@EXEEXT@ sample-async@EXEEXT@ sample-gai@EXEEXT@ \
- sample-update@EXEEXT@ sample-request@EXEEXT@ nsprobe@EXEEXT@
-
-OBJS = sample.@O@ sample-async.@O@ sample-gai.@O@ sample-update.@O@ \
- sample-request.@O@ nsprobe.@O@
-
-UOBJS =
-
-SRCS = sample.c sample-async.c sample-gai.c sample-update.c \
- sample-request.c nsprobe.c
-
-MANPAGES =
-
-HTMLPAGES =
-
-MANOBJS = ${MANPAGES} ${HTMLPAGES}
-
-@BIND9_MAKE_RULES@
-
-sample@EXEEXT@: sample.@O@ ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- sample.@O@ ${LIBS}
-
-sample-async@EXEEXT@: sample-async.@O@ ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- sample-async.@O@ ${LIBS}
-
-sample-gai@EXEEXT@: sample-gai.@O@ ${IRSDEPLIBS} ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- sample-gai.@O@ ${IRSLIBS} ${LIBS}
-
-sample-update@EXEEXT@: sample-update.@O@ ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- sample-update.@O@ ${LIBS}
-
-sample-request@EXEEXT@: sample-request.@O@ ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- sample-request.@O@ ${LIBS}
-
-nsprobe@EXEEXT@: nsprobe.@O@ ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- nsprobe.@O@ ${LIBS}
-
-doc man:: ${MANOBJS}
-
-docclean manclean maintainer-clean::
- rm -f ${MANOBJS}
-
-clean distclean maintainer-clean::
- rm -f ${TARGETS}
diff --git a/contrib/bind9/lib/export/samples/nsprobe.c b/contrib/bind9/lib/export/samples/nsprobe.c
deleted file mode 100644
index 1d7ed3b..0000000
--- a/contrib/bind9/lib/export/samples/nsprobe.c
+++ /dev/null
@@ -1,1220 +0,0 @@
-/*
- * Copyright (C) 2009-2013 Internet Systems Consortium, Inc. ("ISC")
- *
- * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
- * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS. IN NO EVENT SHALL ISC 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$ */
-
-#include <config.h>
-
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <netdb.h>
-
-#include <isc/app.h>
-#include <isc/buffer.h>
-#include <isc/lib.h>
-#include <isc/mem.h>
-#include <isc/socket.h>
-#include <isc/sockaddr.h>
-#include <isc/string.h>
-#include <isc/task.h>
-#include <isc/timer.h>
-#include <isc/util.h>
-
-#include <dns/client.h>
-#include <dns/fixedname.h>
-#include <dns/lib.h>
-#include <dns/message.h>
-#include <dns/name.h>
-#include <dns/rdata.h>
-#include <dns/rdataset.h>
-#include <dns/rdatastruct.h>
-#include <dns/rdatatype.h>
-#include <dns/result.h>
-
-#define MAX_PROBES 1000
-
-static dns_client_t *client = NULL;
-static isc_task_t *probe_task = NULL;
-static isc_appctx_t *actx = NULL;
-static isc_mem_t *mctx = NULL;
-static unsigned int outstanding_probes = 0;
-const char *cacheserver = "127.0.0.1";
-static FILE *fp;
-
-typedef enum {
- none,
- exist,
- nxdomain,
- othererr,
- multiplesoa,
- multiplecname,
- brokenanswer,
- lame,
- timedout,
- notype,
- unexpected
-} query_result_t;
-
-struct server {
- ISC_LINK(struct server) link;
-
- isc_sockaddr_t address;
- query_result_t result_a;
- query_result_t result_aaaa;
-};
-
-struct probe_ns {
- ISC_LINK(struct probe_ns) link;
-
- dns_fixedname_t fixedname;
- dns_name_t *name;
- struct server *current_server;
- ISC_LIST(struct server) servers;
-};
-
-struct probe_trans {
- isc_boolean_t inuse;
- char *domain;
- dns_fixedname_t fixedname;
- dns_name_t *qname;
- const char **qlabel;
- isc_boolean_t qname_found;
- dns_clientrestrans_t *resid;
- dns_message_t *qmessage;
- dns_message_t *rmessage;
- dns_clientreqtrans_t *reqid;
-
- /* NS list */
- struct probe_ns *current_ns;
- ISC_LIST(struct probe_ns) nslist;
-};
-
-struct lcl_stat {
- unsigned long valid;
- unsigned long ignore;
- unsigned long nxdomain;
- unsigned long othererr;
- unsigned long multiplesoa;
- unsigned long multiplecname;
- unsigned long brokenanswer;
- unsigned long lame;
- unsigned long unknown;
-} server_stat, domain_stat;
-
-static unsigned long number_of_domains = 0;
-static unsigned long number_of_servers = 0;
-static unsigned long multiple_error_domains = 0;
-static isc_boolean_t debug_mode = ISC_FALSE;
-static int verbose_level = 0;
-static const char *qlabels[] = {"www.", "ftp.", NULL};
-static struct probe_trans probes[MAX_PROBES];
-
-static isc_result_t probe_domain(struct probe_trans *trans);
-static void reset_probe(struct probe_trans *trans);
-static isc_result_t fetch_nsaddress(struct probe_trans *trans);
-static isc_result_t probe_name(struct probe_trans *trans,
- dns_rdatatype_t type);
-
-/* Dump an rdataset for debug */
-static isc_result_t
-print_rdataset(dns_rdataset_t *rdataset, dns_name_t *owner) {
- isc_buffer_t target;
- isc_result_t result;
- isc_region_t r;
- char t[4096];
-
- if (!debug_mode)
- return (ISC_R_SUCCESS);
-
- isc_buffer_init(&target, t, sizeof(t));
-
- if (!dns_rdataset_isassociated(rdataset))
- return (ISC_R_SUCCESS);
- result = dns_rdataset_totext(rdataset, owner, ISC_FALSE, ISC_FALSE,
- &target);
- if (result != ISC_R_SUCCESS)
- return (result);
- isc_buffer_usedregion(&target, &r);
- printf("%.*s", (int)r.length, (char *)r.base);
-
- return (ISC_R_SUCCESS);
-}
-
-static isc_result_t
-print_name(dns_name_t *name) {
- isc_result_t result;
- isc_buffer_t target;
- isc_region_t r;
- char t[4096];
-
- isc_buffer_init(&target, t, sizeof(t));
- result = dns_name_totext(name, ISC_TRUE, &target);
- if (result == ISC_R_SUCCESS) {
- isc_buffer_usedregion(&target, &r);
- printf("%.*s", (int)r.length, (char *)r.base);
- } else
- printf("(invalid name)");
-
- return (result);
-}
-
-static isc_result_t
-print_address(FILE *fp, isc_sockaddr_t *addr) {
- char buf[NI_MAXHOST];
-
- if (getnameinfo(&addr->type.sa, addr->length, buf, sizeof(buf),
- NULL, 0, NI_NUMERICHOST) == 0) {
- fprintf(fp, "%s", buf);
- } else {
- fprintf(fp, "(invalid address)");
- }
-
- return (ISC_R_SUCCESS);
-}
-
-static void
-ctxs_destroy(isc_mem_t **mctxp, isc_appctx_t **actxp,
- isc_taskmgr_t **taskmgrp, isc_socketmgr_t **socketmgrp,
- isc_timermgr_t **timermgrp)
-{
- if (*taskmgrp != NULL)
- isc_taskmgr_destroy(taskmgrp);
-
- if (*timermgrp != NULL)
- isc_timermgr_destroy(timermgrp);
-
- if (*socketmgrp != NULL)
- isc_socketmgr_destroy(socketmgrp);
-
- if (*actxp != NULL)
- isc_appctx_destroy(actxp);
-
- if (*mctxp != NULL)
- isc_mem_destroy(mctxp);
-}
-
-static isc_result_t
-ctxs_init(isc_mem_t **mctxp, isc_appctx_t **actxp,
- isc_taskmgr_t **taskmgrp, isc_socketmgr_t **socketmgrp,
- isc_timermgr_t **timermgrp)
-{
- isc_result_t result;
-
- result = isc_mem_create(0, 0, mctxp);
- if (result != ISC_R_SUCCESS)
- goto fail;
-
- result = isc_appctx_create(*mctxp, actxp);
- if (result != ISC_R_SUCCESS)
- goto fail;
-
- result = isc_taskmgr_createinctx(*mctxp, *actxp, 1, 0, taskmgrp);
- if (result != ISC_R_SUCCESS)
- goto fail;
-
- result = isc_socketmgr_createinctx(*mctxp, *actxp, socketmgrp);
- if (result != ISC_R_SUCCESS)
- goto fail;
-
- result = isc_timermgr_createinctx(*mctxp, *actxp, timermgrp);
- if (result != ISC_R_SUCCESS)
- goto fail;
-
- return (ISC_R_SUCCESS);
-
- fail:
- ctxs_destroy(mctxp, actxp, taskmgrp, socketmgrp, timermgrp);
-
- return (result);
-}
-
-/*
- * Common routine to make query data
- */
-static isc_result_t
-make_querymessage(dns_message_t *message, dns_name_t *qname0,
- dns_rdatatype_t rdtype)
-{
- dns_name_t *qname = NULL;
- dns_rdataset_t *qrdataset = NULL;
- isc_result_t result;
-
- message->opcode = dns_opcode_query;
- message->rdclass = dns_rdataclass_in;
-
- result = dns_message_gettempname(message, &qname);
- if (result != ISC_R_SUCCESS)
- goto cleanup;
-
- result = dns_message_gettemprdataset(message, &qrdataset);
- if (result != ISC_R_SUCCESS)
- goto cleanup;
-
- dns_name_init(qname, NULL);
- dns_name_clone(qname0, qname);
- dns_rdataset_init(qrdataset);
- dns_rdataset_makequestion(qrdataset, message->rdclass, rdtype);
- ISC_LIST_APPEND(qname->list, qrdataset, link);
- dns_message_addname(message, qname, DNS_SECTION_QUESTION);
-
- return (ISC_R_SUCCESS);
-
- cleanup:
- if (qname != NULL)
- dns_message_puttempname(message, &qname);
- if (qrdataset != NULL)
- dns_message_puttemprdataset(message, &qrdataset);
- return (result);
-}
-
-/*
- * Update statistics
- */
-static inline void
-increment_entry(unsigned long *entryp) {
- (*entryp)++;
- INSIST(*entryp != 0U); /* check overflow */
-}
-
-static void
-update_stat(struct probe_trans *trans) {
- struct probe_ns *pns;
- struct server *server;
- struct lcl_stat local_stat;
- unsigned int err_count = 0;
- const char *stattype;
-
- increment_entry(&number_of_domains);
- memset(&local_stat, 0, sizeof(local_stat));
-
- /* Update per sever statistics */
- for (pns = ISC_LIST_HEAD(trans->nslist); pns != NULL;
- pns = ISC_LIST_NEXT(pns, link)) {
- for (server = ISC_LIST_HEAD(pns->servers); server != NULL;
- server = ISC_LIST_NEXT(server, link)) {
- increment_entry(&number_of_servers);
-
- if (server->result_aaaa == exist ||
- server->result_aaaa == notype) {
- /*
- * Don't care about the result of A query if
- * the answer to AAAA query was expected.
- */
- stattype = "valid";
- increment_entry(&server_stat.valid);
- increment_entry(&local_stat.valid);
- } else if (server->result_a == exist) {
- switch (server->result_aaaa) {
- case exist:
- case notype:
- stattype = "valid";
- increment_entry(&server_stat.valid);
- increment_entry(&local_stat.valid);
- break;
- case timedout:
- stattype = "ignore";
- increment_entry(&server_stat.ignore);
- increment_entry(&local_stat.ignore);
- break;
- case nxdomain:
- stattype = "nxdomain";
- increment_entry(&server_stat.nxdomain);
- increment_entry(&local_stat.nxdomain);
- break;
- case othererr:
- stattype = "othererr";
- increment_entry(&server_stat.othererr);
- increment_entry(&local_stat.othererr);
- break;
- case multiplesoa:
- stattype = "multiplesoa";
- increment_entry(&server_stat.multiplesoa);
- increment_entry(&local_stat.multiplesoa);
- break;
- case multiplecname:
- stattype = "multiplecname";
- increment_entry(&server_stat.multiplecname);
- increment_entry(&local_stat.multiplecname);
- break;
- case brokenanswer:
- stattype = "brokenanswer";
- increment_entry(&server_stat.brokenanswer);
- increment_entry(&local_stat.brokenanswer);
- break;
- case lame:
- stattype = "lame";
- increment_entry(&server_stat.lame);
- increment_entry(&local_stat.lame);
- break;
- default:
- stattype = "unknown";
- increment_entry(&server_stat.unknown);
- increment_entry(&local_stat.unknown);
- break;
- }
- } else {
- stattype = "unknown";
- increment_entry(&server_stat.unknown);
- increment_entry(&local_stat.unknown);
- }
-
- if (verbose_level > 1 ||
- (verbose_level == 1 &&
- strcmp(stattype, "valid") != 0 &&
- strcmp(stattype, "unknown") != 0)) {
- print_name(pns->name);
- putchar('(');
- print_address(stdout, &server->address);
- printf(") for %s:%s\n", trans->domain,
- stattype);
- }
- }
- }
-
- /* Update per domain statistics */
- if (local_stat.ignore > 0U) {
- if (verbose_level > 0)
- printf("%s:ignore\n", trans->domain);
- increment_entry(&domain_stat.ignore);
- err_count++;
- }
- if (local_stat.nxdomain > 0U) {
- if (verbose_level > 0)
- printf("%s:nxdomain\n", trans->domain);
- increment_entry(&domain_stat.nxdomain);
- err_count++;
- }
- if (local_stat.othererr > 0U) {
- if (verbose_level > 0)
- printf("%s:othererr\n", trans->domain);
- increment_entry(&domain_stat.othererr);
- err_count++;
- }
- if (local_stat.multiplesoa > 0U) {
- if (verbose_level > 0)
- printf("%s:multiplesoa\n", trans->domain);
- increment_entry(&domain_stat.multiplesoa);
- err_count++;
- }
- if (local_stat.multiplecname > 0U) {
- if (verbose_level > 0)
- printf("%s:multiplecname\n", trans->domain);
- increment_entry(&domain_stat.multiplecname);
- err_count++;
- }
- if (local_stat.brokenanswer > 0U) {
- if (verbose_level > 0)
- printf("%s:brokenanswer\n", trans->domain);
- increment_entry(&domain_stat.brokenanswer);
- err_count++;
- }
- if (local_stat.lame > 0U) {
- if (verbose_level > 0)
- printf("%s:lame\n", trans->domain);
- increment_entry(&domain_stat.lame);
- err_count++;
- }
-
- if (err_count > 1U)
- increment_entry(&multiple_error_domains);
-
- /*
- * We regard the domain as valid if and only if no authoritative server
- * has a problem and at least one server is known to be valid.
- */
- if (local_stat.valid > 0U && err_count == 0U) {
- if (verbose_level > 1)
- printf("%s:valid\n", trans->domain);
- increment_entry(&domain_stat.valid);
- }
-
- /*
- * If the domain has no available server or all servers have the
- * 'unknown' result, the domain's result is also regarded as unknown.
- */
- if (local_stat.valid == 0U && err_count == 0U) {
- if (verbose_level > 1)
- printf("%s:unknown\n", trans->domain);
- increment_entry(&domain_stat.unknown);
- }
-}
-
-/*
- * Search for an existent name with an A RR
- */
-
-static isc_result_t
-set_nextqname(struct probe_trans *trans) {
- isc_result_t result;
- size_t domainlen;
- isc_buffer_t b;
- char buf[4096]; /* XXX ad-hoc constant, but should be enough */
-
- if (*trans->qlabel == NULL)
- return (ISC_R_NOMORE);
-
- result = isc_string_copy(buf, sizeof(buf), *trans->qlabel);
- if (result != ISC_R_SUCCESS)
- return (result);
- result = isc_string_append(buf, sizeof(buf), trans->domain);
- if (result != ISC_R_SUCCESS)
- return (result);
-
- domainlen = strlen(buf);
- isc_buffer_init(&b, buf, domainlen);
- isc_buffer_add(&b, domainlen);
- dns_fixedname_init(&trans->fixedname);
- trans->qname = dns_fixedname_name(&trans->fixedname);
- result = dns_name_fromtext(trans->qname, &b, dns_rootname,
- 0, NULL);
-
- trans->qlabel++;
-
- return (result);
-}
-
-static void
-request_done(isc_task_t *task, isc_event_t *event) {
- struct probe_trans *trans = event->ev_arg;
- dns_clientreqevent_t *rev = (dns_clientreqevent_t *)event;
- dns_message_t *rmessage;
- struct probe_ns *pns;
- struct server *server;
- isc_result_t result;
- query_result_t *resultp;
- dns_name_t *name;
- dns_rdataset_t *rdataset;
- dns_rdatatype_t type;
-
- REQUIRE(task == probe_task);
- REQUIRE(trans != NULL && trans->inuse == ISC_TRUE);
- rmessage = rev->rmessage;
- REQUIRE(rmessage == trans->rmessage);
- INSIST(outstanding_probes > 0);
-
- server = trans->current_ns->current_server;
- INSIST(server != NULL);
-
- if (server->result_a == none) {
- type = dns_rdatatype_a;
- resultp = &server->result_a;
- } else {
- resultp = &server->result_aaaa;
- type = dns_rdatatype_aaaa;
- }
-
- if (rev->result == ISC_R_SUCCESS) {
- if ((rmessage->flags & DNS_MESSAGEFLAG_AA) == 0)
- *resultp = lame;
- else if (rmessage->rcode == dns_rcode_nxdomain)
- *resultp = nxdomain;
- else if (rmessage->rcode != dns_rcode_noerror)
- *resultp = othererr;
- else if (rmessage->counts[DNS_SECTION_ANSWER] == 0) {
- /* no error but empty answer */
- *resultp = notype;
- } else {
- result = dns_message_firstname(rmessage,
- DNS_SECTION_ANSWER);
- while (result == ISC_R_SUCCESS) {
- name = NULL;
- dns_message_currentname(rmessage,
- DNS_SECTION_ANSWER,
- &name);
- for (rdataset = ISC_LIST_HEAD(name->list);
- rdataset != NULL;
- rdataset = ISC_LIST_NEXT(rdataset,
- link)) {
- (void)print_rdataset(rdataset, name);
-
- if (rdataset->type ==
- dns_rdatatype_cname ||
- rdataset->type ==
- dns_rdatatype_dname) {
- /* Should chase the chain? */
- *resultp = exist;
- goto found;
- } else if (rdataset->type == type) {
- *resultp = exist;
- goto found;
- }
- }
- result = dns_message_nextname(rmessage,
- DNS_SECTION_ANSWER);
- }
-
- /*
- * Something unexpected happened: the response
- * contained a non-empty authoritative answer, but we
- * could not find an expected result.
- */
- *resultp = unexpected;
- }
- } else if (rev->result == DNS_R_RECOVERABLE ||
- rev->result == DNS_R_BADLABELTYPE) {
- /* Broken response. Try identifying known cases. */
- *resultp = brokenanswer;
-
- if (rmessage->counts[DNS_SECTION_ANSWER] > 0) {
- result = dns_message_firstname(rmessage,
- DNS_SECTION_ANSWER);
- while (result == ISC_R_SUCCESS) {
- /*
- * Check to see if the response has multiple
- * CNAME RRs. Update the result code if so.
- */
- name = NULL;
- dns_message_currentname(rmessage,
- DNS_SECTION_ANSWER,
- &name);
- for (rdataset = ISC_LIST_HEAD(name->list);
- rdataset != NULL;
- rdataset = ISC_LIST_NEXT(rdataset,
- link)) {
- if (rdataset->type ==
- dns_rdatatype_cname &&
- dns_rdataset_count(rdataset) > 1) {
- *resultp = multiplecname;
- goto found;
- }
- }
- result = dns_message_nextname(rmessage,
- DNS_SECTION_ANSWER);
- }
- }
-
- if (rmessage->counts[DNS_SECTION_AUTHORITY] > 0) {
- result = dns_message_firstname(rmessage,
- DNS_SECTION_AUTHORITY);
- while (result == ISC_R_SUCCESS) {
- /*
- * Check to see if the response has multiple
- * SOA RRs. Update the result code if so.
- */
- name = NULL;
- dns_message_currentname(rmessage,
- DNS_SECTION_AUTHORITY,
- &name);
- for (rdataset = ISC_LIST_HEAD(name->list);
- rdataset != NULL;
- rdataset = ISC_LIST_NEXT(rdataset,
- link)) {
- if (rdataset->type ==
- dns_rdatatype_soa &&
- dns_rdataset_count(rdataset) > 1) {
- *resultp = multiplesoa;
- goto found;
- }
- }
- result = dns_message_nextname(rmessage,
- DNS_SECTION_AUTHORITY);
- }
- }
- } else if (rev->result == ISC_R_TIMEDOUT)
- *resultp = timedout;
- else {
- fprintf(stderr, "unexpected result: %d (domain=%s, server=",
- rev->result, trans->domain);
- print_address(stderr, &server->address);
- fputc('\n', stderr);
- *resultp = unexpected;
- }
-
- found:
- INSIST(*resultp != none);
- if (type == dns_rdatatype_a && *resultp == exist)
- trans->qname_found = ISC_TRUE;
-
- dns_client_destroyreqtrans(&trans->reqid);
- isc_event_free(&event);
- dns_message_reset(trans->rmessage, DNS_MESSAGE_INTENTPARSE);
-
- result = probe_name(trans, type);
- if (result == ISC_R_NOMORE) {
- /* We've tried all addresses of all servers. */
- if (type == dns_rdatatype_a && trans->qname_found) {
- /*
- * If we've explored A RRs and found an existent
- * record, we can move to AAAA.
- */
- trans->current_ns = ISC_LIST_HEAD(trans->nslist);
- probe_name(trans, dns_rdatatype_aaaa);
- result = ISC_R_SUCCESS;
- } else if (type == dns_rdatatype_a) {
- /*
- * No server provided an existent A RR of this name.
- * Try next label.
- */
- dns_fixedname_invalidate(&trans->fixedname);
- trans->qname = NULL;
- result = set_nextqname(trans);
- if (result == ISC_R_SUCCESS) {
- trans->current_ns =
- ISC_LIST_HEAD(trans->nslist);
- for (pns = trans->current_ns; pns != NULL;
- pns = ISC_LIST_NEXT(pns, link)) {
- for (server = ISC_LIST_HEAD(pns->servers);
- server != NULL;
- server = ISC_LIST_NEXT(server,
- link)) {
- INSIST(server->result_aaaa ==
- none);
- server->result_a = none;
- }
- }
- result = probe_name(trans, dns_rdatatype_a);
- }
- }
- if (result != ISC_R_SUCCESS) {
- /*
- * We've explored AAAA RRs or failed to find a valid
- * query label. Wrap up the result and move to the
- * next domain.
- */
- reset_probe(trans);
- }
- } else if (result != ISC_R_SUCCESS)
- reset_probe(trans); /* XXX */
-}
-
-static isc_result_t
-probe_name(struct probe_trans *trans, dns_rdatatype_t type) {
- isc_result_t result;
- struct probe_ns *pns;
- struct server *server;
-
- REQUIRE(trans->reqid == NULL);
- REQUIRE(type == dns_rdatatype_a || type == dns_rdatatype_aaaa);
-
- for (pns = trans->current_ns; pns != NULL;
- pns = ISC_LIST_NEXT(pns, link)) {
- for (server = ISC_LIST_HEAD(pns->servers); server != NULL;
- server = ISC_LIST_NEXT(server, link)) {
- if ((type == dns_rdatatype_a &&
- server->result_a == none) ||
- (type == dns_rdatatype_aaaa &&
- server->result_aaaa == none)) {
- pns->current_server = server;
- goto found;
- }
- }
- }
-
- found:
- trans->current_ns = pns;
- if (pns == NULL)
- return (ISC_R_NOMORE);
-
- INSIST(pns->current_server != NULL);
- dns_message_reset(trans->qmessage, DNS_MESSAGE_INTENTRENDER);
- result = make_querymessage(trans->qmessage, trans->qname, type);
- if (result != ISC_R_SUCCESS)
- return (result);
- result = dns_client_startrequest(client, trans->qmessage,
- trans->rmessage,
- &pns->current_server->address,
- 0, DNS_MESSAGEPARSE_BESTEFFORT,
- NULL, 120, 0, 4,
- probe_task, request_done, trans,
- &trans->reqid);
-
- return (result);
-}
-
-/*
- * Get IP addresses of NSes
- */
-
-static void
-resolve_nsaddress(isc_task_t *task, isc_event_t *event) {
- struct probe_trans *trans = event->ev_arg;
- dns_clientresevent_t *rev = (dns_clientresevent_t *)event;
- dns_name_t *name;
- dns_rdataset_t *rdataset;
- dns_rdata_t rdata = DNS_RDATA_INIT;
- struct probe_ns *pns = trans->current_ns;
- isc_result_t result;
-
- REQUIRE(task == probe_task);
- REQUIRE(trans->inuse == ISC_TRUE);
- REQUIRE(pns != NULL);
- INSIST(outstanding_probes > 0);
-
- for (name = ISC_LIST_HEAD(rev->answerlist); name != NULL;
- name = ISC_LIST_NEXT(name, link)) {
- for (rdataset = ISC_LIST_HEAD(name->list);
- rdataset != NULL;
- rdataset = ISC_LIST_NEXT(rdataset, link)) {
- (void)print_rdataset(rdataset, name);
-
- if (rdataset->type != dns_rdatatype_a)
- continue;
-
- for (result = dns_rdataset_first(rdataset);
- result == ISC_R_SUCCESS;
- result = dns_rdataset_next(rdataset)) {
- dns_rdata_in_a_t rdata_a;
- struct server *server;
-
- dns_rdataset_current(rdataset, &rdata);
- result = dns_rdata_tostruct(&rdata, &rdata_a,
- NULL);
- if (result != ISC_R_SUCCESS)
- continue;
-
- server = isc_mem_get(mctx, sizeof(*server));
- if (server == NULL) {
- fprintf(stderr, "resolve_nsaddress: "
- "mem_get failed");
- result = ISC_R_NOMEMORY;
- POST(result);
- goto cleanup;
- }
- isc_sockaddr_fromin(&server->address,
- &rdata_a.in_addr, 53);
- ISC_LINK_INIT(server, link);
- server->result_a = none;
- server->result_aaaa = none;
- ISC_LIST_APPEND(pns->servers, server, link);
- }
- }
- }
-
- cleanup:
- dns_client_freeresanswer(client, &rev->answerlist);
- dns_client_destroyrestrans(&trans->resid);
- isc_event_free(&event);
-
- next_ns:
- trans->current_ns = ISC_LIST_NEXT(pns, link);
- if (trans->current_ns == NULL) {
- trans->current_ns = ISC_LIST_HEAD(trans->nslist);
- dns_fixedname_invalidate(&trans->fixedname);
- trans->qname = NULL;
- result = set_nextqname(trans);
- if (result == ISC_R_SUCCESS)
- result = probe_name(trans, dns_rdatatype_a);
- } else {
- result = fetch_nsaddress(trans);
- if (result != ISC_R_SUCCESS)
- goto next_ns; /* XXX: this is unlikely to succeed */
- }
-
- if (result != ISC_R_SUCCESS)
- reset_probe(trans);
-}
-
-static isc_result_t
-fetch_nsaddress(struct probe_trans *trans) {
- struct probe_ns *pns;
-
- pns = trans->current_ns;
- REQUIRE(pns != NULL);
-
- return (dns_client_startresolve(client, pns->name, dns_rdataclass_in,
- dns_rdatatype_a, 0, probe_task,
- resolve_nsaddress, trans,
- &trans->resid));
-}
-
-/*
- * Get NS RRset for a given domain
- */
-
-static void
-reset_probe(struct probe_trans *trans) {
- struct probe_ns *pns;
- struct server *server;
- isc_result_t result;
-
- REQUIRE(trans->resid == NULL);
- REQUIRE(trans->reqid == NULL);
-
- update_stat(trans);
-
- dns_message_reset(trans->qmessage, DNS_MESSAGE_INTENTRENDER);
- dns_message_reset(trans->rmessage, DNS_MESSAGE_INTENTPARSE);
-
- trans->inuse = ISC_FALSE;
- if (trans->domain != NULL)
- isc_mem_free(mctx, trans->domain);
- trans->domain = NULL;
- if (trans->qname != NULL)
- dns_fixedname_invalidate(&trans->fixedname);
- trans->qname = NULL;
- trans->qlabel = qlabels;
- trans->qname_found = ISC_FALSE;
- trans->current_ns = NULL;
-
- while ((pns = ISC_LIST_HEAD(trans->nslist)) != NULL) {
- ISC_LIST_UNLINK(trans->nslist, pns, link);
- while ((server = ISC_LIST_HEAD(pns->servers)) != NULL) {
- ISC_LIST_UNLINK(pns->servers, server, link);
- isc_mem_put(mctx, server, sizeof(*server));
- }
- isc_mem_put(mctx, pns, sizeof(*pns));
- }
-
- outstanding_probes--;
-
- result = probe_domain(trans);
- if (result == ISC_R_NOMORE && outstanding_probes == 0)
- isc_app_ctxshutdown(actx);
-}
-
-static void
-resolve_ns(isc_task_t *task, isc_event_t *event) {
- struct probe_trans *trans = event->ev_arg;
- dns_clientresevent_t *rev = (dns_clientresevent_t *)event;
- dns_name_t *name;
- dns_rdataset_t *rdataset;
- isc_result_t result = ISC_R_SUCCESS;
- dns_rdata_t rdata = DNS_RDATA_INIT;
- struct probe_ns *pns;
-
- REQUIRE(task == probe_task);
- REQUIRE(trans->inuse == ISC_TRUE);
- INSIST(outstanding_probes > 0);
-
- for (name = ISC_LIST_HEAD(rev->answerlist); name != NULL;
- name = ISC_LIST_NEXT(name, link)) {
- for (rdataset = ISC_LIST_HEAD(name->list);
- rdataset != NULL;
- rdataset = ISC_LIST_NEXT(rdataset, link)) {
- (void)print_rdataset(rdataset, name);
-
- if (rdataset->type != dns_rdatatype_ns)
- continue;
-
- for (result = dns_rdataset_first(rdataset);
- result == ISC_R_SUCCESS;
- result = dns_rdataset_next(rdataset)) {
- dns_rdata_ns_t ns;
-
- dns_rdataset_current(rdataset, &rdata);
- /*
- * Extract the name from the NS record.
- */
- result = dns_rdata_tostruct(&rdata, &ns, NULL);
- if (result != ISC_R_SUCCESS)
- continue;
-
- pns = isc_mem_get(mctx, sizeof(*pns));
- if (pns == NULL) {
- fprintf(stderr,
- "resolve_ns: mem_get failed");
- result = ISC_R_NOMEMORY;
- POST(result);
- /*
- * XXX: should we continue with the
- * available servers anyway?
- */
- goto cleanup;
- }
-
- dns_fixedname_init(&pns->fixedname);
- pns->name =
- dns_fixedname_name(&pns->fixedname);
- ISC_LINK_INIT(pns, link);
- ISC_LIST_APPEND(trans->nslist, pns, link);
- ISC_LIST_INIT(pns->servers);
-
- dns_name_copy(&ns.name, pns->name, NULL);
- dns_rdata_reset(&rdata);
- dns_rdata_freestruct(&ns);
- }
- }
- }
-
- cleanup:
- dns_client_freeresanswer(client, &rev->answerlist);
- dns_client_destroyrestrans(&trans->resid);
- isc_event_free(&event);
-
- if (!ISC_LIST_EMPTY(trans->nslist)) {
- /* Go get addresses of NSes */
- trans->current_ns = ISC_LIST_HEAD(trans->nslist);
- result = fetch_nsaddress(trans);
- } else
- result = ISC_R_FAILURE;
-
- if (result == ISC_R_SUCCESS)
- return;
-
- reset_probe(trans);
-}
-
-static isc_result_t
-probe_domain(struct probe_trans *trans) {
- isc_result_t result;
- size_t domainlen;
- isc_buffer_t b;
- char buf[4096]; /* XXX ad hoc constant, but should be enough */
- char *cp;
-
- REQUIRE(trans != NULL);
- REQUIRE(trans->inuse == ISC_FALSE);
- REQUIRE(outstanding_probes < MAX_PROBES);
-
- /* Construct domain */
- cp = fgets(buf, sizeof(buf), fp);
- if (cp == NULL)
- return (ISC_R_NOMORE);
- if ((cp = strchr(buf, '\n')) != NULL) /* zap NL if any */
- *cp = '\0';
- trans->domain = isc_mem_strdup(mctx, buf);
- if (trans->domain == NULL) {
- fprintf(stderr,
- "failed to allocate memory for domain: %s", cp);
- return (ISC_R_NOMEMORY);
- }
-
- /* Start getting NS for the domain */
- domainlen = strlen(buf);
- isc_buffer_init(&b, buf, domainlen);
- isc_buffer_add(&b, domainlen);
- dns_fixedname_init(&trans->fixedname);
- trans->qname = dns_fixedname_name(&trans->fixedname);
- result = dns_name_fromtext(trans->qname, &b, dns_rootname, 0, NULL);
- if (result != ISC_R_SUCCESS)
- goto cleanup;
- result = dns_client_startresolve(client, trans->qname,
- dns_rdataclass_in, dns_rdatatype_ns,
- 0, probe_task, resolve_ns, trans,
- &trans->resid);
- if (result != ISC_R_SUCCESS)
- goto cleanup;
-
- trans->inuse = ISC_TRUE;
- outstanding_probes++;
-
- return (ISC_R_SUCCESS);
-
- cleanup:
- isc_mem_free(mctx, trans->domain);
- dns_fixedname_invalidate(&trans->fixedname);
-
- return (result);
-}
-
-ISC_PLATFORM_NORETURN_PRE static void
-usage(void) ISC_PLATFORM_NORETURN_POST;
-
-static void
-usage(void) {
- fprintf(stderr, "usage: nsprobe [-d] [-v [-v...]] [-c cache_address] "
- "[input_file]\n");
-
- exit(1);
-}
-
-int
-main(int argc, char *argv[]) {
- int i, ch, error;
- struct addrinfo hints, *res;
- isc_result_t result;
- isc_sockaddr_t sa;
- isc_sockaddrlist_t servers;
- isc_taskmgr_t *taskmgr = NULL;
- isc_socketmgr_t *socketmgr = NULL;
- isc_timermgr_t *timermgr = NULL;
-
- while ((ch = getopt(argc, argv, "c:dhv")) != -1) {
- switch (ch) {
- case 'c':
- cacheserver = optarg;
- break;
- case 'd':
- debug_mode = ISC_TRUE;
- break;
- case 'h':
- usage();
- break;
- case 'v':
- verbose_level++;
- break;
- default:
- usage();
- break;
- }
- }
-
- argc -= optind;
- argv += optind;
-
- /* Common set up */
- isc_lib_register();
- result = dns_lib_init();
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "dns_lib_init failed: %d\n", result);
- exit(1);
- }
-
- result = ctxs_init(&mctx, &actx, &taskmgr, &socketmgr,
- &timermgr);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "ctx create failed: %d\n", result);
- exit(1);
- }
-
- isc_app_ctxstart(actx);
-
- result = dns_client_createx(mctx, actx, taskmgr, socketmgr,
- timermgr, 0, &client);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "dns_client_createx failed: %d\n", result);
- exit(1);
- }
-
- /* Set local cache server */
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = AF_UNSPEC;
- hints.ai_socktype = SOCK_DGRAM;
- error = getaddrinfo(cacheserver, "53", &hints, &res);
- if (error != 0) {
- fprintf(stderr, "failed to convert server name (%s): %s\n",
- cacheserver, gai_strerror(error));
- exit(1);
- }
-
- if (res->ai_addrlen > sizeof(sa.type)) {
- fprintf(stderr,
- "assumption failure: addrlen is too long: %ld\n",
- (long)res->ai_addrlen);
- exit(1);
- }
- memcpy(&sa.type.sa, res->ai_addr, res->ai_addrlen);
- sa.length = res->ai_addrlen;
- freeaddrinfo(res);
- ISC_LINK_INIT(&sa, link);
- ISC_LIST_INIT(servers);
- ISC_LIST_APPEND(servers, &sa, link);
- result = dns_client_setservers(client, dns_rdataclass_in, NULL,
- &servers);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "failed to set server: %d\n", result);
- exit(1);
- }
-
- /* Create the main task */
- probe_task = NULL;
- result = isc_task_create(taskmgr, 0, &probe_task);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "failed to create task: %d\n", result);
- exit(1);
- }
-
- /* Open input file */
- if (argc == 0)
- fp = stdin;
- else {
- fp = fopen(argv[0], "r");
- if (fp == NULL) {
- fprintf(stderr, "failed to open input file: %s\n",
- argv[0]);
- exit(1);
- }
- }
-
- /* Set up and start probe */
- for (i = 0; i < MAX_PROBES; i++) {
- probes[i].inuse = ISC_FALSE;
- probes[i].domain = NULL;
- dns_fixedname_init(&probes[i].fixedname);
- probes[i].qname = NULL;
- probes[i].qlabel = qlabels;
- probes[i].qname_found = ISC_FALSE;
- probes[i].resid = NULL;
- ISC_LIST_INIT(probes[i].nslist);
- probes[i].reqid = NULL;
-
- probes[i].qmessage = NULL;
- result = dns_message_create(mctx, DNS_MESSAGE_INTENTRENDER,
- &probes[i].qmessage);
- if (result == ISC_R_SUCCESS) {
- result = dns_message_create(mctx,
- DNS_MESSAGE_INTENTPARSE,
- &probes[i].rmessage);
- }
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "initialization failure\n");
- exit(1);
- }
- }
- for (i = 0; i < MAX_PROBES; i++) {
- result = probe_domain(&probes[i]);
- if (result == ISC_R_NOMORE)
- break;
- else if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "failed to issue an initial probe\n");
- exit(1);
- }
- }
-
- /* Start event loop */
- isc_app_ctxrun(actx);
-
- /* Dump results */
- printf("Per domain results (out of %lu domains):\n",
- number_of_domains);
- printf(" valid: %lu\n"
- " ignore: %lu\n"
- " nxdomain: %lu\n"
- " othererr: %lu\n"
- " multiplesoa: %lu\n"
- " multiplecname: %lu\n"
- " brokenanswer: %lu\n"
- " lame: %lu\n"
- " unknown: %lu\n"
- " multiple errors: %lu\n",
- domain_stat.valid, domain_stat.ignore, domain_stat.nxdomain,
- domain_stat.othererr, domain_stat.multiplesoa,
- domain_stat.multiplecname, domain_stat.brokenanswer,
- domain_stat.lame, domain_stat.unknown, multiple_error_domains);
- printf("Per server results (out of %lu servers):\n",
- number_of_servers);
- printf(" valid: %lu\n"
- " ignore: %lu\n"
- " nxdomain: %lu\n"
- " othererr: %lu\n"
- " multiplesoa: %lu\n"
- " multiplecname: %lu\n"
- " brokenanswer: %lu\n"
- " lame: %lu\n"
- " unknown: %lu\n",
- server_stat.valid, server_stat.ignore, server_stat.nxdomain,
- server_stat.othererr, server_stat.multiplesoa,
- server_stat.multiplecname, server_stat.brokenanswer,
- server_stat.lame, server_stat.unknown);
-
- /* Cleanup */
- for (i = 0; i < MAX_PROBES; i++) {
- dns_message_destroy(&probes[i].qmessage);
- dns_message_destroy(&probes[i].rmessage);
- }
- isc_task_detach(&probe_task);
- dns_client_destroy(&client);
- dns_lib_shutdown();
- isc_app_ctxfinish(actx);
- ctxs_destroy(&mctx, &actx, &taskmgr, &socketmgr, &timermgr);
-
- return (0);
-}
diff --git a/contrib/bind9/lib/export/samples/sample-async.c b/contrib/bind9/lib/export/samples/sample-async.c
deleted file mode 100644
index a70dd47..0000000
--- a/contrib/bind9/lib/export/samples/sample-async.c
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
- * Copyright (C) 2009, 2013 Internet Systems Consortium, Inc. ("ISC")
- *
- * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
- * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS. IN NO EVENT SHALL ISC 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: sample-async.c,v 1.5 2009/09/29 15:06:07 fdupont Exp $ */
-
-#include <config.h>
-
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-
-#include <arpa/inet.h>
-
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <isc/app.h>
-#include <isc/buffer.h>
-#include <isc/lib.h>
-#include <isc/mem.h>
-#include <isc/socket.h>
-#include <isc/sockaddr.h>
-#include <isc/task.h>
-#include <isc/timer.h>
-#include <isc/util.h>
-
-#include <dns/client.h>
-#include <dns/fixedname.h>
-#include <dns/lib.h>
-#include <dns/name.h>
-#include <dns/rdataset.h>
-#include <dns/rdatatype.h>
-#include <dns/result.h>
-
-#define MAX_SERVERS 10
-#define MAX_QUERIES 100
-
-static dns_client_t *client = NULL;
-static isc_task_t *query_task = NULL;
-static isc_appctx_t *query_actx = NULL;
-static unsigned int outstanding_queries = 0;
-static const char *def_server = "127.0.0.1";
-static FILE *fp;
-
-struct query_trans {
- int id;
- isc_boolean_t inuse;
- dns_rdatatype_t type;
- dns_fixedname_t fixedname;
- dns_name_t *qname;
- dns_namelist_t answerlist;
- dns_clientrestrans_t *xid;
-};
-
-static struct query_trans query_array[MAX_QUERIES];
-
-static isc_result_t dispatch_query(struct query_trans *trans);
-
-static void
-ctxs_destroy(isc_mem_t **mctxp, isc_appctx_t **actxp,
- isc_taskmgr_t **taskmgrp, isc_socketmgr_t **socketmgrp,
- isc_timermgr_t **timermgrp)
-{
- if (*taskmgrp != NULL)
- isc_taskmgr_destroy(taskmgrp);
-
- if (*timermgrp != NULL)
- isc_timermgr_destroy(timermgrp);
-
- if (*socketmgrp != NULL)
- isc_socketmgr_destroy(socketmgrp);
-
- if (*actxp != NULL)
- isc_appctx_destroy(actxp);
-
- if (*mctxp != NULL)
- isc_mem_destroy(mctxp);
-}
-
-static isc_result_t
-ctxs_init(isc_mem_t **mctxp, isc_appctx_t **actxp,
- isc_taskmgr_t **taskmgrp, isc_socketmgr_t **socketmgrp,
- isc_timermgr_t **timermgrp)
-{
- isc_result_t result;
-
- result = isc_mem_create(0, 0, mctxp);
- if (result != ISC_R_SUCCESS)
- goto fail;
-
- result = isc_appctx_create(*mctxp, actxp);
- if (result != ISC_R_SUCCESS)
- goto fail;
-
- result = isc_taskmgr_createinctx(*mctxp, *actxp, 1, 0, taskmgrp);
- if (result != ISC_R_SUCCESS)
- goto fail;
-
- result = isc_socketmgr_createinctx(*mctxp, *actxp, socketmgrp);
- if (result != ISC_R_SUCCESS)
- goto fail;
-
- result = isc_timermgr_createinctx(*mctxp, *actxp, timermgrp);
- if (result != ISC_R_SUCCESS)
- goto fail;
-
- return (ISC_R_SUCCESS);
-
- fail:
- ctxs_destroy(mctxp, actxp, taskmgrp, socketmgrp, timermgrp);
-
- return (result);
-}
-
-static isc_result_t
-printdata(dns_rdataset_t *rdataset, dns_name_t *owner) {
- isc_buffer_t target;
- isc_result_t result;
- isc_region_t r;
- char t[4096];
-
- isc_buffer_init(&target, t, sizeof(t));
-
- if (!dns_rdataset_isassociated(rdataset))
- return (ISC_R_SUCCESS);
- result = dns_rdataset_totext(rdataset, owner, ISC_FALSE, ISC_FALSE,
- &target);
- if (result != ISC_R_SUCCESS)
- return (result);
- isc_buffer_usedregion(&target, &r);
- printf(" %.*s", (int)r.length, (char *)r.base);
-
- return (ISC_R_SUCCESS);
-}
-
-static void
-process_answer(isc_task_t *task, isc_event_t *event) {
- struct query_trans *trans = event->ev_arg;
- dns_clientresevent_t *rev = (dns_clientresevent_t *)event;
- dns_name_t *name;
- dns_rdataset_t *rdataset;
- isc_result_t result;
-
- REQUIRE(task == query_task);
- REQUIRE(trans->inuse == ISC_TRUE);
- REQUIRE(outstanding_queries > 0);
-
- printf("answer[%2d]\n", trans->id);
-
- if (rev->result != ISC_R_SUCCESS)
- printf(" failed: %d(%s)\n", rev->result,
- dns_result_totext(rev->result));
-
- for (name = ISC_LIST_HEAD(rev->answerlist); name != NULL;
- name = ISC_LIST_NEXT(name, link)) {
- for (rdataset = ISC_LIST_HEAD(name->list);
- rdataset != NULL;
- rdataset = ISC_LIST_NEXT(rdataset, link)) {
- (void)printdata(rdataset, name);
- }
- }
-
- dns_client_freeresanswer(client, &rev->answerlist);
- dns_client_destroyrestrans(&trans->xid);
-
- isc_event_free(&event);
-
- trans->inuse = ISC_FALSE;
- dns_fixedname_invalidate(&trans->fixedname);
- trans->qname = NULL;
- outstanding_queries--;
-
- result = dispatch_query(trans);
-#if 0 /* for cancel test */
- if (result == ISC_R_SUCCESS) {
- static int count = 0;
-
- if ((++count) % 10 == 0)
- dns_client_cancelresolve(trans->xid);
- }
-#endif
- if (result == ISC_R_NOMORE && outstanding_queries == 0)
- isc_app_ctxshutdown(query_actx);
-}
-
-static isc_result_t
-dispatch_query(struct query_trans *trans) {
- isc_result_t result;
- size_t namelen;
- isc_buffer_t b;
- char buf[4096]; /* XXX ad hoc constant, but should be enough */
- char *cp;
-
- REQUIRE(trans != NULL);
- REQUIRE(trans->inuse == ISC_FALSE);
- REQUIRE(ISC_LIST_EMPTY(trans->answerlist));
- REQUIRE(outstanding_queries < MAX_QUERIES);
-
- /* Construct qname */
- cp = fgets(buf, sizeof(buf), fp);
- if (cp == NULL)
- return (ISC_R_NOMORE);
- /* zap NL if any */
- if ((cp = strchr(buf, '\n')) != NULL)
- *cp = '\0';
- namelen = strlen(buf);
- isc_buffer_init(&b, buf, namelen);
- isc_buffer_add(&b, namelen);
- dns_fixedname_init(&trans->fixedname);
- trans->qname = dns_fixedname_name(&trans->fixedname);
- result = dns_name_fromtext(trans->qname, &b, dns_rootname, 0, NULL);
- if (result != ISC_R_SUCCESS)
- goto cleanup;
-
- /* Start resolution */
- result = dns_client_startresolve(client, trans->qname,
- dns_rdataclass_in, trans->type, 0,
- query_task, process_answer, trans,
- &trans->xid);
- if (result != ISC_R_SUCCESS)
- goto cleanup;
-
- trans->inuse = ISC_TRUE;
- outstanding_queries++;
-
- return (ISC_R_SUCCESS);
-
- cleanup:
- dns_fixedname_invalidate(&trans->fixedname);
-
- return (result);
-}
-
-ISC_PLATFORM_NORETURN_PRE static void
-usage(void) ISC_PLATFORM_NORETURN_POST;
-
-static void
-usage(void) {
- fprintf(stderr, "usage: sample-async [-s server_address] [-t RR type] "
- "input_file\n");
-
- exit(1);
-}
-
-int
-main(int argc, char *argv[]) {
- int ch;
- isc_textregion_t tr;
- isc_mem_t *mctx = NULL;
- isc_taskmgr_t *taskmgr = NULL;
- isc_socketmgr_t *socketmgr = NULL;
- isc_timermgr_t *timermgr = NULL;
- int nservers = 0;
- const char *serveraddr[MAX_SERVERS];
- isc_sockaddr_t sa[MAX_SERVERS];
- isc_sockaddrlist_t servers;
- dns_rdatatype_t type = dns_rdatatype_a;
- struct in_addr inaddr;
- isc_result_t result;
- int i;
-
- while ((ch = getopt(argc, argv, "s:t:")) != -1) {
- switch (ch) {
- case 't':
- tr.base = optarg;
- tr.length = strlen(optarg);
- result = dns_rdatatype_fromtext(&type, &tr);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr,
- "invalid RRtype: %s\n", optarg);
- exit(1);
- }
- break;
- case 's':
- if (nservers == MAX_SERVERS) {
- fprintf(stderr,
- "too many servers (up to %d)\n",
- MAX_SERVERS);
- exit(1);
- }
- serveraddr[nservers++] = (const char *)optarg;
- break;
- default:
- usage();
- }
- }
-
- argc -= optind;
- argv += optind;
- if (argc < 1)
- usage();
-
- if (nservers == 0) {
- nservers = 1;
- serveraddr[0] = def_server;
- }
-
- for (i = 0; i < MAX_QUERIES; i++) {
- query_array[i].id = i;
- query_array[i].inuse = ISC_FALSE;
- query_array[i].type = type;
- dns_fixedname_init(&query_array[i].fixedname);
- query_array[i].qname = NULL;
- ISC_LIST_INIT(query_array[i].answerlist);
- query_array[i].xid = NULL;
- }
-
- isc_lib_register();
- result = dns_lib_init();
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "dns_lib_init failed: %d\n", result);
- exit(1);
- }
-
- result = ctxs_init(&mctx, &query_actx, &taskmgr, &socketmgr,
- &timermgr);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "ctx create failed: %d\n", result);
- exit(1);
- }
-
- isc_app_ctxstart(query_actx);
-
- result = dns_client_createx(mctx, query_actx, taskmgr, socketmgr,
- timermgr, 0, &client);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "dns_client_createx failed: %d\n", result);
- exit(1);
- }
-
- /* Set nameservers */
- ISC_LIST_INIT(servers);
- for (i = 0; i < nservers; i++) {
- if (inet_pton(AF_INET, serveraddr[i], &inaddr) != 1) {
- fprintf(stderr, "failed to parse IPv4 address %s\n",
- serveraddr[i]);
- exit(1);
- }
- isc_sockaddr_fromin(&sa[i], &inaddr, 53);
- ISC_LIST_APPEND(servers, &sa[i], link);
- }
- result = dns_client_setservers(client, dns_rdataclass_in, NULL,
- &servers);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "set server failed: %d\n", result);
- exit(1);
- }
-
- /* Create the main task */
- query_task = NULL;
- result = isc_task_create(taskmgr, 0, &query_task);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "failed to create task: %d\n", result);
- exit(1);
- }
-
- /* Open input file */
- fp = fopen(argv[0], "r");
- if (fp == NULL) {
- fprintf(stderr, "failed to open input file: %s\n", argv[1]);
- exit(1);
- }
-
- /* Dispatch initial queries */
- for (i = 0; i < MAX_QUERIES; i++) {
- result = dispatch_query(&query_array[i]);
- if (result == ISC_R_NOMORE)
- break;
- }
-
- /* Start event loop */
- isc_app_ctxrun(query_actx);
-
- /* Sanity check */
- for (i = 0; i < MAX_QUERIES; i++)
- INSIST(query_array[i].inuse == ISC_FALSE);
-
- /* Cleanup */
- isc_task_detach(&query_task);
- dns_client_destroy(&client);
- dns_lib_shutdown();
- isc_app_ctxfinish(query_actx);
- ctxs_destroy(&mctx, &query_actx, &taskmgr, &socketmgr, &timermgr);
-
- return (0);
-}
diff --git a/contrib/bind9/lib/export/samples/sample-gai.c b/contrib/bind9/lib/export/samples/sample-gai.c
deleted file mode 100644
index 243d07a..0000000
--- a/contrib/bind9/lib/export/samples/sample-gai.c
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2009, 2012, 2013 Internet Systems Consortium, Inc. ("ISC")
- *
- * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
- * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS. IN NO EVENT SHALL ISC 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: sample-gai.c,v 1.4 2009/09/02 23:48:02 tbox Exp $ */
-
-#include <config.h>
-
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <irs/netdb.h>
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-
-static void
-do_gai(int family, char *hostname) {
- struct addrinfo hints, *res, *res0;
- int error;
- char namebuf[1024], addrbuf[1024], servbuf[1024];
-
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = family;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_flags = AI_CANONNAME;
- error = getaddrinfo(hostname, "http", &hints, &res0);
- if (error) {
- fprintf(stderr, "getaddrinfo failed for %s,family=%d: %s\n",
- hostname, family, gai_strerror(error));
- return;
- }
-
- for (res = res0; res; res = res->ai_next) {
- error = getnameinfo(res->ai_addr, res->ai_addrlen,
- addrbuf, sizeof(addrbuf),
- NULL, 0, NI_NUMERICHOST);
- if (error == 0)
- error = getnameinfo(res->ai_addr, res->ai_addrlen,
- namebuf, sizeof(namebuf),
- servbuf, sizeof(servbuf), 0);
- if (error != 0) {
- fprintf(stderr, "getnameinfo failed: %s\n",
- gai_strerror(error));
- } else {
- printf("%s(%s/%s)=%s:%s\n", hostname,
- res->ai_canonname, addrbuf, namebuf, servbuf);
- }
- }
-
- freeaddrinfo(res0);
-}
-
-int
-main(int argc, char *argv[]) {
- if (argc < 2)
- exit(1);
-
- do_gai(AF_INET, argv[1]);
- do_gai(AF_INET6, argv[1]);
- do_gai(AF_UNSPEC, argv[1]);
-
- return (0);
-}
diff --git a/contrib/bind9/lib/export/samples/sample-request.c b/contrib/bind9/lib/export/samples/sample-request.c
deleted file mode 100644
index 07baf39..0000000
--- a/contrib/bind9/lib/export/samples/sample-request.c
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright (C) 2009, 2012, 2013 Internet Systems Consortium, Inc. ("ISC")
- *
- * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
- * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS. IN NO EVENT SHALL ISC 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: sample-request.c,v 1.5 2009/09/29 15:06:07 fdupont Exp $ */
-
-#include <config.h>
-
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-
-#include <arpa/inet.h>
-
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <netdb.h>
-
-#include <isc/base64.h>
-#include <isc/buffer.h>
-#include <isc/lib.h>
-#include <isc/mem.h>
-#include <isc/sockaddr.h>
-#include <isc/util.h>
-
-#include <dns/client.h>
-#include <dns/fixedname.h>
-#include <dns/keyvalues.h>
-#include <dns/lib.h>
-#include <dns/masterdump.h>
-#include <dns/message.h>
-#include <dns/name.h>
-#include <dns/rdata.h>
-#include <dns/rdataset.h>
-#include <dns/rdatastruct.h>
-#include <dns/rdatatype.h>
-#include <dns/result.h>
-#include <dns/secalg.h>
-
-#include <dst/dst.h>
-
-static isc_mem_t *mctx;
-static dns_fixedname_t fixedqname;
-
-ISC_PLATFORM_NORETURN_PRE static void
-usage(void) ISC_PLATFORM_NORETURN_POST;
-
-static void
-usage(void) {
- fprintf(stderr, "sample-request [-t RRtype] server_address hostname\n");
-
- exit(1);
-}
-
-static isc_result_t
-make_querymessage(dns_message_t *message, const char *namestr,
- dns_rdatatype_t rdtype)
-{
- dns_name_t *qname = NULL, *qname0;
- dns_rdataset_t *qrdataset = NULL;
- isc_result_t result;
- isc_buffer_t b;
- size_t namelen;
-
- REQUIRE(message != NULL);
- REQUIRE(namestr != NULL);
-
- /* Construct qname */
- namelen = strlen(namestr);
- isc_buffer_constinit(&b, namestr, namelen);
- isc_buffer_add(&b, namelen);
- dns_fixedname_init(&fixedqname);
- qname0 = dns_fixedname_name(&fixedqname);
- result = dns_name_fromtext(qname0, &b, dns_rootname, 0, NULL);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "failed to convert qname: %d\n", result);
- return (result);
- }
-
- /* Construct query message */
- message->opcode = dns_opcode_query;
- message->rdclass = dns_rdataclass_in;
-
- result = dns_message_gettempname(message, &qname);
- if (result != ISC_R_SUCCESS)
- goto cleanup;
-
- result = dns_message_gettemprdataset(message, &qrdataset);
- if (result != ISC_R_SUCCESS)
- goto cleanup;
-
- dns_name_init(qname, NULL);
- dns_name_clone(qname0, qname);
- dns_rdataset_init(qrdataset);
- dns_rdataset_makequestion(qrdataset, message->rdclass, rdtype);
- ISC_LIST_APPEND(qname->list, qrdataset, link);
- dns_message_addname(message, qname, DNS_SECTION_QUESTION);
-
- return (ISC_R_SUCCESS);
-
- cleanup:
- if (qname != NULL)
- dns_message_puttempname(message, &qname);
- if (qrdataset != NULL)
- dns_message_puttemprdataset(message, &qrdataset);
- dns_message_destroy(&message);
- return (result);
-}
-
-static void
-print_section(dns_message_t *message, int section, isc_buffer_t *buf) {
- isc_result_t result;
- isc_region_t r;
-
- result = dns_message_sectiontotext(message, section,
- &dns_master_style_full, 0, buf);
- if (result != ISC_R_SUCCESS)
- goto fail;
-
- isc_buffer_usedregion(buf, &r);
- printf("%.*s", (int)r.length, (char *)r.base);
-
- return;
-
- fail:
- fprintf(stderr, "failed to convert a section\n");
-}
-
-int
-main(int argc, char *argv[]) {
- int ch, i, gai_error;
- struct addrinfo hints, *res;
- isc_textregion_t tr;
- dns_client_t *client = NULL;
- isc_result_t result;
- isc_sockaddr_t sa;
- dns_message_t *qmessage, *rmessage;
- dns_rdatatype_t type = dns_rdatatype_a;
- isc_buffer_t *outputbuf;
-
- while ((ch = getopt(argc, argv, "t:")) != -1) {
- switch (ch) {
- case 't':
- tr.base = optarg;
- tr.length = strlen(optarg);
- result = dns_rdatatype_fromtext(&type, &tr);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr,
- "invalid RRtype: %s\n", optarg);
- exit(1);
- }
- break;
- default:
- usage();
- }
- }
-
- argc -= optind;
- argv += optind;
- if (argc < 2)
- usage();
-
- isc_lib_register();
- result = dns_lib_init();
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "dns_lib_init failed: %d\n", result);
- exit(1);
- }
-
- result = dns_client_create(&client, 0);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "dns_client_create failed: %d\n", result);
- exit(1);
- }
-
- /* Prepare message structures */
- mctx = NULL;
- qmessage = NULL;
- rmessage = NULL;
-
- result = isc_mem_create(0, 0, &mctx);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "failed to create a memory context\n");
- exit(1);
- }
- result = dns_message_create(mctx, DNS_MESSAGE_INTENTRENDER, &qmessage);
- if (result == ISC_R_SUCCESS) {
- result = dns_message_create(mctx, DNS_MESSAGE_INTENTPARSE,
- &rmessage);
- }
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "failed to create messages\n");
- exit(1);
- }
-
- /* Initialize the nameserver address */
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = AF_UNSPEC;
- hints.ai_socktype = SOCK_DGRAM;
- hints.ai_protocol = IPPROTO_UDP;
- hints.ai_flags = AI_NUMERICHOST;
- gai_error = getaddrinfo(argv[0], "53", &hints, &res);
- if (gai_error != 0) {
- fprintf(stderr, "getaddrinfo failed: %s\n",
- gai_strerror(gai_error));
- exit(1);
- }
- INSIST(res->ai_addrlen <= sizeof(sa.type));
- memcpy(&sa.type, res->ai_addr, res->ai_addrlen);
- freeaddrinfo(res);
- sa.length = res->ai_addrlen;
- ISC_LINK_INIT(&sa, link);
-
- /* Construct qname */
- result = make_querymessage(qmessage, argv[1], type);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "failed to create a query\n");
- exit(1);
- }
-
- /* Send request and wait for a response */
- result = dns_client_request(client, qmessage, rmessage, &sa, 0, 0,
- NULL, 60, 0, 3);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "failed to get a response: %s\n",
- dns_result_totext(result));
- }
-
- /* Dump the response */
- outputbuf = NULL;
- result = isc_buffer_allocate(mctx, &outputbuf, 65535);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "failed to allocate a result buffer\n");
- exit(1);
- }
- for (i = 0; i < DNS_SECTION_MAX; i++) {
- print_section(rmessage, i, outputbuf);
- isc_buffer_clear(outputbuf);
- }
- isc_buffer_free(&outputbuf);
-
- /* Cleanup */
- dns_message_destroy(&qmessage);
- dns_message_destroy(&rmessage);
- isc_mem_destroy(&mctx);
- dns_client_destroy(&client);
- dns_lib_shutdown();
-
- return (0);
-}
diff --git a/contrib/bind9/lib/export/samples/sample-update.c b/contrib/bind9/lib/export/samples/sample-update.c
deleted file mode 100644
index 2c35baa..0000000
--- a/contrib/bind9/lib/export/samples/sample-update.c
+++ /dev/null
@@ -1,755 +0,0 @@
-/*
- * Copyright (C) 2009, 2010, 2012, 2013 Internet Systems Consortium, Inc. ("ISC")
- *
- * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
- * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS. IN NO EVENT SHALL ISC 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: sample-update.c,v 1.10 2010/12/09 00:54:34 marka Exp $ */
-
-#include <config.h>
-
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-
-#include <arpa/inet.h>
-
-#include <unistd.h>
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <netdb.h>
-
-#include <isc/buffer.h>
-#include <isc/lex.h>
-#include <isc/lib.h>
-#include <isc/mem.h>
-#include <isc/parseint.h>
-#include <isc/sockaddr.h>
-#include <isc/util.h>
-
-#include <dns/callbacks.h>
-#include <dns/client.h>
-#include <dns/fixedname.h>
-#include <dns/lib.h>
-#include <dns/name.h>
-#include <dns/rdata.h>
-#include <dns/rdataclass.h>
-#include <dns/rdatalist.h>
-#include <dns/rdataset.h>
-#include <dns/rdatastruct.h>
-#include <dns/rdatatype.h>
-#include <dns/result.h>
-#include <dns/secalg.h>
-#include <dns/tsec.h>
-
-#include <dst/dst.h>
-
-static dns_tsec_t *tsec = NULL;
-static const dns_rdataclass_t default_rdataclass = dns_rdataclass_in;
-static isc_bufferlist_t usedbuffers;
-static ISC_LIST(dns_rdatalist_t) usedrdatalists;
-
-static void setup_tsec(char *keyfile, isc_mem_t *mctx);
-static void update_addordelete(isc_mem_t *mctx, char *cmdline,
- isc_boolean_t isdelete, dns_name_t *name);
-static void evaluate_prereq(isc_mem_t *mctx, char *cmdline, dns_name_t *name);
-
-ISC_PLATFORM_NORETURN_PRE static void
-usage(void) ISC_PLATFORM_NORETURN_POST;
-
-static void
-usage(void) {
- fprintf(stderr, "sample-update "
- "[-a auth_server] "
- "[-k keyfile] "
- "[-p prerequisite] "
- "[-r recursive_server] "
- "[-z zonename] "
- "(add|delete) \"name TTL RRtype RDATA\"\n");
- exit(1);
-}
-
-int
-main(int argc, char *argv[]) {
- int ch;
- struct addrinfo hints, *res;
- int gai_error;
- dns_client_t *client = NULL;
- char *zonenamestr = NULL;
- char *keyfilename = NULL;
- char *prereqstr = NULL;
- isc_sockaddrlist_t auth_servers;
- char *auth_server = NULL;
- char *recursive_server = NULL;
- isc_sockaddr_t sa_auth, sa_recursive;
- isc_sockaddrlist_t rec_servers;
- isc_result_t result;
- isc_boolean_t isdelete;
- isc_buffer_t b, *buf;
- dns_fixedname_t zname0, pname0, uname0;
- size_t namelen;
- dns_name_t *zname = NULL, *uname, *pname;
- dns_rdataset_t *rdataset;
- dns_rdatalist_t *rdatalist;
- dns_rdata_t *rdata;
- dns_namelist_t updatelist, prereqlist, *prereqlistp = NULL;
- isc_mem_t *umctx = NULL;
-
- while ((ch = getopt(argc, argv, "a:k:p:r:z:")) != -1) {
- switch (ch) {
- case 'k':
- keyfilename = optarg;
- break;
- case 'a':
- auth_server = optarg;
- break;
- case 'p':
- prereqstr = optarg;
- break;
- case 'r':
- recursive_server = optarg;
- break;
- case 'z':
- zonenamestr = optarg;
- break;
- default:
- usage();
- }
- }
-
- argc -= optind;
- argv += optind;
- if (argc < 2)
- usage();
-
- /* command line argument validation */
- if (strcmp(argv[0], "delete") == 0)
- isdelete = ISC_TRUE;
- else if (strcmp(argv[0], "add") == 0)
- isdelete = ISC_FALSE;
- else {
- fprintf(stderr, "invalid update command: %s\n", argv[0]);
- exit(1);
- }
-
- if (auth_server == NULL && recursive_server == NULL) {
- fprintf(stderr, "authoritative or recursive server "
- "must be specified\n");
- usage();
- }
-
- /* Initialization */
- ISC_LIST_INIT(usedbuffers);
- ISC_LIST_INIT(usedrdatalists);
- ISC_LIST_INIT(prereqlist);
- ISC_LIST_INIT(auth_servers);
- isc_lib_register();
- result = dns_lib_init();
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "dns_lib_init failed: %d\n", result);
- exit(1);
- }
- result = isc_mem_create(0, 0, &umctx);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "failed to crate mctx\n");
- exit(1);
- }
-
- result = dns_client_create(&client, 0);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "dns_client_create failed: %d\n", result);
- exit(1);
- }
-
- /* Set the authoritative server */
- if (auth_server != NULL) {
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = AF_UNSPEC;
- hints.ai_socktype = SOCK_DGRAM;
- hints.ai_protocol = IPPROTO_UDP;
- hints.ai_flags = AI_NUMERICHOST;
- gai_error = getaddrinfo(auth_server, "53", &hints, &res);
- if (gai_error != 0) {
- fprintf(stderr, "getaddrinfo failed: %s\n",
- gai_strerror(gai_error));
- exit(1);
- }
- INSIST(res->ai_addrlen <= sizeof(sa_auth.type));
- memcpy(&sa_auth.type, res->ai_addr, res->ai_addrlen);
- freeaddrinfo(res);
- sa_auth.length = res->ai_addrlen;
- ISC_LINK_INIT(&sa_auth, link);
-
- ISC_LIST_APPEND(auth_servers, &sa_auth, link);
- }
-
- /* Set the recursive server */
- if (recursive_server != NULL) {
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = AF_UNSPEC;
- hints.ai_socktype = SOCK_DGRAM;
- hints.ai_protocol = IPPROTO_UDP;
- hints.ai_flags = AI_NUMERICHOST;
- gai_error = getaddrinfo(recursive_server, "53", &hints, &res);
- if (gai_error != 0) {
- fprintf(stderr, "getaddrinfo failed: %s\n",
- gai_strerror(gai_error));
- exit(1);
- }
- INSIST(res->ai_addrlen <= sizeof(sa_recursive.type));
- memcpy(&sa_recursive.type, res->ai_addr, res->ai_addrlen);
- freeaddrinfo(res);
- sa_recursive.length = res->ai_addrlen;
- ISC_LINK_INIT(&sa_recursive, link);
- ISC_LIST_INIT(rec_servers);
- ISC_LIST_APPEND(rec_servers, &sa_recursive, link);
- result = dns_client_setservers(client, dns_rdataclass_in,
- NULL, &rec_servers);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "set server failed: %d\n", result);
- exit(1);
- }
- }
-
- /* Construct zone name */
- zname = NULL;
- if (zonenamestr != NULL) {
- namelen = strlen(zonenamestr);
- isc_buffer_init(&b, zonenamestr, namelen);
- isc_buffer_add(&b, namelen);
- dns_fixedname_init(&zname0);
- zname = dns_fixedname_name(&zname0);
- result = dns_name_fromtext(zname, &b, dns_rootname, 0, NULL);
- if (result != ISC_R_SUCCESS)
- fprintf(stderr, "failed to convert zone name: %d\n",
- result);
- }
-
- /* Construct prerequisite name (if given) */
- if (prereqstr != NULL) {
- dns_fixedname_init(&pname0);
- pname = dns_fixedname_name(&pname0);
- evaluate_prereq(umctx, prereqstr, pname);
- ISC_LIST_APPEND(prereqlist, pname, link);
- prereqlistp = &prereqlist;
- }
-
- /* Construct update name */
- ISC_LIST_INIT(updatelist);
- dns_fixedname_init(&uname0);
- uname = dns_fixedname_name(&uname0);
- update_addordelete(umctx, argv[1], isdelete, uname);
- ISC_LIST_APPEND(updatelist, uname, link);
-
- /* Set up TSIG/SIG(0) key (if given) */
- if (keyfilename != NULL)
- setup_tsec(keyfilename, umctx);
-
- /* Perform update */
- result = dns_client_update(client,
- default_rdataclass, /* XXX: fixed */
- zname, prereqlistp, &updatelist,
- (auth_server == NULL) ? NULL :
- &auth_servers, tsec, 0);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr,
- "update failed: %s\n", dns_result_totext(result));
- } else
- fprintf(stderr, "update succeeded\n");
-
- /* Cleanup */
- while ((pname = ISC_LIST_HEAD(prereqlist)) != NULL) {
- while ((rdataset = ISC_LIST_HEAD(pname->list)) != NULL) {
- ISC_LIST_UNLINK(pname->list, rdataset, link);
- dns_rdataset_disassociate(rdataset);
- isc_mem_put(umctx, rdataset, sizeof(*rdataset));
- }
- ISC_LIST_UNLINK(prereqlist, pname, link);
- }
- while ((uname = ISC_LIST_HEAD(updatelist)) != NULL) {
- while ((rdataset = ISC_LIST_HEAD(uname->list)) != NULL) {
- ISC_LIST_UNLINK(uname->list, rdataset, link);
- dns_rdataset_disassociate(rdataset);
- isc_mem_put(umctx, rdataset, sizeof(*rdataset));
- }
- ISC_LIST_UNLINK(updatelist, uname, link);
- }
- while ((rdatalist = ISC_LIST_HEAD(usedrdatalists)) != NULL) {
- while ((rdata = ISC_LIST_HEAD(rdatalist->rdata)) != NULL) {
- ISC_LIST_UNLINK(rdatalist->rdata, rdata, link);
- isc_mem_put(umctx, rdata, sizeof(*rdata));
- }
- ISC_LIST_UNLINK(usedrdatalists, rdatalist, link);
- isc_mem_put(umctx, rdatalist, sizeof(*rdatalist));
- }
- while ((buf = ISC_LIST_HEAD(usedbuffers)) != NULL) {
- ISC_LIST_UNLINK(usedbuffers, buf, link);
- isc_buffer_free(&buf);
- }
- if (tsec != NULL)
- dns_tsec_destroy(&tsec);
- isc_mem_destroy(&umctx);
- dns_client_destroy(&client);
- dns_lib_shutdown();
-
- return (0);
-}
-
-/*
- * Subroutines borrowed from nsupdate.c
- */
-#define MAXWIRE (64 * 1024)
-#define TTL_MAX 2147483647U /* Maximum signed 32 bit integer. */
-
-static char *
-nsu_strsep(char **stringp, const char *delim) {
- char *string = *stringp;
- char *s;
- const char *d;
- char sc, dc;
-
- if (string == NULL)
- return (NULL);
-
- for (; *string != '\0'; string++) {
- sc = *string;
- for (d = delim; (dc = *d) != '\0'; d++) {
- if (sc == dc)
- break;
- }
- if (dc == 0)
- break;
- }
-
- for (s = string; *s != '\0'; s++) {
- sc = *s;
- for (d = delim; (dc = *d) != '\0'; d++) {
- if (sc == dc) {
- *s++ = '\0';
- *stringp = s;
- return (string);
- }
- }
- }
- *stringp = NULL;
- return (string);
-}
-
-static void
-fatal(const char *format, ...) {
- va_list args;
-
- va_start(args, format);
- vfprintf(stderr, format, args);
- va_end(args);
- fprintf(stderr, "\n");
- exit(1);
-}
-
-static inline void
-check_result(isc_result_t result, const char *msg) {
- if (result != ISC_R_SUCCESS)
- fatal("%s: %s", msg, isc_result_totext(result));
-}
-
-static void
-parse_name(char **cmdlinep, dns_name_t *name) {
- isc_result_t result;
- char *word;
- isc_buffer_t source;
-
- word = nsu_strsep(cmdlinep, " \t\r\n");
- if (word == NULL || *word == 0) {
- fprintf(stderr, "could not read owner name\n");
- exit(1);
- }
-
- isc_buffer_init(&source, word, strlen(word));
- isc_buffer_add(&source, strlen(word));
- result = dns_name_fromtext(name, &source, dns_rootname, 0, NULL);
- check_result(result, "dns_name_fromtext");
- isc_buffer_invalidate(&source);
-}
-
-static void
-parse_rdata(isc_mem_t *mctx, char **cmdlinep, dns_rdataclass_t rdataclass,
- dns_rdatatype_t rdatatype, dns_rdata_t *rdata)
-{
- char *cmdline = *cmdlinep;
- isc_buffer_t source, *buf = NULL, *newbuf = NULL;
- isc_region_t r;
- isc_lex_t *lex = NULL;
- dns_rdatacallbacks_t callbacks;
- isc_result_t result;
-
- while (cmdline != NULL && *cmdline != 0 &&
- isspace((unsigned char)*cmdline))
- cmdline++;
-
- if (cmdline != NULL && *cmdline != 0) {
- dns_rdatacallbacks_init(&callbacks);
- result = isc_lex_create(mctx, strlen(cmdline), &lex);
- check_result(result, "isc_lex_create");
- isc_buffer_init(&source, cmdline, strlen(cmdline));
- isc_buffer_add(&source, strlen(cmdline));
- result = isc_lex_openbuffer(lex, &source);
- check_result(result, "isc_lex_openbuffer");
- result = isc_buffer_allocate(mctx, &buf, MAXWIRE);
- check_result(result, "isc_buffer_allocate");
- result = dns_rdata_fromtext(rdata, rdataclass, rdatatype, lex,
- dns_rootname, 0, mctx, buf,
- &callbacks);
- isc_lex_destroy(&lex);
- if (result == ISC_R_SUCCESS) {
- isc_buffer_usedregion(buf, &r);
- result = isc_buffer_allocate(mctx, &newbuf, r.length);
- check_result(result, "isc_buffer_allocate");
- isc_buffer_putmem(newbuf, r.base, r.length);
- isc_buffer_usedregion(newbuf, &r);
- dns_rdata_reset(rdata);
- dns_rdata_fromregion(rdata, rdataclass, rdatatype, &r);
- isc_buffer_free(&buf);
- ISC_LIST_APPEND(usedbuffers, newbuf, link);
- } else {
- fprintf(stderr, "invalid rdata format: %s\n",
- isc_result_totext(result));
- isc_buffer_free(&buf);
- exit(1);
- }
- } else {
- rdata->flags = DNS_RDATA_UPDATE;
- }
- *cmdlinep = cmdline;
-}
-
-static void
-update_addordelete(isc_mem_t *mctx, char *cmdline, isc_boolean_t isdelete,
- dns_name_t *name)
-{
- isc_result_t result;
- isc_uint32_t ttl;
- char *word;
- dns_rdataclass_t rdataclass;
- dns_rdatatype_t rdatatype;
- dns_rdata_t *rdata = NULL;
- dns_rdatalist_t *rdatalist = NULL;
- dns_rdataset_t *rdataset = NULL;
- isc_textregion_t region;
-
- /*
- * Read the owner name.
- */
- parse_name(&cmdline, name);
-
- rdata = isc_mem_get(mctx, sizeof(*rdata));
- if (rdata == NULL) {
- fprintf(stderr, "memory allocation for rdata failed\n");
- exit(1);
- }
- dns_rdata_init(rdata);
-
- /*
- * If this is an add, read the TTL and verify that it's in range.
- * If it's a delete, ignore a TTL if present (for compatibility).
- */
- word = nsu_strsep(&cmdline, " \t\r\n");
- if (word == NULL || *word == 0) {
- if (!isdelete) {
- fprintf(stderr, "could not read owner ttl\n");
- exit(1);
- }
- else {
- ttl = 0;
- rdataclass = dns_rdataclass_any;
- rdatatype = dns_rdatatype_any;
- rdata->flags = DNS_RDATA_UPDATE;
- goto doneparsing;
- }
- }
- result = isc_parse_uint32(&ttl, word, 10);
- if (result != ISC_R_SUCCESS) {
- if (isdelete) {
- ttl = 0;
- goto parseclass;
- } else {
- fprintf(stderr, "ttl '%s': %s\n", word,
- isc_result_totext(result));
- exit(1);
- }
- }
-
- if (isdelete)
- ttl = 0;
- else if (ttl > TTL_MAX) {
- fprintf(stderr, "ttl '%s' is out of range (0 to %u)\n",
- word, TTL_MAX);
- exit(1);
- }
-
- /*
- * Read the class or type.
- */
- word = nsu_strsep(&cmdline, " \t\r\n");
- parseclass:
- if (word == NULL || *word == 0) {
- if (isdelete) {
- rdataclass = dns_rdataclass_any;
- rdatatype = dns_rdatatype_any;
- rdata->flags = DNS_RDATA_UPDATE;
- goto doneparsing;
- } else {
- fprintf(stderr, "could not read class or type\n");
- exit(1);
- }
- }
- region.base = word;
- region.length = strlen(word);
- result = dns_rdataclass_fromtext(&rdataclass, &region);
- if (result == ISC_R_SUCCESS) {
- /*
- * Now read the type.
- */
- word = nsu_strsep(&cmdline, " \t\r\n");
- if (word == NULL || *word == 0) {
- if (isdelete) {
- rdataclass = dns_rdataclass_any;
- rdatatype = dns_rdatatype_any;
- rdata->flags = DNS_RDATA_UPDATE;
- goto doneparsing;
- } else {
- fprintf(stderr, "could not read type\n");
- exit(1);
- }
- }
- region.base = word;
- region.length = strlen(word);
- result = dns_rdatatype_fromtext(&rdatatype, &region);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "'%s' is not a valid type: %s\n",
- word, isc_result_totext(result));
- exit(1);
- }
- } else {
- rdataclass = default_rdataclass;
- result = dns_rdatatype_fromtext(&rdatatype, &region);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "'%s' is not a valid class or type: "
- "%s\n", word, isc_result_totext(result));
- exit(1);
- }
- }
-
- parse_rdata(mctx, &cmdline, rdataclass, rdatatype, rdata);
-
- if (isdelete) {
- if ((rdata->flags & DNS_RDATA_UPDATE) != 0)
- rdataclass = dns_rdataclass_any;
- else
- rdataclass = dns_rdataclass_none;
- } else {
- if ((rdata->flags & DNS_RDATA_UPDATE) != 0) {
- fprintf(stderr, "could not read rdata\n");
- exit(1);
- }
- }
-
- doneparsing:
-
- rdatalist = isc_mem_get(mctx, sizeof(*rdatalist));
- if (rdatalist == NULL) {
- fprintf(stderr, "memory allocation for rdatalist failed\n");
- exit(1);
- }
- dns_rdatalist_init(rdatalist);
- rdatalist->type = rdatatype;
- rdatalist->rdclass = rdataclass;
- rdatalist->covers = rdatatype;
- rdatalist->ttl = (dns_ttl_t)ttl;
- ISC_LIST_INIT(rdatalist->rdata);
- ISC_LIST_APPEND(rdatalist->rdata, rdata, link);
- ISC_LIST_APPEND(usedrdatalists, rdatalist, link);
-
- rdataset = isc_mem_get(mctx, sizeof(*rdataset));
- if (rdataset == NULL) {
- fprintf(stderr, "memory allocation for rdataset failed\n");
- exit(1);
- }
- dns_rdataset_init(rdataset);
- dns_rdatalist_tordataset(rdatalist, rdataset);
- ISC_LIST_INIT(name->list);
- ISC_LIST_APPEND(name->list, rdataset, link);
-}
-
-static void
-make_prereq(isc_mem_t *mctx, char *cmdline, isc_boolean_t ispositive,
- isc_boolean_t isrrset, dns_name_t *name)
-{
- isc_result_t result;
- char *word;
- isc_textregion_t region;
- dns_rdataset_t *rdataset = NULL;
- dns_rdatalist_t *rdatalist = NULL;
- dns_rdataclass_t rdataclass;
- dns_rdatatype_t rdatatype;
- dns_rdata_t *rdata = NULL;
-
- /*
- * Read the owner name
- */
- parse_name(&cmdline, name);
-
- /*
- * If this is an rrset prereq, read the class or type.
- */
- if (isrrset) {
- word = nsu_strsep(&cmdline, " \t\r\n");
- if (word == NULL || *word == 0) {
- fprintf(stderr, "could not read class or type\n");
- exit(1);
- }
- region.base = word;
- region.length = strlen(word);
- result = dns_rdataclass_fromtext(&rdataclass, &region);
- if (result == ISC_R_SUCCESS) {
- /*
- * Now read the type.
- */
- word = nsu_strsep(&cmdline, " \t\r\n");
- if (word == NULL || *word == 0) {
- fprintf(stderr, "could not read type\n");
- exit(1);
- }
- region.base = word;
- region.length = strlen(word);
- result = dns_rdatatype_fromtext(&rdatatype, &region);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "invalid type: %s\n", word);
- exit(1);
- }
- } else {
- rdataclass = default_rdataclass;
- result = dns_rdatatype_fromtext(&rdatatype, &region);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "invalid type: %s\n", word);
- exit(1);
- }
- }
- } else
- rdatatype = dns_rdatatype_any;
-
- rdata = isc_mem_get(mctx, sizeof(*rdata));
- if (rdata == NULL) {
- fprintf(stderr, "memory allocation for rdata failed\n");
- exit(1);
- }
- dns_rdata_init(rdata);
-
- if (isrrset && ispositive)
- parse_rdata(mctx, &cmdline, rdataclass, rdatatype, rdata);
- else
- rdata->flags = DNS_RDATA_UPDATE;
-
- rdatalist = isc_mem_get(mctx, sizeof(*rdatalist));
- if (rdatalist == NULL) {
- fprintf(stderr, "memory allocation for rdatalist failed\n");
- exit(1);
- }
- dns_rdatalist_init(rdatalist);
- rdatalist->type = rdatatype;
- if (ispositive) {
- if (isrrset && rdata->data != NULL)
- rdatalist->rdclass = rdataclass;
- else
- rdatalist->rdclass = dns_rdataclass_any;
- } else
- rdatalist->rdclass = dns_rdataclass_none;
- rdatalist->covers = 0;
- rdatalist->ttl = 0;
- rdata->rdclass = rdatalist->rdclass;
- rdata->type = rdatatype;
- ISC_LIST_INIT(rdatalist->rdata);
- ISC_LIST_APPEND(rdatalist->rdata, rdata, link);
- ISC_LIST_APPEND(usedrdatalists, rdatalist, link);
-
- rdataset = isc_mem_get(mctx, sizeof(*rdataset));
- if (rdataset == NULL) {
- fprintf(stderr, "memory allocation for rdataset failed\n");
- exit(1);
- }
- dns_rdataset_init(rdataset);
- dns_rdatalist_tordataset(rdatalist, rdataset);
- ISC_LIST_INIT(name->list);
- ISC_LIST_APPEND(name->list, rdataset, link);
-}
-
-static void
-evaluate_prereq(isc_mem_t *mctx, char *cmdline, dns_name_t *name) {
- char *word;
- isc_boolean_t ispositive, isrrset;
-
- word = nsu_strsep(&cmdline, " \t\r\n");
- if (word == NULL || *word == 0) {
- fprintf(stderr, "could not read operation code\n");
- exit(1);
- }
- if (strcasecmp(word, "nxdomain") == 0) {
- ispositive = ISC_FALSE;
- isrrset = ISC_FALSE;
- } else if (strcasecmp(word, "yxdomain") == 0) {
- ispositive = ISC_TRUE;
- isrrset = ISC_FALSE;
- } else if (strcasecmp(word, "nxrrset") == 0) {
- ispositive = ISC_FALSE;
- isrrset = ISC_TRUE;
- } else if (strcasecmp(word, "yxrrset") == 0) {
- ispositive = ISC_TRUE;
- isrrset = ISC_TRUE;
- } else {
- fprintf(stderr, "incorrect operation code: %s\n", word);
- exit(1);
- }
-
- make_prereq(mctx, cmdline, ispositive, isrrset, name);
-}
-
-static void
-setup_tsec(char *keyfile, isc_mem_t *mctx) {
- dst_key_t *dstkey = NULL;
- isc_result_t result;
- dns_tsectype_t tsectype;
-
- result = dst_key_fromnamedfile(keyfile, NULL,
- DST_TYPE_PRIVATE | DST_TYPE_KEY, mctx,
- &dstkey);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "could not read key from %s: %s\n",
- keyfile, isc_result_totext(result));
- exit(1);
- }
-
- if (dst_key_alg(dstkey) == DST_ALG_HMACMD5)
- tsectype = dns_tsectype_tsig;
- else
- tsectype = dns_tsectype_sig0;
-
- result = dns_tsec_create(mctx, tsectype, dstkey, &tsec);
- dst_key_free(&dstkey);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "could not create tsec: %s\n",
- isc_result_totext(result));
- exit(1);
- }
-}
diff --git a/contrib/bind9/lib/export/samples/sample.c b/contrib/bind9/lib/export/samples/sample.c
deleted file mode 100644
index b121a0d..0000000
--- a/contrib/bind9/lib/export/samples/sample.c
+++ /dev/null
@@ -1,384 +0,0 @@
-/*
- * Copyright (C) 2009, 2012, 2013 Internet Systems Consortium, Inc. ("ISC")
- *
- * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
- * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS. IN NO EVENT SHALL ISC 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: sample.c,v 1.5 2009/09/29 15:06:07 fdupont Exp $ */
-
-#include <config.h>
-
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-
-#include <arpa/inet.h>
-
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <netdb.h>
-
-#include <isc/base64.h>
-#include <isc/buffer.h>
-#include <isc/lib.h>
-#include <isc/mem.h>
-#include <isc/sockaddr.h>
-#include <isc/util.h>
-
-#include <dns/client.h>
-#include <dns/fixedname.h>
-#include <dns/keyvalues.h>
-#include <dns/lib.h>
-#include <dns/name.h>
-#include <dns/rdata.h>
-#include <dns/rdataset.h>
-#include <dns/rdatastruct.h>
-#include <dns/rdatatype.h>
-#include <dns/result.h>
-#include <dns/secalg.h>
-
-#include <dst/dst.h>
-
-static char *algname;
-
-static isc_result_t
-printdata(dns_rdataset_t *rdataset, dns_name_t *owner) {
- isc_buffer_t target;
- isc_result_t result;
- isc_region_t r;
- char t[4096];
-
- if (!dns_rdataset_isassociated(rdataset)) {
- printf("[WARN: empty]\n");
- return (ISC_R_SUCCESS);
- }
-
- isc_buffer_init(&target, t, sizeof(t));
-
- result = dns_rdataset_totext(rdataset, owner, ISC_FALSE, ISC_FALSE,
- &target);
- if (result != ISC_R_SUCCESS)
- return (result);
- isc_buffer_usedregion(&target, &r);
- printf("%.*s", (int)r.length, (char *)r.base);
-
- return (ISC_R_SUCCESS);
-}
-
-ISC_PLATFORM_NORETURN_PRE static void
-usage(void) ISC_PLATFORM_NORETURN_POST;
-
-static void
-usage(void) {
- fprintf(stderr, "sample [-t RRtype] "
- "[[-a algorithm] [-e] -k keyname -K keystring] "
- "[-s domain:serveraddr_for_domain ] "
- "server_address hostname\n");
-
- exit(1);
-}
-
-static void
-set_key(dns_client_t *client, char *keynamestr, char *keystr,
- isc_boolean_t is_sep, isc_mem_t **mctxp)
-{
- isc_result_t result;
- dns_fixedname_t fkeyname;
- size_t namelen;
- dns_name_t *keyname;
- dns_rdata_dnskey_t keystruct;
- unsigned char keydata[4096];
- isc_buffer_t keydatabuf;
- unsigned char rrdata[4096];
- isc_buffer_t rrdatabuf;
- isc_buffer_t b;
- isc_textregion_t tr;
- isc_region_t r;
- dns_secalg_t alg;
-
- result = isc_mem_create(0, 0, mctxp);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "failed to crate mctx\n");
- exit(1);
- }
-
- if (algname != NULL) {
- tr.base = algname;
- tr.length = strlen(algname);
- result = dns_secalg_fromtext(&alg, &tr);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "failed to identify the algorithm\n");
- exit(1);
- }
- } else
- alg = DNS_KEYALG_RSASHA1;
-
- keystruct.common.rdclass = dns_rdataclass_in;
- keystruct.common.rdtype = dns_rdatatype_dnskey;
- keystruct.flags = DNS_KEYOWNER_ZONE; /* fixed */
- if (is_sep)
- keystruct.flags |= DNS_KEYFLAG_KSK;
- keystruct.protocol = DNS_KEYPROTO_DNSSEC; /* fixed */
- keystruct.algorithm = alg;
-
- isc_buffer_init(&keydatabuf, keydata, sizeof(keydata));
- isc_buffer_init(&rrdatabuf, rrdata, sizeof(rrdata));
- result = isc_base64_decodestring(keystr, &keydatabuf);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "base64 decode failed\n");
- exit(1);
- }
- isc_buffer_usedregion(&keydatabuf, &r);
- keystruct.datalen = r.length;
- keystruct.data = r.base;
-
- result = dns_rdata_fromstruct(NULL, keystruct.common.rdclass,
- keystruct.common.rdtype,
- &keystruct, &rrdatabuf);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "failed to construct key rdata\n");
- exit(1);
- }
- namelen = strlen(keynamestr);
- isc_buffer_init(&b, keynamestr, namelen);
- isc_buffer_add(&b, namelen);
- dns_fixedname_init(&fkeyname);
- keyname = dns_fixedname_name(&fkeyname);
- result = dns_name_fromtext(keyname, &b, dns_rootname, 0, NULL);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "failed to construct key name\n");
- exit(1);
- }
- result = dns_client_addtrustedkey(client, dns_rdataclass_in,
- keyname, &rrdatabuf);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "failed to add key for %s\n",
- keynamestr);
- exit(1);
- }
-}
-
-static void
-addserver(dns_client_t *client, const char *addrstr, const char *port,
- const char *namespace)
-{
- struct addrinfo hints, *res;
- int gai_error;
- isc_sockaddr_t sa;
- isc_sockaddrlist_t servers;
- isc_result_t result;
- size_t namelen;
- isc_buffer_t b;
- dns_fixedname_t fname;
- dns_name_t *name = NULL;
-
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = AF_UNSPEC;
- hints.ai_socktype = SOCK_DGRAM;
- hints.ai_protocol = IPPROTO_UDP;
- hints.ai_flags = AI_NUMERICHOST;
- gai_error = getaddrinfo(addrstr, port, &hints, &res);
- if (gai_error != 0) {
- fprintf(stderr, "getaddrinfo failed: %s\n",
- gai_strerror(gai_error));
- exit(1);
- }
- INSIST(res->ai_addrlen <= sizeof(sa.type));
- memcpy(&sa.type, res->ai_addr, res->ai_addrlen);
- sa.length = res->ai_addrlen;
- freeaddrinfo(res);
- ISC_LINK_INIT(&sa, link);
- ISC_LIST_INIT(servers);
- ISC_LIST_APPEND(servers, &sa, link);
-
- if (namespace != NULL) {
- namelen = strlen(namespace);
- isc_buffer_constinit(&b, namespace, namelen);
- isc_buffer_add(&b, namelen);
- dns_fixedname_init(&fname);
- name = dns_fixedname_name(&fname);
- result = dns_name_fromtext(name, &b, dns_rootname, 0, NULL);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "failed to convert qname: %d\n",
- result);
- exit(1);
- }
- }
-
- result = dns_client_setservers(client, dns_rdataclass_in, name,
- &servers);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "set server failed: %d\n", result);
- exit(1);
- }
-}
-
-int
-main(int argc, char *argv[]) {
- int ch;
- isc_textregion_t tr;
- char *altserver = NULL;
- char *altserveraddr = NULL;
- char *altservername = NULL;
- dns_client_t *client = NULL;
- char *keynamestr = NULL;
- char *keystr = NULL;
- isc_result_t result;
- isc_buffer_t b;
- dns_fixedname_t qname0;
- size_t namelen;
- dns_name_t *qname, *name;
- dns_rdatatype_t type = dns_rdatatype_a;
- dns_rdataset_t *rdataset;
- dns_namelist_t namelist;
- isc_mem_t *keymctx = NULL;
- unsigned int clientopt, resopt;
- isc_boolean_t is_sep = ISC_FALSE;
- const char *port = "53";
-
- while ((ch = getopt(argc, argv, "a:es:t:k:K:p:")) != -1) {
- switch (ch) {
- case 't':
- tr.base = optarg;
- tr.length = strlen(optarg);
- result = dns_rdatatype_fromtext(&type, &tr);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr,
- "invalid RRtype: %s\n", optarg);
- exit(1);
- }
- break;
- case 'a':
- algname = optarg;
- break;
- case 'e':
- is_sep = ISC_TRUE;
- break;
- case 's':
- if (altserver != NULL) {
- fprintf(stderr, "alternate server "
- "already defined: %s\n",
- altserver);
- exit(1);
- }
- altserver = optarg;
- break;
- case 'k':
- keynamestr = optarg;
- break;
- case 'K':
- keystr = optarg;
- break;
- case 'p':
- port = optarg;
- break;
- default:
- usage();
- }
- }
-
- argc -= optind;
- argv += optind;
- if (argc < 2)
- usage();
-
- if (altserver != NULL) {
- char *cp;
-
- cp = strchr(altserver, ':');
- if (cp == NULL) {
- fprintf(stderr, "invalid alternate server: %s\n",
- altserver);
- exit(1);
- }
- *cp = '\0';
- altservername = altserver;
- altserveraddr = cp + 1;
- }
-
- isc_lib_register();
- result = dns_lib_init();
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "dns_lib_init failed: %d\n", result);
- exit(1);
- }
-
- clientopt = 0;
- result = dns_client_create(&client, clientopt);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "dns_client_create failed: %d\n", result);
- exit(1);
- }
-
- /* Set the nameserver */
- addserver(client, argv[0], port, NULL);
-
- /* Set the alternate nameserver (when specified) */
- if (altserver != NULL)
- addserver(client, altserveraddr, port, altservername);
-
- /* Install DNSSEC key (if given) */
- if (keynamestr != NULL) {
- if (keystr == NULL) {
- fprintf(stderr,
- "key string is missing "
- "while key name is provided\n");
- exit(1);
- }
- set_key(client, keynamestr, keystr, is_sep, &keymctx);
- }
-
- /* Construct qname */
- namelen = strlen(argv[1]);
- isc_buffer_init(&b, argv[1], namelen);
- isc_buffer_add(&b, namelen);
- dns_fixedname_init(&qname0);
- qname = dns_fixedname_name(&qname0);
- result = dns_name_fromtext(qname, &b, dns_rootname, 0, NULL);
- if (result != ISC_R_SUCCESS)
- fprintf(stderr, "failed to convert qname: %d\n", result);
-
- /* Perform resolution */
- resopt = 0;
- if (keynamestr == NULL)
- resopt |= DNS_CLIENTRESOPT_NODNSSEC;
- ISC_LIST_INIT(namelist);
- result = dns_client_resolve(client, qname, dns_rdataclass_in, type,
- resopt, &namelist);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr,
- "resolution failed: %s\n", dns_result_totext(result));
- }
- for (name = ISC_LIST_HEAD(namelist); name != NULL;
- name = ISC_LIST_NEXT(name, link)) {
- for (rdataset = ISC_LIST_HEAD(name->list);
- rdataset != NULL;
- rdataset = ISC_LIST_NEXT(rdataset, link)) {
- if (printdata(rdataset, name) != ISC_R_SUCCESS)
- fprintf(stderr, "print data failed\n");
- }
- }
-
- dns_client_freeresanswer(client, &namelist);
-
- /* Cleanup */
- dns_client_destroy(&client);
- if (keynamestr != NULL)
- isc_mem_destroy(&keymctx);
- dns_lib_shutdown();
-
- return (0);
-}
OpenPOWER on IntegriCloud