From: Willem Toorop Date: Mon, 7 Nov 2011 15:41:53 +0000 (+0000) Subject: Start with serial number update functions for soa's. X-Git-Tag: release-1.6.12~45 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=39febfa25a3916a9a8400e60e3c56ace58924346;p=thirdparty%2Fldns.git Start with serial number update functions for soa's. --- diff --git a/configure.ac b/configure.ac index 85f5ad85..d2a740bb 100644 --- a/configure.ac +++ b/configure.ac @@ -342,7 +342,9 @@ AC_INCLUDES_DEFAULT ]) ACX_TYPE_SOCKLEN_T -AC_CHECK_TYPE(ssize_t, int) +AC_TYPE_SIZE_T +AC_TYPE_SSIZE_T +AC_TYPE_INTPTR_T AC_CHECK_TYPE(in_addr_t, [], [AC_DEFINE([in_addr_t], [uint32_t], [in_addr_t])], [ #if HAVE_SYS_TYPES_H # include diff --git a/examples/ldns-read-zone.1 b/examples/ldns-read-zone.1 index 31bedaba..dd5755ce 100644 --- a/examples/ldns-read-zone.1 +++ b/examples/ldns-read-zone.1 @@ -35,6 +35,11 @@ Strip DNSSEC data from the zone. This option skips every record that is of type NSEC, NSEC3, RRSIG or DNSKEY. DS records are still printed. +.TP +\fB-S\fR \fI[+|0]number\fR +Set serial number to the given \fInumber\fR, or when preceded by a sign, +offset the exisiting number with it. + .TP \fB-v\fR Show the version and exit diff --git a/examples/ldns-read-zone.c b/examples/ldns-read-zone.c index e2aa15f1..276d1dfc 100644 --- a/examples/ldns-read-zone.c +++ b/examples/ldns-read-zone.c @@ -34,8 +34,10 @@ main(int argc, char **argv) ldns_rr *cur_rr; ldns_rr_type cur_rr_type; const ldns_output_format *fmt = NULL; + ldns_soa_serial_increment_func_t soa_serial_increment_func = NULL; + int soa_serial_increment_func_data; - while ((c = getopt(argc, argv, "bcdhnsvz")) != -1) { + while ((c = getopt(argc, argv, "bcdhnsvzS:")) != -1) { switch(c) { case 'b': fmt = ldns_output_format_bubblebabble; @@ -58,6 +60,12 @@ main(int argc, char **argv) printf("\t-h show this text\n"); printf("\t-n do not print the SOA record\n"); printf("\t-s strip DNSSEC data from the zone\n"); + printf("\t-S [+|-]\n" + "\t\tSet serial number to or," + " when preceded by a sign,\n" + "\t\toffset the exisiting number with " + ".\n"); + printf("\t-v shows the version and exits\n"); printf("\t-z sort the zone (implies -c).\n"); printf("\nif no file is given standard input is read\n"); @@ -80,6 +88,26 @@ main(int argc, char **argv) canonicalize = true; sort = true; break; + case 'S': + strip = true; + if (*optarg == '+' || *optarg == '-') { + soa_serial_increment_func_data = + atoi(optarg); + soa_serial_increment_func = + ldns_soa_serial_increment_by; + } else if (! strtok(optarg, "0123456789")) { + soa_serial_increment_func_data = + atoi(optarg); + soa_serial_increment_func = + ldns_soa_serial_identity; + } else { + fprintf(stderr, "-S expects a number " + "optionally preceded by a " + "+ or - sign to indicate an " + "offset.\n"); + exit(EXIT_FAILURE); + } + break; } } @@ -147,6 +175,13 @@ main(int argc, char **argv) } if (print_soa && ldns_zone_soa(z)) { + if (soa_serial_increment_func) { + ldns_rr_soa_increment_func_int( + ldns_zone_soa(z) + , soa_serial_increment_func + , soa_serial_increment_func_data + ); + } ldns_rr_print_fmt(stdout, fmt, ldns_zone_soa(z)); } ldns_rr_list_print_fmt(stdout, fmt, ldns_zone_rrs(z)); diff --git a/ldns/rr_functions.h b/ldns/rr_functions.h index 635a1256..dade1442 100644 --- a/ldns/rr_functions.h +++ b/ldns/rr_functions.h @@ -252,6 +252,24 @@ size_t ldns_rr_dnskey_key_size_raw(const unsigned char *keydata, */ size_t ldns_rr_dnskey_key_size(const ldns_rr *key); +typedef uint32_t (*ldns_soa_serial_increment_func_t)(uint32_t, void*); + +uint32_t ldns_soa_serial_identity(uint32_t _, void *data); +uint32_t ldns_soa_serial_increment(uint32_t s, void *_); +uint32_t ldns_soa_serial_increment_by(uint32_t s, void *data); + +void ldns_rr_soa_increment( + ldns_rr *soa); + +void ldns_rr_soa_increment_func( + ldns_rr *soa, ldns_soa_serial_increment_func_t f); + +void ldns_rr_soa_increment_func_data( + ldns_rr *soa, ldns_soa_serial_increment_func_t f, void *data); + +void ldns_rr_soa_increment_func_int( + ldns_rr *soa, ldns_soa_serial_increment_func_t f, int data); + #ifdef __cplusplus } #endif diff --git a/ldns_symbols.def b/ldns_symbols.def index 5d0346c6..8552bb30 100644 --- a/ldns_symbols.def +++ b/ldns_symbols.def @@ -641,6 +641,10 @@ ldns_rr_set_rd_count ldns_rr_set_rdf ldns_rr_set_ttl ldns_rr_set_type +ldns_rr_soa_increment +ldns_rr_soa_increment_func +ldns_rr_soa_increment_func_data +ldns_rr_soa_increment_func_int ldns_rrsig2buffer_wire ldns_rr_ttl ldns_rr_type2buffer_str @@ -662,6 +666,9 @@ ldns_sign_public_dsa ldns_sign_public_evp ldns_sign_public_rsamd5 ldns_sign_public_rsasha1 +ldns_soa_serial_identity +ldns_soa_serial_increment +ldns_soa_serial_increment_by ldns_sockaddr_storage2rdf ldns_str2period ldns_str2rdf_a diff --git a/rr_functions.c b/rr_functions.c index 9dca09e9..3f4144bf 100644 --- a/rr_functions.c +++ b/rr_functions.c @@ -340,3 +340,61 @@ ldns_rr_dnskey_key_size(const ldns_rr *key) ldns_rdf2native_int8(ldns_rr_dnskey_algorithm(key)) ); } + +uint32_t ldns_soa_serial_identity(uint32_t ATTR_UNUSED(_), void *data) +{ + return (intptr_t)data; /* yes, data is int not pointer! */ +} + +uint32_t ldns_soa_serial_increment(uint32_t s, void *ATTR_UNUSED(_)) +{ + return ldns_soa_serial_increment_by(s, (void *)1); +} + +uint32_t ldns_soa_serial_increment_by(uint32_t s, void *data) +{ + return s + (intptr_t)data; +} + +void +ldns_rr_soa_increment(ldns_rr *soa) +{ + ldns_rr_soa_increment_func_data(soa, ldns_soa_serial_increment, NULL); +} + +void +ldns_rr_soa_increment_func(ldns_rr *soa, ldns_soa_serial_increment_func_t f) +{ + ldns_rr_soa_increment_func_data(soa, f, NULL); +} + +void +ldns_rr_soa_increment_func_data(ldns_rr *soa, + ldns_soa_serial_increment_func_t f, void *data) +{ + ldns_rdf *prev_soa_serial_rdf; + if ( !soa || !f || ldns_rr_get_type(soa) != LDNS_RR_TYPE_SOA + || !ldns_rr_rdf(soa, 2)) { + return; + } + prev_soa_serial_rdf = ldns_rr_set_rdf( + soa + , ldns_native2rdf_int32( + LDNS_RDF_TYPE_INT32 + , (*f)( ldns_rdf2native_int32( + ldns_rr_rdf(soa, 2)) + , data + ) + ) + , 2 + ); + LDNS_FREE(prev_soa_serial_rdf); +} + +void +ldns_rr_soa_increment_func_int(ldns_rr *soa, + ldns_soa_serial_increment_func_t f, int data) +{ + ldns_rr_soa_increment_func_data(soa, f, (void *) (intptr_t) data); +} +