147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/* -*- Mode: C; tab-width: 4 -*-
247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt *
347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * Copyright (c) 2006 Apple Computer, Inc. All rights reserved.
447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt *
547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * Licensed under the Apache License, Version 2.0 (the "License");
647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * you may not use this file except in compliance with the License.
747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * You may obtain a copy of the License at
847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt *
947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt *     http://www.apache.org/licenses/LICENSE-2.0
1047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt *
1147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * Unless required by applicable law or agreed to in writing, software
1247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * distributed under the License is distributed on an "AS IS" BASIS,
1347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * See the License for the specific language governing permissions and
1547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * limitations under the License.
1647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt */
1747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
1847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%{
1947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include <stdio.h>
2047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include <stdlib.h>
2147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include <string.h>
2247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include "mDNSEmbeddedAPI.h"
2347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include "DebugServices.h"
2447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include "dnsextd.h"
2547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
2647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltvoid yyerror( const char* error );
2747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltint  yylex(void);
2847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
2947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
3047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalttypedef struct StringListElem
3147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
3247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char					*	string;
3347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	struct StringListElem	*	next;
3447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt} StringListElem;
3547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
3647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
3747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalttypedef struct OptionsInfo
3847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
3947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char	server_address[ 256 ];
4047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	int		server_port;
4147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char	source_address[ 256 ];
4247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	int		source_port;
4347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	int		private_port;
4447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	int		llq_port;
4547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt} OptionsInfo;
4647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
4747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
4847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalttypedef struct ZoneInfo
4947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
5047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char	name[ 256 ];
5147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char	certificate_name[ 256 ];
5247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char	allow_clients_file[ 256 ];
5347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char	allow_clients[ 256 ];
5447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char	key[ 256 ];
5547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt} ZoneInfo;
5647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
5747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
5847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalttypedef struct KeySpec
5947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
6047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char 				name[ 256 ];
6147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char				algorithm[ 256 ];
6247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char				secret[ 256 ];
6347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	struct KeySpec	*	next;
6447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt} KeySpec;
6547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
6647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
6747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalttypedef struct ZoneSpec
6847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
6947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char				name[ 256 ];
7047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DNSZoneSpecType		type;
7147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	StringListElem	*	allowUpdate;
7247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	StringListElem	*	allowQuery;
7347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char				key[ 256 ];
7447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	struct ZoneSpec	*	next;
7547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt} ZoneSpec;
7647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
7747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
7847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic StringListElem	*	g_stringList = NULL;
7947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic KeySpec			*	g_keys;
8047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic ZoneSpec			*	g_zones;
8147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic ZoneSpec				g_zoneSpec;
8247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic const char		*	g_filename;
8347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
8447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define YYPARSE_PARAM  context
8547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
8647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltvoid
8747e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltSetupOptions
8847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	(
8947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	OptionsInfo	*	info,
9047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	void		*	context
9147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	);
9247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
9347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%}
9447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
9547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%union
9647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
9747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	int			number;
9847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char	*	string;
9947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
10047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
10147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token	OPTIONS
10247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token	LISTEN_ON
10347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token	NAMESERVER
10447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token	PORT
10547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token	ADDRESS
10647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token	LLQ
10747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token	PUBLIC
10847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token  PRIVATE
10947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token  ALLOWUPDATE
11047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token  ALLOWQUERY
11147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token	KEY
11247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token  ALGORITHM
11347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token  SECRET
11447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token  ISSUER
11547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token  SERIAL
11647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token	ZONE
11747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token  TYPE
11847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token	ALLOW
11947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token	OBRACE
12047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token	EBRACE
12147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token	SEMICOLON
12247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token 	IN
12347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token	<string>	DOTTED_DECIMAL_ADDRESS
12447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token	<string>	WILDCARD
12547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token	<string>	DOMAINNAME
12647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token	<string>	HOSTNAME
12747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token	<string>	QUOTEDSTRING
12847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%token	<number> 	NUMBER
12947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
13047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%type	<string>	addressstatement
13147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%type	<string>	networkaddress
13247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
13347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%%
13447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
13547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltcommands:
13647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt        |
13747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt        commands command SEMICOLON
13847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt        ;
13947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
14047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
14147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltcommand:
14247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		options_set
14347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		|
14447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt        zone_set
14547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		|
14647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		key_set
14747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt        ;
14847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
14947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
15047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltoptions_set:
15147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		OPTIONS optionscontent
15247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
15347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			// SetupOptions( &g_optionsInfo, context );
15447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
15547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		;
15647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
15747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltoptionscontent:
15847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		OBRACE optionsstatements EBRACE
15947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		;
16047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
16147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltoptionsstatements:
16247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		|
16347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		optionsstatements optionsstatement SEMICOLON
16447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		;
16547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
16647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
16747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltoptionsstatement:
16847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		statements
16947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		|
17047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		LISTEN_ON addresscontent
17147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
17247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
17347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		|
17447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		LISTEN_ON PORT NUMBER addresscontent
17547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
17647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
17747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		|
17847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		NAMESERVER ADDRESS networkaddress
17947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
18047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
18147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		|
18247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		NAMESERVER ADDRESS networkaddress PORT NUMBER
18347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
18447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
18547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		|
18647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		PRIVATE PORT NUMBER
18747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
18847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			( ( DaemonInfo* ) context )->private_port = mDNSOpaque16fromIntVal( $3 );
18947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
19047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		|
19147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		LLQ PORT NUMBER
19247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
19347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			( ( DaemonInfo* ) context )->llq_port = mDNSOpaque16fromIntVal( $3 );
19447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
19547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		;
19647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
19747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltkey_set:
19847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt        KEY QUOTEDSTRING OBRACE SECRET QUOTEDSTRING SEMICOLON EBRACE
19947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt        {
20047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			KeySpec	* keySpec;
20147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
20247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			keySpec = ( KeySpec* ) malloc( sizeof( KeySpec ) );
20347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
20447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if ( !keySpec )
20547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
20647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				LogMsg("ERROR: memory allocation failure");
20747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				YYABORT;
20847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
20947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
21047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			strncpy( keySpec->name, $2, sizeof( keySpec->name ) );
21147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			strncpy( keySpec->secret, $5, sizeof( keySpec->secret ) );
21247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
21347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			keySpec->next	= g_keys;
21447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			g_keys			= keySpec;
21547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt        }
21647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt        ;
21747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
21847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltzone_set:
21947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		ZONE QUOTEDSTRING zonecontent
22047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
22147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			ZoneSpec * zoneSpec;
22247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
22347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			zoneSpec = ( ZoneSpec* ) malloc( sizeof( ZoneSpec ) );
22447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
22547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if ( !zoneSpec )
22647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
22747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				LogMsg("ERROR: memory allocation failure");
22847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				YYABORT;
22947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
23047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
23147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			strncpy( zoneSpec->name, $2, sizeof( zoneSpec->name ) );
23247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			zoneSpec->type = g_zoneSpec.type;
23347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			strcpy( zoneSpec->key, g_zoneSpec.key );
23447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			zoneSpec->allowUpdate = g_zoneSpec.allowUpdate;
23547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			zoneSpec->allowQuery = g_zoneSpec.allowQuery;
23647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
23747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			zoneSpec->next = g_zones;
23847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			g_zones = zoneSpec;
23947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
24047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		|
24147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		ZONE QUOTEDSTRING IN zonecontent
24247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt        {
24347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			ZoneSpec * zoneSpec;
24447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
24547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			zoneSpec = ( ZoneSpec* ) malloc( sizeof( ZoneSpec ) );
24647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
24747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if ( !zoneSpec )
24847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
24947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				LogMsg("ERROR: memory allocation failure");
25047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				YYABORT;
25147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
25247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
25347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			strncpy( zoneSpec->name, $2, sizeof( zoneSpec->name ) );
25447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			zoneSpec->type = g_zoneSpec.type;
25547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			strcpy( zoneSpec->key, g_zoneSpec.key );
25647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			zoneSpec->allowUpdate = g_zoneSpec.allowUpdate;
25747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			zoneSpec->allowQuery = g_zoneSpec.allowQuery;
25847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
25947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			zoneSpec->next = g_zones;
26047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			g_zones = zoneSpec;
26147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
26247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt        ;
26347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
26447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltzonecontent:
26547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		OBRACE zonestatements EBRACE
26647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
26747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltzonestatements:
26847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt        |
26947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt        zonestatements zonestatement SEMICOLON
27047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt        ;
27147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
27247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltzonestatement:
27347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		TYPE PUBLIC
27447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
27547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			g_zoneSpec.type = kDNSZonePublic;
27647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
27747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		|
27847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		TYPE PRIVATE
27947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
28047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			g_zoneSpec.type = kDNSZonePrivate;
28147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
28247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		|
28347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		ALLOWUPDATE keycontent
28447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
28547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			g_zoneSpec.allowUpdate = g_stringList;
28647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			g_stringList = NULL;
28747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
28847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		|
28947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		ALLOWQUERY keycontent
29047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
29147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			g_zoneSpec.allowQuery = g_stringList;
29247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			g_stringList = NULL;
29347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
29447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt        ;
29547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
29647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltaddresscontent:
29747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		OBRACE addressstatements EBRACE
29847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
29947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
30047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
30147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltaddressstatements:
30247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		|
30347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		addressstatements addressstatement SEMICOLON
30447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
30547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
30647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		;
30747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
30847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltaddressstatement:
30947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DOTTED_DECIMAL_ADDRESS
31047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
31147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
31247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		;
31347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
31447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
31547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltkeycontent:
31647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		OBRACE keystatements EBRACE
31747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
31847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
31947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
32047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltkeystatements:
32147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		|
32247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		keystatements keystatement SEMICOLON
32347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
32447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
32547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		;
32647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
32747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltkeystatement:
32847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		KEY DOMAINNAME
32947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
33047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			StringListElem * elem;
33147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
33247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			elem = ( StringListElem* ) malloc( sizeof( StringListElem ) );
33347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
33447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if ( !elem )
33547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
33647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				LogMsg("ERROR: memory allocation failure");
33747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				YYABORT;
33847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
33947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
34047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			elem->string = $2;
34147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
34247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			elem->next		= g_stringList;
34347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			g_stringList	= elem;
34447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
34547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		;
34647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
34747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
34847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltnetworkaddress:
34947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DOTTED_DECIMAL_ADDRESS
35047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		|
35147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		HOSTNAME
35247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		|
35347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		WILDCARD
35447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		;
35547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
35647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltblock:
35747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		OBRACE zonestatements EBRACE SEMICOLON
35847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt        ;
35947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
36047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatements:
36147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt        |
36247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		statements statement
36347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt        ;
36447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
36547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatement:
36647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		block
36747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
36847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			$<string>$ = NULL;
36947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
37047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		|
37147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		QUOTEDSTRING
37247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
37347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			$<string>$ = $1;
37447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
37547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt%%
37647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
37747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltint yywrap(void);
37847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
37947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltextern int yylineno;
38047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
38147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltvoid yyerror( const char *str )
38247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
38347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt        fprintf( stderr,"%s:%d: error: %s\n", g_filename, yylineno, str );
38447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
38547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
38647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltint yywrap()
38747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
38847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt        return 1;
38947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
39047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
39147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
39247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltint
39347e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltParseConfig
39447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	(
39547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DaemonInfo	*	d,
39647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	const char	*	file
39747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	)
39847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
39947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	extern FILE		*	yyin;
40047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DNSZone			*	zone;
40147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DomainAuthInfo	*	key;
40247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	KeySpec			*	keySpec;
40347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	ZoneSpec		*	zoneSpec;
40447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	int					err = 0;
40547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
40647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	g_filename = file;
40747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
40847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Tear down the current zone specifiers
40947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
41047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	zone = d->zones;
41147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
41247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	while ( zone )
41347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
41447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DNSZone * next = zone->next;
41547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
41647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		key = zone->updateKeys;
41747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
41847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		while ( key )
41947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
42047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			DomainAuthInfo * nextKey = key->next;
42147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
42247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			free( key );
42347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
42447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			key = nextKey;
42547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
42647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
42747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		key = zone->queryKeys;
42847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
42947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		while ( key )
43047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
43147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			DomainAuthInfo * nextKey = key->next;
43247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
43347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			free( key );
43447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
43547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			key = nextKey;
43647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
43747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
43847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		free( zone );
43947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
44047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		zone = next;
44147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
44247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
44347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	d->zones = NULL;
44447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
44547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	yyin = fopen( file, "r" );
44647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( yyin, exit, err = 0 );
44747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
44847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	err = yyparse( ( void* ) d );
44947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( !err, exit, err = 1 );
45047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
45147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	for ( zoneSpec = g_zones; zoneSpec; zoneSpec = zoneSpec->next )
45247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
45347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		StringListElem  *   elem;
45447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		mDNSu8			*	ok;
45547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
45647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		zone = ( DNSZone* ) malloc( sizeof( DNSZone ) );
45747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_action( zone, exit, err = 1 );
45847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		memset( zone, 0, sizeof( DNSZone ) );
45947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
46047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		zone->next	= d->zones;
46147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		d->zones	= zone;
46247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
46347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// Fill in the domainname
46447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
46547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		ok = MakeDomainNameFromDNSNameString( &zone->name, zoneSpec->name );
46647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_action( ok, exit, err = 1 );
46747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
46847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// Fill in the type
46947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
47047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		zone->type = zoneSpec->type;
47147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
47247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// Fill in the allow-update keys
47347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
47447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		for ( elem = zoneSpec->allowUpdate; elem; elem = elem->next )
47547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
47647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			mDNSBool found = mDNSfalse;
47747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
47847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			for ( keySpec = g_keys; keySpec; keySpec = keySpec->next )
47947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
48047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				if ( strcmp( elem->string, keySpec->name ) == 0 )
48147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					{
48247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					DomainAuthInfo	*	authInfo = malloc( sizeof( DomainAuthInfo ) );
48347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					mDNSs32				keylen;
48447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					require_action( authInfo, exit, err = 1 );
48547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					memset( authInfo, 0, sizeof( DomainAuthInfo ) );
48647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
48747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					ok = MakeDomainNameFromDNSNameString( &authInfo->keyname, keySpec->name );
48847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					if (!ok) { free(authInfo); err = 1; goto exit; }
48947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
49047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					keylen = DNSDigest_ConstructHMACKeyfromBase64( authInfo, keySpec->secret );
49147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					if (keylen < 0) { free(authInfo); err = 1; goto exit; }
49247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
49347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					authInfo->next = zone->updateKeys;
49447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					zone->updateKeys = authInfo;
49547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
49647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					found = mDNStrue;
49747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
49847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					break;
49947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					}
50047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
50147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
50247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			// Log this
50347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			require_action( found, exit, err = 1 );
50447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
50547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
50647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// Fill in the allow-query keys
50747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
50847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		for ( elem = zoneSpec->allowQuery; elem; elem = elem->next )
50947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
51047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			mDNSBool found = mDNSfalse;
51147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
51247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			for ( keySpec = g_keys; keySpec; keySpec = keySpec->next )
51347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
51447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				if ( strcmp( elem->string, keySpec->name ) == 0 )
51547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					{
51647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					DomainAuthInfo	*	authInfo = malloc( sizeof( DomainAuthInfo ) );
51747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					mDNSs32				keylen;
51847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					require_action( authInfo, exit, err = 1 );
51947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					memset( authInfo, 0, sizeof( DomainAuthInfo ) );
52047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
52147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					ok = MakeDomainNameFromDNSNameString( &authInfo->keyname, keySpec->name );
52247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					if (!ok) { free(authInfo); err = 1; goto exit; }
52347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
52447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					keylen = DNSDigest_ConstructHMACKeyfromBase64( authInfo, keySpec->secret );
52547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					if (keylen < 0) { free(authInfo); err = 1; goto exit; }
52647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
52747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					authInfo->next = zone->queryKeys;
52847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					zone->queryKeys = authInfo;
52947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
53047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					found = mDNStrue;
53147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
53247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					break;
53347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					}
53447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
53547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
53647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			// Log this
53747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			require_action( found, exit, err = 1 );
53847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
53947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
54047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
54147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltexit:
54247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
54347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	return err;
54447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
54547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
54647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
54747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltvoid
54847e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltSetupOptions
54947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	(
55047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	OptionsInfo	*	info,
55147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	void		*	context
55247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	)
55347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
55447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DaemonInfo * d = ( DaemonInfo* ) context;
55547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
55647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if ( strlen( info->source_address ) )
55747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
55847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		inet_pton( AF_INET, info->source_address, &d->addr.sin_addr );
55947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
56047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
56147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if ( info->source_port )
56247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
56347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		d->addr.sin_port = htons( ( mDNSu16 ) info->source_port );
56447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
56547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
56647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if ( strlen( info->server_address ) )
56747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
56847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		inet_pton( AF_INET, info->server_address, &d->ns_addr.sin_addr );
56947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
57047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
57147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if ( info->server_port )
57247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
57347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		d->ns_addr.sin_port = htons( ( mDNSu16 ) info->server_port );
57447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
57547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
57647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if ( info->private_port )
57747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
57847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		d->private_port = mDNSOpaque16fromIntVal( info->private_port );
57947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
58047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
58147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if ( info->llq_port )
58247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
58347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		d->llq_port = mDNSOpaque16fromIntVal( info->llq_port );
58447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
58547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
586