From: Jelte Jansen Date: Wed, 1 Oct 2008 10:30:23 +0000 (+0000) Subject: ondrej's patch + minor fix. X-Git-Tag: release-1.4.0~40 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e5e73f4cb7c440694b5da7ed048e9a82e87795ad;p=thirdparty%2Fldns.git ondrej's patch + minor fix. Updated manual page --- diff --git a/examples/ldns-compare-zones.1 b/examples/ldns-compare-zones.1 index ed9671ce..1a005aa0 100644 --- a/examples/ldns-compare-zones.1 +++ b/examples/ldns-compare-zones.1 @@ -6,6 +6,7 @@ ldns-compare-zones \- read and compare two zonefiles and print differences .IR [-c] .IR [-i] .IR [-d] +.IR [-z] .IR ZONEFILE1 .IR ZONEFILE2 @@ -30,6 +31,11 @@ Print resource records whose owner names are present only in ZONEFILE2 (a.k.a. i \fB-d\fR Print resource records whose owner names are present only in ZONEFILE1 (a.k.a. deleted) +.TP +\fB-z\fR +Suppress zone sorting; this option is not recommended; it can cause records +to be incorrectly marked as changed, depending of the nature of the changes. + .TP \fB-h\fR Show usage and exit diff --git a/examples/ldns-compare-zones.c b/examples/ldns-compare-zones.c index 5dac8ba7..ee4b4b52 100644 --- a/examples/ldns-compare-zones.c +++ b/examples/ldns-compare-zones.c @@ -30,6 +30,7 @@ usage(int argc, char **argv) printf(" -i - print inserted\n"); printf(" -d - print deleted\n"); printf(" -c - print changed\n"); + printf(" -z - do not sort zones\n"); } int @@ -47,10 +48,11 @@ main(int argc, char **argv) size_t rrc1 , rrc2; size_t num_ins = 0, num_del = 0, num_chg = 0; int c; - int opt_deleted = 0, opt_inserted = 0, opt_changed = 0; + bool opt_deleted = false, opt_inserted = false, opt_changed = false; + bool sort = true; char op = 0; - while ((c = getopt(argc, argv, "hvdic")) != -1) { + while ((c = getopt(argc, argv, "hvdicz")) != -1) { switch (c) { case 'h': usage(argc, argv); @@ -63,14 +65,17 @@ main(int argc, char **argv) ldns_version()); exit(EXIT_SUCCESS); break; + case 'z': + sort = false; + break; case 'd': - opt_deleted = 1; + opt_deleted = true; break; case 'i': - opt_inserted = 1; + opt_inserted = true; break; case 'c': - opt_changed = 1; + opt_changed = true; break; } } @@ -87,16 +92,12 @@ main(int argc, char **argv) fn1 = argv[0]; fp1 = fopen(fn1, "r"); if (!fp1) { - fprintf(stderr, "Unable to open %s: %s\n", - fn1, strerror(errno)); + fprintf(stderr, "Unable to open %s: %s\n", fn1, strerror(errno)); exit(EXIT_FAILURE); } /* Read first zone */ - s = ldns_zone_new_frm_fp_l(&z1, - fp1, - NULL, - 0, - LDNS_RR_CLASS_IN, &line_nr1); + s = ldns_zone_new_frm_fp_l(&z1, fp1, NULL, 0, + LDNS_RR_CLASS_IN, &line_nr1); if (s != LDNS_STATUS_OK) { fclose(fp1); fprintf(stderr, "%s: %s at %d\n", @@ -110,16 +111,12 @@ main(int argc, char **argv) fn2 = argv[1]; fp2 = fopen(fn2, "r"); if (!fp2) { - fprintf(stderr, "Unable to open %s: %s\n", - fn2, strerror(errno)); + fprintf(stderr, "Unable to open %s: %s\n", fn2, strerror(errno)); exit(EXIT_FAILURE); } /* Read second zone */ - s = ldns_zone_new_frm_fp_l(&z2, - fp2, - NULL, - 0, - LDNS_RR_CLASS_IN, &line_nr2); + s = ldns_zone_new_frm_fp_l(&z2, fp2, NULL, 0, + LDNS_RR_CLASS_IN, &line_nr2); if (s != LDNS_STATUS_OK) { ldns_zone_deep_free(z1); fclose(fp2); @@ -137,6 +134,23 @@ main(int argc, char **argv) rrl2 = ldns_zone_rrs(z2); rrc2 = ldns_rr_list_rr_count(rrl2); + if (sort) { + /* canonicalize zone 1 */ + ldns_rr2canonical(ldns_zone_soa(z1)); + for (i = 0; i < ldns_rr_list_rr_count(ldns_zone_rrs(z1)); i++) { + ldns_rr2canonical(ldns_rr_list_rr(ldns_zone_rrs(z1), i)); + } + /* sort zone 1 */ + ldns_zone_sort(z1); + /* canonicalize zone 2 */ + ldns_rr2canonical(ldns_zone_soa(z2)); + for (i = 0; i < ldns_rr_list_rr_count(ldns_zone_rrs(z2)); i++) { + ldns_rr2canonical(ldns_rr_list_rr(ldns_zone_rrs(z2), i)); + } + /* sort zone 2 */ + ldns_zone_sort(z2); + } + /* * Walk through both zones. The previously seen resource record is * kept (in the variable rrx) so that we can recognize when we are