n=`expr $n + 1`
echo "I:check that dns_client_update handles prerequisite YXRRSET failure ($n)"
-$SAMPLEUPDATE -P 5300 -a 10.53.0.1 -a 10.53.0.2 -p "yxrrset no-txt.sample TXT" \
+$SAMPLEUPDATE -s -P 5300 -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 5300 -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
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; }
#
*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));
+ if (event != NULL) {
+ result = ISC_R_SUCCESS;
+ isc_task_send(task, &event);
+ } else
+ result = ISC_R_NOMEMORY;
+ }
if (result == ISC_R_SUCCESS)
return (result);
*transp = NULL;
static void
usage(void) {
fprintf(stderr, "sample-update "
+ "-s "
"[-a auth_server] "
"[-k keyfile] "
"[-p prerequisite] "
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;
+ isc_sockaddrlist_t auth_servers, *auth_serversp = &auth_servers;
isc_result_t result;
isc_boolean_t isdelete;
isc_buffer_t b, *buf;
dns_rdata_t *rdata;
dns_namelist_t updatelist, prereqlist, *prereqlistp = NULL;
isc_mem_t *umctx = NULL;
+ isc_boolean_t sendtwice;
ISC_LIST_INIT(auth_servers);
ISC_LIST_INIT(rec_servers);
- while ((ch = isc_commandline_parse(argc, argv, "a:k:p:P:r:z:")) != EOF) {
+ while ((ch = isc_commandline_parse(argc, argv, "a:k:p:P:r:sz:")) != EOF) {
switch (ch) {
case 'k':
keyfilename = isc_commandline_argument;
&sa_recursive[nsa_recursive]))
nsa_recursive++;
break;
+ case 's':
+ sendtwice = ISC_TRUE;
+ break;
case 'z':
zonenamestr = isc_commandline_argument;
break;
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,
- (ISC_LIST_HEAD(auth_servers) == NULL) ?
- NULL : &auth_servers, tsec, 0);
+ 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) {