xref: /aosp_15_r20/external/mdnsresponder/mDNSShared/dnsextd_parser.y (revision 48a54d368dc4fa860885eef7b70b6c53499e7c25)
1*48a54d36SAndroid Build Coastguard Worker /* -*- Mode: C; tab-width: 4 -*-
2*48a54d36SAndroid Build Coastguard Worker  *
3*48a54d36SAndroid Build Coastguard Worker  * Copyright (c) 2006 Apple Computer, Inc. All rights reserved.
4*48a54d36SAndroid Build Coastguard Worker  *
5*48a54d36SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*48a54d36SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*48a54d36SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
8*48a54d36SAndroid Build Coastguard Worker  *
9*48a54d36SAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
10*48a54d36SAndroid Build Coastguard Worker  *
11*48a54d36SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*48a54d36SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*48a54d36SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*48a54d36SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*48a54d36SAndroid Build Coastguard Worker  * limitations under the License.
16*48a54d36SAndroid Build Coastguard Worker  */
17*48a54d36SAndroid Build Coastguard Worker 
18*48a54d36SAndroid Build Coastguard Worker %{
19*48a54d36SAndroid Build Coastguard Worker #include <stdio.h>
20*48a54d36SAndroid Build Coastguard Worker #include <stdlib.h>
21*48a54d36SAndroid Build Coastguard Worker #include <string.h>
22*48a54d36SAndroid Build Coastguard Worker #include "mDNSEmbeddedAPI.h"
23*48a54d36SAndroid Build Coastguard Worker #include "DebugServices.h"
24*48a54d36SAndroid Build Coastguard Worker #include "dnsextd.h"
25*48a54d36SAndroid Build Coastguard Worker 
26*48a54d36SAndroid Build Coastguard Worker void yyerror( const char* error );
27*48a54d36SAndroid Build Coastguard Worker int  yylex(void);
28*48a54d36SAndroid Build Coastguard Worker 
29*48a54d36SAndroid Build Coastguard Worker 
30*48a54d36SAndroid Build Coastguard Worker typedef struct StringListElem
31*48a54d36SAndroid Build Coastguard Worker {
32*48a54d36SAndroid Build Coastguard Worker 	char					*	string;
33*48a54d36SAndroid Build Coastguard Worker 	struct StringListElem	*	next;
34*48a54d36SAndroid Build Coastguard Worker } StringListElem;
35*48a54d36SAndroid Build Coastguard Worker 
36*48a54d36SAndroid Build Coastguard Worker 
37*48a54d36SAndroid Build Coastguard Worker typedef struct OptionsInfo
38*48a54d36SAndroid Build Coastguard Worker {
39*48a54d36SAndroid Build Coastguard Worker 	char	server_address[ 256 ];
40*48a54d36SAndroid Build Coastguard Worker 	int		server_port;
41*48a54d36SAndroid Build Coastguard Worker 	char	source_address[ 256 ];
42*48a54d36SAndroid Build Coastguard Worker 	int		source_port;
43*48a54d36SAndroid Build Coastguard Worker 	int		private_port;
44*48a54d36SAndroid Build Coastguard Worker 	int		llq_port;
45*48a54d36SAndroid Build Coastguard Worker } OptionsInfo;
46*48a54d36SAndroid Build Coastguard Worker 
47*48a54d36SAndroid Build Coastguard Worker 
48*48a54d36SAndroid Build Coastguard Worker typedef struct ZoneInfo
49*48a54d36SAndroid Build Coastguard Worker {
50*48a54d36SAndroid Build Coastguard Worker 	char	name[ 256 ];
51*48a54d36SAndroid Build Coastguard Worker 	char	certificate_name[ 256 ];
52*48a54d36SAndroid Build Coastguard Worker 	char	allow_clients_file[ 256 ];
53*48a54d36SAndroid Build Coastguard Worker 	char	allow_clients[ 256 ];
54*48a54d36SAndroid Build Coastguard Worker 	char	key[ 256 ];
55*48a54d36SAndroid Build Coastguard Worker } ZoneInfo;
56*48a54d36SAndroid Build Coastguard Worker 
57*48a54d36SAndroid Build Coastguard Worker 
58*48a54d36SAndroid Build Coastguard Worker typedef struct KeySpec
59*48a54d36SAndroid Build Coastguard Worker {
60*48a54d36SAndroid Build Coastguard Worker 	char 				name[ 256 ];
61*48a54d36SAndroid Build Coastguard Worker 	char				algorithm[ 256 ];
62*48a54d36SAndroid Build Coastguard Worker 	char				secret[ 256 ];
63*48a54d36SAndroid Build Coastguard Worker 	struct KeySpec	*	next;
64*48a54d36SAndroid Build Coastguard Worker } KeySpec;
65*48a54d36SAndroid Build Coastguard Worker 
66*48a54d36SAndroid Build Coastguard Worker 
67*48a54d36SAndroid Build Coastguard Worker typedef struct ZoneSpec
68*48a54d36SAndroid Build Coastguard Worker {
69*48a54d36SAndroid Build Coastguard Worker 	char				name[ 256 ];
70*48a54d36SAndroid Build Coastguard Worker 	DNSZoneSpecType		type;
71*48a54d36SAndroid Build Coastguard Worker 	StringListElem	*	allowUpdate;
72*48a54d36SAndroid Build Coastguard Worker 	StringListElem	*	allowQuery;
73*48a54d36SAndroid Build Coastguard Worker 	char				key[ 256 ];
74*48a54d36SAndroid Build Coastguard Worker 	struct ZoneSpec	*	next;
75*48a54d36SAndroid Build Coastguard Worker } ZoneSpec;
76*48a54d36SAndroid Build Coastguard Worker 
77*48a54d36SAndroid Build Coastguard Worker 
78*48a54d36SAndroid Build Coastguard Worker static StringListElem	*	g_stringList = NULL;
79*48a54d36SAndroid Build Coastguard Worker static KeySpec			*	g_keys;
80*48a54d36SAndroid Build Coastguard Worker static ZoneSpec			*	g_zones;
81*48a54d36SAndroid Build Coastguard Worker static ZoneSpec				g_zoneSpec;
82*48a54d36SAndroid Build Coastguard Worker static const char		*	g_filename;
83*48a54d36SAndroid Build Coastguard Worker 
84*48a54d36SAndroid Build Coastguard Worker #define YYPARSE_PARAM  context
85*48a54d36SAndroid Build Coastguard Worker 
86*48a54d36SAndroid Build Coastguard Worker void
87*48a54d36SAndroid Build Coastguard Worker SetupOptions
88*48a54d36SAndroid Build Coastguard Worker 	(
89*48a54d36SAndroid Build Coastguard Worker 	OptionsInfo	*	info,
90*48a54d36SAndroid Build Coastguard Worker 	void		*	context
91*48a54d36SAndroid Build Coastguard Worker 	);
92*48a54d36SAndroid Build Coastguard Worker 
93*48a54d36SAndroid Build Coastguard Worker %}
94*48a54d36SAndroid Build Coastguard Worker 
95*48a54d36SAndroid Build Coastguard Worker %union
96*48a54d36SAndroid Build Coastguard Worker {
97*48a54d36SAndroid Build Coastguard Worker 	int			number;
98*48a54d36SAndroid Build Coastguard Worker 	char	*	string;
99*48a54d36SAndroid Build Coastguard Worker }
100*48a54d36SAndroid Build Coastguard Worker 
101*48a54d36SAndroid Build Coastguard Worker %token	OPTIONS
102*48a54d36SAndroid Build Coastguard Worker %token	LISTEN_ON
103*48a54d36SAndroid Build Coastguard Worker %token	NAMESERVER
104*48a54d36SAndroid Build Coastguard Worker %token	PORT
105*48a54d36SAndroid Build Coastguard Worker %token	ADDRESS
106*48a54d36SAndroid Build Coastguard Worker %token	LLQ
107*48a54d36SAndroid Build Coastguard Worker %token	PUBLIC
108*48a54d36SAndroid Build Coastguard Worker %token  PRIVATE
109*48a54d36SAndroid Build Coastguard Worker %token  ALLOWUPDATE
110*48a54d36SAndroid Build Coastguard Worker %token  ALLOWQUERY
111*48a54d36SAndroid Build Coastguard Worker %token	KEY
112*48a54d36SAndroid Build Coastguard Worker %token  ALGORITHM
113*48a54d36SAndroid Build Coastguard Worker %token  SECRET
114*48a54d36SAndroid Build Coastguard Worker %token  ISSUER
115*48a54d36SAndroid Build Coastguard Worker %token  SERIAL
116*48a54d36SAndroid Build Coastguard Worker %token	ZONE
117*48a54d36SAndroid Build Coastguard Worker %token  TYPE
118*48a54d36SAndroid Build Coastguard Worker %token	ALLOW
119*48a54d36SAndroid Build Coastguard Worker %token	OBRACE
120*48a54d36SAndroid Build Coastguard Worker %token	EBRACE
121*48a54d36SAndroid Build Coastguard Worker %token	SEMICOLON
122*48a54d36SAndroid Build Coastguard Worker %token 	IN
123*48a54d36SAndroid Build Coastguard Worker %token	<string>	DOTTED_DECIMAL_ADDRESS
124*48a54d36SAndroid Build Coastguard Worker %token	<string>	WILDCARD
125*48a54d36SAndroid Build Coastguard Worker %token	<string>	DOMAINNAME
126*48a54d36SAndroid Build Coastguard Worker %token	<string>	HOSTNAME
127*48a54d36SAndroid Build Coastguard Worker %token	<string>	QUOTEDSTRING
128*48a54d36SAndroid Build Coastguard Worker %token	<number> 	NUMBER
129*48a54d36SAndroid Build Coastguard Worker 
130*48a54d36SAndroid Build Coastguard Worker %type	<string>	addressstatement
131*48a54d36SAndroid Build Coastguard Worker %type	<string>	networkaddress
132*48a54d36SAndroid Build Coastguard Worker 
133*48a54d36SAndroid Build Coastguard Worker %%
134*48a54d36SAndroid Build Coastguard Worker 
135*48a54d36SAndroid Build Coastguard Worker commands:
136*48a54d36SAndroid Build Coastguard Worker         |
137*48a54d36SAndroid Build Coastguard Worker         commands command SEMICOLON
138*48a54d36SAndroid Build Coastguard Worker         ;
139*48a54d36SAndroid Build Coastguard Worker 
140*48a54d36SAndroid Build Coastguard Worker 
141*48a54d36SAndroid Build Coastguard Worker command:
142*48a54d36SAndroid Build Coastguard Worker 		options_set
143*48a54d36SAndroid Build Coastguard Worker 		|
144*48a54d36SAndroid Build Coastguard Worker         zone_set
145*48a54d36SAndroid Build Coastguard Worker 		|
146*48a54d36SAndroid Build Coastguard Worker 		key_set
147*48a54d36SAndroid Build Coastguard Worker         ;
148*48a54d36SAndroid Build Coastguard Worker 
149*48a54d36SAndroid Build Coastguard Worker 
150*48a54d36SAndroid Build Coastguard Worker options_set:
151*48a54d36SAndroid Build Coastguard Worker 		OPTIONS optionscontent
152*48a54d36SAndroid Build Coastguard Worker 		{
153*48a54d36SAndroid Build Coastguard Worker 			// SetupOptions( &g_optionsInfo, context );
154*48a54d36SAndroid Build Coastguard Worker 		}
155*48a54d36SAndroid Build Coastguard Worker 		;
156*48a54d36SAndroid Build Coastguard Worker 
157*48a54d36SAndroid Build Coastguard Worker optionscontent:
158*48a54d36SAndroid Build Coastguard Worker 		OBRACE optionsstatements EBRACE
159*48a54d36SAndroid Build Coastguard Worker 		;
160*48a54d36SAndroid Build Coastguard Worker 
161*48a54d36SAndroid Build Coastguard Worker optionsstatements:
162*48a54d36SAndroid Build Coastguard Worker 		|
163*48a54d36SAndroid Build Coastguard Worker 		optionsstatements optionsstatement SEMICOLON
164*48a54d36SAndroid Build Coastguard Worker 		;
165*48a54d36SAndroid Build Coastguard Worker 
166*48a54d36SAndroid Build Coastguard Worker 
167*48a54d36SAndroid Build Coastguard Worker optionsstatement:
168*48a54d36SAndroid Build Coastguard Worker 		statements
169*48a54d36SAndroid Build Coastguard Worker 		|
170*48a54d36SAndroid Build Coastguard Worker 		LISTEN_ON addresscontent
171*48a54d36SAndroid Build Coastguard Worker 		{
172*48a54d36SAndroid Build Coastguard Worker 		}
173*48a54d36SAndroid Build Coastguard Worker 		|
174*48a54d36SAndroid Build Coastguard Worker 		LISTEN_ON PORT NUMBER addresscontent
175*48a54d36SAndroid Build Coastguard Worker 		{
176*48a54d36SAndroid Build Coastguard Worker 		}
177*48a54d36SAndroid Build Coastguard Worker 		|
178*48a54d36SAndroid Build Coastguard Worker 		NAMESERVER ADDRESS networkaddress
179*48a54d36SAndroid Build Coastguard Worker 		{
180*48a54d36SAndroid Build Coastguard Worker 		}
181*48a54d36SAndroid Build Coastguard Worker 		|
182*48a54d36SAndroid Build Coastguard Worker 		NAMESERVER ADDRESS networkaddress PORT NUMBER
183*48a54d36SAndroid Build Coastguard Worker 		{
184*48a54d36SAndroid Build Coastguard Worker 		}
185*48a54d36SAndroid Build Coastguard Worker 		|
186*48a54d36SAndroid Build Coastguard Worker 		PRIVATE PORT NUMBER
187*48a54d36SAndroid Build Coastguard Worker 		{
188*48a54d36SAndroid Build Coastguard Worker 			( ( DaemonInfo* ) context )->private_port = mDNSOpaque16fromIntVal( $3 );
189*48a54d36SAndroid Build Coastguard Worker 		}
190*48a54d36SAndroid Build Coastguard Worker 		|
191*48a54d36SAndroid Build Coastguard Worker 		LLQ PORT NUMBER
192*48a54d36SAndroid Build Coastguard Worker 		{
193*48a54d36SAndroid Build Coastguard Worker 			( ( DaemonInfo* ) context )->llq_port = mDNSOpaque16fromIntVal( $3 );
194*48a54d36SAndroid Build Coastguard Worker 		}
195*48a54d36SAndroid Build Coastguard Worker 		;
196*48a54d36SAndroid Build Coastguard Worker 
197*48a54d36SAndroid Build Coastguard Worker key_set:
198*48a54d36SAndroid Build Coastguard Worker         KEY QUOTEDSTRING OBRACE SECRET QUOTEDSTRING SEMICOLON EBRACE
199*48a54d36SAndroid Build Coastguard Worker         {
200*48a54d36SAndroid Build Coastguard Worker 			KeySpec	* keySpec;
201*48a54d36SAndroid Build Coastguard Worker 
202*48a54d36SAndroid Build Coastguard Worker 			keySpec = ( KeySpec* ) malloc( sizeof( KeySpec ) );
203*48a54d36SAndroid Build Coastguard Worker 
204*48a54d36SAndroid Build Coastguard Worker 			if ( !keySpec )
205*48a54d36SAndroid Build Coastguard Worker 				{
206*48a54d36SAndroid Build Coastguard Worker 				LogMsg("ERROR: memory allocation failure");
207*48a54d36SAndroid Build Coastguard Worker 				YYABORT;
208*48a54d36SAndroid Build Coastguard Worker 				}
209*48a54d36SAndroid Build Coastguard Worker 
210*48a54d36SAndroid Build Coastguard Worker 			strncpy( keySpec->name, $2, sizeof( keySpec->name ) );
211*48a54d36SAndroid Build Coastguard Worker 			strncpy( keySpec->secret, $5, sizeof( keySpec->secret ) );
212*48a54d36SAndroid Build Coastguard Worker 
213*48a54d36SAndroid Build Coastguard Worker 			keySpec->next	= g_keys;
214*48a54d36SAndroid Build Coastguard Worker 			g_keys			= keySpec;
215*48a54d36SAndroid Build Coastguard Worker         }
216*48a54d36SAndroid Build Coastguard Worker         ;
217*48a54d36SAndroid Build Coastguard Worker 
218*48a54d36SAndroid Build Coastguard Worker zone_set:
219*48a54d36SAndroid Build Coastguard Worker 		ZONE QUOTEDSTRING zonecontent
220*48a54d36SAndroid Build Coastguard Worker 		{
221*48a54d36SAndroid Build Coastguard Worker 			ZoneSpec * zoneSpec;
222*48a54d36SAndroid Build Coastguard Worker 
223*48a54d36SAndroid Build Coastguard Worker 			zoneSpec = ( ZoneSpec* ) malloc( sizeof( ZoneSpec ) );
224*48a54d36SAndroid Build Coastguard Worker 
225*48a54d36SAndroid Build Coastguard Worker 			if ( !zoneSpec )
226*48a54d36SAndroid Build Coastguard Worker 				{
227*48a54d36SAndroid Build Coastguard Worker 				LogMsg("ERROR: memory allocation failure");
228*48a54d36SAndroid Build Coastguard Worker 				YYABORT;
229*48a54d36SAndroid Build Coastguard Worker 				}
230*48a54d36SAndroid Build Coastguard Worker 
231*48a54d36SAndroid Build Coastguard Worker 			strncpy( zoneSpec->name, $2, sizeof( zoneSpec->name ) );
232*48a54d36SAndroid Build Coastguard Worker 			zoneSpec->type = g_zoneSpec.type;
233*48a54d36SAndroid Build Coastguard Worker 			strcpy( zoneSpec->key, g_zoneSpec.key );
234*48a54d36SAndroid Build Coastguard Worker 			zoneSpec->allowUpdate = g_zoneSpec.allowUpdate;
235*48a54d36SAndroid Build Coastguard Worker 			zoneSpec->allowQuery = g_zoneSpec.allowQuery;
236*48a54d36SAndroid Build Coastguard Worker 
237*48a54d36SAndroid Build Coastguard Worker 			zoneSpec->next = g_zones;
238*48a54d36SAndroid Build Coastguard Worker 			g_zones = zoneSpec;
239*48a54d36SAndroid Build Coastguard Worker 		}
240*48a54d36SAndroid Build Coastguard Worker 		|
241*48a54d36SAndroid Build Coastguard Worker 		ZONE QUOTEDSTRING IN zonecontent
242*48a54d36SAndroid Build Coastguard Worker         {
243*48a54d36SAndroid Build Coastguard Worker 			ZoneSpec * zoneSpec;
244*48a54d36SAndroid Build Coastguard Worker 
245*48a54d36SAndroid Build Coastguard Worker 			zoneSpec = ( ZoneSpec* ) malloc( sizeof( ZoneSpec ) );
246*48a54d36SAndroid Build Coastguard Worker 
247*48a54d36SAndroid Build Coastguard Worker 			if ( !zoneSpec )
248*48a54d36SAndroid Build Coastguard Worker 				{
249*48a54d36SAndroid Build Coastguard Worker 				LogMsg("ERROR: memory allocation failure");
250*48a54d36SAndroid Build Coastguard Worker 				YYABORT;
251*48a54d36SAndroid Build Coastguard Worker 				}
252*48a54d36SAndroid Build Coastguard Worker 
253*48a54d36SAndroid Build Coastguard Worker 			strncpy( zoneSpec->name, $2, sizeof( zoneSpec->name ) );
254*48a54d36SAndroid Build Coastguard Worker 			zoneSpec->type = g_zoneSpec.type;
255*48a54d36SAndroid Build Coastguard Worker 			strcpy( zoneSpec->key, g_zoneSpec.key );
256*48a54d36SAndroid Build Coastguard Worker 			zoneSpec->allowUpdate = g_zoneSpec.allowUpdate;
257*48a54d36SAndroid Build Coastguard Worker 			zoneSpec->allowQuery = g_zoneSpec.allowQuery;
258*48a54d36SAndroid Build Coastguard Worker 
259*48a54d36SAndroid Build Coastguard Worker 			zoneSpec->next = g_zones;
260*48a54d36SAndroid Build Coastguard Worker 			g_zones = zoneSpec;
261*48a54d36SAndroid Build Coastguard Worker 		}
262*48a54d36SAndroid Build Coastguard Worker         ;
263*48a54d36SAndroid Build Coastguard Worker 
264*48a54d36SAndroid Build Coastguard Worker zonecontent:
265*48a54d36SAndroid Build Coastguard Worker 		OBRACE zonestatements EBRACE
266*48a54d36SAndroid Build Coastguard Worker 
267*48a54d36SAndroid Build Coastguard Worker zonestatements:
268*48a54d36SAndroid Build Coastguard Worker         |
269*48a54d36SAndroid Build Coastguard Worker         zonestatements zonestatement SEMICOLON
270*48a54d36SAndroid Build Coastguard Worker         ;
271*48a54d36SAndroid Build Coastguard Worker 
272*48a54d36SAndroid Build Coastguard Worker zonestatement:
273*48a54d36SAndroid Build Coastguard Worker 		TYPE PUBLIC
274*48a54d36SAndroid Build Coastguard Worker 		{
275*48a54d36SAndroid Build Coastguard Worker 			g_zoneSpec.type = kDNSZonePublic;
276*48a54d36SAndroid Build Coastguard Worker 		}
277*48a54d36SAndroid Build Coastguard Worker 		|
278*48a54d36SAndroid Build Coastguard Worker 		TYPE PRIVATE
279*48a54d36SAndroid Build Coastguard Worker 		{
280*48a54d36SAndroid Build Coastguard Worker 			g_zoneSpec.type = kDNSZonePrivate;
281*48a54d36SAndroid Build Coastguard Worker 		}
282*48a54d36SAndroid Build Coastguard Worker 		|
283*48a54d36SAndroid Build Coastguard Worker 		ALLOWUPDATE keycontent
284*48a54d36SAndroid Build Coastguard Worker 		{
285*48a54d36SAndroid Build Coastguard Worker 			g_zoneSpec.allowUpdate = g_stringList;
286*48a54d36SAndroid Build Coastguard Worker 			g_stringList = NULL;
287*48a54d36SAndroid Build Coastguard Worker 		}
288*48a54d36SAndroid Build Coastguard Worker 		|
289*48a54d36SAndroid Build Coastguard Worker 		ALLOWQUERY keycontent
290*48a54d36SAndroid Build Coastguard Worker 		{
291*48a54d36SAndroid Build Coastguard Worker 			g_zoneSpec.allowQuery = g_stringList;
292*48a54d36SAndroid Build Coastguard Worker 			g_stringList = NULL;
293*48a54d36SAndroid Build Coastguard Worker 		}
294*48a54d36SAndroid Build Coastguard Worker         ;
295*48a54d36SAndroid Build Coastguard Worker 
296*48a54d36SAndroid Build Coastguard Worker addresscontent:
297*48a54d36SAndroid Build Coastguard Worker 		OBRACE addressstatements EBRACE
298*48a54d36SAndroid Build Coastguard Worker 		{
299*48a54d36SAndroid Build Coastguard Worker 		}
300*48a54d36SAndroid Build Coastguard Worker 
301*48a54d36SAndroid Build Coastguard Worker addressstatements:
302*48a54d36SAndroid Build Coastguard Worker 		|
303*48a54d36SAndroid Build Coastguard Worker 		addressstatements addressstatement SEMICOLON
304*48a54d36SAndroid Build Coastguard Worker 		{
305*48a54d36SAndroid Build Coastguard Worker 		}
306*48a54d36SAndroid Build Coastguard Worker 		;
307*48a54d36SAndroid Build Coastguard Worker 
308*48a54d36SAndroid Build Coastguard Worker addressstatement:
309*48a54d36SAndroid Build Coastguard Worker 		DOTTED_DECIMAL_ADDRESS
310*48a54d36SAndroid Build Coastguard Worker 		{
311*48a54d36SAndroid Build Coastguard Worker 		}
312*48a54d36SAndroid Build Coastguard Worker 		;
313*48a54d36SAndroid Build Coastguard Worker 
314*48a54d36SAndroid Build Coastguard Worker 
315*48a54d36SAndroid Build Coastguard Worker keycontent:
316*48a54d36SAndroid Build Coastguard Worker 		OBRACE keystatements EBRACE
317*48a54d36SAndroid Build Coastguard Worker 		{
318*48a54d36SAndroid Build Coastguard Worker 		}
319*48a54d36SAndroid Build Coastguard Worker 
320*48a54d36SAndroid Build Coastguard Worker keystatements:
321*48a54d36SAndroid Build Coastguard Worker 		|
322*48a54d36SAndroid Build Coastguard Worker 		keystatements keystatement SEMICOLON
323*48a54d36SAndroid Build Coastguard Worker 		{
324*48a54d36SAndroid Build Coastguard Worker 		}
325*48a54d36SAndroid Build Coastguard Worker 		;
326*48a54d36SAndroid Build Coastguard Worker 
327*48a54d36SAndroid Build Coastguard Worker keystatement:
328*48a54d36SAndroid Build Coastguard Worker 		KEY DOMAINNAME
329*48a54d36SAndroid Build Coastguard Worker 		{
330*48a54d36SAndroid Build Coastguard Worker 			StringListElem * elem;
331*48a54d36SAndroid Build Coastguard Worker 
332*48a54d36SAndroid Build Coastguard Worker 			elem = ( StringListElem* ) malloc( sizeof( StringListElem ) );
333*48a54d36SAndroid Build Coastguard Worker 
334*48a54d36SAndroid Build Coastguard Worker 			if ( !elem )
335*48a54d36SAndroid Build Coastguard Worker 				{
336*48a54d36SAndroid Build Coastguard Worker 				LogMsg("ERROR: memory allocation failure");
337*48a54d36SAndroid Build Coastguard Worker 				YYABORT;
338*48a54d36SAndroid Build Coastguard Worker 				}
339*48a54d36SAndroid Build Coastguard Worker 
340*48a54d36SAndroid Build Coastguard Worker 			elem->string = $2;
341*48a54d36SAndroid Build Coastguard Worker 
342*48a54d36SAndroid Build Coastguard Worker 			elem->next		= g_stringList;
343*48a54d36SAndroid Build Coastguard Worker 			g_stringList	= elem;
344*48a54d36SAndroid Build Coastguard Worker 		}
345*48a54d36SAndroid Build Coastguard Worker 		;
346*48a54d36SAndroid Build Coastguard Worker 
347*48a54d36SAndroid Build Coastguard Worker 
348*48a54d36SAndroid Build Coastguard Worker networkaddress:
349*48a54d36SAndroid Build Coastguard Worker 		DOTTED_DECIMAL_ADDRESS
350*48a54d36SAndroid Build Coastguard Worker 		|
351*48a54d36SAndroid Build Coastguard Worker 		HOSTNAME
352*48a54d36SAndroid Build Coastguard Worker 		|
353*48a54d36SAndroid Build Coastguard Worker 		WILDCARD
354*48a54d36SAndroid Build Coastguard Worker 		;
355*48a54d36SAndroid Build Coastguard Worker 
356*48a54d36SAndroid Build Coastguard Worker block:
357*48a54d36SAndroid Build Coastguard Worker 		OBRACE zonestatements EBRACE SEMICOLON
358*48a54d36SAndroid Build Coastguard Worker         ;
359*48a54d36SAndroid Build Coastguard Worker 
360*48a54d36SAndroid Build Coastguard Worker statements:
361*48a54d36SAndroid Build Coastguard Worker         |
362*48a54d36SAndroid Build Coastguard Worker 		statements statement
363*48a54d36SAndroid Build Coastguard Worker         ;
364*48a54d36SAndroid Build Coastguard Worker 
365*48a54d36SAndroid Build Coastguard Worker statement:
366*48a54d36SAndroid Build Coastguard Worker 		block
367*48a54d36SAndroid Build Coastguard Worker 		{
368*48a54d36SAndroid Build Coastguard Worker 			$<string>$ = NULL;
369*48a54d36SAndroid Build Coastguard Worker 		}
370*48a54d36SAndroid Build Coastguard Worker 		|
371*48a54d36SAndroid Build Coastguard Worker 		QUOTEDSTRING
372*48a54d36SAndroid Build Coastguard Worker 		{
373*48a54d36SAndroid Build Coastguard Worker 			$<string>$ = $1;
374*48a54d36SAndroid Build Coastguard Worker 		}
375*48a54d36SAndroid Build Coastguard Worker %%
376*48a54d36SAndroid Build Coastguard Worker 
377*48a54d36SAndroid Build Coastguard Worker int yywrap(void);
378*48a54d36SAndroid Build Coastguard Worker 
379*48a54d36SAndroid Build Coastguard Worker extern int yylineno;
380*48a54d36SAndroid Build Coastguard Worker 
yyerror(const char * str)381*48a54d36SAndroid Build Coastguard Worker void yyerror( const char *str )
382*48a54d36SAndroid Build Coastguard Worker {
383*48a54d36SAndroid Build Coastguard Worker         fprintf( stderr,"%s:%d: error: %s\n", g_filename, yylineno, str );
384*48a54d36SAndroid Build Coastguard Worker }
385*48a54d36SAndroid Build Coastguard Worker 
yywrap()386*48a54d36SAndroid Build Coastguard Worker int yywrap()
387*48a54d36SAndroid Build Coastguard Worker {
388*48a54d36SAndroid Build Coastguard Worker         return 1;
389*48a54d36SAndroid Build Coastguard Worker }
390*48a54d36SAndroid Build Coastguard Worker 
391*48a54d36SAndroid Build Coastguard Worker 
392*48a54d36SAndroid Build Coastguard Worker int
ParseConfig(DaemonInfo * d,const char * file)393*48a54d36SAndroid Build Coastguard Worker ParseConfig
394*48a54d36SAndroid Build Coastguard Worker 	(
395*48a54d36SAndroid Build Coastguard Worker 	DaemonInfo	*	d,
396*48a54d36SAndroid Build Coastguard Worker 	const char	*	file
397*48a54d36SAndroid Build Coastguard Worker 	)
398*48a54d36SAndroid Build Coastguard Worker 	{
399*48a54d36SAndroid Build Coastguard Worker 	extern FILE		*	yyin;
400*48a54d36SAndroid Build Coastguard Worker 	DNSZone			*	zone;
401*48a54d36SAndroid Build Coastguard Worker 	DomainAuthInfo	*	key;
402*48a54d36SAndroid Build Coastguard Worker 	KeySpec			*	keySpec;
403*48a54d36SAndroid Build Coastguard Worker 	ZoneSpec		*	zoneSpec;
404*48a54d36SAndroid Build Coastguard Worker 	int					err = 0;
405*48a54d36SAndroid Build Coastguard Worker 
406*48a54d36SAndroid Build Coastguard Worker 	g_filename = file;
407*48a54d36SAndroid Build Coastguard Worker 
408*48a54d36SAndroid Build Coastguard Worker 	// Tear down the current zone specifiers
409*48a54d36SAndroid Build Coastguard Worker 
410*48a54d36SAndroid Build Coastguard Worker 	zone = d->zones;
411*48a54d36SAndroid Build Coastguard Worker 
412*48a54d36SAndroid Build Coastguard Worker 	while ( zone )
413*48a54d36SAndroid Build Coastguard Worker 		{
414*48a54d36SAndroid Build Coastguard Worker 		DNSZone * next = zone->next;
415*48a54d36SAndroid Build Coastguard Worker 
416*48a54d36SAndroid Build Coastguard Worker 		key = zone->updateKeys;
417*48a54d36SAndroid Build Coastguard Worker 
418*48a54d36SAndroid Build Coastguard Worker 		while ( key )
419*48a54d36SAndroid Build Coastguard Worker 			{
420*48a54d36SAndroid Build Coastguard Worker 			DomainAuthInfo * nextKey = key->next;
421*48a54d36SAndroid Build Coastguard Worker 
422*48a54d36SAndroid Build Coastguard Worker 			free( key );
423*48a54d36SAndroid Build Coastguard Worker 
424*48a54d36SAndroid Build Coastguard Worker 			key = nextKey;
425*48a54d36SAndroid Build Coastguard Worker 			}
426*48a54d36SAndroid Build Coastguard Worker 
427*48a54d36SAndroid Build Coastguard Worker 		key = zone->queryKeys;
428*48a54d36SAndroid Build Coastguard Worker 
429*48a54d36SAndroid Build Coastguard Worker 		while ( key )
430*48a54d36SAndroid Build Coastguard Worker 			{
431*48a54d36SAndroid Build Coastguard Worker 			DomainAuthInfo * nextKey = key->next;
432*48a54d36SAndroid Build Coastguard Worker 
433*48a54d36SAndroid Build Coastguard Worker 			free( key );
434*48a54d36SAndroid Build Coastguard Worker 
435*48a54d36SAndroid Build Coastguard Worker 			key = nextKey;
436*48a54d36SAndroid Build Coastguard Worker 			}
437*48a54d36SAndroid Build Coastguard Worker 
438*48a54d36SAndroid Build Coastguard Worker 		free( zone );
439*48a54d36SAndroid Build Coastguard Worker 
440*48a54d36SAndroid Build Coastguard Worker 		zone = next;
441*48a54d36SAndroid Build Coastguard Worker 		}
442*48a54d36SAndroid Build Coastguard Worker 
443*48a54d36SAndroid Build Coastguard Worker 	d->zones = NULL;
444*48a54d36SAndroid Build Coastguard Worker 
445*48a54d36SAndroid Build Coastguard Worker 	yyin = fopen( file, "r" );
446*48a54d36SAndroid Build Coastguard Worker 	require_action( yyin, exit, err = 0 );
447*48a54d36SAndroid Build Coastguard Worker 
448*48a54d36SAndroid Build Coastguard Worker 	err = yyparse( ( void* ) d );
449*48a54d36SAndroid Build Coastguard Worker 	require_action( !err, exit, err = 1 );
450*48a54d36SAndroid Build Coastguard Worker 
451*48a54d36SAndroid Build Coastguard Worker 	for ( zoneSpec = g_zones; zoneSpec; zoneSpec = zoneSpec->next )
452*48a54d36SAndroid Build Coastguard Worker 		{
453*48a54d36SAndroid Build Coastguard Worker 		StringListElem  *   elem;
454*48a54d36SAndroid Build Coastguard Worker 		mDNSu8			*	ok;
455*48a54d36SAndroid Build Coastguard Worker 
456*48a54d36SAndroid Build Coastguard Worker 		zone = ( DNSZone* ) malloc( sizeof( DNSZone ) );
457*48a54d36SAndroid Build Coastguard Worker 		require_action( zone, exit, err = 1 );
458*48a54d36SAndroid Build Coastguard Worker 		memset( zone, 0, sizeof( DNSZone ) );
459*48a54d36SAndroid Build Coastguard Worker 
460*48a54d36SAndroid Build Coastguard Worker 		zone->next	= d->zones;
461*48a54d36SAndroid Build Coastguard Worker 		d->zones	= zone;
462*48a54d36SAndroid Build Coastguard Worker 
463*48a54d36SAndroid Build Coastguard Worker 		// Fill in the domainname
464*48a54d36SAndroid Build Coastguard Worker 
465*48a54d36SAndroid Build Coastguard Worker 		ok = MakeDomainNameFromDNSNameString( &zone->name, zoneSpec->name );
466*48a54d36SAndroid Build Coastguard Worker 		require_action( ok, exit, err = 1 );
467*48a54d36SAndroid Build Coastguard Worker 
468*48a54d36SAndroid Build Coastguard Worker 		// Fill in the type
469*48a54d36SAndroid Build Coastguard Worker 
470*48a54d36SAndroid Build Coastguard Worker 		zone->type = zoneSpec->type;
471*48a54d36SAndroid Build Coastguard Worker 
472*48a54d36SAndroid Build Coastguard Worker 		// Fill in the allow-update keys
473*48a54d36SAndroid Build Coastguard Worker 
474*48a54d36SAndroid Build Coastguard Worker 		for ( elem = zoneSpec->allowUpdate; elem; elem = elem->next )
475*48a54d36SAndroid Build Coastguard Worker 			{
476*48a54d36SAndroid Build Coastguard Worker 			mDNSBool found = mDNSfalse;
477*48a54d36SAndroid Build Coastguard Worker 
478*48a54d36SAndroid Build Coastguard Worker 			for ( keySpec = g_keys; keySpec; keySpec = keySpec->next )
479*48a54d36SAndroid Build Coastguard Worker 				{
480*48a54d36SAndroid Build Coastguard Worker 				if ( strcmp( elem->string, keySpec->name ) == 0 )
481*48a54d36SAndroid Build Coastguard Worker 					{
482*48a54d36SAndroid Build Coastguard Worker 					DomainAuthInfo	*	authInfo = malloc( sizeof( DomainAuthInfo ) );
483*48a54d36SAndroid Build Coastguard Worker 					mDNSs32				keylen;
484*48a54d36SAndroid Build Coastguard Worker 					require_action( authInfo, exit, err = 1 );
485*48a54d36SAndroid Build Coastguard Worker 					memset( authInfo, 0, sizeof( DomainAuthInfo ) );
486*48a54d36SAndroid Build Coastguard Worker 
487*48a54d36SAndroid Build Coastguard Worker 					ok = MakeDomainNameFromDNSNameString( &authInfo->keyname, keySpec->name );
488*48a54d36SAndroid Build Coastguard Worker 					if (!ok) { free(authInfo); err = 1; goto exit; }
489*48a54d36SAndroid Build Coastguard Worker 
490*48a54d36SAndroid Build Coastguard Worker 					keylen = DNSDigest_ConstructHMACKeyfromBase64( authInfo, keySpec->secret );
491*48a54d36SAndroid Build Coastguard Worker 					if (keylen < 0) { free(authInfo); err = 1; goto exit; }
492*48a54d36SAndroid Build Coastguard Worker 
493*48a54d36SAndroid Build Coastguard Worker 					authInfo->next = zone->updateKeys;
494*48a54d36SAndroid Build Coastguard Worker 					zone->updateKeys = authInfo;
495*48a54d36SAndroid Build Coastguard Worker 
496*48a54d36SAndroid Build Coastguard Worker 					found = mDNStrue;
497*48a54d36SAndroid Build Coastguard Worker 
498*48a54d36SAndroid Build Coastguard Worker 					break;
499*48a54d36SAndroid Build Coastguard Worker 					}
500*48a54d36SAndroid Build Coastguard Worker 				}
501*48a54d36SAndroid Build Coastguard Worker 
502*48a54d36SAndroid Build Coastguard Worker 			// Log this
503*48a54d36SAndroid Build Coastguard Worker 			require_action( found, exit, err = 1 );
504*48a54d36SAndroid Build Coastguard Worker 			}
505*48a54d36SAndroid Build Coastguard Worker 
506*48a54d36SAndroid Build Coastguard Worker 		// Fill in the allow-query keys
507*48a54d36SAndroid Build Coastguard Worker 
508*48a54d36SAndroid Build Coastguard Worker 		for ( elem = zoneSpec->allowQuery; elem; elem = elem->next )
509*48a54d36SAndroid Build Coastguard Worker 			{
510*48a54d36SAndroid Build Coastguard Worker 			mDNSBool found = mDNSfalse;
511*48a54d36SAndroid Build Coastguard Worker 
512*48a54d36SAndroid Build Coastguard Worker 			for ( keySpec = g_keys; keySpec; keySpec = keySpec->next )
513*48a54d36SAndroid Build Coastguard Worker 				{
514*48a54d36SAndroid Build Coastguard Worker 				if ( strcmp( elem->string, keySpec->name ) == 0 )
515*48a54d36SAndroid Build Coastguard Worker 					{
516*48a54d36SAndroid Build Coastguard Worker 					DomainAuthInfo	*	authInfo = malloc( sizeof( DomainAuthInfo ) );
517*48a54d36SAndroid Build Coastguard Worker 					mDNSs32				keylen;
518*48a54d36SAndroid Build Coastguard Worker 					require_action( authInfo, exit, err = 1 );
519*48a54d36SAndroid Build Coastguard Worker 					memset( authInfo, 0, sizeof( DomainAuthInfo ) );
520*48a54d36SAndroid Build Coastguard Worker 
521*48a54d36SAndroid Build Coastguard Worker 					ok = MakeDomainNameFromDNSNameString( &authInfo->keyname, keySpec->name );
522*48a54d36SAndroid Build Coastguard Worker 					if (!ok) { free(authInfo); err = 1; goto exit; }
523*48a54d36SAndroid Build Coastguard Worker 
524*48a54d36SAndroid Build Coastguard Worker 					keylen = DNSDigest_ConstructHMACKeyfromBase64( authInfo, keySpec->secret );
525*48a54d36SAndroid Build Coastguard Worker 					if (keylen < 0) { free(authInfo); err = 1; goto exit; }
526*48a54d36SAndroid Build Coastguard Worker 
527*48a54d36SAndroid Build Coastguard Worker 					authInfo->next = zone->queryKeys;
528*48a54d36SAndroid Build Coastguard Worker 					zone->queryKeys = authInfo;
529*48a54d36SAndroid Build Coastguard Worker 
530*48a54d36SAndroid Build Coastguard Worker 					found = mDNStrue;
531*48a54d36SAndroid Build Coastguard Worker 
532*48a54d36SAndroid Build Coastguard Worker 					break;
533*48a54d36SAndroid Build Coastguard Worker 					}
534*48a54d36SAndroid Build Coastguard Worker 				}
535*48a54d36SAndroid Build Coastguard Worker 
536*48a54d36SAndroid Build Coastguard Worker 			// Log this
537*48a54d36SAndroid Build Coastguard Worker 			require_action( found, exit, err = 1 );
538*48a54d36SAndroid Build Coastguard Worker 			}
539*48a54d36SAndroid Build Coastguard Worker 		}
540*48a54d36SAndroid Build Coastguard Worker 
541*48a54d36SAndroid Build Coastguard Worker exit:
542*48a54d36SAndroid Build Coastguard Worker 
543*48a54d36SAndroid Build Coastguard Worker 	return err;
544*48a54d36SAndroid Build Coastguard Worker 	}
545*48a54d36SAndroid Build Coastguard Worker 
546*48a54d36SAndroid Build Coastguard Worker 
547*48a54d36SAndroid Build Coastguard Worker void
SetupOptions(OptionsInfo * info,void * context)548*48a54d36SAndroid Build Coastguard Worker SetupOptions
549*48a54d36SAndroid Build Coastguard Worker 	(
550*48a54d36SAndroid Build Coastguard Worker 	OptionsInfo	*	info,
551*48a54d36SAndroid Build Coastguard Worker 	void		*	context
552*48a54d36SAndroid Build Coastguard Worker 	)
553*48a54d36SAndroid Build Coastguard Worker 	{
554*48a54d36SAndroid Build Coastguard Worker 	DaemonInfo * d = ( DaemonInfo* ) context;
555*48a54d36SAndroid Build Coastguard Worker 
556*48a54d36SAndroid Build Coastguard Worker 	if ( strlen( info->source_address ) )
557*48a54d36SAndroid Build Coastguard Worker 		{
558*48a54d36SAndroid Build Coastguard Worker 		inet_pton( AF_INET, info->source_address, &d->addr.sin_addr );
559*48a54d36SAndroid Build Coastguard Worker 		}
560*48a54d36SAndroid Build Coastguard Worker 
561*48a54d36SAndroid Build Coastguard Worker 	if ( info->source_port )
562*48a54d36SAndroid Build Coastguard Worker 		{
563*48a54d36SAndroid Build Coastguard Worker 		d->addr.sin_port = htons( ( mDNSu16 ) info->source_port );
564*48a54d36SAndroid Build Coastguard Worker 		}
565*48a54d36SAndroid Build Coastguard Worker 
566*48a54d36SAndroid Build Coastguard Worker 	if ( strlen( info->server_address ) )
567*48a54d36SAndroid Build Coastguard Worker 		{
568*48a54d36SAndroid Build Coastguard Worker 		inet_pton( AF_INET, info->server_address, &d->ns_addr.sin_addr );
569*48a54d36SAndroid Build Coastguard Worker 		}
570*48a54d36SAndroid Build Coastguard Worker 
571*48a54d36SAndroid Build Coastguard Worker 	if ( info->server_port )
572*48a54d36SAndroid Build Coastguard Worker 		{
573*48a54d36SAndroid Build Coastguard Worker 		d->ns_addr.sin_port = htons( ( mDNSu16 ) info->server_port );
574*48a54d36SAndroid Build Coastguard Worker 		}
575*48a54d36SAndroid Build Coastguard Worker 
576*48a54d36SAndroid Build Coastguard Worker 	if ( info->private_port )
577*48a54d36SAndroid Build Coastguard Worker 		{
578*48a54d36SAndroid Build Coastguard Worker 		d->private_port = mDNSOpaque16fromIntVal( info->private_port );
579*48a54d36SAndroid Build Coastguard Worker 		}
580*48a54d36SAndroid Build Coastguard Worker 
581*48a54d36SAndroid Build Coastguard Worker 	if ( info->llq_port )
582*48a54d36SAndroid Build Coastguard Worker 		{
583*48a54d36SAndroid Build Coastguard Worker 		d->llq_port = mDNSOpaque16fromIntVal( info->llq_port );
584*48a54d36SAndroid Build Coastguard Worker 		}
585*48a54d36SAndroid Build Coastguard Worker 	}
586