xref: /minix3/external/bsd/bind/dist/contrib/zkt-1.1.3/zconf.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
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