Deleted Added
full compact
parse.y (279006) parse.y (279055)
1%{
2/*-
3 * Copyright (c) 2012 The FreeBSD Foundation
4 * All rights reserved.
5 *
6 * This software was developed by Edward Tomasz Napierala under sponsorship
7 * from the FreeBSD Foundation.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * SUCH DAMAGE.
29 *
1%{
2/*-
3 * Copyright (c) 2012 The FreeBSD Foundation
4 * All rights reserved.
5 *
6 * This software was developed by Edward Tomasz Napierala under sponsorship
7 * from the FreeBSD Foundation.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * SUCH DAMAGE.
29 *
30 * $FreeBSD: stable/10/usr.sbin/ctld/parse.y 279006 2015-02-19 14:52:01Z mav $
30 * $FreeBSD: stable/10/usr.sbin/ctld/parse.y 279055 2015-02-20 17:09:49Z mav $
31 */
32
33#include <sys/queue.h>
34#include <sys/types.h>
35#include <sys/stat.h>
36#include <assert.h>
37#include <stdio.h>
38#include <stdint.h>
39#include <stdlib.h>
40#include <string.h>
41
42#include "ctld.h"
43
44extern FILE *yyin;
45extern char *yytext;
46extern int lineno;
47
48static struct conf *conf = NULL;
49static struct auth_group *auth_group = NULL;
50static struct portal_group *portal_group = NULL;
51static struct target *target = NULL;
52static struct lun *lun = NULL;
53
54extern void yyerror(const char *);
55extern int yylex(void);
56extern void yyrestart(FILE *);
57
58%}
59
60%token ALIAS AUTH_GROUP AUTH_TYPE BACKEND BLOCKSIZE CHAP CHAP_MUTUAL
61%token CLOSING_BRACKET DEBUG DEVICE_ID DISCOVERY_AUTH_GROUP DISCOVERY_FILTER
62%token INITIATOR_NAME INITIATOR_PORTAL ISNS_SERVER ISNS_PERIOD ISNS_TIMEOUT
63%token LISTEN LISTEN_ISER LUN MAXPROC OPENING_BRACKET OPTION
31 */
32
33#include <sys/queue.h>
34#include <sys/types.h>
35#include <sys/stat.h>
36#include <assert.h>
37#include <stdio.h>
38#include <stdint.h>
39#include <stdlib.h>
40#include <string.h>
41
42#include "ctld.h"
43
44extern FILE *yyin;
45extern char *yytext;
46extern int lineno;
47
48static struct conf *conf = NULL;
49static struct auth_group *auth_group = NULL;
50static struct portal_group *portal_group = NULL;
51static struct target *target = NULL;
52static struct lun *lun = NULL;
53
54extern void yyerror(const char *);
55extern int yylex(void);
56extern void yyrestart(FILE *);
57
58%}
59
60%token ALIAS AUTH_GROUP AUTH_TYPE BACKEND BLOCKSIZE CHAP CHAP_MUTUAL
61%token CLOSING_BRACKET DEBUG DEVICE_ID DISCOVERY_AUTH_GROUP DISCOVERY_FILTER
62%token INITIATOR_NAME INITIATOR_PORTAL ISNS_SERVER ISNS_PERIOD ISNS_TIMEOUT
63%token LISTEN LISTEN_ISER LUN MAXPROC OPENING_BRACKET OPTION
64%token PATH PIDFILE PORTAL_GROUP REDIRECT SEMICOLON SERIAL SIZE STR
64%token PATH PIDFILE PORT PORTAL_GROUP REDIRECT SEMICOLON SERIAL SIZE STR
65%token TARGET TIMEOUT
66
67%union
68{
69 char *str;
70}
71
72%token <str> STR
73
74%%
75
76statements:
77 |
78 statements statement
79 |
80 statements statement SEMICOLON
81 ;
82
83statement:
84 debug
85 |
86 timeout
87 |
88 maxproc
89 |
90 pidfile
91 |
92 isns_server
93 |
94 isns_period
95 |
96 isns_timeout
97 |
98 auth_group
99 |
100 portal_group
101 |
102 lun
103 |
104 target
105 ;
106
107debug: DEBUG STR
108 {
109 uint64_t tmp;
110
111 if (expand_number($2, &tmp) != 0) {
112 yyerror("invalid numeric value");
113 free($2);
114 return (1);
115 }
116
117 conf->conf_debug = tmp;
118 }
119 ;
120
121timeout: TIMEOUT STR
122 {
123 uint64_t tmp;
124
125 if (expand_number($2, &tmp) != 0) {
126 yyerror("invalid numeric value");
127 free($2);
128 return (1);
129 }
130
131 conf->conf_timeout = tmp;
132 }
133 ;
134
135maxproc: MAXPROC STR
136 {
137 uint64_t tmp;
138
139 if (expand_number($2, &tmp) != 0) {
140 yyerror("invalid numeric value");
141 free($2);
142 return (1);
143 }
144
145 conf->conf_maxproc = tmp;
146 }
147 ;
148
149pidfile: PIDFILE STR
150 {
151 if (conf->conf_pidfile_path != NULL) {
152 log_warnx("pidfile specified more than once");
153 free($2);
154 return (1);
155 }
156 conf->conf_pidfile_path = $2;
157 }
158 ;
159
160isns_server: ISNS_SERVER STR
161 {
162 int error;
163
164 error = isns_new(conf, $2);
165 free($2);
166 if (error != 0)
167 return (1);
168 }
169 ;
170
171isns_period: ISNS_PERIOD STR
172 {
173 uint64_t tmp;
174
175 if (expand_number($2, &tmp) != 0) {
176 yyerror("invalid numeric value");
177 free($2);
178 return (1);
179 }
180
181 conf->conf_isns_period = tmp;
182 }
183 ;
184
185isns_timeout: ISNS_TIMEOUT STR
186 {
187 uint64_t tmp;
188
189 if (expand_number($2, &tmp) != 0) {
190 yyerror("invalid numeric value");
191 free($2);
192 return (1);
193 }
194
195 conf->conf_isns_timeout = tmp;
196 }
197 ;
198
199auth_group: AUTH_GROUP auth_group_name
200 OPENING_BRACKET auth_group_entries CLOSING_BRACKET
201 {
202 auth_group = NULL;
203 }
204 ;
205
206auth_group_name: STR
207 {
208 /*
209 * Make it possible to redefine default
210 * auth-group. but only once.
211 */
212 if (strcmp($1, "default") == 0 &&
213 conf->conf_default_ag_defined == false) {
214 auth_group = auth_group_find(conf, $1);
215 conf->conf_default_ag_defined = true;
216 } else {
217 auth_group = auth_group_new(conf, $1);
218 }
219 free($1);
220 if (auth_group == NULL)
221 return (1);
222 }
223 ;
224
225auth_group_entries:
226 |
227 auth_group_entries auth_group_entry
228 |
229 auth_group_entries auth_group_entry SEMICOLON
230 ;
231
232auth_group_entry:
233 auth_group_auth_type
234 |
235 auth_group_chap
236 |
237 auth_group_chap_mutual
238 |
239 auth_group_initiator_name
240 |
241 auth_group_initiator_portal
242 ;
243
244auth_group_auth_type: AUTH_TYPE STR
245 {
246 int error;
247
248 error = auth_group_set_type(auth_group, $2);
249 free($2);
250 if (error != 0)
251 return (1);
252 }
253 ;
254
255auth_group_chap: CHAP STR STR
256 {
257 const struct auth *ca;
258
259 ca = auth_new_chap(auth_group, $2, $3);
260 free($2);
261 free($3);
262 if (ca == NULL)
263 return (1);
264 }
265 ;
266
267auth_group_chap_mutual: CHAP_MUTUAL STR STR STR STR
268 {
269 const struct auth *ca;
270
271 ca = auth_new_chap_mutual(auth_group, $2, $3, $4, $5);
272 free($2);
273 free($3);
274 free($4);
275 free($5);
276 if (ca == NULL)
277 return (1);
278 }
279 ;
280
281auth_group_initiator_name: INITIATOR_NAME STR
282 {
283 const struct auth_name *an;
284
285 an = auth_name_new(auth_group, $2);
286 free($2);
287 if (an == NULL)
288 return (1);
289 }
290 ;
291
292auth_group_initiator_portal: INITIATOR_PORTAL STR
293 {
294 const struct auth_portal *ap;
295
296 ap = auth_portal_new(auth_group, $2);
297 free($2);
298 if (ap == NULL)
299 return (1);
300 }
301 ;
302
303portal_group: PORTAL_GROUP portal_group_name
304 OPENING_BRACKET portal_group_entries CLOSING_BRACKET
305 {
306 portal_group = NULL;
307 }
308 ;
309
310portal_group_name: STR
311 {
312 /*
313 * Make it possible to redefine default
314 * portal-group. but only once.
315 */
316 if (strcmp($1, "default") == 0 &&
317 conf->conf_default_pg_defined == false) {
318 portal_group = portal_group_find(conf, $1);
319 conf->conf_default_pg_defined = true;
320 } else {
321 portal_group = portal_group_new(conf, $1);
322 }
323 free($1);
324 if (portal_group == NULL)
325 return (1);
326 }
327 ;
328
329portal_group_entries:
330 |
331 portal_group_entries portal_group_entry
332 |
333 portal_group_entries portal_group_entry SEMICOLON
334 ;
335
336portal_group_entry:
337 portal_group_discovery_auth_group
338 |
339 portal_group_discovery_filter
340 |
341 portal_group_listen
342 |
343 portal_group_listen_iser
344 |
345 portal_group_redirect
346 ;
347
348portal_group_discovery_auth_group: DISCOVERY_AUTH_GROUP STR
349 {
350 if (portal_group->pg_discovery_auth_group != NULL) {
351 log_warnx("discovery-auth-group for portal-group "
352 "\"%s\" specified more than once",
353 portal_group->pg_name);
354 return (1);
355 }
356 portal_group->pg_discovery_auth_group =
357 auth_group_find(conf, $2);
358 if (portal_group->pg_discovery_auth_group == NULL) {
359 log_warnx("unknown discovery-auth-group \"%s\" "
360 "for portal-group \"%s\"",
361 $2, portal_group->pg_name);
362 return (1);
363 }
364 free($2);
365 }
366 ;
367
368portal_group_discovery_filter: DISCOVERY_FILTER STR
369 {
370 int error;
371
372 error = portal_group_set_filter(portal_group, $2);
373 free($2);
374 if (error != 0)
375 return (1);
376 }
377 ;
378
379portal_group_listen: LISTEN STR
380 {
381 int error;
382
383 error = portal_group_add_listen(portal_group, $2, false);
384 free($2);
385 if (error != 0)
386 return (1);
387 }
388 ;
389
390portal_group_listen_iser: LISTEN_ISER STR
391 {
392 int error;
393
394 error = portal_group_add_listen(portal_group, $2, true);
395 free($2);
396 if (error != 0)
397 return (1);
398 }
399 ;
400
401portal_group_redirect: REDIRECT STR
402 {
403 int error;
404
405 error = portal_group_set_redirection(portal_group, $2);
406 free($2);
407 if (error != 0)
408 return (1);
409 }
410 ;
411
412lun: LUN lun_name
413 OPENING_BRACKET lun_entries CLOSING_BRACKET
414 {
415 lun = NULL;
416 }
417 ;
418
419lun_name: STR
420 {
421 lun = lun_new(conf, $1);
422 free($1);
423 if (lun == NULL)
424 return (1);
425 }
426 ;
427
428target: TARGET target_name
429 OPENING_BRACKET target_entries CLOSING_BRACKET
430 {
431 target = NULL;
432 }
433 ;
434
435target_name: STR
436 {
437 target = target_new(conf, $1);
438 free($1);
439 if (target == NULL)
440 return (1);
441 }
442 ;
443
444target_entries:
445 |
446 target_entries target_entry
447 |
448 target_entries target_entry SEMICOLON
449 ;
450
451target_entry:
452 target_alias
453 |
454 target_auth_group
455 |
456 target_auth_type
457 |
458 target_chap
459 |
460 target_chap_mutual
461 |
462 target_initiator_name
463 |
464 target_initiator_portal
465 |
466 target_portal_group
467 |
65%token TARGET TIMEOUT
66
67%union
68{
69 char *str;
70}
71
72%token <str> STR
73
74%%
75
76statements:
77 |
78 statements statement
79 |
80 statements statement SEMICOLON
81 ;
82
83statement:
84 debug
85 |
86 timeout
87 |
88 maxproc
89 |
90 pidfile
91 |
92 isns_server
93 |
94 isns_period
95 |
96 isns_timeout
97 |
98 auth_group
99 |
100 portal_group
101 |
102 lun
103 |
104 target
105 ;
106
107debug: DEBUG STR
108 {
109 uint64_t tmp;
110
111 if (expand_number($2, &tmp) != 0) {
112 yyerror("invalid numeric value");
113 free($2);
114 return (1);
115 }
116
117 conf->conf_debug = tmp;
118 }
119 ;
120
121timeout: TIMEOUT STR
122 {
123 uint64_t tmp;
124
125 if (expand_number($2, &tmp) != 0) {
126 yyerror("invalid numeric value");
127 free($2);
128 return (1);
129 }
130
131 conf->conf_timeout = tmp;
132 }
133 ;
134
135maxproc: MAXPROC STR
136 {
137 uint64_t tmp;
138
139 if (expand_number($2, &tmp) != 0) {
140 yyerror("invalid numeric value");
141 free($2);
142 return (1);
143 }
144
145 conf->conf_maxproc = tmp;
146 }
147 ;
148
149pidfile: PIDFILE STR
150 {
151 if (conf->conf_pidfile_path != NULL) {
152 log_warnx("pidfile specified more than once");
153 free($2);
154 return (1);
155 }
156 conf->conf_pidfile_path = $2;
157 }
158 ;
159
160isns_server: ISNS_SERVER STR
161 {
162 int error;
163
164 error = isns_new(conf, $2);
165 free($2);
166 if (error != 0)
167 return (1);
168 }
169 ;
170
171isns_period: ISNS_PERIOD STR
172 {
173 uint64_t tmp;
174
175 if (expand_number($2, &tmp) != 0) {
176 yyerror("invalid numeric value");
177 free($2);
178 return (1);
179 }
180
181 conf->conf_isns_period = tmp;
182 }
183 ;
184
185isns_timeout: ISNS_TIMEOUT STR
186 {
187 uint64_t tmp;
188
189 if (expand_number($2, &tmp) != 0) {
190 yyerror("invalid numeric value");
191 free($2);
192 return (1);
193 }
194
195 conf->conf_isns_timeout = tmp;
196 }
197 ;
198
199auth_group: AUTH_GROUP auth_group_name
200 OPENING_BRACKET auth_group_entries CLOSING_BRACKET
201 {
202 auth_group = NULL;
203 }
204 ;
205
206auth_group_name: STR
207 {
208 /*
209 * Make it possible to redefine default
210 * auth-group. but only once.
211 */
212 if (strcmp($1, "default") == 0 &&
213 conf->conf_default_ag_defined == false) {
214 auth_group = auth_group_find(conf, $1);
215 conf->conf_default_ag_defined = true;
216 } else {
217 auth_group = auth_group_new(conf, $1);
218 }
219 free($1);
220 if (auth_group == NULL)
221 return (1);
222 }
223 ;
224
225auth_group_entries:
226 |
227 auth_group_entries auth_group_entry
228 |
229 auth_group_entries auth_group_entry SEMICOLON
230 ;
231
232auth_group_entry:
233 auth_group_auth_type
234 |
235 auth_group_chap
236 |
237 auth_group_chap_mutual
238 |
239 auth_group_initiator_name
240 |
241 auth_group_initiator_portal
242 ;
243
244auth_group_auth_type: AUTH_TYPE STR
245 {
246 int error;
247
248 error = auth_group_set_type(auth_group, $2);
249 free($2);
250 if (error != 0)
251 return (1);
252 }
253 ;
254
255auth_group_chap: CHAP STR STR
256 {
257 const struct auth *ca;
258
259 ca = auth_new_chap(auth_group, $2, $3);
260 free($2);
261 free($3);
262 if (ca == NULL)
263 return (1);
264 }
265 ;
266
267auth_group_chap_mutual: CHAP_MUTUAL STR STR STR STR
268 {
269 const struct auth *ca;
270
271 ca = auth_new_chap_mutual(auth_group, $2, $3, $4, $5);
272 free($2);
273 free($3);
274 free($4);
275 free($5);
276 if (ca == NULL)
277 return (1);
278 }
279 ;
280
281auth_group_initiator_name: INITIATOR_NAME STR
282 {
283 const struct auth_name *an;
284
285 an = auth_name_new(auth_group, $2);
286 free($2);
287 if (an == NULL)
288 return (1);
289 }
290 ;
291
292auth_group_initiator_portal: INITIATOR_PORTAL STR
293 {
294 const struct auth_portal *ap;
295
296 ap = auth_portal_new(auth_group, $2);
297 free($2);
298 if (ap == NULL)
299 return (1);
300 }
301 ;
302
303portal_group: PORTAL_GROUP portal_group_name
304 OPENING_BRACKET portal_group_entries CLOSING_BRACKET
305 {
306 portal_group = NULL;
307 }
308 ;
309
310portal_group_name: STR
311 {
312 /*
313 * Make it possible to redefine default
314 * portal-group. but only once.
315 */
316 if (strcmp($1, "default") == 0 &&
317 conf->conf_default_pg_defined == false) {
318 portal_group = portal_group_find(conf, $1);
319 conf->conf_default_pg_defined = true;
320 } else {
321 portal_group = portal_group_new(conf, $1);
322 }
323 free($1);
324 if (portal_group == NULL)
325 return (1);
326 }
327 ;
328
329portal_group_entries:
330 |
331 portal_group_entries portal_group_entry
332 |
333 portal_group_entries portal_group_entry SEMICOLON
334 ;
335
336portal_group_entry:
337 portal_group_discovery_auth_group
338 |
339 portal_group_discovery_filter
340 |
341 portal_group_listen
342 |
343 portal_group_listen_iser
344 |
345 portal_group_redirect
346 ;
347
348portal_group_discovery_auth_group: DISCOVERY_AUTH_GROUP STR
349 {
350 if (portal_group->pg_discovery_auth_group != NULL) {
351 log_warnx("discovery-auth-group for portal-group "
352 "\"%s\" specified more than once",
353 portal_group->pg_name);
354 return (1);
355 }
356 portal_group->pg_discovery_auth_group =
357 auth_group_find(conf, $2);
358 if (portal_group->pg_discovery_auth_group == NULL) {
359 log_warnx("unknown discovery-auth-group \"%s\" "
360 "for portal-group \"%s\"",
361 $2, portal_group->pg_name);
362 return (1);
363 }
364 free($2);
365 }
366 ;
367
368portal_group_discovery_filter: DISCOVERY_FILTER STR
369 {
370 int error;
371
372 error = portal_group_set_filter(portal_group, $2);
373 free($2);
374 if (error != 0)
375 return (1);
376 }
377 ;
378
379portal_group_listen: LISTEN STR
380 {
381 int error;
382
383 error = portal_group_add_listen(portal_group, $2, false);
384 free($2);
385 if (error != 0)
386 return (1);
387 }
388 ;
389
390portal_group_listen_iser: LISTEN_ISER STR
391 {
392 int error;
393
394 error = portal_group_add_listen(portal_group, $2, true);
395 free($2);
396 if (error != 0)
397 return (1);
398 }
399 ;
400
401portal_group_redirect: REDIRECT STR
402 {
403 int error;
404
405 error = portal_group_set_redirection(portal_group, $2);
406 free($2);
407 if (error != 0)
408 return (1);
409 }
410 ;
411
412lun: LUN lun_name
413 OPENING_BRACKET lun_entries CLOSING_BRACKET
414 {
415 lun = NULL;
416 }
417 ;
418
419lun_name: STR
420 {
421 lun = lun_new(conf, $1);
422 free($1);
423 if (lun == NULL)
424 return (1);
425 }
426 ;
427
428target: TARGET target_name
429 OPENING_BRACKET target_entries CLOSING_BRACKET
430 {
431 target = NULL;
432 }
433 ;
434
435target_name: STR
436 {
437 target = target_new(conf, $1);
438 free($1);
439 if (target == NULL)
440 return (1);
441 }
442 ;
443
444target_entries:
445 |
446 target_entries target_entry
447 |
448 target_entries target_entry SEMICOLON
449 ;
450
451target_entry:
452 target_alias
453 |
454 target_auth_group
455 |
456 target_auth_type
457 |
458 target_chap
459 |
460 target_chap_mutual
461 |
462 target_initiator_name
463 |
464 target_initiator_portal
465 |
466 target_portal_group
467 |
468 target_port
469 |
468 target_redirect
469 |
470 target_lun
471 |
472 target_lun_ref
473 ;
474
475target_alias: ALIAS STR
476 {
477 if (target->t_alias != NULL) {
478 log_warnx("alias for target \"%s\" "
479 "specified more than once", target->t_name);
480 return (1);
481 }
482 target->t_alias = $2;
483 }
484 ;
485
486target_auth_group: AUTH_GROUP STR
487 {
488 if (target->t_auth_group != NULL) {
489 if (target->t_auth_group->ag_name != NULL)
490 log_warnx("auth-group for target \"%s\" "
491 "specified more than once", target->t_name);
492 else
493 log_warnx("cannot use both auth-group and explicit "
494 "authorisations for target \"%s\"",
495 target->t_name);
496 return (1);
497 }
498 target->t_auth_group = auth_group_find(conf, $2);
499 if (target->t_auth_group == NULL) {
500 log_warnx("unknown auth-group \"%s\" for target "
501 "\"%s\"", $2, target->t_name);
502 return (1);
503 }
504 free($2);
505 }
506 ;
507
508target_auth_type: AUTH_TYPE STR
509 {
510 int error;
511
512 if (target->t_auth_group != NULL) {
513 if (target->t_auth_group->ag_name != NULL) {
514 log_warnx("cannot use both auth-group and "
515 "auth-type for target \"%s\"",
516 target->t_name);
517 return (1);
518 }
519 } else {
520 target->t_auth_group = auth_group_new(conf, NULL);
521 if (target->t_auth_group == NULL) {
522 free($2);
523 return (1);
524 }
525 target->t_auth_group->ag_target = target;
526 }
527 error = auth_group_set_type(target->t_auth_group, $2);
528 free($2);
529 if (error != 0)
530 return (1);
531 }
532 ;
533
534target_chap: CHAP STR STR
535 {
536 const struct auth *ca;
537
538 if (target->t_auth_group != NULL) {
539 if (target->t_auth_group->ag_name != NULL) {
540 log_warnx("cannot use both auth-group and "
541 "chap for target \"%s\"",
542 target->t_name);
543 free($2);
544 free($3);
545 return (1);
546 }
547 } else {
548 target->t_auth_group = auth_group_new(conf, NULL);
549 if (target->t_auth_group == NULL) {
550 free($2);
551 free($3);
552 return (1);
553 }
554 target->t_auth_group->ag_target = target;
555 }
556 ca = auth_new_chap(target->t_auth_group, $2, $3);
557 free($2);
558 free($3);
559 if (ca == NULL)
560 return (1);
561 }
562 ;
563
564target_chap_mutual: CHAP_MUTUAL STR STR STR STR
565 {
566 const struct auth *ca;
567
568 if (target->t_auth_group != NULL) {
569 if (target->t_auth_group->ag_name != NULL) {
570 log_warnx("cannot use both auth-group and "
571 "chap-mutual for target \"%s\"",
572 target->t_name);
573 free($2);
574 free($3);
575 free($4);
576 free($5);
577 return (1);
578 }
579 } else {
580 target->t_auth_group = auth_group_new(conf, NULL);
581 if (target->t_auth_group == NULL) {
582 free($2);
583 free($3);
584 free($4);
585 free($5);
586 return (1);
587 }
588 target->t_auth_group->ag_target = target;
589 }
590 ca = auth_new_chap_mutual(target->t_auth_group,
591 $2, $3, $4, $5);
592 free($2);
593 free($3);
594 free($4);
595 free($5);
596 if (ca == NULL)
597 return (1);
598 }
599 ;
600
601target_initiator_name: INITIATOR_NAME STR
602 {
603 const struct auth_name *an;
604
605 if (target->t_auth_group != NULL) {
606 if (target->t_auth_group->ag_name != NULL) {
607 log_warnx("cannot use both auth-group and "
608 "initiator-name for target \"%s\"",
609 target->t_name);
610 free($2);
611 return (1);
612 }
613 } else {
614 target->t_auth_group = auth_group_new(conf, NULL);
615 if (target->t_auth_group == NULL) {
616 free($2);
617 return (1);
618 }
619 target->t_auth_group->ag_target = target;
620 }
621 an = auth_name_new(target->t_auth_group, $2);
622 free($2);
623 if (an == NULL)
624 return (1);
625 }
626 ;
627
628target_initiator_portal: INITIATOR_PORTAL STR
629 {
630 const struct auth_portal *ap;
631
632 if (target->t_auth_group != NULL) {
633 if (target->t_auth_group->ag_name != NULL) {
634 log_warnx("cannot use both auth-group and "
635 "initiator-portal for target \"%s\"",
636 target->t_name);
637 free($2);
638 return (1);
639 }
640 } else {
641 target->t_auth_group = auth_group_new(conf, NULL);
642 if (target->t_auth_group == NULL) {
643 free($2);
644 return (1);
645 }
646 target->t_auth_group->ag_target = target;
647 }
648 ap = auth_portal_new(target->t_auth_group, $2);
649 free($2);
650 if (ap == NULL)
651 return (1);
652 }
653 ;
654
655target_portal_group: PORTAL_GROUP STR STR
656 {
657 struct portal_group *tpg;
658 struct auth_group *tag;
659 struct port *tp;
660
661 tpg = portal_group_find(conf, $2);
662 if (tpg == NULL) {
663 log_warnx("unknown portal-group \"%s\" for target "
664 "\"%s\"", $2, target->t_name);
665 free($2);
666 free($3);
667 return (1);
668 }
669 tag = auth_group_find(conf, $3);
670 if (tag == NULL) {
671 log_warnx("unknown auth-group \"%s\" for target "
672 "\"%s\"", $3, target->t_name);
673 free($2);
674 free($3);
675 return (1);
676 }
677 tp = port_new(conf, target, tpg);
678 if (tp == NULL) {
679 log_warnx("can't link portal-group \"%s\" to target "
680 "\"%s\"", $2, target->t_name);
681 free($2);
682 return (1);
683 }
684 tp->p_auth_group = tag;
685 free($2);
686 free($3);
687 }
688 | PORTAL_GROUP STR
689 {
690 struct portal_group *tpg;
691 struct port *tp;
692
693 tpg = portal_group_find(conf, $2);
694 if (tpg == NULL) {
695 log_warnx("unknown portal-group \"%s\" for target "
696 "\"%s\"", $2, target->t_name);
697 free($2);
698 return (1);
699 }
700 tp = port_new(conf, target, tpg);
701 if (tp == NULL) {
702 log_warnx("can't link portal-group \"%s\" to target "
703 "\"%s\"", $2, target->t_name);
704 free($2);
705 return (1);
706 }
707 free($2);
708 }
709 ;
710
470 target_redirect
471 |
472 target_lun
473 |
474 target_lun_ref
475 ;
476
477target_alias: ALIAS STR
478 {
479 if (target->t_alias != NULL) {
480 log_warnx("alias for target \"%s\" "
481 "specified more than once", target->t_name);
482 return (1);
483 }
484 target->t_alias = $2;
485 }
486 ;
487
488target_auth_group: AUTH_GROUP STR
489 {
490 if (target->t_auth_group != NULL) {
491 if (target->t_auth_group->ag_name != NULL)
492 log_warnx("auth-group for target \"%s\" "
493 "specified more than once", target->t_name);
494 else
495 log_warnx("cannot use both auth-group and explicit "
496 "authorisations for target \"%s\"",
497 target->t_name);
498 return (1);
499 }
500 target->t_auth_group = auth_group_find(conf, $2);
501 if (target->t_auth_group == NULL) {
502 log_warnx("unknown auth-group \"%s\" for target "
503 "\"%s\"", $2, target->t_name);
504 return (1);
505 }
506 free($2);
507 }
508 ;
509
510target_auth_type: AUTH_TYPE STR
511 {
512 int error;
513
514 if (target->t_auth_group != NULL) {
515 if (target->t_auth_group->ag_name != NULL) {
516 log_warnx("cannot use both auth-group and "
517 "auth-type for target \"%s\"",
518 target->t_name);
519 return (1);
520 }
521 } else {
522 target->t_auth_group = auth_group_new(conf, NULL);
523 if (target->t_auth_group == NULL) {
524 free($2);
525 return (1);
526 }
527 target->t_auth_group->ag_target = target;
528 }
529 error = auth_group_set_type(target->t_auth_group, $2);
530 free($2);
531 if (error != 0)
532 return (1);
533 }
534 ;
535
536target_chap: CHAP STR STR
537 {
538 const struct auth *ca;
539
540 if (target->t_auth_group != NULL) {
541 if (target->t_auth_group->ag_name != NULL) {
542 log_warnx("cannot use both auth-group and "
543 "chap for target \"%s\"",
544 target->t_name);
545 free($2);
546 free($3);
547 return (1);
548 }
549 } else {
550 target->t_auth_group = auth_group_new(conf, NULL);
551 if (target->t_auth_group == NULL) {
552 free($2);
553 free($3);
554 return (1);
555 }
556 target->t_auth_group->ag_target = target;
557 }
558 ca = auth_new_chap(target->t_auth_group, $2, $3);
559 free($2);
560 free($3);
561 if (ca == NULL)
562 return (1);
563 }
564 ;
565
566target_chap_mutual: CHAP_MUTUAL STR STR STR STR
567 {
568 const struct auth *ca;
569
570 if (target->t_auth_group != NULL) {
571 if (target->t_auth_group->ag_name != NULL) {
572 log_warnx("cannot use both auth-group and "
573 "chap-mutual for target \"%s\"",
574 target->t_name);
575 free($2);
576 free($3);
577 free($4);
578 free($5);
579 return (1);
580 }
581 } else {
582 target->t_auth_group = auth_group_new(conf, NULL);
583 if (target->t_auth_group == NULL) {
584 free($2);
585 free($3);
586 free($4);
587 free($5);
588 return (1);
589 }
590 target->t_auth_group->ag_target = target;
591 }
592 ca = auth_new_chap_mutual(target->t_auth_group,
593 $2, $3, $4, $5);
594 free($2);
595 free($3);
596 free($4);
597 free($5);
598 if (ca == NULL)
599 return (1);
600 }
601 ;
602
603target_initiator_name: INITIATOR_NAME STR
604 {
605 const struct auth_name *an;
606
607 if (target->t_auth_group != NULL) {
608 if (target->t_auth_group->ag_name != NULL) {
609 log_warnx("cannot use both auth-group and "
610 "initiator-name for target \"%s\"",
611 target->t_name);
612 free($2);
613 return (1);
614 }
615 } else {
616 target->t_auth_group = auth_group_new(conf, NULL);
617 if (target->t_auth_group == NULL) {
618 free($2);
619 return (1);
620 }
621 target->t_auth_group->ag_target = target;
622 }
623 an = auth_name_new(target->t_auth_group, $2);
624 free($2);
625 if (an == NULL)
626 return (1);
627 }
628 ;
629
630target_initiator_portal: INITIATOR_PORTAL STR
631 {
632 const struct auth_portal *ap;
633
634 if (target->t_auth_group != NULL) {
635 if (target->t_auth_group->ag_name != NULL) {
636 log_warnx("cannot use both auth-group and "
637 "initiator-portal for target \"%s\"",
638 target->t_name);
639 free($2);
640 return (1);
641 }
642 } else {
643 target->t_auth_group = auth_group_new(conf, NULL);
644 if (target->t_auth_group == NULL) {
645 free($2);
646 return (1);
647 }
648 target->t_auth_group->ag_target = target;
649 }
650 ap = auth_portal_new(target->t_auth_group, $2);
651 free($2);
652 if (ap == NULL)
653 return (1);
654 }
655 ;
656
657target_portal_group: PORTAL_GROUP STR STR
658 {
659 struct portal_group *tpg;
660 struct auth_group *tag;
661 struct port *tp;
662
663 tpg = portal_group_find(conf, $2);
664 if (tpg == NULL) {
665 log_warnx("unknown portal-group \"%s\" for target "
666 "\"%s\"", $2, target->t_name);
667 free($2);
668 free($3);
669 return (1);
670 }
671 tag = auth_group_find(conf, $3);
672 if (tag == NULL) {
673 log_warnx("unknown auth-group \"%s\" for target "
674 "\"%s\"", $3, target->t_name);
675 free($2);
676 free($3);
677 return (1);
678 }
679 tp = port_new(conf, target, tpg);
680 if (tp == NULL) {
681 log_warnx("can't link portal-group \"%s\" to target "
682 "\"%s\"", $2, target->t_name);
683 free($2);
684 return (1);
685 }
686 tp->p_auth_group = tag;
687 free($2);
688 free($3);
689 }
690 | PORTAL_GROUP STR
691 {
692 struct portal_group *tpg;
693 struct port *tp;
694
695 tpg = portal_group_find(conf, $2);
696 if (tpg == NULL) {
697 log_warnx("unknown portal-group \"%s\" for target "
698 "\"%s\"", $2, target->t_name);
699 free($2);
700 return (1);
701 }
702 tp = port_new(conf, target, tpg);
703 if (tp == NULL) {
704 log_warnx("can't link portal-group \"%s\" to target "
705 "\"%s\"", $2, target->t_name);
706 free($2);
707 return (1);
708 }
709 free($2);
710 }
711 ;
712
713target_port: PORT STR
714 {
715 struct pport *pp;
716 struct port *tp;
717
718 pp = pport_find(conf, $2);
719 if (pp == NULL) {
720 log_warnx("unknown port \"%s\" for target \"%s\"",
721 $2, target->t_name);
722 free($2);
723 return (1);
724 }
725 if (!TAILQ_EMPTY(&pp->pp_ports)) {
726 log_warnx("can't link port \"%s\" to target \"%s\", "
727 "port already linked to some target",
728 $2, target->t_name);
729 free($2);
730 return (1);
731 }
732 tp = port_new_pp(conf, target, pp);
733 if (tp == NULL) {
734 log_warnx("can't link port \"%s\" to target \"%s\"",
735 $2, target->t_name);
736 free($2);
737 return (1);
738 }
739 free($2);
740 }
741 ;
742
711target_redirect: REDIRECT STR
712 {
713 int error;
714
715 error = target_set_redirection(target, $2);
716 free($2);
717 if (error != 0)
718 return (1);
719 }
720 ;
721
722target_lun: LUN lun_number
723 OPENING_BRACKET lun_entries CLOSING_BRACKET
724 {
725 lun = NULL;
726 }
727 ;
728
729lun_number: STR
730 {
731 uint64_t tmp;
732 char *name;
733
734 if (expand_number($1, &tmp) != 0) {
735 yyerror("invalid numeric value");
736 free($1);
737 return (1);
738 }
739
740 asprintf(&name, "%s,lun,%ju", target->t_name, tmp);
741 lun = lun_new(conf, name);
742 if (lun == NULL)
743 return (1);
744
745 lun_set_scsiname(lun, name);
746 target->t_luns[tmp] = lun;
747 }
748 ;
749
750target_lun_ref: LUN STR STR
751 {
752 uint64_t tmp;
753
754 if (expand_number($2, &tmp) != 0) {
755 yyerror("invalid numeric value");
756 free($2);
757 free($3);
758 return (1);
759 }
760 free($2);
761
762 lun = lun_find(conf, $3);
763 free($3);
764 if (lun == NULL)
765 return (1);
766
767 target->t_luns[tmp] = lun;
768 }
769 ;
770
771lun_entries:
772 |
773 lun_entries lun_entry
774 |
775 lun_entries lun_entry SEMICOLON
776 ;
777
778lun_entry:
779 lun_backend
780 |
781 lun_blocksize
782 |
783 lun_device_id
784 |
785 lun_option
786 |
787 lun_path
788 |
789 lun_serial
790 |
791 lun_size
792 ;
793
794lun_backend: BACKEND STR
795 {
796 if (lun->l_backend != NULL) {
797 log_warnx("backend for lun \"%s\" "
798 "specified more than once",
799 lun->l_name);
800 free($2);
801 return (1);
802 }
803 lun_set_backend(lun, $2);
804 free($2);
805 }
806 ;
807
808lun_blocksize: BLOCKSIZE STR
809 {
810 uint64_t tmp;
811
812 if (expand_number($2, &tmp) != 0) {
813 yyerror("invalid numeric value");
814 free($2);
815 return (1);
816 }
817
818 if (lun->l_blocksize != 0) {
819 log_warnx("blocksize for lun \"%s\" "
820 "specified more than once",
821 lun->l_name);
822 return (1);
823 }
824 lun_set_blocksize(lun, tmp);
825 }
826 ;
827
828lun_device_id: DEVICE_ID STR
829 {
830 if (lun->l_device_id != NULL) {
831 log_warnx("device_id for lun \"%s\" "
832 "specified more than once",
833 lun->l_name);
834 free($2);
835 return (1);
836 }
837 lun_set_device_id(lun, $2);
838 free($2);
839 }
840 ;
841
842lun_option: OPTION STR STR
843 {
844 struct lun_option *clo;
845
846 clo = lun_option_new(lun, $2, $3);
847 free($2);
848 free($3);
849 if (clo == NULL)
850 return (1);
851 }
852 ;
853
854lun_path: PATH STR
855 {
856 if (lun->l_path != NULL) {
857 log_warnx("path for lun \"%s\" "
858 "specified more than once",
859 lun->l_name);
860 free($2);
861 return (1);
862 }
863 lun_set_path(lun, $2);
864 free($2);
865 }
866 ;
867
868lun_serial: SERIAL STR
869 {
870 if (lun->l_serial != NULL) {
871 log_warnx("serial for lun \"%s\" "
872 "specified more than once",
873 lun->l_name);
874 free($2);
875 return (1);
876 }
877 lun_set_serial(lun, $2);
878 free($2);
879 }
880 ;
881
882lun_size: SIZE STR
883 {
884 uint64_t tmp;
885
886 if (expand_number($2, &tmp) != 0) {
887 yyerror("invalid numeric value");
888 free($2);
889 return (1);
890 }
891
892 if (lun->l_size != 0) {
893 log_warnx("size for lun \"%s\" "
894 "specified more than once",
895 lun->l_name);
896 return (1);
897 }
898 lun_set_size(lun, tmp);
899 }
900 ;
901%%
902
903void
904yyerror(const char *str)
905{
906
907 log_warnx("error in configuration file at line %d near '%s': %s",
908 lineno, yytext, str);
909}
910
911static void
912check_perms(const char *path)
913{
914 struct stat sb;
915 int error;
916
917 error = stat(path, &sb);
918 if (error != 0) {
919 log_warn("stat");
920 return;
921 }
922 if (sb.st_mode & S_IWOTH) {
923 log_warnx("%s is world-writable", path);
924 } else if (sb.st_mode & S_IROTH) {
925 log_warnx("%s is world-readable", path);
926 } else if (sb.st_mode & S_IXOTH) {
927 /*
928 * Ok, this one doesn't matter, but still do it,
929 * just for consistency.
930 */
931 log_warnx("%s is world-executable", path);
932 }
933
934 /*
935 * XXX: Should we also check for owner != 0?
936 */
937}
938
939struct conf *
743target_redirect: REDIRECT STR
744 {
745 int error;
746
747 error = target_set_redirection(target, $2);
748 free($2);
749 if (error != 0)
750 return (1);
751 }
752 ;
753
754target_lun: LUN lun_number
755 OPENING_BRACKET lun_entries CLOSING_BRACKET
756 {
757 lun = NULL;
758 }
759 ;
760
761lun_number: STR
762 {
763 uint64_t tmp;
764 char *name;
765
766 if (expand_number($1, &tmp) != 0) {
767 yyerror("invalid numeric value");
768 free($1);
769 return (1);
770 }
771
772 asprintf(&name, "%s,lun,%ju", target->t_name, tmp);
773 lun = lun_new(conf, name);
774 if (lun == NULL)
775 return (1);
776
777 lun_set_scsiname(lun, name);
778 target->t_luns[tmp] = lun;
779 }
780 ;
781
782target_lun_ref: LUN STR STR
783 {
784 uint64_t tmp;
785
786 if (expand_number($2, &tmp) != 0) {
787 yyerror("invalid numeric value");
788 free($2);
789 free($3);
790 return (1);
791 }
792 free($2);
793
794 lun = lun_find(conf, $3);
795 free($3);
796 if (lun == NULL)
797 return (1);
798
799 target->t_luns[tmp] = lun;
800 }
801 ;
802
803lun_entries:
804 |
805 lun_entries lun_entry
806 |
807 lun_entries lun_entry SEMICOLON
808 ;
809
810lun_entry:
811 lun_backend
812 |
813 lun_blocksize
814 |
815 lun_device_id
816 |
817 lun_option
818 |
819 lun_path
820 |
821 lun_serial
822 |
823 lun_size
824 ;
825
826lun_backend: BACKEND STR
827 {
828 if (lun->l_backend != NULL) {
829 log_warnx("backend for lun \"%s\" "
830 "specified more than once",
831 lun->l_name);
832 free($2);
833 return (1);
834 }
835 lun_set_backend(lun, $2);
836 free($2);
837 }
838 ;
839
840lun_blocksize: BLOCKSIZE STR
841 {
842 uint64_t tmp;
843
844 if (expand_number($2, &tmp) != 0) {
845 yyerror("invalid numeric value");
846 free($2);
847 return (1);
848 }
849
850 if (lun->l_blocksize != 0) {
851 log_warnx("blocksize for lun \"%s\" "
852 "specified more than once",
853 lun->l_name);
854 return (1);
855 }
856 lun_set_blocksize(lun, tmp);
857 }
858 ;
859
860lun_device_id: DEVICE_ID STR
861 {
862 if (lun->l_device_id != NULL) {
863 log_warnx("device_id for lun \"%s\" "
864 "specified more than once",
865 lun->l_name);
866 free($2);
867 return (1);
868 }
869 lun_set_device_id(lun, $2);
870 free($2);
871 }
872 ;
873
874lun_option: OPTION STR STR
875 {
876 struct lun_option *clo;
877
878 clo = lun_option_new(lun, $2, $3);
879 free($2);
880 free($3);
881 if (clo == NULL)
882 return (1);
883 }
884 ;
885
886lun_path: PATH STR
887 {
888 if (lun->l_path != NULL) {
889 log_warnx("path for lun \"%s\" "
890 "specified more than once",
891 lun->l_name);
892 free($2);
893 return (1);
894 }
895 lun_set_path(lun, $2);
896 free($2);
897 }
898 ;
899
900lun_serial: SERIAL STR
901 {
902 if (lun->l_serial != NULL) {
903 log_warnx("serial for lun \"%s\" "
904 "specified more than once",
905 lun->l_name);
906 free($2);
907 return (1);
908 }
909 lun_set_serial(lun, $2);
910 free($2);
911 }
912 ;
913
914lun_size: SIZE STR
915 {
916 uint64_t tmp;
917
918 if (expand_number($2, &tmp) != 0) {
919 yyerror("invalid numeric value");
920 free($2);
921 return (1);
922 }
923
924 if (lun->l_size != 0) {
925 log_warnx("size for lun \"%s\" "
926 "specified more than once",
927 lun->l_name);
928 return (1);
929 }
930 lun_set_size(lun, tmp);
931 }
932 ;
933%%
934
935void
936yyerror(const char *str)
937{
938
939 log_warnx("error in configuration file at line %d near '%s': %s",
940 lineno, yytext, str);
941}
942
943static void
944check_perms(const char *path)
945{
946 struct stat sb;
947 int error;
948
949 error = stat(path, &sb);
950 if (error != 0) {
951 log_warn("stat");
952 return;
953 }
954 if (sb.st_mode & S_IWOTH) {
955 log_warnx("%s is world-writable", path);
956 } else if (sb.st_mode & S_IROTH) {
957 log_warnx("%s is world-readable", path);
958 } else if (sb.st_mode & S_IXOTH) {
959 /*
960 * Ok, this one doesn't matter, but still do it,
961 * just for consistency.
962 */
963 log_warnx("%s is world-executable", path);
964 }
965
966 /*
967 * XXX: Should we also check for owner != 0?
968 */
969}
970
971struct conf *
940conf_new_from_file(const char *path)
972conf_new_from_file(const char *path, struct conf *oldconf)
941{
942 struct auth_group *ag;
943 struct portal_group *pg;
973{
974 struct auth_group *ag;
975 struct portal_group *pg;
976 struct pport *pp;
944 int error;
945
946 log_debugx("obtaining configuration from %s", path);
947
948 conf = conf_new();
949
977 int error;
978
979 log_debugx("obtaining configuration from %s", path);
980
981 conf = conf_new();
982
983 TAILQ_FOREACH(pp, &oldconf->conf_pports, pp_next)
984 pport_copy(pp, conf);
985
950 ag = auth_group_new(conf, "default");
951 assert(ag != NULL);
952
953 ag = auth_group_new(conf, "no-authentication");
954 assert(ag != NULL);
955 ag->ag_type = AG_TYPE_NO_AUTHENTICATION;
956
957 ag = auth_group_new(conf, "no-access");
958 assert(ag != NULL);
959 ag->ag_type = AG_TYPE_DENY;
960
961 pg = portal_group_new(conf, "default");
962 assert(pg != NULL);
963
964 yyin = fopen(path, "r");
965 if (yyin == NULL) {
966 log_warn("unable to open configuration file %s", path);
967 conf_delete(conf);
968 return (NULL);
969 }
970 check_perms(path);
971 lineno = 1;
972 yyrestart(yyin);
973 error = yyparse();
974 auth_group = NULL;
975 portal_group = NULL;
976 target = NULL;
977 lun = NULL;
978 fclose(yyin);
979 if (error != 0) {
980 conf_delete(conf);
981 return (NULL);
982 }
983
984 if (conf->conf_default_ag_defined == false) {
985 log_debugx("auth-group \"default\" not defined; "
986 "going with defaults");
987 ag = auth_group_find(conf, "default");
988 assert(ag != NULL);
989 ag->ag_type = AG_TYPE_DENY;
990 }
991
992 if (conf->conf_default_pg_defined == false) {
993 log_debugx("portal-group \"default\" not defined; "
994 "going with defaults");
995 pg = portal_group_find(conf, "default");
996 assert(pg != NULL);
997 portal_group_add_listen(pg, "0.0.0.0:3260", false);
998 portal_group_add_listen(pg, "[::]:3260", false);
999 }
1000
1001 conf->conf_kernel_port_on = true;
1002
1003 error = conf_verify(conf);
1004 if (error != 0) {
1005 conf_delete(conf);
1006 return (NULL);
1007 }
1008
1009 return (conf);
1010}
986 ag = auth_group_new(conf, "default");
987 assert(ag != NULL);
988
989 ag = auth_group_new(conf, "no-authentication");
990 assert(ag != NULL);
991 ag->ag_type = AG_TYPE_NO_AUTHENTICATION;
992
993 ag = auth_group_new(conf, "no-access");
994 assert(ag != NULL);
995 ag->ag_type = AG_TYPE_DENY;
996
997 pg = portal_group_new(conf, "default");
998 assert(pg != NULL);
999
1000 yyin = fopen(path, "r");
1001 if (yyin == NULL) {
1002 log_warn("unable to open configuration file %s", path);
1003 conf_delete(conf);
1004 return (NULL);
1005 }
1006 check_perms(path);
1007 lineno = 1;
1008 yyrestart(yyin);
1009 error = yyparse();
1010 auth_group = NULL;
1011 portal_group = NULL;
1012 target = NULL;
1013 lun = NULL;
1014 fclose(yyin);
1015 if (error != 0) {
1016 conf_delete(conf);
1017 return (NULL);
1018 }
1019
1020 if (conf->conf_default_ag_defined == false) {
1021 log_debugx("auth-group \"default\" not defined; "
1022 "going with defaults");
1023 ag = auth_group_find(conf, "default");
1024 assert(ag != NULL);
1025 ag->ag_type = AG_TYPE_DENY;
1026 }
1027
1028 if (conf->conf_default_pg_defined == false) {
1029 log_debugx("portal-group \"default\" not defined; "
1030 "going with defaults");
1031 pg = portal_group_find(conf, "default");
1032 assert(pg != NULL);
1033 portal_group_add_listen(pg, "0.0.0.0:3260", false);
1034 portal_group_add_listen(pg, "[::]:3260", false);
1035 }
1036
1037 conf->conf_kernel_port_on = true;
1038
1039 error = conf_verify(conf);
1040 if (error != 0) {
1041 conf_delete(conf);
1042 return (NULL);
1043 }
1044
1045 return (conf);
1046}