diff options
Diffstat (limited to 'contrib/bind9/lib/export/samples')
-rw-r--r-- | contrib/bind9/lib/export/samples/Makefile-postinstall.in | 78 | ||||
-rw-r--r-- | contrib/bind9/lib/export/samples/Makefile.in | 99 | ||||
-rw-r--r-- | contrib/bind9/lib/export/samples/nsprobe.c | 1220 | ||||
-rw-r--r-- | contrib/bind9/lib/export/samples/sample-async.c | 402 | ||||
-rw-r--r-- | contrib/bind9/lib/export/samples/sample-gai.c | 77 | ||||
-rw-r--r-- | contrib/bind9/lib/export/samples/sample-request.c | 265 | ||||
-rw-r--r-- | contrib/bind9/lib/export/samples/sample-update.c | 755 | ||||
-rw-r--r-- | contrib/bind9/lib/export/samples/sample.c | 384 |
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, ®ion); - 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, ®ion); - 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, ®ion); - 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, ®ion); - 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, ®ion); - if (result != ISC_R_SUCCESS) { - fprintf(stderr, "invalid type: %s\n", word); - exit(1); - } - } else { - rdataclass = default_rdataclass; - result = dns_rdatatype_fromtext(&rdatatype, ®ion); - 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); -} |