]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
4506. [func] 'named-checkconf -l' will now list the zones found in
authorMark Andrews <marka@isc.org>
Wed, 2 Nov 2016 06:47:51 +0000 (17:47 +1100)
committerMark Andrews <marka@isc.org>
Wed, 2 Nov 2016 06:47:51 +0000 (17:47 +1100)
                        named.conf. [RT #43154]

CHANGES
bin/check/named-checkconf.c
bin/check/named-checkconf.docbook
bin/tests/system/checkconf/clean.sh
bin/tests/system/checkconf/good.zonelist [new file with mode: 0644]
bin/tests/system/checkconf/tests.sh

diff --git a/CHANGES b/CHANGES
index 99cd8aee32e9488d96bd27785465895381dc8596..8e1d5ab72fc9ace6c21faf8610f33b681823707f 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+4506.  [func]          'named-checkconf -l' will now list the zones found in
+                       named.conf. [RT #43154]
+
 4505.  [port]          Use IP_PMTUDISC_OMIT if available. [RT #35494]
 
 4504.  [security]      Allow the maximum number of records in a zone to
index 43694a707f53e0d47a301647278aa2ef06afdd57..36b88efb9c3347377bab024c94161b6a5337bf3a 100644 (file)
@@ -59,7 +59,7 @@ usage(void) ISC_PLATFORM_NORETURN_POST;
 
 static void
 usage(void) {
-       fprintf(stderr, "usage: %s [-hjvz] [-p [-x]] [-t directory] "
+       fprintf(stderr, "usage: %s [-hjlvz] [-p [-x]] [-t directory] "
                "[named.conf]\n", program);
        exit(1);
 }
@@ -162,7 +162,7 @@ configure_hint(const char *zfile, const char *zclass, isc_mem_t *mctx) {
 static isc_result_t
 configure_zone(const char *vclass, const char *view,
               const cfg_obj_t *zconfig, const cfg_obj_t *vconfig,
-              const cfg_obj_t *config, isc_mem_t *mctx)
+              const cfg_obj_t *config, isc_mem_t *mctx, isc_boolean_t list)
 {
        int i = 0;
        isc_result_t result;
@@ -204,6 +204,10 @@ configure_zone(const char *vclass, const char *view,
        maps[i] = NULL;
 
        cfg_map_get(zoptions, "in-view", &inviewobj);
+       if (inviewobj != NULL && list) {
+               const char *inview = cfg_obj_asstring(inviewobj);
+               printf("%s %s %s in-view %s\n", zname, zclass, view, inview);
+       }
        if (inviewobj != NULL)
                return (ISC_R_SUCCESS);
 
@@ -211,6 +215,12 @@ configure_zone(const char *vclass, const char *view,
        if (typeobj == NULL)
                return (ISC_R_FAILURE);
 
+       if (list) {
+               const char *ztype = cfg_obj_asstring(typeobj);
+               printf("%s %s %s %s\n", zname, zclass, view, ztype);
+               return (ISC_R_SUCCESS);
+       }
+
        /*
         * Skip checks when using an alternate data source.
         */
@@ -401,7 +411,7 @@ configure_zone(const char *vclass, const char *view,
 /*% configure a view */
 static isc_result_t
 configure_view(const char *vclass, const char *view, const cfg_obj_t *config,
-              const cfg_obj_t *vconfig, isc_mem_t *mctx)
+              const cfg_obj_t *vconfig, isc_mem_t *mctx, isc_boolean_t list)
 {
        const cfg_listelt_t *element;
        const cfg_obj_t *voptions;
@@ -425,7 +435,7 @@ configure_view(const char *vclass, const char *view, const cfg_obj_t *config,
        {
                const cfg_obj_t *zconfig = cfg_listelt_value(element);
                tresult = configure_zone(vclass, view, zconfig, vconfig,
-                                        config, mctx);
+                                        config, mctx, list);
                if (tresult != ISC_R_SUCCESS)
                        result = tresult;
        }
@@ -449,7 +459,9 @@ config_getclass(const cfg_obj_t *classobj, dns_rdataclass_t defclass,
 
 /*% load zones from the configuration */
 static isc_result_t
-load_zones_fromconfig(const cfg_obj_t *config, isc_mem_t *mctx) {
+load_zones_fromconfig(const cfg_obj_t *config, isc_mem_t *mctx,
+                     isc_boolean_t list_zones)
+{
        const cfg_listelt_t *element;
        const cfg_obj_t *views;
        const cfg_obj_t *vconfig;
@@ -480,13 +492,15 @@ load_zones_fromconfig(const cfg_obj_t *config, isc_mem_t *mctx) {
 
                dns_rdataclass_format(viewclass, buf, sizeof(buf));
                vname = cfg_obj_asstring(cfg_tuple_get(vconfig, "name"));
-               tresult = configure_view(buf, vname, config, vconfig, mctx);
+               tresult = configure_view(buf, vname, config, vconfig, mctx,
+                                        list_zones);
                if (tresult != ISC_R_SUCCESS)
                        result = tresult;
        }
 
        if (views == NULL) {
-               tresult = configure_view("IN", "_default", config, NULL, mctx);
+               tresult = configure_view("IN", "_default", config, NULL, mctx,
+                                        list_zones);
                if (tresult != ISC_R_SUCCESS)
                        result = tresult;
        }
@@ -516,6 +530,7 @@ main(int argc, char **argv) {
        int exit_status = 0;
        isc_entropy_t *ectx = NULL;
        isc_boolean_t load_zones = ISC_FALSE;
+       isc_boolean_t list_zones = ISC_FALSE;
        isc_boolean_t print = ISC_FALSE;
        unsigned int flags = 0;
 
@@ -524,7 +539,7 @@ main(int argc, char **argv) {
        /*
         * Process memory debugging argument first.
         */
-#define CMDLINE_FLAGS "dhjm:t:pvxz"
+#define CMDLINE_FLAGS "dhjlm:t:pvxz"
        while ((c = isc_commandline_parse(argc, argv, CMDLINE_FLAGS)) != -1) {
                switch (c) {
                case 'm':
@@ -557,6 +572,10 @@ main(int argc, char **argv) {
                        nomerge = ISC_FALSE;
                        break;
 
+               case 'l':
+                       list_zones = ISC_TRUE;
+                       break;
+
                case 'm':
                        break;
 
@@ -607,6 +626,10 @@ main(int argc, char **argv) {
                fprintf(stderr, "%s: -x cannot be used without -p\n", program);
                exit(1);
        }
+       if (print && list_zones) {
+               fprintf(stderr, "%s: -l cannot be used with -p\n", program);
+               exit(1);
+       }
 
        if (isc_commandline_index + 1 < argc)
                usage();
@@ -639,8 +662,8 @@ main(int argc, char **argv) {
        if (result != ISC_R_SUCCESS)
                exit_status = 1;
 
-       if (result == ISC_R_SUCCESS && load_zones) {
-               result = load_zones_fromconfig(config, mctx);
+       if (result == ISC_R_SUCCESS && (load_zones || list_zones)) {
+               result = load_zones_fromconfig(config, mctx, list_zones);
                if (result != ISC_R_SUCCESS)
                        exit_status = 1;
        }
index acb60a0b2ceeaadd8f6c71ccd62d63f166443e94..b93b02603a2713c785c18e458a8b8494dd3f0581 100644 (file)
@@ -48,7 +48,7 @@
   <refsynopsisdiv>
     <cmdsynopsis sepchar=" ">
       <command>named-checkconf</command>
-      <arg choice="opt" rep="norepeat"><option>-hjvz</option></arg>
+      <arg choice="opt" rep="norepeat"><option>-hjlvz</option></arg>
       <arg choice="opt" rep="norepeat"><option>-p</option>
        <arg choice="opt" rep="norepeat"><option>-x</option>
       </arg></arg>
         </listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term>-l</term>
+        <listitem>
+          <para>
+            List all the configured zones. Each line of output
+            contains the zone name, class (e.g. IN), view, and type
+            (e.g. master or slave).
+          </para>
+        </listitem>
+      </varlistentry>
+
       <varlistentry>
         <term>-p</term>
         <listitem>
index 8821a485fe63d182480b2d83969385cee99eaecc..a5212c905c276e8614e3e8f5ea90b3cecf5acf99 100644 (file)
@@ -9,4 +9,5 @@
 rm -f good.conf.in good.conf.out badzero.conf *.out
 rm -rf test.keydir
 rm -f checkconf.out*
+rm -f diff.out*
 rm -f ns*/named.lock
diff --git a/bin/tests/system/checkconf/good.zonelist b/bin/tests/system/checkconf/good.zonelist
new file mode 100644 (file)
index 0000000..7cb9adf
--- /dev/null
@@ -0,0 +1,9 @@
+example1 IN first master
+clone IN first master
+example1 IN second master
+example2 IN second static-stub
+clone IN second in-view first
+. IN second redirect
+clone IN third in-view first
+dnssec IN third master
+hostname.bind chaos chaos master
index fc4f3d7fe95601f1e210d7b0cf09ce7e7bf187f8..3385c78200c984d563ec0af10f1aa604d2723e52 100644 (file)
@@ -8,14 +8,17 @@ SYSTEMTESTTOP=..
 . $SYSTEMTESTTOP/conf.sh
 
 status=0
+n=0
 
-echo "I: checking that named-checkconf handles a known good config"
+n=`expr $n + 1`
+echo "I: checking that named-checkconf handles a known good config ($n)"
 ret=0
 $CHECKCONF good.conf > /dev/null 2>&1 || ret=1
 if [ $ret != 0 ]; then echo "I:failed"; fi
 status=`expr $status + $ret`
 
-echo "I: checking that named-checkconf prints a known good config"
+n=`expr $n + 1`
+echo "I: checking that named-checkconf prints a known good config ($n)"
 ret=0
 awk 'BEGIN { ok = 0; } /cut here/ { ok = 1; getline } ok == 1 { print }' good.conf > good.conf.in
 [ -s good.conf.in ] || ret=1
@@ -24,7 +27,8 @@ cmp good.conf.in good.conf.out || ret=1
 if [ $ret != 0 ]; then echo "I:failed"; fi
 status=`expr $status + $ret`
 
-echo "I: checking that named-checkconf -x removes secrets"
+n=`expr $n + 1`
+echo "I: checking that named-checkconf -x removes secrets ($n)"
 ret=0
 # ensure there is a secret and that it is not the check string.
 grep 'secret "' good.conf.in > /dev/null || ret=1
@@ -36,8 +40,9 @@ status=`expr $status + $ret`
 
 for bad in bad-*.conf
 do
+       n=`expr $n + 1`
+       echo "I: checking that named-checkconf detects error in $bad ($n)"
        ret=0
-       echo "I: checking that named-checkconf detects error in $bad"
        $CHECKCONF $bad > /dev/null 2>&1
        if [ $? != 1 ]; then echo "I:failed"; ret=1; fi
        status=`expr $status + $ret`
@@ -45,34 +50,39 @@ done
 
 for good in good-*.conf
 do
+       n=`expr $n + 1`
+       echo "I: checking that named-checkconf detects no error in $good ($n)"
        ret=0
-       echo "I: checking that named-checkconf detects no error in $good"
        $CHECKCONF $good > /dev/null 2>&1
        if [ $? != 0 ]; then echo "I:failed"; ret=1; fi
        status=`expr $status + $ret`
 done
 
-echo "I: checking that named-checkconf -z catches missing hint file"
+n=`expr $n + 1`
+echo "I: checking that named-checkconf -z catches missing hint file ($n)"
 ret=0
 $CHECKCONF -z hint-nofile.conf > hint-nofile.out 2>&1 && ret=1
 grep "could not configure root hints from 'nonexistent.db': file not found" hint-nofile.out > /dev/null || ret=1
 if [ $ret != 0 ]; then echo "I:failed"; fi
 status=`expr $status + $ret`
 
-echo "I: checking that named-checkconf catches range errors"
+n=`expr $n + 1`
+echo "I: checking that named-checkconf catches range errors ($n)"
 ret=0
 $CHECKCONF range.conf > /dev/null 2>&1 && ret=1
 if [ $ret != 0 ]; then echo "I:failed"; fi
 status=`expr $status + $ret`
 
-echo "I: checking that named-checkconf warns of notify inconsistencies"
+n=`expr $n + 1`
+echo "I: checking that named-checkconf warns of notify inconsistencies ($n)"
 ret=0
 warnings=`$CHECKCONF notify.conf 2>&1 | grep "'notify' is disabled" | wc -l`
 [ $warnings -eq 3 ] || ret=1
 if [ $ret != 0 ]; then echo "I:failed"; fi
 status=`expr $status + $ret`
 
-echo "I: checking named-checkconf dnssec warnings"
+n=`expr $n + 1`
+echo "I: checking named-checkconf dnssec warnings ($n)"
 ret=0
 $CHECKCONF dnssec.1 2>&1 | grep 'validation yes.*enable no' > /dev/null || ret=1
 $CHECKCONF dnssec.2 2>&1 | grep 'auto-dnssec may only be ' > /dev/null || ret=1
@@ -83,7 +93,8 @@ $CHECKCONF dnssec.3 2>&1 | grep '.*' && ret=1
 if [ $ret != 0 ]; then echo "I:failed"; fi
 status=`expr $status + $ret`
 
-echo "I: range checking fields that do not allow zero"
+n=`expr $n + 1`
+echo "I: range checking fields that do not allow zero ($n)"
 ret=0
 for field in max-retry-time min-retry-time max-refresh-time min-refresh-time; do
     cat > badzero.conf << EOF
@@ -122,49 +133,53 @@ done
 if [ $ret != 0 ]; then echo "I:failed"; fi
 status=`expr $status + $ret`
 
-echo "I: checking options allowed in inline-signing slaves"
+echo "I: checking options allowed in inline-signing slaves ($n)"
 ret=0
-n=`$CHECKCONF bad-dnssec.conf 2>&1 | grep "dnssec-dnskey-kskonly.*requires inline" | wc -l`
-[ $n -eq 1 ] || ret=1
-n=`$CHECKCONF bad-dnssec.conf 2>&1 | grep "dnssec-loadkeys-interval.*requires inline" | wc -l`
-[ $n -eq 1 ] || ret=1
-n=`$CHECKCONF bad-dnssec.conf 2>&1 | grep "update-check-ksk.*requires inline" | wc -l`
-[ $n -eq 1 ] || ret=1
+l=`$CHECKCONF bad-dnssec.conf 2>&1 | grep "dnssec-dnskey-kskonly.*requires inline" | wc -l`
+[ $l -eq 1 ] || ret=1
+l=`$CHECKCONF bad-dnssec.conf 2>&1 | grep "dnssec-loadkeys-interval.*requires inline" | wc -l`
+[ $l -eq 1 ] || ret=1
+l=`$CHECKCONF bad-dnssec.conf 2>&1 | grep "update-check-ksk.*requires inline" | wc -l`
+[ $l -eq 1 ] || ret=1
 if [ $ret != 0 ]; then echo "I:failed"; fi
 status=`expr $status + $ret`
 
-echo "I: check file + inline-signing for slave zones"
-n=`$CHECKCONF inline-no.conf 2>&1 | grep "missing 'file' entry" | wc -l`
-[ $n -eq 0 ] || ret=1
-n=`$CHECKCONF inline-good.conf 2>&1 | grep "missing 'file' entry" | wc -l`
-[ $n -eq 0 ] || ret=1
-n=`$CHECKCONF inline-bad.conf 2>&1 | grep "missing 'file' entry" | wc -l`
-[ $n -eq 1 ] || ret=1
+n=`expr $n + 1`
+echo "I: check file + inline-signing for slave zones ($n)"
+l=`$CHECKCONF inline-no.conf 2>&1 | grep "missing 'file' entry" | wc -l`
+[ $l -eq 0 ] || ret=1
+l=`$CHECKCONF inline-good.conf 2>&1 | grep "missing 'file' entry" | wc -l`
+[ $l -eq 0 ] || ret=1
+l=`$CHECKCONF inline-bad.conf 2>&1 | grep "missing 'file' entry" | wc -l`
+[ $l -eq 1 ] || ret=1
 if [ $ret != 0 ]; then echo "I:failed"; fi
 status=`expr $status + $ret`
 
-echo "I: checking named-checkconf DLZ warnings"
+n=`expr $n + 1`
+echo "I: checking named-checkconf DLZ warnings ($n)"
 ret=0
 $CHECKCONF dlz-bad.conf 2>&1 | grep "'dlz' and 'database'" > /dev/null || ret=1
 if [ $ret != 0 ]; then echo "I:failed"; fi
 status=`expr $status + $ret`
 
-echo "I: checking for missing key directory warning"
+n=`expr $n + 1`
+echo "I: checking for missing key directory warning ($n)"
 ret=0
 rm -rf test.keydir
-n=`$CHECKCONF warn-keydir.conf 2>&1 | grep "'test.keydir' does not exist" | wc -l`
-[ $n -eq 1 ] || ret=1
+l=`$CHECKCONF warn-keydir.conf 2>&1 | grep "'test.keydir' does not exist" | wc -l`
+[ $l -eq 1 ] || ret=1
 touch test.keydir
-n=`$CHECKCONF warn-keydir.conf 2>&1 | grep "'test.keydir' is not a directory" | wc -l`
-[ $n -eq 1 ] || ret=1
+l=`$CHECKCONF warn-keydir.conf 2>&1 | grep "'test.keydir' is not a directory" | wc -l`
+[ $l -eq 1 ] || ret=1
 rm -f test.keydir
 mkdir test.keydir
-n=`$CHECKCONF warn-keydir.conf 2>&1 | grep "key-directory" | wc -l`
-[ $n -eq 0 ] || ret=1
+l=`$CHECKCONF warn-keydir.conf 2>&1 | grep "key-directory" | wc -l`
+[ $l -eq 0 ] || ret=1
 rm -rf test.keydir
 if [ $ret != 0 ]; then echo "I:failed"; fi
 
-echo "I: checking that named-checkconf -z catches conflicting ttl with max-ttl"
+n=`expr $n + 1`
+echo "I: checking that named-checkconf -z catches conflicting ttl with max-ttl ($n)"
 ret=0
 $CHECKCONF -z max-ttl.conf > check.out 2>&1
 grep 'TTL 900 exceeds configured max-zone-ttl 600' check.out > /dev/null 2>&1 || ret=1
@@ -173,114 +188,140 @@ grep 'TTL 900 exceeds configured max-zone-ttl 600' check.out > /dev/null 2>&1 ||
 if [ $ret != 0 ]; then echo "I:failed"; ret=1; fi
 status=`expr $status + $ret`
 
-echo "I: checking that named-checkconf -z catches invalid max-ttl"
+n=`expr $n + 1`
+echo "I: checking that named-checkconf -z catches invalid max-ttl ($n)"
 ret=0
 $CHECKCONF -z max-ttl-bad.conf > /dev/null 2>&1 && ret=1
 if [ $ret != 0 ]; then echo "I:failed"; ret=1; fi
 status=`expr $status + $ret`
 
-echo "I: checking that named-checkconf -z skips zone check with alternate databases"
+n=`expr $n + 1`
+echo "I: checking that named-checkconf -z skips zone check with alternate databases ($n)"
 ret=0
 $CHECKCONF -z altdb.conf > /dev/null 2>&1 || ret=1
 if [ $ret != 0 ]; then echo "I:failed"; ret=1; fi
 status=`expr $status + $ret`
 
-echo "I: checking that named-checkconf -z skips zone check with DLZ"
+n=`expr $n + 1`
+echo "I: checking that named-checkconf -z skips zone check with DLZ ($n)"
 ret=0
 $CHECKCONF -z altdlz.conf > /dev/null 2>&1 || ret=1
 if [ $ret != 0 ]; then echo "I:failed"; ret=1; fi
 status=`expr $status + $ret`
 
-echo "I: checking that named-checkconf -z fails on view with ANY class"
+n=`expr $n + 1`
+echo "I: checking that named-checkconf -z fails on view with ANY class ($n)"
 ret=0
 $CHECKCONF -z view-class-any1.conf > /dev/null 2>&1 && ret=1
 if [ $ret != 0 ]; then echo "I:failed"; ret=1; fi
 status=`expr $status + $ret`
 
-echo "I: checking that named-checkconf -z fails on view with CLASS255 class"
+n=`expr $n + 1`
+echo "I: checking that named-checkconf -z fails on view with CLASS255 class ($n)"
 ret=0
 $CHECKCONF -z view-class-any2.conf > /dev/null 2>&1 && ret=1
 if [ $ret != 0 ]; then echo "I:failed"; ret=1; fi
 status=`expr $status + $ret`
 
-echo "I: checking that named-checkconf -z passes on view with IN class"
+n=`expr $n + 1`
+echo "I: checking that named-checkconf -z passes on view with IN class ($n)"
 ret=0
 $CHECKCONF -z view-class-in1.conf > /dev/null 2>&1 || ret=1
 if [ $ret != 0 ]; then echo "I:failed"; ret=1; fi
 status=`expr $status + $ret`
 
-echo "I: checking that named-checkconf -z passes on view with CLASS1 class"
+n=`expr $n + 1`
+echo "I: checking that named-checkconf -z passes on view with CLASS1 class ($n)"
 ret=0
 $CHECKCONF -z view-class-in2.conf > /dev/null 2>&1 || ret=1
 if [ $ret != 0 ]; then echo "I:failed"; ret=1; fi
 status=`expr $status + $ret`
 
-echo "I: check that check-names fails as configured"
+n=`expr $n + 1`
+echo "I: check that check-names fails as configured ($n)"
 ret=0
-$CHECKCONF -z check-names-fail.conf > checkconf.out1 2>&1 && ret=1
-grep "near '_underscore': bad name (check-names)" checkconf.out1 > /dev/null || ret=1
-grep "zone check-names/IN: loaded serial" < checkconf.out1 > /dev/null && ret=1
+$CHECKCONF -z check-names-fail.conf > checkconf.out$n 2>&1 && ret=1
+grep "near '_underscore': bad name (check-names)" checkconf.out$n > /dev/null || ret=1
+grep "zone check-names/IN: loaded serial" < checkconf.out$n > /dev/null && ret=1
 if [ $ret != 0 ]; then echo "I:failed"; ret=1; fi
 status=`expr $status + $ret`
 
-echo "I: check that check-mx fails as configured"
+n=`expr $n + 1`
+echo "I: check that check-mx fails as configured ($n)"
 ret=0
-$CHECKCONF -z check-mx-fail.conf > checkconf.out2 2>&1 && ret=1
-grep "near '10.0.0.1': MX is an address" checkconf.out2 > /dev/null || ret=1
-grep "zone check-mx/IN: loaded serial" < checkconf.out2 > /dev/null && ret=1
+$CHECKCONF -z check-mx-fail.conf > checkconf.out$n 2>&1 && ret=1
+grep "near '10.0.0.1': MX is an address" checkconf.out$n > /dev/null || ret=1
+grep "zone check-mx/IN: loaded serial" < checkconf.out$n > /dev/null && ret=1
 if [ $ret != 0 ]; then echo "I:failed"; ret=1; fi
 status=`expr $status + $ret`
 
-echo "I: check that check-dup-records fails as configured"
+n=`expr $n + 1`
+echo "I: check that check-dup-records fails as configured ($n)"
 ret=0
-$CHECKCONF -z check-dup-records-fail.conf > checkconf.out3 2>&1 && ret=1
-grep "has semantically identical records" checkconf.out3 > /dev/null || ret=1
-grep "zone check-dup-records/IN: loaded serial" < checkconf.out3 > /dev/null && ret=1
+$CHECKCONF -z check-dup-records-fail.conf > checkconf.out$n 2>&1 && ret=1
+grep "has semantically identical records" checkconf.out$n > /dev/null || ret=1
+grep "zone check-dup-records/IN: loaded serial" < checkconf.out$n > /dev/null && ret=1
 if [ $ret != 0 ]; then echo "I:failed"; ret=1; fi
 status=`expr $status + $ret`
 
-echo "I: check that check-mx fails as configured"
+n=`expr $n + 1`
+echo "I: check that check-mx fails as configured ($n)"
 ret=0
-$CHECKCONF -z check-mx-fail.conf > checkconf.out4 2>&1 && ret=1
-grep "failed: MX is an address" checkconf.out4 > /dev/null || ret=1
-grep "zone check-mx/IN: loaded serial" < checkconf.out4 > /dev/null && ret=1
+$CHECKCONF -z check-mx-fail.conf > checkconf.out$n 2>&1 && ret=1
+grep "failed: MX is an address" checkconf.out$n > /dev/null || ret=1
+grep "zone check-mx/IN: loaded serial" < checkconf.out$n > /dev/null && ret=1
 if [ $ret != 0 ]; then echo "I:failed"; ret=1; fi
 status=`expr $status + $ret`
 
-echo "I: check that check-mx-cname fails as configured"
+n=`expr $n + 1`
+echo "I: check that check-mx-cname fails as configured ($n)"
 ret=0
-$CHECKCONF -z check-mx-cname-fail.conf > checkconf.out5 2>&1 && ret=1
-grep "MX.* is a CNAME (illegal)" checkconf.out5 > /dev/null || ret=1
-grep "zone check-mx-cname/IN: loaded serial" < checkconf.out5 > /dev/null && ret=1
+$CHECKCONF -z check-mx-cname-fail.conf > checkconf.out$n 2>&1 && ret=1
+grep "MX.* is a CNAME (illegal)" checkconf.out$n > /dev/null || ret=1
+grep "zone check-mx-cname/IN: loaded serial" < checkconf.out$n > /dev/null && ret=1
 if [ $ret != 0 ]; then echo "I:failed"; ret=1; fi
 status=`expr $status + $ret`
 
-echo "I: check that check-srv-cname fails as configured"
+n=`expr $n + 1`
+echo "I: check that check-srv-cname fails as configured ($n)"
 ret=0
-$CHECKCONF -z check-srv-cname-fail.conf > checkconf.out6 2>&1 && ret=1
-grep "SRV.* is a CNAME (illegal)" checkconf.out6 > /dev/null || ret=1
-grep "zone check-mx-cname/IN: loaded serial" < checkconf.out6 > /dev/null && ret=1
+$CHECKCONF -z check-srv-cname-fail.conf > checkconf.out$n 2>&1 && ret=1
+grep "SRV.* is a CNAME (illegal)" checkconf.out$n > /dev/null || ret=1
+grep "zone check-mx-cname/IN: loaded serial" < checkconf.out$n > /dev/null && ret=1
 if [ $ret != 0 ]; then echo "I:failed"; ret=1; fi
 status=`expr $status + $ret`
 
-echo "I: check that named-checkconf -p properly print a port range"
+n=`expr $n + 1`
+echo "I: check that named-checkconf -p properly print a port range ($n)"
 ret=0
-$CHECKCONF -p portrange-good.conf > checkconf.out7 2>&1 || ret=1
-grep "range 8610 8614;" checkconf.out7 > /dev/null || ret=1
+$CHECKCONF -p portrange-good.conf > checkconf.out$n 2>&1 || ret=1
+grep "range 8610 8614;" checkconf.out$n > /dev/null || ret=1
 if [ $ret != 0 ]; then echo "I:failed"; ret=1; fi
 status=`expr $status + $ret`
 
-echo "I: check that named-checkconf -z handles in-view"
+n=`expr $n + 1`
+echo "I: check that named-checkconf -z handles in-view ($n)"
 ret=0
-$CHECKCONF -z in-view-good.conf > checkconf.out7 2>&1 || ret=1
-grep "zone shared.example/IN: loaded serial" < checkconf.out7 > /dev/null || ret=1
+$CHECKCONF -z in-view-good.conf > checkconf.out$n 2>&1 || ret=1
+grep "zone shared.example/IN: loaded serial" < checkconf.out$n > /dev/null || ret=1
 if [ $ret != 0 ]; then echo "I:failed"; ret=1; fi
 status=`expr $status + $ret`
 
-echo "I: check that named-checkconf prints max-cache-size <percentage> correctly"
+n=`expr $n + 1`
+echo "I: check that named-checkconf prints max-cache-size <percentage> correctly ($n)"
 ret=0
-$CHECKCONF -p max-cache-size-good.conf > checkconf.out8 2>&1 || ret=1
-grep "max-cache-size 60%;" checkconf.out8 > /dev/null || ret=1
+$CHECKCONF -p max-cache-size-good.conf > checkconf.out$n 2>&1 || ret=1
+grep "max-cache-size 60%;" checkconf.out$n > /dev/null || ret=1
+if [ $ret != 0 ]; then echo "I:failed"; ret=1; fi
+status=`expr $status + $ret`
+
+n=`expr $n + 1`
+echo "I: check that named-checkconf -l print out the zone list ($n)"
+ret=0
+$CHECKCONF -l good.conf |
+grep -v "is not implemented" |
+grep -v "is obsolete" > checkconf.out$n || ret=1
+diff good.zonelist checkconf.out$n  > diff.out$n || ret=1
 if [ $ret != 0 ]; then echo "I:failed"; ret=1; fi
 status=`expr $status + $ret`