1*00b67f09SDavid van Moolenbroek /* $NetBSD: zconf.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 ** @(#) zconf.c -- configuration file parser for dnssec.conf
6*00b67f09SDavid van Moolenbroek **
7*00b67f09SDavid van Moolenbroek ** The initial code of this module is from the SixXS Heartbeat Client
8*00b67f09SDavid van Moolenbroek ** written by Jeroen Massar <jeroen@sixxs.net>
9*00b67f09SDavid van Moolenbroek **
10*00b67f09SDavid van Moolenbroek ** New config types and many code changes by Holger Zuleger
11*00b67f09SDavid van Moolenbroek **
12*00b67f09SDavid van Moolenbroek ** Copyright (c) Aug 2005, Jeroen Massar.
13*00b67f09SDavid van Moolenbroek ** Copyright (c) Aug 2005 - Nov 2010, Holger Zuleger.
14*00b67f09SDavid van Moolenbroek ** All rights reserved.
15*00b67f09SDavid van Moolenbroek **
16*00b67f09SDavid van Moolenbroek ** This software is open source.
17*00b67f09SDavid van Moolenbroek **
18*00b67f09SDavid van Moolenbroek ** Redistribution and use in source and binary forms, with or without
19*00b67f09SDavid van Moolenbroek ** modification, are permitted provided that the following conditions
20*00b67f09SDavid van Moolenbroek ** are met:
21*00b67f09SDavid van Moolenbroek **
22*00b67f09SDavid van Moolenbroek ** Redistributions of source code must retain the above copyright notice,
23*00b67f09SDavid van Moolenbroek ** this list of conditions and the following disclaimer.
24*00b67f09SDavid van Moolenbroek **
25*00b67f09SDavid van Moolenbroek ** Redistributions in binary form must reproduce the above copyright notice,
26*00b67f09SDavid van Moolenbroek ** this list of conditions and the following disclaimer in the documentation
27*00b67f09SDavid van Moolenbroek ** and/or other materials provided with the distribution.
28*00b67f09SDavid van Moolenbroek **
29*00b67f09SDavid van Moolenbroek ** Neither the name of Jeroen Masar or Holger Zuleger nor the
30*00b67f09SDavid van Moolenbroek ** names of its contributors may be used to endorse or promote products
31*00b67f09SDavid van Moolenbroek ** derived from this software without specific prior written permission.
32*00b67f09SDavid van Moolenbroek **
33*00b67f09SDavid van Moolenbroek ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
34*00b67f09SDavid van Moolenbroek ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
35*00b67f09SDavid van Moolenbroek ** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
36*00b67f09SDavid van Moolenbroek ** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
37*00b67f09SDavid van Moolenbroek ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
38*00b67f09SDavid van Moolenbroek ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
39*00b67f09SDavid van Moolenbroek ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
40*00b67f09SDavid van Moolenbroek ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
41*00b67f09SDavid van Moolenbroek ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
42*00b67f09SDavid van Moolenbroek ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
43*00b67f09SDavid van Moolenbroek ** POSSIBILITY OF SUCH DAMAGE.
44*00b67f09SDavid van Moolenbroek **
45*00b67f09SDavid van Moolenbroek ****************************************************************/
46*00b67f09SDavid van Moolenbroek # include <sys/types.h>
47*00b67f09SDavid van Moolenbroek # include <stdio.h>
48*00b67f09SDavid van Moolenbroek # include <errno.h>
49*00b67f09SDavid van Moolenbroek # include <unistd.h>
50*00b67f09SDavid van Moolenbroek # include <stdlib.h>
51*00b67f09SDavid van Moolenbroek # include <stdarg.h>
52*00b67f09SDavid van Moolenbroek # include <string.h>
53*00b67f09SDavid van Moolenbroek # include <strings.h>
54*00b67f09SDavid van Moolenbroek # include <assert.h>
55*00b67f09SDavid van Moolenbroek # include <ctype.h>
56*00b67f09SDavid van Moolenbroek
57*00b67f09SDavid van Moolenbroek #ifdef HAVE_CONFIG_H
58*00b67f09SDavid van Moolenbroek # include "config.h"
59*00b67f09SDavid van Moolenbroek #endif
60*00b67f09SDavid van Moolenbroek # include "config_zkt.h"
61*00b67f09SDavid van Moolenbroek # include "debug.h"
62*00b67f09SDavid van Moolenbroek # include "misc.h"
63*00b67f09SDavid van Moolenbroek #define extern
64*00b67f09SDavid van Moolenbroek # include "zconf.h"
65*00b67f09SDavid van Moolenbroek #undef extern
66*00b67f09SDavid van Moolenbroek # include "dki.h"
67*00b67f09SDavid van Moolenbroek
68*00b67f09SDavid van Moolenbroek # define ISTRUE(val) (strcasecmp (val, "yes") == 0 || \
69*00b67f09SDavid van Moolenbroek strcasecmp (val, "true") == 0 )
70*00b67f09SDavid van Moolenbroek # define ISCOMMENT(cp) (*(cp) == '#' || *(cp) == ';' || \
71*00b67f09SDavid van Moolenbroek (*(cp) == '/' && *((cp)+1) == '/') )
72*00b67f09SDavid van Moolenbroek # define ISDELIM(c) (isspace (c) || (c) == ':' || (c) == '=')
73*00b67f09SDavid van Moolenbroek
74*00b67f09SDavid van Moolenbroek
75*00b67f09SDavid van Moolenbroek # define cmdln (0)
76*00b67f09SDavid van Moolenbroek # define first (1)
77*00b67f09SDavid van Moolenbroek # define last (0x7FFF)
78*00b67f09SDavid van Moolenbroek
79*00b67f09SDavid van Moolenbroek # define iscmdline(x) ((x)->used_since == cmdln)
80*00b67f09SDavid van Moolenbroek # define iscompatible(x) ((x)->used_since != cmdln && compversion >= (x)->used_since && \
81*00b67f09SDavid van Moolenbroek ((x)->used_till == 1 || (compversion <= (x)->used_till)))
82*00b67f09SDavid van Moolenbroek
83*00b67f09SDavid van Moolenbroek typedef enum {
84*00b67f09SDavid van Moolenbroek CONF_END = 0,
85*00b67f09SDavid van Moolenbroek CONF_STRING,
86*00b67f09SDavid van Moolenbroek CONF_INT,
87*00b67f09SDavid van Moolenbroek CONF_TIMEINT,
88*00b67f09SDavid van Moolenbroek CONF_BOOL,
89*00b67f09SDavid van Moolenbroek CONF_ALGO,
90*00b67f09SDavid van Moolenbroek CONF_SERIAL,
91*00b67f09SDavid van Moolenbroek CONF_FACILITY,
92*00b67f09SDavid van Moolenbroek CONF_LEVEL,
93*00b67f09SDavid van Moolenbroek CONF_NSEC3,
94*00b67f09SDavid van Moolenbroek CONF_COMMENT,
95*00b67f09SDavid van Moolenbroek CONF_VERSION,
96*00b67f09SDavid van Moolenbroek } ctype_t;
97*00b67f09SDavid van Moolenbroek
98*00b67f09SDavid van Moolenbroek /*****************************************************************
99*00b67f09SDavid van Moolenbroek ** private (static) variables
100*00b67f09SDavid van Moolenbroek *****************************************************************/
101*00b67f09SDavid van Moolenbroek static int compversion;
102*00b67f09SDavid van Moolenbroek
103*00b67f09SDavid van Moolenbroek static zconf_t def = {
104*00b67f09SDavid van Moolenbroek ZONEDIR, RECURSIVE,
105*00b67f09SDavid van Moolenbroek PRINTTIME, PRINTAGE, LJUST, LSCOLORTERM,
106*00b67f09SDavid van Moolenbroek SIG_VALIDITY, MAX_TTL, KEY_TTL, PROPTIME, Unixtime,
107*00b67f09SDavid van Moolenbroek RESIGN_INT,
108*00b67f09SDavid van Moolenbroek KEY_ALGO, ADDITIONAL_KEY_ALGO,
109*00b67f09SDavid van Moolenbroek KSK_LIFETIME, KSK_BITS, KSK_RANDOM,
110*00b67f09SDavid van Moolenbroek ZSK_LIFETIME, ZSK_BITS, ZSK_ALWAYS, ZSK_RANDOM,
111*00b67f09SDavid van Moolenbroek NSEC3_OFF, SALTLEN,
112*00b67f09SDavid van Moolenbroek NULL, /* viewname cmdline parameter */
113*00b67f09SDavid van Moolenbroek 0, /* noexec cmdline parameter */
114*00b67f09SDavid van Moolenbroek LOGFILE, LOGLEVEL, LOGDOMAINDIR, SYSLOGFACILITY, SYSLOGLEVEL, VERBOSELOG, 0,
115*00b67f09SDavid van Moolenbroek DNSKEYFILE, ZONEFILE, KEYSETDIR,
116*00b67f09SDavid van Moolenbroek LOOKASIDEDOMAIN,
117*00b67f09SDavid van Moolenbroek SIG_RANDOM, SIG_PSEUDO, SIG_GENDS, SIG_DNSKEY_KSK, SIG_PARAM,
118*00b67f09SDavid van Moolenbroek DEPENDFILES,
119*00b67f09SDavid van Moolenbroek DIST_CMD, /* defaults to NULL which means to run "rndc reload" */
120*00b67f09SDavid van Moolenbroek NAMED_CHROOT
121*00b67f09SDavid van Moolenbroek };
122*00b67f09SDavid van Moolenbroek
123*00b67f09SDavid van Moolenbroek typedef struct {
124*00b67f09SDavid van Moolenbroek char *label; /* the name of the parameter */
125*00b67f09SDavid van Moolenbroek short used_since; /* compability (from version; 0 == command line) */
126*00b67f09SDavid van Moolenbroek short used_till; /* compability (to version) */
127*00b67f09SDavid van Moolenbroek ctype_t type; /* the parameter type */
128*00b67f09SDavid van Moolenbroek void *var; /* pointer to the parameter variable */
129*00b67f09SDavid van Moolenbroek const char *desc;
130*00b67f09SDavid van Moolenbroek const void *var2; /* pointer to a second parameter variable */
131*00b67f09SDavid van Moolenbroek /* this is a ugly hack needed by cmpconfig () */
132*00b67f09SDavid van Moolenbroek } zconf_para_t;
133*00b67f09SDavid van Moolenbroek
134*00b67f09SDavid van Moolenbroek static zconf_para_t confpara[] = {
135*00b67f09SDavid van Moolenbroek { "", first, last, CONF_COMMENT, ""},
136*00b67f09SDavid van Moolenbroek { "", first, last, CONF_COMMENT, "\t@(#) dnssec.conf "},
137*00b67f09SDavid van Moolenbroek { "", first, last, CONF_VERSION, "" },
138*00b67f09SDavid van Moolenbroek { "", first, last, CONF_COMMENT, ""},
139*00b67f09SDavid van Moolenbroek { "", first, last, CONF_COMMENT, NULL },
140*00b67f09SDavid van Moolenbroek
141*00b67f09SDavid van Moolenbroek { "", first, 99, CONF_COMMENT, "dnssec-zkt options" },
142*00b67f09SDavid van Moolenbroek { "", 100, last, CONF_COMMENT, "zkt-ls options" },
143*00b67f09SDavid van Moolenbroek { "ZoneDir", first, last, CONF_STRING, &def.zonedir, "default zone file directory (also used by zkt-signer)"},
144*00b67f09SDavid van Moolenbroek { "Recursive", first, last, CONF_BOOL, &def.recursive, "looking for keys down the directory tree?" },
145*00b67f09SDavid van Moolenbroek { "PrintTime", first, last, CONF_BOOL, &def.printtime, "print absolute key generation time?" },
146*00b67f09SDavid van Moolenbroek { "PrintAge", first, last, CONF_BOOL, &def.printage, "print relative key age?" },
147*00b67f09SDavid van Moolenbroek { "LeftJustify", first, last, CONF_BOOL, &def.ljust, "zone name is printed left justified?" },
148*00b67f09SDavid van Moolenbroek { "lsColor", 100, last, CONF_STRING, &def.colorterm, "terminal name (for coloring)" },
149*00b67f09SDavid van Moolenbroek
150*00b67f09SDavid van Moolenbroek { "", first, last, CONF_COMMENT, NULL },
151*00b67f09SDavid van Moolenbroek { "", first, last, CONF_COMMENT, "zone specific values" },
152*00b67f09SDavid van Moolenbroek { "ResignInterval", first, last, CONF_TIMEINT, &def.resign },
153*00b67f09SDavid van Moolenbroek { "SigValidity", first, last, CONF_TIMEINT, &def.sigvalidity },
154*00b67f09SDavid van Moolenbroek { "Max_TTL", first, 100, CONF_TIMEINT, &def.max_ttl },
155*00b67f09SDavid van Moolenbroek { "MaximumTTL", 101, last, CONF_TIMEINT, &def.max_ttl },
156*00b67f09SDavid van Moolenbroek { "Propagation", first, last, CONF_TIMEINT, &def.proptime },
157*00b67f09SDavid van Moolenbroek { "Key_TTL", 90, 100, CONF_TIMEINT, &def.key_ttl },
158*00b67f09SDavid van Moolenbroek { "DnsKeyTTL", 101, last, CONF_TIMEINT, &def.key_ttl },
159*00b67f09SDavid van Moolenbroek #if defined (DEF_TTL)
160*00b67f09SDavid van Moolenbroek { "def_ttl", first, last, CONF_TIMEINT, &def.def_ttl },
161*00b67f09SDavid van Moolenbroek #endif
162*00b67f09SDavid van Moolenbroek { "SerialFormat", 92, last, CONF_SERIAL, &def.serialform },
163*00b67f09SDavid van Moolenbroek
164*00b67f09SDavid van Moolenbroek { "", first, last, CONF_COMMENT, NULL },
165*00b67f09SDavid van Moolenbroek { "", first, last, CONF_COMMENT, "signing key parameters"},
166*00b67f09SDavid van Moolenbroek { "Key_Algo", 99, 100, CONF_ALGO, &def.k_algo }, /* now used as general KEY algorithm (KSK & ZSK) */
167*00b67f09SDavid van Moolenbroek { "KeyAlgo", 101, last, CONF_ALGO, &def.k_algo }, /* now used as general KEY algorithm (KSK & ZSK) */
168*00b67f09SDavid van Moolenbroek { "AddKey_Algo", 99, 100, CONF_ALGO, &def.k2_algo }, /* second key algorithm added (v0.99) */
169*00b67f09SDavid van Moolenbroek { "AddKeyAlgo", 101, last, CONF_ALGO, &def.k2_algo }, /* second key algorithm added (v0.99) */
170*00b67f09SDavid van Moolenbroek { "KSK_lifetime", first, 100, CONF_TIMEINT, &def.k_life },
171*00b67f09SDavid van Moolenbroek { "KSKlifetime", 101, last, CONF_TIMEINT, &def.k_life },
172*00b67f09SDavid van Moolenbroek { "KSK_algo", first, 98, CONF_ALGO, &def.k_algo }, /* old KSK value changed to key algorithm */
173*00b67f09SDavid van Moolenbroek { "KSK_bits", first, 100, CONF_INT, &def.k_bits },
174*00b67f09SDavid van Moolenbroek { "KSKbits", 101, last, CONF_INT, &def.k_bits },
175*00b67f09SDavid van Moolenbroek { "KSK_randfile", first, 100, CONF_STRING, &def.k_random },
176*00b67f09SDavid van Moolenbroek { "KSKrandfile", 101, last, CONF_STRING, &def.k_random },
177*00b67f09SDavid van Moolenbroek { "ZSK_lifetime", first, 100, CONF_TIMEINT, &def.z_life },
178*00b67f09SDavid van Moolenbroek { "ZSKlifetime", 101, last, CONF_TIMEINT, &def.z_life },
179*00b67f09SDavid van Moolenbroek /* { "ZSK_algo", 1, CONF_ALGO, &def.z_algo }, ZSK algo removed (set to same as ksk) */
180*00b67f09SDavid van Moolenbroek { "ZSK_algo", first, 98, CONF_ALGO, &def.k2_algo }, /* if someone using it already, map the algo to the additional key algorithm */
181*00b67f09SDavid van Moolenbroek { "ZSK_bits", first, 100, CONF_INT, &def.z_bits },
182*00b67f09SDavid van Moolenbroek { "ZSKbits", 101, last, CONF_INT, &def.z_bits },
183*00b67f09SDavid van Moolenbroek #if defined(ALLOW_ALWAYS_PREPUBLISH_ZSK) && ALLOW_ALWAYS_PREPUBLISH_ZSK
184*00b67f09SDavid van Moolenbroek { "ZSKpermanent", 102, last, CONF_BOOL, &def.z_always, "Always add a pre-publish zone signing key?" },
185*00b67f09SDavid van Moolenbroek #endif
186*00b67f09SDavid van Moolenbroek { "ZSK_randfile", first, 100, CONF_STRING, &def.z_random },
187*00b67f09SDavid van Moolenbroek { "ZSKrandfile", 101, last, CONF_STRING, &def.z_random },
188*00b67f09SDavid van Moolenbroek { "NSEC3", 100, last, CONF_NSEC3, &def.nsec3 },
189*00b67f09SDavid van Moolenbroek { "SaltBits", 98, last, CONF_INT, &def.saltbits, },
190*00b67f09SDavid van Moolenbroek
191*00b67f09SDavid van Moolenbroek { "", first, last, CONF_COMMENT, NULL },
192*00b67f09SDavid van Moolenbroek { "", first, 99, CONF_COMMENT, "dnssec-signer options"},
193*00b67f09SDavid van Moolenbroek { "", 100, last, CONF_COMMENT, "zkt-signer options"},
194*00b67f09SDavid van Moolenbroek { "--view", cmdln, last, CONF_STRING, &def.view },
195*00b67f09SDavid van Moolenbroek { "--noexec", cmdln, last, CONF_BOOL, &def.noexec },
196*00b67f09SDavid van Moolenbroek { "LogFile", 96, last, CONF_STRING, &def.logfile },
197*00b67f09SDavid van Moolenbroek { "LogLevel", 96, last, CONF_LEVEL, &def.loglevel },
198*00b67f09SDavid van Moolenbroek { "LogDomainDir", 96, last, CONF_STRING, &def.logdomaindir },
199*00b67f09SDavid van Moolenbroek { "SyslogFacility", 96, last, CONF_FACILITY, &def.syslogfacility },
200*00b67f09SDavid van Moolenbroek { "SyslogLevel", 96, last, CONF_LEVEL, &def.sysloglevel },
201*00b67f09SDavid van Moolenbroek { "VerboseLog", 96, last, CONF_INT, &def.verboselog },
202*00b67f09SDavid van Moolenbroek { "-v", cmdln, last, CONF_INT, &def.verbosity },
203*00b67f09SDavid van Moolenbroek { "KeyFile", first, last, CONF_STRING, &def.keyfile },
204*00b67f09SDavid van Moolenbroek { "ZoneFile", first, last, CONF_STRING, &def.zonefile },
205*00b67f09SDavid van Moolenbroek { "KeySetDir", first, last, CONF_STRING, &def.keysetdir },
206*00b67f09SDavid van Moolenbroek { "DLV_Domain", first, 100, CONF_STRING, &def.lookaside },
207*00b67f09SDavid van Moolenbroek { "DLVdomain", 101, last, CONF_STRING, &def.lookaside },
208*00b67f09SDavid van Moolenbroek { "Sig_Randfile", first, 100, CONF_STRING, &def.sig_random },
209*00b67f09SDavid van Moolenbroek { "SigRandfile", 101, last, CONF_STRING, &def.sig_random, "a file containing random data" },
210*00b67f09SDavid van Moolenbroek { "Sig_Pseudorand", first, 100, CONF_BOOL, &def.sig_pseudo },
211*00b67f09SDavid van Moolenbroek { "SigPseudorand", 101, last, CONF_BOOL, &def.sig_pseudo, "use pseudorandom data (faster but less secure)?" },
212*00b67f09SDavid van Moolenbroek { "Sig_GenerateDS", first, 100, CONF_BOOL, &def.sig_gends },
213*00b67f09SDavid van Moolenbroek { "SigGenerateDS", 101, last, CONF_BOOL, &def.sig_gends, "update DS records based on child zone\' dsset-* files?" },
214*00b67f09SDavid van Moolenbroek { "Sig_DnsKeyKSK", 99, 100, CONF_BOOL, &def.sig_dnskeyksk },
215*00b67f09SDavid van Moolenbroek { "SigDnsKeyKSK", 101, last, CONF_BOOL, &def.sig_dnskeyksk, "sign dns keyset with ksk only?" },
216*00b67f09SDavid van Moolenbroek { "Sig_Parameter", first, 100, CONF_STRING, &def.sig_param },
217*00b67f09SDavid van Moolenbroek { "SigParameter", 101, last, CONF_STRING, &def.sig_param, "additional dnssec-signzone parameter (if any)" },
218*00b67f09SDavid van Moolenbroek { "DependFiles", 113, last, CONF_STRING, &def.dependfiles, "list of files included in ZoneFile (except KeyFile)" },
219*00b67f09SDavid van Moolenbroek { "Distribute_Cmd", 97, 100, CONF_STRING, &def.dist_cmd },
220*00b67f09SDavid van Moolenbroek { "DistributeCmd", 101, last, CONF_STRING, &def.dist_cmd },
221*00b67f09SDavid van Moolenbroek { "NamedChrootDir", 99, last, CONF_STRING, &def.chroot_dir },
222*00b67f09SDavid van Moolenbroek
223*00b67f09SDavid van Moolenbroek { NULL, 0, 0, CONF_END, NULL},
224*00b67f09SDavid van Moolenbroek };
225*00b67f09SDavid van Moolenbroek
226*00b67f09SDavid van Moolenbroek /*****************************************************************
227*00b67f09SDavid van Moolenbroek ** private (static) function deklaration and definition
228*00b67f09SDavid van Moolenbroek *****************************************************************/
bool2str(int val)229*00b67f09SDavid van Moolenbroek static const char *bool2str (int val)
230*00b67f09SDavid van Moolenbroek {
231*00b67f09SDavid van Moolenbroek return val ? "True" : "False";
232*00b67f09SDavid van Moolenbroek }
233*00b67f09SDavid van Moolenbroek
set_varptr(char * entry,void * ptr,const void * ptr2)234*00b67f09SDavid van Moolenbroek static int set_varptr (char *entry, void *ptr, const void *ptr2)
235*00b67f09SDavid van Moolenbroek {
236*00b67f09SDavid van Moolenbroek zconf_para_t *c;
237*00b67f09SDavid van Moolenbroek
238*00b67f09SDavid van Moolenbroek for ( c = confpara; c->label; c++ )
239*00b67f09SDavid van Moolenbroek if ( strcasecmp (entry, c->label) == 0 )
240*00b67f09SDavid van Moolenbroek {
241*00b67f09SDavid van Moolenbroek c->var = ptr;
242*00b67f09SDavid van Moolenbroek c->var2 = ptr2;
243*00b67f09SDavid van Moolenbroek return 1;
244*00b67f09SDavid van Moolenbroek }
245*00b67f09SDavid van Moolenbroek return 0;
246*00b67f09SDavid van Moolenbroek }
247*00b67f09SDavid van Moolenbroek
set_all_varptr(zconf_t * cp,const zconf_t * cp2)248*00b67f09SDavid van Moolenbroek static void set_all_varptr (zconf_t *cp, const zconf_t *cp2)
249*00b67f09SDavid van Moolenbroek {
250*00b67f09SDavid van Moolenbroek set_varptr ("zonedir", &cp->zonedir, cp2 ? &cp2->zonedir: NULL);
251*00b67f09SDavid van Moolenbroek set_varptr ("recursive", &cp->recursive, cp2 ? &cp2->recursive: NULL);
252*00b67f09SDavid van Moolenbroek set_varptr ("printage", &cp->printage, cp2 ? &cp2->printage: NULL);
253*00b67f09SDavid van Moolenbroek set_varptr ("printtime", &cp->printtime, cp2 ? &cp2->printtime: NULL);
254*00b67f09SDavid van Moolenbroek set_varptr ("leftjustify", &cp->ljust, cp2 ? &cp2->ljust: NULL);
255*00b67f09SDavid van Moolenbroek set_varptr ("lscolor", &cp->colorterm, cp2 ? &cp2->colorterm: NULL);
256*00b67f09SDavid van Moolenbroek
257*00b67f09SDavid van Moolenbroek set_varptr ("resigninterval", &cp->resign, cp2 ? &cp2->resign: NULL);
258*00b67f09SDavid van Moolenbroek set_varptr ("sigvalidity", &cp->sigvalidity, cp2 ? &cp2->sigvalidity: NULL);
259*00b67f09SDavid van Moolenbroek set_varptr ("max_ttl", &cp->max_ttl, cp2 ? &cp2->max_ttl: NULL);
260*00b67f09SDavid van Moolenbroek set_varptr ("maximumttl", &cp->max_ttl, cp2 ? &cp2->max_ttl: NULL);
261*00b67f09SDavid van Moolenbroek set_varptr ("key_ttl", &cp->key_ttl, cp2 ? &cp2->key_ttl: NULL);
262*00b67f09SDavid van Moolenbroek set_varptr ("dnskeyttl", &cp->key_ttl, cp2 ? &cp2->key_ttl: NULL);
263*00b67f09SDavid van Moolenbroek set_varptr ("propagation", &cp->proptime, cp2 ? &cp2->proptime: NULL);
264*00b67f09SDavid van Moolenbroek #if defined (DEF_TTL)
265*00b67f09SDavid van Moolenbroek set_varptr ("def_ttl", &cp->def_ttl, cp2 ? &cp2->def_ttl: NULLl);
266*00b67f09SDavid van Moolenbroek #endif
267*00b67f09SDavid van Moolenbroek set_varptr ("serialformat", &cp->serialform, cp2 ? &cp2->serialform: NULL);
268*00b67f09SDavid van Moolenbroek
269*00b67f09SDavid van Moolenbroek set_varptr ("key_algo", &cp->k_algo, cp2 ? &cp2->k_algo: NULL);
270*00b67f09SDavid van Moolenbroek set_varptr ("keyalgo", &cp->k_algo, cp2 ? &cp2->k_algo: NULL);
271*00b67f09SDavid van Moolenbroek set_varptr ("addkey_algo", &cp->k2_algo, cp2 ? &cp2->k2_algo: NULL);
272*00b67f09SDavid van Moolenbroek set_varptr ("addkeyalgo", &cp->k2_algo, cp2 ? &cp2->k2_algo: NULL);
273*00b67f09SDavid van Moolenbroek set_varptr ("ksk_lifetime", &cp->k_life, cp2 ? &cp2->k_life: NULL);
274*00b67f09SDavid van Moolenbroek set_varptr ("ksklifetime", &cp->k_life, cp2 ? &cp2->k_life: NULL);
275*00b67f09SDavid van Moolenbroek set_varptr ("ksk_algo", &cp->k_algo, cp2 ? &cp2->k_algo: NULL); /* used only in compability mode */
276*00b67f09SDavid van Moolenbroek set_varptr ("ksk_bits", &cp->k_bits, cp2 ? &cp2->k_bits: NULL);
277*00b67f09SDavid van Moolenbroek set_varptr ("kskbits", &cp->k_bits, cp2 ? &cp2->k_bits: NULL);
278*00b67f09SDavid van Moolenbroek set_varptr ("ksk_randfile", &cp->k_random, cp2 ? &cp2->k_random: NULL);
279*00b67f09SDavid van Moolenbroek set_varptr ("kskrandfile", &cp->k_random, cp2 ? &cp2->k_random: NULL);
280*00b67f09SDavid van Moolenbroek
281*00b67f09SDavid van Moolenbroek set_varptr ("zsk_lifetime", &cp->z_life, cp2 ? &cp2->z_life: NULL);
282*00b67f09SDavid van Moolenbroek set_varptr ("zsklifetime", &cp->z_life, cp2 ? &cp2->z_life: NULL);
283*00b67f09SDavid van Moolenbroek // set_varptr ("zsk_algo", &cp->z_algo, cp2 ? &cp2->z_algo: NULL);
284*00b67f09SDavid van Moolenbroek set_varptr ("zsk_algo", &cp->k2_algo, cp2 ? &cp2->k2_algo: NULL);
285*00b67f09SDavid van Moolenbroek set_varptr ("zsk_bits", &cp->z_bits, cp2 ? &cp2->z_bits: NULL);
286*00b67f09SDavid van Moolenbroek set_varptr ("zskbits", &cp->z_bits, cp2 ? &cp2->z_bits: NULL);
287*00b67f09SDavid van Moolenbroek #if defined(ALLOW_ALWAYS_PREPUBLISH_ZSK) && ALLOW_ALWAYS_PREPUBLISH_ZSK
288*00b67f09SDavid van Moolenbroek set_varptr ("zskpermanent", &cp->z_always, cp2 ? &cp2->z_always: NULL);
289*00b67f09SDavid van Moolenbroek #endif
290*00b67f09SDavid van Moolenbroek set_varptr ("zsk_randfile", &cp->z_random, cp2 ? &cp2->z_random: NULL);
291*00b67f09SDavid van Moolenbroek set_varptr ("zskrandfile", &cp->z_random, cp2 ? &cp2->z_random: NULL);
292*00b67f09SDavid van Moolenbroek set_varptr ("nsec3", &cp->nsec3, cp2 ? &cp2->nsec3: NULL);
293*00b67f09SDavid van Moolenbroek set_varptr ("saltbits", &cp->saltbits, cp2 ? &cp2->saltbits: NULL);
294*00b67f09SDavid van Moolenbroek
295*00b67f09SDavid van Moolenbroek set_varptr ("--view", &cp->view, cp2 ? &cp2->view: NULL);
296*00b67f09SDavid van Moolenbroek set_varptr ("--noexec", &cp->noexec, cp2 ? &cp2->noexec: NULL);
297*00b67f09SDavid van Moolenbroek set_varptr ("logfile", &cp->logfile, cp2 ? &cp2->logfile: NULL);
298*00b67f09SDavid van Moolenbroek set_varptr ("loglevel", &cp->loglevel, cp2 ? &cp2->loglevel: NULL);
299*00b67f09SDavid van Moolenbroek set_varptr ("logdomaindir", &cp->logdomaindir, cp2 ? &cp2->logdomaindir: NULL);
300*00b67f09SDavid van Moolenbroek set_varptr ("syslogfacility", &cp->syslogfacility, cp2 ? &cp2->syslogfacility: NULL);
301*00b67f09SDavid van Moolenbroek set_varptr ("sysloglevel", &cp->sysloglevel, cp2 ? &cp2->sysloglevel: NULL);
302*00b67f09SDavid van Moolenbroek set_varptr ("verboselog", &cp->verboselog, cp2 ? &cp2->verboselog: NULL);
303*00b67f09SDavid van Moolenbroek set_varptr ("-v", &cp->verbosity, cp2 ? &cp2->verbosity: NULL);
304*00b67f09SDavid van Moolenbroek set_varptr ("keyfile", &cp->keyfile, cp2 ? &cp2->keyfile: NULL);
305*00b67f09SDavid van Moolenbroek set_varptr ("zonefile", &cp->zonefile, cp2 ? &cp2->zonefile: NULL);
306*00b67f09SDavid van Moolenbroek set_varptr ("keysetdir", &cp->keysetdir, cp2 ? &cp2->keysetdir: NULL);
307*00b67f09SDavid van Moolenbroek set_varptr ("dlv_domain", &cp->lookaside, cp2 ? &cp2->lookaside: NULL);
308*00b67f09SDavid van Moolenbroek set_varptr ("dlvdomain", &cp->lookaside, cp2 ? &cp2->lookaside: NULL);
309*00b67f09SDavid van Moolenbroek set_varptr ("sig_randfile", &cp->sig_random, cp2 ? &cp2->sig_random: NULL);
310*00b67f09SDavid van Moolenbroek set_varptr ("sigrandfile", &cp->sig_random, cp2 ? &cp2->sig_random: NULL);
311*00b67f09SDavid van Moolenbroek set_varptr ("sig_pseudorand", &cp->sig_pseudo, cp2 ? &cp2->sig_pseudo: NULL);
312*00b67f09SDavid van Moolenbroek set_varptr ("sigpseudorand", &cp->sig_pseudo, cp2 ? &cp2->sig_pseudo: NULL);
313*00b67f09SDavid van Moolenbroek set_varptr ("sig_generateds", &cp->sig_gends, cp2 ? &cp2->sig_gends: NULL);
314*00b67f09SDavid van Moolenbroek set_varptr ("siggenerateds", &cp->sig_gends, cp2 ? &cp2->sig_gends: NULL);
315*00b67f09SDavid van Moolenbroek set_varptr ("sig_dnskeyksk", &cp->sig_dnskeyksk, cp2 ? &cp2->sig_dnskeyksk: NULL);
316*00b67f09SDavid van Moolenbroek set_varptr ("sigdnskeyksk", &cp->sig_dnskeyksk, cp2 ? &cp2->sig_dnskeyksk: NULL);
317*00b67f09SDavid van Moolenbroek set_varptr ("sig_parameter", &cp->sig_param, cp2 ? &cp2->sig_param: NULL);
318*00b67f09SDavid van Moolenbroek set_varptr ("sigparameter", &cp->sig_param, cp2 ? &cp2->sig_param: NULL);
319*00b67f09SDavid van Moolenbroek set_varptr ("dependfiles", &cp->dependfiles, cp2 ? &cp2->dependfiles: NULL);
320*00b67f09SDavid van Moolenbroek set_varptr ("distribute_cmd", &cp->dist_cmd, cp2 ? &cp2->dist_cmd: NULL);
321*00b67f09SDavid van Moolenbroek set_varptr ("distributecmd", &cp->dist_cmd, cp2 ? &cp2->dist_cmd: NULL);
322*00b67f09SDavid van Moolenbroek set_varptr ("namedchrootdir", &cp->chroot_dir, cp2 ? &cp2->chroot_dir: NULL);
323*00b67f09SDavid van Moolenbroek }
324*00b67f09SDavid van Moolenbroek
parseconfigline(char * buf,unsigned int line,zconf_t * z)325*00b67f09SDavid van Moolenbroek static void parseconfigline (char *buf, unsigned int line, zconf_t *z)
326*00b67f09SDavid van Moolenbroek {
327*00b67f09SDavid van Moolenbroek char *end, *val, *p;
328*00b67f09SDavid van Moolenbroek char *tag;
329*00b67f09SDavid van Moolenbroek unsigned int found;
330*00b67f09SDavid van Moolenbroek zconf_para_t *c;
331*00b67f09SDavid van Moolenbroek
332*00b67f09SDavid van Moolenbroek assert (buf[0] != '\0');
333*00b67f09SDavid van Moolenbroek
334*00b67f09SDavid van Moolenbroek p = &buf[strlen(buf)-1]; /* Chop off white space at eol */
335*00b67f09SDavid van Moolenbroek while ( p >= buf && isspace (*p) )
336*00b67f09SDavid van Moolenbroek *p-- = '\0';
337*00b67f09SDavid van Moolenbroek
338*00b67f09SDavid van Moolenbroek for (p = buf; isspace (*p); p++ ) /* Ignore leading white space */
339*00b67f09SDavid van Moolenbroek ;
340*00b67f09SDavid van Moolenbroek
341*00b67f09SDavid van Moolenbroek /* Ignore comments and emtpy lines */
342*00b67f09SDavid van Moolenbroek if ( *p == '\0' || ISCOMMENT (p) )
343*00b67f09SDavid van Moolenbroek return;
344*00b67f09SDavid van Moolenbroek
345*00b67f09SDavid van Moolenbroek tag = p;
346*00b67f09SDavid van Moolenbroek /* Get the end of the first argument */
347*00b67f09SDavid van Moolenbroek end = &buf[strlen(buf)-1];
348*00b67f09SDavid van Moolenbroek while ( p < end && !ISDELIM (*p) ) /* Skip until delim */
349*00b67f09SDavid van Moolenbroek p++;
350*00b67f09SDavid van Moolenbroek *p++ = '\0'; /* Terminate this argument */
351*00b67f09SDavid van Moolenbroek dbg_val1 ("Parsing \"%s\"\n", tag);
352*00b67f09SDavid van Moolenbroek
353*00b67f09SDavid van Moolenbroek while ( p < end && ISDELIM (*p) ) /* Skip delim chars */
354*00b67f09SDavid van Moolenbroek p++;
355*00b67f09SDavid van Moolenbroek
356*00b67f09SDavid van Moolenbroek val = p; /* Start of the value */
357*00b67f09SDavid van Moolenbroek dbg_val1 ("\tgot value \"%s\"\n", val);
358*00b67f09SDavid van Moolenbroek
359*00b67f09SDavid van Moolenbroek /* If starting with quote, skip until next quote */
360*00b67f09SDavid van Moolenbroek if ( *p == '"' || *p == '\'' )
361*00b67f09SDavid van Moolenbroek {
362*00b67f09SDavid van Moolenbroek p++; /* Find next quote */
363*00b67f09SDavid van Moolenbroek while ( p <= end && *p && *p != *val )
364*00b67f09SDavid van Moolenbroek p++;
365*00b67f09SDavid van Moolenbroek *p = '\0';
366*00b67f09SDavid van Moolenbroek val++; /* Skip the first quote */
367*00b67f09SDavid van Moolenbroek }
368*00b67f09SDavid van Moolenbroek else /* Otherwise check if there is any comment char at the end */
369*00b67f09SDavid van Moolenbroek {
370*00b67f09SDavid van Moolenbroek while ( p < end && *p && !ISCOMMENT(p) )
371*00b67f09SDavid van Moolenbroek p++;
372*00b67f09SDavid van Moolenbroek if ( ISCOMMENT (p) )
373*00b67f09SDavid van Moolenbroek {
374*00b67f09SDavid van Moolenbroek do /* Chop off white space before comment */
375*00b67f09SDavid van Moolenbroek *p-- = '\0';
376*00b67f09SDavid van Moolenbroek while ( p >= val && isspace (*p) );
377*00b67f09SDavid van Moolenbroek }
378*00b67f09SDavid van Moolenbroek }
379*00b67f09SDavid van Moolenbroek
380*00b67f09SDavid van Moolenbroek /* Otherwise it is already terminated above */
381*00b67f09SDavid van Moolenbroek found = 0;
382*00b67f09SDavid van Moolenbroek c = confpara;
383*00b67f09SDavid van Moolenbroek while ( !found && c->type != CONF_END )
384*00b67f09SDavid van Moolenbroek {
385*00b67f09SDavid van Moolenbroek if ( strcasecmp (tag, c->label) == 0 )
386*00b67f09SDavid van Moolenbroek {
387*00b67f09SDavid van Moolenbroek char **str;
388*00b67f09SDavid van Moolenbroek char quantity;
389*00b67f09SDavid van Moolenbroek long lval;
390*00b67f09SDavid van Moolenbroek
391*00b67f09SDavid van Moolenbroek found = 1;
392*00b67f09SDavid van Moolenbroek switch ( c->type )
393*00b67f09SDavid van Moolenbroek {
394*00b67f09SDavid van Moolenbroek case CONF_VERSION:
395*00b67f09SDavid van Moolenbroek break;
396*00b67f09SDavid van Moolenbroek case CONF_LEVEL:
397*00b67f09SDavid van Moolenbroek case CONF_FACILITY:
398*00b67f09SDavid van Moolenbroek case CONF_STRING:
399*00b67f09SDavid van Moolenbroek str = (char **)c->var;
400*00b67f09SDavid van Moolenbroek *str = strdup (val);
401*00b67f09SDavid van Moolenbroek str_untaint (*str); /* remove "bad" characters */
402*00b67f09SDavid van Moolenbroek break;
403*00b67f09SDavid van Moolenbroek case CONF_INT:
404*00b67f09SDavid van Moolenbroek sscanf (val, "%d", (int *)c->var);
405*00b67f09SDavid van Moolenbroek break;
406*00b67f09SDavid van Moolenbroek case CONF_TIMEINT:
407*00b67f09SDavid van Moolenbroek quantity = 'd';
408*00b67f09SDavid van Moolenbroek if ( *val == 'u' || *val == 'U' )
409*00b67f09SDavid van Moolenbroek lval = 0L;
410*00b67f09SDavid van Moolenbroek else
411*00b67f09SDavid van Moolenbroek sscanf (val, "%ld%c", &lval, &quantity);
412*00b67f09SDavid van Moolenbroek if ( quantity == 'm' )
413*00b67f09SDavid van Moolenbroek lval *= MINSEC;
414*00b67f09SDavid van Moolenbroek else if ( quantity == 'h' )
415*00b67f09SDavid van Moolenbroek lval *= HOURSEC;
416*00b67f09SDavid van Moolenbroek else if ( quantity == 'd' )
417*00b67f09SDavid van Moolenbroek lval *= DAYSEC;
418*00b67f09SDavid van Moolenbroek else if ( quantity == 'w' )
419*00b67f09SDavid van Moolenbroek lval *= WEEKSEC;
420*00b67f09SDavid van Moolenbroek else if ( quantity == 'y' )
421*00b67f09SDavid van Moolenbroek lval *= YEARSEC;
422*00b67f09SDavid van Moolenbroek (*(long *)c->var) = lval;
423*00b67f09SDavid van Moolenbroek break;
424*00b67f09SDavid van Moolenbroek case CONF_ALGO:
425*00b67f09SDavid van Moolenbroek if ( strcmp (val, "1") == 0 || strcasecmp (val, "rsa") == 0 ||
426*00b67f09SDavid van Moolenbroek strcasecmp (val, "rsamd5") == 0 )
427*00b67f09SDavid van Moolenbroek *((int *)c->var) = DK_ALGO_RSA;
428*00b67f09SDavid van Moolenbroek else if ( strcmp (val, "3") == 0 ||
429*00b67f09SDavid van Moolenbroek strcasecmp (val, "dsa") == 0 )
430*00b67f09SDavid van Moolenbroek *((int *)c->var) = DK_ALGO_DSA;
431*00b67f09SDavid van Moolenbroek else if ( strcmp (val, "5") == 0 ||
432*00b67f09SDavid van Moolenbroek strcasecmp (val, "rsasha1") == 0 )
433*00b67f09SDavid van Moolenbroek *((int *)c->var) = DK_ALGO_RSASHA1;
434*00b67f09SDavid van Moolenbroek else if ( strcmp (val, "6") == 0 ||
435*00b67f09SDavid van Moolenbroek strcasecmp (val, "nsec3dsa") == 0 ||
436*00b67f09SDavid van Moolenbroek strcasecmp (val, "n3dsa") == 0 )
437*00b67f09SDavid van Moolenbroek *((int *)c->var) = DK_ALGO_NSEC3DSA;
438*00b67f09SDavid van Moolenbroek else if ( strcmp (val, "7") == 0 ||
439*00b67f09SDavid van Moolenbroek strcasecmp (val, "nsec3rsasha1") == 0 ||
440*00b67f09SDavid van Moolenbroek strcasecmp (val, "n3rsasha1") == 0 )
441*00b67f09SDavid van Moolenbroek *((int *)c->var) = DK_ALGO_NSEC3RSASHA1;
442*00b67f09SDavid van Moolenbroek else if ( strcmp (val, "8") == 0 ||
443*00b67f09SDavid van Moolenbroek strcasecmp (val, "rsasha2") == 0 ||
444*00b67f09SDavid van Moolenbroek strcasecmp (val, "rsasha256") == 0 ||
445*00b67f09SDavid van Moolenbroek strcasecmp (val, "nsec3rsasha2") == 0 ||
446*00b67f09SDavid van Moolenbroek strcasecmp (val, "n3rsasha2") == 0 ||
447*00b67f09SDavid van Moolenbroek strcasecmp (val, "nsec3rsasha256") == 0 ||
448*00b67f09SDavid van Moolenbroek strcasecmp (val, "n3rsasha256") == 0 )
449*00b67f09SDavid van Moolenbroek *((int *)c->var) = DK_ALGO_RSASHA256;
450*00b67f09SDavid van Moolenbroek else if ( strcmp (val, "10") == 0 ||
451*00b67f09SDavid van Moolenbroek strcasecmp (val, "rsasha5") == 0 ||
452*00b67f09SDavid van Moolenbroek strcasecmp (val, "rsasha512") == 0 ||
453*00b67f09SDavid van Moolenbroek strcasecmp (val, "nsec3rsasha5") == 0 ||
454*00b67f09SDavid van Moolenbroek strcasecmp (val, "n3rsasha5") == 0 ||
455*00b67f09SDavid van Moolenbroek strcasecmp (val, "nsec3rsasha512") == 0 ||
456*00b67f09SDavid van Moolenbroek strcasecmp (val, "n3rsasha512") == 0 )
457*00b67f09SDavid van Moolenbroek *((int *)c->var) = DK_ALGO_RSASHA512;
458*00b67f09SDavid van Moolenbroek else
459*00b67f09SDavid van Moolenbroek error ("Illegal algorithm \"%s\" "
460*00b67f09SDavid van Moolenbroek "in line %d.\n" , val, line);
461*00b67f09SDavid van Moolenbroek break;
462*00b67f09SDavid van Moolenbroek case CONF_SERIAL:
463*00b67f09SDavid van Moolenbroek if ( strcasecmp (val, "unixtime") == 0 )
464*00b67f09SDavid van Moolenbroek *((serial_form_t *)c->var) = Unixtime;
465*00b67f09SDavid van Moolenbroek else if ( strcasecmp (val, "incremental") == 0 || strcasecmp (val, "inc") == 0 )
466*00b67f09SDavid van Moolenbroek *((serial_form_t *)c->var) = Incremental;
467*00b67f09SDavid van Moolenbroek else
468*00b67f09SDavid van Moolenbroek error ("Illegal serial no format \"%s\" "
469*00b67f09SDavid van Moolenbroek "in line %d.\n" , val, line);
470*00b67f09SDavid van Moolenbroek break;
471*00b67f09SDavid van Moolenbroek case CONF_NSEC3:
472*00b67f09SDavid van Moolenbroek if ( strcasecmp (val, "off") == 0 )
473*00b67f09SDavid van Moolenbroek *((nsec3_t *)c->var) = NSEC3_OFF;
474*00b67f09SDavid van Moolenbroek else if ( strcasecmp (val, "on") == 0 )
475*00b67f09SDavid van Moolenbroek *((nsec3_t *)c->var) = NSEC3_ON;
476*00b67f09SDavid van Moolenbroek else if ( strcasecmp (val, "optout") == 0 )
477*00b67f09SDavid van Moolenbroek *((nsec3_t *)c->var) = NSEC3_OPTOUT;
478*00b67f09SDavid van Moolenbroek else
479*00b67f09SDavid van Moolenbroek error ("Illegal NSEC3 format \"%s\" "
480*00b67f09SDavid van Moolenbroek "in line %d.\n" , val, line);
481*00b67f09SDavid van Moolenbroek break;
482*00b67f09SDavid van Moolenbroek case CONF_BOOL:
483*00b67f09SDavid van Moolenbroek *((int *)c->var) = ISTRUE (val);
484*00b67f09SDavid van Moolenbroek break;
485*00b67f09SDavid van Moolenbroek default:
486*00b67f09SDavid van Moolenbroek fatal ("Illegal configuration type in line %d.\n", line);
487*00b67f09SDavid van Moolenbroek }
488*00b67f09SDavid van Moolenbroek }
489*00b67f09SDavid van Moolenbroek c++;
490*00b67f09SDavid van Moolenbroek }
491*00b67f09SDavid van Moolenbroek if ( !found )
492*00b67f09SDavid van Moolenbroek error ("Unknown configuration statement: %s \"%s\"\n", tag, val);
493*00b67f09SDavid van Moolenbroek return;
494*00b67f09SDavid van Moolenbroek }
495*00b67f09SDavid van Moolenbroek
printconfigline(FILE * fp,zconf_para_t * cp)496*00b67f09SDavid van Moolenbroek static void printconfigline (FILE *fp, zconf_para_t *cp)
497*00b67f09SDavid van Moolenbroek {
498*00b67f09SDavid van Moolenbroek int i;
499*00b67f09SDavid van Moolenbroek long lval;
500*00b67f09SDavid van Moolenbroek int printnl;
501*00b67f09SDavid van Moolenbroek
502*00b67f09SDavid van Moolenbroek assert (fp != NULL);
503*00b67f09SDavid van Moolenbroek assert (cp != NULL);
504*00b67f09SDavid van Moolenbroek
505*00b67f09SDavid van Moolenbroek printnl = 0;
506*00b67f09SDavid van Moolenbroek switch ( cp->type )
507*00b67f09SDavid van Moolenbroek {
508*00b67f09SDavid van Moolenbroek case CONF_VERSION:
509*00b67f09SDavid van Moolenbroek fprintf (fp, "#\tZKT config file for version %d.%d.%d\n",
510*00b67f09SDavid van Moolenbroek compversion / 100,
511*00b67f09SDavid van Moolenbroek (compversion / 10 ) % 10,
512*00b67f09SDavid van Moolenbroek compversion % 10);
513*00b67f09SDavid van Moolenbroek break;
514*00b67f09SDavid van Moolenbroek case CONF_COMMENT:
515*00b67f09SDavid van Moolenbroek if ( cp->var )
516*00b67f09SDavid van Moolenbroek fprintf (fp, "# %s", (char *)cp->var);
517*00b67f09SDavid van Moolenbroek printnl = 1;
518*00b67f09SDavid van Moolenbroek break;
519*00b67f09SDavid van Moolenbroek case CONF_LEVEL:
520*00b67f09SDavid van Moolenbroek case CONF_FACILITY:
521*00b67f09SDavid van Moolenbroek if ( *(char **)cp->var != NULL )
522*00b67f09SDavid van Moolenbroek {
523*00b67f09SDavid van Moolenbroek if ( **(char **)cp->var != '\0' )
524*00b67f09SDavid van Moolenbroek {
525*00b67f09SDavid van Moolenbroek char *p;
526*00b67f09SDavid van Moolenbroek
527*00b67f09SDavid van Moolenbroek fprintf (fp, "%s:\t", cp->label);
528*00b67f09SDavid van Moolenbroek for ( p = *(char **)cp->var; *p; p++ )
529*00b67f09SDavid van Moolenbroek putc (toupper (*p), fp);
530*00b67f09SDavid van Moolenbroek // fprintf (fp, "\n");
531*00b67f09SDavid van Moolenbroek }
532*00b67f09SDavid van Moolenbroek else
533*00b67f09SDavid van Moolenbroek fprintf (fp, "%s:\tNONE", cp->label);
534*00b67f09SDavid van Moolenbroek }
535*00b67f09SDavid van Moolenbroek if ( cp->type == CONF_LEVEL )
536*00b67f09SDavid van Moolenbroek fprintf (fp, "\t\t# (NONE|DEBUG|INFO|NOTICE|WARNING|ERROR|FATAL)\n");
537*00b67f09SDavid van Moolenbroek else
538*00b67f09SDavid van Moolenbroek fprintf (fp, "\t\t# (NONE|USER|DAEMON|LOCAL[0-7])\n");
539*00b67f09SDavid van Moolenbroek break;
540*00b67f09SDavid van Moolenbroek case CONF_STRING:
541*00b67f09SDavid van Moolenbroek if ( *(char **)cp->var )
542*00b67f09SDavid van Moolenbroek printnl = fprintf (fp, "%s:\t\"%s\"", cp->label, *(char **)cp->var);
543*00b67f09SDavid van Moolenbroek break;
544*00b67f09SDavid van Moolenbroek case CONF_BOOL:
545*00b67f09SDavid van Moolenbroek fprintf (fp, "%s:\t%s", cp->label, bool2str ( *(int*)cp->var ));
546*00b67f09SDavid van Moolenbroek printnl = 1;
547*00b67f09SDavid van Moolenbroek break;
548*00b67f09SDavid van Moolenbroek case CONF_TIMEINT:
549*00b67f09SDavid van Moolenbroek lval = *(ulong*)cp->var; /* in that case it should be of type ulong */
550*00b67f09SDavid van Moolenbroek fprintf (fp, "%s:\t%s", cp->label, timeint2str (lval));
551*00b67f09SDavid van Moolenbroek if ( lval )
552*00b67f09SDavid van Moolenbroek fprintf (fp, "\t\t# (%ld seconds)", lval);
553*00b67f09SDavid van Moolenbroek printnl = 1;
554*00b67f09SDavid van Moolenbroek break;
555*00b67f09SDavid van Moolenbroek case CONF_ALGO:
556*00b67f09SDavid van Moolenbroek i = *(int*)cp->var;
557*00b67f09SDavid van Moolenbroek if ( i )
558*00b67f09SDavid van Moolenbroek {
559*00b67f09SDavid van Moolenbroek fprintf (fp, "%s:\t%s ", cp->label, dki_algo2str (i));
560*00b67f09SDavid van Moolenbroek fprintf (fp, "\t# (Algorithm ID %d)\n", i);
561*00b67f09SDavid van Moolenbroek }
562*00b67f09SDavid van Moolenbroek break;
563*00b67f09SDavid van Moolenbroek case CONF_SERIAL:
564*00b67f09SDavid van Moolenbroek fprintf (fp, "%s:\t", cp->label);
565*00b67f09SDavid van Moolenbroek if ( *(serial_form_t*)cp->var == Unixtime )
566*00b67f09SDavid van Moolenbroek fprintf (fp, "UnixTime");
567*00b67f09SDavid van Moolenbroek else
568*00b67f09SDavid van Moolenbroek fprintf (fp, "Incremental");
569*00b67f09SDavid van Moolenbroek fprintf (fp, "\t# (UnixTime|Incremental)\n");
570*00b67f09SDavid van Moolenbroek break;
571*00b67f09SDavid van Moolenbroek case CONF_NSEC3:
572*00b67f09SDavid van Moolenbroek fprintf (fp, "%s:\t\t", cp->label);
573*00b67f09SDavid van Moolenbroek if ( *(nsec3_t*)cp->var == NSEC3_OFF )
574*00b67f09SDavid van Moolenbroek fprintf (fp, "Off");
575*00b67f09SDavid van Moolenbroek else if ( *(nsec3_t*)cp->var == NSEC3_ON )
576*00b67f09SDavid van Moolenbroek fprintf (fp, "On");
577*00b67f09SDavid van Moolenbroek else if ( *(nsec3_t*)cp->var == NSEC3_OPTOUT )
578*00b67f09SDavid van Moolenbroek fprintf (fp, "OptOut");
579*00b67f09SDavid van Moolenbroek fprintf (fp, "\t\t# (On|Off|OptOut)\n");
580*00b67f09SDavid van Moolenbroek break;
581*00b67f09SDavid van Moolenbroek case CONF_INT:
582*00b67f09SDavid van Moolenbroek fprintf (fp, "%s:\t%d", cp->label, *(int *)cp->var);
583*00b67f09SDavid van Moolenbroek printnl = 1;
584*00b67f09SDavid van Moolenbroek break;
585*00b67f09SDavid van Moolenbroek case CONF_END:
586*00b67f09SDavid van Moolenbroek /* NOTREACHED */
587*00b67f09SDavid van Moolenbroek break;
588*00b67f09SDavid van Moolenbroek }
589*00b67f09SDavid van Moolenbroek if ( printnl )
590*00b67f09SDavid van Moolenbroek {
591*00b67f09SDavid van Moolenbroek if ( cp->desc )
592*00b67f09SDavid van Moolenbroek {
593*00b67f09SDavid van Moolenbroek if ( printnl < 20 )
594*00b67f09SDavid van Moolenbroek putc ('\t', fp);
595*00b67f09SDavid van Moolenbroek fprintf (fp, "\t# %s\n", cp->desc);
596*00b67f09SDavid van Moolenbroek }
597*00b67f09SDavid van Moolenbroek else
598*00b67f09SDavid van Moolenbroek putc ('\n', fp);
599*00b67f09SDavid van Moolenbroek
600*00b67f09SDavid van Moolenbroek }
601*00b67f09SDavid van Moolenbroek }
602*00b67f09SDavid van Moolenbroek
603*00b67f09SDavid van Moolenbroek /*****************************************************************
604*00b67f09SDavid van Moolenbroek ** public function definition
605*00b67f09SDavid van Moolenbroek *****************************************************************/
606*00b67f09SDavid van Moolenbroek
setconfigversion(int version)607*00b67f09SDavid van Moolenbroek void setconfigversion (int version)
608*00b67f09SDavid van Moolenbroek {
609*00b67f09SDavid van Moolenbroek compversion = version;
610*00b67f09SDavid van Moolenbroek }
611*00b67f09SDavid van Moolenbroek
timeint2str(unsigned long val)612*00b67f09SDavid van Moolenbroek const char *timeint2str (unsigned long val)
613*00b67f09SDavid van Moolenbroek {
614*00b67f09SDavid van Moolenbroek static char str[20+1];
615*00b67f09SDavid van Moolenbroek
616*00b67f09SDavid van Moolenbroek if ( val == 0 )
617*00b67f09SDavid van Moolenbroek snprintf (str, sizeof (str), "Unset");
618*00b67f09SDavid van Moolenbroek else if ( val % YEARSEC == 0 )
619*00b67f09SDavid van Moolenbroek snprintf (str, sizeof (str), "%luy", val / YEARSEC);
620*00b67f09SDavid van Moolenbroek else if ( val % WEEKSEC == 0 )
621*00b67f09SDavid van Moolenbroek snprintf (str, sizeof (str), "%luw", val / WEEKSEC);
622*00b67f09SDavid van Moolenbroek else if ( val % DAYSEC == 0 )
623*00b67f09SDavid van Moolenbroek snprintf (str, sizeof (str), "%lud", val / DAYSEC);
624*00b67f09SDavid van Moolenbroek else if ( val % HOURSEC == 0 )
625*00b67f09SDavid van Moolenbroek snprintf (str, sizeof (str), "%luh", val / HOURSEC);
626*00b67f09SDavid van Moolenbroek else if ( val % MINSEC == 0 )
627*00b67f09SDavid van Moolenbroek snprintf (str, sizeof (str), "%lum", val / MINSEC);
628*00b67f09SDavid van Moolenbroek else
629*00b67f09SDavid van Moolenbroek snprintf (str, sizeof (str), "%lus", val);
630*00b67f09SDavid van Moolenbroek
631*00b67f09SDavid van Moolenbroek return str;
632*00b67f09SDavid van Moolenbroek }
633*00b67f09SDavid van Moolenbroek
634*00b67f09SDavid van Moolenbroek
635*00b67f09SDavid van Moolenbroek /*****************************************************************
636*00b67f09SDavid van Moolenbroek ** loadconfig (file, conf)
637*00b67f09SDavid van Moolenbroek ** Loads a config file into the "conf" structure pointed to by "z".
638*00b67f09SDavid van Moolenbroek ** If "z" is NULL then a new conf struct will be dynamically
639*00b67f09SDavid van Moolenbroek ** allocated.
640*00b67f09SDavid van Moolenbroek ** If no filename is given the conf struct will be initialized
641*00b67f09SDavid van Moolenbroek ** with the builtin default config
642*00b67f09SDavid van Moolenbroek *****************************************************************/
loadconfig(const char * filename,zconf_t * z)643*00b67f09SDavid van Moolenbroek zconf_t *loadconfig (const char *filename, zconf_t *z)
644*00b67f09SDavid van Moolenbroek {
645*00b67f09SDavid van Moolenbroek FILE *fp;
646*00b67f09SDavid van Moolenbroek char buf[1023+1];
647*00b67f09SDavid van Moolenbroek unsigned int line;
648*00b67f09SDavid van Moolenbroek
649*00b67f09SDavid van Moolenbroek if ( z == NULL ) /* allocate new memory for zconf_t */
650*00b67f09SDavid van Moolenbroek {
651*00b67f09SDavid van Moolenbroek if ( (z = calloc (1, sizeof (zconf_t))) == NULL )
652*00b67f09SDavid van Moolenbroek return NULL;
653*00b67f09SDavid van Moolenbroek
654*00b67f09SDavid van Moolenbroek if ( filename && *filename )
655*00b67f09SDavid van Moolenbroek memcpy (z, &def, sizeof (zconf_t)); /* init new struct with defaults */
656*00b67f09SDavid van Moolenbroek }
657*00b67f09SDavid van Moolenbroek
658*00b67f09SDavid van Moolenbroek if ( filename == NULL || *filename == '\0' ) /* no file name given... */
659*00b67f09SDavid van Moolenbroek {
660*00b67f09SDavid van Moolenbroek dbg_val0("loadconfig (NULL)\n");
661*00b67f09SDavid van Moolenbroek memcpy (z, &def, sizeof (zconf_t)); /* ..then init with defaults */
662*00b67f09SDavid van Moolenbroek return z;
663*00b67f09SDavid van Moolenbroek }
664*00b67f09SDavid van Moolenbroek
665*00b67f09SDavid van Moolenbroek dbg_val1 ("loadconfig (%s)\n", filename);
666*00b67f09SDavid van Moolenbroek set_all_varptr (z, NULL);
667*00b67f09SDavid van Moolenbroek
668*00b67f09SDavid van Moolenbroek if ( (fp = fopen(filename, "r")) == NULL )
669*00b67f09SDavid van Moolenbroek fatal ("Could not open config file \"%s\"\n", filename);
670*00b67f09SDavid van Moolenbroek
671*00b67f09SDavid van Moolenbroek line = 0;
672*00b67f09SDavid van Moolenbroek while (fgets(buf, sizeof(buf), fp))
673*00b67f09SDavid van Moolenbroek parseconfigline (buf, ++line, z);
674*00b67f09SDavid van Moolenbroek
675*00b67f09SDavid van Moolenbroek fclose(fp);
676*00b67f09SDavid van Moolenbroek return z;
677*00b67f09SDavid van Moolenbroek }
678*00b67f09SDavid van Moolenbroek
679*00b67f09SDavid van Moolenbroek # define STRCONFIG_DELIMITER ";\r\n"
loadconfig_fromstr(const char * str,zconf_t * z)680*00b67f09SDavid van Moolenbroek zconf_t *loadconfig_fromstr (const char *str, zconf_t *z)
681*00b67f09SDavid van Moolenbroek {
682*00b67f09SDavid van Moolenbroek char *buf;
683*00b67f09SDavid van Moolenbroek char *tok, *toksave;
684*00b67f09SDavid van Moolenbroek unsigned int line;
685*00b67f09SDavid van Moolenbroek
686*00b67f09SDavid van Moolenbroek if ( z == NULL )
687*00b67f09SDavid van Moolenbroek {
688*00b67f09SDavid van Moolenbroek if ( (z = calloc (1, sizeof (zconf_t))) == NULL )
689*00b67f09SDavid van Moolenbroek return NULL;
690*00b67f09SDavid van Moolenbroek memcpy (z, &def, sizeof (zconf_t)); /* init with defaults */
691*00b67f09SDavid van Moolenbroek }
692*00b67f09SDavid van Moolenbroek
693*00b67f09SDavid van Moolenbroek if ( str == NULL || *str == '\0' )
694*00b67f09SDavid van Moolenbroek {
695*00b67f09SDavid van Moolenbroek dbg_val0("loadconfig_fromstr (NULL)\n");
696*00b67f09SDavid van Moolenbroek memcpy (z, &def, sizeof (zconf_t)); /* init with defaults */
697*00b67f09SDavid van Moolenbroek return z;
698*00b67f09SDavid van Moolenbroek }
699*00b67f09SDavid van Moolenbroek
700*00b67f09SDavid van Moolenbroek dbg_val1 ("loadconfig_fromstr (\"%s\")\n", str);
701*00b67f09SDavid van Moolenbroek set_all_varptr (z, NULL);
702*00b67f09SDavid van Moolenbroek
703*00b67f09SDavid van Moolenbroek /* str is const, so we have to copy it into a new buffer */
704*00b67f09SDavid van Moolenbroek if ( (buf = strdup (str)) == NULL )
705*00b67f09SDavid van Moolenbroek fatal ("loadconfig_fromstr: Out of memory");
706*00b67f09SDavid van Moolenbroek
707*00b67f09SDavid van Moolenbroek line = 0;
708*00b67f09SDavid van Moolenbroek tok = strtok_r (buf, STRCONFIG_DELIMITER, &toksave);
709*00b67f09SDavid van Moolenbroek while ( tok )
710*00b67f09SDavid van Moolenbroek {
711*00b67f09SDavid van Moolenbroek line++;
712*00b67f09SDavid van Moolenbroek parseconfigline (tok, line, z);
713*00b67f09SDavid van Moolenbroek tok = strtok_r (NULL, STRCONFIG_DELIMITER, &toksave);
714*00b67f09SDavid van Moolenbroek }
715*00b67f09SDavid van Moolenbroek free (buf);
716*00b67f09SDavid van Moolenbroek return z;
717*00b67f09SDavid van Moolenbroek }
718*00b67f09SDavid van Moolenbroek
719*00b67f09SDavid van Moolenbroek /*****************************************************************
720*00b67f09SDavid van Moolenbroek ** dupconfig (config)
721*00b67f09SDavid van Moolenbroek ** duplicate config struct and return a ptr to the new struct
722*00b67f09SDavid van Moolenbroek *****************************************************************/
dupconfig(const zconf_t * conf)723*00b67f09SDavid van Moolenbroek zconf_t *dupconfig (const zconf_t *conf)
724*00b67f09SDavid van Moolenbroek {
725*00b67f09SDavid van Moolenbroek zconf_t *z;
726*00b67f09SDavid van Moolenbroek
727*00b67f09SDavid van Moolenbroek assert (conf != NULL);
728*00b67f09SDavid van Moolenbroek
729*00b67f09SDavid van Moolenbroek if ( (z = calloc (1, sizeof (zconf_t))) == NULL )
730*00b67f09SDavid van Moolenbroek return NULL;
731*00b67f09SDavid van Moolenbroek
732*00b67f09SDavid van Moolenbroek memcpy (z, conf, sizeof (zconf_t));
733*00b67f09SDavid van Moolenbroek
734*00b67f09SDavid van Moolenbroek return z;
735*00b67f09SDavid van Moolenbroek }
736*00b67f09SDavid van Moolenbroek
737*00b67f09SDavid van Moolenbroek /*****************************************************************
738*00b67f09SDavid van Moolenbroek ** freeconfig (config)
739*00b67f09SDavid van Moolenbroek ** free memory for config struct and return a NULL ptr
740*00b67f09SDavid van Moolenbroek *****************************************************************/
freeconfig(zconf_t * conf)741*00b67f09SDavid van Moolenbroek zconf_t *freeconfig (zconf_t *conf)
742*00b67f09SDavid van Moolenbroek {
743*00b67f09SDavid van Moolenbroek if (conf != NULL);
744*00b67f09SDavid van Moolenbroek free (conf);
745*00b67f09SDavid van Moolenbroek
746*00b67f09SDavid van Moolenbroek return (zconf_t *)NULL;
747*00b67f09SDavid van Moolenbroek }
748*00b67f09SDavid van Moolenbroek
749*00b67f09SDavid van Moolenbroek /*****************************************************************
750*00b67f09SDavid van Moolenbroek ** setconfigpar (entry, pval)
751*00b67f09SDavid van Moolenbroek *****************************************************************/
setconfigpar(zconf_t * config,char * entry,const void * pval)752*00b67f09SDavid van Moolenbroek int setconfigpar (zconf_t *config, char *entry, const void *pval)
753*00b67f09SDavid van Moolenbroek {
754*00b67f09SDavid van Moolenbroek char *str;
755*00b67f09SDavid van Moolenbroek zconf_para_t *c;
756*00b67f09SDavid van Moolenbroek
757*00b67f09SDavid van Moolenbroek set_all_varptr (config, NULL);
758*00b67f09SDavid van Moolenbroek
759*00b67f09SDavid van Moolenbroek for ( c = confpara; c->type != CONF_END; c++ )
760*00b67f09SDavid van Moolenbroek if ( strcasecmp (entry, c->label) == 0 )
761*00b67f09SDavid van Moolenbroek {
762*00b67f09SDavid van Moolenbroek switch ( c->type )
763*00b67f09SDavid van Moolenbroek {
764*00b67f09SDavid van Moolenbroek case CONF_VERSION:
765*00b67f09SDavid van Moolenbroek break;
766*00b67f09SDavid van Moolenbroek case CONF_LEVEL:
767*00b67f09SDavid van Moolenbroek case CONF_FACILITY:
768*00b67f09SDavid van Moolenbroek case CONF_STRING:
769*00b67f09SDavid van Moolenbroek if ( pval )
770*00b67f09SDavid van Moolenbroek {
771*00b67f09SDavid van Moolenbroek str = strdup ((char *)pval);
772*00b67f09SDavid van Moolenbroek str_untaint (str); /* remove "bad" characters */
773*00b67f09SDavid van Moolenbroek }
774*00b67f09SDavid van Moolenbroek else
775*00b67f09SDavid van Moolenbroek str = NULL;
776*00b67f09SDavid van Moolenbroek *((char **)c->var) = str;
777*00b67f09SDavid van Moolenbroek break;
778*00b67f09SDavid van Moolenbroek case CONF_BOOL:
779*00b67f09SDavid van Moolenbroek /* fall through */
780*00b67f09SDavid van Moolenbroek case CONF_ALGO:
781*00b67f09SDavid van Moolenbroek /* fall through */
782*00b67f09SDavid van Moolenbroek case CONF_INT:
783*00b67f09SDavid van Moolenbroek *((int *)c->var) = *((int *)pval);
784*00b67f09SDavid van Moolenbroek break;
785*00b67f09SDavid van Moolenbroek case CONF_TIMEINT:
786*00b67f09SDavid van Moolenbroek *((long *)c->var) = *((long *)pval);
787*00b67f09SDavid van Moolenbroek break;
788*00b67f09SDavid van Moolenbroek case CONF_NSEC3:
789*00b67f09SDavid van Moolenbroek *((nsec3_t *)c->var) = *((nsec3_t *)pval);
790*00b67f09SDavid van Moolenbroek break;
791*00b67f09SDavid van Moolenbroek case CONF_SERIAL:
792*00b67f09SDavid van Moolenbroek *((serial_form_t *)c->var) = *((serial_form_t *)pval);
793*00b67f09SDavid van Moolenbroek break;
794*00b67f09SDavid van Moolenbroek case CONF_COMMENT:
795*00b67f09SDavid van Moolenbroek case CONF_END:
796*00b67f09SDavid van Moolenbroek /* NOTREACHED */
797*00b67f09SDavid van Moolenbroek break;
798*00b67f09SDavid van Moolenbroek }
799*00b67f09SDavid van Moolenbroek return 1;
800*00b67f09SDavid van Moolenbroek }
801*00b67f09SDavid van Moolenbroek return 0;
802*00b67f09SDavid van Moolenbroek }
803*00b67f09SDavid van Moolenbroek
804*00b67f09SDavid van Moolenbroek /*****************************************************************
805*00b67f09SDavid van Moolenbroek ** printconfig (fname, config)
806*00b67f09SDavid van Moolenbroek *****************************************************************/
printconfig(const char * fname,const zconf_t * z)807*00b67f09SDavid van Moolenbroek int printconfig (const char *fname, const zconf_t *z)
808*00b67f09SDavid van Moolenbroek {
809*00b67f09SDavid van Moolenbroek zconf_para_t *cp;
810*00b67f09SDavid van Moolenbroek FILE *fp;
811*00b67f09SDavid van Moolenbroek
812*00b67f09SDavid van Moolenbroek if ( z == NULL )
813*00b67f09SDavid van Moolenbroek return 0;
814*00b67f09SDavid van Moolenbroek
815*00b67f09SDavid van Moolenbroek fp = stdout;
816*00b67f09SDavid van Moolenbroek if ( fname && *fname )
817*00b67f09SDavid van Moolenbroek {
818*00b67f09SDavid van Moolenbroek if ( strcmp (fname, "stdout") == 0 )
819*00b67f09SDavid van Moolenbroek fp = stdout;
820*00b67f09SDavid van Moolenbroek else if ( strcmp (fname, "stderr") == 0 )
821*00b67f09SDavid van Moolenbroek fp = stderr;
822*00b67f09SDavid van Moolenbroek else if ( (fp = fopen(fname, "w")) == NULL )
823*00b67f09SDavid van Moolenbroek {
824*00b67f09SDavid van Moolenbroek error ("Could not open config file \"%s\" for writing\n", fname);
825*00b67f09SDavid van Moolenbroek return -1;
826*00b67f09SDavid van Moolenbroek }
827*00b67f09SDavid van Moolenbroek }
828*00b67f09SDavid van Moolenbroek
829*00b67f09SDavid van Moolenbroek set_all_varptr ((zconf_t *)z, NULL);
830*00b67f09SDavid van Moolenbroek
831*00b67f09SDavid van Moolenbroek for ( cp = confpara; cp->type != CONF_END; cp++ ) /* loop through all parameter */
832*00b67f09SDavid van Moolenbroek if ( iscompatible (cp) ) /* is parameter compatible to current version? */
833*00b67f09SDavid van Moolenbroek printconfigline (fp, cp); /* print it out */
834*00b67f09SDavid van Moolenbroek
835*00b67f09SDavid van Moolenbroek if ( fp && fp != stdout && fp != stderr )
836*00b67f09SDavid van Moolenbroek fclose (fp);
837*00b67f09SDavid van Moolenbroek
838*00b67f09SDavid van Moolenbroek return 1;
839*00b67f09SDavid van Moolenbroek }
840*00b67f09SDavid van Moolenbroek
841*00b67f09SDavid van Moolenbroek /*****************************************************************
842*00b67f09SDavid van Moolenbroek ** printconfigdiff (fname, conf_a, conf_b)
843*00b67f09SDavid van Moolenbroek *****************************************************************/
printconfigdiff(const char * fname,const zconf_t * ref,const zconf_t * z)844*00b67f09SDavid van Moolenbroek int printconfigdiff (const char *fname, const zconf_t *ref, const zconf_t *z)
845*00b67f09SDavid van Moolenbroek {
846*00b67f09SDavid van Moolenbroek zconf_para_t *cp;
847*00b67f09SDavid van Moolenbroek int eq;
848*00b67f09SDavid van Moolenbroek char *p1, *p2;
849*00b67f09SDavid van Moolenbroek FILE *fp;
850*00b67f09SDavid van Moolenbroek
851*00b67f09SDavid van Moolenbroek if ( ref == NULL || z == NULL )
852*00b67f09SDavid van Moolenbroek return 0;
853*00b67f09SDavid van Moolenbroek
854*00b67f09SDavid van Moolenbroek fp = NULL;
855*00b67f09SDavid van Moolenbroek if ( fname && *fname )
856*00b67f09SDavid van Moolenbroek {
857*00b67f09SDavid van Moolenbroek if ( strcmp (fname, "stdout") == 0 )
858*00b67f09SDavid van Moolenbroek fp = stdout;
859*00b67f09SDavid van Moolenbroek else if ( strcmp (fname, "stderr") == 0 )
860*00b67f09SDavid van Moolenbroek fp = stderr;
861*00b67f09SDavid van Moolenbroek else if ( (fp = fopen(fname, "w")) == NULL )
862*00b67f09SDavid van Moolenbroek {
863*00b67f09SDavid van Moolenbroek error ("Could not open config file \"%s\" for writing\n", fname);
864*00b67f09SDavid van Moolenbroek return -1;
865*00b67f09SDavid van Moolenbroek }
866*00b67f09SDavid van Moolenbroek }
867*00b67f09SDavid van Moolenbroek
868*00b67f09SDavid van Moolenbroek set_all_varptr ((zconf_t *)z, ref);
869*00b67f09SDavid van Moolenbroek
870*00b67f09SDavid van Moolenbroek for ( cp = confpara; cp->type != CONF_END; cp++ ) /* loop through all parameter */
871*00b67f09SDavid van Moolenbroek {
872*00b67f09SDavid van Moolenbroek eq = 0;
873*00b67f09SDavid van Moolenbroek if ( iscmdline (cp) ) /* skip command line parameter */
874*00b67f09SDavid van Moolenbroek continue;
875*00b67f09SDavid van Moolenbroek
876*00b67f09SDavid van Moolenbroek if ( !iscompatible (cp) ) /* is parameter compatible to current version? */
877*00b67f09SDavid van Moolenbroek continue;
878*00b67f09SDavid van Moolenbroek
879*00b67f09SDavid van Moolenbroek if ( cp->type == CONF_VERSION || cp->type == CONF_END || cp->type == CONF_COMMENT )
880*00b67f09SDavid van Moolenbroek continue;
881*00b67f09SDavid van Moolenbroek
882*00b67f09SDavid van Moolenbroek dbg_val5 ("printconfigdiff: %d: %s %d %d %d\n", cp->type, cp->label,
883*00b67f09SDavid van Moolenbroek compversion, cp->used_since, cp->used_till);
884*00b67f09SDavid van Moolenbroek assert ( cp->var2 != NULL );
885*00b67f09SDavid van Moolenbroek
886*00b67f09SDavid van Moolenbroek switch ( cp->type )
887*00b67f09SDavid van Moolenbroek {
888*00b67f09SDavid van Moolenbroek case CONF_VERSION:
889*00b67f09SDavid van Moolenbroek case CONF_END:
890*00b67f09SDavid van Moolenbroek case CONF_COMMENT:
891*00b67f09SDavid van Moolenbroek continue;
892*00b67f09SDavid van Moolenbroek case CONF_NSEC3:
893*00b67f09SDavid van Moolenbroek eq = ( *(nsec3_t *)cp->var == *(nsec3_t *)cp->var2 );
894*00b67f09SDavid van Moolenbroek break;
895*00b67f09SDavid van Moolenbroek case CONF_SERIAL:
896*00b67f09SDavid van Moolenbroek eq = ( *(serial_form_t *)cp->var == *(serial_form_t *)cp->var2 );
897*00b67f09SDavid van Moolenbroek break;
898*00b67f09SDavid van Moolenbroek case CONF_BOOL:
899*00b67f09SDavid van Moolenbroek case CONF_ALGO:
900*00b67f09SDavid van Moolenbroek case CONF_INT:
901*00b67f09SDavid van Moolenbroek eq = ( *(int *)cp->var == *(int *)cp->var2 );
902*00b67f09SDavid van Moolenbroek break;
903*00b67f09SDavid van Moolenbroek case CONF_TIMEINT:
904*00b67f09SDavid van Moolenbroek eq = ( *(long *)cp->var == *(long *)cp->var2 );
905*00b67f09SDavid van Moolenbroek break;
906*00b67f09SDavid van Moolenbroek case CONF_LEVEL:
907*00b67f09SDavid van Moolenbroek case CONF_FACILITY:
908*00b67f09SDavid van Moolenbroek case CONF_STRING:
909*00b67f09SDavid van Moolenbroek p1 = *(char **)cp->var;
910*00b67f09SDavid van Moolenbroek p2 = *(char **)cp->var2;
911*00b67f09SDavid van Moolenbroek if ( p1 && p2 )
912*00b67f09SDavid van Moolenbroek eq = strcmp (p1, p2) == 0;
913*00b67f09SDavid van Moolenbroek else if ( p1 == NULL || p2 == NULL )
914*00b67f09SDavid van Moolenbroek eq = 0;
915*00b67f09SDavid van Moolenbroek else
916*00b67f09SDavid van Moolenbroek eq = 1;
917*00b67f09SDavid van Moolenbroek }
918*00b67f09SDavid van Moolenbroek if ( !eq )
919*00b67f09SDavid van Moolenbroek printconfigline (fp, cp); /* print it out */
920*00b67f09SDavid van Moolenbroek }
921*00b67f09SDavid van Moolenbroek
922*00b67f09SDavid van Moolenbroek if ( fp && fp != stdout && fp != stderr )
923*00b67f09SDavid van Moolenbroek fclose (fp);
924*00b67f09SDavid van Moolenbroek
925*00b67f09SDavid van Moolenbroek return 1;
926*00b67f09SDavid van Moolenbroek }
927*00b67f09SDavid van Moolenbroek
928*00b67f09SDavid van Moolenbroek /*****************************************************************
929*00b67f09SDavid van Moolenbroek ** checkconfig (config)
930*00b67f09SDavid van Moolenbroek *****************************************************************/
checkconfig(const zconf_t * z)931*00b67f09SDavid van Moolenbroek int checkconfig (const zconf_t *z)
932*00b67f09SDavid van Moolenbroek {
933*00b67f09SDavid van Moolenbroek int ret;
934*00b67f09SDavid van Moolenbroek long max_ttl;
935*00b67f09SDavid van Moolenbroek
936*00b67f09SDavid van Moolenbroek if ( z == NULL )
937*00b67f09SDavid van Moolenbroek return 1;
938*00b67f09SDavid van Moolenbroek
939*00b67f09SDavid van Moolenbroek max_ttl = z->max_ttl;
940*00b67f09SDavid van Moolenbroek if ( max_ttl <= 0 )
941*00b67f09SDavid van Moolenbroek max_ttl = z->sigvalidity;
942*00b67f09SDavid van Moolenbroek
943*00b67f09SDavid van Moolenbroek ret = 0;
944*00b67f09SDavid van Moolenbroek if ( z->k_random && strcmp (z->k_random, "/dev/urandom") == 0 )
945*00b67f09SDavid van Moolenbroek ret = fprintf (stderr, "random device without enough entropie used for KSK generation \n");
946*00b67f09SDavid van Moolenbroek if ( z->z_random && strcmp (z->z_random, "/dev/urandom") == 0 )
947*00b67f09SDavid van Moolenbroek ret = fprintf (stderr, "random device without enough entropie used for ZSK generation\n");
948*00b67f09SDavid van Moolenbroek
949*00b67f09SDavid van Moolenbroek if ( z->k_bits < 512 || z->z_bits < 512 )
950*00b67f09SDavid van Moolenbroek ret = fprintf (stderr, "Algorithm requires a bit size of at least 512 \n");
951*00b67f09SDavid van Moolenbroek
952*00b67f09SDavid van Moolenbroek if ( z->k_algo == DK_ALGO_RSASHA512 && ( z->k_bits < 1024 || z->z_bits < 1024 ) )
953*00b67f09SDavid van Moolenbroek ret = fprintf (stderr, "Algorithm RSASHA 512 requires a bit size of at least 1024 \n");
954*00b67f09SDavid van Moolenbroek
955*00b67f09SDavid van Moolenbroek if ( z->saltbits < 4 )
956*00b67f09SDavid van Moolenbroek ret = fprintf (stderr, "Saltlength must be at least 4 bits\n");
957*00b67f09SDavid van Moolenbroek if ( z->saltbits > 128 )
958*00b67f09SDavid van Moolenbroek {
959*00b67f09SDavid van Moolenbroek fprintf (stderr, "While the maximum is 520 bits of salt, it's not recommended to use more than 128 bits.\n");
960*00b67f09SDavid van Moolenbroek ret = fprintf (stderr, "The current value is %d bits\n", z->saltbits);
961*00b67f09SDavid van Moolenbroek }
962*00b67f09SDavid van Moolenbroek
963*00b67f09SDavid van Moolenbroek if ( z->sigvalidity < (1 * DAYSEC) || z->sigvalidity > (12 * WEEKSEC) )
964*00b67f09SDavid van Moolenbroek {
965*00b67f09SDavid van Moolenbroek fprintf (stderr, "Signature should be valid for at least 1 day and no longer than 3 month (12 weeks)\n");
966*00b67f09SDavid van Moolenbroek ret = fprintf (stderr, "The current value is %s\n", timeint2str (z->sigvalidity));
967*00b67f09SDavid van Moolenbroek }
968*00b67f09SDavid van Moolenbroek
969*00b67f09SDavid van Moolenbroek if ( z->max_ttl <= 0 )
970*00b67f09SDavid van Moolenbroek {
971*00b67f09SDavid van Moolenbroek ret = fprintf (stderr, "The max TTL is unknown which results in suboptimal key rollover.\n");
972*00b67f09SDavid van Moolenbroek fprintf (stderr, "Please set max_ttl to the maximum ttl used in the zone (run zkt-conf -w zone.db)\n");
973*00b67f09SDavid van Moolenbroek }
974*00b67f09SDavid van Moolenbroek else
975*00b67f09SDavid van Moolenbroek if ( max_ttl > z->sigvalidity/2 )
976*00b67f09SDavid van Moolenbroek ret = fprintf (stderr, "Max TTL (%ld) should be a few times smaller than the signature validity (%ld)\n",
977*00b67f09SDavid van Moolenbroek max_ttl, z->sigvalidity);
978*00b67f09SDavid van Moolenbroek
979*00b67f09SDavid van Moolenbroek // if ( z->resign > (z->sigvalidity*5/6) - (max_ttl + z->proptime) )
980*00b67f09SDavid van Moolenbroek if ( z->resign > (z->sigvalidity*5/6) )
981*00b67f09SDavid van Moolenbroek {
982*00b67f09SDavid van Moolenbroek fprintf (stderr, "Re-signing interval (%s) should be less than ", timeint2str (z->resign));
983*00b67f09SDavid van Moolenbroek ret = fprintf (stderr, "5/6 of sigvalidity (%s)\n", timeint2str (z->sigvalidity));
984*00b67f09SDavid van Moolenbroek }
985*00b67f09SDavid van Moolenbroek
986*00b67f09SDavid van Moolenbroek if ( z->max_ttl > 0 && z->resign > (z->sigvalidity - max_ttl) )
987*00b67f09SDavid van Moolenbroek {
988*00b67f09SDavid van Moolenbroek fprintf (stderr, "Re-signing interval (%s) should be ", timeint2str (z->resign));
989*00b67f09SDavid van Moolenbroek fprintf (stderr, "end at least one max_ttl (%ld) before the end of ", max_ttl);
990*00b67f09SDavid van Moolenbroek ret = fprintf (stderr, "signature lifetime (%ld) (%s)\n", z->sigvalidity, timeint2str(z->sigvalidity - max_ttl));
991*00b67f09SDavid van Moolenbroek }
992*00b67f09SDavid van Moolenbroek
993*00b67f09SDavid van Moolenbroek if ( z->z_life > (24 * WEEKSEC) * (z->z_bits / 512.) )
994*00b67f09SDavid van Moolenbroek {
995*00b67f09SDavid van Moolenbroek fprintf (stderr, "Lifetime of zone signing key (%s) ", timeint2str (z->z_life));
996*00b67f09SDavid van Moolenbroek fprintf (stderr, "seems a little bit high ");
997*00b67f09SDavid van Moolenbroek ret = fprintf (stderr, "(In respect of key size (%d))\n", z->z_bits);
998*00b67f09SDavid van Moolenbroek }
999*00b67f09SDavid van Moolenbroek
1000*00b67f09SDavid van Moolenbroek if ( z->k_life > 0 && z->k_life <= z->z_life )
1001*00b67f09SDavid van Moolenbroek {
1002*00b67f09SDavid van Moolenbroek fprintf (stderr, "Lifetime of key signing key (%s) ", timeint2str (z->k_life));
1003*00b67f09SDavid van Moolenbroek ret = fprintf (stderr, "should be greater than lifetime of zsk\n");
1004*00b67f09SDavid van Moolenbroek }
1005*00b67f09SDavid van Moolenbroek if ( z->k_life > 0 && z->k_life > (52 * WEEKSEC) * (z->k_bits / 512.) )
1006*00b67f09SDavid van Moolenbroek {
1007*00b67f09SDavid van Moolenbroek fprintf (stderr, "Lifetime of key signing key (%s) ", timeint2str (z->k_life));
1008*00b67f09SDavid van Moolenbroek fprintf (stderr, "seems a little bit high ");
1009*00b67f09SDavid van Moolenbroek ret = fprintf (stderr, "(In respect of key size (%d))\n", z->k_bits);
1010*00b67f09SDavid van Moolenbroek }
1011*00b67f09SDavid van Moolenbroek
1012*00b67f09SDavid van Moolenbroek return !ret;
1013*00b67f09SDavid van Moolenbroek }
1014*00b67f09SDavid van Moolenbroek
1015*00b67f09SDavid van Moolenbroek #ifdef CONF_TEST
1016*00b67f09SDavid van Moolenbroek const char *progname;
1017*00b67f09SDavid van Moolenbroek static zconf_t *config;
1018*00b67f09SDavid van Moolenbroek
main(int argc,char * argv[])1019*00b67f09SDavid van Moolenbroek main (int argc, char *argv[])
1020*00b67f09SDavid van Moolenbroek {
1021*00b67f09SDavid van Moolenbroek char *optstr;
1022*00b67f09SDavid van Moolenbroek int val;
1023*00b67f09SDavid van Moolenbroek
1024*00b67f09SDavid van Moolenbroek progname = *argv;
1025*00b67f09SDavid van Moolenbroek
1026*00b67f09SDavid van Moolenbroek config = loadconfig ("", (zconf_t *) NULL); /* load built in defaults */
1027*00b67f09SDavid van Moolenbroek
1028*00b67f09SDavid van Moolenbroek while ( --argc >= 1 )
1029*00b67f09SDavid van Moolenbroek {
1030*00b67f09SDavid van Moolenbroek optstr = *++argv;
1031*00b67f09SDavid van Moolenbroek config = loadconfig_fromstr (optstr, config);
1032*00b67f09SDavid van Moolenbroek }
1033*00b67f09SDavid van Moolenbroek
1034*00b67f09SDavid van Moolenbroek val = 1;
1035*00b67f09SDavid van Moolenbroek setconfigpar (config, "-v", &val);
1036*00b67f09SDavid van Moolenbroek val = 2;
1037*00b67f09SDavid van Moolenbroek setconfigpar (config, "verboselog", &val);
1038*00b67f09SDavid van Moolenbroek val = 1;
1039*00b67f09SDavid van Moolenbroek setconfigpar (config, "recursive", &val);
1040*00b67f09SDavid van Moolenbroek val = 1200;
1041*00b67f09SDavid van Moolenbroek setconfigpar (config, "propagation", &val);
1042*00b67f09SDavid van Moolenbroek
1043*00b67f09SDavid van Moolenbroek printconfig ("stdout", config);
1044*00b67f09SDavid van Moolenbroek }
1045*00b67f09SDavid van Moolenbroek #endif
1046