]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
Start with serial number update functions for soa's.
authorWillem Toorop <willem@NLnetLabs.nl>
Mon, 7 Nov 2011 15:41:53 +0000 (15:41 +0000)
committerWillem Toorop <willem@NLnetLabs.nl>
Mon, 7 Nov 2011 15:41:53 +0000 (15:41 +0000)
configure.ac
examples/ldns-read-zone.1
examples/ldns-read-zone.c
ldns/rr_functions.h
ldns_symbols.def
rr_functions.c

index 85f5ad8582c194f73a00434a60edd96c8e3a0df1..d2a740bb9e372ec95b99fdd1488b983deff31326 100644 (file)
@@ -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 <sys/types.h>
index 31bedaba62d40e5a549a9bf9b46333e241febd8a..dd5755ce1b69688e8fdbb28e27255f3646c86bd4 100644 (file)
@@ -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
index e2aa15f17f18b37d1c99051e12670d9b2d49319d..276d1dfca87bb1df67efdfde01618c3cd88a1fb6 100644 (file)
@@ -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 [+|-]<number>\n"
+                                      "\t\tSet serial number to <number> or,"
+                                               " when preceded by a sign,\n"
+                                      "\t\toffset the exisiting number with "
+                                               "<number>.\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));
index 635a1256f37ad12b17690a926939788765cd39de..dade1442ce6376c2d174fd3e15cdbcab75060dfd 100644 (file)
@@ -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
index 5d0346c680f57acef1e77f3c34bd0b6d77d75d37..8552bb30965b1bc94563d0284117f077eeb2d5b4 100644 (file)
@@ -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
index 9dca09e9e7b70b82c683b25662b81613e1bbec07..3f4144bf486da086b8f64224b298e0f75e40b76b 100644 (file)
@@ -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);
+}
+