xref: /freebsd/usr.sbin/ctld/parse.y (revision 6de7a0d6c47615beecd8692e580aa3136c243303)
1009ea47eSEdward Tomasz Napierala %{
2009ea47eSEdward Tomasz Napierala /*-
34d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
41de7b4b8SPedro F. Giffuni  *
5009ea47eSEdward Tomasz Napierala  * Copyright (c) 2012 The FreeBSD Foundation
6009ea47eSEdward Tomasz Napierala  *
7009ea47eSEdward Tomasz Napierala  * This software was developed by Edward Tomasz Napierala under sponsorship
8009ea47eSEdward Tomasz Napierala  * from the FreeBSD Foundation.
9009ea47eSEdward Tomasz Napierala  *
10009ea47eSEdward Tomasz Napierala  * Redistribution and use in source and binary forms, with or without
11009ea47eSEdward Tomasz Napierala  * modification, are permitted provided that the following conditions
12009ea47eSEdward Tomasz Napierala  * are met:
13009ea47eSEdward Tomasz Napierala  * 1. Redistributions of source code must retain the above copyright
14009ea47eSEdward Tomasz Napierala  *    notice, this list of conditions and the following disclaimer.
15009ea47eSEdward Tomasz Napierala  * 2. Redistributions in binary form must reproduce the above copyright
16009ea47eSEdward Tomasz Napierala  *    notice, this list of conditions and the following disclaimer in the
17009ea47eSEdward Tomasz Napierala  *    documentation and/or other materials provided with the distribution.
18009ea47eSEdward Tomasz Napierala  *
19009ea47eSEdward Tomasz Napierala  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20009ea47eSEdward Tomasz Napierala  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21009ea47eSEdward Tomasz Napierala  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22009ea47eSEdward Tomasz Napierala  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23009ea47eSEdward Tomasz Napierala  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24009ea47eSEdward Tomasz Napierala  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25009ea47eSEdward Tomasz Napierala  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26009ea47eSEdward Tomasz Napierala  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27009ea47eSEdward Tomasz Napierala  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28009ea47eSEdward Tomasz Napierala  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29009ea47eSEdward Tomasz Napierala  * SUCH DAMAGE.
30009ea47eSEdward Tomasz Napierala  */
31009ea47eSEdward Tomasz Napierala 
32009ea47eSEdward Tomasz Napierala #include <sys/types.h>
33703b03a8SJohn Baldwin #include <sys/nv.h>
34703b03a8SJohn Baldwin #include <sys/queue.h>
35009ea47eSEdward Tomasz Napierala #include <sys/stat.h>
36009ea47eSEdward Tomasz Napierala #include <assert.h>
37009ea47eSEdward Tomasz Napierala #include <stdio.h>
38009ea47eSEdward Tomasz Napierala #include <stdlib.h>
39009ea47eSEdward Tomasz Napierala #include <string.h>
40009ea47eSEdward Tomasz Napierala 
41009ea47eSEdward Tomasz Napierala #include "ctld.h"
4264ffe6d4SRichard Scheffenegger #include <netinet/in.h>
4364ffe6d4SRichard Scheffenegger #include <netinet/ip.h>
44009ea47eSEdward Tomasz Napierala 
45009ea47eSEdward Tomasz Napierala extern FILE *yyin;
46009ea47eSEdward Tomasz Napierala extern char *yytext;
47009ea47eSEdward Tomasz Napierala extern int lineno;
48009ea47eSEdward Tomasz Napierala 
49009ea47eSEdward Tomasz Napierala static struct conf *conf = NULL;
50009ea47eSEdward Tomasz Napierala static struct auth_group *auth_group = NULL;
51009ea47eSEdward Tomasz Napierala static struct portal_group *portal_group = NULL;
52009ea47eSEdward Tomasz Napierala static struct target *target = NULL;
53009ea47eSEdward Tomasz Napierala static struct lun *lun = NULL;
54009ea47eSEdward Tomasz Napierala 
55009ea47eSEdward Tomasz Napierala extern void	yyerror(const char *);
56009ea47eSEdward Tomasz Napierala extern void	yyrestart(FILE *);
57009ea47eSEdward Tomasz Napierala 
58009ea47eSEdward Tomasz Napierala %}
59009ea47eSEdward Tomasz Napierala 
60df9900fbSEdward Tomasz Napierala %token ALIAS AUTH_GROUP AUTH_TYPE BACKEND BLOCKSIZE CHAP CHAP_MUTUAL
6191be33dcSAlexander Motin %token CLOSING_BRACKET CTL_LUN DEBUG DEVICE_ID DEVICE_TYPE
6264ffe6d4SRichard Scheffenegger %token DISCOVERY_AUTH_GROUP DISCOVERY_FILTER DSCP FOREIGN
63dbb1ee18SEdward Tomasz Napierala %token INITIATOR_NAME INITIATOR_PORTAL ISNS_SERVER ISNS_PERIOD ISNS_TIMEOUT
6407b49a3eSEdward Tomasz Napierala %token LISTEN LISTEN_ISER LUN MAXPROC OFFLOAD OPENING_BRACKET OPTION
65ea8f1280SRichard Scheffenegger %token PATH PCP PIDFILE PORT PORTAL_GROUP REDIRECT SEMICOLON SERIAL
66ea8f1280SRichard Scheffenegger %token SIZE STR TAG TARGET TIMEOUT
6764ffe6d4SRichard Scheffenegger %token AF11 AF12 AF13 AF21 AF22 AF23 AF31 AF32 AF33 AF41 AF42 AF43
6864ffe6d4SRichard Scheffenegger %token BE EF CS0 CS1 CS2 CS3 CS4 CS5 CS6 CS7
69009ea47eSEdward Tomasz Napierala 
70009ea47eSEdward Tomasz Napierala %union
71009ea47eSEdward Tomasz Napierala {
72009ea47eSEdward Tomasz Napierala 	char *str;
73009ea47eSEdward Tomasz Napierala }
74009ea47eSEdward Tomasz Napierala 
75009ea47eSEdward Tomasz Napierala %token <str> STR
76009ea47eSEdward Tomasz Napierala 
77009ea47eSEdward Tomasz Napierala %%
78009ea47eSEdward Tomasz Napierala 
79009ea47eSEdward Tomasz Napierala statements:
80009ea47eSEdward Tomasz Napierala 	|
81009ea47eSEdward Tomasz Napierala 	statements statement
82f9488580SEdward Tomasz Napierala 	|
83f9488580SEdward Tomasz Napierala 	statements statement SEMICOLON
84009ea47eSEdward Tomasz Napierala 	;
85009ea47eSEdward Tomasz Napierala 
86009ea47eSEdward Tomasz Napierala statement:
87e1c0d0d8SEdward Tomasz Napierala 	debug
88009ea47eSEdward Tomasz Napierala 	|
89e1c0d0d8SEdward Tomasz Napierala 	timeout
90009ea47eSEdward Tomasz Napierala 	|
91e1c0d0d8SEdward Tomasz Napierala 	maxproc
92009ea47eSEdward Tomasz Napierala 	|
93e1c0d0d8SEdward Tomasz Napierala 	pidfile
94009ea47eSEdward Tomasz Napierala 	|
95829603e2SAlexander Motin 	isns_server
96829603e2SAlexander Motin 	|
97829603e2SAlexander Motin 	isns_period
98829603e2SAlexander Motin 	|
99829603e2SAlexander Motin 	isns_timeout
100829603e2SAlexander Motin 	|
101e1c0d0d8SEdward Tomasz Napierala 	auth_group
102009ea47eSEdward Tomasz Napierala 	|
103e1c0d0d8SEdward Tomasz Napierala 	portal_group
104009ea47eSEdward Tomasz Napierala 	|
105920c6cbaSAlexander Motin 	lun
106920c6cbaSAlexander Motin 	|
107e1c0d0d8SEdward Tomasz Napierala 	target
108009ea47eSEdward Tomasz Napierala 	;
109009ea47eSEdward Tomasz Napierala 
1104524db57SEdward Tomasz Napierala debug:		DEBUG STR
111009ea47eSEdward Tomasz Napierala 	{
1124524db57SEdward Tomasz Napierala 		uint64_t tmp;
1134524db57SEdward Tomasz Napierala 
1144524db57SEdward Tomasz Napierala 		if (expand_number($2, &tmp) != 0) {
115d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
1164524db57SEdward Tomasz Napierala 			free($2);
1174524db57SEdward Tomasz Napierala 			return (1);
1184524db57SEdward Tomasz Napierala 		}
119*6de7a0d6SJohn Baldwin 		free($2);
1204524db57SEdward Tomasz Napierala 
1214524db57SEdward Tomasz Napierala 		conf->conf_debug = tmp;
122009ea47eSEdward Tomasz Napierala 	}
123009ea47eSEdward Tomasz Napierala 	;
124009ea47eSEdward Tomasz Napierala 
1254524db57SEdward Tomasz Napierala timeout:	TIMEOUT STR
126009ea47eSEdward Tomasz Napierala 	{
1274524db57SEdward Tomasz Napierala 		uint64_t tmp;
1284524db57SEdward Tomasz Napierala 
1294524db57SEdward Tomasz Napierala 		if (expand_number($2, &tmp) != 0) {
130d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
1314524db57SEdward Tomasz Napierala 			free($2);
1324524db57SEdward Tomasz Napierala 			return (1);
1334524db57SEdward Tomasz Napierala 		}
134*6de7a0d6SJohn Baldwin 		free($2);
1354524db57SEdward Tomasz Napierala 
1364524db57SEdward Tomasz Napierala 		conf->conf_timeout = tmp;
137009ea47eSEdward Tomasz Napierala 	}
138009ea47eSEdward Tomasz Napierala 	;
139009ea47eSEdward Tomasz Napierala 
1404524db57SEdward Tomasz Napierala maxproc:	MAXPROC STR
141009ea47eSEdward Tomasz Napierala 	{
1424524db57SEdward Tomasz Napierala 		uint64_t tmp;
1434524db57SEdward Tomasz Napierala 
1444524db57SEdward Tomasz Napierala 		if (expand_number($2, &tmp) != 0) {
145d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
1464524db57SEdward Tomasz Napierala 			free($2);
1474524db57SEdward Tomasz Napierala 			return (1);
1484524db57SEdward Tomasz Napierala 		}
149*6de7a0d6SJohn Baldwin 		free($2);
1504524db57SEdward Tomasz Napierala 
1514524db57SEdward Tomasz Napierala 		conf->conf_maxproc = tmp;
152009ea47eSEdward Tomasz Napierala 	}
153009ea47eSEdward Tomasz Napierala 	;
154009ea47eSEdward Tomasz Napierala 
155e1c0d0d8SEdward Tomasz Napierala pidfile:	PIDFILE STR
156009ea47eSEdward Tomasz Napierala 	{
157009ea47eSEdward Tomasz Napierala 		if (conf->conf_pidfile_path != NULL) {
158009ea47eSEdward Tomasz Napierala 			log_warnx("pidfile specified more than once");
159009ea47eSEdward Tomasz Napierala 			free($2);
160009ea47eSEdward Tomasz Napierala 			return (1);
161009ea47eSEdward Tomasz Napierala 		}
162009ea47eSEdward Tomasz Napierala 		conf->conf_pidfile_path = $2;
163009ea47eSEdward Tomasz Napierala 	}
164009ea47eSEdward Tomasz Napierala 	;
165009ea47eSEdward Tomasz Napierala 
166829603e2SAlexander Motin isns_server:	ISNS_SERVER STR
167829603e2SAlexander Motin 	{
168450a84c2SJohn Baldwin 		bool ok;
169829603e2SAlexander Motin 
170450a84c2SJohn Baldwin 		ok = isns_new(conf, $2);
171829603e2SAlexander Motin 		free($2);
172450a84c2SJohn Baldwin 		if (!ok)
173829603e2SAlexander Motin 			return (1);
174829603e2SAlexander Motin 	}
175829603e2SAlexander Motin 	;
176829603e2SAlexander Motin 
177d9b4554dSEdward Tomasz Napierala isns_period:	ISNS_PERIOD STR
178829603e2SAlexander Motin 	{
179d9b4554dSEdward Tomasz Napierala 		uint64_t tmp;
180d9b4554dSEdward Tomasz Napierala 
181d9b4554dSEdward Tomasz Napierala 		if (expand_number($2, &tmp) != 0) {
182d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
183d9b4554dSEdward Tomasz Napierala 			free($2);
184d9b4554dSEdward Tomasz Napierala 			return (1);
185d9b4554dSEdward Tomasz Napierala 		}
186*6de7a0d6SJohn Baldwin 		free($2);
187d9b4554dSEdward Tomasz Napierala 
188d9b4554dSEdward Tomasz Napierala 		conf->conf_isns_period = tmp;
189829603e2SAlexander Motin 	}
190829603e2SAlexander Motin 	;
191829603e2SAlexander Motin 
192d9b4554dSEdward Tomasz Napierala isns_timeout:	ISNS_TIMEOUT STR
193829603e2SAlexander Motin 	{
194d9b4554dSEdward Tomasz Napierala 		uint64_t tmp;
195d9b4554dSEdward Tomasz Napierala 
196d9b4554dSEdward Tomasz Napierala 		if (expand_number($2, &tmp) != 0) {
197d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
198d9b4554dSEdward Tomasz Napierala 			free($2);
199d9b4554dSEdward Tomasz Napierala 			return (1);
200d9b4554dSEdward Tomasz Napierala 		}
201*6de7a0d6SJohn Baldwin 		free($2);
202d9b4554dSEdward Tomasz Napierala 
203d9b4554dSEdward Tomasz Napierala 		conf->conf_isns_timeout = tmp;
204829603e2SAlexander Motin 	}
205829603e2SAlexander Motin 	;
206829603e2SAlexander Motin 
207e1c0d0d8SEdward Tomasz Napierala auth_group:	AUTH_GROUP auth_group_name
208009ea47eSEdward Tomasz Napierala     OPENING_BRACKET auth_group_entries CLOSING_BRACKET
209009ea47eSEdward Tomasz Napierala 	{
210009ea47eSEdward Tomasz Napierala 		auth_group = NULL;
211009ea47eSEdward Tomasz Napierala 	}
212009ea47eSEdward Tomasz Napierala 	;
213009ea47eSEdward Tomasz Napierala 
214009ea47eSEdward Tomasz Napierala auth_group_name:	STR
215009ea47eSEdward Tomasz Napierala 	{
216e7977549SEdward Tomasz Napierala 		/*
217e7977549SEdward Tomasz Napierala 		 * Make it possible to redefine default
218e7977549SEdward Tomasz Napierala 		 * auth-group. but only once.
219e7977549SEdward Tomasz Napierala 		 */
220e7977549SEdward Tomasz Napierala 		if (strcmp($1, "default") == 0 &&
221e7977549SEdward Tomasz Napierala 		    conf->conf_default_ag_defined == false) {
222e7977549SEdward Tomasz Napierala 			auth_group = auth_group_find(conf, $1);
223e7977549SEdward Tomasz Napierala 			conf->conf_default_ag_defined = true;
224e7977549SEdward Tomasz Napierala 		} else {
225009ea47eSEdward Tomasz Napierala 			auth_group = auth_group_new(conf, $1);
226e7977549SEdward Tomasz Napierala 		}
227009ea47eSEdward Tomasz Napierala 		free($1);
228009ea47eSEdward Tomasz Napierala 		if (auth_group == NULL)
229009ea47eSEdward Tomasz Napierala 			return (1);
230009ea47eSEdward Tomasz Napierala 	}
231009ea47eSEdward Tomasz Napierala 	;
232009ea47eSEdward Tomasz Napierala 
233009ea47eSEdward Tomasz Napierala auth_group_entries:
234009ea47eSEdward Tomasz Napierala 	|
235009ea47eSEdward Tomasz Napierala 	auth_group_entries auth_group_entry
236f9488580SEdward Tomasz Napierala 	|
237f9488580SEdward Tomasz Napierala 	auth_group_entries auth_group_entry SEMICOLON
238009ea47eSEdward Tomasz Napierala 	;
239009ea47eSEdward Tomasz Napierala 
240009ea47eSEdward Tomasz Napierala auth_group_entry:
241df9900fbSEdward Tomasz Napierala 	auth_group_auth_type
242df9900fbSEdward Tomasz Napierala 	|
243009ea47eSEdward Tomasz Napierala 	auth_group_chap
244009ea47eSEdward Tomasz Napierala 	|
245009ea47eSEdward Tomasz Napierala 	auth_group_chap_mutual
2468cb2e958SEdward Tomasz Napierala 	|
2478cb2e958SEdward Tomasz Napierala 	auth_group_initiator_name
2488cb2e958SEdward Tomasz Napierala 	|
2498cb2e958SEdward Tomasz Napierala 	auth_group_initiator_portal
250009ea47eSEdward Tomasz Napierala 	;
251009ea47eSEdward Tomasz Napierala 
252df9900fbSEdward Tomasz Napierala auth_group_auth_type:	AUTH_TYPE STR
253df9900fbSEdward Tomasz Napierala 	{
254450a84c2SJohn Baldwin 		bool ok;
255df9900fbSEdward Tomasz Napierala 
256450a84c2SJohn Baldwin 		ok = auth_group_set_type(auth_group, $2);
257df9900fbSEdward Tomasz Napierala 		free($2);
258450a84c2SJohn Baldwin 		if (!ok)
259df9900fbSEdward Tomasz Napierala 			return (1);
260df9900fbSEdward Tomasz Napierala 	}
261df9900fbSEdward Tomasz Napierala 	;
262df9900fbSEdward Tomasz Napierala 
263009ea47eSEdward Tomasz Napierala auth_group_chap:	CHAP STR STR
264009ea47eSEdward Tomasz Napierala 	{
265009ea47eSEdward Tomasz Napierala 		const struct auth *ca;
266009ea47eSEdward Tomasz Napierala 
267009ea47eSEdward Tomasz Napierala 		ca = auth_new_chap(auth_group, $2, $3);
268009ea47eSEdward Tomasz Napierala 		free($2);
269009ea47eSEdward Tomasz Napierala 		free($3);
270009ea47eSEdward Tomasz Napierala 		if (ca == NULL)
271009ea47eSEdward Tomasz Napierala 			return (1);
272009ea47eSEdward Tomasz Napierala 	}
273009ea47eSEdward Tomasz Napierala 	;
274009ea47eSEdward Tomasz Napierala 
275009ea47eSEdward Tomasz Napierala auth_group_chap_mutual:	CHAP_MUTUAL STR STR STR STR
276009ea47eSEdward Tomasz Napierala 	{
277009ea47eSEdward Tomasz Napierala 		const struct auth *ca;
278009ea47eSEdward Tomasz Napierala 
279009ea47eSEdward Tomasz Napierala 		ca = auth_new_chap_mutual(auth_group, $2, $3, $4, $5);
280009ea47eSEdward Tomasz Napierala 		free($2);
281009ea47eSEdward Tomasz Napierala 		free($3);
282009ea47eSEdward Tomasz Napierala 		free($4);
283009ea47eSEdward Tomasz Napierala 		free($5);
284009ea47eSEdward Tomasz Napierala 		if (ca == NULL)
285009ea47eSEdward Tomasz Napierala 			return (1);
286009ea47eSEdward Tomasz Napierala 	}
287009ea47eSEdward Tomasz Napierala 	;
288009ea47eSEdward Tomasz Napierala 
2898cb2e958SEdward Tomasz Napierala auth_group_initiator_name:	INITIATOR_NAME STR
2908cb2e958SEdward Tomasz Napierala 	{
2918cb2e958SEdward Tomasz Napierala 		const struct auth_name *an;
2928cb2e958SEdward Tomasz Napierala 
2938cb2e958SEdward Tomasz Napierala 		an = auth_name_new(auth_group, $2);
2948cb2e958SEdward Tomasz Napierala 		free($2);
2958cb2e958SEdward Tomasz Napierala 		if (an == NULL)
2968cb2e958SEdward Tomasz Napierala 			return (1);
2978cb2e958SEdward Tomasz Napierala 	}
2988cb2e958SEdward Tomasz Napierala 	;
2998cb2e958SEdward Tomasz Napierala 
3008cb2e958SEdward Tomasz Napierala auth_group_initiator_portal:	INITIATOR_PORTAL STR
3018cb2e958SEdward Tomasz Napierala 	{
3028cb2e958SEdward Tomasz Napierala 		const struct auth_portal *ap;
3038cb2e958SEdward Tomasz Napierala 
3048cb2e958SEdward Tomasz Napierala 		ap = auth_portal_new(auth_group, $2);
3058cb2e958SEdward Tomasz Napierala 		free($2);
3068cb2e958SEdward Tomasz Napierala 		if (ap == NULL)
3078cb2e958SEdward Tomasz Napierala 			return (1);
3088cb2e958SEdward Tomasz Napierala 	}
3098cb2e958SEdward Tomasz Napierala 	;
3108cb2e958SEdward Tomasz Napierala 
311e1c0d0d8SEdward Tomasz Napierala portal_group:	PORTAL_GROUP portal_group_name
312009ea47eSEdward Tomasz Napierala     OPENING_BRACKET portal_group_entries CLOSING_BRACKET
313009ea47eSEdward Tomasz Napierala 	{
314009ea47eSEdward Tomasz Napierala 		portal_group = NULL;
315009ea47eSEdward Tomasz Napierala 	}
316009ea47eSEdward Tomasz Napierala 	;
317009ea47eSEdward Tomasz Napierala 
318009ea47eSEdward Tomasz Napierala portal_group_name:	STR
319009ea47eSEdward Tomasz Napierala 	{
320252d941cSEdward Tomasz Napierala 		/*
321252d941cSEdward Tomasz Napierala 		 * Make it possible to redefine default
322252d941cSEdward Tomasz Napierala 		 * portal-group. but only once.
323252d941cSEdward Tomasz Napierala 		 */
324252d941cSEdward Tomasz Napierala 		if (strcmp($1, "default") == 0 &&
325252d941cSEdward Tomasz Napierala 		    conf->conf_default_pg_defined == false) {
326252d941cSEdward Tomasz Napierala 			portal_group = portal_group_find(conf, $1);
327252d941cSEdward Tomasz Napierala 			conf->conf_default_pg_defined = true;
328252d941cSEdward Tomasz Napierala 		} else {
329009ea47eSEdward Tomasz Napierala 			portal_group = portal_group_new(conf, $1);
330252d941cSEdward Tomasz Napierala 		}
331009ea47eSEdward Tomasz Napierala 		free($1);
332009ea47eSEdward Tomasz Napierala 		if (portal_group == NULL)
333009ea47eSEdward Tomasz Napierala 			return (1);
334009ea47eSEdward Tomasz Napierala 	}
335009ea47eSEdward Tomasz Napierala 	;
336009ea47eSEdward Tomasz Napierala 
337009ea47eSEdward Tomasz Napierala portal_group_entries:
338009ea47eSEdward Tomasz Napierala 	|
339009ea47eSEdward Tomasz Napierala 	portal_group_entries portal_group_entry
340f9488580SEdward Tomasz Napierala 	|
341f9488580SEdward Tomasz Napierala 	portal_group_entries portal_group_entry SEMICOLON
342009ea47eSEdward Tomasz Napierala 	;
343009ea47eSEdward Tomasz Napierala 
344009ea47eSEdward Tomasz Napierala portal_group_entry:
345009ea47eSEdward Tomasz Napierala 	portal_group_discovery_auth_group
346009ea47eSEdward Tomasz Napierala 	|
34705374883SEdward Tomasz Napierala 	portal_group_discovery_filter
34805374883SEdward Tomasz Napierala 	|
349db7bf2baSAlexander Motin 	portal_group_foreign
350db7bf2baSAlexander Motin 	|
351009ea47eSEdward Tomasz Napierala 	portal_group_listen
352009ea47eSEdward Tomasz Napierala 	|
353009ea47eSEdward Tomasz Napierala 	portal_group_listen_iser
3546dbdbf82SEdward Tomasz Napierala 	|
355a9d78210SEdward Tomasz Napierala 	portal_group_offload
356a9d78210SEdward Tomasz Napierala 	|
357398290f2SAlexander Motin 	portal_group_option
358398290f2SAlexander Motin 	|
3596dbdbf82SEdward Tomasz Napierala 	portal_group_redirect
360db7bf2baSAlexander Motin 	|
361db7bf2baSAlexander Motin 	portal_group_tag
36264ffe6d4SRichard Scheffenegger 	|
36364ffe6d4SRichard Scheffenegger 	portal_group_dscp
364ea8f1280SRichard Scheffenegger 	|
365ea8f1280SRichard Scheffenegger 	portal_group_pcp
366009ea47eSEdward Tomasz Napierala 	;
367009ea47eSEdward Tomasz Napierala 
368009ea47eSEdward Tomasz Napierala portal_group_discovery_auth_group:	DISCOVERY_AUTH_GROUP STR
369009ea47eSEdward Tomasz Napierala 	{
370009ea47eSEdward Tomasz Napierala 		if (portal_group->pg_discovery_auth_group != NULL) {
371009ea47eSEdward Tomasz Napierala 			log_warnx("discovery-auth-group for portal-group "
372009ea47eSEdward Tomasz Napierala 			    "\"%s\" specified more than once",
373009ea47eSEdward Tomasz Napierala 			    portal_group->pg_name);
374*6de7a0d6SJohn Baldwin 			free($2);
375009ea47eSEdward Tomasz Napierala 			return (1);
376009ea47eSEdward Tomasz Napierala 		}
377009ea47eSEdward Tomasz Napierala 		portal_group->pg_discovery_auth_group =
378009ea47eSEdward Tomasz Napierala 		    auth_group_find(conf, $2);
379009ea47eSEdward Tomasz Napierala 		if (portal_group->pg_discovery_auth_group == NULL) {
380009ea47eSEdward Tomasz Napierala 			log_warnx("unknown discovery-auth-group \"%s\" "
381009ea47eSEdward Tomasz Napierala 			    "for portal-group \"%s\"",
382009ea47eSEdward Tomasz Napierala 			    $2, portal_group->pg_name);
383*6de7a0d6SJohn Baldwin 			free($2);
384009ea47eSEdward Tomasz Napierala 			return (1);
385009ea47eSEdward Tomasz Napierala 		}
386009ea47eSEdward Tomasz Napierala 		free($2);
387009ea47eSEdward Tomasz Napierala 	}
388009ea47eSEdward Tomasz Napierala 	;
389009ea47eSEdward Tomasz Napierala 
39005374883SEdward Tomasz Napierala portal_group_discovery_filter:	DISCOVERY_FILTER STR
39105374883SEdward Tomasz Napierala 	{
392450a84c2SJohn Baldwin 		bool ok;
39305374883SEdward Tomasz Napierala 
394450a84c2SJohn Baldwin 		ok = portal_group_set_filter(portal_group, $2);
39505374883SEdward Tomasz Napierala 		free($2);
396450a84c2SJohn Baldwin 		if (!ok)
39705374883SEdward Tomasz Napierala 			return (1);
39805374883SEdward Tomasz Napierala 	}
39905374883SEdward Tomasz Napierala 	;
40005374883SEdward Tomasz Napierala 
401db7bf2baSAlexander Motin portal_group_foreign:	FOREIGN
402db7bf2baSAlexander Motin 	{
403db7bf2baSAlexander Motin 
404450a84c2SJohn Baldwin 		portal_group->pg_foreign = true;
405db7bf2baSAlexander Motin 	}
406db7bf2baSAlexander Motin 	;
407db7bf2baSAlexander Motin 
408009ea47eSEdward Tomasz Napierala portal_group_listen:	LISTEN STR
409009ea47eSEdward Tomasz Napierala 	{
410450a84c2SJohn Baldwin 		bool ok;
411009ea47eSEdward Tomasz Napierala 
412450a84c2SJohn Baldwin 		ok = portal_group_add_listen(portal_group, $2, false);
413009ea47eSEdward Tomasz Napierala 		free($2);
414450a84c2SJohn Baldwin 		if (!ok)
415009ea47eSEdward Tomasz Napierala 			return (1);
416009ea47eSEdward Tomasz Napierala 	}
417009ea47eSEdward Tomasz Napierala 	;
418009ea47eSEdward Tomasz Napierala 
419009ea47eSEdward Tomasz Napierala portal_group_listen_iser:	LISTEN_ISER STR
420009ea47eSEdward Tomasz Napierala 	{
421450a84c2SJohn Baldwin 		bool ok;
422009ea47eSEdward Tomasz Napierala 
423450a84c2SJohn Baldwin 		ok = portal_group_add_listen(portal_group, $2, true);
424009ea47eSEdward Tomasz Napierala 		free($2);
425450a84c2SJohn Baldwin 		if (!ok)
426009ea47eSEdward Tomasz Napierala 			return (1);
427009ea47eSEdward Tomasz Napierala 	}
428009ea47eSEdward Tomasz Napierala 	;
429009ea47eSEdward Tomasz Napierala 
430a9d78210SEdward Tomasz Napierala portal_group_offload:	OFFLOAD STR
431a9d78210SEdward Tomasz Napierala 	{
432450a84c2SJohn Baldwin 		bool ok;
433a9d78210SEdward Tomasz Napierala 
434450a84c2SJohn Baldwin 		ok = portal_group_set_offload(portal_group, $2);
435a9d78210SEdward Tomasz Napierala 		free($2);
436450a84c2SJohn Baldwin 		if (!ok)
437a9d78210SEdward Tomasz Napierala 			return (1);
438a9d78210SEdward Tomasz Napierala 	}
439a9d78210SEdward Tomasz Napierala 	;
440a9d78210SEdward Tomasz Napierala 
441398290f2SAlexander Motin portal_group_option:	OPTION STR STR
442398290f2SAlexander Motin 	{
443703b03a8SJohn Baldwin 		bool ok;
444398290f2SAlexander Motin 
445703b03a8SJohn Baldwin 		ok = option_new(portal_group->pg_options, $2, $3);
446398290f2SAlexander Motin 		free($2);
447398290f2SAlexander Motin 		free($3);
448703b03a8SJohn Baldwin 		if (!ok)
449398290f2SAlexander Motin 			return (1);
450398290f2SAlexander Motin 	}
451398290f2SAlexander Motin 	;
452398290f2SAlexander Motin 
4536dbdbf82SEdward Tomasz Napierala portal_group_redirect:	REDIRECT STR
4546dbdbf82SEdward Tomasz Napierala 	{
455450a84c2SJohn Baldwin 		bool ok;
4566dbdbf82SEdward Tomasz Napierala 
457450a84c2SJohn Baldwin 		ok = portal_group_set_redirection(portal_group, $2);
4586dbdbf82SEdward Tomasz Napierala 		free($2);
459450a84c2SJohn Baldwin 		if (!ok)
4606dbdbf82SEdward Tomasz Napierala 			return (1);
4616dbdbf82SEdward Tomasz Napierala 	}
4626dbdbf82SEdward Tomasz Napierala 	;
4636dbdbf82SEdward Tomasz Napierala 
464db7bf2baSAlexander Motin portal_group_tag:	TAG STR
465db7bf2baSAlexander Motin 	{
466db7bf2baSAlexander Motin 		uint64_t tmp;
467db7bf2baSAlexander Motin 
468db7bf2baSAlexander Motin 		if (expand_number($2, &tmp) != 0) {
469db7bf2baSAlexander Motin 			yyerror("invalid numeric value");
470db7bf2baSAlexander Motin 			free($2);
471db7bf2baSAlexander Motin 			return (1);
472db7bf2baSAlexander Motin 		}
473*6de7a0d6SJohn Baldwin 		free($2);
474db7bf2baSAlexander Motin 
475db7bf2baSAlexander Motin 		portal_group->pg_tag = tmp;
476db7bf2baSAlexander Motin 	}
477db7bf2baSAlexander Motin 	;
478db7bf2baSAlexander Motin 
47964ffe6d4SRichard Scheffenegger portal_group_dscp
48064ffe6d4SRichard Scheffenegger : DSCP STR
48164ffe6d4SRichard Scheffenegger 	{
48264ffe6d4SRichard Scheffenegger 		uint64_t tmp;
48364ffe6d4SRichard Scheffenegger 
48464ffe6d4SRichard Scheffenegger 		if (strcmp($2, "0x") == 0) {
48564ffe6d4SRichard Scheffenegger 			tmp = strtol($2 + 2, NULL, 16);
48664ffe6d4SRichard Scheffenegger 		} else if (expand_number($2, &tmp) != 0) {
48764ffe6d4SRichard Scheffenegger 			yyerror("invalid numeric value");
48864ffe6d4SRichard Scheffenegger 			free($2);
48964ffe6d4SRichard Scheffenegger 			return(1);
49064ffe6d4SRichard Scheffenegger 		}
491*6de7a0d6SJohn Baldwin 		free($2);
49264ffe6d4SRichard Scheffenegger 		if (tmp >= 0x40) {
49364ffe6d4SRichard Scheffenegger 			yyerror("invalid dscp value");
49464ffe6d4SRichard Scheffenegger 			return(1);
49564ffe6d4SRichard Scheffenegger 		}
49664ffe6d4SRichard Scheffenegger 
49764ffe6d4SRichard Scheffenegger 		portal_group->pg_dscp = tmp;
49864ffe6d4SRichard Scheffenegger 	}
49964ffe6d4SRichard Scheffenegger | DSCP BE	{ portal_group->pg_dscp = IPTOS_DSCP_CS0  >> 2 ; }
50064ffe6d4SRichard Scheffenegger | DSCP EF	{ portal_group->pg_dscp = IPTOS_DSCP_EF   >> 2 ; }
50164ffe6d4SRichard Scheffenegger | DSCP CS0	{ portal_group->pg_dscp = IPTOS_DSCP_CS0  >> 2 ; }
50264ffe6d4SRichard Scheffenegger | DSCP CS1	{ portal_group->pg_dscp = IPTOS_DSCP_CS1  >> 2 ; }
50364ffe6d4SRichard Scheffenegger | DSCP CS2	{ portal_group->pg_dscp = IPTOS_DSCP_CS2  >> 2 ; }
50464ffe6d4SRichard Scheffenegger | DSCP CS3	{ portal_group->pg_dscp = IPTOS_DSCP_CS3  >> 2 ; }
50564ffe6d4SRichard Scheffenegger | DSCP CS4	{ portal_group->pg_dscp = IPTOS_DSCP_CS4  >> 2 ; }
50664ffe6d4SRichard Scheffenegger | DSCP CS5	{ portal_group->pg_dscp = IPTOS_DSCP_CS5  >> 2 ; }
50764ffe6d4SRichard Scheffenegger | DSCP CS6	{ portal_group->pg_dscp = IPTOS_DSCP_CS6  >> 2 ; }
50864ffe6d4SRichard Scheffenegger | DSCP CS7	{ portal_group->pg_dscp = IPTOS_DSCP_CS7  >> 2 ; }
50964ffe6d4SRichard Scheffenegger | DSCP AF11	{ portal_group->pg_dscp = IPTOS_DSCP_AF11 >> 2 ; }
51064ffe6d4SRichard Scheffenegger | DSCP AF12	{ portal_group->pg_dscp = IPTOS_DSCP_AF12 >> 2 ; }
51164ffe6d4SRichard Scheffenegger | DSCP AF13	{ portal_group->pg_dscp = IPTOS_DSCP_AF13 >> 2 ; }
51264ffe6d4SRichard Scheffenegger | DSCP AF21	{ portal_group->pg_dscp = IPTOS_DSCP_AF21 >> 2 ; }
51364ffe6d4SRichard Scheffenegger | DSCP AF22	{ portal_group->pg_dscp = IPTOS_DSCP_AF22 >> 2 ; }
51464ffe6d4SRichard Scheffenegger | DSCP AF23	{ portal_group->pg_dscp = IPTOS_DSCP_AF23 >> 2 ; }
51564ffe6d4SRichard Scheffenegger | DSCP AF31	{ portal_group->pg_dscp = IPTOS_DSCP_AF31 >> 2 ; }
51664ffe6d4SRichard Scheffenegger | DSCP AF32	{ portal_group->pg_dscp = IPTOS_DSCP_AF32 >> 2 ; }
51764ffe6d4SRichard Scheffenegger | DSCP AF33	{ portal_group->pg_dscp = IPTOS_DSCP_AF33 >> 2 ; }
51864ffe6d4SRichard Scheffenegger | DSCP AF41	{ portal_group->pg_dscp = IPTOS_DSCP_AF41 >> 2 ; }
51964ffe6d4SRichard Scheffenegger | DSCP AF42	{ portal_group->pg_dscp = IPTOS_DSCP_AF42 >> 2 ; }
52064ffe6d4SRichard Scheffenegger | DSCP AF43	{ portal_group->pg_dscp = IPTOS_DSCP_AF43 >> 2 ; }
52164ffe6d4SRichard Scheffenegger 	;
52264ffe6d4SRichard Scheffenegger 
523ea8f1280SRichard Scheffenegger portal_group_pcp:	PCP STR
524ea8f1280SRichard Scheffenegger 	{
525ea8f1280SRichard Scheffenegger 		uint64_t tmp;
526ea8f1280SRichard Scheffenegger 
527ea8f1280SRichard Scheffenegger 		if (expand_number($2, &tmp) != 0) {
528ea8f1280SRichard Scheffenegger 			yyerror("invalid numeric value");
529ea8f1280SRichard Scheffenegger 			free($2);
530ea8f1280SRichard Scheffenegger 			return (1);
531ea8f1280SRichard Scheffenegger 		}
532*6de7a0d6SJohn Baldwin 		free($2);
533e72a100bSAdrian Chadd 		if (tmp > 7) {
534ea8f1280SRichard Scheffenegger 			yyerror("invalid pcp value");
535ea8f1280SRichard Scheffenegger 			return (1);
536ea8f1280SRichard Scheffenegger 		}
537ea8f1280SRichard Scheffenegger 
538ea8f1280SRichard Scheffenegger 		portal_group->pg_pcp = tmp;
539ea8f1280SRichard Scheffenegger 	}
540ea8f1280SRichard Scheffenegger 	;
54164ffe6d4SRichard Scheffenegger 
542920c6cbaSAlexander Motin lun:	LUN lun_name
543920c6cbaSAlexander Motin     OPENING_BRACKET lun_entries CLOSING_BRACKET
544920c6cbaSAlexander Motin 	{
545920c6cbaSAlexander Motin 		lun = NULL;
546920c6cbaSAlexander Motin 	}
547920c6cbaSAlexander Motin 	;
548920c6cbaSAlexander Motin 
549920c6cbaSAlexander Motin lun_name:	STR
550920c6cbaSAlexander Motin 	{
551920c6cbaSAlexander Motin 		lun = lun_new(conf, $1);
552920c6cbaSAlexander Motin 		free($1);
553920c6cbaSAlexander Motin 		if (lun == NULL)
554920c6cbaSAlexander Motin 			return (1);
555920c6cbaSAlexander Motin 	}
556920c6cbaSAlexander Motin 	;
557920c6cbaSAlexander Motin 
558e1c0d0d8SEdward Tomasz Napierala target:	TARGET target_name
559009ea47eSEdward Tomasz Napierala     OPENING_BRACKET target_entries CLOSING_BRACKET
560009ea47eSEdward Tomasz Napierala 	{
561009ea47eSEdward Tomasz Napierala 		target = NULL;
562009ea47eSEdward Tomasz Napierala 	}
563009ea47eSEdward Tomasz Napierala 	;
564009ea47eSEdward Tomasz Napierala 
565e1c0d0d8SEdward Tomasz Napierala target_name:	STR
566009ea47eSEdward Tomasz Napierala 	{
567009ea47eSEdward Tomasz Napierala 		target = target_new(conf, $1);
568009ea47eSEdward Tomasz Napierala 		free($1);
569009ea47eSEdward Tomasz Napierala 		if (target == NULL)
570009ea47eSEdward Tomasz Napierala 			return (1);
571009ea47eSEdward Tomasz Napierala 	}
572009ea47eSEdward Tomasz Napierala 	;
573009ea47eSEdward Tomasz Napierala 
574009ea47eSEdward Tomasz Napierala target_entries:
575009ea47eSEdward Tomasz Napierala 	|
576009ea47eSEdward Tomasz Napierala 	target_entries target_entry
577f9488580SEdward Tomasz Napierala 	|
578f9488580SEdward Tomasz Napierala 	target_entries target_entry SEMICOLON
579009ea47eSEdward Tomasz Napierala 	;
580009ea47eSEdward Tomasz Napierala 
581009ea47eSEdward Tomasz Napierala target_entry:
582e1c0d0d8SEdward Tomasz Napierala 	target_alias
583009ea47eSEdward Tomasz Napierala 	|
584e1c0d0d8SEdward Tomasz Napierala 	target_auth_group
585009ea47eSEdward Tomasz Napierala 	|
586df9900fbSEdward Tomasz Napierala 	target_auth_type
587df9900fbSEdward Tomasz Napierala 	|
588e1c0d0d8SEdward Tomasz Napierala 	target_chap
589009ea47eSEdward Tomasz Napierala 	|
590e1c0d0d8SEdward Tomasz Napierala 	target_chap_mutual
591009ea47eSEdward Tomasz Napierala 	|
592e1c0d0d8SEdward Tomasz Napierala 	target_initiator_name
5938cb2e958SEdward Tomasz Napierala 	|
594e1c0d0d8SEdward Tomasz Napierala 	target_initiator_portal
5958cb2e958SEdward Tomasz Napierala 	|
596e1c0d0d8SEdward Tomasz Napierala 	target_portal_group
597009ea47eSEdward Tomasz Napierala 	|
598057abcb0SAlexander Motin 	target_port
599057abcb0SAlexander Motin 	|
6006dbdbf82SEdward Tomasz Napierala 	target_redirect
6016dbdbf82SEdward Tomasz Napierala 	|
602e1c0d0d8SEdward Tomasz Napierala 	target_lun
603920c6cbaSAlexander Motin 	|
604920c6cbaSAlexander Motin 	target_lun_ref
605009ea47eSEdward Tomasz Napierala 	;
606009ea47eSEdward Tomasz Napierala 
607e1c0d0d8SEdward Tomasz Napierala target_alias:	ALIAS STR
608009ea47eSEdward Tomasz Napierala 	{
609009ea47eSEdward Tomasz Napierala 		if (target->t_alias != NULL) {
610009ea47eSEdward Tomasz Napierala 			log_warnx("alias for target \"%s\" "
611f7ae5bf8SEdward Tomasz Napierala 			    "specified more than once", target->t_name);
612*6de7a0d6SJohn Baldwin 			free($2);
613009ea47eSEdward Tomasz Napierala 			return (1);
614009ea47eSEdward Tomasz Napierala 		}
615009ea47eSEdward Tomasz Napierala 		target->t_alias = $2;
616009ea47eSEdward Tomasz Napierala 	}
617009ea47eSEdward Tomasz Napierala 	;
618009ea47eSEdward Tomasz Napierala 
619e1c0d0d8SEdward Tomasz Napierala target_auth_group:	AUTH_GROUP STR
620009ea47eSEdward Tomasz Napierala 	{
621009ea47eSEdward Tomasz Napierala 		if (target->t_auth_group != NULL) {
622009ea47eSEdward Tomasz Napierala 			if (target->t_auth_group->ag_name != NULL)
623009ea47eSEdward Tomasz Napierala 				log_warnx("auth-group for target \"%s\" "
624f7ae5bf8SEdward Tomasz Napierala 				    "specified more than once", target->t_name);
625009ea47eSEdward Tomasz Napierala 			else
626df9900fbSEdward Tomasz Napierala 				log_warnx("cannot use both auth-group and explicit "
627009ea47eSEdward Tomasz Napierala 				    "authorisations for target \"%s\"",
628f7ae5bf8SEdward Tomasz Napierala 				    target->t_name);
629*6de7a0d6SJohn Baldwin 			free($2);
630009ea47eSEdward Tomasz Napierala 			return (1);
631009ea47eSEdward Tomasz Napierala 		}
632009ea47eSEdward Tomasz Napierala 		target->t_auth_group = auth_group_find(conf, $2);
633009ea47eSEdward Tomasz Napierala 		if (target->t_auth_group == NULL) {
634009ea47eSEdward Tomasz Napierala 			log_warnx("unknown auth-group \"%s\" for target "
635f7ae5bf8SEdward Tomasz Napierala 			    "\"%s\"", $2, target->t_name);
636*6de7a0d6SJohn Baldwin 			free($2);
637009ea47eSEdward Tomasz Napierala 			return (1);
638009ea47eSEdward Tomasz Napierala 		}
639009ea47eSEdward Tomasz Napierala 		free($2);
640009ea47eSEdward Tomasz Napierala 	}
641009ea47eSEdward Tomasz Napierala 	;
642009ea47eSEdward Tomasz Napierala 
643df9900fbSEdward Tomasz Napierala target_auth_type:	AUTH_TYPE STR
644df9900fbSEdward Tomasz Napierala 	{
645450a84c2SJohn Baldwin 		bool ok;
646df9900fbSEdward Tomasz Napierala 
647df9900fbSEdward Tomasz Napierala 		if (target->t_auth_group != NULL) {
648df9900fbSEdward Tomasz Napierala 			if (target->t_auth_group->ag_name != NULL) {
649df9900fbSEdward Tomasz Napierala 				log_warnx("cannot use both auth-group and "
650df9900fbSEdward Tomasz Napierala 				    "auth-type for target \"%s\"",
651df9900fbSEdward Tomasz Napierala 				    target->t_name);
652*6de7a0d6SJohn Baldwin 				free($2);
653df9900fbSEdward Tomasz Napierala 				return (1);
654df9900fbSEdward Tomasz Napierala 			}
655df9900fbSEdward Tomasz Napierala 		} else {
656df9900fbSEdward Tomasz Napierala 			target->t_auth_group = auth_group_new(conf, NULL);
657df9900fbSEdward Tomasz Napierala 			if (target->t_auth_group == NULL) {
658df9900fbSEdward Tomasz Napierala 				free($2);
659df9900fbSEdward Tomasz Napierala 				return (1);
660df9900fbSEdward Tomasz Napierala 			}
661df9900fbSEdward Tomasz Napierala 			target->t_auth_group->ag_target = target;
662df9900fbSEdward Tomasz Napierala 		}
663450a84c2SJohn Baldwin 		ok = auth_group_set_type(target->t_auth_group, $2);
664df9900fbSEdward Tomasz Napierala 		free($2);
665450a84c2SJohn Baldwin 		if (!ok)
666df9900fbSEdward Tomasz Napierala 			return (1);
667df9900fbSEdward Tomasz Napierala 	}
668df9900fbSEdward Tomasz Napierala 	;
669df9900fbSEdward Tomasz Napierala 
670e1c0d0d8SEdward Tomasz Napierala target_chap:	CHAP STR STR
671009ea47eSEdward Tomasz Napierala 	{
672009ea47eSEdward Tomasz Napierala 		const struct auth *ca;
673009ea47eSEdward Tomasz Napierala 
674009ea47eSEdward Tomasz Napierala 		if (target->t_auth_group != NULL) {
675009ea47eSEdward Tomasz Napierala 			if (target->t_auth_group->ag_name != NULL) {
676df9900fbSEdward Tomasz Napierala 				log_warnx("cannot use both auth-group and "
677df9900fbSEdward Tomasz Napierala 				    "chap for target \"%s\"",
678f7ae5bf8SEdward Tomasz Napierala 				    target->t_name);
679009ea47eSEdward Tomasz Napierala 				free($2);
680009ea47eSEdward Tomasz Napierala 				free($3);
681009ea47eSEdward Tomasz Napierala 				return (1);
682009ea47eSEdward Tomasz Napierala 			}
683009ea47eSEdward Tomasz Napierala 		} else {
684009ea47eSEdward Tomasz Napierala 			target->t_auth_group = auth_group_new(conf, NULL);
685009ea47eSEdward Tomasz Napierala 			if (target->t_auth_group == NULL) {
686009ea47eSEdward Tomasz Napierala 				free($2);
687009ea47eSEdward Tomasz Napierala 				free($3);
688009ea47eSEdward Tomasz Napierala 				return (1);
689009ea47eSEdward Tomasz Napierala 			}
690009ea47eSEdward Tomasz Napierala 			target->t_auth_group->ag_target = target;
691009ea47eSEdward Tomasz Napierala 		}
692009ea47eSEdward Tomasz Napierala 		ca = auth_new_chap(target->t_auth_group, $2, $3);
693009ea47eSEdward Tomasz Napierala 		free($2);
694009ea47eSEdward Tomasz Napierala 		free($3);
695009ea47eSEdward Tomasz Napierala 		if (ca == NULL)
696009ea47eSEdward Tomasz Napierala 			return (1);
697009ea47eSEdward Tomasz Napierala 	}
698009ea47eSEdward Tomasz Napierala 	;
699009ea47eSEdward Tomasz Napierala 
700e1c0d0d8SEdward Tomasz Napierala target_chap_mutual:	CHAP_MUTUAL STR STR STR STR
701009ea47eSEdward Tomasz Napierala 	{
702009ea47eSEdward Tomasz Napierala 		const struct auth *ca;
703009ea47eSEdward Tomasz Napierala 
704009ea47eSEdward Tomasz Napierala 		if (target->t_auth_group != NULL) {
705009ea47eSEdward Tomasz Napierala 			if (target->t_auth_group->ag_name != NULL) {
706df9900fbSEdward Tomasz Napierala 				log_warnx("cannot use both auth-group and "
707df9900fbSEdward Tomasz Napierala 				    "chap-mutual for target \"%s\"",
708f7ae5bf8SEdward Tomasz Napierala 				    target->t_name);
709009ea47eSEdward Tomasz Napierala 				free($2);
710009ea47eSEdward Tomasz Napierala 				free($3);
711009ea47eSEdward Tomasz Napierala 				free($4);
712009ea47eSEdward Tomasz Napierala 				free($5);
713009ea47eSEdward Tomasz Napierala 				return (1);
714009ea47eSEdward Tomasz Napierala 			}
715009ea47eSEdward Tomasz Napierala 		} else {
716009ea47eSEdward Tomasz Napierala 			target->t_auth_group = auth_group_new(conf, NULL);
717009ea47eSEdward Tomasz Napierala 			if (target->t_auth_group == NULL) {
718009ea47eSEdward Tomasz Napierala 				free($2);
719009ea47eSEdward Tomasz Napierala 				free($3);
720009ea47eSEdward Tomasz Napierala 				free($4);
721009ea47eSEdward Tomasz Napierala 				free($5);
722009ea47eSEdward Tomasz Napierala 				return (1);
723009ea47eSEdward Tomasz Napierala 			}
724009ea47eSEdward Tomasz Napierala 			target->t_auth_group->ag_target = target;
725009ea47eSEdward Tomasz Napierala 		}
726009ea47eSEdward Tomasz Napierala 		ca = auth_new_chap_mutual(target->t_auth_group,
727009ea47eSEdward Tomasz Napierala 		    $2, $3, $4, $5);
728009ea47eSEdward Tomasz Napierala 		free($2);
729009ea47eSEdward Tomasz Napierala 		free($3);
730009ea47eSEdward Tomasz Napierala 		free($4);
731009ea47eSEdward Tomasz Napierala 		free($5);
732009ea47eSEdward Tomasz Napierala 		if (ca == NULL)
733009ea47eSEdward Tomasz Napierala 			return (1);
734009ea47eSEdward Tomasz Napierala 	}
735009ea47eSEdward Tomasz Napierala 	;
736009ea47eSEdward Tomasz Napierala 
737e1c0d0d8SEdward Tomasz Napierala target_initiator_name:	INITIATOR_NAME STR
7388cb2e958SEdward Tomasz Napierala 	{
7398cb2e958SEdward Tomasz Napierala 		const struct auth_name *an;
7408cb2e958SEdward Tomasz Napierala 
7418cb2e958SEdward Tomasz Napierala 		if (target->t_auth_group != NULL) {
7428cb2e958SEdward Tomasz Napierala 			if (target->t_auth_group->ag_name != NULL) {
743df9900fbSEdward Tomasz Napierala 				log_warnx("cannot use both auth-group and "
7448cb2e958SEdward Tomasz Napierala 				    "initiator-name for target \"%s\"",
745f7ae5bf8SEdward Tomasz Napierala 				    target->t_name);
7468cb2e958SEdward Tomasz Napierala 				free($2);
7478cb2e958SEdward Tomasz Napierala 				return (1);
7488cb2e958SEdward Tomasz Napierala 			}
7498cb2e958SEdward Tomasz Napierala 		} else {
7508cb2e958SEdward Tomasz Napierala 			target->t_auth_group = auth_group_new(conf, NULL);
7518cb2e958SEdward Tomasz Napierala 			if (target->t_auth_group == NULL) {
7528cb2e958SEdward Tomasz Napierala 				free($2);
7538cb2e958SEdward Tomasz Napierala 				return (1);
7548cb2e958SEdward Tomasz Napierala 			}
7558cb2e958SEdward Tomasz Napierala 			target->t_auth_group->ag_target = target;
7568cb2e958SEdward Tomasz Napierala 		}
7578cb2e958SEdward Tomasz Napierala 		an = auth_name_new(target->t_auth_group, $2);
7588cb2e958SEdward Tomasz Napierala 		free($2);
7598cb2e958SEdward Tomasz Napierala 		if (an == NULL)
7608cb2e958SEdward Tomasz Napierala 			return (1);
7618cb2e958SEdward Tomasz Napierala 	}
7628cb2e958SEdward Tomasz Napierala 	;
7638cb2e958SEdward Tomasz Napierala 
764e1c0d0d8SEdward Tomasz Napierala target_initiator_portal:	INITIATOR_PORTAL STR
7658cb2e958SEdward Tomasz Napierala 	{
7668cb2e958SEdward Tomasz Napierala 		const struct auth_portal *ap;
7678cb2e958SEdward Tomasz Napierala 
7688cb2e958SEdward Tomasz Napierala 		if (target->t_auth_group != NULL) {
7698cb2e958SEdward Tomasz Napierala 			if (target->t_auth_group->ag_name != NULL) {
770df9900fbSEdward Tomasz Napierala 				log_warnx("cannot use both auth-group and "
7718cb2e958SEdward Tomasz Napierala 				    "initiator-portal for target \"%s\"",
772f7ae5bf8SEdward Tomasz Napierala 				    target->t_name);
7738cb2e958SEdward Tomasz Napierala 				free($2);
7748cb2e958SEdward Tomasz Napierala 				return (1);
7758cb2e958SEdward Tomasz Napierala 			}
7768cb2e958SEdward Tomasz Napierala 		} else {
7778cb2e958SEdward Tomasz Napierala 			target->t_auth_group = auth_group_new(conf, NULL);
7788cb2e958SEdward Tomasz Napierala 			if (target->t_auth_group == NULL) {
7798cb2e958SEdward Tomasz Napierala 				free($2);
7808cb2e958SEdward Tomasz Napierala 				return (1);
7818cb2e958SEdward Tomasz Napierala 			}
7828cb2e958SEdward Tomasz Napierala 			target->t_auth_group->ag_target = target;
7838cb2e958SEdward Tomasz Napierala 		}
7848cb2e958SEdward Tomasz Napierala 		ap = auth_portal_new(target->t_auth_group, $2);
7858cb2e958SEdward Tomasz Napierala 		free($2);
7868cb2e958SEdward Tomasz Napierala 		if (ap == NULL)
7878cb2e958SEdward Tomasz Napierala 			return (1);
7888cb2e958SEdward Tomasz Napierala 	}
7898cb2e958SEdward Tomasz Napierala 	;
7908cb2e958SEdward Tomasz Napierala 
79192847ee1SAlexander Motin target_portal_group:	PORTAL_GROUP STR STR
792009ea47eSEdward Tomasz Napierala 	{
79392847ee1SAlexander Motin 		struct portal_group *tpg;
79492847ee1SAlexander Motin 		struct auth_group *tag;
79592847ee1SAlexander Motin 		struct port *tp;
79692847ee1SAlexander Motin 
79792847ee1SAlexander Motin 		tpg = portal_group_find(conf, $2);
79892847ee1SAlexander Motin 		if (tpg == NULL) {
79992847ee1SAlexander Motin 			log_warnx("unknown portal-group \"%s\" for target "
80092847ee1SAlexander Motin 			    "\"%s\"", $2, target->t_name);
80192847ee1SAlexander Motin 			free($2);
80292847ee1SAlexander Motin 			free($3);
80392847ee1SAlexander Motin 			return (1);
80492847ee1SAlexander Motin 		}
805*6de7a0d6SJohn Baldwin 		free($2);
80692847ee1SAlexander Motin 		tag = auth_group_find(conf, $3);
80792847ee1SAlexander Motin 		if (tag == NULL) {
80892847ee1SAlexander Motin 			log_warnx("unknown auth-group \"%s\" for target "
80992847ee1SAlexander Motin 			    "\"%s\"", $3, target->t_name);
81092847ee1SAlexander Motin 			free($3);
81192847ee1SAlexander Motin 			return (1);
81292847ee1SAlexander Motin 		}
813*6de7a0d6SJohn Baldwin 		free($3);
81492847ee1SAlexander Motin 		tp = port_new(conf, target, tpg);
81592847ee1SAlexander Motin 		if (tp == NULL) {
81692847ee1SAlexander Motin 			log_warnx("can't link portal-group \"%s\" to target "
817*6de7a0d6SJohn Baldwin 			    "\"%s\"", tpg->pg_name, target->t_name);
818009ea47eSEdward Tomasz Napierala 			return (1);
819009ea47eSEdward Tomasz Napierala 		}
82092847ee1SAlexander Motin 		tp->p_auth_group = tag;
82192847ee1SAlexander Motin 	}
82292847ee1SAlexander Motin 	|		PORTAL_GROUP STR
82392847ee1SAlexander Motin 	{
82492847ee1SAlexander Motin 		struct portal_group *tpg;
82592847ee1SAlexander Motin 		struct port *tp;
82692847ee1SAlexander Motin 
82792847ee1SAlexander Motin 		tpg = portal_group_find(conf, $2);
82892847ee1SAlexander Motin 		if (tpg == NULL) {
829009ea47eSEdward Tomasz Napierala 			log_warnx("unknown portal-group \"%s\" for target "
830f7ae5bf8SEdward Tomasz Napierala 			    "\"%s\"", $2, target->t_name);
831009ea47eSEdward Tomasz Napierala 			free($2);
832009ea47eSEdward Tomasz Napierala 			return (1);
833009ea47eSEdward Tomasz Napierala 		}
834*6de7a0d6SJohn Baldwin 		free($2);
83592847ee1SAlexander Motin 		tp = port_new(conf, target, tpg);
83692847ee1SAlexander Motin 		if (tp == NULL) {
83792847ee1SAlexander Motin 			log_warnx("can't link portal-group \"%s\" to target "
838*6de7a0d6SJohn Baldwin 			    "\"%s\"", tpg->pg_name, target->t_name);
83992847ee1SAlexander Motin 			return (1);
84092847ee1SAlexander Motin 		}
841009ea47eSEdward Tomasz Napierala 	}
842009ea47eSEdward Tomasz Napierala 	;
843009ea47eSEdward Tomasz Napierala 
844057abcb0SAlexander Motin target_port:	PORT STR
845057abcb0SAlexander Motin 	{
846969876fcSAlan Somers 		target->t_pport = strdup($2);
8478951f055SMarcelo Araujo 
848057abcb0SAlexander Motin 		free($2);
849057abcb0SAlexander Motin 	}
850057abcb0SAlexander Motin 	;
851057abcb0SAlexander Motin 
8526dbdbf82SEdward Tomasz Napierala target_redirect:	REDIRECT STR
8536dbdbf82SEdward Tomasz Napierala 	{
854450a84c2SJohn Baldwin 		bool ok;
8556dbdbf82SEdward Tomasz Napierala 
856450a84c2SJohn Baldwin 		ok = target_set_redirection(target, $2);
8576dbdbf82SEdward Tomasz Napierala 		free($2);
858450a84c2SJohn Baldwin 		if (!ok)
8596dbdbf82SEdward Tomasz Napierala 			return (1);
8606dbdbf82SEdward Tomasz Napierala 	}
8616dbdbf82SEdward Tomasz Napierala 	;
8626dbdbf82SEdward Tomasz Napierala 
863e1c0d0d8SEdward Tomasz Napierala target_lun:	LUN lun_number
864e1c0d0d8SEdward Tomasz Napierala     OPENING_BRACKET lun_entries CLOSING_BRACKET
865009ea47eSEdward Tomasz Napierala 	{
866009ea47eSEdward Tomasz Napierala 		lun = NULL;
867009ea47eSEdward Tomasz Napierala 	}
868009ea47eSEdward Tomasz Napierala 	;
869009ea47eSEdward Tomasz Napierala 
8704524db57SEdward Tomasz Napierala lun_number:	STR
871009ea47eSEdward Tomasz Napierala 	{
8724524db57SEdward Tomasz Napierala 		uint64_t tmp;
873f584f51dSEdward Tomasz Napierala 		int ret;
874920c6cbaSAlexander Motin 		char *name;
8754524db57SEdward Tomasz Napierala 
8764524db57SEdward Tomasz Napierala 		if (expand_number($1, &tmp) != 0) {
877d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
8784524db57SEdward Tomasz Napierala 			free($1);
8794524db57SEdward Tomasz Napierala 			return (1);
8804524db57SEdward Tomasz Napierala 		}
881*6de7a0d6SJohn Baldwin 		free($1);
882dad99db2SAlexander Motin 		if (tmp >= MAX_LUNS) {
883dad99db2SAlexander Motin 			yyerror("LU number is too big");
884dad99db2SAlexander Motin 			return (1);
885dad99db2SAlexander Motin 		}
8864524db57SEdward Tomasz Napierala 
887f584f51dSEdward Tomasz Napierala 		ret = asprintf(&name, "%s,lun,%ju", target->t_name, tmp);
888f584f51dSEdward Tomasz Napierala 		if (ret <= 0)
889f584f51dSEdward Tomasz Napierala 			log_err(1, "asprintf");
890920c6cbaSAlexander Motin 		lun = lun_new(conf, name);
891009ea47eSEdward Tomasz Napierala 		if (lun == NULL)
892009ea47eSEdward Tomasz Napierala 			return (1);
893920c6cbaSAlexander Motin 
894920c6cbaSAlexander Motin 		lun_set_scsiname(lun, name);
895920c6cbaSAlexander Motin 		target->t_luns[tmp] = lun;
896920c6cbaSAlexander Motin 	}
897920c6cbaSAlexander Motin 	;
898920c6cbaSAlexander Motin 
899920c6cbaSAlexander Motin target_lun_ref:	LUN STR STR
900920c6cbaSAlexander Motin 	{
901920c6cbaSAlexander Motin 		uint64_t tmp;
902920c6cbaSAlexander Motin 
903920c6cbaSAlexander Motin 		if (expand_number($2, &tmp) != 0) {
904920c6cbaSAlexander Motin 			yyerror("invalid numeric value");
905920c6cbaSAlexander Motin 			free($2);
906920c6cbaSAlexander Motin 			free($3);
907920c6cbaSAlexander Motin 			return (1);
908920c6cbaSAlexander Motin 		}
909920c6cbaSAlexander Motin 		free($2);
910dad99db2SAlexander Motin 		if (tmp >= MAX_LUNS) {
911dad99db2SAlexander Motin 			yyerror("LU number is too big");
912dad99db2SAlexander Motin 			free($3);
913dad99db2SAlexander Motin 			return (1);
914dad99db2SAlexander Motin 		}
915920c6cbaSAlexander Motin 
916920c6cbaSAlexander Motin 		lun = lun_find(conf, $3);
917920c6cbaSAlexander Motin 		free($3);
918920c6cbaSAlexander Motin 		if (lun == NULL)
919920c6cbaSAlexander Motin 			return (1);
920920c6cbaSAlexander Motin 
921920c6cbaSAlexander Motin 		target->t_luns[tmp] = lun;
922009ea47eSEdward Tomasz Napierala 	}
923009ea47eSEdward Tomasz Napierala 	;
924009ea47eSEdward Tomasz Napierala 
925e1c0d0d8SEdward Tomasz Napierala lun_entries:
926009ea47eSEdward Tomasz Napierala 	|
927e1c0d0d8SEdward Tomasz Napierala 	lun_entries lun_entry
928f9488580SEdward Tomasz Napierala 	|
929f9488580SEdward Tomasz Napierala 	lun_entries lun_entry SEMICOLON
930009ea47eSEdward Tomasz Napierala 	;
931009ea47eSEdward Tomasz Napierala 
932e1c0d0d8SEdward Tomasz Napierala lun_entry:
933e1c0d0d8SEdward Tomasz Napierala 	lun_backend
934009ea47eSEdward Tomasz Napierala 	|
935e1c0d0d8SEdward Tomasz Napierala 	lun_blocksize
936009ea47eSEdward Tomasz Napierala 	|
937e1c0d0d8SEdward Tomasz Napierala 	lun_device_id
938009ea47eSEdward Tomasz Napierala 	|
93991be33dcSAlexander Motin 	lun_device_type
94091be33dcSAlexander Motin 	|
9413933f7b1SAlexander Motin 	lun_ctl_lun
9423933f7b1SAlexander Motin 	|
943e1c0d0d8SEdward Tomasz Napierala 	lun_option
944009ea47eSEdward Tomasz Napierala 	|
945e1c0d0d8SEdward Tomasz Napierala 	lun_path
946009ea47eSEdward Tomasz Napierala 	|
947e1c0d0d8SEdward Tomasz Napierala 	lun_serial
948009ea47eSEdward Tomasz Napierala 	|
949e1c0d0d8SEdward Tomasz Napierala 	lun_size
950009ea47eSEdward Tomasz Napierala 	;
951009ea47eSEdward Tomasz Napierala 
952e1c0d0d8SEdward Tomasz Napierala lun_backend:	BACKEND STR
953009ea47eSEdward Tomasz Napierala 	{
954009ea47eSEdward Tomasz Napierala 		if (lun->l_backend != NULL) {
955920c6cbaSAlexander Motin 			log_warnx("backend for lun \"%s\" "
956009ea47eSEdward Tomasz Napierala 			    "specified more than once",
957920c6cbaSAlexander Motin 			    lun->l_name);
958009ea47eSEdward Tomasz Napierala 			free($2);
959009ea47eSEdward Tomasz Napierala 			return (1);
960009ea47eSEdward Tomasz Napierala 		}
961009ea47eSEdward Tomasz Napierala 		lun_set_backend(lun, $2);
962009ea47eSEdward Tomasz Napierala 		free($2);
963009ea47eSEdward Tomasz Napierala 	}
964009ea47eSEdward Tomasz Napierala 	;
965009ea47eSEdward Tomasz Napierala 
9664524db57SEdward Tomasz Napierala lun_blocksize:	BLOCKSIZE STR
967009ea47eSEdward Tomasz Napierala 	{
9684524db57SEdward Tomasz Napierala 		uint64_t tmp;
9694524db57SEdward Tomasz Napierala 
9704524db57SEdward Tomasz Napierala 		if (expand_number($2, &tmp) != 0) {
971d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
9724524db57SEdward Tomasz Napierala 			free($2);
9734524db57SEdward Tomasz Napierala 			return (1);
9744524db57SEdward Tomasz Napierala 		}
975*6de7a0d6SJohn Baldwin 		free($2);
9764524db57SEdward Tomasz Napierala 
977009ea47eSEdward Tomasz Napierala 		if (lun->l_blocksize != 0) {
978920c6cbaSAlexander Motin 			log_warnx("blocksize for lun \"%s\" "
979009ea47eSEdward Tomasz Napierala 			    "specified more than once",
980920c6cbaSAlexander Motin 			    lun->l_name);
981009ea47eSEdward Tomasz Napierala 			return (1);
982009ea47eSEdward Tomasz Napierala 		}
9834524db57SEdward Tomasz Napierala 		lun_set_blocksize(lun, tmp);
984009ea47eSEdward Tomasz Napierala 	}
985009ea47eSEdward Tomasz Napierala 	;
986009ea47eSEdward Tomasz Napierala 
987e1c0d0d8SEdward Tomasz Napierala lun_device_id:	DEVICE_ID STR
988009ea47eSEdward Tomasz Napierala 	{
989009ea47eSEdward Tomasz Napierala 		if (lun->l_device_id != NULL) {
990920c6cbaSAlexander Motin 			log_warnx("device_id for lun \"%s\" "
991009ea47eSEdward Tomasz Napierala 			    "specified more than once",
992920c6cbaSAlexander Motin 			    lun->l_name);
993009ea47eSEdward Tomasz Napierala 			free($2);
994009ea47eSEdward Tomasz Napierala 			return (1);
995009ea47eSEdward Tomasz Napierala 		}
996009ea47eSEdward Tomasz Napierala 		lun_set_device_id(lun, $2);
997009ea47eSEdward Tomasz Napierala 		free($2);
998009ea47eSEdward Tomasz Napierala 	}
999009ea47eSEdward Tomasz Napierala 	;
1000009ea47eSEdward Tomasz Napierala 
100191be33dcSAlexander Motin lun_device_type:	DEVICE_TYPE STR
100291be33dcSAlexander Motin 	{
100391be33dcSAlexander Motin 		uint64_t tmp;
100491be33dcSAlexander Motin 
100591be33dcSAlexander Motin 		if (strcasecmp($2, "disk") == 0 ||
100691be33dcSAlexander Motin 		    strcasecmp($2, "direct") == 0)
100791be33dcSAlexander Motin 			tmp = 0;
100891be33dcSAlexander Motin 		else if (strcasecmp($2, "processor") == 0)
100991be33dcSAlexander Motin 			tmp = 3;
101091be33dcSAlexander Motin 		else if (strcasecmp($2, "cd") == 0 ||
101191be33dcSAlexander Motin 		    strcasecmp($2, "cdrom") == 0 ||
101291be33dcSAlexander Motin 		    strcasecmp($2, "dvd") == 0 ||
101391be33dcSAlexander Motin 		    strcasecmp($2, "dvdrom") == 0)
101491be33dcSAlexander Motin 			tmp = 5;
101591be33dcSAlexander Motin 		else if (expand_number($2, &tmp) != 0 ||
101691be33dcSAlexander Motin 		    tmp > 15) {
101791be33dcSAlexander Motin 			yyerror("invalid numeric value");
101891be33dcSAlexander Motin 			free($2);
101991be33dcSAlexander Motin 			return (1);
102091be33dcSAlexander Motin 		}
1021*6de7a0d6SJohn Baldwin 		free($2);
102291be33dcSAlexander Motin 
102391be33dcSAlexander Motin 		lun_set_device_type(lun, tmp);
102491be33dcSAlexander Motin 	}
102591be33dcSAlexander Motin 	;
102691be33dcSAlexander Motin 
10273933f7b1SAlexander Motin lun_ctl_lun:	CTL_LUN STR
10283933f7b1SAlexander Motin 	{
10293933f7b1SAlexander Motin 		uint64_t tmp;
10303933f7b1SAlexander Motin 
10313933f7b1SAlexander Motin 		if (expand_number($2, &tmp) != 0) {
10323933f7b1SAlexander Motin 			yyerror("invalid numeric value");
10333933f7b1SAlexander Motin 			free($2);
10343933f7b1SAlexander Motin 			return (1);
10353933f7b1SAlexander Motin 		}
1036*6de7a0d6SJohn Baldwin 		free($2);
10373933f7b1SAlexander Motin 
10383933f7b1SAlexander Motin 		if (lun->l_ctl_lun >= 0) {
10393933f7b1SAlexander Motin 			log_warnx("ctl_lun for lun \"%s\" "
10403933f7b1SAlexander Motin 			    "specified more than once",
10413933f7b1SAlexander Motin 			    lun->l_name);
10423933f7b1SAlexander Motin 			return (1);
10433933f7b1SAlexander Motin 		}
10443933f7b1SAlexander Motin 		lun_set_ctl_lun(lun, tmp);
10453933f7b1SAlexander Motin 	}
10463933f7b1SAlexander Motin 	;
10473933f7b1SAlexander Motin 
1048e1c0d0d8SEdward Tomasz Napierala lun_option:	OPTION STR STR
1049009ea47eSEdward Tomasz Napierala 	{
1050703b03a8SJohn Baldwin 		bool ok;
1051009ea47eSEdward Tomasz Napierala 
1052703b03a8SJohn Baldwin 		ok = option_new(lun->l_options, $2, $3);
1053009ea47eSEdward Tomasz Napierala 		free($2);
1054009ea47eSEdward Tomasz Napierala 		free($3);
1055703b03a8SJohn Baldwin 		if (!ok)
1056009ea47eSEdward Tomasz Napierala 			return (1);
1057009ea47eSEdward Tomasz Napierala 	}
1058009ea47eSEdward Tomasz Napierala 	;
1059009ea47eSEdward Tomasz Napierala 
1060e1c0d0d8SEdward Tomasz Napierala lun_path:	PATH STR
1061009ea47eSEdward Tomasz Napierala 	{
1062009ea47eSEdward Tomasz Napierala 		if (lun->l_path != NULL) {
1063920c6cbaSAlexander Motin 			log_warnx("path for lun \"%s\" "
1064009ea47eSEdward Tomasz Napierala 			    "specified more than once",
1065920c6cbaSAlexander Motin 			    lun->l_name);
1066009ea47eSEdward Tomasz Napierala 			free($2);
1067009ea47eSEdward Tomasz Napierala 			return (1);
1068009ea47eSEdward Tomasz Napierala 		}
1069009ea47eSEdward Tomasz Napierala 		lun_set_path(lun, $2);
1070009ea47eSEdward Tomasz Napierala 		free($2);
1071009ea47eSEdward Tomasz Napierala 	}
1072009ea47eSEdward Tomasz Napierala 	;
1073009ea47eSEdward Tomasz Napierala 
1074e1c0d0d8SEdward Tomasz Napierala lun_serial:	SERIAL STR
1075009ea47eSEdward Tomasz Napierala 	{
1076009ea47eSEdward Tomasz Napierala 		if (lun->l_serial != NULL) {
1077920c6cbaSAlexander Motin 			log_warnx("serial for lun \"%s\" "
1078009ea47eSEdward Tomasz Napierala 			    "specified more than once",
1079920c6cbaSAlexander Motin 			    lun->l_name);
1080009ea47eSEdward Tomasz Napierala 			free($2);
1081009ea47eSEdward Tomasz Napierala 			return (1);
1082009ea47eSEdward Tomasz Napierala 		}
1083009ea47eSEdward Tomasz Napierala 		lun_set_serial(lun, $2);
1084009ea47eSEdward Tomasz Napierala 		free($2);
1085009ea47eSEdward Tomasz Napierala 	}
1086009ea47eSEdward Tomasz Napierala 	;
1087009ea47eSEdward Tomasz Napierala 
10884524db57SEdward Tomasz Napierala lun_size:	SIZE STR
1089009ea47eSEdward Tomasz Napierala 	{
10904524db57SEdward Tomasz Napierala 		uint64_t tmp;
10914524db57SEdward Tomasz Napierala 
10924524db57SEdward Tomasz Napierala 		if (expand_number($2, &tmp) != 0) {
1093d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
10944524db57SEdward Tomasz Napierala 			free($2);
10954524db57SEdward Tomasz Napierala 			return (1);
10964524db57SEdward Tomasz Napierala 		}
1097*6de7a0d6SJohn Baldwin 		free($2);
10984524db57SEdward Tomasz Napierala 
1099009ea47eSEdward Tomasz Napierala 		if (lun->l_size != 0) {
1100920c6cbaSAlexander Motin 			log_warnx("size for lun \"%s\" "
1101009ea47eSEdward Tomasz Napierala 			    "specified more than once",
1102920c6cbaSAlexander Motin 			    lun->l_name);
1103009ea47eSEdward Tomasz Napierala 			return (1);
1104009ea47eSEdward Tomasz Napierala 		}
11054524db57SEdward Tomasz Napierala 		lun_set_size(lun, tmp);
1106009ea47eSEdward Tomasz Napierala 	}
1107009ea47eSEdward Tomasz Napierala 	;
1108009ea47eSEdward Tomasz Napierala %%
1109009ea47eSEdward Tomasz Napierala 
1110009ea47eSEdward Tomasz Napierala void
1111009ea47eSEdward Tomasz Napierala yyerror(const char *str)
1112009ea47eSEdward Tomasz Napierala {
1113009ea47eSEdward Tomasz Napierala 
1114009ea47eSEdward Tomasz Napierala 	log_warnx("error in configuration file at line %d near '%s': %s",
1115009ea47eSEdward Tomasz Napierala 	    lineno, yytext, str);
1116009ea47eSEdward Tomasz Napierala }
1117009ea47eSEdward Tomasz Napierala 
1118450a84c2SJohn Baldwin bool
parse_conf(struct conf * newconf,const char * path)11195c734b04SJakub Wojciech Klama parse_conf(struct conf *newconf, const char *path)
1120009ea47eSEdward Tomasz Napierala {
1121009ea47eSEdward Tomasz Napierala 	int error;
1122009ea47eSEdward Tomasz Napierala 
11235c734b04SJakub Wojciech Klama 	conf = newconf;
1124009ea47eSEdward Tomasz Napierala 	yyin = fopen(path, "r");
1125009ea47eSEdward Tomasz Napierala 	if (yyin == NULL) {
1126009ea47eSEdward Tomasz Napierala 		log_warn("unable to open configuration file %s", path);
1127450a84c2SJohn Baldwin 		return (false);
1128009ea47eSEdward Tomasz Napierala 	}
11295c734b04SJakub Wojciech Klama 
11306dc3a9f4SEdward Tomasz Napierala 	lineno = 1;
1131009ea47eSEdward Tomasz Napierala 	yyrestart(yyin);
1132009ea47eSEdward Tomasz Napierala 	error = yyparse();
1133009ea47eSEdward Tomasz Napierala 	auth_group = NULL;
1134009ea47eSEdward Tomasz Napierala 	portal_group = NULL;
1135009ea47eSEdward Tomasz Napierala 	target = NULL;
1136009ea47eSEdward Tomasz Napierala 	lun = NULL;
1137009ea47eSEdward Tomasz Napierala 	fclose(yyin);
1138009ea47eSEdward Tomasz Napierala 
1139450a84c2SJohn Baldwin 	return (error == 0);
1140009ea47eSEdward Tomasz Napierala }
1141