From 0a35d55b99abc9f71a180df65b1a69a9639cfe40 Mon Sep 17 00:00:00 2001 From: Brian Wellington Date: Fri, 30 Jun 2000 18:44:51 +0000 Subject: [PATCH] Handle value dependent prerequisites. --- bin/nsupdate/nsupdate.c | 90 +++++++++++++++++++++-------------------- 1 file changed, 47 insertions(+), 43 deletions(-) diff --git a/bin/nsupdate/nsupdate.c b/bin/nsupdate/nsupdate.c index b72fd02943..c31ead346d 100644 --- a/bin/nsupdate/nsupdate.c +++ b/bin/nsupdate/nsupdate.c @@ -15,7 +15,7 @@ * SOFTWARE. */ -/* $Id: nsupdate.c,v 1.16 2000/06/30 06:35:50 bwelling Exp $ */ +/* $Id: nsupdate.c,v 1.17 2000/06/30 18:44:51 bwelling Exp $ */ #include @@ -638,6 +638,46 @@ make_prereq(char *cmdline, isc_boolean_t ispositive, isc_boolean_t isrrset) { } else rdatatype = dns_rdatatype_any; + result = dns_message_gettemprdata(updatemsg, &rdata); + check_result(result, "dns_message_gettemprdata"); + + rdata->data = NULL; + rdata->length = 0; + + if (isrrset && ispositive) { + while (*cmdline != 0 && isspace(*cmdline)) + cmdline++; + + if (*cmdline != 0) { + isc_lex_t *lex = NULL; + dns_rdatacallbacks_t callbacks; + isc_buffer_t *buf = NULL; + + result = isc_lex_create(mctx, WORDLEN, &lex); + check_result(result, "isc_lex_create"); + isc_buffer_invalidate(&source); + + isc_buffer_init(&source, cmdline, strlen(cmdline)); + isc_buffer_add(&source, strlen(cmdline)); + result = isc_lex_openbuffer(lex, &source); + check_result(result, "isc_lex_openbuffer"); + + result = isc_buffer_allocate(mctx, &buf, MXNAME); + check_result(result, "isc_buffer_allocate"); + dns_rdatacallbacks_init_stdio(&callbacks); + result = dns_rdata_fromtext(rdata, rdataclass, + rdatatype, lex, + current_zone, ISC_FALSE, + buf, &callbacks); + dns_message_takebuffer(updatemsg, &buf); + isc_lex_destroy(&lex); + if (result != ISC_R_SUCCESS) { + dns_message_puttempname(updatemsg, &name); + dns_message_puttemprdata(updatemsg, &rdata); + return (STATUS_MORE); + } + } + } result = dns_message_gettemprdatalist(updatemsg, &rdatalist); check_result(result, "dns_message_gettemprdatalist"); @@ -645,16 +685,15 @@ make_prereq(char *cmdline, isc_boolean_t ispositive, isc_boolean_t isrrset) { check_result(result, "dns_message_gettemprdataset"); dns_rdatalist_init(rdatalist); rdatalist->type = rdatatype; - if (ispositive) - rdatalist->rdclass = dns_rdataclass_any; - else + if (ispositive) { + if (isrrset && rdata->data != NULL) + rdatalist->rdclass = rdataclass; + else + rdatalist->rdclass = dns_rdataclass_any; + } else rdatalist->rdclass = dns_rdataclass_none; rdatalist->covers = 0; rdatalist->ttl = 0; - result = dns_message_gettemprdata(updatemsg, &rdata); - check_result(result, "dns_message_gettemprdata"); - rdata->data = NULL; - rdata->length = 0; rdata->rdclass = rdatalist->rdclass; rdata->type = rdatatype; ISC_LIST_INIT(rdatalist->rdata); @@ -709,41 +748,6 @@ evaluate_zone(char *cmdline) { UNUSED(cmdline); printf("The zone statement is not currently implemented.\n"); return (STATUS_MORE); -#if 0 - char *word; - dns_name_t *name; - isc_buffer_t src; - isc_result_t result; - dns_fixedname_t fname; - - ddebug ("evaluate_zone()"); - word = nsu_strsep(&cmdline, " \t\r\n"); - if (*word == 0) { - printf("failed to read zone name"); - return (STATUS_SYNTAX); - } else if (zonename != NULL) - dns_name_free(zonename, mctx); - - dns_fixedname_init(&fname); - name = dns_fixedname_name(&fname); - - isc_buffer_init(&src, word, strlen(word)); - isc_buffer_add(&src, strlen(word)); - - result = dns_name_fromtext(name, &src, dns_rootname, ISC_FALSE, NULL); - check_result(result, "dns_name_fromtext"); - - if (zonename == NULL) { - zonename = isc_mem_get(mctx, sizeof(dns_name_t)); - if (zonename == NULL) - fatal("out of memory"); - } - dns_name_init(zonename, NULL); - dns_name_dup(name, mctx, zonename); - current_zone = zonename; - - return (STATUS_MORE); -#endif } static isc_uint16_t