From fb2a352e7cca850783fdaaf51b465d1c6197fe75 Mon Sep 17 00:00:00 2001 From: Evan Hunt Date: Mon, 22 Mar 2021 18:04:23 -0700 Subject: [PATCH 1/6] remove dns_client_update() and related code the libdns client API is no longer being maintained for external use, we can remove the code that isn't being used internally, as well as the related tests. --- bin/tests/system/conf.sh.common | 1 - bin/tests/system/conf.sh.in | 1 - bin/tests/system/conf.sh.win32 | 2 - bin/tests/system/nsupdate/tests.sh | 82 - bin/win32/BINDInstall/BINDInstall.vcxproj.in | 6 - lib/dns/client.c | 1483 ------------------ lib/dns/include/dns/client.h | 191 +-- lib/dns/win32/libdns.def.in | 7 - lib/samples/.gitignore | 2 - lib/samples/Makefile.am | 8 - lib/samples/sample-request.c | 249 --- lib/samples/sample-update.c | 781 --------- lib/samples/win32/request.vcxproj.filters.in | 22 - lib/samples/win32/request.vcxproj.in | 127 -- lib/samples/win32/request.vcxproj.user | 3 - lib/samples/win32/update.vcxproj.filters.in | 22 - lib/samples/win32/update.vcxproj.in | 127 -- lib/samples/win32/update.vcxproj.user | 3 - util/copyrights | 8 - win32utils/Configure | 4 - win32utils/bind9.sln.in | 4 - 21 files changed, 8 insertions(+), 3125 deletions(-) delete mode 100644 lib/samples/sample-request.c delete mode 100644 lib/samples/sample-update.c delete mode 100644 lib/samples/win32/request.vcxproj.filters.in delete mode 100644 lib/samples/win32/request.vcxproj.in delete mode 100644 lib/samples/win32/request.vcxproj.user delete mode 100644 lib/samples/win32/update.vcxproj.filters.in delete mode 100644 lib/samples/win32/update.vcxproj.in delete mode 100644 lib/samples/win32/update.vcxproj.user diff --git a/bin/tests/system/conf.sh.common b/bin/tests/system/conf.sh.common index cf1b5e6513..ac1845860f 100644 --- a/bin/tests/system/conf.sh.common +++ b/bin/tests/system/conf.sh.common @@ -730,7 +730,6 @@ export PYTHON export RESOLVE export RNDC export RRCHECKER -export SAMPLEUPDATE export SIGNER export SUBDIRS export TMPDIR diff --git a/bin/tests/system/conf.sh.in b/bin/tests/system/conf.sh.in index 05f1a4fe71..08983b65f8 100644 --- a/bin/tests/system/conf.sh.in +++ b/bin/tests/system/conf.sh.in @@ -68,7 +68,6 @@ KEYCREATE=$TOP_BUILDDIR/bin/tests/system/tkey/keycreate KEYDELETE=$TOP_BUILDDIR/bin/tests/system/tkey/keydelete MAKEJOURNAL=$TOP_BUILDDIR/bin/tests/system/makejournal PIPEQUERIES=$TOP_BUILDDIR/bin/tests/system/pipelined/pipequeries -SAMPLEUPDATE=$TOP_BUILDDIR/lib/samples/sample-update # we don't want a KRB5_CONFIG setting breaking the tests KRB5_CONFIG=/dev/null diff --git a/bin/tests/system/conf.sh.win32 b/bin/tests/system/conf.sh.win32 index 37e4379c84..ca41063109 100644 --- a/bin/tests/system/conf.sh.win32 +++ b/bin/tests/system/conf.sh.win32 @@ -56,7 +56,6 @@ REVOKE=$TOP_BUILDDIR/Build/$VSCONF/dnssec-revoke@EXEEXT@ RNDC=$TOP_BUILDDIR/Build/$VSCONF/rndc@EXEEXT@ RNDCCONFGEN=$TOP_BUILDDIR/Build/$VSCONF/rndc-confgen@EXEEXT@ RRCHECKER=$TOP_BUILDDIR/Build/$VSCONF/named-rrchecker@EXEEXT@ -SAMPLEUPDATE=$TOP_BUILDDIR/Build/$VSCONF/update@EXEEXT@ SETTIME=$TOP_BUILDDIR/Build/$VSCONF/dnssec-settime@EXEEXT@ SIGNER=$TOP_BUILDDIR/Build/$VSCONF/dnssec-signzone@EXEEXT@ TSIGKEYGEN=$TOP_BUILDDIR/Build/$VSCONF/tsig-keygen@EXEEXT@ @@ -71,7 +70,6 @@ KEYCREATE=$TOP_BUILDDIR/Build/$VSCONF/keycreate@EXEEXT@ KEYDELETE=$TOP_BUILDDIR/Build/$VSCONF/keydelete@EXEEXT@ MAKEJOURNAL=$TOP_BUILDDIR/Build/$VSCONF/makejournal@EXEEXT@ PIPEQUERIES=$TOP_BUILDDIR/Build/$VSCONF/pipequeries@EXEEXT@ -# to port SAMPLEUPDATE=$TOP_BUILDDIR/lib/samples/sample-update # we don't want a KRB5_CONFIG setting breaking the tests KRB5_CONFIG=NUL diff --git a/bin/tests/system/nsupdate/tests.sh b/bin/tests/system/nsupdate/tests.sh index 4274f86dd3..1bbb804584 100755 --- a/bin/tests/system/nsupdate/tests.sh +++ b/bin/tests/system/nsupdate/tests.sh @@ -1428,88 +1428,6 @@ EOF [ $ret = 0 ] || { echo_i "failed"; status=1; } fi -# -# Add client library tests here -# - -if test unset != "${SAMPLEUPDATE:-unset}" -a -x "${SAMPLEUPDATE}" -then - - n=`expr $n + 1` - ret=0 - echo_i "check that dns_client_update handles prerequisite NXDOMAIN failure ($n)" - $SAMPLEUPDATE -P ${PORT} -a 10.53.0.1 -a 10.53.0.2 -p "nxdomain exists.sample" \ - add "nxdomain-exists.sample 0 in a 1.2.3.4" > update.out.test$n 2>&1 - $SAMPLEUPDATE -P ${PORT} -a 10.53.0.2 -p "nxdomain exists.sample" \ - add "check-nxdomain-exists.sample 0 in a 1.2.3.4" > update.out.check$n 2>&1 - $DIG $DIGOPTS +tcp @10.53.0.1 a nxdomain-exists.sample > dig.out.ns1.test$n - $DIG $DIGOPTS +tcp @10.53.0.2 a nxdomain-exists.sample > dig.out.ns2.test$n - $DIG $DIGOPTS +tcp @10.53.0.2 a check-nxdomain-exists.sample > check.out.ns2.test$n - grep "update failed: YXDOMAIN" update.out.test$n > /dev/null || ret=1 - grep "update succeeded" update.out.check$n > /dev/null || ret=1 - grep "status: NXDOMAIN" dig.out.ns1.test$n > /dev/null || ret=1 - grep "status: NXDOMAIN" dig.out.ns2.test$n > /dev/null || ret=1 - grep "status: NOERROR" check.out.ns2.test$n > /dev/null || ret=1 - [ $ret = 0 ] || { echo_i "failed"; status=1; } - - n=`expr $n + 1` - ret=0 - echo_i "check that dns_client_update handles prerequisite YXDOMAIN failure ($n)" - $SAMPLEUPDATE -P ${PORT} -a 10.53.0.1 -a 10.53.0.2 -p "yxdomain nxdomain.sample" \ - add "yxdomain-nxdomain.sample 0 in a 1.2.3.4" > update.out.test$n 2>&1 - $SAMPLEUPDATE -P ${PORT} -a 10.53.0.2 -p "yxdomain nxdomain.sample" \ - add "check-yxdomain-nxdomain.sample 0 in a 1.2.3.4" > update.out.check$n 2>&1 - $DIG $DIGOPTS +tcp @10.53.0.1 a nxdomain-exists.sample > dig.out.ns1.test$n - $DIG $DIGOPTS +tcp @10.53.0.2 a nxdomain-exists.sample > dig.out.ns2.test$n - $DIG $DIGOPTS +tcp @10.53.0.2 a check-nxdomain-exists.sample > check.out.ns2.test$n - grep "update failed: NXDOMAIN" update.out.test$n > /dev/null || ret=1 - grep "update succeeded" update.out.check$n > /dev/null || ret=1 - grep "status: NXDOMAIN" dig.out.ns1.test$n > /dev/null || ret=1 - grep "status: NXDOMAIN" dig.out.ns2.test$n > /dev/null || ret=1 - grep "status: NOERROR" check.out.ns2.test$n > /dev/null || ret=1 - [ $ret = 0 ] || { echo_i "failed"; status=1; } - - n=`expr $n + 1` - ret=0 - echo_i "check that dns_client_update handles prerequisite NXRRSET failure ($n)" - $SAMPLEUPDATE -P ${PORT} -a 10.53.0.1 -a 10.53.0.2 -p "nxrrset exists.sample TXT This RRset exists." \ - add "nxrrset-exists.sample 0 in a 1.2.3.4" > update.out.test$n 2>&1 - $SAMPLEUPDATE -P ${PORT} -a 10.53.0.2 -p "nxrrset exists.sample TXT This RRset exists." \ - add "check-nxrrset-exists.sample 0 in a 1.2.3.4" > update.out.check$n 2>&1 - $DIG $DIGOPTS +tcp @10.53.0.1 a nxrrset-exists.sample > dig.out.ns1.test$n - $DIG $DIGOPTS +tcp @10.53.0.2 a nxrrset-exists.sample > dig.out.ns2.test$n - $DIG $DIGOPTS +tcp @10.53.0.2 a check-nxrrset-exists.sample > check.out.ns2.test$n - grep "update failed: YXRRSET" update.out.test$n > /dev/null || ret=1 - grep "update succeeded" update.out.check$n > /dev/null || ret=1 - grep "status: NXDOMAIN" dig.out.ns1.test$n > /dev/null || ret=1 - grep "status: NXDOMAIN" dig.out.ns2.test$n > /dev/null || ret=1 - grep "status: NOERROR" check.out.ns2.test$n > /dev/null || ret=1 - [ $ret = 0 ] || { echo_i "failed"; status=1; } - - n=`expr $n + 1` - ret=0 - echo_i "check that dns_client_update handles prerequisite YXRRSET failure ($n)" - $SAMPLEUPDATE -s -P ${PORT} -a 10.53.0.1 -a 10.53.0.2 \ - -p "yxrrset no-txt.sample TXT" \ - add "yxrrset-nxrrset.sample 0 in a 1.2.3.4" > update.out.test$n 2>&1 - $SAMPLEUPDATE -P ${PORT} -a 10.53.0.2 -p "yxrrset no-txt.sample TXT" \ - add "check-yxrrset-nxrrset.sample 0 in a 1.2.3.4" > update.out.check$n 2>&1 - $DIG $DIGOPTS +tcp @10.53.0.1 a yxrrset-nxrrset.sample > dig.out.ns1.test$n - $DIG $DIGOPTS +tcp @10.53.0.2 a yxrrset-nxrrset.sample > dig.out.ns2.test$n - $DIG $DIGOPTS +tcp @10.53.0.2 a check-yxrrset-nxrrset.sample > check.out.ns2.test$n - grep "update failed: NXRRSET" update.out.test$n > /dev/null || ret=1 - grep "update succeeded" update.out.check$n > /dev/null || ret=1 - grep "status: NXDOMAIN" dig.out.ns1.test$n > /dev/null || ret=1 - grep "status: NXDOMAIN" dig.out.ns2.test$n > /dev/null || ret=1 - grep "status: NOERROR" check.out.ns2.test$n > /dev/null || ret=1 - grep "2nd update failed: NXRRSET" update.out.test$n > /dev/null || ret=1 - [ $ret = 0 ] || { echo_i "failed"; status=1; } - -fi - -# -# End client library tests here -# echo_i "exit status: $status" [ $status -eq 0 ] || exit 1 diff --git a/bin/win32/BINDInstall/BINDInstall.vcxproj.in b/bin/win32/BINDInstall/BINDInstall.vcxproj.in index 92de623ada..9e70c009b5 100644 --- a/bin/win32/BINDInstall/BINDInstall.vcxproj.in +++ b/bin/win32/BINDInstall/BINDInstall.vcxproj.in @@ -308,15 +308,9 @@ {CB2A29F6-E73B-40AB-8AC4-2C1AAE7280BD} - - {FF440E85-7450-439C-82EE-04C464512D0E} - {F66D8B7E-721D-4602-99AD-820D19AD1313} - - {05682E12-523F-4DAE-8E6D-ADFDBC308AFD} - @END SAMPLES {0D745CD9-FC3B-49DC-99BE-1E6DF85593F0} diff --git a/lib/dns/client.c b/lib/dns/client.c index c1a9b95d87..701202503b 100644 --- a/lib/dns/client.c +++ b/lib/dns/client.c @@ -95,9 +95,6 @@ struct dns_client { dns_dispatch_t *dispatchv4; dns_dispatch_t *dispatchv6; - unsigned int update_timeout; - unsigned int update_udptimeout; - unsigned int update_udpretries; unsigned int find_timeout; unsigned int find_udpretries; @@ -107,17 +104,8 @@ struct dns_client { dns_viewlist_t viewlist; ISC_LIST(struct resctx) resctxs; ISC_LIST(struct reqctx) reqctxs; - ISC_LIST(struct updatectx) updatectxs; }; -/*% - * Timeout/retry constants for dynamic update borrowed from nsupdate - */ -#define DEF_UPDATE_TIMEOUT 300 -#define MIN_UPDATE_TIMEOUT 30 -#define DEF_UPDATE_UDPTIMEOUT 3 -#define DEF_UPDATE_UDPRETRIES 3 - #define DEF_FIND_TIMEOUT 5 #define DEF_FIND_UDPRETRIES 3 @@ -202,65 +190,8 @@ typedef struct reqarg { bool canceled; } reqarg_t; -/*% - * Argument of an internal event for synchronous name resolution. - */ -typedef struct updatearg { - /* Unlocked */ - isc_appctx_t *actx; - dns_client_t *client; - isc_mutex_t lock; - - /* Locked */ - isc_result_t result; - dns_clientupdatetrans_t *trans; - bool canceled; -} updatearg_t; - -/*% - * Internal state for a single dynamic update procedure - */ -typedef struct updatectx { - /* Unlocked */ - unsigned int magic; - isc_mutex_t lock; - dns_client_t *client; - bool want_tcp; - - /* Locked */ - dns_request_t *updatereq; - dns_request_t *soareq; - dns_clientrestrans_t *restrans; - dns_clientrestrans_t *restrans2; - bool canceled; - - /* Task Locked */ - ISC_LINK(struct updatectx) link; - dns_clientupdatestate_t state; - dns_rdataclass_t rdclass; - dns_view_t *view; - dns_message_t *updatemsg; - dns_message_t *soaquery; - dns_clientupdateevent_t *event; - dns_tsigkey_t *tsigkey; - dst_key_t *sig0key; - dns_name_t *firstname; - dns_name_t soaqname; - dns_fixedname_t zonefname; - dns_name_t *zonename; - isc_sockaddrlist_t servers; - unsigned int nservers; - isc_sockaddr_t *currentserver; - struct updatectx *bp4; - struct updatectx *bp6; -} updatectx_t; - -static isc_result_t -request_soa(updatectx_t *uctx); static void client_resfind(resctx_t *rctx, dns_fetchevent_t *event); -static isc_result_t -send_update(updatectx_t *uctx); /* * Try honoring the operating system's preferred ephemeral port range. @@ -397,84 +328,6 @@ createview(isc_mem_t *mctx, dns_rdataclass_t rdclass, isc_taskmgr_t *taskmgr, return (ISC_R_SUCCESS); } -isc_result_t -dns_client_create(dns_client_t **clientp, unsigned int options) { - isc_result_t result; - isc_mem_t *mctx = NULL; - isc_appctx_t *actx = NULL; - isc_taskmgr_t *taskmgr = NULL; - isc_socketmgr_t *socketmgr = NULL; - isc_timermgr_t *timermgr = NULL; -#if 0 - /* XXXMPA add debug logging support */ - isc_log_t *lctx = NULL; - isc_logconfig_t *logconfig = NULL; - unsigned int logdebuglevel = 0; -#endif /* if 0 */ - - isc_mem_create(&mctx); - result = isc_appctx_create(mctx, &actx); - if (result != ISC_R_SUCCESS) { - goto cleanup; - } - result = isc_app_ctxstart(actx); - if (result != ISC_R_SUCCESS) { - goto cleanup; - } - result = isc_taskmgr_createinctx(mctx, 1, 0, &taskmgr); - if (result != ISC_R_SUCCESS) { - goto cleanup; - } - result = isc_socketmgr_createinctx(mctx, &socketmgr); - if (result != ISC_R_SUCCESS) { - goto cleanup; - } - result = isc_timermgr_createinctx(mctx, &timermgr); - if (result != ISC_R_SUCCESS) { - goto cleanup; - } -#if 0 - isc_log_create(mctx, &lctx, &logconfig); - isc_log_setcontext(lctx); - dns_log_init(lctx); - dns_log_setcontext(lctx); - result = isc_log_usechannel(logconfig, "default_debug", NULL, NULL); - if (result != ISC_R_SUCCESS) { - goto cleanup; - } - isc_log_setdebuglevel(lctx, logdebuglevel); -#endif /* if 0 */ - result = dns_client_createx(mctx, actx, taskmgr, socketmgr, timermgr, - options, clientp, NULL, NULL); - if (result != ISC_R_SUCCESS) { - goto cleanup; - } - - (*clientp)->attributes |= DNS_CLIENTATTR_OWNCTX; - - /* client has its own reference to mctx, so we can detach it here */ - isc_mem_detach(&mctx); - - return (ISC_R_SUCCESS); - -cleanup: - if (taskmgr != NULL) { - isc_taskmgr_destroy(&taskmgr); - } - if (timermgr != NULL) { - isc_timermgr_destroy(&timermgr); - } - if (socketmgr != NULL) { - isc_socketmgr_destroy(&socketmgr); - } - if (actx != NULL) { - isc_appctx_destroy(&actx); - } - isc_mem_detach(&mctx); - - return (result); -} - isc_result_t dns_client_createx(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr, isc_socketmgr_t *socketmgr, isc_timermgr_t *timermgr, @@ -563,14 +416,10 @@ dns_client_createx(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr, ISC_LIST_INIT(client->resctxs); ISC_LIST_INIT(client->reqctxs); - ISC_LIST_INIT(client->updatectxs); client->mctx = NULL; isc_mem_attach(mctx, &client->mctx); - client->update_timeout = DEF_UPDATE_TIMEOUT; - client->update_udptimeout = DEF_UPDATE_UDPTIMEOUT; - client->update_udpretries = DEF_UPDATE_UDPRETRIES; client->find_timeout = DEF_FIND_TIMEOUT; client->find_udpretries = DEF_FIND_UDPRETRIES; client->attributes = 0; @@ -1854,1335 +1703,3 @@ dns_client_destroyreqtrans(dns_clientreqtrans_t **transp) { dns_client_destroy(&client); } - -/*% - * Dynamic update routines - */ -static isc_result_t -rcode2result(dns_rcode_t rcode) { - /* XXX: isn't there a similar function? */ - switch (rcode) { - case dns_rcode_formerr: - return (DNS_R_FORMERR); - case dns_rcode_servfail: - return (DNS_R_SERVFAIL); - case dns_rcode_nxdomain: - return (DNS_R_NXDOMAIN); - case dns_rcode_notimp: - return (DNS_R_NOTIMP); - case dns_rcode_refused: - return (DNS_R_REFUSED); - case dns_rcode_yxdomain: - return (DNS_R_YXDOMAIN); - case dns_rcode_yxrrset: - return (DNS_R_YXRRSET); - case dns_rcode_nxrrset: - return (DNS_R_NXRRSET); - case dns_rcode_notauth: - return (DNS_R_NOTAUTH); - case dns_rcode_notzone: - return (DNS_R_NOTZONE); - case dns_rcode_badvers: - return (DNS_R_BADVERS); - } - - return (ISC_R_FAILURE); -} - -static void -update_sendevent(updatectx_t *uctx, isc_result_t result) { - isc_task_t *task; - - dns_message_detach(&uctx->updatemsg); - if (uctx->tsigkey != NULL) { - dns_tsigkey_detach(&uctx->tsigkey); - } - if (uctx->sig0key != NULL) { - dst_key_free(&uctx->sig0key); - } - - if (uctx->canceled) { - uctx->event->result = ISC_R_CANCELED; - } else { - uctx->event->result = result; - } - uctx->event->state = uctx->state; - task = uctx->event->ev_sender; - uctx->event->ev_sender = uctx; - isc_task_sendanddetach(&task, ISC_EVENT_PTR(&uctx->event)); -} - -static void -update_done(isc_task_t *task, isc_event_t *event) { - isc_result_t result; - dns_requestevent_t *reqev = NULL; - dns_request_t *request; - dns_message_t *answer = NULL; - updatectx_t *uctx = event->ev_arg; - dns_client_t *client; - unsigned int timeout, reqoptions; - - UNUSED(task); - - REQUIRE(event->ev_type == DNS_EVENT_REQUESTDONE); - reqev = (dns_requestevent_t *)event; - request = reqev->request; - REQUIRE(UCTX_VALID(uctx)); - client = uctx->client; - REQUIRE(DNS_CLIENT_VALID(client)); - - result = reqev->result; - if (result != ISC_R_SUCCESS) { - goto out; - } - - dns_message_create(client->mctx, DNS_MESSAGE_INTENTPARSE, &answer); - uctx->state = dns_clientupdatestate_done; - result = dns_request_getresponse(request, answer, - DNS_MESSAGEPARSE_PRESERVEORDER); - if (result == ISC_R_SUCCESS && answer->rcode != dns_rcode_noerror) { - result = rcode2result(answer->rcode); - } - -out: - if (answer != NULL) { - dns_message_detach(&answer); - } - isc_event_free(&event); - - LOCK(&uctx->lock); - uctx->currentserver = ISC_LIST_NEXT(uctx->currentserver, link); - dns_request_destroy(&uctx->updatereq); - /* - * Moving on to the next server shouldn't change the result - * for NXDOMAIN, YXDOMAIN, NXRRSET and YXRRSET as they - * indicate a prerequisite failure. REFUSED should also - * be consistent across all servers but often isn't as that - * is policy rather that zone content driven (slaves that - * aren't willing to forward should return NOTIMPL). NOTZONE - * indicates that we stuffed up the request construction so - * don't retry. - */ - if (result != ISC_R_SUCCESS && result != DNS_R_NXDOMAIN && - result != DNS_R_YXDOMAIN && result != DNS_R_YXRRSET && - result != DNS_R_NXRRSET && result != DNS_R_NOTZONE && - !uctx->canceled && uctx->currentserver != NULL) - { - dns_message_renderreset(uctx->updatemsg); - dns_message_settsigkey(uctx->updatemsg, NULL); - - timeout = client->update_timeout / uctx->nservers; - if (timeout < MIN_UPDATE_TIMEOUT) { - timeout = MIN_UPDATE_TIMEOUT; - } - reqoptions = 0; - if (uctx->want_tcp) { - reqoptions |= DNS_REQUESTOPT_TCP; - } - result = dns_request_createvia( - uctx->view->requestmgr, uctx->updatemsg, NULL, - uctx->currentserver, -1, reqoptions, uctx->tsigkey, - timeout, client->update_udptimeout, - client->update_udpretries, client->task, update_done, - uctx, &uctx->updatereq); - UNLOCK(&uctx->lock); - - if (result == ISC_R_SUCCESS) { - /* XXX: should we keep the 'done' state here? */ - uctx->state = dns_clientupdatestate_sent; - return; - } - } else { - UNLOCK(&uctx->lock); - } - - update_sendevent(uctx, result); -} - -static isc_result_t -send_update(updatectx_t *uctx) { - isc_result_t result; - dns_name_t *name = NULL; - dns_rdataset_t *rdataset = NULL; - dns_client_t *client = uctx->client; - unsigned int timeout, reqoptions; - - REQUIRE(uctx->zonename != NULL && uctx->currentserver != NULL); - - result = dns_message_gettempname(uctx->updatemsg, &name); - if (result != ISC_R_SUCCESS) { - return (result); - } - dns_name_init(name, NULL); - dns_name_clone(uctx->zonename, name); - result = dns_message_gettemprdataset(uctx->updatemsg, &rdataset); - if (result != ISC_R_SUCCESS) { - dns_message_puttempname(uctx->updatemsg, &name); - return (result); - } - dns_rdataset_makequestion(rdataset, uctx->rdclass, dns_rdatatype_soa); - ISC_LIST_INIT(name->list); - ISC_LIST_APPEND(name->list, rdataset, link); - dns_message_addname(uctx->updatemsg, name, DNS_SECTION_ZONE); - if (uctx->tsigkey == NULL && uctx->sig0key != NULL) { - result = dns_message_setsig0key(uctx->updatemsg, uctx->sig0key); - if (result != ISC_R_SUCCESS) { - return (result); - } - } - timeout = client->update_timeout / uctx->nservers; - if (timeout < MIN_UPDATE_TIMEOUT) { - timeout = MIN_UPDATE_TIMEOUT; - } - reqoptions = 0; - if (uctx->want_tcp) { - reqoptions |= DNS_REQUESTOPT_TCP; - } - result = dns_request_createvia( - uctx->view->requestmgr, uctx->updatemsg, NULL, - uctx->currentserver, -1, reqoptions, uctx->tsigkey, timeout, - client->update_udptimeout, client->update_udpretries, - client->task, update_done, uctx, &uctx->updatereq); - if (result == ISC_R_SUCCESS && - uctx->state == dns_clientupdatestate_prepare) { - uctx->state = dns_clientupdatestate_sent; - } - - return (result); -} - -static void -resolveaddr_done(isc_task_t *task, isc_event_t *event) { - isc_result_t result; - int family; - dns_rdatatype_t qtype; - dns_clientresevent_t *rev = (dns_clientresevent_t *)event; - dns_name_t *name; - dns_rdataset_t *rdataset; - updatectx_t *uctx; - bool completed = false; - - UNUSED(task); - - REQUIRE(event->ev_arg != NULL); - uctx = *(updatectx_t **)event->ev_arg; - REQUIRE(UCTX_VALID(uctx)); - - if (event->ev_arg == &uctx->bp4) { - family = AF_INET; - qtype = dns_rdatatype_a; - LOCK(&uctx->lock); - dns_client_destroyrestrans(&uctx->restrans); - UNLOCK(&uctx->lock); - } else { - INSIST(event->ev_arg == &uctx->bp6); - family = AF_INET6; - qtype = dns_rdatatype_aaaa; - LOCK(&uctx->lock); - dns_client_destroyrestrans(&uctx->restrans2); - UNLOCK(&uctx->lock); - } - - result = rev->result; - if (result != ISC_R_SUCCESS) { - goto done; - } - - 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)) - { - if (!dns_rdataset_isassociated(rdataset)) { - continue; - } - if (rdataset->type != qtype) { - continue; - } - - for (result = dns_rdataset_first(rdataset); - result == ISC_R_SUCCESS; - result = dns_rdataset_next(rdataset)) - { - dns_rdata_t rdata; - dns_rdata_in_a_t rdata_a; - dns_rdata_in_aaaa_t rdata_aaaa; - isc_sockaddr_t *sa; - - sa = isc_mem_get(uctx->client->mctx, - sizeof(*sa)); - - dns_rdata_init(&rdata); - switch (family) { - case AF_INET: - dns_rdataset_current(rdataset, &rdata); - result = dns_rdata_tostruct( - &rdata, &rdata_a, NULL); - RUNTIME_CHECK(result == ISC_R_SUCCESS); - isc_sockaddr_fromin( - sa, &rdata_a.in_addr, 53); - dns_rdata_freestruct(&rdata_a); - break; - case AF_INET6: - dns_rdataset_current(rdataset, &rdata); - result = dns_rdata_tostruct( - &rdata, &rdata_aaaa, NULL); - RUNTIME_CHECK(result == ISC_R_SUCCESS); - isc_sockaddr_fromin6( - sa, &rdata_aaaa.in6_addr, 53); - dns_rdata_freestruct(&rdata_aaaa); - break; - } - - ISC_LINK_INIT(sa, link); - ISC_LIST_APPEND(uctx->servers, sa, link); - uctx->nservers++; - } - } - } - -done: - dns_client_freeresanswer(uctx->client, &rev->answerlist); - isc_event_free(&event); - - LOCK(&uctx->lock); - if (uctx->restrans == NULL && uctx->restrans2 == NULL) { - completed = true; - } - UNLOCK(&uctx->lock); - - if (completed) { - INSIST(uctx->currentserver == NULL); - uctx->currentserver = ISC_LIST_HEAD(uctx->servers); - if (uctx->currentserver != NULL && !uctx->canceled) { - send_update(uctx); - } else { - if (result == ISC_R_SUCCESS) { - result = ISC_R_NOTFOUND; - } - update_sendevent(uctx, result); - } - } -} - -static isc_result_t -process_soa(updatectx_t *uctx, dns_rdataset_t *soaset, - const dns_name_t *soaname) { - isc_result_t result; - dns_rdata_t soarr = DNS_RDATA_INIT; - dns_rdata_soa_t soa; - dns_name_t primary; - unsigned int resoptions; - - result = dns_rdataset_first(soaset); - if (result != ISC_R_SUCCESS) { - return (result); - } - dns_rdata_init(&soarr); - dns_rdataset_current(soaset, &soarr); - result = dns_rdata_tostruct(&soarr, &soa, NULL); - if (result != ISC_R_SUCCESS) { - return (result); - } - - dns_name_init(&primary, NULL); - dns_name_clone(&soa.origin, &primary); - - if (uctx->zonename == NULL) { - uctx->zonename = dns_fixedname_name(&uctx->zonefname); - dns_name_copynf(soaname, uctx->zonename); - } - - if (uctx->currentserver != NULL) { - result = send_update(uctx); - } else { - /* - * Get addresses of the primary server. We don't use the ADB - * feature so that we could avoid caching data. - */ - LOCK(&uctx->lock); - uctx->bp4 = uctx; - resoptions = 0; - if (uctx->want_tcp) { - resoptions |= DNS_CLIENTRESOPT_TCP; - } - result = dns_client_startresolve( - uctx->client, &primary, uctx->rdclass, dns_rdatatype_a, - resoptions, uctx->client->task, resolveaddr_done, - &uctx->bp4, &uctx->restrans); - if (result == ISC_R_SUCCESS) { - uctx->bp6 = uctx; - result = dns_client_startresolve( - uctx->client, &primary, uctx->rdclass, - dns_rdatatype_aaaa, resoptions, - uctx->client->task, resolveaddr_done, - &uctx->bp6, &uctx->restrans2); - } - UNLOCK(&uctx->lock); - } - - dns_rdata_freestruct(&soa); - - return (result); -} - -static void -receive_soa(isc_task_t *task, isc_event_t *event) { - dns_requestevent_t *reqev = NULL; - updatectx_t *uctx; - dns_client_t *client; - isc_result_t result, eresult; - dns_request_t *request; - dns_message_t *rcvmsg = NULL; - dns_section_t section; - dns_rdataset_t *soaset = NULL; - int pass = 0; - dns_name_t *name; - dns_message_t *soaquery = NULL; - isc_sockaddr_t *addr; - bool seencname = false; - bool droplabel = false; - dns_name_t tname; - unsigned int nlabels, reqoptions; - - UNUSED(task); - - REQUIRE(event->ev_type == DNS_EVENT_REQUESTDONE); - reqev = (dns_requestevent_t *)event; - request = reqev->request; - result = eresult = reqev->result; - POST(result); - uctx = reqev->ev_arg; - client = uctx->client; - soaquery = uctx->soaquery; - addr = uctx->currentserver; - INSIST(addr != NULL); - - isc_event_free(&event); - - if (eresult != ISC_R_SUCCESS) { - result = eresult; - goto out; - } - - dns_message_create(uctx->client->mctx, DNS_MESSAGE_INTENTPARSE, - &rcvmsg); - result = dns_request_getresponse(request, rcvmsg, - DNS_MESSAGEPARSE_PRESERVEORDER); - - if (result == DNS_R_TSIGERRORSET) { - dns_request_t *newrequest = NULL; - - /* Retry SOA request without TSIG */ - dns_message_detach(&rcvmsg); - dns_message_renderreset(uctx->soaquery); - reqoptions = 0; - if (uctx->want_tcp) { - reqoptions |= DNS_REQUESTOPT_TCP; - } - result = dns_request_createvia( - uctx->view->requestmgr, uctx->soaquery, NULL, addr, -1, - reqoptions, NULL, client->find_timeout * 20, - client->find_timeout, 3, uctx->client->task, - receive_soa, uctx, &newrequest); - if (result == ISC_R_SUCCESS) { - LOCK(&uctx->lock); - dns_request_destroy(&uctx->soareq); - uctx->soareq = newrequest; - UNLOCK(&uctx->lock); - - return; - } - goto out; - } - - section = DNS_SECTION_ANSWER; - POST(section); - - if (rcvmsg->rcode != dns_rcode_noerror && - rcvmsg->rcode != dns_rcode_nxdomain) { - result = rcode2result(rcvmsg->rcode); - goto out; - } - -lookforsoa: - if (pass == 0) { - section = DNS_SECTION_ANSWER; - } else if (pass == 1) { - section = DNS_SECTION_AUTHORITY; - } else { - droplabel = true; - goto out; - } - - result = dns_message_firstname(rcvmsg, section); - if (result != ISC_R_SUCCESS) { - pass++; - goto lookforsoa; - } - while (result == ISC_R_SUCCESS) { - name = NULL; - dns_message_currentname(rcvmsg, section, &name); - soaset = NULL; - result = dns_message_findtype(name, dns_rdatatype_soa, 0, - &soaset); - if (result == ISC_R_SUCCESS) { - break; - } - if (section == DNS_SECTION_ANSWER) { - dns_rdataset_t *tset = NULL; - if (dns_message_findtype(name, dns_rdatatype_cname, 0, - &tset) == ISC_R_SUCCESS || - dns_message_findtype(name, dns_rdatatype_dname, 0, - &tset) == ISC_R_SUCCESS) - { - seencname = true; - break; - } - } - - result = dns_message_nextname(rcvmsg, section); - } - - if (soaset == NULL && !seencname) { - pass++; - goto lookforsoa; - } - - if (seencname) { - droplabel = true; - goto out; - } - - result = process_soa(uctx, soaset, name); - -out: - if (droplabel) { - result = dns_message_firstname(soaquery, DNS_SECTION_QUESTION); - INSIST(result == ISC_R_SUCCESS); - name = NULL; - dns_message_currentname(soaquery, DNS_SECTION_QUESTION, &name); - nlabels = dns_name_countlabels(name); - if (nlabels == 1) { - result = DNS_R_SERVFAIL; /* is there a better error? */ - } else { - dns_name_init(&tname, NULL); - dns_name_getlabelsequence(name, 1, nlabels - 1, &tname); - dns_name_clone(&tname, name); - dns_request_destroy(&request); - LOCK(&uctx->lock); - uctx->soareq = NULL; - UNLOCK(&uctx->lock); - dns_message_renderreset(soaquery); - dns_message_settsigkey(soaquery, NULL); - reqoptions = 0; - if (uctx->want_tcp) { - reqoptions |= DNS_REQUESTOPT_TCP; - } - result = dns_request_createvia( - uctx->view->requestmgr, soaquery, NULL, - uctx->currentserver, -1, reqoptions, - uctx->tsigkey, client->find_timeout * 20, - client->find_timeout, 3, client->task, - receive_soa, uctx, &uctx->soareq); - } - } - - if (!droplabel || result != ISC_R_SUCCESS) { - dns_message_detach(&uctx->soaquery); - LOCK(&uctx->lock); - dns_request_destroy(&uctx->soareq); - UNLOCK(&uctx->lock); - } - - if (rcvmsg != NULL) { - dns_message_detach(&rcvmsg); - } - - if (result != ISC_R_SUCCESS) { - update_sendevent(uctx, result); - } -} - -static isc_result_t -request_soa(updatectx_t *uctx) { - isc_result_t result; - dns_message_t *soaquery = uctx->soaquery; - dns_name_t *name = NULL; - dns_rdataset_t *rdataset = NULL; - unsigned int reqoptions; - - if (soaquery == NULL) { - dns_message_create(uctx->client->mctx, DNS_MESSAGE_INTENTRENDER, - &soaquery); - } - soaquery->flags |= DNS_MESSAGEFLAG_RD; - result = dns_message_gettempname(soaquery, &name); - if (result != ISC_R_SUCCESS) { - goto fail; - } - result = dns_message_gettemprdataset(soaquery, &rdataset); - if (result != ISC_R_SUCCESS) { - goto fail; - } - dns_rdataset_makequestion(rdataset, uctx->rdclass, dns_rdatatype_soa); - dns_name_clone(uctx->firstname, name); - ISC_LIST_APPEND(name->list, rdataset, link); - dns_message_addname(soaquery, name, DNS_SECTION_QUESTION); - rdataset = NULL; - name = NULL; - reqoptions = 0; - if (uctx->want_tcp) { - reqoptions |= DNS_REQUESTOPT_TCP; - } - - result = dns_request_createvia( - uctx->view->requestmgr, soaquery, NULL, uctx->currentserver, -1, - reqoptions, uctx->tsigkey, uctx->client->find_timeout * 20, - uctx->client->find_timeout, 3, uctx->client->task, receive_soa, - uctx, &uctx->soareq); - if (result == ISC_R_SUCCESS) { - uctx->soaquery = soaquery; - return (ISC_R_SUCCESS); - } - -fail: - if (rdataset != NULL) { - ISC_LIST_UNLINK(name->list, rdataset, link); /* for safety */ - dns_message_puttemprdataset(soaquery, &rdataset); - } - if (name != NULL) { - dns_message_puttempname(soaquery, &name); - } - dns_message_detach(&soaquery); - - return (result); -} - -static void -resolvesoa_done(isc_task_t *task, isc_event_t *event) { - dns_clientresevent_t *rev = (dns_clientresevent_t *)event; - updatectx_t *uctx; - dns_name_t *name, tname; - dns_rdataset_t *rdataset = NULL; - isc_result_t result = rev->result; - unsigned int nlabels, resoptions; - - UNUSED(task); - - uctx = event->ev_arg; - REQUIRE(UCTX_VALID(uctx)); - - LOCK(&uctx->lock); - dns_client_destroyrestrans(&uctx->restrans); - UNLOCK(&uctx->lock); - - uctx = event->ev_arg; - if (result != ISC_R_SUCCESS && result != DNS_R_NCACHENXDOMAIN && - result != DNS_R_NCACHENXRRSET) - { - /* XXX: what about DNSSEC failure? */ - goto out; - } - - 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)) - { - if (dns_rdataset_isassociated(rdataset) && - rdataset->type == dns_rdatatype_soa) { - break; - } - } - } - - if (rdataset == NULL) { - /* Drop one label and retry resolution. */ - nlabels = dns_name_countlabels(&uctx->soaqname); - if (nlabels == 1) { - result = DNS_R_SERVFAIL; /* is there a better error? */ - goto out; - } - dns_name_init(&tname, NULL); - dns_name_getlabelsequence(&uctx->soaqname, 1, nlabels - 1, - &tname); - dns_name_clone(&tname, &uctx->soaqname); - resoptions = 0; - if (uctx->want_tcp) { - resoptions |= DNS_CLIENTRESOPT_TCP; - } - - result = dns_client_startresolve( - uctx->client, &uctx->soaqname, uctx->rdclass, - dns_rdatatype_soa, resoptions, uctx->client->task, - resolvesoa_done, uctx, &uctx->restrans); - } else { - result = process_soa(uctx, rdataset, &uctx->soaqname); - } - -out: - dns_client_freeresanswer(uctx->client, &rev->answerlist); - isc_event_free(&event); - - if (result != ISC_R_SUCCESS) { - update_sendevent(uctx, result); - } -} - -static isc_result_t -copy_name(isc_mem_t *mctx, dns_message_t *msg, const dns_name_t *name, - dns_name_t **newnamep) { - isc_result_t result; - dns_name_t *newname = NULL; - isc_region_t r; - isc_buffer_t *namebuf = NULL, *rdatabuf = NULL; - dns_rdatalist_t *rdatalist; - dns_rdataset_t *rdataset, *newrdataset; - dns_rdata_t rdata = DNS_RDATA_INIT, *newrdata; - - result = dns_message_gettempname(msg, &newname); - if (result != ISC_R_SUCCESS) { - return (result); - } - isc_buffer_allocate(mctx, &namebuf, DNS_NAME_MAXWIRE); - dns_name_init(newname, NULL); - dns_name_setbuffer(newname, namebuf); - dns_message_takebuffer(msg, &namebuf); - dns_name_copynf(name, newname); - - for (rdataset = ISC_LIST_HEAD(name->list); rdataset != NULL; - rdataset = ISC_LIST_NEXT(rdataset, link)) - { - rdatalist = NULL; - result = dns_message_gettemprdatalist(msg, &rdatalist); - if (result != ISC_R_SUCCESS) { - goto fail; - } - dns_rdatalist_init(rdatalist); - rdatalist->type = rdataset->type; - rdatalist->rdclass = rdataset->rdclass; - rdatalist->covers = rdataset->covers; - rdatalist->ttl = rdataset->ttl; - - result = dns_rdataset_first(rdataset); - while (result == ISC_R_SUCCESS) { - dns_rdata_reset(&rdata); - dns_rdataset_current(rdataset, &rdata); - - newrdata = NULL; - result = dns_message_gettemprdata(msg, &newrdata); - if (result != ISC_R_SUCCESS) { - goto fail; - } - dns_rdata_toregion(&rdata, &r); - rdatabuf = NULL; - isc_buffer_allocate(mctx, &rdatabuf, r.length); - isc_buffer_putmem(rdatabuf, r.base, r.length); - isc_buffer_usedregion(rdatabuf, &r); - dns_rdata_init(newrdata); - dns_rdata_fromregion(newrdata, rdata.rdclass, - rdata.type, &r); - newrdata->flags = rdata.flags; - - ISC_LIST_APPEND(rdatalist->rdata, newrdata, link); - dns_message_takebuffer(msg, &rdatabuf); - - result = dns_rdataset_next(rdataset); - } - - newrdataset = NULL; - result = dns_message_gettemprdataset(msg, &newrdataset); - if (result != ISC_R_SUCCESS) { - goto fail; - } - dns_rdatalist_tordataset(rdatalist, newrdataset); - - ISC_LIST_APPEND(newname->list, newrdataset, link); - } - - *newnamep = newname; - - return (ISC_R_SUCCESS); - -fail: - dns_message_puttempname(msg, &newname); - - return (result); -} - -static void -internal_update_callback(isc_task_t *task, isc_event_t *event) { - updatearg_t *uarg = event->ev_arg; - dns_clientupdateevent_t *uev = (dns_clientupdateevent_t *)event; - - UNUSED(task); - - LOCK(&uarg->lock); - - uarg->result = uev->result; - - dns_client_destroyupdatetrans(&uarg->trans); - isc_event_free(&event); - - if (!uarg->canceled) { - UNLOCK(&uarg->lock); - - /* Exit from the internal event loop */ - isc_app_ctxsuspend(uarg->actx); - } else { - /* - * We have already exited from the loop (due to some - * unexpected event). Just clean the arg up. - */ - UNLOCK(&uarg->lock); - isc_mutex_destroy(&uarg->lock); - isc_mem_put(uarg->client->mctx, uarg, sizeof(*uarg)); - } -} - -isc_result_t -dns_client_update(dns_client_t *client, dns_rdataclass_t rdclass, - const dns_name_t *zonename, dns_namelist_t *prerequisites, - dns_namelist_t *updates, isc_sockaddrlist_t *servers, - dns_tsec_t *tsec, unsigned int options) { - isc_result_t result; - isc_appctx_t *actx; - updatearg_t *uarg; - - REQUIRE(DNS_CLIENT_VALID(client)); - - if ((client->attributes & DNS_CLIENTATTR_OWNCTX) == 0 && - (options & DNS_CLIENTUPDOPT_ALLOWRUN) == 0) - { - /* - * If the client is run under application's control, we need - * to create a new running (sub)environment for this - * particular update. - */ - return (ISC_R_NOTIMPLEMENTED); /* XXXTBD */ - } else { - actx = client->actx; - } - - uarg = isc_mem_get(client->mctx, sizeof(*uarg)); - - isc_mutex_init(&uarg->lock); - - uarg->actx = actx; - uarg->client = client; - uarg->result = ISC_R_FAILURE; - uarg->trans = NULL; - uarg->canceled = false; - - result = dns_client_startupdate( - client, rdclass, zonename, prerequisites, updates, servers, - tsec, options, client->task, internal_update_callback, uarg, - &uarg->trans); - if (result != ISC_R_SUCCESS) { - isc_mutex_destroy(&uarg->lock); - isc_mem_put(client->mctx, uarg, sizeof(*uarg)); - return (result); - } - - /* - * Start internal event loop. It blocks until the entire process - * is completed. - */ - result = isc_app_ctxrun(actx); - - LOCK(&uarg->lock); - if (result == ISC_R_SUCCESS || result == ISC_R_SUSPEND) { - result = uarg->result; - } - - if (uarg->trans != NULL) { - /* - * Unusual termination (perhaps due to signal). We need some - * tricky cleanup process. - */ - uarg->canceled = true; - dns_client_cancelupdate(uarg->trans); - - UNLOCK(&uarg->lock); - - /* uarg will be freed in the event handler. */ - } else { - UNLOCK(&uarg->lock); - - isc_mutex_destroy(&uarg->lock); - isc_mem_put(client->mctx, uarg, sizeof(*uarg)); - } - - return (result); -} - -static void -startupdate(isc_task_t *task, isc_event_t *event) { - updatectx_t *uctx; - isc_result_t result; - unsigned int resoptions; - - REQUIRE(event != NULL); - - UNUSED(task); - - uctx = event->ev_arg; - - if (uctx->zonename != NULL && uctx->currentserver != NULL) { - result = send_update(uctx); - if (result != ISC_R_SUCCESS) { - goto fail; - } - } else if (uctx->currentserver != NULL) { - result = request_soa(uctx); - if (result != ISC_R_SUCCESS) { - goto fail; - } - } else { - resoptions = 0; - if (uctx->want_tcp) { - resoptions |= DNS_CLIENTRESOPT_TCP; - } - dns_name_clone(uctx->firstname, &uctx->soaqname); - result = dns_client_startresolve( - uctx->client, &uctx->soaqname, uctx->rdclass, - dns_rdatatype_soa, resoptions, uctx->client->task, - resolvesoa_done, uctx, &uctx->restrans); - if (result != ISC_R_SUCCESS) { - goto fail; - } - } - - isc_event_free(&event); - -fail: - if (result != ISC_R_SUCCESS) { - update_sendevent(uctx, result); - } -} - -isc_result_t -dns_client_startupdate(dns_client_t *client, dns_rdataclass_t rdclass, - const dns_name_t *zonename, - dns_namelist_t *prerequisites, dns_namelist_t *updates, - isc_sockaddrlist_t *servers, dns_tsec_t *tsec, - unsigned int options, isc_task_t *task, - isc_taskaction_t action, void *arg, - dns_clientupdatetrans_t **transp) { - dns_view_t *view = NULL; - isc_result_t result; - dns_name_t *name, *newname; - updatectx_t *uctx; - isc_task_t *tclone = NULL; - dns_section_t section = DNS_SECTION_UPDATE; - isc_sockaddr_t *server, *sa = NULL; - dns_tsectype_t tsectype = dns_tsectype_none; - bool want_tcp; - - UNUSED(options); - - REQUIRE(DNS_CLIENT_VALID(client)); - REQUIRE(transp != NULL && *transp == NULL); - REQUIRE(updates != NULL); - REQUIRE(task != NULL); - - if (tsec != NULL) { - tsectype = dns_tsec_gettype(tsec); - if (tsectype != dns_tsectype_tsig) { - return (ISC_R_NOTIMPLEMENTED); /* XXX */ - } - } - - LOCK(&client->lock); - result = dns_viewlist_find(&client->viewlist, DNS_CLIENTVIEW_NAME, - rdclass, &view); - UNLOCK(&client->lock); - if (result != ISC_R_SUCCESS) { - return (result); - } - - want_tcp = ((options & DNS_CLIENTUPDOPT_TCP) != 0); - - /* - * Create a context and prepare some resources. - */ - - uctx = isc_mem_get(client->mctx, sizeof(*uctx)); - - isc_mutex_init(&uctx->lock); - - tclone = NULL; - isc_task_attach(task, &tclone); - uctx->client = client; - ISC_LINK_INIT(uctx, link); - uctx->state = dns_clientupdatestate_prepare; - uctx->view = view; - uctx->rdclass = rdclass; - uctx->canceled = false; - uctx->updatemsg = NULL; - uctx->soaquery = NULL; - uctx->updatereq = NULL; - uctx->restrans = NULL; - uctx->restrans2 = NULL; - uctx->bp4 = NULL; - uctx->bp6 = NULL; - uctx->soareq = NULL; - uctx->event = NULL; - uctx->tsigkey = NULL; - uctx->sig0key = NULL; - uctx->zonename = NULL; - uctx->want_tcp = want_tcp; - dns_name_init(&uctx->soaqname, NULL); - ISC_LIST_INIT(uctx->servers); - uctx->nservers = 0; - uctx->currentserver = NULL; - dns_fixedname_init(&uctx->zonefname); - if (tsec != NULL) { - dns_tsec_getkey(tsec, &uctx->tsigkey); - } - uctx->event = (dns_clientupdateevent_t *)isc_event_allocate( - client->mctx, tclone, DNS_EVENT_UPDATEDONE, action, arg, - sizeof(*uctx->event)); - if (zonename != NULL) { - uctx->zonename = dns_fixedname_name(&uctx->zonefname); - dns_name_copynf(zonename, uctx->zonename); - } - if (servers != NULL) { - for (server = ISC_LIST_HEAD(*servers); server != NULL; - server = ISC_LIST_NEXT(server, link)) - { - sa = isc_mem_get(client->mctx, sizeof(*sa)); - sa->type = server->type; - sa->length = server->length; - ISC_LINK_INIT(sa, link); - ISC_LIST_APPEND(uctx->servers, sa, link); - if (uctx->currentserver == NULL) { - uctx->currentserver = sa; - } - uctx->nservers++; - } - } - - /* Make update message */ - dns_message_create(client->mctx, DNS_MESSAGE_INTENTRENDER, - &uctx->updatemsg); - uctx->updatemsg->opcode = dns_opcode_update; - - if (prerequisites != NULL) { - for (name = ISC_LIST_HEAD(*prerequisites); name != NULL; - name = ISC_LIST_NEXT(name, link)) - { - newname = NULL; - result = copy_name(client->mctx, uctx->updatemsg, name, - &newname); - if (result != ISC_R_SUCCESS) { - goto fail; - } - dns_message_addname(uctx->updatemsg, newname, - DNS_SECTION_PREREQUISITE); - } - } - - for (name = ISC_LIST_HEAD(*updates); name != NULL; - name = ISC_LIST_NEXT(name, link)) - { - newname = NULL; - result = copy_name(client->mctx, uctx->updatemsg, name, - &newname); - if (result != ISC_R_SUCCESS) { - goto fail; - } - dns_message_addname(uctx->updatemsg, newname, - DNS_SECTION_UPDATE); - } - - uctx->firstname = NULL; - result = dns_message_firstname(uctx->updatemsg, section); - if (result == ISC_R_NOMORE) { - section = DNS_SECTION_PREREQUISITE; - result = dns_message_firstname(uctx->updatemsg, section); - } - if (result != ISC_R_SUCCESS) { - goto fail; - } - dns_message_currentname(uctx->updatemsg, section, &uctx->firstname); - - uctx->magic = UCTX_MAGIC; - - LOCK(&client->lock); - ISC_LIST_APPEND(client->updatectxs, uctx, link); - isc_refcount_increment(&client->references); - UNLOCK(&client->lock); - - *transp = (dns_clientupdatetrans_t *)uctx; - result = isc_app_ctxonrun(client->actx, client->mctx, client->task, - startupdate, uctx); - if (result == ISC_R_ALREADYRUNNING) { - isc_event_t *event; - event = isc_event_allocate(client->mctx, dns_client_startupdate, - DNS_EVENT_STARTUPDATE, startupdate, - uctx, sizeof(*event)); - result = ISC_R_SUCCESS; - isc_task_send(task, &event); - } - if (result == ISC_R_SUCCESS) { - return (result); - } - - isc_refcount_decrement1(&client->references); - *transp = NULL; - -fail: - if (ISC_LINK_LINKED(uctx, link)) { - LOCK(&client->lock); - ISC_LIST_UNLINK(client->updatectxs, uctx, link); - UNLOCK(&client->lock); - } - if (uctx->updatemsg != NULL) { - dns_message_detach(&uctx->updatemsg); - } - while ((sa = ISC_LIST_HEAD(uctx->servers)) != NULL) { - ISC_LIST_UNLINK(uctx->servers, sa, link); - isc_mem_put(client->mctx, sa, sizeof(*sa)); - } - if (uctx->event != NULL) { - isc_event_free(ISC_EVENT_PTR(&uctx->event)); - } - if (uctx->tsigkey != NULL) { - dns_tsigkey_detach(&uctx->tsigkey); - } - isc_task_detach(&tclone); - isc_mutex_destroy(&uctx->lock); - uctx->magic = 0; - isc_mem_put(client->mctx, uctx, sizeof(*uctx)); - dns_view_detach(&view); - - return (result); -} - -void -dns_client_cancelupdate(dns_clientupdatetrans_t *trans) { - updatectx_t *uctx; - - REQUIRE(trans != NULL); - uctx = (updatectx_t *)trans; - REQUIRE(UCTX_VALID(uctx)); - - LOCK(&uctx->lock); - - if (!uctx->canceled) { - uctx->canceled = true; - if (uctx->updatereq != NULL) { - dns_request_cancel(uctx->updatereq); - } - if (uctx->soareq != NULL) { - dns_request_cancel(uctx->soareq); - } - if (uctx->restrans != NULL) { - dns_client_cancelresolve(uctx->restrans); - } - if (uctx->restrans2 != NULL) { - dns_client_cancelresolve(uctx->restrans2); - } - } - - UNLOCK(&uctx->lock); -} - -void -dns_client_destroyupdatetrans(dns_clientupdatetrans_t **transp) { - updatectx_t *uctx; - isc_mem_t *mctx; - dns_client_t *client; - isc_sockaddr_t *sa; - - REQUIRE(transp != NULL); - uctx = (updatectx_t *)*transp; - *transp = NULL; - REQUIRE(UCTX_VALID(uctx)); - client = uctx->client; - REQUIRE(DNS_CLIENT_VALID(client)); - REQUIRE(uctx->updatereq == NULL && uctx->updatemsg == NULL && - uctx->soareq == NULL && uctx->soaquery == NULL && - uctx->event == NULL && uctx->tsigkey == NULL && - uctx->sig0key == NULL); - - mctx = client->mctx; - dns_view_detach(&uctx->view); - while ((sa = ISC_LIST_HEAD(uctx->servers)) != NULL) { - ISC_LIST_UNLINK(uctx->servers, sa, link); - isc_mem_put(mctx, sa, sizeof(*sa)); - } - - LOCK(&client->lock); - - INSIST(ISC_LINK_LINKED(uctx, link)); - ISC_LIST_UNLINK(client->updatectxs, uctx, link); - - UNLOCK(&client->lock); - - isc_mutex_destroy(&uctx->lock); - uctx->magic = 0; - - isc_mem_put(mctx, uctx, sizeof(*uctx)); - - dns_client_destroy(&client); -} - -isc_mem_t * -dns_client_mctx(dns_client_t *client) { - REQUIRE(DNS_CLIENT_VALID(client)); - return (client->mctx); -} - -typedef struct { - isc_buffer_t buffer; - dns_rdataset_t rdataset; - dns_rdatalist_t rdatalist; - dns_rdata_t rdata; - size_t size; - isc_mem_t *mctx; - unsigned char data[]; -} dns_client_updaterec_t; - -isc_result_t -dns_client_updaterec(dns_client_updateop_t op, const dns_name_t *owner, - dns_rdatatype_t type, dns_rdata_t *source, dns_ttl_t ttl, - dns_name_t *target, dns_rdataset_t *rdataset, - dns_rdatalist_t *rdatalist, dns_rdata_t *rdata, - isc_mem_t *mctx) { - dns_client_updaterec_t *updaterec = NULL; - size_t size = offsetof(dns_client_updaterec_t, data); - - REQUIRE(op < updateop_max); - REQUIRE(owner != NULL); - REQUIRE((rdataset != NULL && rdatalist != NULL && rdata != NULL) || - (rdataset == NULL && rdatalist == NULL && rdata == NULL && - mctx != NULL)); - if (op == updateop_add) { - REQUIRE(source != NULL); - } - if (source != NULL) { - REQUIRE(source->type == type); - REQUIRE(op == updateop_add || op == updateop_delete || - op == updateop_exist); - } - - size += owner->length; - if (source != NULL) { - size += source->length; - } - - if (rdataset == NULL) { - updaterec = isc_mem_get(mctx, size); - rdataset = &updaterec->rdataset; - rdatalist = &updaterec->rdatalist; - rdata = &updaterec->rdata; - dns_rdataset_init(rdataset); - dns_rdatalist_init(&updaterec->rdatalist); - dns_rdata_init(&updaterec->rdata); - isc_buffer_init( - &updaterec->buffer, updaterec->data, - (unsigned int)(size - - offsetof(dns_client_updaterec_t, data))); - dns_name_copy(owner, target, &updaterec->buffer); - if (source != NULL) { - isc_region_t r; - dns_rdata_clone(source, rdata); - dns_rdata_toregion(rdata, &r); - rdata->data = isc_buffer_used(&updaterec->buffer); - isc_buffer_copyregion(&updaterec->buffer, &r); - } - updaterec->mctx = NULL; - isc_mem_attach(mctx, &updaterec->mctx); - } else if (source != NULL) { - dns_rdata_clone(source, rdata); - } - - switch (op) { - case updateop_add: - break; - case updateop_delete: - if (source != NULL) { - ttl = 0; - dns_rdata_makedelete(rdata); - } else { - dns_rdata_deleterrset(rdata, type); - } - break; - case updateop_notexist: - dns_rdata_notexist(rdata, type); - break; - case updateop_exist: - if (source == NULL) { - ttl = 0; - dns_rdata_exists(rdata, type); - } - case updateop_none: - break; - default: - INSIST(0); - ISC_UNREACHABLE(); - } - - rdatalist->type = rdata->type; - rdatalist->rdclass = rdata->rdclass; - if (source != NULL) { - rdatalist->covers = dns_rdata_covers(rdata); - rdatalist->ttl = ttl; - } - ISC_LIST_APPEND(rdatalist->rdata, rdata, link); - dns_rdatalist_tordataset(rdatalist, rdataset); - ISC_LIST_APPEND(target->list, rdataset, link); - if (updaterec != NULL) { - target->attributes |= DNS_NAMEATTR_HASUPDATEREC; - dns_name_setbuffer(target, &updaterec->buffer); - } - if (op == updateop_add || op == updateop_delete) { - target->attributes |= DNS_NAMEATTR_UPDATE; - } else { - target->attributes |= DNS_NAMEATTR_PREREQUISITE; - } - return (ISC_R_SUCCESS); -} - -void -dns_client_freeupdate(dns_name_t **namep) { - dns_client_updaterec_t *updaterec; - dns_rdatalist_t *rdatalist; - dns_rdataset_t *rdataset; - dns_rdata_t *rdata; - dns_name_t *name; - - REQUIRE(namep != NULL && *namep != NULL); - - name = *namep; - for (rdataset = ISC_LIST_HEAD(name->list); rdataset != NULL; - rdataset = ISC_LIST_HEAD(name->list)) - { - ISC_LIST_UNLINK(name->list, rdataset, link); - rdatalist = NULL; - dns_rdatalist_fromrdataset(rdataset, &rdatalist); - if (rdatalist == NULL) { - dns_rdataset_disassociate(rdataset); - continue; - } - for (rdata = ISC_LIST_HEAD(rdatalist->rdata); rdata != NULL; - rdata = ISC_LIST_HEAD(rdatalist->rdata)) - { - ISC_LIST_UNLINK(rdatalist->rdata, rdata, link); - } - dns_rdataset_disassociate(rdataset); - } - - if ((name->attributes & DNS_NAMEATTR_HASUPDATEREC) != 0) { - updaterec = (dns_client_updaterec_t *)name->buffer; - INSIST(updaterec != NULL); - isc_mem_putanddetach(&updaterec->mctx, updaterec, - updaterec->size); - *namep = NULL; - } -} diff --git a/lib/dns/include/dns/client.h b/lib/dns/include/dns/client.h index 82884c67b3..f7870e412f 100644 --- a/lib/dns/include/dns/client.h +++ b/lib/dns/include/dns/client.h @@ -112,15 +112,6 @@ typedef struct dns_clientresevent { dns_namelist_t answerlist; } dns_clientresevent_t; /* too long? */ -/*% - * Status of a dynamic update procedure. - */ -typedef enum { - dns_clientupdatestate_prepare, /*%< no updates have been sent */ - dns_clientupdatestate_sent, /*%< updates were sent, no response */ - dns_clientupdatestate_done /*%< update was sent and succeeded */ -} dns_clientupdatestate_t; - /*% * A dns_clientreqevent_t is sent when a DNS request is completed by a client. * 'result' stores the result code of the entire transaction. @@ -135,24 +126,6 @@ typedef struct dns_clientreqevent { dns_message_t *rmessage; } dns_clientreqevent_t; /* too long? */ -/*% - * A dns_clientupdateevent_t is sent when dynamic update performed by a client - * completes. 'result' stores the result code of the entire update procedure. - * 'state' specifies the status of the update procedure when this event is - * sent. This can be used as a hint by the receiver to determine whether - * the update attempt was ever made. In particular, if the state is - * dns_clientupdatestate_prepare, the receiver can be sure that the requested - * update was not applied. - */ -typedef struct dns_clientupdateevent { - ISC_EVENT_COMMON(struct dns_clientupdateevent); - isc_result_t result; - dns_clientupdatestate_t state; -} dns_clientupdateevent_t; /* too long? */ - -isc_result_t -dns_client_create(dns_client_t **clientp, unsigned int options); - isc_result_t dns_client_createx(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr, isc_socketmgr_t *socketmgr, isc_timermgr_t *timermgr, @@ -160,24 +133,16 @@ dns_client_createx(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr, const isc_sockaddr_t *localaddr4, const isc_sockaddr_t *localaddr6); /*%< - * Create a DNS client. These functions create a new client object with - * minimal internal resources such as the default 'view' for the IN class and - * IPv4/IPv6 dispatches for the view. + * Create a DNS client object with minimal internal resources, such as + * a default view for the IN class and IPv4/IPv6 dispatches for the view. * - * dns_client_createx() takes 'manager' arguments so that the caller can + * dns_client_create() takes 'manager' arguments so that the caller can * control the behavior of the client through the underlying event framework. - * On the other hand, dns_client_create() simplifies the interface and creates - * the managers internally. A DNS client object created via - * dns_client_create() is expected to be used by an application that only needs - * simple synchronous services or by a thread-based application. - * - * dns_client_createx2 takes two additional parameters, 'localaddr4' and - * 'localaddr6', to specify the local address to use for each family. If - * both are set to NULL, then wildcard addresses will be used for both - * families. If only one is NULL, then the other address will be used - * as the local address, and the other protocol family will not be used. - * - * dns_client_create(x) will create a cache database with the view. + * 'localaddr4' and 'localaddr6' specify the local addresses to use for + * each address family; if both are set to NULL, then wildcard addresses + * will be used for both families. If only one is NULL, then the other + * address will be used as the local address, and the NULL protocol family + * will not be used. * * Requires: * @@ -504,146 +469,6 @@ dns_client_destroyreqtrans(dns_clientreqtrans_t **transp); *\li *transp == NULL. */ -isc_result_t -dns_client_update(dns_client_t *client, dns_rdataclass_t rdclass, - const dns_name_t *zonename, dns_namelist_t *prerequisites, - dns_namelist_t *updates, isc_sockaddrlist_t *servers, - dns_tsec_t *tsec, unsigned int options); - -isc_result_t -dns_client_startupdate(dns_client_t *client, dns_rdataclass_t rdclass, - const dns_name_t *zonename, - dns_namelist_t *prerequisites, dns_namelist_t *updates, - isc_sockaddrlist_t *servers, dns_tsec_t *tsec, - unsigned int options, isc_task_t *task, - isc_taskaction_t action, void *arg, - dns_clientupdatetrans_t **transp); -/*%< - * Perform DNS dynamic update for 'updates' of the 'rdclass' class with - * optional 'prerequisites'. - * - * 'updates' are a list of names with associated RRsets to be updated. - * - * 'prerequisites' are a list of names with associated RRsets corresponding to - * the prerequisites of the updates. This is optional and can be NULL, in - * which case the prerequisite section of the update message will be empty. - * - * Both 'updates' and 'prerequisites' must be constructed as specified in - * RFC2136. - * - * 'zonename' is the name of the zone in which the updated names exist. - * This is optional and can be NULL. In this case, these functions internally - * identify the appropriate zone through some queries for the SOA RR starting - * with the first name in prerequisites or updates. - * - * 'servers' is a list of authoritative servers to which the update message - * should be sent. This is optional and can be NULL. In this case, these - * functions internally identify the appropriate primary server name and its - * addresses through some queries for the SOA RR (like the case of zonename) - * and supplemental A/AAAA queries for the server name. - * Note: The client module generally assumes the given addresses are of the - * primary server of the corresponding zone. It will work even if a secondary - * server address is specified as long as the server allows update forwarding, - * it is generally discouraged to include secondary server addresses unless - * there's strong reason to do so. - * - * 'tsec' is a transaction security object containing, e.g. a TSIG key for - * authenticating the update transaction (and the supplemental query/response - * transactions if the server is specified). This is optional and can be - * NULL, in which case the library tries the update without any transaction - * authentication. - * - * It is typically expected that the client object passed to - * dns_client_update() was created via dns_client_create() and has its own - * managers and contexts. However, if the DNS_CLIENTUPDOPT_ALLOWRUN flag is - * set in 'options', this function performs the synchronous service even if - * it does not have its own manager and context structures. - * - * dns_client_update() provides a synchronous service. This function blocks - * until the entire update procedure completes, including the additional - * queries when necessary. - * - * dns_client_startupdate() is an asynchronous version of dns_client_update(). - * It immediately returns (typically with *transp being set to a non-NULL - * pointer), and performs the update procedure through a set of internal - * events. All transactions including the additional query exchanges are - * performed as a separate event, so none of these events cause blocking - * operation. When the update procedure completes, the specified function - * 'action' will be called with the argument of a 'dns_clientupdateevent_t' - * structure. On return, '*transp' is set to an opaque transaction ID so that - * the caller can cancel this update process. - * - * DNS_CLIENTUPDOPT_TCP switches to the TCP (vs. UDP) transport. - * - * Requires: - * - *\li 'client' is a valid client. - * - *\li 'updates' != NULL. - * - *\li 'task' is a valid task. - * - *\li 'transp' != NULL && *transp == NULL; - * - * Returns: - * - *\li #ISC_R_SUCCESS On success. - * - *\li Anything else Failure. - */ - -void -dns_client_cancelupdate(dns_clientupdatetrans_t *trans); -/*%< - * Cancel an ongoing dynamic update procedure started via - * dns_client_startupdate(). - * - * Notes: - * - *\li If the update procedure has not completed, post its UPDATEDONE - * event with a result code of #ISC_R_CANCELED. - * - * Requires: - * - *\li 'trans' is a valid transaction ID. - */ - -void -dns_client_destroyupdatetrans(dns_clientupdatetrans_t **transp); -/*%< - * Destroy dynamic update transaction identified by '*transp'. - * - * Requires: - * - *\li '*transp' is a valid transaction ID. - * - *\li The caller has received the UPDATEDONE event (either because the - * update completed or because dns_client_cancelupdate() was called). - * - * Ensures: - * - *\li *transp == NULL. - */ - -isc_result_t -dns_client_updaterec(dns_client_updateop_t op, const dns_name_t *owner, - dns_rdatatype_t type, dns_rdata_t *source, dns_ttl_t ttl, - dns_name_t *target, dns_rdataset_t *rdataset, - dns_rdatalist_t *rdatalist, dns_rdata_t *rdata, - isc_mem_t *mctx); -/*%< - * TBD - */ - -void -dns_client_freeupdate(dns_name_t **namep); -/*%< - * TBD - */ - -isc_mem_t * -dns_client_mctx(dns_client_t *client); - ISC_LANG_ENDDECLS #endif /* DNS_CLIENT_H */ diff --git a/lib/dns/win32/libdns.def.in b/lib/dns/win32/libdns.def.in index b4163d90eb..80869fae80 100644 --- a/lib/dns/win32/libdns.def.in +++ b/lib/dns/win32/libdns.def.in @@ -135,25 +135,18 @@ dns_cert_totext dns_client_addtrustedkey dns_client_cancelrequest dns_client_cancelresolve -dns_client_cancelupdate dns_client_clearservers -dns_client_create dns_client_createx dns_client_destroy dns_client_destroyreqtrans dns_client_destroyrestrans -dns_client_destroyupdatetrans dns_client_freeresanswer -dns_client_freeupdate dns_client_mctx dns_client_request dns_client_resolve dns_client_setservers dns_client_startrequest dns_client_startresolve -dns_client_startupdate -dns_client_update -dns_client_updaterec dns_clientinfo_init dns_clientinfomethods_init dns_compress_add diff --git a/lib/samples/.gitignore b/lib/samples/.gitignore index 3d14fb9600..78d0640e1e 100644 --- a/lib/samples/.gitignore +++ b/lib/samples/.gitignore @@ -3,5 +3,3 @@ process resolve sample-async sample-gai -sample-request -sample-update diff --git a/lib/samples/Makefile.am b/lib/samples/Makefile.am index 54e2b5fc5d..9eb8ad1efb 100644 --- a/lib/samples/Makefile.am +++ b/lib/samples/Makefile.am @@ -8,8 +8,6 @@ AM_CPPFLAGS += \ noinst_PROGRAMS = \ resolve \ sample-async \ - sample-update \ - sample-request \ nsprobe resolve_SOURCES = resolve.c @@ -18,11 +16,5 @@ resolve_LDADD = $(LIBISC_LIBS) $(LIBIRS_LIBS) $(LIBDNS_LIBS) sample_async_SOURCES = sample-async.c sample_async_LDADD = $(LIBISC_LIBS) $(LIBDNS_LIBS) -sample_update_SOURCES = sample-update.c -sample_update_LDADD = $(LIBISC_LIBS) $(LIBDNS_LIBS) - -sample_request_SOURCES = sample-request.c -sample_request_LDADD = $(LIBISC_LIBS) $(LIBDNS_LIBS) - nsprobe_SOURCES = nsprobe.c nsprobe_LDADD = $(LIBISC_LIBS) $(LIBDNS_LIBS) diff --git a/lib/samples/sample-request.c b/lib/samples/sample-request.c deleted file mode 100644 index 00ff2d58d3..0000000000 --- a/lib/samples/sample-request.c +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright (C) Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, you can obtain one at https://mozilla.org/MPL/2.0/. - * - * See the COPYRIGHT file distributed with this work for additional - * information regarding copyright ownership. - */ - -#ifndef WIN32 -#include -#include -#include -#include -#include -#include -#endif /* ifndef WIN32 */ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -static isc_mem_t *mctx; -static dns_fixedname_t fixedqname; - -ISC_NORETURN static void -usage(void); - -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; - unsigned int namelen; - - REQUIRE(message != NULL); - REQUIRE(namestr != NULL); - - /* Construct qname */ - namelen = strlen(namestr); - isc_buffer_constinit(&b, namestr, namelen); - isc_buffer_add(&b, namelen); - qname0 = dns_fixedname_initname(&fixedqname); - result = dns_name_fromtext(qname0, &b, dns_rootname, 0, NULL); - if (result != ISC_R_SUCCESS) { - fprintf(stderr, "failed to convert qname: %u\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_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_detach(&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, gaierror; - 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 = isc_commandline_parse(argc, argv, "t:")) != -1) { - switch (ch) { - case 't': - tr.base = isc_commandline_argument; - tr.length = strlen(isc_commandline_argument); - result = dns_rdatatype_fromtext(&type, &tr); - if (result != ISC_R_SUCCESS) { - fprintf(stderr, "invalid RRtype: %s\n", - isc_commandline_argument); - exit(1); - } - break; - default: - usage(); - } - } - - argc -= isc_commandline_index; - argv += isc_commandline_index; - if (argc < 2) { - usage(); - } - - isc_lib_register(); - result = dns_lib_init(); - if (result != ISC_R_SUCCESS) { - fprintf(stderr, "dns_lib_init failed: %u\n", result); - exit(1); - } - - result = dns_client_create(&client, 0); - if (result != ISC_R_SUCCESS) { - fprintf(stderr, "dns_client_create failed: %u\n", result); - exit(1); - } - - /* Prepare message structures */ - mctx = NULL; - qmessage = NULL; - rmessage = NULL; - - isc_mem_create(&mctx); - dns_message_create(mctx, DNS_MESSAGE_INTENTRENDER, &qmessage); - dns_message_create(mctx, DNS_MESSAGE_INTENTPARSE, &rmessage); - - /* Initialize the nameserver address */ - memset(&hints, 0, sizeof(hints)); - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_DGRAM; - hints.ai_protocol = IPPROTO_UDP; -#ifdef AI_NUMERICHOST - hints.ai_flags = AI_NUMERICHOST; -#endif /* ifdef AI_NUMERICHOST */ - gaierror = getaddrinfo(argv[0], "53", &hints, &res); - if (gaierror != 0) { - fprintf(stderr, "getaddrinfo failed: %s\n", - gai_strerror(gaierror)); - exit(1); - } - INSIST(res->ai_addrlen <= sizeof(sa.type)); - memmove(&sa.type, res->ai_addr, res->ai_addrlen); - freeaddrinfo(res); - sa.length = (unsigned int)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; - isc_buffer_allocate(mctx, &outputbuf, 65535); - for (i = 0; i < DNS_SECTION_MAX; i++) { - print_section(rmessage, i, outputbuf); - isc_buffer_clear(outputbuf); - } - isc_buffer_free(&outputbuf); - - /* Cleanup */ - dns_message_detach(&qmessage); - dns_message_detach(&rmessage); - isc_mem_destroy(&mctx); - dns_client_destroy(&client); - dns_lib_shutdown(); - - return (0); -} diff --git a/lib/samples/sample-update.c b/lib/samples/sample-update.c deleted file mode 100644 index b3d8b73c71..0000000000 --- a/lib/samples/sample-update.c +++ /dev/null @@ -1,781 +0,0 @@ -/* - * Copyright (C) Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, you can obtain one at https://mozilla.org/MPL/2.0/. - * - * See the COPYRIGHT file distributed with this work for additional - * information regarding copyright ownership. - */ - -#ifndef WIN32 -#include -#include -#include -#include -#include -#include -#endif /* ifndef WIN32 */ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -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 const char *port = "53"; - -static void -setup_tsec(char *keyfile, isc_mem_t *mctx); -static void -update_addordelete(isc_mem_t *mctx, char *cmdline, bool isdelete, - dns_name_t *name); -static void -evaluate_prereq(isc_mem_t *mctx, char *cmdline, dns_name_t *name); - -ISC_NORETURN static void -usage(void); - -static void -usage(void) { - fprintf(stderr, "sample-update " - "-s " - "[-a auth_server] " - "[-k keyfile] " - "[-p prerequisite] " - "[-r recursive_server] " - "[-z zonename] " - "(add|delete) \"name TTL RRtype RDATA\"\n"); - exit(1); -} - -#ifdef _WIN32 -static void -InitSockets(void) { - WORD wVersionRequested; - WSADATA wsaData; - int err; - - wVersionRequested = MAKEWORD(2, 0); - - err = WSAStartup(wVersionRequested, &wsaData); - if (err != 0) { - fprintf(stderr, "WSAStartup() failed: %d\n", err); - exit(1); - } -} - -static void -DestroySockets(void) { - WSACleanup(); -} -#else /* ifdef _WIN32 */ -#define InitSockets() ((void)0) -#define DestroySockets() ((void)0) -#endif /* ifdef _WIN32 */ - -static bool -addserver(const char *server, isc_sockaddrlist_t *list, - isc_sockaddr_t *sockaddr) { - struct addrinfo hints, *res; - int gaierror; - - memset(&hints, 0, sizeof(hints)); - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_DGRAM; - hints.ai_protocol = IPPROTO_UDP; -#ifdef AI_NUMERICHOST - hints.ai_flags |= AI_NUMERICHOST; -#endif /* ifdef AI_NUMERICHOST */ -#ifdef AI_NUMERICSERV - hints.ai_flags |= AI_NUMERICSERV; -#endif /* ifdef AI_NUMERICSERV */ - InitSockets(); - gaierror = getaddrinfo(server, port, &hints, &res); - if (gaierror != 0) { - fprintf(stderr, "getaddrinfo(%s) failed: %s\n", server, - gai_strerror(gaierror)); - DestroySockets(); - return (false); - } - INSIST(res->ai_addrlen <= sizeof(sockaddr->type)); - memmove(&sockaddr->type, res->ai_addr, res->ai_addrlen); - sockaddr->length = (unsigned int)res->ai_addrlen; - ISC_LINK_INIT(sockaddr, link); - ISC_LIST_APPEND(*list, sockaddr, link); - freeaddrinfo(res); - DestroySockets(); - return (true); -} - -int -main(int argc, char *argv[]) { - int ch; - dns_client_t *client = NULL; - char *zonenamestr = NULL; - char *keyfilename = NULL; - char *prereqstr = NULL; - isc_sockaddr_t sa_auth[10], sa_recursive[10]; - unsigned int nsa_auth = 0, nsa_recursive = 0; - isc_sockaddrlist_t rec_servers; - isc_sockaddrlist_t auth_servers, *auth_serversp = &auth_servers; - isc_result_t result; - bool isdelete; - isc_buffer_t b, *buf; - dns_fixedname_t zname0, pname0, uname0; - unsigned int 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; - bool sendtwice = false; - - ISC_LIST_INIT(auth_servers); - ISC_LIST_INIT(rec_servers); - - while ((ch = isc_commandline_parse(argc, argv, "a:k:p:P:r:sz:")) != EOF) - { - switch (ch) { - case 'k': - keyfilename = isc_commandline_argument; - break; - case 'a': - if (nsa_auth < sizeof(sa_auth) / sizeof(*sa_auth) && - addserver(isc_commandline_argument, &auth_servers, - &sa_auth[nsa_auth])) - { - nsa_auth++; - } - break; - case 'p': - prereqstr = isc_commandline_argument; - break; - case 'P': - port = isc_commandline_argument; - break; - case 'r': - if (nsa_recursive < sizeof(sa_recursive) / - sizeof(*sa_recursive) && - addserver(isc_commandline_argument, &rec_servers, - &sa_recursive[nsa_recursive])) - { - nsa_recursive++; - } - break; - case 's': - sendtwice = true; - break; - case 'z': - zonenamestr = isc_commandline_argument; - break; - default: - usage(); - } - } - - argc -= isc_commandline_index; - argv += isc_commandline_index; - if (argc < 2) { - usage(); - } - - /* command line argument validation */ - if (strcmp(argv[0], "delete") == 0) { - isdelete = true; - } else if (strcmp(argv[0], "add") == 0) { - isdelete = false; - } else { - fprintf(stderr, "invalid update command: %s\n", argv[0]); - exit(1); - } - - if (ISC_LIST_HEAD(auth_servers) == NULL && - ISC_LIST_HEAD(rec_servers) == NULL) { - fprintf(stderr, "authoritative or recursive servers " - "must be specified\n"); - usage(); - } - - /* Initialization */ - ISC_LIST_INIT(usedbuffers); - ISC_LIST_INIT(usedrdatalists); - ISC_LIST_INIT(prereqlist); - isc_lib_register(); - result = dns_lib_init(); - if (result != ISC_R_SUCCESS) { - fprintf(stderr, "dns_lib_init failed: %u\n", result); - exit(1); - } - isc_mem_create(&umctx); - - result = dns_client_create(&client, 0); - if (result != ISC_R_SUCCESS) { - fprintf(stderr, "dns_client_create failed: %u\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); - zname = dns_fixedname_initname(&zname0); - result = dns_name_fromtext(zname, &b, dns_rootname, 0, NULL); - if (result != ISC_R_SUCCESS) { - fprintf(stderr, "failed to convert zone name: %u\n", - result); - } - } - - /* Construct prerequisite name (if given) */ - if (prereqstr != NULL) { - pname = dns_fixedname_initname(&pname0); - evaluate_prereq(umctx, prereqstr, pname); - ISC_LIST_APPEND(prereqlist, pname, link); - prereqlistp = &prereqlist; - } - - /* Construct update name */ - ISC_LIST_INIT(updatelist); - uname = dns_fixedname_initname(&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); - } - - if (ISC_LIST_HEAD(auth_servers) == NULL) { - auth_serversp = NULL; - } - - /* Perform update */ - result = dns_client_update(client, default_rdataclass, /* XXX: fixed */ - zname, prereqlistp, &updatelist, - auth_serversp, tsec, 0); - if (result != ISC_R_SUCCESS) { - fprintf(stderr, "update failed: %s\n", - dns_result_totext(result)); - } else { - fprintf(stderr, "update succeeded\n"); - } - - if (sendtwice) { - /* Perform 2nd update */ - result = dns_client_update(client, default_rdataclass, /* XXX: - * fixed - */ - zname, prereqlistp, &updatelist, - auth_serversp, tsec, 0); - if (result != ISC_R_SUCCESS) { - fprintf(stderr, "2nd update failed: %s\n", - dns_result_totext(result)); - } else { - fprintf(stderr, "2nd 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"); - isc_buffer_allocate(mctx, &buf, MAXWIRE); - 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); - isc_buffer_allocate(mctx, &newbuf, r.length); - 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, bool isdelete, - dns_name_t *name) { - isc_result_t result; - 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)); - 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)); - dns_rdatalist_init(rdatalist); - rdatalist->type = rdatatype; - rdatalist->rdclass = rdataclass; - rdatalist->covers = rdatatype; - rdatalist->ttl = (dns_ttl_t)ttl; - ISC_LIST_APPEND(rdatalist->rdata, rdata, link); - ISC_LIST_APPEND(usedrdatalists, rdatalist, link); - - rdataset = isc_mem_get(mctx, sizeof(*rdataset)); - dns_rdataset_init(rdataset); - dns_rdatalist_tordataset(rdatalist, rdataset); - dns_rdataset_setownercase(rdataset, name); - ISC_LIST_INIT(name->list); - ISC_LIST_APPEND(name->list, rdataset, link); -} - -static void -make_prereq(isc_mem_t *mctx, char *cmdline, bool ispositive, bool 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)); - 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)); - 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; - } - rdata->rdclass = rdatalist->rdclass; - rdata->type = rdatatype; - ISC_LIST_APPEND(rdatalist->rdata, rdata, link); - ISC_LIST_APPEND(usedrdatalists, rdatalist, link); - - rdataset = isc_mem_get(mctx, sizeof(*rdataset)); - dns_rdataset_init(rdataset); - dns_rdatalist_tordataset(rdatalist, rdataset); - dns_rdataset_setownercase(rdataset, name); - 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; - bool 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 = false; - isrrset = false; - } else if (strcasecmp(word, "yxdomain") == 0) { - ispositive = true; - isrrset = false; - } else if (strcasecmp(word, "nxrrset") == 0) { - ispositive = false; - isrrset = true; - } else if (strcasecmp(word, "yxrrset") == 0) { - ispositive = true; - isrrset = 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/lib/samples/win32/request.vcxproj.filters.in b/lib/samples/win32/request.vcxproj.filters.in deleted file mode 100644 index 9edd41d41d..0000000000 --- a/lib/samples/win32/request.vcxproj.filters.in +++ /dev/null @@ -1,22 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - \ No newline at end of file diff --git a/lib/samples/win32/request.vcxproj.in b/lib/samples/win32/request.vcxproj.in deleted file mode 100644 index 40045e3781..0000000000 --- a/lib/samples/win32/request.vcxproj.in +++ /dev/null @@ -1,127 +0,0 @@ - - - - - Debug - @PLATFORM@ - - - Release - @PLATFORM@ - - - - {FF440E85-7450-439C-82EE-04C464512D0E} - Win32Proj - request - @WINDOWS_TARGET_PLATFORM_VERSION@ - - - - Application - true - MultiByte - @PLATFORM_TOOLSET@ - - - Application - false - true - MultiByte - @PLATFORM_TOOLSET@ - - - - - - - - - - - - - true - ..\..\..\Build\$(Configuration)\ - .\$(Configuration)\ - None - - - false - ..\..\..\Build\$(Configuration)\ - .\$(Configuration)\ - None - - - - - - Level4 - false - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - .\$(Configuration)\$(TargetName).pch - .\$(Configuration)\ - .\$(Configuration)\ - $(OutDir)$(TargetName).pdb - true - ..\..\..\config.h - .\;..\..\..\;@LIBXML2_INC@@OPENSSL_INC@..\..\isc\win32;..\..\isc\win32\include;..\..\isc\include;..\..\dns\win32\include;..\..\dns\include;%(AdditionalIncludeDirectories) - CompileAsC - - - Console - true - ..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) - ..\..\isc\win32\$(Configuration);..\..\dns\win32\$(Configuration);%(AdditionalLibraryDirectories) - @OPENSSL_LIBCRYPTO@@OPENSSL_LIBSSL@libisc.lib;libdns.lib;ws2_32.lib;%(AdditionalDependencies) - - - - - Level1 - true - - - MaxSpeed - true - @INTRINSIC@ - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - OnlyExplicitInline - false - true - .\$(Configuration)\$(TargetName).pch - .\$(Configuration)\ - .\$(Configuration)\ - $(OutDir)$(TargetName).pdb - ..\..\..\config.h - .\;..\..\..\;@LIBXML2_INC@@OPENSSL_INC@..\..\isc\win32;..\..\isc\win32\include;..\..\isc\include;..\..\dns\win32\include;..\..\dns\include;%(AdditionalIncludeDirectories) - CompileAsC - - - Console - false - true - true - ..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) - Default - ..\..\isc\win32\$(Configuration);..\..\dns\win32\$(Configuration);%(AdditionalLibraryDirectories) - @OPENSSL_LIBCRYPTO@@OPENSSL_LIBSSL@libisc.lib;libdns.lib;ws2_32.lib;%(AdditionalDependencies) - - - - - - - - {3840E563-D180-4761-AA9C-E6155F02EAFF} - - - {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} - - - - - - diff --git a/lib/samples/win32/request.vcxproj.user b/lib/samples/win32/request.vcxproj.user deleted file mode 100644 index ace9a86acb..0000000000 --- a/lib/samples/win32/request.vcxproj.user +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/lib/samples/win32/update.vcxproj.filters.in b/lib/samples/win32/update.vcxproj.filters.in deleted file mode 100644 index 8479fba535..0000000000 --- a/lib/samples/win32/update.vcxproj.filters.in +++ /dev/null @@ -1,22 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - \ No newline at end of file diff --git a/lib/samples/win32/update.vcxproj.in b/lib/samples/win32/update.vcxproj.in deleted file mode 100644 index 7e125d77a4..0000000000 --- a/lib/samples/win32/update.vcxproj.in +++ /dev/null @@ -1,127 +0,0 @@ - - - - - Debug - @PLATFORM@ - - - Release - @PLATFORM@ - - - - {05682E12-523F-4DAE-8E6D-ADFDBC308AFD} - Win32Proj - update - @WINDOWS_TARGET_PLATFORM_VERSION@ - - - - Application - true - MultiByte - @PLATFORM_TOOLSET@ - - - Application - false - true - MultiByte - @PLATFORM_TOOLSET@ - - - - - - - - - - - - - true - ..\..\..\Build\$(Configuration)\ - .\$(Configuration)\ - None - - - false - ..\..\..\Build\$(Configuration)\ - .\$(Configuration)\ - None - - - - - - Level4 - false - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - .\$(Configuration)\$(TargetName).pch - .\$(Configuration)\ - .\$(Configuration)\ - $(OutDir)$(TargetName).pdb - true - ..\..\..\config.h - .\;..\..\..\;@LIBXML2_INC@@OPENSSL_INC@..\..\isc\win32;..\..\isc\win32\include;..\..\isc\include;..\..\dns\win32\include;..\..\dns\include;%(AdditionalIncludeDirectories) - CompileAsC - - - Console - true - ..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) - ..\..\isc\win32\$(Configuration);..\..\dns\win32\$(Configuration);%(AdditionalLibraryDirectories) - @OPENSSL_LIBCRYPTO@@OPENSSL_LIBSSL@libisc.lib;libdns.lib;ws2_32.lib;%(AdditionalDependencies) - - - - - Level1 - true - - - MaxSpeed - true - @INTRINSIC@ - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - OnlyExplicitInline - false - true - .\$(Configuration)\$(TargetName).pch - .\$(Configuration)\ - .\$(Configuration)\ - $(OutDir)$(TargetName).pdb - ..\..\..\config.h - .\;..\..\..\;@LIBXML2_INC@@OPENSSL_INC@..\..\isc\win32;..\..\isc\win32\include;..\..\isc\include;..\..\dns\win32\include;..\..\dns\include;%(AdditionalIncludeDirectories) - CompileAsC - - - Console - false - true - true - ..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) - Default - ..\..\isc\win32\$(Configuration);..\..\dns\win32\$(Configuration);%(AdditionalLibraryDirectories) - @OPENSSL_LIBCRYPTO@@OPENSSL_LIBSSL@libisc.lib;libdns.lib;ws2_32.lib;%(AdditionalDependencies) - - - - - - - - {3840E563-D180-4761-AA9C-E6155F02EAFF} - - - {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} - - - - - - diff --git a/lib/samples/win32/update.vcxproj.user b/lib/samples/win32/update.vcxproj.user deleted file mode 100644 index ace9a86acb..0000000000 --- a/lib/samples/win32/update.vcxproj.user +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/util/copyrights b/util/copyrights index feb63b8979..e46a3c90ce 100644 --- a/util/copyrights +++ b/util/copyrights @@ -2193,23 +2193,15 @@ ./lib/samples/resolve.c C 2009,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021 ./lib/samples/rootkey.sh SH 2013,2016,2018,2019,2020,2021 ./lib/samples/sample-async.c C 2009,2013,2014,2015,2016,2018,2019,2020,2021 -./lib/samples/sample-request.c C 2009,2012,2013,2014,2015,2016,2018,2019,2020,2021 -./lib/samples/sample-update.c C 2009,2010,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021 ./lib/samples/win32/async.vcxproj.filters.in X 2014,2015,2018,2019,2020 ./lib/samples/win32/async.vcxproj.in X 2014,2015,2016,2017,2018,2019,2020 ./lib/samples/win32/async.vcxproj.user X 2014,2018,2019,2020,2021 ./lib/samples/win32/nsprobe.vcxproj.filters.in X 2014,2015,2018,2019,2020 ./lib/samples/win32/nsprobe.vcxproj.in X 2014,2015,2016,2017,2018,2019,2020 ./lib/samples/win32/nsprobe.vcxproj.user X 2014,2018,2019,2020,2021 -./lib/samples/win32/request.vcxproj.filters.in X 2014,2015,2018,2019,2020 -./lib/samples/win32/request.vcxproj.in X 2014,2015,2016,2017,2018,2019,2020 -./lib/samples/win32/request.vcxproj.user X 2014,2018,2019,2020,2021 ./lib/samples/win32/resolve.vcxproj.filters.in X 2014,2015,2018,2019,2020 ./lib/samples/win32/resolve.vcxproj.in X 2014,2015,2016,2017,2018,2019,2020 ./lib/samples/win32/resolve.vcxproj.user X 2014,2018,2019,2020,2021 -./lib/samples/win32/update.vcxproj.filters.in X 2014,2015,2018,2019,2020 -./lib/samples/win32/update.vcxproj.in X 2014,2015,2016,2017,2018,2019,2020 -./lib/samples/win32/update.vcxproj.user X 2014,2018,2019,2020,2021 ./lib/win32/bindevt/bindevt.c C 2000,2001,2004,2007,2016,2018,2019,2020,2021 ./lib/win32/bindevt/bindevt.mc X 2001,2004,2007,2016,2018,2019,2020,2021 ./lib/win32/bindevt/bindevt.vcxproj.filters.in X 2013,2015,2018,2019,2020 diff --git a/win32utils/Configure b/win32utils/Configure index 57e94d70a4..42660889d2 100644 --- a/win32utils/Configure +++ b/win32utils/Configure @@ -133,10 +133,6 @@ my @projectlist = ("../bin/check/win32/checkconf.vcxproj", "../lib/samples/win32/resolve.vcxproj.filters", "../lib/samples/win32/async.vcxproj", "../lib/samples/win32/async.vcxproj.filters", - "../lib/samples/win32/update.vcxproj", - "../lib/samples/win32/update.vcxproj.filters", - "../lib/samples/win32/request.vcxproj", - "../lib/samples/win32/request.vcxproj.filters", "../lib/samples/win32/nsprobe.vcxproj", "../lib/samples/win32/nsprobe.vcxproj.filters", "../lib/win32/bindevt/bindevt.vcxproj", diff --git a/win32utils/bind9.sln.in b/win32utils/bind9.sln.in index fe004aece3..3da2ffe9a6 100644 --- a/win32utils/bind9.sln.in +++ b/win32utils/bind9.sln.in @@ -29,10 +29,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "async", "..\lib\samples\win EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gai", "..\lib\samples\win32\gai.vcxproj", "{D42B8670-8DF6-4D90-90F7-DB5FB845AFAE}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "update", "..\lib\samples\win32\update.vcxproj", "{05682E12-523F-4DAE-8E6D-ADFDBC308AFD}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "request", "..\lib\samples\win32\request.vcxproj", "{FF440E85-7450-439C-82EE-04C464512D0E}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nsprobe", "..\lib\samples\win32\nsprobe.vcxproj", "{CB2A29F6-E73B-40AB-8AC4-2C1AAE7280BD}" EndProject @END SAMPLES From 1beb05f3e2f02198f867e182cda61fb19728ce73 Mon Sep 17 00:00:00 2001 From: Evan Hunt Date: Mon, 22 Mar 2021 18:14:37 -0700 Subject: [PATCH 2/6] remove dns_client_request() and related code continues the cleanup of dns_client started in the previous commit. --- bin/win32/BINDInstall/BINDInstall.vcxproj.in | 3 - lib/dns/client.c | 337 ----- lib/dns/win32/libdns.def.in | 5 - lib/samples/.gitignore | 1 - lib/samples/Makefile.am | 6 +- lib/samples/nsprobe.c | 1234 ------------------ lib/samples/win32/nsprobe.vcxproj.filters.in | 22 - lib/samples/win32/nsprobe.vcxproj.in | 127 -- lib/samples/win32/nsprobe.vcxproj.user | 3 - util/copyrights | 4 - win32utils/Configure | 2 - win32utils/bind9.sln.in | 2 - 12 files changed, 1 insertion(+), 1745 deletions(-) delete mode 100644 lib/samples/nsprobe.c delete mode 100644 lib/samples/win32/nsprobe.vcxproj.filters.in delete mode 100644 lib/samples/win32/nsprobe.vcxproj.in delete mode 100644 lib/samples/win32/nsprobe.vcxproj.user diff --git a/bin/win32/BINDInstall/BINDInstall.vcxproj.in b/bin/win32/BINDInstall/BINDInstall.vcxproj.in index 9e70c009b5..5ace7e97ef 100644 --- a/bin/win32/BINDInstall/BINDInstall.vcxproj.in +++ b/bin/win32/BINDInstall/BINDInstall.vcxproj.in @@ -305,9 +305,6 @@ {D42B8670-8DF6-4D90-90F7-DB5FB845AFAE} - - {CB2A29F6-E73B-40AB-8AC4-2C1AAE7280BD} - {F66D8B7E-721D-4602-99AD-820D19AD1313} diff --git a/lib/dns/client.c b/lib/dns/client.c index 701202503b..ee63e8a21c 100644 --- a/lib/dns/client.c +++ b/lib/dns/client.c @@ -56,9 +56,6 @@ #define RCTX_MAGIC ISC_MAGIC('R', 'c', 't', 'x') #define RCTX_VALID(c) ISC_MAGIC_VALID(c, RCTX_MAGIC) -#define REQCTX_MAGIC ISC_MAGIC('R', 'q', 'c', 'x') -#define REQCTX_VALID(c) ISC_MAGIC_VALID(c, REQCTX_MAGIC) - #define UCTX_MAGIC ISC_MAGIC('U', 'c', 't', 'x') #define UCTX_VALID(c) ISC_MAGIC_VALID(c, UCTX_MAGIC) @@ -103,7 +100,6 @@ struct dns_client { /* Locked */ dns_viewlist_t viewlist; ISC_LIST(struct resctx) resctxs; - ISC_LIST(struct reqctx) reqctxs; }; #define DEF_FIND_TIMEOUT 5 @@ -157,39 +153,6 @@ typedef struct resarg { bool canceled; } resarg_t; -/*% - * Internal state for a single DNS request - */ -typedef struct reqctx { - /* Unlocked */ - unsigned int magic; - isc_mutex_t lock; - dns_client_t *client; - unsigned int parseoptions; - - /* Locked */ - ISC_LINK(struct reqctx) link; - bool canceled; - dns_tsigkey_t *tsigkey; - dns_request_t *request; - dns_clientreqevent_t *event; -} reqctx_t; - -/*% - * Argument of an internal event for synchronous DNS request. - */ -typedef struct reqarg { - /* Unlocked */ - isc_appctx_t *actx; - dns_client_t *client; - isc_mutex_t lock; - - /* Locked */ - isc_result_t result; - dns_clientreqtrans_t *trans; - bool canceled; -} reqarg_t; - static void client_resfind(resctx_t *rctx, dns_fetchevent_t *event); @@ -415,7 +378,6 @@ dns_client_createx(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr, dns_view_freeze(view); /* too early? */ ISC_LIST_INIT(client->resctxs); - ISC_LIST_INIT(client->reqctxs); client->mctx = NULL; isc_mem_attach(mctx, &client->mctx); @@ -1404,302 +1366,3 @@ cleanup: } return (result); } - -/*% - * Simple request routines - */ -static void -request_done(isc_task_t *task, isc_event_t *event) { - dns_requestevent_t *reqev = NULL; - dns_request_t *request; - isc_result_t result, eresult; - reqctx_t *ctx; - - UNUSED(task); - - REQUIRE(event->ev_type == DNS_EVENT_REQUESTDONE); - reqev = (dns_requestevent_t *)event; - request = reqev->request; - result = eresult = reqev->result; - ctx = reqev->ev_arg; - REQUIRE(REQCTX_VALID(ctx)); - - isc_event_free(&event); - - LOCK(&ctx->lock); - - if (eresult == ISC_R_SUCCESS) { - result = dns_request_getresponse(request, ctx->event->rmessage, - ctx->parseoptions); - } - - if (ctx->tsigkey != NULL) { - dns_tsigkey_detach(&ctx->tsigkey); - } - - if (ctx->canceled) { - ctx->event->result = ISC_R_CANCELED; - } else { - ctx->event->result = result; - } - task = ctx->event->ev_sender; - ctx->event->ev_sender = ctx; - isc_task_sendanddetach(&task, ISC_EVENT_PTR(&ctx->event)); - - UNLOCK(&ctx->lock); -} - -static void -localrequest_done(isc_task_t *task, isc_event_t *event) { - reqarg_t *reqarg = event->ev_arg; - dns_clientreqevent_t *rev = (dns_clientreqevent_t *)event; - - UNUSED(task); - - REQUIRE(event->ev_type == DNS_EVENT_CLIENTREQDONE); - - LOCK(&reqarg->lock); - - reqarg->result = rev->result; - dns_client_destroyreqtrans(&reqarg->trans); - isc_event_free(&event); - - if (!reqarg->canceled) { - UNLOCK(&reqarg->lock); - - /* Exit from the internal event loop */ - isc_app_ctxsuspend(reqarg->actx); - } else { - /* - * We have already exited from the loop (due to some - * unexpected event). Just clean the arg up. - */ - UNLOCK(&reqarg->lock); - isc_mutex_destroy(&reqarg->lock); - isc_mem_put(reqarg->client->mctx, reqarg, sizeof(*reqarg)); - } -} - -isc_result_t -dns_client_request(dns_client_t *client, dns_message_t *qmessage, - dns_message_t *rmessage, const isc_sockaddr_t *server, - unsigned int options, unsigned int parseoptions, - dns_tsec_t *tsec, unsigned int timeout, - unsigned int udptimeout, unsigned int udpretries) { - isc_appctx_t *actx; - reqarg_t *reqarg; - isc_result_t result; - - REQUIRE(DNS_CLIENT_VALID(client)); - REQUIRE(qmessage != NULL); - REQUIRE(rmessage != NULL); - - if ((client->attributes & DNS_CLIENTATTR_OWNCTX) == 0 && - (options & DNS_CLIENTREQOPT_ALLOWRUN) == 0) - { - /* - * If the client is run under application's control, we need - * to create a new running (sub)environment for this - * particular resolution. - */ - return (ISC_R_NOTIMPLEMENTED); /* XXXTBD */ - } else { - actx = client->actx; - } - - reqarg = isc_mem_get(client->mctx, sizeof(*reqarg)); - - isc_mutex_init(&reqarg->lock); - - reqarg->actx = actx; - reqarg->client = client; - reqarg->trans = NULL; - reqarg->canceled = false; - - result = dns_client_startrequest( - client, qmessage, rmessage, server, options, parseoptions, tsec, - timeout, udptimeout, udpretries, client->task, - localrequest_done, reqarg, &reqarg->trans); - if (result != ISC_R_SUCCESS) { - isc_mutex_destroy(&reqarg->lock); - isc_mem_put(client->mctx, reqarg, sizeof(*reqarg)); - return (result); - } - - /* - * Start internal event loop. It blocks until the entire process - * is completed. - */ - result = isc_app_ctxrun(actx); - - LOCK(&reqarg->lock); - if (result == ISC_R_SUCCESS || result == ISC_R_SUSPEND) { - result = reqarg->result; - } - if (reqarg->trans != NULL) { - /* - * Unusual termination (perhaps due to signal). We need some - * tricky cleanup process. - */ - reqarg->canceled = true; - dns_client_cancelresolve(reqarg->trans); - - UNLOCK(&reqarg->lock); - - /* reqarg will be freed in the event handler. */ - } else { - UNLOCK(&reqarg->lock); - - isc_mutex_destroy(&reqarg->lock); - isc_mem_put(client->mctx, reqarg, sizeof(*reqarg)); - } - - return (result); -} - -isc_result_t -dns_client_startrequest(dns_client_t *client, dns_message_t *qmessage, - dns_message_t *rmessage, const isc_sockaddr_t *server, - unsigned int options, unsigned int parseoptions, - dns_tsec_t *tsec, unsigned int timeout, - unsigned int udptimeout, unsigned int udpretries, - isc_task_t *task, isc_taskaction_t action, void *arg, - dns_clientreqtrans_t **transp) { - isc_result_t result; - dns_view_t *view = NULL; - isc_task_t *tclone = NULL; - dns_clientreqevent_t *event = NULL; - reqctx_t *ctx = NULL; - dns_tsectype_t tsectype = dns_tsectype_none; - unsigned int reqoptions; - - REQUIRE(DNS_CLIENT_VALID(client)); - REQUIRE(qmessage != NULL); - REQUIRE(rmessage != NULL); - REQUIRE(transp != NULL && *transp == NULL); - - if (tsec != NULL) { - tsectype = dns_tsec_gettype(tsec); - if (tsectype != dns_tsectype_tsig) { - return (ISC_R_NOTIMPLEMENTED); /* XXX */ - } - } - - LOCK(&client->lock); - result = dns_viewlist_find(&client->viewlist, DNS_CLIENTVIEW_NAME, - qmessage->rdclass, &view); - UNLOCK(&client->lock); - if (result != ISC_R_SUCCESS) { - return (result); - } - - reqoptions = 0; - if ((options & DNS_CLIENTREQOPT_TCP) != 0) { - reqoptions |= DNS_REQUESTOPT_TCP; - } - - tclone = NULL; - isc_task_attach(task, &tclone); - event = (dns_clientreqevent_t *)isc_event_allocate( - client->mctx, tclone, DNS_EVENT_CLIENTREQDONE, action, arg, - sizeof(*event)); - - ctx = isc_mem_get(client->mctx, sizeof(*ctx)); - isc_mutex_init(&ctx->lock); - - ctx->client = client; - ISC_LINK_INIT(ctx, link); - ctx->parseoptions = parseoptions; - ctx->canceled = false; - ctx->event = event; - ctx->event->rmessage = rmessage; - ctx->tsigkey = NULL; - if (tsec != NULL) { - dns_tsec_getkey(tsec, &ctx->tsigkey); - } - - ctx->magic = REQCTX_MAGIC; - - LOCK(&client->lock); - ISC_LIST_APPEND(client->reqctxs, ctx, link); - isc_refcount_increment(&client->references); - UNLOCK(&client->lock); - - ctx->request = NULL; - result = dns_request_createvia(view->requestmgr, qmessage, NULL, server, - -1, reqoptions, ctx->tsigkey, timeout, - udptimeout, udpretries, client->task, - request_done, ctx, &ctx->request); - if (result == ISC_R_SUCCESS) { - dns_view_detach(&view); - *transp = (dns_clientreqtrans_t *)ctx; - return (ISC_R_SUCCESS); - } - - isc_refcount_decrement1(&client->references); - - LOCK(&client->lock); - ISC_LIST_UNLINK(client->reqctxs, ctx, link); - UNLOCK(&client->lock); - isc_mutex_destroy(&ctx->lock); - isc_mem_put(client->mctx, ctx, sizeof(*ctx)); - - isc_event_free(ISC_EVENT_PTR(&event)); - isc_task_detach(&tclone); - dns_view_detach(&view); - - return (result); -} - -void -dns_client_cancelrequest(dns_clientreqtrans_t *trans) { - reqctx_t *ctx; - - REQUIRE(trans != NULL); - ctx = (reqctx_t *)trans; - REQUIRE(REQCTX_VALID(ctx)); - - LOCK(&ctx->lock); - - if (!ctx->canceled) { - ctx->canceled = true; - if (ctx->request != NULL) { - dns_request_cancel(ctx->request); - } - } - - UNLOCK(&ctx->lock); -} - -void -dns_client_destroyreqtrans(dns_clientreqtrans_t **transp) { - reqctx_t *ctx; - isc_mem_t *mctx; - dns_client_t *client; - - REQUIRE(transp != NULL); - ctx = (reqctx_t *)*transp; - *transp = NULL; - REQUIRE(REQCTX_VALID(ctx)); - client = ctx->client; - REQUIRE(DNS_CLIENT_VALID(client)); - REQUIRE(ctx->event == NULL); - REQUIRE(ctx->request != NULL); - - dns_request_destroy(&ctx->request); - mctx = client->mctx; - - LOCK(&client->lock); - - INSIST(ISC_LINK_LINKED(ctx, link)); - ISC_LIST_UNLINK(client->reqctxs, ctx, link); - - UNLOCK(&client->lock); - - isc_mutex_destroy(&ctx->lock); - ctx->magic = 0; - - isc_mem_put(mctx, ctx, sizeof(*ctx)); - - dns_client_destroy(&client); -} diff --git a/lib/dns/win32/libdns.def.in b/lib/dns/win32/libdns.def.in index 80869fae80..ae4b42980e 100644 --- a/lib/dns/win32/libdns.def.in +++ b/lib/dns/win32/libdns.def.in @@ -133,19 +133,14 @@ dns_catz_zones_merge dns_cert_fromtext dns_cert_totext dns_client_addtrustedkey -dns_client_cancelrequest dns_client_cancelresolve dns_client_clearservers dns_client_createx dns_client_destroy -dns_client_destroyreqtrans dns_client_destroyrestrans dns_client_freeresanswer -dns_client_mctx -dns_client_request dns_client_resolve dns_client_setservers -dns_client_startrequest dns_client_startresolve dns_clientinfo_init dns_clientinfomethods_init diff --git a/lib/samples/.gitignore b/lib/samples/.gitignore index 78d0640e1e..3a07505250 100644 --- a/lib/samples/.gitignore +++ b/lib/samples/.gitignore @@ -1,4 +1,3 @@ -nsprobe process resolve sample-async diff --git a/lib/samples/Makefile.am b/lib/samples/Makefile.am index 9eb8ad1efb..2e73c9b0c6 100644 --- a/lib/samples/Makefile.am +++ b/lib/samples/Makefile.am @@ -7,14 +7,10 @@ AM_CPPFLAGS += \ noinst_PROGRAMS = \ resolve \ - sample-async \ - nsprobe + sample-async resolve_SOURCES = resolve.c resolve_LDADD = $(LIBISC_LIBS) $(LIBIRS_LIBS) $(LIBDNS_LIBS) sample_async_SOURCES = sample-async.c sample_async_LDADD = $(LIBISC_LIBS) $(LIBDNS_LIBS) - -nsprobe_SOURCES = nsprobe.c -nsprobe_LDADD = $(LIBISC_LIBS) $(LIBDNS_LIBS) diff --git a/lib/samples/nsprobe.c b/lib/samples/nsprobe.c deleted file mode 100644 index eb626086f0..0000000000 --- a/lib/samples/nsprobe.c +++ /dev/null @@ -1,1234 +0,0 @@ -/* - * Copyright (C) Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, you can obtain one at https://mozilla.org/MPL/2.0/. - * - * See the COPYRIGHT file distributed with this work for additional - * information regarding copyright ownership. - */ - -#ifndef WIN32 -#include -#include -#include -#include -#endif /* ifndef WIN32 */ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#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 *input; - -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 { - bool inuse; - char *domain; - dns_fixedname_t fixedname; - dns_name_t *qname; - const char **qlabel; - bool 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 bool debug_mode = 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, false, 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, 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; - - isc_mem_create(mctxp); - - result = isc_appctx_create(*mctxp, actxp); - if (result != ISC_R_SUCCESS) { - goto fail; - } - - result = isc_taskmgr_createinctx(*mctxp, 1, 0, taskmgrp); - if (result != ISC_R_SUCCESS) { - goto fail; - } - - result = isc_socketmgr_createinctx(*mctxp, socketmgrp); - if (result != ISC_R_SUCCESS) { - goto fail; - } - - result = isc_timermgr_createinctx(*mctxp, 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_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; - unsigned int domainlen; - isc_buffer_t b; - char buf[4096]; /* XXX ad-hoc constant, but should be enough */ - - if (*trans->qlabel == NULL) { - return (ISC_R_NOMORE); - } - - if (strlcpy(buf, *trans->qlabel, sizeof(buf)) >= sizeof(buf)) { - return (ISC_R_NOSPACE); - } - - if ((domainlen = strlcat(buf, trans->domain, sizeof(buf))) >= - sizeof(buf)) { - return (ISC_R_NOSPACE); - } - - isc_buffer_init(&b, buf, domainlen); - isc_buffer_add(&b, domainlen); - trans->qname = dns_fixedname_initname(&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); - 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: %u (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 = 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); - 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)); - 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); - } - } - } - - 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 = 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 = 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); - 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)); - - pns->name = - dns_fixedname_initname(&pns->fixedname); - ISC_LINK_INIT(pns, link); - ISC_LIST_APPEND(trans->nslist, pns, link); - ISC_LIST_INIT(pns->servers); - - dns_name_copynf(&ns.name, pns->name); - dns_rdata_reset(&rdata); - dns_rdata_freestruct(&ns); - } - } - } - - 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; - unsigned int domainlen; - isc_buffer_t b; - char buf[4096]; /* XXX ad hoc constant, but should be enough */ - char *cp; - - REQUIRE(trans != NULL); - REQUIRE(!trans->inuse); - REQUIRE(outstanding_probes < MAX_PROBES); - - /* Construct domain */ - cp = fgets(buf, sizeof(buf), input); - 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); - - /* Start getting NS for the domain */ - domainlen = strlen(buf); - isc_buffer_init(&b, buf, domainlen); - isc_buffer_add(&b, domainlen); - trans->qname = dns_fixedname_initname(&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 = true; - outstanding_probes++; - - return (ISC_R_SUCCESS); - -cleanup: - isc_mem_free(mctx, trans->domain); - dns_fixedname_invalidate(&trans->fixedname); - - return (result); -} - -ISC_NORETURN static void -usage(void); - -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 = isc_commandline_parse(argc, argv, "c:dhv")) != -1) { - switch (ch) { - case 'c': - cacheserver = isc_commandline_argument; - break; - case 'd': - debug_mode = true; - break; - case 'h': - usage(); - break; - case 'v': - verbose_level++; - break; - default: - usage(); - break; - } - } - - argc -= isc_commandline_index; - argv += isc_commandline_index; - - /* Common set up */ - isc_lib_register(); - result = dns_lib_init(); - if (result != ISC_R_SUCCESS) { - fprintf(stderr, "dns_lib_init failed: %u\n", result); - exit(1); - } - - result = ctxs_init(&mctx, &actx, &taskmgr, &socketmgr, &timermgr); - if (result != ISC_R_SUCCESS) { - fprintf(stderr, "ctx create failed: %u\n", result); - exit(1); - } - - isc_app_ctxstart(actx); - - result = dns_client_createx(mctx, actx, taskmgr, socketmgr, timermgr, 0, - &client, NULL, NULL); - if (result != ISC_R_SUCCESS) { - fprintf(stderr, "dns_client_createx failed: %u\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); - } - memmove(&sa.type.sa, res->ai_addr, res->ai_addrlen); - sa.length = (unsigned int)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: %u\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: %u\n", result); - exit(1); - } - - /* Open input file */ - if (argc == 0) { - input = stdin; - } else { - input = fopen(argv[0], "r"); - if (input == 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 = false; - probes[i].domain = NULL; - dns_fixedname_init(&probes[i].fixedname); - probes[i].qname = NULL; - probes[i].qlabel = qlabels; - probes[i].qname_found = false; - probes[i].resid = NULL; - ISC_LIST_INIT(probes[i].nslist); - probes[i].reqid = NULL; - - probes[i].qmessage = NULL; - dns_message_create(mctx, DNS_MESSAGE_INTENTRENDER, - &probes[i].qmessage); - dns_message_create(mctx, DNS_MESSAGE_INTENTPARSE, - &probes[i].rmessage); - } - 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_detach(&probes[i].qmessage); - dns_message_detach(&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/lib/samples/win32/nsprobe.vcxproj.filters.in b/lib/samples/win32/nsprobe.vcxproj.filters.in deleted file mode 100644 index d7e313b183..0000000000 --- a/lib/samples/win32/nsprobe.vcxproj.filters.in +++ /dev/null @@ -1,22 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - \ No newline at end of file diff --git a/lib/samples/win32/nsprobe.vcxproj.in b/lib/samples/win32/nsprobe.vcxproj.in deleted file mode 100644 index 4581683f27..0000000000 --- a/lib/samples/win32/nsprobe.vcxproj.in +++ /dev/null @@ -1,127 +0,0 @@ - - - - - Debug - @PLATFORM@ - - - Release - @PLATFORM@ - - - - {CB2A29F6-E73B-40AB-8AC4-2C1AAE7280BD} - Win32Proj - nsprobe - @WINDOWS_TARGET_PLATFORM_VERSION@ - - - - Application - true - MultiByte - @PLATFORM_TOOLSET@ - - - Application - false - true - MultiByte - @PLATFORM_TOOLSET@ - - - - - - - - - - - - - true - ..\..\..\Build\$(Configuration)\ - .\$(Configuration)\ - None - - - false - ..\..\..\Build\$(Configuration)\ - .\$(Configuration)\ - None - - - - - - Level4 - false - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - .\$(Configuration)\$(TargetName).pch - .\$(Configuration)\ - .\$(Configuration)\ - $(OutDir)$(TargetName).pdb - true - ..\..\..\config.h - .\;..\..\..\;@LIBXML2_INC@@OPENSSL_INC@..\..\isc\win32;..\..\isc\win32\include;..\..\isc\include;..\..\dns\win32\include;..\..\dns\include;%(AdditionalIncludeDirectories) - CompileAsC - - - Console - true - ..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) - ..\..\isc\win32\$(Configuration);..\..\dns\win32\$(Configuration);%(AdditionalLibraryDirectories) - @OPENSSL_LIBCRYPTO@@OPENSSL_LIBSSL@libisc.lib;libdns.lib;ws2_32.lib;%(AdditionalDependencies) - - - - - Level1 - true - - - MaxSpeed - true - @INTRINSIC@ - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - OnlyExplicitInline - false - true - .\$(Configuration)\$(TargetName).pch - .\$(Configuration)\ - .\$(Configuration)\ - $(OutDir)$(TargetName).pdb - ..\..\..\config.h - .\;..\..\..\;@LIBXML2_INC@@OPENSSL_INC@..\..\isc\win32;..\..\isc\win32\include;..\..\isc\include;..\..\dns\win32\include;..\..\dns\include;%(AdditionalIncludeDirectories) - CompileAsC - - - Console - false - true - true - ..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) - Default - ..\..\isc\win32\$(Configuration);..\..\dns\win32\$(Configuration);%(AdditionalLibraryDirectories) - @OPENSSL_LIBCRYPTO@@OPENSSL_LIBSSL@libisc.lib;libdns.lib;ws2_32.lib;%(AdditionalDependencies) - - - - - - - - {3840E563-D180-4761-AA9C-E6155F02EAFF} - - - {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} - - - - - - diff --git a/lib/samples/win32/nsprobe.vcxproj.user b/lib/samples/win32/nsprobe.vcxproj.user deleted file mode 100644 index ace9a86acb..0000000000 --- a/lib/samples/win32/nsprobe.vcxproj.user +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/util/copyrights b/util/copyrights index e46a3c90ce..f5d31b3c9b 100644 --- a/util/copyrights +++ b/util/copyrights @@ -2189,16 +2189,12 @@ ./lib/ns/win32/libns.vcxproj.in X 2017,2018,2019,2020 ./lib/ns/win32/libns.vcxproj.user X 2017,2018,2019,2020,2021 ./lib/ns/xfrout.c C 2017,2018,2019,2020,2021 -./lib/samples/nsprobe.c C 2009,2010,2011,2012,2013,2014,2015,2016,2018,2019,2020,2021 ./lib/samples/resolve.c C 2009,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021 ./lib/samples/rootkey.sh SH 2013,2016,2018,2019,2020,2021 ./lib/samples/sample-async.c C 2009,2013,2014,2015,2016,2018,2019,2020,2021 ./lib/samples/win32/async.vcxproj.filters.in X 2014,2015,2018,2019,2020 ./lib/samples/win32/async.vcxproj.in X 2014,2015,2016,2017,2018,2019,2020 ./lib/samples/win32/async.vcxproj.user X 2014,2018,2019,2020,2021 -./lib/samples/win32/nsprobe.vcxproj.filters.in X 2014,2015,2018,2019,2020 -./lib/samples/win32/nsprobe.vcxproj.in X 2014,2015,2016,2017,2018,2019,2020 -./lib/samples/win32/nsprobe.vcxproj.user X 2014,2018,2019,2020,2021 ./lib/samples/win32/resolve.vcxproj.filters.in X 2014,2015,2018,2019,2020 ./lib/samples/win32/resolve.vcxproj.in X 2014,2015,2016,2017,2018,2019,2020 ./lib/samples/win32/resolve.vcxproj.user X 2014,2018,2019,2020,2021 diff --git a/win32utils/Configure b/win32utils/Configure index 42660889d2..4d72e10603 100644 --- a/win32utils/Configure +++ b/win32utils/Configure @@ -133,8 +133,6 @@ my @projectlist = ("../bin/check/win32/checkconf.vcxproj", "../lib/samples/win32/resolve.vcxproj.filters", "../lib/samples/win32/async.vcxproj", "../lib/samples/win32/async.vcxproj.filters", - "../lib/samples/win32/nsprobe.vcxproj", - "../lib/samples/win32/nsprobe.vcxproj.filters", "../lib/win32/bindevt/bindevt.vcxproj", "../lib/win32/bindevt/bindevt.vcxproj.filters", "bind9.sln"); diff --git a/win32utils/bind9.sln.in b/win32utils/bind9.sln.in index 3da2ffe9a6..04ddd20d8e 100644 --- a/win32utils/bind9.sln.in +++ b/win32utils/bind9.sln.in @@ -29,8 +29,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "async", "..\lib\samples\win EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gai", "..\lib\samples\win32\gai.vcxproj", "{D42B8670-8DF6-4D90-90F7-DB5FB845AFAE}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nsprobe", "..\lib\samples\win32\nsprobe.vcxproj", "{CB2A29F6-E73B-40AB-8AC4-2C1AAE7280BD}" -EndProject @END SAMPLES Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "named", "..\bin\named\win32\named.vcxproj", "{723C65DA-A96C-4BA3-A34E-44F11CA346F9}" EndProject From 568d455c99a5d1768dc45daf1a82be67b97e8a86 Mon Sep 17 00:00:00 2001 From: Evan Hunt Date: Mon, 22 Mar 2021 18:16:28 -0700 Subject: [PATCH 3/6] rename dns_client_createx() to dns_client_create() there's no longer a need to use an alternate name. --- bin/delv/delv.c | 6 ++-- lib/dns/client.c | 56 +++++++++--------------------------- lib/dns/include/dns/client.h | 30 ++++++++----------- lib/dns/win32/libdns.def.in | 2 +- lib/samples/resolve.c | 7 ++--- lib/samples/sample-async.c | 6 ++-- 6 files changed, 36 insertions(+), 71 deletions(-) diff --git a/bin/delv/delv.c b/bin/delv/delv.c index 3c92ebf2e5..ae8433f24e 100644 --- a/bin/delv/delv.c +++ b/bin/delv/delv.c @@ -1781,8 +1781,8 @@ main(int argc, char *argv[]) { #endif /* ifndef WIN32 */ /* Create client */ - result = dns_client_createx(mctx, actx, taskmgr, socketmgr, timermgr, 0, - &client, srcaddr4, srcaddr6); + result = dns_client_create(mctx, actx, taskmgr, socketmgr, timermgr, 0, + &client, srcaddr4, srcaddr6); if (result != ISC_R_SUCCESS) { delv_log(ISC_LOG_ERROR, "dns_client_create: %s", isc_result_totext(result)); @@ -1802,7 +1802,7 @@ main(int argc, char *argv[]) { CHECK(convert_name(&qfn, &query_name, qname)); /* Set up resolution options */ - resopt = DNS_CLIENTRESOPT_ALLOWRUN | DNS_CLIENTRESOPT_NOCDFLAG; + resopt = DNS_CLIENTRESOPT_NOCDFLAG; if (no_sigs) { resopt |= DNS_CLIENTRESOPT_NODNSSEC; } diff --git a/lib/dns/client.c b/lib/dns/client.c index ee63e8a21c..2dafddea72 100644 --- a/lib/dns/client.c +++ b/lib/dns/client.c @@ -105,8 +105,6 @@ struct dns_client { #define DEF_FIND_TIMEOUT 5 #define DEF_FIND_UDPRETRIES 3 -#define DNS_CLIENTATTR_OWNCTX 0x01 - /*% * Internal state for a single name resolution procedure */ @@ -292,13 +290,13 @@ createview(isc_mem_t *mctx, dns_rdataclass_t rdclass, isc_taskmgr_t *taskmgr, } isc_result_t -dns_client_createx(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr, - isc_socketmgr_t *socketmgr, isc_timermgr_t *timermgr, - unsigned int options, dns_client_t **clientp, - const isc_sockaddr_t *localaddr4, - const isc_sockaddr_t *localaddr6) { - dns_client_t *client; +dns_client_create(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr, + isc_socketmgr_t *socketmgr, isc_timermgr_t *timermgr, + unsigned int options, dns_client_t **clientp, + const isc_sockaddr_t *localaddr4, + const isc_sockaddr_t *localaddr6) { isc_result_t result; + dns_client_t *client = NULL; dns_dispatchmgr_t *dispatchmgr = NULL; dns_dispatch_t *dispatchv4 = NULL; dns_dispatch_t *dispatchv6 = NULL; @@ -434,19 +432,6 @@ destroyclient(dns_client_t *client) { isc_task_detach(&client->task); - /* - * If the client has created its own running environments, - * destroy them. - */ - if ((client->attributes & DNS_CLIENTATTR_OWNCTX) != 0) { - isc_taskmgr_destroy(&client->taskmgr); - isc_timermgr_destroy(&client->timermgr); - isc_socketmgr_destroy(&client->socketmgr); - - isc_app_ctxfinish(client->actx); - isc_appctx_destroy(&client->actx); - } - isc_mutex_destroy(&client->lock); client->magic = 0; @@ -1042,35 +1027,22 @@ dns_client_resolve(dns_client_t *client, const dns_name_t *name, dns_rdataclass_t rdclass, dns_rdatatype_t type, unsigned int options, dns_namelist_t *namelist) { isc_result_t result; - isc_appctx_t *actx; resarg_t *resarg; REQUIRE(DNS_CLIENT_VALID(client)); + REQUIRE(client->actx != NULL); REQUIRE(namelist != NULL && ISC_LIST_EMPTY(*namelist)); - if ((client->attributes & DNS_CLIENTATTR_OWNCTX) == 0 && - (options & DNS_CLIENTRESOPT_ALLOWRUN) == 0) - { - /* - * If the client is run under application's control, we need - * to create a new running (sub)environment for this - * particular resolution. - */ - return (ISC_R_NOTIMPLEMENTED); /* XXXTBD */ - } else { - actx = client->actx; - } - resarg = isc_mem_get(client->mctx, sizeof(*resarg)); isc_mutex_init(&resarg->lock); + *resarg = (resarg_t){ + .actx = client->actx, + .client = client, + .result = DNS_R_SERVFAIL, + .namelist = namelist, + }; - resarg->actx = actx; - resarg->client = client; - resarg->result = DNS_R_SERVFAIL; - resarg->namelist = namelist; - resarg->trans = NULL; - resarg->canceled = false; result = dns_client_startresolve(client, name, rdclass, type, options, client->task, resolve_done, resarg, &resarg->trans); @@ -1084,7 +1056,7 @@ dns_client_resolve(dns_client_t *client, const dns_name_t *name, * Start internal event loop. It blocks until the entire process * is completed. */ - result = isc_app_ctxrun(actx); + result = isc_app_ctxrun(client->actx); LOCK(&resarg->lock); if (result == ISC_R_SUCCESS || result == ISC_R_SUSPEND) { diff --git a/lib/dns/include/dns/client.h b/lib/dns/include/dns/client.h index f7870e412f..79fb13b5a1 100644 --- a/lib/dns/include/dns/client.h +++ b/lib/dns/include/dns/client.h @@ -67,7 +67,7 @@ ISC_LANG_BEGINDECLS /*%< Do not return DNSSEC data (e.g. RRSIGS) with response. */ #define DNS_CLIENTRESOPT_NODNSSEC 0x01 /*%< Allow running external context. */ -#define DNS_CLIENTRESOPT_ALLOWRUN 0x02 +#define DNS_CLIENTRESOPT_RESERVED 0x02 /*%< Don't validate responses. */ #define DNS_CLIENTRESOPT_NOVALIDATE 0x04 /*%< Don't set the CD flag on upstream queries. */ @@ -79,7 +79,7 @@ ISC_LANG_BEGINDECLS * Optional flags for dns_client_(start)request. */ /*%< Allow running external context. */ -#define DNS_CLIENTREQOPT_ALLOWRUN 0x01 +#define DNS_CLIENTREQOPT_RESERVED 0x01 /*%< Use TCP transport. */ #define DNS_CLIENTREQOPT_TCP 0x02 @@ -87,7 +87,7 @@ ISC_LANG_BEGINDECLS * Optional flags for dns_client_(start)update. */ /*%< Allow running external context. */ -#define DNS_CLIENTUPDOPT_ALLOWRUN 0x01 +#define DNS_CLIENTUPDOPT_RESERVED 0x01 /*%< Use TCP transport. */ #define DNS_CLIENTUPDOPT_TCP 0x02 @@ -127,11 +127,11 @@ typedef struct dns_clientreqevent { } dns_clientreqevent_t; /* too long? */ isc_result_t -dns_client_createx(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr, - isc_socketmgr_t *socketmgr, isc_timermgr_t *timermgr, - unsigned int options, dns_client_t **clientp, - const isc_sockaddr_t *localaddr4, - const isc_sockaddr_t *localaddr6); +dns_client_create(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr, + isc_socketmgr_t *socketmgr, isc_timermgr_t *timermgr, + unsigned int options, dns_client_t **clientp, + const isc_sockaddr_t *localaddr4, + const isc_sockaddr_t *localaddr6); /*%< * Create a DNS client object with minimal internal resources, such as * a default view for the IN class and IPv4/IPv6 dispatches for the view. @@ -261,11 +261,8 @@ dns_client_startresolve(dns_client_t *client, const dns_name_t *name, * error. Otherwise, it returns the result code of the entire resolution * process, either success or failure. * - * It is typically expected that the client object passed to - * dns_client_resolve() was created via dns_client_create() and has its own - * managers and contexts. However, if the DNS_CLIENTRESOPT_ALLOWRUN flag is - * set in 'options', this function performs the synchronous service even if - * it does not have its own manager and context structures. + * It is expected that the client object passed to dns_client_resolve() was + * created via dns_client_create() and has external managers and contexts. * * dns_client_startresolve() is an asynchronous version of dns_client_resolve() * and does not block. When name resolution is completed, 'action' will be @@ -401,11 +398,8 @@ dns_client_startrequest(dns_client_t *client, dns_message_t *qmessage, * 'rmessage' will contain the response message. The caller must provide a * valid initialized message. * - * It is usually expected that the client object passed to - * dns_client_request() was created via dns_client_create() and has its own - * managers and contexts. However, if the DNS_CLIENTREQOPT_ALLOWRUN flag is - * set in 'options', this function performs the synchronous service even if - * it does not have its own manager and context structures. + * It is expected that the client object passed to dns_client_request() was + * created via dns_client_create() and has external managers and contexts. * * dns_client_startrequest() is an asynchronous version of dns_client_request() * and does not block. When the transaction is completed, 'action' will be diff --git a/lib/dns/win32/libdns.def.in b/lib/dns/win32/libdns.def.in index ae4b42980e..c22be8ee2b 100644 --- a/lib/dns/win32/libdns.def.in +++ b/lib/dns/win32/libdns.def.in @@ -135,7 +135,7 @@ dns_cert_totext dns_client_addtrustedkey dns_client_cancelresolve dns_client_clearservers -dns_client_createx +dns_client_create dns_client_destroy dns_client_destroyrestrans dns_client_freeresanswer diff --git a/lib/samples/resolve.c b/lib/samples/resolve.c index bb0f1de525..bd2a947a8c 100644 --- a/lib/samples/resolve.c +++ b/lib/samples/resolve.c @@ -241,7 +241,7 @@ main(int argc, char *argv[]) { dns_rdataset_t *rdataset; dns_namelist_t namelist; isc_mem_t *keymctx = NULL; - unsigned int clientopt, resopt; + unsigned int clientopt, resopt = 0; bool is_sep = false; const char *port = "53"; isc_mem_t *mctx = NULL; @@ -385,8 +385,8 @@ main(int argc, char *argv[]) { } clientopt = 0; - result = dns_client_createx(mctx, actx, taskmgr, socketmgr, timermgr, - clientopt, &client, addr4, addr6); + result = dns_client_create(mctx, actx, taskmgr, socketmgr, timermgr, + clientopt, &client, addr4, addr6); if (result != ISC_R_SUCCESS) { fprintf(stderr, "dns_client_create failed: %u, %s\n", result, isc_result_totext(result)); @@ -444,7 +444,6 @@ main(int argc, char *argv[]) { } /* Perform resolution */ - resopt = DNS_CLIENTRESOPT_ALLOWRUN; if (keynamestr == NULL) { resopt |= DNS_CLIENTRESOPT_NODNSSEC; } diff --git a/lib/samples/sample-async.c b/lib/samples/sample-async.c index 59ff24cba1..fd488ce06c 100644 --- a/lib/samples/sample-async.c +++ b/lib/samples/sample-async.c @@ -343,10 +343,10 @@ main(int argc, char *argv[]) { isc_app_ctxstart(query_actx); - result = dns_client_createx(mctx, query_actx, taskmgr, socketmgr, - timermgr, 0, &client, NULL, NULL); + result = dns_client_create(mctx, query_actx, taskmgr, socketmgr, + timermgr, 0, &client, NULL, NULL); if (result != ISC_R_SUCCESS) { - fprintf(stderr, "dns_client_createx failed: %u\n", result); + fprintf(stderr, "dns_client_create failed: %u\n", result); exit(1); } From 056afe7bdc3eccb321149600520a37cc64dc0da7 Mon Sep 17 00:00:00 2001 From: Evan Hunt Date: Mon, 22 Mar 2021 18:25:15 -0700 Subject: [PATCH 4/6] remove sample-async sample code for export libraries is no longer needed and this code is not used for any internal tests. also, sample-gai.c had already been removed but there were some dangling references. --- bin/win32/BINDInstall/BINDInstall.vcxproj.in | 6 - lib/samples/.gitignore | 3 - lib/samples/Makefile.am | 6 +- lib/samples/rootkey.sh | 26 -- lib/samples/sample-async.c | 410 ------------------- lib/samples/win32/async.vcxproj.filters.in | 22 - lib/samples/win32/async.vcxproj.in | 127 ------ lib/samples/win32/async.vcxproj.user | 3 - util/copyrights | 5 - win32utils/Configure | 2 - win32utils/bind9.sln.in | 4 - 11 files changed, 1 insertion(+), 613 deletions(-) delete mode 100644 lib/samples/rootkey.sh delete mode 100644 lib/samples/sample-async.c delete mode 100644 lib/samples/win32/async.vcxproj.filters.in delete mode 100644 lib/samples/win32/async.vcxproj.in delete mode 100644 lib/samples/win32/async.vcxproj.user diff --git a/bin/win32/BINDInstall/BINDInstall.vcxproj.in b/bin/win32/BINDInstall/BINDInstall.vcxproj.in index 5ace7e97ef..f4415ad159 100644 --- a/bin/win32/BINDInstall/BINDInstall.vcxproj.in +++ b/bin/win32/BINDInstall/BINDInstall.vcxproj.in @@ -299,12 +299,6 @@ {82ACD33C-E75F-45B8-BB6D-42643A10D7EE} @IF SAMPLES - - {9FC33CA3-CE4A-4EDF-BA99-EECA4B81AD06} - - - {D42B8670-8DF6-4D90-90F7-DB5FB845AFAE} - {F66D8B7E-721D-4602-99AD-820D19AD1313} diff --git a/lib/samples/.gitignore b/lib/samples/.gitignore index 3a07505250..0cc4fa42aa 100644 --- a/lib/samples/.gitignore +++ b/lib/samples/.gitignore @@ -1,4 +1 @@ -process resolve -sample-async -sample-gai diff --git a/lib/samples/Makefile.am b/lib/samples/Makefile.am index 2e73c9b0c6..83183b5762 100644 --- a/lib/samples/Makefile.am +++ b/lib/samples/Makefile.am @@ -6,11 +6,7 @@ AM_CPPFLAGS += \ $(LIBIRS_CFLAGS) noinst_PROGRAMS = \ - resolve \ - sample-async + resolve resolve_SOURCES = resolve.c resolve_LDADD = $(LIBISC_LIBS) $(LIBIRS_LIBS) $(LIBDNS_LIBS) - -sample_async_SOURCES = sample-async.c -sample_async_LDADD = $(LIBISC_LIBS) $(LIBDNS_LIBS) diff --git a/lib/samples/rootkey.sh b/lib/samples/rootkey.sh deleted file mode 100644 index 5fddbca141..0000000000 --- a/lib/samples/rootkey.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh -# -# Copyright (C) Internet Systems Consortium, Inc. ("ISC") -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, you can obtain one at https://mozilla.org/MPL/2.0/. -# -# See the COPYRIGHT file distributed with this work for additional -# information regarding copyright ownership. - -# Fetch a copy of a current root signing key; used for testing -# DNSSEC validation in 'sample'. -# -# After running this script, "sample `cat sample.key` " will -# perform a lookup as specified in and validate the result -# using the root key. -# -# (This is NOT a secure method of obtaining the root key; it is -# included here for testing purposes only.) -dig +noall +answer dnskey . | perl -n -e ' -local ($dn, $ttl, $class, $type, $flags, $proto, $alg, @rest) = split; -next if ($flags != 257); -local $key = join("", @rest); -print "-a $alg -e -k $dn -K $key\n" -' > sample.key diff --git a/lib/samples/sample-async.c b/lib/samples/sample-async.c deleted file mode 100644 index fd488ce06c..0000000000 --- a/lib/samples/sample-async.c +++ /dev/null @@ -1,410 +0,0 @@ -/* - * Copyright (C) Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, you can obtain one at https://mozilla.org/MPL/2.0/. - * - * See the COPYRIGHT file distributed with this work for additional - * information regarding copyright ownership. - */ - -#ifndef WIN32 -#include -#include -#include -#include -#include -#endif /* ifndef WIN32 */ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#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; - bool 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; - - isc_mem_create(mctxp); - - result = isc_appctx_create(*mctxp, actxp); - if (result != ISC_R_SUCCESS) { - goto fail; - } - - result = isc_taskmgr_createinctx(*mctxp, 1, 0, taskmgrp); - if (result != ISC_R_SUCCESS) { - goto fail; - } - - result = isc_socketmgr_createinctx(*mctxp, socketmgrp); - if (result != ISC_R_SUCCESS) { - goto fail; - } - - result = isc_timermgr_createinctx(*mctxp, 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, false, 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); - REQUIRE(outstanding_queries > 0); - - printf("answer[%2d]\n", trans->id); - - if (rev->result != ISC_R_SUCCESS) { - printf(" failed: %u(%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 = 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 0 */ - 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; - unsigned int namelen; - isc_buffer_t b; - char buf[4096]; /* XXX ad hoc constant, but should be enough */ - char *cp; - - REQUIRE(trans != NULL); - REQUIRE(!trans->inuse); - 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); - trans->qname = dns_fixedname_initname(&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 = true; - outstanding_queries++; - - return (ISC_R_SUCCESS); - -cleanup: - dns_fixedname_invalidate(&trans->fixedname); - - return (result); -} - -ISC_NORETURN static void -usage(void); - -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 = isc_commandline_parse(argc, argv, "s:t:")) != -1) { - switch (ch) { - case 't': - tr.base = isc_commandline_argument; - tr.length = strlen(isc_commandline_argument); - result = dns_rdatatype_fromtext(&type, &tr); - if (result != ISC_R_SUCCESS) { - fprintf(stderr, "invalid RRtype: %s\n", - isc_commandline_argument); - 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 *)isc_commandline_argument; - break; - default: - usage(); - } - } - - argc -= isc_commandline_index; - argv += isc_commandline_index; - 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 = 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: %u\n", result); - exit(1); - } - - result = ctxs_init(&mctx, &query_actx, &taskmgr, &socketmgr, &timermgr); - if (result != ISC_R_SUCCESS) { - fprintf(stderr, "ctx create failed: %u\n", result); - exit(1); - } - - isc_app_ctxstart(query_actx); - - result = dns_client_create(mctx, query_actx, taskmgr, socketmgr, - timermgr, 0, &client, NULL, NULL); - if (result != ISC_R_SUCCESS) { - fprintf(stderr, "dns_client_create failed: %u\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: %u\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: %u\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); - } - - /* 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/lib/samples/win32/async.vcxproj.filters.in b/lib/samples/win32/async.vcxproj.filters.in deleted file mode 100644 index 2698e21a4e..0000000000 --- a/lib/samples/win32/async.vcxproj.filters.in +++ /dev/null @@ -1,22 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - \ No newline at end of file diff --git a/lib/samples/win32/async.vcxproj.in b/lib/samples/win32/async.vcxproj.in deleted file mode 100644 index 37a071bdf3..0000000000 --- a/lib/samples/win32/async.vcxproj.in +++ /dev/null @@ -1,127 +0,0 @@ - - - - - Debug - @PLATFORM@ - - - Release - @PLATFORM@ - - - - {9FC33CA3-CE4A-4EDF-BA99-EECA4B81AD06} - Win32Proj - async - @WINDOWS_TARGET_PLATFORM_VERSION@ - - - - Application - true - MultiByte - @PLATFORM_TOOLSET@ - - - Application - false - true - MultiByte - @PLATFORM_TOOLSET@ - - - - - - - - - - - - - true - ..\..\..\Build\$(Configuration)\ - .\$(Configuration)\ - None - - - false - ..\..\..\Build\$(Configuration)\ - .\$(Configuration)\ - None - - - - - - Level4 - false - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - .\$(Configuration)\$(TargetName).pch - .\$(Configuration)\ - .\$(Configuration)\ - $(OutDir)$(TargetName).pdb - true - ..\..\..\config.h - .\;..\..\..\;@LIBXML2_INC@@OPENSSL_INC@..\..\isc\win32;..\..\isc\win32\include;..\..\isc\include;..\..\dns\win32\include;..\..\dns\include;%(AdditionalIncludeDirectories) - CompileAsC - - - Console - true - ..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) - ..\..\isc\win32\$(Configuration);..\..\dns\win32\$(Configuration);%(AdditionalLibraryDirectories) - @OPENSSL_LIBCRYPTO@@OPENSSL_LIBSSL@libisc.lib;libdns.lib;ws2_32.lib;%(AdditionalDependencies) - - - - - Level1 - true - - - MaxSpeed - true - @INTRINSIC@ - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - OnlyExplicitInline - false - true - .\$(Configuration)\$(TargetName).pch - .\$(Configuration)\ - .\$(Configuration)\ - $(OutDir)$(TargetName).pdb - ..\..\..\config.h - .\;..\..\..\;@LIBXML2_INC@@OPENSSL_INC@..\..\isc\win32;..\..\isc\win32\include;..\..\isc\include;..\..\dns\win32\include;..\..\dns\include;%(AdditionalIncludeDirectories) - CompileAsC - - - Console - false - true - true - ..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) - Default - ..\..\isc\win32\$(Configuration);..\..\dns\win32\$(Configuration);%(AdditionalLibraryDirectories) - @OPENSSL_LIBCRYPTO@@OPENSSL_LIBSSL@libisc.lib;libdns.lib;ws2_32.lib;%(AdditionalDependencies) - - - - - - - - {3840E563-D180-4761-AA9C-E6155F02EAFF} - - - {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} - - - - - - diff --git a/lib/samples/win32/async.vcxproj.user b/lib/samples/win32/async.vcxproj.user deleted file mode 100644 index ace9a86acb..0000000000 --- a/lib/samples/win32/async.vcxproj.user +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/util/copyrights b/util/copyrights index f5d31b3c9b..44e00db6c6 100644 --- a/util/copyrights +++ b/util/copyrights @@ -2190,11 +2190,6 @@ ./lib/ns/win32/libns.vcxproj.user X 2017,2018,2019,2020,2021 ./lib/ns/xfrout.c C 2017,2018,2019,2020,2021 ./lib/samples/resolve.c C 2009,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021 -./lib/samples/rootkey.sh SH 2013,2016,2018,2019,2020,2021 -./lib/samples/sample-async.c C 2009,2013,2014,2015,2016,2018,2019,2020,2021 -./lib/samples/win32/async.vcxproj.filters.in X 2014,2015,2018,2019,2020 -./lib/samples/win32/async.vcxproj.in X 2014,2015,2016,2017,2018,2019,2020 -./lib/samples/win32/async.vcxproj.user X 2014,2018,2019,2020,2021 ./lib/samples/win32/resolve.vcxproj.filters.in X 2014,2015,2018,2019,2020 ./lib/samples/win32/resolve.vcxproj.in X 2014,2015,2016,2017,2018,2019,2020 ./lib/samples/win32/resolve.vcxproj.user X 2014,2018,2019,2020,2021 diff --git a/win32utils/Configure b/win32utils/Configure index 4d72e10603..29a96a4545 100644 --- a/win32utils/Configure +++ b/win32utils/Configure @@ -131,8 +131,6 @@ my @projectlist = ("../bin/check/win32/checkconf.vcxproj", "../lib/ns/win32/libns.vcxproj", "../lib/samples/win32/resolve.vcxproj", "../lib/samples/win32/resolve.vcxproj.filters", - "../lib/samples/win32/async.vcxproj", - "../lib/samples/win32/async.vcxproj.filters", "../lib/win32/bindevt/bindevt.vcxproj", "../lib/win32/bindevt/bindevt.vcxproj.filters", "bind9.sln"); diff --git a/win32utils/bind9.sln.in b/win32utils/bind9.sln.in index 04ddd20d8e..fc3ad843c7 100644 --- a/win32utils/bind9.sln.in +++ b/win32utils/bind9.sln.in @@ -25,10 +25,6 @@ EndProject @IF SAMPLES Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "resolve", "..\lib\samples\win32\resolve.vcxproj", "{F66D8B7E-721D-4602-99AD-820D19AD1313}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "async", "..\lib\samples\win32\async.vcxproj", "{9FC33CA3-CE4A-4EDF-BA99-EECA4B81AD06}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gai", "..\lib\samples\win32\gai.vcxproj", "{D42B8670-8DF6-4D90-90F7-DB5FB845AFAE}" -EndProject @END SAMPLES Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "named", "..\bin\named\win32\named.vcxproj", "{723C65DA-A96C-4BA3-A34E-44F11CA346F9}" EndProject From d0ec7d1f338c42bf713793eff3d3f7779dba7ab6 Mon Sep 17 00:00:00 2001 From: Evan Hunt Date: Mon, 22 Mar 2021 18:40:21 -0700 Subject: [PATCH 5/6] move samples/resolve.c to bin/tests/system "resolve" is used by the resolver system tests, and I'm not certain whether delv exercises the same code, so rather than remove it, I moved it to bin/tests/system. --- bin/tests/system/Makefile.am | 9 ++++++ bin/tests/system/conf.sh.in | 2 +- bin/tests/system/conf.sh.win32 | 2 +- {lib/samples => bin/tests/system}/resolve.c | 0 .../system}/win32/resolve.vcxproj.filters.in | 0 .../tests/system}/win32/resolve.vcxproj.in | 0 .../tests/system}/win32/resolve.vcxproj.user | 0 bin/win32/BINDInstall/BINDInstall.vcxproj.in | 8 ++--- configure.ac | 3 +- lib/Makefile.am | 2 +- lib/samples/.gitignore | 1 - lib/samples/Makefile.am | 12 ------- util/copyrights | 8 ++--- win32utils/Configure | 21 ++---------- win32utils/bind9.sln.in | 32 ++----------------- 15 files changed, 24 insertions(+), 76 deletions(-) rename {lib/samples => bin/tests/system}/resolve.c (100%) rename {lib/samples => bin/tests/system}/win32/resolve.vcxproj.filters.in (100%) rename {lib/samples => bin/tests/system}/win32/resolve.vcxproj.in (100%) rename {lib/samples => bin/tests/system}/win32/resolve.vcxproj.user (100%) delete mode 100644 lib/samples/.gitignore delete mode 100644 lib/samples/Makefile.am diff --git a/bin/tests/system/Makefile.am b/bin/tests/system/Makefile.am index bce2fb13e3..4ef54205a1 100644 --- a/bin/tests/system/Makefile.am +++ b/bin/tests/system/Makefile.am @@ -23,6 +23,7 @@ check_PROGRAMS = \ feature-test \ makejournal \ pipelined/pipequeries \ + resolve \ rndc/gencheck \ rpz/dnsrps \ tkey/keycreate \ @@ -48,6 +49,14 @@ pipelined_pipequeries_LDADD = \ $(LDADD) \ $(LIBDNS_LIBS) +resolve_CPPFLAGS = \ + $(AM_CPPFLAGS) \ + $(LIBISC_CFLAGS) \ + $(LIBDNS_CFLAGS) \ + $(LIBIRS_CFLAGS) + +resolve_LDADD = $(LIBISC_LIBS) $(LIBIRS_LIBS) $(LIBDNS_LIBS) + tkey_keycreate_CPPFLAGS = \ $(AM_CPPFLAGS) \ $(LIBDNS_CFLAGS) diff --git a/bin/tests/system/conf.sh.in b/bin/tests/system/conf.sh.in index 08983b65f8..9f4524b708 100644 --- a/bin/tests/system/conf.sh.in +++ b/bin/tests/system/conf.sh.in @@ -51,7 +51,7 @@ NZD2NZF=$TOP_BUILDDIR/bin/tools/named-nzd2nzf PK11DEL="$TOP_BUILDDIR/bin/pkcs11/pkcs11-destroy -s ${SLOT:-0} -p ${HSMPIN:-1234} -w 0" PK11GEN="$TOP_BUILDDIR/bin/pkcs11/pkcs11-keygen -q -s ${SLOT:-0} -p ${HSMPIN:-1234}" PK11LIST="$TOP_BUILDDIR/bin/pkcs11/pkcs11-list -s ${SLOT:-0} -p ${HSMPIN:-1234}" -RESOLVE=$TOP_BUILDDIR/lib/samples/resolve +RESOLVE=$TOP_BUILDDIR/bin/tests/system/resolve REVOKE=$TOP_BUILDDIR/bin/dnssec/dnssec-revoke RNDC=$TOP_BUILDDIR/bin/rndc/rndc RNDCCONFGEN=$TOP_BUILDDIR/bin/confgen/rndc-confgen diff --git a/bin/tests/system/conf.sh.win32 b/bin/tests/system/conf.sh.win32 index ca41063109..bdebe0885c 100644 --- a/bin/tests/system/conf.sh.win32 +++ b/bin/tests/system/conf.sh.win32 @@ -51,7 +51,6 @@ NZD2NZF=$TOP_BUILDDIR/Build/$VSCONF/named-nzd2nzf@EXEEXT@ PK11DEL="$TOP_BUILDDIR/Build/$VSCONF/pkcs11-destroy@EXEEXT@ -s ${SLOT:-0} -p ${HSMPIN:-1234} -w 0" PK11GEN="$TOP_BUILDDIR/Build/$VSCONF/pkcs11-keygen@EXEEXT@ -q -s ${SLOT:-0} -p ${HSMPIN:-1234}" PK11LIST="$TOP_BUILDDIR/Build/$VSCONF/pkcs11-list@EXEEXT@ -s ${SLOT:-0} -p ${HSMPIN:-1234}" -RESOLVE=$TOP_BUILDDIR/lib/samples/resolve REVOKE=$TOP_BUILDDIR/Build/$VSCONF/dnssec-revoke@EXEEXT@ RNDC=$TOP_BUILDDIR/Build/$VSCONF/rndc@EXEEXT@ RNDCCONFGEN=$TOP_BUILDDIR/Build/$VSCONF/rndc-confgen@EXEEXT@ @@ -70,6 +69,7 @@ KEYCREATE=$TOP_BUILDDIR/Build/$VSCONF/keycreate@EXEEXT@ KEYDELETE=$TOP_BUILDDIR/Build/$VSCONF/keydelete@EXEEXT@ MAKEJOURNAL=$TOP_BUILDDIR/Build/$VSCONF/makejournal@EXEEXT@ PIPEQUERIES=$TOP_BUILDDIR/Build/$VSCONF/pipequeries@EXEEXT@ +RESOLVE=$TOP_BUILDDIR/Build/$VSCONF/resolve@EXEEXT@ # we don't want a KRB5_CONFIG setting breaking the tests KRB5_CONFIG=NUL diff --git a/lib/samples/resolve.c b/bin/tests/system/resolve.c similarity index 100% rename from lib/samples/resolve.c rename to bin/tests/system/resolve.c diff --git a/lib/samples/win32/resolve.vcxproj.filters.in b/bin/tests/system/win32/resolve.vcxproj.filters.in similarity index 100% rename from lib/samples/win32/resolve.vcxproj.filters.in rename to bin/tests/system/win32/resolve.vcxproj.filters.in diff --git a/lib/samples/win32/resolve.vcxproj.in b/bin/tests/system/win32/resolve.vcxproj.in similarity index 100% rename from lib/samples/win32/resolve.vcxproj.in rename to bin/tests/system/win32/resolve.vcxproj.in diff --git a/lib/samples/win32/resolve.vcxproj.user b/bin/tests/system/win32/resolve.vcxproj.user similarity index 100% rename from lib/samples/win32/resolve.vcxproj.user rename to bin/tests/system/win32/resolve.vcxproj.user diff --git a/bin/win32/BINDInstall/BINDInstall.vcxproj.in b/bin/win32/BINDInstall/BINDInstall.vcxproj.in index f4415ad159..18f783ecbd 100644 --- a/bin/win32/BINDInstall/BINDInstall.vcxproj.in +++ b/bin/win32/BINDInstall/BINDInstall.vcxproj.in @@ -258,6 +258,9 @@ {E1478F40-786C-4738-8E99-E7A71DD98661} + + {F66D8B7E-721D-4602-99AD-820D19AD1313} + @END STESTS {91E60FDA-E48C-4DA0-92A2-97F963348E00} @@ -298,11 +301,6 @@ {82ACD33C-E75F-45B8-BB6D-42643A10D7EE} -@IF SAMPLES - - {F66D8B7E-721D-4602-99AD-820D19AD1313} - -@END SAMPLES {0D745CD9-FC3B-49DC-99BE-1E6DF85593F0} diff --git a/configure.ac b/configure.ac index c05600872f..48fa826bae 100644 --- a/configure.ac +++ b/configure.ac @@ -1616,8 +1616,7 @@ AC_CONFIG_FILES([lib/Makefile lib/irs/Makefile lib/isccfg/Makefile lib/isccc/Makefile - lib/bind9/Makefile - lib/samples/Makefile]) + lib/bind9/Makefile]) # Documentation diff --git a/lib/Makefile.am b/lib/Makefile.am index 5cbaf3c895..39741a427f 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -1,3 +1,3 @@ include $(top_srcdir)/Makefile.top -SUBDIRS = isc dns isccc ns isccfg bind9 irs samples +SUBDIRS = isc dns isccc ns isccfg bind9 irs diff --git a/lib/samples/.gitignore b/lib/samples/.gitignore deleted file mode 100644 index 0cc4fa42aa..0000000000 --- a/lib/samples/.gitignore +++ /dev/null @@ -1 +0,0 @@ -resolve diff --git a/lib/samples/Makefile.am b/lib/samples/Makefile.am deleted file mode 100644 index 83183b5762..0000000000 --- a/lib/samples/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -include $(top_srcdir)/Makefile.top - -AM_CPPFLAGS += \ - $(LIBISC_CFLAGS) \ - $(LIBDNS_CFLAGS) \ - $(LIBIRS_CFLAGS) - -noinst_PROGRAMS = \ - resolve - -resolve_SOURCES = resolve.c -resolve_LDADD = $(LIBISC_LIBS) $(LIBIRS_LIBS) $(LIBDNS_LIBS) diff --git a/util/copyrights b/util/copyrights index 44e00db6c6..c69312fe83 100644 --- a/util/copyrights +++ b/util/copyrights @@ -710,6 +710,7 @@ ./bin/tests/system/redirect/ns5/sign.sh SH 2019,2020,2021 ./bin/tests/system/redirect/setup.sh SH 2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021 ./bin/tests/system/redirect/tests.sh SH 2011,2012,2013,2014,2015,2016,2018,2019,2020,2021 +./bin/tests/system/resolve.c C 2009,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021 ./bin/tests/system/resolver/ans2/ans.pl PERL 2019,2020,2021 ./bin/tests/system/resolver/ans3/ans.pl PERL 2000,2001,2004,2007,2009,2012,2016,2018,2019,2020,2021 ./bin/tests/system/resolver/ans8/ans.pl PERL 2017,2018,2019,2020,2021 @@ -983,6 +984,9 @@ ./bin/tests/system/win32/pipequeries.vcxproj.filters.in X 2016,2018,2019,2020 ./bin/tests/system/win32/pipequeries.vcxproj.in X 2016,2017,2018,2019,2020 ./bin/tests/system/win32/pipequeries.vcxproj.user X 2016,2018,2019,2020,2021 +./bin/tests/system/win32/resolve.vcxproj.filters.in X 2014,2015,2018,2019,2020 +./bin/tests/system/win32/resolve.vcxproj.in X 2014,2015,2016,2017,2018,2019,2020 +./bin/tests/system/win32/resolve.vcxproj.user X 2014,2018,2019,2020,2021 ./bin/tests/system/xfer/ans5/badkeydata X 2011,2018,2019,2020,2021 ./bin/tests/system/xfer/ans5/badmessageid X 2020,2021 ./bin/tests/system/xfer/ans5/goodaxfr X 2011,2018,2019,2020,2021 @@ -2189,10 +2193,6 @@ ./lib/ns/win32/libns.vcxproj.in X 2017,2018,2019,2020 ./lib/ns/win32/libns.vcxproj.user X 2017,2018,2019,2020,2021 ./lib/ns/xfrout.c C 2017,2018,2019,2020,2021 -./lib/samples/resolve.c C 2009,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021 -./lib/samples/win32/resolve.vcxproj.filters.in X 2014,2015,2018,2019,2020 -./lib/samples/win32/resolve.vcxproj.in X 2014,2015,2016,2017,2018,2019,2020 -./lib/samples/win32/resolve.vcxproj.user X 2014,2018,2019,2020,2021 ./lib/win32/bindevt/bindevt.c C 2000,2001,2004,2007,2016,2018,2019,2020,2021 ./lib/win32/bindevt/bindevt.mc X 2001,2004,2007,2016,2018,2019,2020,2021 ./lib/win32/bindevt/bindevt.vcxproj.filters.in X 2013,2015,2018,2019,2020 diff --git a/win32utils/Configure b/win32utils/Configure index 29a96a4545..c5870ea78a 100644 --- a/win32utils/Configure +++ b/win32utils/Configure @@ -112,6 +112,8 @@ my @projectlist = ("../bin/check/win32/checkconf.vcxproj", "../bin/tests/system/win32/pipequeries.vcxproj.filters", "../bin/tests/system/win32/makejournal.vcxproj", "../bin/tests/system/win32/makejournal.vcxproj.filters", + "../bin/tests/system/win32/resolve.vcxproj", + "../bin/tests/system/win32/resolve.vcxproj.filters", "../bin/win32/BINDInstall/BINDInstall.vcxproj", "../bin/win32/BINDInstall/BINDInstall.vcxproj.filters", "../lib/bind9/win32/libbind9.vcxproj", @@ -129,8 +131,6 @@ my @projectlist = ("../bin/check/win32/checkconf.vcxproj", "../lib/isccfg/win32/libisccfg.vcxproj", "../lib/isccfg/win32/libisccfg.vcxproj.filters", "../lib/ns/win32/libns.vcxproj", - "../lib/samples/win32/resolve.vcxproj", - "../lib/samples/win32/resolve.vcxproj.filters", "../lib/win32/bindevt/bindevt.vcxproj", "../lib/win32/bindevt/bindevt.vcxproj.filters", "bind9.sln"); @@ -300,7 +300,6 @@ my @substcond = ("ATOMIC", "OPENSSL", "PKCS11", "PYTHON", - "SAMPLES", "STESTS", "TESTS", "ZLIB"); @@ -341,7 +340,6 @@ my @withlist = ("aes", "pssuspend", "python", "readline", - "samples", "system-tests", "tests", "tuning", @@ -382,7 +380,6 @@ my @help = ( " with-tests build with test suite\n", " with-extra-tests build with extra test suite\n", " with-system-tests build with system test suite\n", -" with-samples build with sample programs\n", " with-openssl[=PATH] build with OpenSSL yes|path (mandatory)\n", " with-libuv[=PATH] build with libuv yes|path (mandatory)\n", " with-nghttp2[=PATH] build with nghttp2 yes|path (mandatory)\n", @@ -425,7 +422,6 @@ my $enable_rpz_nsip = "yes"; my $enable_rpz_nsdname = "yes"; my $use_tests = "no"; my $use_stests = "no"; -my $use_samples = "no"; my $use_libuv = "auto"; my $libuv_path = "../../"; my $nghttp2_path = "../../"; @@ -717,7 +713,6 @@ if ($enable_developer eq "yes") { # TODO: dlz filesystem $use_tests = "yes"; $use_stests = "yes"; - $use_samples = "yes"; } # parse with/without @@ -739,10 +734,6 @@ sub mywith { $use_tests = "yes"; $use_stests = "yes"; } - } elsif ($key =~ /^samples$/i) { - if ($val =~ /^yes$/i) { - $use_samples = "yes"; - } } elsif ($key =~ /^openssl$/i) { if ($val =~ /^no$/i) { die "OpenSSL support is now mandatory\n"; @@ -963,9 +954,6 @@ if ($verbose) { if ($use_stests eq "yes") { print "system tests: enabled\n"; } - if ($use_samples eq "yes") { - print "sample programs: enabled\n"; - } if ($use_pkcs11 eq "no") { print "pkcs11: disabled\n"; } else { @@ -1257,11 +1245,6 @@ if ($use_stests eq "yes") { $configcond{"STESTS"} = 1; } -# with-samples -if ($use_samples eq "yes") { - $configcond{"SAMPLES"} = 1; -} - # with-libuv if ($use_libuv eq "auto") { if ($verbose) { diff --git a/win32utils/bind9.sln.in b/win32utils/bind9.sln.in index fc3ad843c7..60c4db82cc 100644 --- a/win32utils/bind9.sln.in +++ b/win32utils/bind9.sln.in @@ -22,10 +22,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libirs", "..\lib\irs\win32\ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bindevt", "..\lib\win32\bindevt\bindevt.vcxproj", "{0D745CD9-FC3B-49DC-99BE-1E6DF85593F0}" EndProject -@IF SAMPLES -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "resolve", "..\lib\samples\win32\resolve.vcxproj", "{F66D8B7E-721D-4602-99AD-820D19AD1313}" -EndProject -@END SAMPLES Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "named", "..\bin\named\win32\named.vcxproj", "{723C65DA-A96C-4BA3-A34E-44F11CA346F9}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rndc", "..\bin\rndc\win32\rndc.vcxproj", "{39721F26-8B80-4AA9-9826-2AEF7322C3D5}" @@ -97,6 +93,8 @@ EndProject @IF STESTS Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makejournal", "..\bin\tests\system\win32\makejournal.vcxproj", "{31715139-2C27-47D2-8394-71B71A8AC3D5}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "resolve", "..\bin\tests\system\win32\resolve.vcxproj", "{F66D8B7E-721D-4602-99AD-820D19AD1313}" +EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gencheck", "..\bin\tests\system\win32\gencheck.vcxproj", "{764DBE24-C8B3-46E8-BE73-196431353A5D}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bigkey", "..\bin\tests\system\win32\bigkey.vcxproj", "{61F9D673-EB5C-47A5-8907-24E034C75EF8}" @@ -156,32 +154,6 @@ Global {0D745CD9-FC3B-49DC-99BE-1E6DF85593F0}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {0D745CD9-FC3B-49DC-99BE-1E6DF85593F0}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {0D745CD9-FC3B-49DC-99BE-1E6DF85593F0}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ -@IF SAMPLES - {F66D8B7E-721D-4602-99AD-820D19AD1313}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ - {F66D8B7E-721D-4602-99AD-820D19AD1313}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ - {F66D8B7E-721D-4602-99AD-820D19AD1313}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ - {F66D8B7E-721D-4602-99AD-820D19AD1313}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ - {9FC33CA3-CE4A-4EDF-BA99-EECA4B81AD06}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ - {9FC33CA3-CE4A-4EDF-BA99-EECA4B81AD06}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ - {9FC33CA3-CE4A-4EDF-BA99-EECA4B81AD06}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ - {9FC33CA3-CE4A-4EDF-BA99-EECA4B81AD06}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ - {D42B8670-8DF6-4D90-90F7-DB5FB845AFAE}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ - {D42B8670-8DF6-4D90-90F7-DB5FB845AFAE}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ - {D42B8670-8DF6-4D90-90F7-DB5FB845AFAE}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ - {D42B8670-8DF6-4D90-90F7-DB5FB845AFAE}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ - {05682E12-523F-4DAE-8E6D-ADFDBC308AFD}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ - {05682E12-523F-4DAE-8E6D-ADFDBC308AFD}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ - {05682E12-523F-4DAE-8E6D-ADFDBC308AFD}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ - {05682E12-523F-4DAE-8E6D-ADFDBC308AFD}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ - {FF440E85-7450-439C-82EE-04C464512D0E}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ - {FF440E85-7450-439C-82EE-04C464512D0E}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ - {FF440E85-7450-439C-82EE-04C464512D0E}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ - {FF440E85-7450-439C-82EE-04C464512D0E}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ - {CB2A29F6-E73B-40AB-8AC4-2C1AAE7280BD}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ - {CB2A29F6-E73B-40AB-8AC4-2C1AAE7280BD}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ - {CB2A29F6-E73B-40AB-8AC4-2C1AAE7280BD}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ - {CB2A29F6-E73B-40AB-8AC4-2C1AAE7280BD}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ -@END SAMPLES {723C65DA-A96C-4BA3-A34E-44F11CA346F9}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {723C65DA-A96C-4BA3-A34E-44F11CA346F9}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {723C65DA-A96C-4BA3-A34E-44F11CA346F9}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ From 07e349de3cbbbe8766e1af85383070369ba7f3c5 Mon Sep 17 00:00:00 2001 From: Evan Hunt Date: Mon, 22 Mar 2021 18:56:06 -0700 Subject: [PATCH 6/6] Add CHANGES note for [GL !4835] --- CHANGES | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES b/CHANGES index 87d43915ef..1250acefa5 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +5622. [cleanup] Remove lib/samples, since export versions of libraries + are no longer maintained. [GL !4835] + 5621. [placeholder] 5620. [bug] Named would overwrite a zone file unconditionally when