xref: /minix3/external/bsd/bind/dist/contrib/zkt-1.1.3/zone.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: zone.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 **	@(#) zone.c  (c) Mar 2005  Holger Zuleger  hznet.de
6*00b67f09SDavid van Moolenbroek **
7*00b67f09SDavid van Moolenbroek **	Copyright (c) Mar 2005, Holger Zuleger HZnet. All rights reserved.
8*00b67f09SDavid van Moolenbroek **
9*00b67f09SDavid van Moolenbroek **	This software is open source.
10*00b67f09SDavid van Moolenbroek **
11*00b67f09SDavid van Moolenbroek **	Redistribution and use in source and binary forms, with or without
12*00b67f09SDavid van Moolenbroek **	modification, are permitted provided that the following conditions
13*00b67f09SDavid van Moolenbroek **	are met:
14*00b67f09SDavid van Moolenbroek **
15*00b67f09SDavid van Moolenbroek **	Redistributions of source code must retain the above copyright notice,
16*00b67f09SDavid van Moolenbroek **	this list of conditions and the following disclaimer.
17*00b67f09SDavid van Moolenbroek **
18*00b67f09SDavid van Moolenbroek **	Redistributions in binary form must reproduce the above copyright notice,
19*00b67f09SDavid van Moolenbroek **	this list of conditions and the following disclaimer in the documentation
20*00b67f09SDavid van Moolenbroek **	and/or other materials provided with the distribution.
21*00b67f09SDavid van Moolenbroek **
22*00b67f09SDavid van Moolenbroek **	Neither the name of Holger Zuleger HZnet nor the names of its contributors may
23*00b67f09SDavid van Moolenbroek **	be used to endorse or promote products derived from this software without
24*00b67f09SDavid van Moolenbroek **	specific prior written permission.
25*00b67f09SDavid van Moolenbroek **
26*00b67f09SDavid van Moolenbroek **	THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27*00b67f09SDavid van Moolenbroek **	"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28*00b67f09SDavid van Moolenbroek **	TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29*00b67f09SDavid van Moolenbroek **	PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
30*00b67f09SDavid van Moolenbroek **	LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31*00b67f09SDavid van Moolenbroek **	CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32*00b67f09SDavid van Moolenbroek **	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33*00b67f09SDavid van Moolenbroek **	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34*00b67f09SDavid van Moolenbroek **	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35*00b67f09SDavid van Moolenbroek **	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36*00b67f09SDavid van Moolenbroek **	POSSIBILITY OF SUCH DAMAGE.
37*00b67f09SDavid van Moolenbroek **
38*00b67f09SDavid van Moolenbroek *****************************************************************/
39*00b67f09SDavid van Moolenbroek # include <stdio.h>
40*00b67f09SDavid van Moolenbroek # include <string.h>
41*00b67f09SDavid van Moolenbroek # include <stdlib.h>
42*00b67f09SDavid van Moolenbroek # include <sys/types.h>
43*00b67f09SDavid van Moolenbroek # include <sys/stat.h>
44*00b67f09SDavid van Moolenbroek # include <dirent.h>
45*00b67f09SDavid van Moolenbroek # include <assert.h>
46*00b67f09SDavid van Moolenbroek #ifdef HAVE_CONFIG_H
47*00b67f09SDavid van Moolenbroek # include <config.h>
48*00b67f09SDavid van Moolenbroek #endif
49*00b67f09SDavid van Moolenbroek # include "config_zkt.h"
50*00b67f09SDavid van Moolenbroek # include "debug.h"
51*00b67f09SDavid van Moolenbroek # include "domaincmp.h"
52*00b67f09SDavid van Moolenbroek # include "misc.h"
53*00b67f09SDavid van Moolenbroek # include "zconf.h"
54*00b67f09SDavid van Moolenbroek # include "dki.h"
55*00b67f09SDavid van Moolenbroek #define	extern
56*00b67f09SDavid van Moolenbroek # include "zone.h"
57*00b67f09SDavid van Moolenbroek #undef	extern
58*00b67f09SDavid van Moolenbroek 
59*00b67f09SDavid van Moolenbroek /*****************************************************************
60*00b67f09SDavid van Moolenbroek **	private (static) function declaration and definition
61*00b67f09SDavid van Moolenbroek *****************************************************************/
62*00b67f09SDavid van Moolenbroek static	char	zone_estr[255+1];
63*00b67f09SDavid van Moolenbroek 
64*00b67f09SDavid van Moolenbroek /*****************************************************************
65*00b67f09SDavid van Moolenbroek **	zone_alloc ()
66*00b67f09SDavid van Moolenbroek *****************************************************************/
zone_alloc()67*00b67f09SDavid van Moolenbroek static	zone_t	*zone_alloc ()
68*00b67f09SDavid van Moolenbroek {
69*00b67f09SDavid van Moolenbroek 	zone_t	*zp;
70*00b67f09SDavid van Moolenbroek 
71*00b67f09SDavid van Moolenbroek 	if ( (zp = malloc (sizeof (zone_t))) )
72*00b67f09SDavid van Moolenbroek 	{
73*00b67f09SDavid van Moolenbroek 		memset (zp, 0, sizeof (zone_t));
74*00b67f09SDavid van Moolenbroek 		return zp;
75*00b67f09SDavid van Moolenbroek 	}
76*00b67f09SDavid van Moolenbroek 
77*00b67f09SDavid van Moolenbroek 	snprintf (zone_estr, sizeof (zone_estr),
78*00b67f09SDavid van Moolenbroek 			"zone_alloc: Out of memory");
79*00b67f09SDavid van Moolenbroek 	return NULL;
80*00b67f09SDavid van Moolenbroek }
81*00b67f09SDavid van Moolenbroek 
82*00b67f09SDavid van Moolenbroek /*****************************************************************
83*00b67f09SDavid van Moolenbroek **	zone_cmp () 	return <0 | 0 | >0
84*00b67f09SDavid van Moolenbroek *****************************************************************/
zone_cmp(const zone_t * a,const zone_t * b)85*00b67f09SDavid van Moolenbroek static	int	zone_cmp (const zone_t *a, const zone_t *b)
86*00b67f09SDavid van Moolenbroek {
87*00b67f09SDavid van Moolenbroek 	if ( a == NULL ) return -1;
88*00b67f09SDavid van Moolenbroek 	if ( b == NULL ) return 1;
89*00b67f09SDavid van Moolenbroek 
90*00b67f09SDavid van Moolenbroek 	return domaincmp (a->zone, b->zone);
91*00b67f09SDavid van Moolenbroek }
92*00b67f09SDavid van Moolenbroek 
93*00b67f09SDavid van Moolenbroek 
94*00b67f09SDavid van Moolenbroek /*****************************************************************
95*00b67f09SDavid van Moolenbroek **	public function definition
96*00b67f09SDavid van Moolenbroek *****************************************************************/
97*00b67f09SDavid van Moolenbroek 
98*00b67f09SDavid van Moolenbroek /*****************************************************************
99*00b67f09SDavid van Moolenbroek **	zone_free ()
100*00b67f09SDavid van Moolenbroek *****************************************************************/
zone_free(zone_t * zp)101*00b67f09SDavid van Moolenbroek void	zone_free (zone_t *zp)
102*00b67f09SDavid van Moolenbroek {
103*00b67f09SDavid van Moolenbroek 	assert (zp != NULL);
104*00b67f09SDavid van Moolenbroek 
105*00b67f09SDavid van Moolenbroek 	if ( zp->zone ) free ((char *)zp->zone);
106*00b67f09SDavid van Moolenbroek 	if ( zp->dir ) free ((char *)zp->dir);
107*00b67f09SDavid van Moolenbroek 	if ( zp->file ) free ((char *)zp->file);
108*00b67f09SDavid van Moolenbroek 	if ( zp->sfile ) free ((char *)zp->sfile);
109*00b67f09SDavid van Moolenbroek #if 0
110*00b67f09SDavid van Moolenbroek 	/* TODO: actually there are some problems freeing the config :-( */
111*00b67f09SDavid van Moolenbroek 	if ( zp->conf ) free ((zconf_t *)zp->conf);
112*00b67f09SDavid van Moolenbroek #endif
113*00b67f09SDavid van Moolenbroek 	if ( zp->keys ) dki_freelist (&zp->keys);
114*00b67f09SDavid van Moolenbroek 	free (zp);
115*00b67f09SDavid van Moolenbroek }
116*00b67f09SDavid van Moolenbroek 
117*00b67f09SDavid van Moolenbroek /*****************************************************************
118*00b67f09SDavid van Moolenbroek **	zone_freelist ()
119*00b67f09SDavid van Moolenbroek *****************************************************************/
zone_freelist(zone_t ** listp)120*00b67f09SDavid van Moolenbroek void	zone_freelist (zone_t **listp)
121*00b67f09SDavid van Moolenbroek {
122*00b67f09SDavid van Moolenbroek 	zone_t	*curr;
123*00b67f09SDavid van Moolenbroek 	zone_t	*next;
124*00b67f09SDavid van Moolenbroek 
125*00b67f09SDavid van Moolenbroek 	assert (listp != NULL);
126*00b67f09SDavid van Moolenbroek 
127*00b67f09SDavid van Moolenbroek 	curr = *listp;
128*00b67f09SDavid van Moolenbroek 	while ( curr )
129*00b67f09SDavid van Moolenbroek 	{
130*00b67f09SDavid van Moolenbroek 		next = curr->next;
131*00b67f09SDavid van Moolenbroek 		zone_free (curr);
132*00b67f09SDavid van Moolenbroek 		curr = next;
133*00b67f09SDavid van Moolenbroek 	}
134*00b67f09SDavid van Moolenbroek 	if ( *listp )
135*00b67f09SDavid van Moolenbroek 		*listp = NULL;
136*00b67f09SDavid van Moolenbroek }
137*00b67f09SDavid van Moolenbroek 
138*00b67f09SDavid van Moolenbroek /*****************************************************************
139*00b67f09SDavid van Moolenbroek **	zone_new ()
140*00b67f09SDavid van Moolenbroek **	allocate memory for new zone structure and initialize it
141*00b67f09SDavid van Moolenbroek *****************************************************************/
zone_new(zone_t ** zp,const char * zone,const char * dir,const char * file,const char * signed_ext,const zconf_t * cp)142*00b67f09SDavid van Moolenbroek zone_t	*zone_new (zone_t **zp, const char *zone, const char *dir, const char *file, const char *signed_ext, const zconf_t *cp)
143*00b67f09SDavid van Moolenbroek {
144*00b67f09SDavid van Moolenbroek 	char	path[MAX_PATHSIZE+1];
145*00b67f09SDavid van Moolenbroek 	zone_t	*new;
146*00b67f09SDavid van Moolenbroek 
147*00b67f09SDavid van Moolenbroek 	assert (zp != NULL);
148*00b67f09SDavid van Moolenbroek 	assert (zone != NULL && *zone != '\0');
149*00b67f09SDavid van Moolenbroek 
150*00b67f09SDavid van Moolenbroek 	dbg_val3 ("zone_new: (zp, zone: %s, dir: %s, file: %s, cp)\n", zone, dir, file);
151*00b67f09SDavid van Moolenbroek 	if ( dir == NULL || *dir == '\0' )
152*00b67f09SDavid van Moolenbroek 		dir = ".";
153*00b67f09SDavid van Moolenbroek 
154*00b67f09SDavid van Moolenbroek 	if ( file == NULL || *file == '\0' )
155*00b67f09SDavid van Moolenbroek 		file = cp->zonefile;
156*00b67f09SDavid van Moolenbroek 	else
157*00b67f09SDavid van Moolenbroek 	{	/* check if file contains a path */
158*00b67f09SDavid van Moolenbroek 		const	char	*p;
159*00b67f09SDavid van Moolenbroek 		if ( (p = strrchr (file, '/')) != NULL )
160*00b67f09SDavid van Moolenbroek 		{
161*00b67f09SDavid van Moolenbroek 			snprintf (path, sizeof (path), "%s/%.*s", dir, (int)(p-file), file);
162*00b67f09SDavid van Moolenbroek 			dir = path;
163*00b67f09SDavid van Moolenbroek 			file = p+1;
164*00b67f09SDavid van Moolenbroek 		}
165*00b67f09SDavid van Moolenbroek 	}
166*00b67f09SDavid van Moolenbroek 
167*00b67f09SDavid van Moolenbroek 	if ( (new = zone_alloc ()) != NULL )
168*00b67f09SDavid van Moolenbroek 	{
169*00b67f09SDavid van Moolenbroek 		char	*p;
170*00b67f09SDavid van Moolenbroek 
171*00b67f09SDavid van Moolenbroek 		new->zone = domain_canonicdup (zone);
172*00b67f09SDavid van Moolenbroek 		new->dir = strdup (dir);
173*00b67f09SDavid van Moolenbroek 		new->file = strdup (file);
174*00b67f09SDavid van Moolenbroek 		/* check if file ends with ".signed" ? */
175*00b67f09SDavid van Moolenbroek 		if ( (p = strrchr (new->file, '.')) != NULL && strcmp (p, signed_ext) == 0 )
176*00b67f09SDavid van Moolenbroek 		{
177*00b67f09SDavid van Moolenbroek 			new->sfile = strdup (new->file);
178*00b67f09SDavid van Moolenbroek 			*p = '\0';
179*00b67f09SDavid van Moolenbroek 		}
180*00b67f09SDavid van Moolenbroek 		else
181*00b67f09SDavid van Moolenbroek 		{
182*00b67f09SDavid van Moolenbroek 			snprintf (path, sizeof (path), "%s%s", file, signed_ext);
183*00b67f09SDavid van Moolenbroek 			new->sfile = strdup (path);
184*00b67f09SDavid van Moolenbroek 		}
185*00b67f09SDavid van Moolenbroek 		new->conf = cp;
186*00b67f09SDavid van Moolenbroek 		new->keys = NULL;
187*00b67f09SDavid van Moolenbroek 		dki_readdir (new->dir, &new->keys, 0);
188*00b67f09SDavid van Moolenbroek 		new->next = NULL;
189*00b67f09SDavid van Moolenbroek 	}
190*00b67f09SDavid van Moolenbroek 
191*00b67f09SDavid van Moolenbroek 	return zone_add (zp, new);
192*00b67f09SDavid van Moolenbroek }
193*00b67f09SDavid van Moolenbroek 
194*00b67f09SDavid van Moolenbroek /*****************************************************************
195*00b67f09SDavid van Moolenbroek **	zone_readdir ()
196*00b67f09SDavid van Moolenbroek *****************************************************************/
zone_readdir(const char * dir,const char * zone,const char * zfile,zone_t ** listp,const zconf_t * conf,int dyn_zone)197*00b67f09SDavid van Moolenbroek int	zone_readdir (const char *dir, const char *zone, const char *zfile, zone_t **listp, const zconf_t *conf, int dyn_zone)
198*00b67f09SDavid van Moolenbroek {
199*00b67f09SDavid van Moolenbroek 	char	*p;
200*00b67f09SDavid van Moolenbroek 	char	path[MAX_PATHSIZE+1];
201*00b67f09SDavid van Moolenbroek 	char	*signed_ext = ".signed";
202*00b67f09SDavid van Moolenbroek 	zconf_t	*localconf = NULL;
203*00b67f09SDavid van Moolenbroek 
204*00b67f09SDavid van Moolenbroek 	assert (dir != NULL && *dir != '\0');
205*00b67f09SDavid van Moolenbroek 	assert (conf != NULL);
206*00b67f09SDavid van Moolenbroek 
207*00b67f09SDavid van Moolenbroek 	if ( zone == NULL )	/* zone not given ? */
208*00b67f09SDavid van Moolenbroek 	{
209*00b67f09SDavid van Moolenbroek 		if ( (zone = strrchr (dir, '/')) )	/* try to extract zone name out of directory */
210*00b67f09SDavid van Moolenbroek 			zone++;
211*00b67f09SDavid van Moolenbroek 		else
212*00b67f09SDavid van Moolenbroek 			zone = dir;
213*00b67f09SDavid van Moolenbroek 	}
214*00b67f09SDavid van Moolenbroek 	if ( zone == NULL )	/* zone name still null ? */
215*00b67f09SDavid van Moolenbroek 		return 0;
216*00b67f09SDavid van Moolenbroek 
217*00b67f09SDavid van Moolenbroek 	dbg_val4 ("zone_readdir: (dir: \"%s\", zone: \"%s\", zfile: \"%s\", zp, cp, dyn_zone = %d)\n",
218*00b67f09SDavid van Moolenbroek 					dir, zone, zfile ? zfile: "NULL", dyn_zone);
219*00b67f09SDavid van Moolenbroek 
220*00b67f09SDavid van Moolenbroek 	if ( dyn_zone )
221*00b67f09SDavid van Moolenbroek 		signed_ext = ".dsigned";
222*00b67f09SDavid van Moolenbroek 
223*00b67f09SDavid van Moolenbroek 	if ( zfile && (p = strrchr (zfile, '/')) )	/* check if zfile contains a directory */
224*00b67f09SDavid van Moolenbroek 	{
225*00b67f09SDavid van Moolenbroek 		char	subdir[MAX_PATHSIZE+1];
226*00b67f09SDavid van Moolenbroek 
227*00b67f09SDavid van Moolenbroek 		snprintf (subdir, sizeof (subdir), "%s/%.*s", dir, (int)(p - zfile), zfile);
228*00b67f09SDavid van Moolenbroek 		pathname (path, sizeof (path), subdir, LOCALCONF_FILE, NULL);
229*00b67f09SDavid van Moolenbroek 	}
230*00b67f09SDavid van Moolenbroek 	else
231*00b67f09SDavid van Moolenbroek 		pathname (path, sizeof (path), dir, LOCALCONF_FILE, NULL);
232*00b67f09SDavid van Moolenbroek 	dbg_val1 ("zone_readdir: check local config file %s\n", path);
233*00b67f09SDavid van Moolenbroek 	if ( fileexist (path) )			/* load local config file */
234*00b67f09SDavid van Moolenbroek 	{
235*00b67f09SDavid van Moolenbroek 		localconf = dupconfig (conf);
236*00b67f09SDavid van Moolenbroek 		conf = loadconfig (path, localconf);
237*00b67f09SDavid van Moolenbroek 		/* do not free localconf, because a ptr to it will be added to the zone by zone_new() */
238*00b67f09SDavid van Moolenbroek 	}
239*00b67f09SDavid van Moolenbroek 
240*00b67f09SDavid van Moolenbroek 	if ( zfile == NULL )
241*00b67f09SDavid van Moolenbroek 	{
242*00b67f09SDavid van Moolenbroek 		zfile = conf->zonefile;
243*00b67f09SDavid van Moolenbroek 		pathname (path, sizeof (path), dir, zfile, signed_ext);
244*00b67f09SDavid van Moolenbroek 	}
245*00b67f09SDavid van Moolenbroek 	else
246*00b67f09SDavid van Moolenbroek 	{
247*00b67f09SDavid van Moolenbroek 		dbg_val2("zone_readdir: add %s to zonefile if not already there ? (%s)\n", signed_ext, zfile);
248*00b67f09SDavid van Moolenbroek 		if ( (p = strrchr (zfile, '.')) == NULL || strcmp (p, signed_ext) != 0 )
249*00b67f09SDavid van Moolenbroek 			pathname (path, sizeof (path), dir, zfile, signed_ext);
250*00b67f09SDavid van Moolenbroek 		else
251*00b67f09SDavid van Moolenbroek 			pathname (path, sizeof (path), dir, zfile, NULL);
252*00b67f09SDavid van Moolenbroek 	}
253*00b67f09SDavid van Moolenbroek 
254*00b67f09SDavid van Moolenbroek 	dbg_val1("zone_readdir: fileexist (%s): ", path);
255*00b67f09SDavid van Moolenbroek 	if ( !fileexist (path) )	/* no .signed file found ? ... */
256*00b67f09SDavid van Moolenbroek 	{
257*00b67f09SDavid van Moolenbroek 		dbg_val0("no!\n");
258*00b67f09SDavid van Moolenbroek 		return 0;		/* ... not a secure zone ! */
259*00b67f09SDavid van Moolenbroek 	}
260*00b67f09SDavid van Moolenbroek 	dbg_val0("yes!\n");
261*00b67f09SDavid van Moolenbroek 
262*00b67f09SDavid van Moolenbroek 	dbg_val("zone_readdir: add zone (%s)\n", zone);
263*00b67f09SDavid van Moolenbroek 	zone_new (listp, zone, dir, zfile, signed_ext, conf);
264*00b67f09SDavid van Moolenbroek 
265*00b67f09SDavid van Moolenbroek 	return 1;
266*00b67f09SDavid van Moolenbroek }
267*00b67f09SDavid van Moolenbroek 
268*00b67f09SDavid van Moolenbroek 
269*00b67f09SDavid van Moolenbroek /*****************************************************************
270*00b67f09SDavid van Moolenbroek **	zone_geterrstr ()
271*00b67f09SDavid van Moolenbroek **	return error string
272*00b67f09SDavid van Moolenbroek *****************************************************************/
zone_geterrstr()273*00b67f09SDavid van Moolenbroek const	char	*zone_geterrstr ()
274*00b67f09SDavid van Moolenbroek {
275*00b67f09SDavid van Moolenbroek 	return zone_estr;
276*00b67f09SDavid van Moolenbroek }
277*00b67f09SDavid van Moolenbroek 
278*00b67f09SDavid van Moolenbroek /*****************************************************************
279*00b67f09SDavid van Moolenbroek **	zone_add ()
280*00b67f09SDavid van Moolenbroek *****************************************************************/
zone_add(zone_t ** list,zone_t * new)281*00b67f09SDavid van Moolenbroek zone_t	*zone_add (zone_t **list, zone_t *new)
282*00b67f09SDavid van Moolenbroek {
283*00b67f09SDavid van Moolenbroek 	zone_t	*curr;
284*00b67f09SDavid van Moolenbroek 	zone_t	*last;
285*00b67f09SDavid van Moolenbroek 
286*00b67f09SDavid van Moolenbroek 	if ( list == NULL )
287*00b67f09SDavid van Moolenbroek 		return NULL;
288*00b67f09SDavid van Moolenbroek 	if ( new == NULL )
289*00b67f09SDavid van Moolenbroek 		return *list;
290*00b67f09SDavid van Moolenbroek 
291*00b67f09SDavid van Moolenbroek 	last = curr = *list;
292*00b67f09SDavid van Moolenbroek 	while ( curr && zone_cmp (curr, new) < 0 )
293*00b67f09SDavid van Moolenbroek 	{
294*00b67f09SDavid van Moolenbroek 		last = curr;
295*00b67f09SDavid van Moolenbroek 		curr = curr->next;
296*00b67f09SDavid van Moolenbroek 	}
297*00b67f09SDavid van Moolenbroek 
298*00b67f09SDavid van Moolenbroek 	if ( curr == *list )	/* add node at the begining of the list */
299*00b67f09SDavid van Moolenbroek 		*list = new;
300*00b67f09SDavid van Moolenbroek 	else			/* add node at end or between two nodes */
301*00b67f09SDavid van Moolenbroek 		last->next = new;
302*00b67f09SDavid van Moolenbroek 	new->next = curr;
303*00b67f09SDavid van Moolenbroek 
304*00b67f09SDavid van Moolenbroek 	return new;
305*00b67f09SDavid van Moolenbroek }
306*00b67f09SDavid van Moolenbroek 
307*00b67f09SDavid van Moolenbroek /*****************************************************************
308*00b67f09SDavid van Moolenbroek **	zone_search ()
309*00b67f09SDavid van Moolenbroek *****************************************************************/
zone_search(const zone_t * list,const char * zone)310*00b67f09SDavid van Moolenbroek const zone_t	*zone_search (const zone_t *list, const char *zone)
311*00b67f09SDavid van Moolenbroek {
312*00b67f09SDavid van Moolenbroek 	if ( zone == NULL || *zone == '\0' )
313*00b67f09SDavid van Moolenbroek 		return NULL;
314*00b67f09SDavid van Moolenbroek 
315*00b67f09SDavid van Moolenbroek 	while ( list && strcmp (zone, list->zone) != 0 )
316*00b67f09SDavid van Moolenbroek 		list = list->next;
317*00b67f09SDavid van Moolenbroek 
318*00b67f09SDavid van Moolenbroek 	return list;
319*00b67f09SDavid van Moolenbroek }
320*00b67f09SDavid van Moolenbroek 
321*00b67f09SDavid van Moolenbroek /*****************************************************************
322*00b67f09SDavid van Moolenbroek **	zone_print ()
323*00b67f09SDavid van Moolenbroek *****************************************************************/
zone_print(const char * mesg,const zone_t * z)324*00b67f09SDavid van Moolenbroek int	zone_print (const char *mesg, const zone_t *z)
325*00b67f09SDavid van Moolenbroek {
326*00b67f09SDavid van Moolenbroek 	dki_t	*dkp;
327*00b67f09SDavid van Moolenbroek 
328*00b67f09SDavid van Moolenbroek 	if ( !z )
329*00b67f09SDavid van Moolenbroek 		return 0;
330*00b67f09SDavid van Moolenbroek 	fprintf (stderr, "%s: zone\t %s\n", mesg, z->zone);
331*00b67f09SDavid van Moolenbroek 	fprintf (stderr, "%s: dir\t %s\n", mesg, z->dir);
332*00b67f09SDavid van Moolenbroek 	fprintf (stderr, "%s: file\t %s\n", mesg, z->file);
333*00b67f09SDavid van Moolenbroek 	fprintf (stderr, "%s: sfile\t %s\n", mesg, z->sfile);
334*00b67f09SDavid van Moolenbroek 
335*00b67f09SDavid van Moolenbroek 	for ( dkp = z->keys; dkp; dkp = dkp->next )
336*00b67f09SDavid van Moolenbroek         {
337*00b67f09SDavid van Moolenbroek                 dki_prt_comment (dkp, stderr);
338*00b67f09SDavid van Moolenbroek         }
339*00b67f09SDavid van Moolenbroek 
340*00b67f09SDavid van Moolenbroek 	return 1;
341*00b67f09SDavid van Moolenbroek }
342