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