1*00b67f09SDavid van Moolenbroek /* $NetBSD: zkt-conf.c,v 1.1.1.1 2015/07/08 15:37:48 christos Exp $ */
2*00b67f09SDavid van Moolenbroek
3*00b67f09SDavid van Moolenbroek /*****************************************************************
4*00b67f09SDavid van Moolenbroek **
5*00b67f09SDavid van Moolenbroek ** @(#) zkt-conf.c (c) Jan 2005 / Jan 2010 Holger Zuleger hznet.de
6*00b67f09SDavid van Moolenbroek **
7*00b67f09SDavid van Moolenbroek ** A config file utility for the DNSSEC Zone Key Tool
8*00b67f09SDavid van Moolenbroek **
9*00b67f09SDavid van Moolenbroek ** Copyright (c) 2005 - 2008, Holger Zuleger HZnet. All rights reserved.
10*00b67f09SDavid van Moolenbroek **
11*00b67f09SDavid van Moolenbroek ** This software is open source.
12*00b67f09SDavid van Moolenbroek **
13*00b67f09SDavid van Moolenbroek ** Redistribution and use in source and binary forms, with or without
14*00b67f09SDavid van Moolenbroek ** modification, are permitted provided that the following conditions
15*00b67f09SDavid van Moolenbroek ** are met:
16*00b67f09SDavid van Moolenbroek **
17*00b67f09SDavid van Moolenbroek ** Redistributions of source code must retain the above copyright notice,
18*00b67f09SDavid van Moolenbroek ** this list of conditions and the following disclaimer.
19*00b67f09SDavid van Moolenbroek **
20*00b67f09SDavid van Moolenbroek ** Redistributions in binary form must reproduce the above copyright notice,
21*00b67f09SDavid van Moolenbroek ** this list of conditions and the following disclaimer in the documentation
22*00b67f09SDavid van Moolenbroek ** and/or other materials provided with the distribution.
23*00b67f09SDavid van Moolenbroek **
24*00b67f09SDavid van Moolenbroek ** Neither the name of Holger Zuleger HZnet nor the names of its contributors may
25*00b67f09SDavid van Moolenbroek ** be used to endorse or promote products derived from this software without
26*00b67f09SDavid van Moolenbroek ** specific prior written permission.
27*00b67f09SDavid van Moolenbroek **
28*00b67f09SDavid van Moolenbroek ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29*00b67f09SDavid van Moolenbroek ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
30*00b67f09SDavid van Moolenbroek ** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
31*00b67f09SDavid van Moolenbroek ** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
32*00b67f09SDavid van Moolenbroek ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
33*00b67f09SDavid van Moolenbroek ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
34*00b67f09SDavid van Moolenbroek ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
35*00b67f09SDavid van Moolenbroek ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
36*00b67f09SDavid van Moolenbroek ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
37*00b67f09SDavid van Moolenbroek ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38*00b67f09SDavid van Moolenbroek ** POSSIBILITY OF SUCH DAMAGE.
39*00b67f09SDavid van Moolenbroek **
40*00b67f09SDavid van Moolenbroek *****************************************************************/
41*00b67f09SDavid van Moolenbroek
42*00b67f09SDavid van Moolenbroek # include <stdio.h>
43*00b67f09SDavid van Moolenbroek # include <stdlib.h> /* abort(), exit(), ... */
44*00b67f09SDavid van Moolenbroek # include <string.h>
45*00b67f09SDavid van Moolenbroek # include <dirent.h>
46*00b67f09SDavid van Moolenbroek # include <assert.h>
47*00b67f09SDavid van Moolenbroek # include <unistd.h>
48*00b67f09SDavid van Moolenbroek # include <ctype.h>
49*00b67f09SDavid van Moolenbroek # include <time.h>
50*00b67f09SDavid van Moolenbroek
51*00b67f09SDavid van Moolenbroek #ifdef HAVE_CONFIG_H
52*00b67f09SDavid van Moolenbroek # include <config.h>
53*00b67f09SDavid van Moolenbroek #endif
54*00b67f09SDavid van Moolenbroek # include "config_zkt.h"
55*00b67f09SDavid van Moolenbroek #if defined(HAVE_GETOPT_LONG) && HAVE_GETOPT_LONG
56*00b67f09SDavid van Moolenbroek # include <getopt.h>
57*00b67f09SDavid van Moolenbroek #endif
58*00b67f09SDavid van Moolenbroek
59*00b67f09SDavid van Moolenbroek # include "debug.h"
60*00b67f09SDavid van Moolenbroek # include "misc.h"
61*00b67f09SDavid van Moolenbroek # include "zfparse.h"
62*00b67f09SDavid van Moolenbroek # include "zconf.h"
63*00b67f09SDavid van Moolenbroek
64*00b67f09SDavid van Moolenbroek extern int optopt;
65*00b67f09SDavid van Moolenbroek extern int opterr;
66*00b67f09SDavid van Moolenbroek extern int optind;
67*00b67f09SDavid van Moolenbroek extern char *optarg;
68*00b67f09SDavid van Moolenbroek const char *progname;
69*00b67f09SDavid van Moolenbroek
70*00b67f09SDavid van Moolenbroek static const char *view = "";
71*00b67f09SDavid van Moolenbroek static int writeflag = 0;
72*00b67f09SDavid van Moolenbroek static int allflag = 0;
73*00b67f09SDavid van Moolenbroek static int testflag = 0;
74*00b67f09SDavid van Moolenbroek
75*00b67f09SDavid van Moolenbroek # define short_options ":aC:c:O:dlstvwV:rh"
76*00b67f09SDavid van Moolenbroek #if defined(HAVE_GETOPT_LONG) && HAVE_GETOPT_LONG
77*00b67f09SDavid van Moolenbroek static struct option long_options[] = {
78*00b67f09SDavid van Moolenbroek {"compability", required_argument, NULL, 'C'},
79*00b67f09SDavid van Moolenbroek {"config", required_argument, NULL, 'c'},
80*00b67f09SDavid van Moolenbroek {"option", required_argument, NULL, 'O'},
81*00b67f09SDavid van Moolenbroek {"config-option", required_argument, NULL, 'O'},
82*00b67f09SDavid van Moolenbroek {"default", no_argument, NULL, 'd'},
83*00b67f09SDavid van Moolenbroek {"sidecfg", no_argument, NULL, 's'},
84*00b67f09SDavid van Moolenbroek {"localcfg", no_argument, NULL, 'l'},
85*00b67f09SDavid van Moolenbroek {"all-values", no_argument, NULL, 'a'},
86*00b67f09SDavid van Moolenbroek {"test", no_argument, NULL, 't'},
87*00b67f09SDavid van Moolenbroek {"overwrite", no_argument, NULL, 'w'},
88*00b67f09SDavid van Moolenbroek {"version", no_argument, NULL, 'v' },
89*00b67f09SDavid van Moolenbroek {"write", no_argument, NULL, 'w'},
90*00b67f09SDavid van Moolenbroek {"view", required_argument, NULL, 'V' },
91*00b67f09SDavid van Moolenbroek {"help", no_argument, NULL, 'h'},
92*00b67f09SDavid van Moolenbroek {0, 0, 0, 0}
93*00b67f09SDavid van Moolenbroek };
94*00b67f09SDavid van Moolenbroek #endif
95*00b67f09SDavid van Moolenbroek
96*00b67f09SDavid van Moolenbroek static void usage (char *mesg);
97*00b67f09SDavid van Moolenbroek
98*00b67f09SDavid van Moolenbroek
main(int argc,char * argv[])99*00b67f09SDavid van Moolenbroek int main (int argc, char *argv[])
100*00b67f09SDavid van Moolenbroek {
101*00b67f09SDavid van Moolenbroek int c;
102*00b67f09SDavid van Moolenbroek int opt_index;
103*00b67f09SDavid van Moolenbroek int major = 0;
104*00b67f09SDavid van Moolenbroek int minor = 0;
105*00b67f09SDavid van Moolenbroek int revision = 0;
106*00b67f09SDavid van Moolenbroek const char *file;
107*00b67f09SDavid van Moolenbroek const char *defconfname = NULL;
108*00b67f09SDavid van Moolenbroek const char *confname = NULL;
109*00b67f09SDavid van Moolenbroek char *p;
110*00b67f09SDavid van Moolenbroek char str[254+1];
111*00b67f09SDavid van Moolenbroek zconf_t *refconfig = NULL;
112*00b67f09SDavid van Moolenbroek zconf_t *config;
113*00b67f09SDavid van Moolenbroek
114*00b67f09SDavid van Moolenbroek progname = *argv;
115*00b67f09SDavid van Moolenbroek if ( (p = strrchr (progname, '/')) )
116*00b67f09SDavid van Moolenbroek progname = ++p;
117*00b67f09SDavid van Moolenbroek view = getnameappendix (progname, "zkt-conf");
118*00b67f09SDavid van Moolenbroek
119*00b67f09SDavid van Moolenbroek defconfname = getdefconfname (view);
120*00b67f09SDavid van Moolenbroek dbg_val0 ("Load built in config\n");
121*00b67f09SDavid van Moolenbroek config = loadconfig ("", (zconf_t *)NULL); /* load built in config */
122*00b67f09SDavid van Moolenbroek
123*00b67f09SDavid van Moolenbroek if ( fileexist (defconfname) ) /* load default config file */
124*00b67f09SDavid van Moolenbroek {
125*00b67f09SDavid van Moolenbroek dbg_val ("Load site wide config file \"%s\"\n", defconfname);
126*00b67f09SDavid van Moolenbroek config = loadconfig (defconfname, config);
127*00b67f09SDavid van Moolenbroek }
128*00b67f09SDavid van Moolenbroek if ( config == NULL )
129*00b67f09SDavid van Moolenbroek fatal ("Out of memory\n");
130*00b67f09SDavid van Moolenbroek confname = defconfname;
131*00b67f09SDavid van Moolenbroek
132*00b67f09SDavid van Moolenbroek opterr = 0;
133*00b67f09SDavid van Moolenbroek opt_index = 0;
134*00b67f09SDavid van Moolenbroek
135*00b67f09SDavid van Moolenbroek /* set current config version based on ZKT version */
136*00b67f09SDavid van Moolenbroek switch ( sscanf (ZKT_VERSION, "%d.%d.%d", &major, &minor, &revision) )
137*00b67f09SDavid van Moolenbroek {
138*00b67f09SDavid van Moolenbroek case 3: major = (major * 100) + (minor * 10) + revision; break;
139*00b67f09SDavid van Moolenbroek case 2: major = (major * 100) + (minor * 10); break;
140*00b67f09SDavid van Moolenbroek case 1: major = major * 100; break;
141*00b67f09SDavid van Moolenbroek default:
142*00b67f09SDavid van Moolenbroek usage ("illegal release number");
143*00b67f09SDavid van Moolenbroek }
144*00b67f09SDavid van Moolenbroek setconfigversion (major);
145*00b67f09SDavid van Moolenbroek
146*00b67f09SDavid van Moolenbroek #if defined(HAVE_GETOPT_LONG) && HAVE_GETOPT_LONG
147*00b67f09SDavid van Moolenbroek while ( (c = getopt_long (argc, argv, short_options, long_options, &opt_index)) != -1 )
148*00b67f09SDavid van Moolenbroek #else
149*00b67f09SDavid van Moolenbroek while ( (c = getopt (argc, argv, short_options)) != -1 )
150*00b67f09SDavid van Moolenbroek #endif
151*00b67f09SDavid van Moolenbroek {
152*00b67f09SDavid van Moolenbroek switch ( c )
153*00b67f09SDavid van Moolenbroek {
154*00b67f09SDavid van Moolenbroek case 'V': /* view name */
155*00b67f09SDavid van Moolenbroek view = optarg;
156*00b67f09SDavid van Moolenbroek defconfname = getdefconfname (view);
157*00b67f09SDavid van Moolenbroek if ( fileexist (defconfname) ) /* load default config file */
158*00b67f09SDavid van Moolenbroek config = loadconfig (defconfname, config);
159*00b67f09SDavid van Moolenbroek if ( config == NULL )
160*00b67f09SDavid van Moolenbroek fatal ("Out of memory\n");
161*00b67f09SDavid van Moolenbroek confname = defconfname;
162*00b67f09SDavid van Moolenbroek break;
163*00b67f09SDavid van Moolenbroek case 'O': /* read option from commandline */
164*00b67f09SDavid van Moolenbroek config = loadconfig_fromstr (optarg, config);
165*00b67f09SDavid van Moolenbroek break;
166*00b67f09SDavid van Moolenbroek case 'C':
167*00b67f09SDavid van Moolenbroek switch ( sscanf (optarg, "%d.%d.%d", &major, &minor, &revision) )
168*00b67f09SDavid van Moolenbroek {
169*00b67f09SDavid van Moolenbroek case 3: major = (major * 100) + (minor * 10) + revision; break;
170*00b67f09SDavid van Moolenbroek case 2: major = (major * 100) + (minor * 10); break;
171*00b67f09SDavid van Moolenbroek case 1: major = major * 100; break;
172*00b67f09SDavid van Moolenbroek default:
173*00b67f09SDavid van Moolenbroek usage ("illegal release number");
174*00b67f09SDavid van Moolenbroek }
175*00b67f09SDavid van Moolenbroek setconfigversion (major);
176*00b67f09SDavid van Moolenbroek break;
177*00b67f09SDavid van Moolenbroek case 'c':
178*00b67f09SDavid van Moolenbroek if ( *optarg == '\0' )
179*00b67f09SDavid van Moolenbroek usage ("empty config file name");
180*00b67f09SDavid van Moolenbroek config = loadconfig (optarg, config);
181*00b67f09SDavid van Moolenbroek if ( *optarg == '-' || strcmp (optarg, "stdin") == 0 )
182*00b67f09SDavid van Moolenbroek confname = "stdout";
183*00b67f09SDavid van Moolenbroek else
184*00b67f09SDavid van Moolenbroek confname = optarg;
185*00b67f09SDavid van Moolenbroek break;
186*00b67f09SDavid van Moolenbroek case 'd': /* built-in default config */
187*00b67f09SDavid van Moolenbroek config = loadconfig ("", config); /* load built-in config */
188*00b67f09SDavid van Moolenbroek confname = defconfname;
189*00b67f09SDavid van Moolenbroek break;
190*00b67f09SDavid van Moolenbroek case 's': /* side wide config */
191*00b67f09SDavid van Moolenbroek /* this is the default **/
192*00b67f09SDavid van Moolenbroek break;
193*00b67f09SDavid van Moolenbroek case 'a': /* set all flag */
194*00b67f09SDavid van Moolenbroek allflag = 1;
195*00b67f09SDavid van Moolenbroek break;
196*00b67f09SDavid van Moolenbroek case 'l': /* local config file */
197*00b67f09SDavid van Moolenbroek refconfig = dupconfig (config); /* duplicate current config */
198*00b67f09SDavid van Moolenbroek confname = LOCALCONF_FILE;
199*00b67f09SDavid van Moolenbroek if ( fileexist (LOCALCONF_FILE) ) /* try to load local config file */
200*00b67f09SDavid van Moolenbroek {
201*00b67f09SDavid van Moolenbroek dbg_val ("Load local config file \"%s\"\n", LOCALCONF_FILE);
202*00b67f09SDavid van Moolenbroek config = loadconfig (LOCALCONF_FILE, config);
203*00b67f09SDavid van Moolenbroek }
204*00b67f09SDavid van Moolenbroek else if ( !writeflag )
205*00b67f09SDavid van Moolenbroek usage ("error: no local config file found");
206*00b67f09SDavid van Moolenbroek break;
207*00b67f09SDavid van Moolenbroek case 't': /* test config */
208*00b67f09SDavid van Moolenbroek testflag = 1;
209*00b67f09SDavid van Moolenbroek break;
210*00b67f09SDavid van Moolenbroek case 'v': /* version */
211*00b67f09SDavid van Moolenbroek fprintf (stderr, "%s version %s compiled for BIND version %d\n",
212*00b67f09SDavid van Moolenbroek progname, ZKT_VERSION, BIND_VERSION);
213*00b67f09SDavid van Moolenbroek fprintf (stderr, "ZKT %s\n", ZKT_COPYRIGHT);
214*00b67f09SDavid van Moolenbroek return 0;
215*00b67f09SDavid van Moolenbroek break;
216*00b67f09SDavid van Moolenbroek case 'w': /* write back conf file */
217*00b67f09SDavid van Moolenbroek writeflag = 1;
218*00b67f09SDavid van Moolenbroek break;
219*00b67f09SDavid van Moolenbroek case 'h': /* print help */
220*00b67f09SDavid van Moolenbroek usage ("");
221*00b67f09SDavid van Moolenbroek break;
222*00b67f09SDavid van Moolenbroek case ':':
223*00b67f09SDavid van Moolenbroek snprintf (str, sizeof(str), "option \"-%c\" requires an argument.",
224*00b67f09SDavid van Moolenbroek optopt);
225*00b67f09SDavid van Moolenbroek usage (str);
226*00b67f09SDavid van Moolenbroek break;
227*00b67f09SDavid van Moolenbroek case '?':
228*00b67f09SDavid van Moolenbroek if ( isprint (optopt) )
229*00b67f09SDavid van Moolenbroek snprintf (str, sizeof(str), "Unknown option \"-%c\".",
230*00b67f09SDavid van Moolenbroek optopt);
231*00b67f09SDavid van Moolenbroek else
232*00b67f09SDavid van Moolenbroek snprintf (str, sizeof (str), "Unknown option char \\x%x.",
233*00b67f09SDavid van Moolenbroek optopt);
234*00b67f09SDavid van Moolenbroek usage (str);
235*00b67f09SDavid van Moolenbroek break;
236*00b67f09SDavid van Moolenbroek default:
237*00b67f09SDavid van Moolenbroek abort();
238*00b67f09SDavid van Moolenbroek }
239*00b67f09SDavid van Moolenbroek }
240*00b67f09SDavid van Moolenbroek
241*00b67f09SDavid van Moolenbroek c = optind;
242*00b67f09SDavid van Moolenbroek if ( c >= argc ) /* no arguments given on commandline */
243*00b67f09SDavid van Moolenbroek {
244*00b67f09SDavid van Moolenbroek if ( testflag )
245*00b67f09SDavid van Moolenbroek {
246*00b67f09SDavid van Moolenbroek if ( checkconfig (config) )
247*00b67f09SDavid van Moolenbroek fprintf (stderr, "All config file parameter seems to be ok\n");
248*00b67f09SDavid van Moolenbroek }
249*00b67f09SDavid van Moolenbroek else
250*00b67f09SDavid van Moolenbroek {
251*00b67f09SDavid van Moolenbroek if ( !writeflag ) /* print to stdout */
252*00b67f09SDavid van Moolenbroek confname = "stdout";
253*00b67f09SDavid van Moolenbroek
254*00b67f09SDavid van Moolenbroek if ( refconfig ) /* have we seen a local config file ? */
255*00b67f09SDavid van Moolenbroek if ( allflag )
256*00b67f09SDavid van Moolenbroek printconfig (confname, config);
257*00b67f09SDavid van Moolenbroek else
258*00b67f09SDavid van Moolenbroek printconfigdiff (confname, refconfig, config);
259*00b67f09SDavid van Moolenbroek else
260*00b67f09SDavid van Moolenbroek printconfig (confname, config);
261*00b67f09SDavid van Moolenbroek }
262*00b67f09SDavid van Moolenbroek }
263*00b67f09SDavid van Moolenbroek else /* command line argument found: use it as name of zone file */
264*00b67f09SDavid van Moolenbroek {
265*00b67f09SDavid van Moolenbroek char includefiles[1023+1]; /* list of include files */
266*00b67f09SDavid van Moolenbroek size_t filelistsize; /* size of list */
267*00b67f09SDavid van Moolenbroek long minttl;
268*00b67f09SDavid van Moolenbroek long maxttl;
269*00b67f09SDavid van Moolenbroek int keydbfound;
270*00b67f09SDavid van Moolenbroek char *dnskeydb;
271*00b67f09SDavid van Moolenbroek
272*00b67f09SDavid van Moolenbroek file = argv[c++];
273*00b67f09SDavid van Moolenbroek
274*00b67f09SDavid van Moolenbroek dnskeydb = config->keyfile;
275*00b67f09SDavid van Moolenbroek
276*00b67f09SDavid van Moolenbroek minttl = 0x7FFFFFFF;
277*00b67f09SDavid van Moolenbroek maxttl = 0;
278*00b67f09SDavid van Moolenbroek includefiles[0] = '\0';
279*00b67f09SDavid van Moolenbroek filelistsize = sizeof (includefiles);
280*00b67f09SDavid van Moolenbroek keydbfound = parsezonefile (file, &minttl, &maxttl, dnskeydb, includefiles, &filelistsize);
281*00b67f09SDavid van Moolenbroek if ( keydbfound < 0 )
282*00b67f09SDavid van Moolenbroek error ("can't parse zone file %s\n", file);
283*00b67f09SDavid van Moolenbroek
284*00b67f09SDavid van Moolenbroek if ( dnskeydb && !keydbfound )
285*00b67f09SDavid van Moolenbroek {
286*00b67f09SDavid van Moolenbroek if ( writeflag )
287*00b67f09SDavid van Moolenbroek {
288*00b67f09SDavid van Moolenbroek addkeydb (file, dnskeydb);
289*00b67f09SDavid van Moolenbroek printf ("\"$INCLUDE %s\" directive added to \"%s\"\n", dnskeydb, file);
290*00b67f09SDavid van Moolenbroek }
291*00b67f09SDavid van Moolenbroek else
292*00b67f09SDavid van Moolenbroek printf ("\"$INCLUDE %s\" should be added to \"%s\" (run with option -w)\n",
293*00b67f09SDavid van Moolenbroek dnskeydb, file);
294*00b67f09SDavid van Moolenbroek }
295*00b67f09SDavid van Moolenbroek
296*00b67f09SDavid van Moolenbroek if ( isflistdelim (*includefiles) )
297*00b67f09SDavid van Moolenbroek {
298*00b67f09SDavid van Moolenbroek printf ("InclFiles:\t\"%s\"\n", includefiles+1);
299*00b67f09SDavid van Moolenbroek }
300*00b67f09SDavid van Moolenbroek
301*00b67f09SDavid van Moolenbroek if ( minttl < (10 * MINSEC) )
302*00b67f09SDavid van Moolenbroek fprintf (stderr, "MinimumTTL of %s (%ld seconds) is too low to use it in a signed zone (see RFC4641)\n",
303*00b67f09SDavid van Moolenbroek timeint2str (minttl), minttl);
304*00b67f09SDavid van Moolenbroek else
305*00b67f09SDavid van Moolenbroek fprintf (stderr, "MinimumTTL:\t%s\t# (%ld seconds)\n", timeint2str (minttl), minttl);
306*00b67f09SDavid van Moolenbroek fprintf (stdout, "MaximumTTL:\t%s\t# (%ld seconds)\n", timeint2str (maxttl), maxttl);
307*00b67f09SDavid van Moolenbroek
308*00b67f09SDavid van Moolenbroek if ( writeflag )
309*00b67f09SDavid van Moolenbroek {
310*00b67f09SDavid van Moolenbroek refconfig = dupconfig (config); /* duplicate current config */
311*00b67f09SDavid van Moolenbroek confname = LOCALCONF_FILE;
312*00b67f09SDavid van Moolenbroek if ( fileexist (LOCALCONF_FILE) ) /* try to load local config file */
313*00b67f09SDavid van Moolenbroek {
314*00b67f09SDavid van Moolenbroek dbg_val ("Load local config file \"%s\"\n", LOCALCONF_FILE);
315*00b67f09SDavid van Moolenbroek config = loadconfig (LOCALCONF_FILE, config);
316*00b67f09SDavid van Moolenbroek }
317*00b67f09SDavid van Moolenbroek setconfigpar (config, "MaximumTTL", &maxttl);
318*00b67f09SDavid van Moolenbroek printconfigdiff (confname, refconfig, config);
319*00b67f09SDavid van Moolenbroek }
320*00b67f09SDavid van Moolenbroek }
321*00b67f09SDavid van Moolenbroek
322*00b67f09SDavid van Moolenbroek
323*00b67f09SDavid van Moolenbroek return 0;
324*00b67f09SDavid van Moolenbroek }
325*00b67f09SDavid van Moolenbroek
326*00b67f09SDavid van Moolenbroek # define sopt_usage(mesg, value) fprintf (stderr, mesg, value)
327*00b67f09SDavid van Moolenbroek #if defined(HAVE_GETOPT_LONG) && HAVE_GETOPT_LONG
328*00b67f09SDavid van Moolenbroek # define lopt_usage(mesg, value) fprintf (stderr, mesg, value)
329*00b67f09SDavid van Moolenbroek # define loptstr(lstr, sstr) lstr
330*00b67f09SDavid van Moolenbroek #else
331*00b67f09SDavid van Moolenbroek # define lopt_usage(mesg, value)
332*00b67f09SDavid van Moolenbroek # define loptstr(lstr, sstr) sstr
333*00b67f09SDavid van Moolenbroek #endif
usage(char * mesg)334*00b67f09SDavid van Moolenbroek static void usage (char *mesg)
335*00b67f09SDavid van Moolenbroek {
336*00b67f09SDavid van Moolenbroek fprintf (stderr, "%s version %s\n", progname, ZKT_VERSION);
337*00b67f09SDavid van Moolenbroek if ( mesg && *mesg )
338*00b67f09SDavid van Moolenbroek fprintf (stderr, "%s\n", mesg);
339*00b67f09SDavid van Moolenbroek fprintf (stderr, "\n");
340*00b67f09SDavid van Moolenbroek fprintf (stderr, "usage: %s -h\n", progname);
341*00b67f09SDavid van Moolenbroek fprintf (stderr, "usage: %s [-V view] [-w|-t] -d [-O <optstr>]\n", progname);
342*00b67f09SDavid van Moolenbroek fprintf (stderr, "usage: %s [-V view] [-w|-t] [-s] [-c config] [-O <optstr>]\n", progname);
343*00b67f09SDavid van Moolenbroek fprintf (stderr, "usage: %s [-V view] [-w|-t] [-a] -l [-c config] [-O <optstr>]\n", progname);
344*00b67f09SDavid van Moolenbroek fprintf (stderr, "\n");
345*00b67f09SDavid van Moolenbroek fprintf (stderr, "usage: %s [-c config] [-w] <zonefile>\n", progname);
346*00b67f09SDavid van Moolenbroek fprintf (stderr, "\n");
347*00b67f09SDavid van Moolenbroek fprintf (stderr, " -V name%s", loptstr (", --view=name\n", ""));
348*00b67f09SDavid van Moolenbroek fprintf (stderr, "\t\t specify the view name \n");
349*00b67f09SDavid van Moolenbroek fprintf (stderr, " -d%s\tprint built-in default config parameter\n", loptstr (", --default", ""));
350*00b67f09SDavid van Moolenbroek fprintf (stderr, " -s%s\tprint site wide config file parameter (this is the default)\n", loptstr (", --sitecfg", ""));
351*00b67f09SDavid van Moolenbroek fprintf (stderr, " -l%s\tprint local config file parameter\n", loptstr (", --localcfg", ""));
352*00b67f09SDavid van Moolenbroek fprintf (stderr, " -a%s\tprint all parameter not only the different one\n", loptstr (", --all", ""));
353*00b67f09SDavid van Moolenbroek fprintf (stderr, " -c file%s", loptstr (", --config=file\n", ""));
354*00b67f09SDavid van Moolenbroek fprintf (stderr, " \t\tread config from <file> instead of %s\n", CONFIG_FILE);
355*00b67f09SDavid van Moolenbroek fprintf (stderr, " -O optstr%s", loptstr (", --config-option=\"optstr\"\n", ""));
356*00b67f09SDavid van Moolenbroek fprintf (stderr, " \t\tread config options from commandline\n");
357*00b67f09SDavid van Moolenbroek fprintf (stderr, " -t%s\ttest the config parameter if they are useful \n", loptstr (", --test", "\t"));
358*00b67f09SDavid van Moolenbroek fprintf (stderr, " -w%s\twrite or rewrite config file \n", loptstr (", --write", "\t"));
359*00b67f09SDavid van Moolenbroek fprintf (stderr, " -h%s\tprint this help \n", loptstr (", --help", "\t"));
360*00b67f09SDavid van Moolenbroek exit (1);
361*00b67f09SDavid van Moolenbroek }
362*00b67f09SDavid van Moolenbroek
363