xref: /freebsd/usr.sbin/ctld/parse.y (revision e72a100b)
1009ea47eSEdward Tomasz Napierala %{
2009ea47eSEdward Tomasz Napierala /*-
31de7b4b8SPedro F. Giffuni  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
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  * $FreeBSD$
32009ea47eSEdward Tomasz Napierala  */
33009ea47eSEdward Tomasz Napierala 
34009ea47eSEdward Tomasz Napierala #include <sys/queue.h>
35009ea47eSEdward Tomasz Napierala #include <sys/types.h>
36009ea47eSEdward Tomasz Napierala #include <sys/stat.h>
37009ea47eSEdward Tomasz Napierala #include <assert.h>
38009ea47eSEdward Tomasz Napierala #include <stdio.h>
39009ea47eSEdward Tomasz Napierala #include <stdlib.h>
40009ea47eSEdward Tomasz Napierala #include <string.h>
41009ea47eSEdward Tomasz Napierala 
42009ea47eSEdward Tomasz Napierala #include "ctld.h"
4364ffe6d4SRichard Scheffenegger #include <netinet/in.h>
4464ffe6d4SRichard Scheffenegger #include <netinet/ip.h>
45009ea47eSEdward Tomasz Napierala 
46009ea47eSEdward Tomasz Napierala extern FILE *yyin;
47009ea47eSEdward Tomasz Napierala extern char *yytext;
48009ea47eSEdward Tomasz Napierala extern int lineno;
49009ea47eSEdward Tomasz Napierala 
50009ea47eSEdward Tomasz Napierala static struct conf *conf = NULL;
51009ea47eSEdward Tomasz Napierala static struct auth_group *auth_group = NULL;
52009ea47eSEdward Tomasz Napierala static struct portal_group *portal_group = NULL;
53009ea47eSEdward Tomasz Napierala static struct target *target = NULL;
54009ea47eSEdward Tomasz Napierala static struct lun *lun = NULL;
55009ea47eSEdward Tomasz Napierala 
56009ea47eSEdward Tomasz Napierala extern void	yyerror(const char *);
57009ea47eSEdward Tomasz Napierala extern void	yyrestart(FILE *);
58009ea47eSEdward Tomasz Napierala 
59009ea47eSEdward Tomasz Napierala %}
60009ea47eSEdward Tomasz Napierala 
61df9900fbSEdward Tomasz Napierala %token ALIAS AUTH_GROUP AUTH_TYPE BACKEND BLOCKSIZE CHAP CHAP_MUTUAL
6291be33dcSAlexander Motin %token CLOSING_BRACKET CTL_LUN DEBUG DEVICE_ID DEVICE_TYPE
6364ffe6d4SRichard Scheffenegger %token DISCOVERY_AUTH_GROUP DISCOVERY_FILTER DSCP FOREIGN
64dbb1ee18SEdward Tomasz Napierala %token INITIATOR_NAME INITIATOR_PORTAL ISNS_SERVER ISNS_PERIOD ISNS_TIMEOUT
6507b49a3eSEdward Tomasz Napierala %token LISTEN LISTEN_ISER LUN MAXPROC OFFLOAD OPENING_BRACKET OPTION
66ea8f1280SRichard Scheffenegger %token PATH PCP PIDFILE PORT PORTAL_GROUP REDIRECT SEMICOLON SERIAL
67ea8f1280SRichard Scheffenegger %token SIZE STR TAG TARGET TIMEOUT
6864ffe6d4SRichard Scheffenegger %token AF11 AF12 AF13 AF21 AF22 AF23 AF31 AF32 AF33 AF41 AF42 AF43
6964ffe6d4SRichard Scheffenegger %token BE EF CS0 CS1 CS2 CS3 CS4 CS5 CS6 CS7
70009ea47eSEdward Tomasz Napierala 
71009ea47eSEdward Tomasz Napierala %union
72009ea47eSEdward Tomasz Napierala {
73009ea47eSEdward Tomasz Napierala 	char *str;
74009ea47eSEdward Tomasz Napierala }
75009ea47eSEdward Tomasz Napierala 
76009ea47eSEdward Tomasz Napierala %token <str> STR
77009ea47eSEdward Tomasz Napierala 
78009ea47eSEdward Tomasz Napierala %%
79009ea47eSEdward Tomasz Napierala 
80009ea47eSEdward Tomasz Napierala statements:
81009ea47eSEdward Tomasz Napierala 	|
82009ea47eSEdward Tomasz Napierala 	statements statement
83f9488580SEdward Tomasz Napierala 	|
84f9488580SEdward Tomasz Napierala 	statements statement SEMICOLON
85009ea47eSEdward Tomasz Napierala 	;
86009ea47eSEdward Tomasz Napierala 
87009ea47eSEdward Tomasz Napierala statement:
88e1c0d0d8SEdward Tomasz Napierala 	debug
89009ea47eSEdward Tomasz Napierala 	|
90e1c0d0d8SEdward Tomasz Napierala 	timeout
91009ea47eSEdward Tomasz Napierala 	|
92e1c0d0d8SEdward Tomasz Napierala 	maxproc
93009ea47eSEdward Tomasz Napierala 	|
94e1c0d0d8SEdward Tomasz Napierala 	pidfile
95009ea47eSEdward Tomasz Napierala 	|
96829603e2SAlexander Motin 	isns_server
97829603e2SAlexander Motin 	|
98829603e2SAlexander Motin 	isns_period
99829603e2SAlexander Motin 	|
100829603e2SAlexander Motin 	isns_timeout
101829603e2SAlexander Motin 	|
102e1c0d0d8SEdward Tomasz Napierala 	auth_group
103009ea47eSEdward Tomasz Napierala 	|
104e1c0d0d8SEdward Tomasz Napierala 	portal_group
105009ea47eSEdward Tomasz Napierala 	|
106920c6cbaSAlexander Motin 	lun
107920c6cbaSAlexander Motin 	|
108e1c0d0d8SEdward Tomasz Napierala 	target
109009ea47eSEdward Tomasz Napierala 	;
110009ea47eSEdward Tomasz Napierala 
1114524db57SEdward Tomasz Napierala debug:		DEBUG STR
112009ea47eSEdward Tomasz Napierala 	{
1134524db57SEdward Tomasz Napierala 		uint64_t tmp;
1144524db57SEdward Tomasz Napierala 
1154524db57SEdward Tomasz Napierala 		if (expand_number($2, &tmp) != 0) {
116d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
1174524db57SEdward Tomasz Napierala 			free($2);
1184524db57SEdward Tomasz Napierala 			return (1);
1194524db57SEdward Tomasz Napierala 		}
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 		}
1344524db57SEdward Tomasz Napierala 
1354524db57SEdward Tomasz Napierala 		conf->conf_timeout = tmp;
136009ea47eSEdward Tomasz Napierala 	}
137009ea47eSEdward Tomasz Napierala 	;
138009ea47eSEdward Tomasz Napierala 
1394524db57SEdward Tomasz Napierala maxproc:	MAXPROC STR
140009ea47eSEdward Tomasz Napierala 	{
1414524db57SEdward Tomasz Napierala 		uint64_t tmp;
1424524db57SEdward Tomasz Napierala 
1434524db57SEdward Tomasz Napierala 		if (expand_number($2, &tmp) != 0) {
144d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
1454524db57SEdward Tomasz Napierala 			free($2);
1464524db57SEdward Tomasz Napierala 			return (1);
1474524db57SEdward Tomasz Napierala 		}
1484524db57SEdward Tomasz Napierala 
1494524db57SEdward Tomasz Napierala 		conf->conf_maxproc = tmp;
150009ea47eSEdward Tomasz Napierala 	}
151009ea47eSEdward Tomasz Napierala 	;
152009ea47eSEdward Tomasz Napierala 
153e1c0d0d8SEdward Tomasz Napierala pidfile:	PIDFILE STR
154009ea47eSEdward Tomasz Napierala 	{
155009ea47eSEdward Tomasz Napierala 		if (conf->conf_pidfile_path != NULL) {
156009ea47eSEdward Tomasz Napierala 			log_warnx("pidfile specified more than once");
157009ea47eSEdward Tomasz Napierala 			free($2);
158009ea47eSEdward Tomasz Napierala 			return (1);
159009ea47eSEdward Tomasz Napierala 		}
160009ea47eSEdward Tomasz Napierala 		conf->conf_pidfile_path = $2;
161009ea47eSEdward Tomasz Napierala 	}
162009ea47eSEdward Tomasz Napierala 	;
163009ea47eSEdward Tomasz Napierala 
164829603e2SAlexander Motin isns_server:	ISNS_SERVER STR
165829603e2SAlexander Motin 	{
166829603e2SAlexander Motin 		int error;
167829603e2SAlexander Motin 
168829603e2SAlexander Motin 		error = isns_new(conf, $2);
169829603e2SAlexander Motin 		free($2);
170829603e2SAlexander Motin 		if (error != 0)
171829603e2SAlexander Motin 			return (1);
172829603e2SAlexander Motin 	}
173829603e2SAlexander Motin 	;
174829603e2SAlexander Motin 
175d9b4554dSEdward Tomasz Napierala isns_period:	ISNS_PERIOD STR
176829603e2SAlexander Motin 	{
177d9b4554dSEdward Tomasz Napierala 		uint64_t tmp;
178d9b4554dSEdward Tomasz Napierala 
179d9b4554dSEdward Tomasz Napierala 		if (expand_number($2, &tmp) != 0) {
180d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
181d9b4554dSEdward Tomasz Napierala 			free($2);
182d9b4554dSEdward Tomasz Napierala 			return (1);
183d9b4554dSEdward Tomasz Napierala 		}
184d9b4554dSEdward Tomasz Napierala 
185d9b4554dSEdward Tomasz Napierala 		conf->conf_isns_period = tmp;
186829603e2SAlexander Motin 	}
187829603e2SAlexander Motin 	;
188829603e2SAlexander Motin 
189d9b4554dSEdward Tomasz Napierala isns_timeout:	ISNS_TIMEOUT STR
190829603e2SAlexander Motin 	{
191d9b4554dSEdward Tomasz Napierala 		uint64_t tmp;
192d9b4554dSEdward Tomasz Napierala 
193d9b4554dSEdward Tomasz Napierala 		if (expand_number($2, &tmp) != 0) {
194d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
195d9b4554dSEdward Tomasz Napierala 			free($2);
196d9b4554dSEdward Tomasz Napierala 			return (1);
197d9b4554dSEdward Tomasz Napierala 		}
198d9b4554dSEdward Tomasz Napierala 
199d9b4554dSEdward Tomasz Napierala 		conf->conf_isns_timeout = tmp;
200829603e2SAlexander Motin 	}
201829603e2SAlexander Motin 	;
202829603e2SAlexander Motin 
203e1c0d0d8SEdward Tomasz Napierala auth_group:	AUTH_GROUP auth_group_name
204009ea47eSEdward Tomasz Napierala     OPENING_BRACKET auth_group_entries CLOSING_BRACKET
205009ea47eSEdward Tomasz Napierala 	{
206009ea47eSEdward Tomasz Napierala 		auth_group = NULL;
207009ea47eSEdward Tomasz Napierala 	}
208009ea47eSEdward Tomasz Napierala 	;
209009ea47eSEdward Tomasz Napierala 
210009ea47eSEdward Tomasz Napierala auth_group_name:	STR
211009ea47eSEdward Tomasz Napierala 	{
212e7977549SEdward Tomasz Napierala 		/*
213e7977549SEdward Tomasz Napierala 		 * Make it possible to redefine default
214e7977549SEdward Tomasz Napierala 		 * auth-group. but only once.
215e7977549SEdward Tomasz Napierala 		 */
216e7977549SEdward Tomasz Napierala 		if (strcmp($1, "default") == 0 &&
217e7977549SEdward Tomasz Napierala 		    conf->conf_default_ag_defined == false) {
218e7977549SEdward Tomasz Napierala 			auth_group = auth_group_find(conf, $1);
219e7977549SEdward Tomasz Napierala 			conf->conf_default_ag_defined = true;
220e7977549SEdward Tomasz Napierala 		} else {
221009ea47eSEdward Tomasz Napierala 			auth_group = auth_group_new(conf, $1);
222e7977549SEdward Tomasz Napierala 		}
223009ea47eSEdward Tomasz Napierala 		free($1);
224009ea47eSEdward Tomasz Napierala 		if (auth_group == NULL)
225009ea47eSEdward Tomasz Napierala 			return (1);
226009ea47eSEdward Tomasz Napierala 	}
227009ea47eSEdward Tomasz Napierala 	;
228009ea47eSEdward Tomasz Napierala 
229009ea47eSEdward Tomasz Napierala auth_group_entries:
230009ea47eSEdward Tomasz Napierala 	|
231009ea47eSEdward Tomasz Napierala 	auth_group_entries auth_group_entry
232f9488580SEdward Tomasz Napierala 	|
233f9488580SEdward Tomasz Napierala 	auth_group_entries auth_group_entry SEMICOLON
234009ea47eSEdward Tomasz Napierala 	;
235009ea47eSEdward Tomasz Napierala 
236009ea47eSEdward Tomasz Napierala auth_group_entry:
237df9900fbSEdward Tomasz Napierala 	auth_group_auth_type
238df9900fbSEdward Tomasz Napierala 	|
239009ea47eSEdward Tomasz Napierala 	auth_group_chap
240009ea47eSEdward Tomasz Napierala 	|
241009ea47eSEdward Tomasz Napierala 	auth_group_chap_mutual
2428cb2e958SEdward Tomasz Napierala 	|
2438cb2e958SEdward Tomasz Napierala 	auth_group_initiator_name
2448cb2e958SEdward Tomasz Napierala 	|
2458cb2e958SEdward Tomasz Napierala 	auth_group_initiator_portal
246009ea47eSEdward Tomasz Napierala 	;
247009ea47eSEdward Tomasz Napierala 
248df9900fbSEdward Tomasz Napierala auth_group_auth_type:	AUTH_TYPE STR
249df9900fbSEdward Tomasz Napierala 	{
250df9900fbSEdward Tomasz Napierala 		int error;
251df9900fbSEdward Tomasz Napierala 
252bd833b11SEdward Tomasz Napierala 		error = auth_group_set_type(auth_group, $2);
253df9900fbSEdward Tomasz Napierala 		free($2);
254df9900fbSEdward Tomasz Napierala 		if (error != 0)
255df9900fbSEdward Tomasz Napierala 			return (1);
256df9900fbSEdward Tomasz Napierala 	}
257df9900fbSEdward Tomasz Napierala 	;
258df9900fbSEdward Tomasz Napierala 
259009ea47eSEdward Tomasz Napierala auth_group_chap:	CHAP STR STR
260009ea47eSEdward Tomasz Napierala 	{
261009ea47eSEdward Tomasz Napierala 		const struct auth *ca;
262009ea47eSEdward Tomasz Napierala 
263009ea47eSEdward Tomasz Napierala 		ca = auth_new_chap(auth_group, $2, $3);
264009ea47eSEdward Tomasz Napierala 		free($2);
265009ea47eSEdward Tomasz Napierala 		free($3);
266009ea47eSEdward Tomasz Napierala 		if (ca == NULL)
267009ea47eSEdward Tomasz Napierala 			return (1);
268009ea47eSEdward Tomasz Napierala 	}
269009ea47eSEdward Tomasz Napierala 	;
270009ea47eSEdward Tomasz Napierala 
271009ea47eSEdward Tomasz Napierala auth_group_chap_mutual:	CHAP_MUTUAL STR STR STR STR
272009ea47eSEdward Tomasz Napierala 	{
273009ea47eSEdward Tomasz Napierala 		const struct auth *ca;
274009ea47eSEdward Tomasz Napierala 
275009ea47eSEdward Tomasz Napierala 		ca = auth_new_chap_mutual(auth_group, $2, $3, $4, $5);
276009ea47eSEdward Tomasz Napierala 		free($2);
277009ea47eSEdward Tomasz Napierala 		free($3);
278009ea47eSEdward Tomasz Napierala 		free($4);
279009ea47eSEdward Tomasz Napierala 		free($5);
280009ea47eSEdward Tomasz Napierala 		if (ca == NULL)
281009ea47eSEdward Tomasz Napierala 			return (1);
282009ea47eSEdward Tomasz Napierala 	}
283009ea47eSEdward Tomasz Napierala 	;
284009ea47eSEdward Tomasz Napierala 
2858cb2e958SEdward Tomasz Napierala auth_group_initiator_name:	INITIATOR_NAME STR
2868cb2e958SEdward Tomasz Napierala 	{
2878cb2e958SEdward Tomasz Napierala 		const struct auth_name *an;
2888cb2e958SEdward Tomasz Napierala 
2898cb2e958SEdward Tomasz Napierala 		an = auth_name_new(auth_group, $2);
2908cb2e958SEdward Tomasz Napierala 		free($2);
2918cb2e958SEdward Tomasz Napierala 		if (an == NULL)
2928cb2e958SEdward Tomasz Napierala 			return (1);
2938cb2e958SEdward Tomasz Napierala 	}
2948cb2e958SEdward Tomasz Napierala 	;
2958cb2e958SEdward Tomasz Napierala 
2968cb2e958SEdward Tomasz Napierala auth_group_initiator_portal:	INITIATOR_PORTAL STR
2978cb2e958SEdward Tomasz Napierala 	{
2988cb2e958SEdward Tomasz Napierala 		const struct auth_portal *ap;
2998cb2e958SEdward Tomasz Napierala 
3008cb2e958SEdward Tomasz Napierala 		ap = auth_portal_new(auth_group, $2);
3018cb2e958SEdward Tomasz Napierala 		free($2);
3028cb2e958SEdward Tomasz Napierala 		if (ap == NULL)
3038cb2e958SEdward Tomasz Napierala 			return (1);
3048cb2e958SEdward Tomasz Napierala 	}
3058cb2e958SEdward Tomasz Napierala 	;
3068cb2e958SEdward Tomasz Napierala 
307e1c0d0d8SEdward Tomasz Napierala portal_group:	PORTAL_GROUP portal_group_name
308009ea47eSEdward Tomasz Napierala     OPENING_BRACKET portal_group_entries CLOSING_BRACKET
309009ea47eSEdward Tomasz Napierala 	{
310009ea47eSEdward Tomasz Napierala 		portal_group = NULL;
311009ea47eSEdward Tomasz Napierala 	}
312009ea47eSEdward Tomasz Napierala 	;
313009ea47eSEdward Tomasz Napierala 
314009ea47eSEdward Tomasz Napierala portal_group_name:	STR
315009ea47eSEdward Tomasz Napierala 	{
316252d941cSEdward Tomasz Napierala 		/*
317252d941cSEdward Tomasz Napierala 		 * Make it possible to redefine default
318252d941cSEdward Tomasz Napierala 		 * portal-group. but only once.
319252d941cSEdward Tomasz Napierala 		 */
320252d941cSEdward Tomasz Napierala 		if (strcmp($1, "default") == 0 &&
321252d941cSEdward Tomasz Napierala 		    conf->conf_default_pg_defined == false) {
322252d941cSEdward Tomasz Napierala 			portal_group = portal_group_find(conf, $1);
323252d941cSEdward Tomasz Napierala 			conf->conf_default_pg_defined = true;
324252d941cSEdward Tomasz Napierala 		} else {
325009ea47eSEdward Tomasz Napierala 			portal_group = portal_group_new(conf, $1);
326252d941cSEdward Tomasz Napierala 		}
327009ea47eSEdward Tomasz Napierala 		free($1);
328009ea47eSEdward Tomasz Napierala 		if (portal_group == NULL)
329009ea47eSEdward Tomasz Napierala 			return (1);
330009ea47eSEdward Tomasz Napierala 	}
331009ea47eSEdward Tomasz Napierala 	;
332009ea47eSEdward Tomasz Napierala 
333009ea47eSEdward Tomasz Napierala portal_group_entries:
334009ea47eSEdward Tomasz Napierala 	|
335009ea47eSEdward Tomasz Napierala 	portal_group_entries portal_group_entry
336f9488580SEdward Tomasz Napierala 	|
337f9488580SEdward Tomasz Napierala 	portal_group_entries portal_group_entry SEMICOLON
338009ea47eSEdward Tomasz Napierala 	;
339009ea47eSEdward Tomasz Napierala 
340009ea47eSEdward Tomasz Napierala portal_group_entry:
341009ea47eSEdward Tomasz Napierala 	portal_group_discovery_auth_group
342009ea47eSEdward Tomasz Napierala 	|
34305374883SEdward Tomasz Napierala 	portal_group_discovery_filter
34405374883SEdward Tomasz Napierala 	|
345db7bf2baSAlexander Motin 	portal_group_foreign
346db7bf2baSAlexander Motin 	|
347009ea47eSEdward Tomasz Napierala 	portal_group_listen
348009ea47eSEdward Tomasz Napierala 	|
349009ea47eSEdward Tomasz Napierala 	portal_group_listen_iser
3506dbdbf82SEdward Tomasz Napierala 	|
351a9d78210SEdward Tomasz Napierala 	portal_group_offload
352a9d78210SEdward Tomasz Napierala 	|
353398290f2SAlexander Motin 	portal_group_option
354398290f2SAlexander Motin 	|
3556dbdbf82SEdward Tomasz Napierala 	portal_group_redirect
356db7bf2baSAlexander Motin 	|
357db7bf2baSAlexander Motin 	portal_group_tag
35864ffe6d4SRichard Scheffenegger 	|
35964ffe6d4SRichard Scheffenegger 	portal_group_dscp
360ea8f1280SRichard Scheffenegger 	|
361ea8f1280SRichard Scheffenegger 	portal_group_pcp
362009ea47eSEdward Tomasz Napierala 	;
363009ea47eSEdward Tomasz Napierala 
364009ea47eSEdward Tomasz Napierala portal_group_discovery_auth_group:	DISCOVERY_AUTH_GROUP STR
365009ea47eSEdward Tomasz Napierala 	{
366009ea47eSEdward Tomasz Napierala 		if (portal_group->pg_discovery_auth_group != NULL) {
367009ea47eSEdward Tomasz Napierala 			log_warnx("discovery-auth-group for portal-group "
368009ea47eSEdward Tomasz Napierala 			    "\"%s\" specified more than once",
369009ea47eSEdward Tomasz Napierala 			    portal_group->pg_name);
370009ea47eSEdward Tomasz Napierala 			return (1);
371009ea47eSEdward Tomasz Napierala 		}
372009ea47eSEdward Tomasz Napierala 		portal_group->pg_discovery_auth_group =
373009ea47eSEdward Tomasz Napierala 		    auth_group_find(conf, $2);
374009ea47eSEdward Tomasz Napierala 		if (portal_group->pg_discovery_auth_group == NULL) {
375009ea47eSEdward Tomasz Napierala 			log_warnx("unknown discovery-auth-group \"%s\" "
376009ea47eSEdward Tomasz Napierala 			    "for portal-group \"%s\"",
377009ea47eSEdward Tomasz Napierala 			    $2, portal_group->pg_name);
378009ea47eSEdward Tomasz Napierala 			return (1);
379009ea47eSEdward Tomasz Napierala 		}
380009ea47eSEdward Tomasz Napierala 		free($2);
381009ea47eSEdward Tomasz Napierala 	}
382009ea47eSEdward Tomasz Napierala 	;
383009ea47eSEdward Tomasz Napierala 
38405374883SEdward Tomasz Napierala portal_group_discovery_filter:	DISCOVERY_FILTER STR
38505374883SEdward Tomasz Napierala 	{
38605374883SEdward Tomasz Napierala 		int error;
38705374883SEdward Tomasz Napierala 
388bd833b11SEdward Tomasz Napierala 		error = portal_group_set_filter(portal_group, $2);
38905374883SEdward Tomasz Napierala 		free($2);
39005374883SEdward Tomasz Napierala 		if (error != 0)
39105374883SEdward Tomasz Napierala 			return (1);
39205374883SEdward Tomasz Napierala 	}
39305374883SEdward Tomasz Napierala 	;
39405374883SEdward Tomasz Napierala 
395db7bf2baSAlexander Motin portal_group_foreign:	FOREIGN
396db7bf2baSAlexander Motin 	{
397db7bf2baSAlexander Motin 
398db7bf2baSAlexander Motin 		portal_group->pg_foreign = 1;
399db7bf2baSAlexander Motin 	}
400db7bf2baSAlexander Motin 	;
401db7bf2baSAlexander Motin 
402009ea47eSEdward Tomasz Napierala portal_group_listen:	LISTEN STR
403009ea47eSEdward Tomasz Napierala 	{
404009ea47eSEdward Tomasz Napierala 		int error;
405009ea47eSEdward Tomasz Napierala 
406009ea47eSEdward Tomasz Napierala 		error = portal_group_add_listen(portal_group, $2, false);
407009ea47eSEdward Tomasz Napierala 		free($2);
408009ea47eSEdward Tomasz Napierala 		if (error != 0)
409009ea47eSEdward Tomasz Napierala 			return (1);
410009ea47eSEdward Tomasz Napierala 	}
411009ea47eSEdward Tomasz Napierala 	;
412009ea47eSEdward Tomasz Napierala 
413009ea47eSEdward Tomasz Napierala portal_group_listen_iser:	LISTEN_ISER STR
414009ea47eSEdward Tomasz Napierala 	{
415009ea47eSEdward Tomasz Napierala 		int error;
416009ea47eSEdward Tomasz Napierala 
417009ea47eSEdward Tomasz Napierala 		error = portal_group_add_listen(portal_group, $2, true);
418009ea47eSEdward Tomasz Napierala 		free($2);
419009ea47eSEdward Tomasz Napierala 		if (error != 0)
420009ea47eSEdward Tomasz Napierala 			return (1);
421009ea47eSEdward Tomasz Napierala 	}
422009ea47eSEdward Tomasz Napierala 	;
423009ea47eSEdward Tomasz Napierala 
424a9d78210SEdward Tomasz Napierala portal_group_offload:	OFFLOAD STR
425a9d78210SEdward Tomasz Napierala 	{
426a9d78210SEdward Tomasz Napierala 		int error;
427a9d78210SEdward Tomasz Napierala 
428a9d78210SEdward Tomasz Napierala 		error = portal_group_set_offload(portal_group, $2);
429a9d78210SEdward Tomasz Napierala 		free($2);
430a9d78210SEdward Tomasz Napierala 		if (error != 0)
431a9d78210SEdward Tomasz Napierala 			return (1);
432a9d78210SEdward Tomasz Napierala 	}
433a9d78210SEdward Tomasz Napierala 	;
434a9d78210SEdward Tomasz Napierala 
435398290f2SAlexander Motin portal_group_option:	OPTION STR STR
436398290f2SAlexander Motin 	{
437398290f2SAlexander Motin 		struct option *o;
438398290f2SAlexander Motin 
439398290f2SAlexander Motin 		o = option_new(&portal_group->pg_options, $2, $3);
440398290f2SAlexander Motin 		free($2);
441398290f2SAlexander Motin 		free($3);
442398290f2SAlexander Motin 		if (o == NULL)
443398290f2SAlexander Motin 			return (1);
444398290f2SAlexander Motin 	}
445398290f2SAlexander Motin 	;
446398290f2SAlexander Motin 
4476dbdbf82SEdward Tomasz Napierala portal_group_redirect:	REDIRECT STR
4486dbdbf82SEdward Tomasz Napierala 	{
4496dbdbf82SEdward Tomasz Napierala 		int error;
4506dbdbf82SEdward Tomasz Napierala 
4516dbdbf82SEdward Tomasz Napierala 		error = portal_group_set_redirection(portal_group, $2);
4526dbdbf82SEdward Tomasz Napierala 		free($2);
4536dbdbf82SEdward Tomasz Napierala 		if (error != 0)
4546dbdbf82SEdward Tomasz Napierala 			return (1);
4556dbdbf82SEdward Tomasz Napierala 	}
4566dbdbf82SEdward Tomasz Napierala 	;
4576dbdbf82SEdward Tomasz Napierala 
458db7bf2baSAlexander Motin portal_group_tag:	TAG STR
459db7bf2baSAlexander Motin 	{
460db7bf2baSAlexander Motin 		uint64_t tmp;
461db7bf2baSAlexander Motin 
462db7bf2baSAlexander Motin 		if (expand_number($2, &tmp) != 0) {
463db7bf2baSAlexander Motin 			yyerror("invalid numeric value");
464db7bf2baSAlexander Motin 			free($2);
465db7bf2baSAlexander Motin 			return (1);
466db7bf2baSAlexander Motin 		}
467db7bf2baSAlexander Motin 
468db7bf2baSAlexander Motin 		portal_group->pg_tag = tmp;
469db7bf2baSAlexander Motin 	}
470db7bf2baSAlexander Motin 	;
471db7bf2baSAlexander Motin 
47264ffe6d4SRichard Scheffenegger portal_group_dscp
47364ffe6d4SRichard Scheffenegger : DSCP STR
47464ffe6d4SRichard Scheffenegger 	{
47564ffe6d4SRichard Scheffenegger 		uint64_t tmp;
47664ffe6d4SRichard Scheffenegger 
47764ffe6d4SRichard Scheffenegger 		if (strcmp($2, "0x") == 0) {
47864ffe6d4SRichard Scheffenegger 			tmp = strtol($2 + 2, NULL, 16);
47964ffe6d4SRichard Scheffenegger 		} else if (expand_number($2, &tmp) != 0) {
48064ffe6d4SRichard Scheffenegger 			yyerror("invalid numeric value");
48164ffe6d4SRichard Scheffenegger 			free($2);
48264ffe6d4SRichard Scheffenegger 			return(1);
48364ffe6d4SRichard Scheffenegger 		}
48464ffe6d4SRichard Scheffenegger 		if (tmp >= 0x40) {
48564ffe6d4SRichard Scheffenegger 			yyerror("invalid dscp value");
48664ffe6d4SRichard Scheffenegger 			return(1);
48764ffe6d4SRichard Scheffenegger 		}
48864ffe6d4SRichard Scheffenegger 
48964ffe6d4SRichard Scheffenegger 		portal_group->pg_dscp = tmp;
49064ffe6d4SRichard Scheffenegger 	}
49164ffe6d4SRichard Scheffenegger | DSCP BE	{ portal_group->pg_dscp = IPTOS_DSCP_CS0  >> 2 ; }
49264ffe6d4SRichard Scheffenegger | DSCP EF	{ portal_group->pg_dscp = IPTOS_DSCP_EF   >> 2 ; }
49364ffe6d4SRichard Scheffenegger | DSCP CS0	{ portal_group->pg_dscp = IPTOS_DSCP_CS0  >> 2 ; }
49464ffe6d4SRichard Scheffenegger | DSCP CS1	{ portal_group->pg_dscp = IPTOS_DSCP_CS1  >> 2 ; }
49564ffe6d4SRichard Scheffenegger | DSCP CS2	{ portal_group->pg_dscp = IPTOS_DSCP_CS2  >> 2 ; }
49664ffe6d4SRichard Scheffenegger | DSCP CS3	{ portal_group->pg_dscp = IPTOS_DSCP_CS3  >> 2 ; }
49764ffe6d4SRichard Scheffenegger | DSCP CS4	{ portal_group->pg_dscp = IPTOS_DSCP_CS4  >> 2 ; }
49864ffe6d4SRichard Scheffenegger | DSCP CS5	{ portal_group->pg_dscp = IPTOS_DSCP_CS5  >> 2 ; }
49964ffe6d4SRichard Scheffenegger | DSCP CS6	{ portal_group->pg_dscp = IPTOS_DSCP_CS6  >> 2 ; }
50064ffe6d4SRichard Scheffenegger | DSCP CS7	{ portal_group->pg_dscp = IPTOS_DSCP_CS7  >> 2 ; }
50164ffe6d4SRichard Scheffenegger | DSCP AF11	{ portal_group->pg_dscp = IPTOS_DSCP_AF11 >> 2 ; }
50264ffe6d4SRichard Scheffenegger | DSCP AF12	{ portal_group->pg_dscp = IPTOS_DSCP_AF12 >> 2 ; }
50364ffe6d4SRichard Scheffenegger | DSCP AF13	{ portal_group->pg_dscp = IPTOS_DSCP_AF13 >> 2 ; }
50464ffe6d4SRichard Scheffenegger | DSCP AF21	{ portal_group->pg_dscp = IPTOS_DSCP_AF21 >> 2 ; }
50564ffe6d4SRichard Scheffenegger | DSCP AF22	{ portal_group->pg_dscp = IPTOS_DSCP_AF22 >> 2 ; }
50664ffe6d4SRichard Scheffenegger | DSCP AF23	{ portal_group->pg_dscp = IPTOS_DSCP_AF23 >> 2 ; }
50764ffe6d4SRichard Scheffenegger | DSCP AF31	{ portal_group->pg_dscp = IPTOS_DSCP_AF31 >> 2 ; }
50864ffe6d4SRichard Scheffenegger | DSCP AF32	{ portal_group->pg_dscp = IPTOS_DSCP_AF32 >> 2 ; }
50964ffe6d4SRichard Scheffenegger | DSCP AF33	{ portal_group->pg_dscp = IPTOS_DSCP_AF33 >> 2 ; }
51064ffe6d4SRichard Scheffenegger | DSCP AF41	{ portal_group->pg_dscp = IPTOS_DSCP_AF41 >> 2 ; }
51164ffe6d4SRichard Scheffenegger | DSCP AF42	{ portal_group->pg_dscp = IPTOS_DSCP_AF42 >> 2 ; }
51264ffe6d4SRichard Scheffenegger | DSCP AF43	{ portal_group->pg_dscp = IPTOS_DSCP_AF43 >> 2 ; }
51364ffe6d4SRichard Scheffenegger 	;
51464ffe6d4SRichard Scheffenegger 
515ea8f1280SRichard Scheffenegger portal_group_pcp:	PCP STR
516ea8f1280SRichard Scheffenegger 	{
517ea8f1280SRichard Scheffenegger 		uint64_t tmp;
518ea8f1280SRichard Scheffenegger 
519ea8f1280SRichard Scheffenegger 		if (expand_number($2, &tmp) != 0) {
520ea8f1280SRichard Scheffenegger 			yyerror("invalid numeric value");
521ea8f1280SRichard Scheffenegger 			free($2);
522ea8f1280SRichard Scheffenegger 			return (1);
523ea8f1280SRichard Scheffenegger 		}
524e72a100bSAdrian Chadd 		if (tmp > 7) {
525ea8f1280SRichard Scheffenegger 			yyerror("invalid pcp value");
526ea8f1280SRichard Scheffenegger 			free($2);
527ea8f1280SRichard Scheffenegger 			return (1);
528ea8f1280SRichard Scheffenegger 		}
529ea8f1280SRichard Scheffenegger 
530ea8f1280SRichard Scheffenegger 		portal_group->pg_pcp = tmp;
531ea8f1280SRichard Scheffenegger 	}
532ea8f1280SRichard Scheffenegger 	;
53364ffe6d4SRichard Scheffenegger 
534920c6cbaSAlexander Motin lun:	LUN lun_name
535920c6cbaSAlexander Motin     OPENING_BRACKET lun_entries CLOSING_BRACKET
536920c6cbaSAlexander Motin 	{
537920c6cbaSAlexander Motin 		lun = NULL;
538920c6cbaSAlexander Motin 	}
539920c6cbaSAlexander Motin 	;
540920c6cbaSAlexander Motin 
541920c6cbaSAlexander Motin lun_name:	STR
542920c6cbaSAlexander Motin 	{
543920c6cbaSAlexander Motin 		lun = lun_new(conf, $1);
544920c6cbaSAlexander Motin 		free($1);
545920c6cbaSAlexander Motin 		if (lun == NULL)
546920c6cbaSAlexander Motin 			return (1);
547920c6cbaSAlexander Motin 	}
548920c6cbaSAlexander Motin 	;
549920c6cbaSAlexander Motin 
550e1c0d0d8SEdward Tomasz Napierala target:	TARGET target_name
551009ea47eSEdward Tomasz Napierala     OPENING_BRACKET target_entries CLOSING_BRACKET
552009ea47eSEdward Tomasz Napierala 	{
553009ea47eSEdward Tomasz Napierala 		target = NULL;
554009ea47eSEdward Tomasz Napierala 	}
555009ea47eSEdward Tomasz Napierala 	;
556009ea47eSEdward Tomasz Napierala 
557e1c0d0d8SEdward Tomasz Napierala target_name:	STR
558009ea47eSEdward Tomasz Napierala 	{
559009ea47eSEdward Tomasz Napierala 		target = target_new(conf, $1);
560009ea47eSEdward Tomasz Napierala 		free($1);
561009ea47eSEdward Tomasz Napierala 		if (target == NULL)
562009ea47eSEdward Tomasz Napierala 			return (1);
563009ea47eSEdward Tomasz Napierala 	}
564009ea47eSEdward Tomasz Napierala 	;
565009ea47eSEdward Tomasz Napierala 
566009ea47eSEdward Tomasz Napierala target_entries:
567009ea47eSEdward Tomasz Napierala 	|
568009ea47eSEdward Tomasz Napierala 	target_entries target_entry
569f9488580SEdward Tomasz Napierala 	|
570f9488580SEdward Tomasz Napierala 	target_entries target_entry SEMICOLON
571009ea47eSEdward Tomasz Napierala 	;
572009ea47eSEdward Tomasz Napierala 
573009ea47eSEdward Tomasz Napierala target_entry:
574e1c0d0d8SEdward Tomasz Napierala 	target_alias
575009ea47eSEdward Tomasz Napierala 	|
576e1c0d0d8SEdward Tomasz Napierala 	target_auth_group
577009ea47eSEdward Tomasz Napierala 	|
578df9900fbSEdward Tomasz Napierala 	target_auth_type
579df9900fbSEdward Tomasz Napierala 	|
580e1c0d0d8SEdward Tomasz Napierala 	target_chap
581009ea47eSEdward Tomasz Napierala 	|
582e1c0d0d8SEdward Tomasz Napierala 	target_chap_mutual
583009ea47eSEdward Tomasz Napierala 	|
584e1c0d0d8SEdward Tomasz Napierala 	target_initiator_name
5858cb2e958SEdward Tomasz Napierala 	|
586e1c0d0d8SEdward Tomasz Napierala 	target_initiator_portal
5878cb2e958SEdward Tomasz Napierala 	|
588e1c0d0d8SEdward Tomasz Napierala 	target_portal_group
589009ea47eSEdward Tomasz Napierala 	|
590057abcb0SAlexander Motin 	target_port
591057abcb0SAlexander Motin 	|
5926dbdbf82SEdward Tomasz Napierala 	target_redirect
5936dbdbf82SEdward Tomasz Napierala 	|
594e1c0d0d8SEdward Tomasz Napierala 	target_lun
595920c6cbaSAlexander Motin 	|
596920c6cbaSAlexander Motin 	target_lun_ref
597009ea47eSEdward Tomasz Napierala 	;
598009ea47eSEdward Tomasz Napierala 
599e1c0d0d8SEdward Tomasz Napierala target_alias:	ALIAS STR
600009ea47eSEdward Tomasz Napierala 	{
601009ea47eSEdward Tomasz Napierala 		if (target->t_alias != NULL) {
602009ea47eSEdward Tomasz Napierala 			log_warnx("alias for target \"%s\" "
603f7ae5bf8SEdward Tomasz Napierala 			    "specified more than once", target->t_name);
604009ea47eSEdward Tomasz Napierala 			return (1);
605009ea47eSEdward Tomasz Napierala 		}
606009ea47eSEdward Tomasz Napierala 		target->t_alias = $2;
607009ea47eSEdward Tomasz Napierala 	}
608009ea47eSEdward Tomasz Napierala 	;
609009ea47eSEdward Tomasz Napierala 
610e1c0d0d8SEdward Tomasz Napierala target_auth_group:	AUTH_GROUP STR
611009ea47eSEdward Tomasz Napierala 	{
612009ea47eSEdward Tomasz Napierala 		if (target->t_auth_group != NULL) {
613009ea47eSEdward Tomasz Napierala 			if (target->t_auth_group->ag_name != NULL)
614009ea47eSEdward Tomasz Napierala 				log_warnx("auth-group for target \"%s\" "
615f7ae5bf8SEdward Tomasz Napierala 				    "specified more than once", target->t_name);
616009ea47eSEdward Tomasz Napierala 			else
617df9900fbSEdward Tomasz Napierala 				log_warnx("cannot use both auth-group and explicit "
618009ea47eSEdward Tomasz Napierala 				    "authorisations for target \"%s\"",
619f7ae5bf8SEdward Tomasz Napierala 				    target->t_name);
620009ea47eSEdward Tomasz Napierala 			return (1);
621009ea47eSEdward Tomasz Napierala 		}
622009ea47eSEdward Tomasz Napierala 		target->t_auth_group = auth_group_find(conf, $2);
623009ea47eSEdward Tomasz Napierala 		if (target->t_auth_group == NULL) {
624009ea47eSEdward Tomasz Napierala 			log_warnx("unknown auth-group \"%s\" for target "
625f7ae5bf8SEdward Tomasz Napierala 			    "\"%s\"", $2, target->t_name);
626009ea47eSEdward Tomasz Napierala 			return (1);
627009ea47eSEdward Tomasz Napierala 		}
628009ea47eSEdward Tomasz Napierala 		free($2);
629009ea47eSEdward Tomasz Napierala 	}
630009ea47eSEdward Tomasz Napierala 	;
631009ea47eSEdward Tomasz Napierala 
632df9900fbSEdward Tomasz Napierala target_auth_type:	AUTH_TYPE STR
633df9900fbSEdward Tomasz Napierala 	{
634df9900fbSEdward Tomasz Napierala 		int error;
635df9900fbSEdward Tomasz Napierala 
636df9900fbSEdward Tomasz Napierala 		if (target->t_auth_group != NULL) {
637df9900fbSEdward Tomasz Napierala 			if (target->t_auth_group->ag_name != NULL) {
638df9900fbSEdward Tomasz Napierala 				log_warnx("cannot use both auth-group and "
639df9900fbSEdward Tomasz Napierala 				    "auth-type for target \"%s\"",
640df9900fbSEdward Tomasz Napierala 				    target->t_name);
641df9900fbSEdward Tomasz Napierala 				return (1);
642df9900fbSEdward Tomasz Napierala 			}
643df9900fbSEdward Tomasz Napierala 		} else {
644df9900fbSEdward Tomasz Napierala 			target->t_auth_group = auth_group_new(conf, NULL);
645df9900fbSEdward Tomasz Napierala 			if (target->t_auth_group == NULL) {
646df9900fbSEdward Tomasz Napierala 				free($2);
647df9900fbSEdward Tomasz Napierala 				return (1);
648df9900fbSEdward Tomasz Napierala 			}
649df9900fbSEdward Tomasz Napierala 			target->t_auth_group->ag_target = target;
650df9900fbSEdward Tomasz Napierala 		}
651bd833b11SEdward Tomasz Napierala 		error = auth_group_set_type(target->t_auth_group, $2);
652df9900fbSEdward Tomasz Napierala 		free($2);
653df9900fbSEdward Tomasz Napierala 		if (error != 0)
654df9900fbSEdward Tomasz Napierala 			return (1);
655df9900fbSEdward Tomasz Napierala 	}
656df9900fbSEdward Tomasz Napierala 	;
657df9900fbSEdward Tomasz Napierala 
658e1c0d0d8SEdward Tomasz Napierala target_chap:	CHAP STR STR
659009ea47eSEdward Tomasz Napierala 	{
660009ea47eSEdward Tomasz Napierala 		const struct auth *ca;
661009ea47eSEdward Tomasz Napierala 
662009ea47eSEdward Tomasz Napierala 		if (target->t_auth_group != NULL) {
663009ea47eSEdward Tomasz Napierala 			if (target->t_auth_group->ag_name != NULL) {
664df9900fbSEdward Tomasz Napierala 				log_warnx("cannot use both auth-group and "
665df9900fbSEdward Tomasz Napierala 				    "chap for target \"%s\"",
666f7ae5bf8SEdward Tomasz Napierala 				    target->t_name);
667009ea47eSEdward Tomasz Napierala 				free($2);
668009ea47eSEdward Tomasz Napierala 				free($3);
669009ea47eSEdward Tomasz Napierala 				return (1);
670009ea47eSEdward Tomasz Napierala 			}
671009ea47eSEdward Tomasz Napierala 		} else {
672009ea47eSEdward Tomasz Napierala 			target->t_auth_group = auth_group_new(conf, NULL);
673009ea47eSEdward Tomasz Napierala 			if (target->t_auth_group == NULL) {
674009ea47eSEdward Tomasz Napierala 				free($2);
675009ea47eSEdward Tomasz Napierala 				free($3);
676009ea47eSEdward Tomasz Napierala 				return (1);
677009ea47eSEdward Tomasz Napierala 			}
678009ea47eSEdward Tomasz Napierala 			target->t_auth_group->ag_target = target;
679009ea47eSEdward Tomasz Napierala 		}
680009ea47eSEdward Tomasz Napierala 		ca = auth_new_chap(target->t_auth_group, $2, $3);
681009ea47eSEdward Tomasz Napierala 		free($2);
682009ea47eSEdward Tomasz Napierala 		free($3);
683009ea47eSEdward Tomasz Napierala 		if (ca == NULL)
684009ea47eSEdward Tomasz Napierala 			return (1);
685009ea47eSEdward Tomasz Napierala 	}
686009ea47eSEdward Tomasz Napierala 	;
687009ea47eSEdward Tomasz Napierala 
688e1c0d0d8SEdward Tomasz Napierala target_chap_mutual:	CHAP_MUTUAL STR STR STR STR
689009ea47eSEdward Tomasz Napierala 	{
690009ea47eSEdward Tomasz Napierala 		const struct auth *ca;
691009ea47eSEdward Tomasz Napierala 
692009ea47eSEdward Tomasz Napierala 		if (target->t_auth_group != NULL) {
693009ea47eSEdward Tomasz Napierala 			if (target->t_auth_group->ag_name != NULL) {
694df9900fbSEdward Tomasz Napierala 				log_warnx("cannot use both auth-group and "
695df9900fbSEdward Tomasz Napierala 				    "chap-mutual for target \"%s\"",
696f7ae5bf8SEdward Tomasz Napierala 				    target->t_name);
697009ea47eSEdward Tomasz Napierala 				free($2);
698009ea47eSEdward Tomasz Napierala 				free($3);
699009ea47eSEdward Tomasz Napierala 				free($4);
700009ea47eSEdward Tomasz Napierala 				free($5);
701009ea47eSEdward Tomasz Napierala 				return (1);
702009ea47eSEdward Tomasz Napierala 			}
703009ea47eSEdward Tomasz Napierala 		} else {
704009ea47eSEdward Tomasz Napierala 			target->t_auth_group = auth_group_new(conf, NULL);
705009ea47eSEdward Tomasz Napierala 			if (target->t_auth_group == NULL) {
706009ea47eSEdward Tomasz Napierala 				free($2);
707009ea47eSEdward Tomasz Napierala 				free($3);
708009ea47eSEdward Tomasz Napierala 				free($4);
709009ea47eSEdward Tomasz Napierala 				free($5);
710009ea47eSEdward Tomasz Napierala 				return (1);
711009ea47eSEdward Tomasz Napierala 			}
712009ea47eSEdward Tomasz Napierala 			target->t_auth_group->ag_target = target;
713009ea47eSEdward Tomasz Napierala 		}
714009ea47eSEdward Tomasz Napierala 		ca = auth_new_chap_mutual(target->t_auth_group,
715009ea47eSEdward Tomasz Napierala 		    $2, $3, $4, $5);
716009ea47eSEdward Tomasz Napierala 		free($2);
717009ea47eSEdward Tomasz Napierala 		free($3);
718009ea47eSEdward Tomasz Napierala 		free($4);
719009ea47eSEdward Tomasz Napierala 		free($5);
720009ea47eSEdward Tomasz Napierala 		if (ca == NULL)
721009ea47eSEdward Tomasz Napierala 			return (1);
722009ea47eSEdward Tomasz Napierala 	}
723009ea47eSEdward Tomasz Napierala 	;
724009ea47eSEdward Tomasz Napierala 
725e1c0d0d8SEdward Tomasz Napierala target_initiator_name:	INITIATOR_NAME STR
7268cb2e958SEdward Tomasz Napierala 	{
7278cb2e958SEdward Tomasz Napierala 		const struct auth_name *an;
7288cb2e958SEdward Tomasz Napierala 
7298cb2e958SEdward Tomasz Napierala 		if (target->t_auth_group != NULL) {
7308cb2e958SEdward Tomasz Napierala 			if (target->t_auth_group->ag_name != NULL) {
731df9900fbSEdward Tomasz Napierala 				log_warnx("cannot use both auth-group and "
7328cb2e958SEdward Tomasz Napierala 				    "initiator-name for target \"%s\"",
733f7ae5bf8SEdward Tomasz Napierala 				    target->t_name);
7348cb2e958SEdward Tomasz Napierala 				free($2);
7358cb2e958SEdward Tomasz Napierala 				return (1);
7368cb2e958SEdward Tomasz Napierala 			}
7378cb2e958SEdward Tomasz Napierala 		} else {
7388cb2e958SEdward Tomasz Napierala 			target->t_auth_group = auth_group_new(conf, NULL);
7398cb2e958SEdward Tomasz Napierala 			if (target->t_auth_group == NULL) {
7408cb2e958SEdward Tomasz Napierala 				free($2);
7418cb2e958SEdward Tomasz Napierala 				return (1);
7428cb2e958SEdward Tomasz Napierala 			}
7438cb2e958SEdward Tomasz Napierala 			target->t_auth_group->ag_target = target;
7448cb2e958SEdward Tomasz Napierala 		}
7458cb2e958SEdward Tomasz Napierala 		an = auth_name_new(target->t_auth_group, $2);
7468cb2e958SEdward Tomasz Napierala 		free($2);
7478cb2e958SEdward Tomasz Napierala 		if (an == NULL)
7488cb2e958SEdward Tomasz Napierala 			return (1);
7498cb2e958SEdward Tomasz Napierala 	}
7508cb2e958SEdward Tomasz Napierala 	;
7518cb2e958SEdward Tomasz Napierala 
752e1c0d0d8SEdward Tomasz Napierala target_initiator_portal:	INITIATOR_PORTAL STR
7538cb2e958SEdward Tomasz Napierala 	{
7548cb2e958SEdward Tomasz Napierala 		const struct auth_portal *ap;
7558cb2e958SEdward Tomasz Napierala 
7568cb2e958SEdward Tomasz Napierala 		if (target->t_auth_group != NULL) {
7578cb2e958SEdward Tomasz Napierala 			if (target->t_auth_group->ag_name != NULL) {
758df9900fbSEdward Tomasz Napierala 				log_warnx("cannot use both auth-group and "
7598cb2e958SEdward Tomasz Napierala 				    "initiator-portal for target \"%s\"",
760f7ae5bf8SEdward Tomasz Napierala 				    target->t_name);
7618cb2e958SEdward Tomasz Napierala 				free($2);
7628cb2e958SEdward Tomasz Napierala 				return (1);
7638cb2e958SEdward Tomasz Napierala 			}
7648cb2e958SEdward Tomasz Napierala 		} else {
7658cb2e958SEdward Tomasz Napierala 			target->t_auth_group = auth_group_new(conf, NULL);
7668cb2e958SEdward Tomasz Napierala 			if (target->t_auth_group == NULL) {
7678cb2e958SEdward Tomasz Napierala 				free($2);
7688cb2e958SEdward Tomasz Napierala 				return (1);
7698cb2e958SEdward Tomasz Napierala 			}
7708cb2e958SEdward Tomasz Napierala 			target->t_auth_group->ag_target = target;
7718cb2e958SEdward Tomasz Napierala 		}
7728cb2e958SEdward Tomasz Napierala 		ap = auth_portal_new(target->t_auth_group, $2);
7738cb2e958SEdward Tomasz Napierala 		free($2);
7748cb2e958SEdward Tomasz Napierala 		if (ap == NULL)
7758cb2e958SEdward Tomasz Napierala 			return (1);
7768cb2e958SEdward Tomasz Napierala 	}
7778cb2e958SEdward Tomasz Napierala 	;
7788cb2e958SEdward Tomasz Napierala 
77992847ee1SAlexander Motin target_portal_group:	PORTAL_GROUP STR STR
780009ea47eSEdward Tomasz Napierala 	{
78192847ee1SAlexander Motin 		struct portal_group *tpg;
78292847ee1SAlexander Motin 		struct auth_group *tag;
78392847ee1SAlexander Motin 		struct port *tp;
78492847ee1SAlexander Motin 
78592847ee1SAlexander Motin 		tpg = portal_group_find(conf, $2);
78692847ee1SAlexander Motin 		if (tpg == NULL) {
78792847ee1SAlexander Motin 			log_warnx("unknown portal-group \"%s\" for target "
78892847ee1SAlexander Motin 			    "\"%s\"", $2, target->t_name);
78992847ee1SAlexander Motin 			free($2);
79092847ee1SAlexander Motin 			free($3);
79192847ee1SAlexander Motin 			return (1);
79292847ee1SAlexander Motin 		}
79392847ee1SAlexander Motin 		tag = auth_group_find(conf, $3);
79492847ee1SAlexander Motin 		if (tag == NULL) {
79592847ee1SAlexander Motin 			log_warnx("unknown auth-group \"%s\" for target "
79692847ee1SAlexander Motin 			    "\"%s\"", $3, target->t_name);
79792847ee1SAlexander Motin 			free($2);
79892847ee1SAlexander Motin 			free($3);
79992847ee1SAlexander Motin 			return (1);
80092847ee1SAlexander Motin 		}
80192847ee1SAlexander Motin 		tp = port_new(conf, target, tpg);
80292847ee1SAlexander Motin 		if (tp == NULL) {
80392847ee1SAlexander Motin 			log_warnx("can't link portal-group \"%s\" to target "
80492847ee1SAlexander Motin 			    "\"%s\"", $2, target->t_name);
805009ea47eSEdward Tomasz Napierala 			free($2);
806009ea47eSEdward Tomasz Napierala 			return (1);
807009ea47eSEdward Tomasz Napierala 		}
80892847ee1SAlexander Motin 		tp->p_auth_group = tag;
80992847ee1SAlexander Motin 		free($2);
81092847ee1SAlexander Motin 		free($3);
81192847ee1SAlexander Motin 	}
81292847ee1SAlexander Motin 	|		PORTAL_GROUP STR
81392847ee1SAlexander Motin 	{
81492847ee1SAlexander Motin 		struct portal_group *tpg;
81592847ee1SAlexander Motin 		struct port *tp;
81692847ee1SAlexander Motin 
81792847ee1SAlexander Motin 		tpg = portal_group_find(conf, $2);
81892847ee1SAlexander Motin 		if (tpg == NULL) {
819009ea47eSEdward Tomasz Napierala 			log_warnx("unknown portal-group \"%s\" for target "
820f7ae5bf8SEdward Tomasz Napierala 			    "\"%s\"", $2, target->t_name);
821009ea47eSEdward Tomasz Napierala 			free($2);
822009ea47eSEdward Tomasz Napierala 			return (1);
823009ea47eSEdward Tomasz Napierala 		}
82492847ee1SAlexander Motin 		tp = port_new(conf, target, tpg);
82592847ee1SAlexander Motin 		if (tp == NULL) {
82692847ee1SAlexander Motin 			log_warnx("can't link portal-group \"%s\" to target "
82792847ee1SAlexander Motin 			    "\"%s\"", $2, target->t_name);
82892847ee1SAlexander Motin 			free($2);
82992847ee1SAlexander Motin 			return (1);
83092847ee1SAlexander Motin 		}
831009ea47eSEdward Tomasz Napierala 		free($2);
832009ea47eSEdward Tomasz Napierala 	}
833009ea47eSEdward Tomasz Napierala 	;
834009ea47eSEdward Tomasz Napierala 
835057abcb0SAlexander Motin target_port:	PORT STR
836057abcb0SAlexander Motin 	{
837057abcb0SAlexander Motin 		struct pport *pp;
838057abcb0SAlexander Motin 		struct port *tp;
8398951f055SMarcelo Araujo 		int ret, i_pp, i_vp = 0;
840057abcb0SAlexander Motin 
8418951f055SMarcelo Araujo 		ret = sscanf($2, "ioctl/%d/%d", &i_pp, &i_vp);
8428951f055SMarcelo Araujo 		if (ret > 0) {
8438951f055SMarcelo Araujo 			tp = port_new_ioctl(conf, target, i_pp, i_vp);
8448951f055SMarcelo Araujo 			if (tp == NULL) {
8458951f055SMarcelo Araujo 				log_warnx("can't create new ioctl port for "
8468951f055SMarcelo Araujo 				    "target \"%s\"", target->t_name);
8478951f055SMarcelo Araujo 				free($2);
8488951f055SMarcelo Araujo 				return (1);
8498951f055SMarcelo Araujo 			}
8508951f055SMarcelo Araujo 		} else {
851057abcb0SAlexander Motin 			pp = pport_find(conf, $2);
852057abcb0SAlexander Motin 			if (pp == NULL) {
853057abcb0SAlexander Motin 				log_warnx("unknown port \"%s\" for target \"%s\"",
854057abcb0SAlexander Motin 				    $2, target->t_name);
855057abcb0SAlexander Motin 				free($2);
856057abcb0SAlexander Motin 				return (1);
857057abcb0SAlexander Motin 			}
858057abcb0SAlexander Motin 			if (!TAILQ_EMPTY(&pp->pp_ports)) {
859057abcb0SAlexander Motin 				log_warnx("can't link port \"%s\" to target \"%s\", "
860057abcb0SAlexander Motin 				    "port already linked to some target",
861057abcb0SAlexander Motin 				    $2, target->t_name);
862057abcb0SAlexander Motin 				free($2);
863057abcb0SAlexander Motin 				return (1);
864057abcb0SAlexander Motin 			}
865057abcb0SAlexander Motin 			tp = port_new_pp(conf, target, pp);
866057abcb0SAlexander Motin 			if (tp == NULL) {
867057abcb0SAlexander Motin 				log_warnx("can't link port \"%s\" to target \"%s\"",
868057abcb0SAlexander Motin 				    $2, target->t_name);
869057abcb0SAlexander Motin 				free($2);
870057abcb0SAlexander Motin 				return (1);
871057abcb0SAlexander Motin 			}
8728951f055SMarcelo Araujo 		}
8738951f055SMarcelo Araujo 
874057abcb0SAlexander Motin 		free($2);
875057abcb0SAlexander Motin 	}
876057abcb0SAlexander Motin 	;
877057abcb0SAlexander Motin 
8786dbdbf82SEdward Tomasz Napierala target_redirect:	REDIRECT STR
8796dbdbf82SEdward Tomasz Napierala 	{
8806dbdbf82SEdward Tomasz Napierala 		int error;
8816dbdbf82SEdward Tomasz Napierala 
8826dbdbf82SEdward Tomasz Napierala 		error = target_set_redirection(target, $2);
8836dbdbf82SEdward Tomasz Napierala 		free($2);
8846dbdbf82SEdward Tomasz Napierala 		if (error != 0)
8856dbdbf82SEdward Tomasz Napierala 			return (1);
8866dbdbf82SEdward Tomasz Napierala 	}
8876dbdbf82SEdward Tomasz Napierala 	;
8886dbdbf82SEdward Tomasz Napierala 
889e1c0d0d8SEdward Tomasz Napierala target_lun:	LUN lun_number
890e1c0d0d8SEdward Tomasz Napierala     OPENING_BRACKET lun_entries CLOSING_BRACKET
891009ea47eSEdward Tomasz Napierala 	{
892009ea47eSEdward Tomasz Napierala 		lun = NULL;
893009ea47eSEdward Tomasz Napierala 	}
894009ea47eSEdward Tomasz Napierala 	;
895009ea47eSEdward Tomasz Napierala 
8964524db57SEdward Tomasz Napierala lun_number:	STR
897009ea47eSEdward Tomasz Napierala 	{
8984524db57SEdward Tomasz Napierala 		uint64_t tmp;
899f584f51dSEdward Tomasz Napierala 		int ret;
900920c6cbaSAlexander Motin 		char *name;
9014524db57SEdward Tomasz Napierala 
9024524db57SEdward Tomasz Napierala 		if (expand_number($1, &tmp) != 0) {
903d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
9044524db57SEdward Tomasz Napierala 			free($1);
9054524db57SEdward Tomasz Napierala 			return (1);
9064524db57SEdward Tomasz Napierala 		}
907dad99db2SAlexander Motin 		if (tmp >= MAX_LUNS) {
908dad99db2SAlexander Motin 			yyerror("LU number is too big");
909dad99db2SAlexander Motin 			free($1);
910dad99db2SAlexander Motin 			return (1);
911dad99db2SAlexander Motin 		}
9124524db57SEdward Tomasz Napierala 
913f584f51dSEdward Tomasz Napierala 		ret = asprintf(&name, "%s,lun,%ju", target->t_name, tmp);
914f584f51dSEdward Tomasz Napierala 		if (ret <= 0)
915f584f51dSEdward Tomasz Napierala 			log_err(1, "asprintf");
916920c6cbaSAlexander Motin 		lun = lun_new(conf, name);
917009ea47eSEdward Tomasz Napierala 		if (lun == NULL)
918009ea47eSEdward Tomasz Napierala 			return (1);
919920c6cbaSAlexander Motin 
920920c6cbaSAlexander Motin 		lun_set_scsiname(lun, name);
921920c6cbaSAlexander Motin 		target->t_luns[tmp] = lun;
922920c6cbaSAlexander Motin 	}
923920c6cbaSAlexander Motin 	;
924920c6cbaSAlexander Motin 
925920c6cbaSAlexander Motin target_lun_ref:	LUN STR STR
926920c6cbaSAlexander Motin 	{
927920c6cbaSAlexander Motin 		uint64_t tmp;
928920c6cbaSAlexander Motin 
929920c6cbaSAlexander Motin 		if (expand_number($2, &tmp) != 0) {
930920c6cbaSAlexander Motin 			yyerror("invalid numeric value");
931920c6cbaSAlexander Motin 			free($2);
932920c6cbaSAlexander Motin 			free($3);
933920c6cbaSAlexander Motin 			return (1);
934920c6cbaSAlexander Motin 		}
935920c6cbaSAlexander Motin 		free($2);
936dad99db2SAlexander Motin 		if (tmp >= MAX_LUNS) {
937dad99db2SAlexander Motin 			yyerror("LU number is too big");
938dad99db2SAlexander Motin 			free($3);
939dad99db2SAlexander Motin 			return (1);
940dad99db2SAlexander Motin 		}
941920c6cbaSAlexander Motin 
942920c6cbaSAlexander Motin 		lun = lun_find(conf, $3);
943920c6cbaSAlexander Motin 		free($3);
944920c6cbaSAlexander Motin 		if (lun == NULL)
945920c6cbaSAlexander Motin 			return (1);
946920c6cbaSAlexander Motin 
947920c6cbaSAlexander Motin 		target->t_luns[tmp] = lun;
948009ea47eSEdward Tomasz Napierala 	}
949009ea47eSEdward Tomasz Napierala 	;
950009ea47eSEdward Tomasz Napierala 
951e1c0d0d8SEdward Tomasz Napierala lun_entries:
952009ea47eSEdward Tomasz Napierala 	|
953e1c0d0d8SEdward Tomasz Napierala 	lun_entries lun_entry
954f9488580SEdward Tomasz Napierala 	|
955f9488580SEdward Tomasz Napierala 	lun_entries lun_entry SEMICOLON
956009ea47eSEdward Tomasz Napierala 	;
957009ea47eSEdward Tomasz Napierala 
958e1c0d0d8SEdward Tomasz Napierala lun_entry:
959e1c0d0d8SEdward Tomasz Napierala 	lun_backend
960009ea47eSEdward Tomasz Napierala 	|
961e1c0d0d8SEdward Tomasz Napierala 	lun_blocksize
962009ea47eSEdward Tomasz Napierala 	|
963e1c0d0d8SEdward Tomasz Napierala 	lun_device_id
964009ea47eSEdward Tomasz Napierala 	|
96591be33dcSAlexander Motin 	lun_device_type
96691be33dcSAlexander Motin 	|
9673933f7b1SAlexander Motin 	lun_ctl_lun
9683933f7b1SAlexander Motin 	|
969e1c0d0d8SEdward Tomasz Napierala 	lun_option
970009ea47eSEdward Tomasz Napierala 	|
971e1c0d0d8SEdward Tomasz Napierala 	lun_path
972009ea47eSEdward Tomasz Napierala 	|
973e1c0d0d8SEdward Tomasz Napierala 	lun_serial
974009ea47eSEdward Tomasz Napierala 	|
975e1c0d0d8SEdward Tomasz Napierala 	lun_size
976009ea47eSEdward Tomasz Napierala 	;
977009ea47eSEdward Tomasz Napierala 
978e1c0d0d8SEdward Tomasz Napierala lun_backend:	BACKEND STR
979009ea47eSEdward Tomasz Napierala 	{
980009ea47eSEdward Tomasz Napierala 		if (lun->l_backend != NULL) {
981920c6cbaSAlexander Motin 			log_warnx("backend for lun \"%s\" "
982009ea47eSEdward Tomasz Napierala 			    "specified more than once",
983920c6cbaSAlexander Motin 			    lun->l_name);
984009ea47eSEdward Tomasz Napierala 			free($2);
985009ea47eSEdward Tomasz Napierala 			return (1);
986009ea47eSEdward Tomasz Napierala 		}
987009ea47eSEdward Tomasz Napierala 		lun_set_backend(lun, $2);
988009ea47eSEdward Tomasz Napierala 		free($2);
989009ea47eSEdward Tomasz Napierala 	}
990009ea47eSEdward Tomasz Napierala 	;
991009ea47eSEdward Tomasz Napierala 
9924524db57SEdward Tomasz Napierala lun_blocksize:	BLOCKSIZE STR
993009ea47eSEdward Tomasz Napierala 	{
9944524db57SEdward Tomasz Napierala 		uint64_t tmp;
9954524db57SEdward Tomasz Napierala 
9964524db57SEdward Tomasz Napierala 		if (expand_number($2, &tmp) != 0) {
997d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
9984524db57SEdward Tomasz Napierala 			free($2);
9994524db57SEdward Tomasz Napierala 			return (1);
10004524db57SEdward Tomasz Napierala 		}
10014524db57SEdward Tomasz Napierala 
1002009ea47eSEdward Tomasz Napierala 		if (lun->l_blocksize != 0) {
1003920c6cbaSAlexander Motin 			log_warnx("blocksize for lun \"%s\" "
1004009ea47eSEdward Tomasz Napierala 			    "specified more than once",
1005920c6cbaSAlexander Motin 			    lun->l_name);
1006009ea47eSEdward Tomasz Napierala 			return (1);
1007009ea47eSEdward Tomasz Napierala 		}
10084524db57SEdward Tomasz Napierala 		lun_set_blocksize(lun, tmp);
1009009ea47eSEdward Tomasz Napierala 	}
1010009ea47eSEdward Tomasz Napierala 	;
1011009ea47eSEdward Tomasz Napierala 
1012e1c0d0d8SEdward Tomasz Napierala lun_device_id:	DEVICE_ID STR
1013009ea47eSEdward Tomasz Napierala 	{
1014009ea47eSEdward Tomasz Napierala 		if (lun->l_device_id != NULL) {
1015920c6cbaSAlexander Motin 			log_warnx("device_id for lun \"%s\" "
1016009ea47eSEdward Tomasz Napierala 			    "specified more than once",
1017920c6cbaSAlexander Motin 			    lun->l_name);
1018009ea47eSEdward Tomasz Napierala 			free($2);
1019009ea47eSEdward Tomasz Napierala 			return (1);
1020009ea47eSEdward Tomasz Napierala 		}
1021009ea47eSEdward Tomasz Napierala 		lun_set_device_id(lun, $2);
1022009ea47eSEdward Tomasz Napierala 		free($2);
1023009ea47eSEdward Tomasz Napierala 	}
1024009ea47eSEdward Tomasz Napierala 	;
1025009ea47eSEdward Tomasz Napierala 
102691be33dcSAlexander Motin lun_device_type:	DEVICE_TYPE STR
102791be33dcSAlexander Motin 	{
102891be33dcSAlexander Motin 		uint64_t tmp;
102991be33dcSAlexander Motin 
103091be33dcSAlexander Motin 		if (strcasecmp($2, "disk") == 0 ||
103191be33dcSAlexander Motin 		    strcasecmp($2, "direct") == 0)
103291be33dcSAlexander Motin 			tmp = 0;
103391be33dcSAlexander Motin 		else if (strcasecmp($2, "processor") == 0)
103491be33dcSAlexander Motin 			tmp = 3;
103591be33dcSAlexander Motin 		else if (strcasecmp($2, "cd") == 0 ||
103691be33dcSAlexander Motin 		    strcasecmp($2, "cdrom") == 0 ||
103791be33dcSAlexander Motin 		    strcasecmp($2, "dvd") == 0 ||
103891be33dcSAlexander Motin 		    strcasecmp($2, "dvdrom") == 0)
103991be33dcSAlexander Motin 			tmp = 5;
104091be33dcSAlexander Motin 		else if (expand_number($2, &tmp) != 0 ||
104191be33dcSAlexander Motin 		    tmp > 15) {
104291be33dcSAlexander Motin 			yyerror("invalid numeric value");
104391be33dcSAlexander Motin 			free($2);
104491be33dcSAlexander Motin 			return (1);
104591be33dcSAlexander Motin 		}
104691be33dcSAlexander Motin 
104791be33dcSAlexander Motin 		lun_set_device_type(lun, tmp);
104891be33dcSAlexander Motin 	}
104991be33dcSAlexander Motin 	;
105091be33dcSAlexander Motin 
10513933f7b1SAlexander Motin lun_ctl_lun:	CTL_LUN STR
10523933f7b1SAlexander Motin 	{
10533933f7b1SAlexander Motin 		uint64_t tmp;
10543933f7b1SAlexander Motin 
10553933f7b1SAlexander Motin 		if (expand_number($2, &tmp) != 0) {
10563933f7b1SAlexander Motin 			yyerror("invalid numeric value");
10573933f7b1SAlexander Motin 			free($2);
10583933f7b1SAlexander Motin 			return (1);
10593933f7b1SAlexander Motin 		}
10603933f7b1SAlexander Motin 
10613933f7b1SAlexander Motin 		if (lun->l_ctl_lun >= 0) {
10623933f7b1SAlexander Motin 			log_warnx("ctl_lun for lun \"%s\" "
10633933f7b1SAlexander Motin 			    "specified more than once",
10643933f7b1SAlexander Motin 			    lun->l_name);
10653933f7b1SAlexander Motin 			return (1);
10663933f7b1SAlexander Motin 		}
10673933f7b1SAlexander Motin 		lun_set_ctl_lun(lun, tmp);
10683933f7b1SAlexander Motin 	}
10693933f7b1SAlexander Motin 	;
10703933f7b1SAlexander Motin 
1071e1c0d0d8SEdward Tomasz Napierala lun_option:	OPTION STR STR
1072009ea47eSEdward Tomasz Napierala 	{
1073398290f2SAlexander Motin 		struct option *o;
1074009ea47eSEdward Tomasz Napierala 
1075398290f2SAlexander Motin 		o = option_new(&lun->l_options, $2, $3);
1076009ea47eSEdward Tomasz Napierala 		free($2);
1077009ea47eSEdward Tomasz Napierala 		free($3);
1078398290f2SAlexander Motin 		if (o == NULL)
1079009ea47eSEdward Tomasz Napierala 			return (1);
1080009ea47eSEdward Tomasz Napierala 	}
1081009ea47eSEdward Tomasz Napierala 	;
1082009ea47eSEdward Tomasz Napierala 
1083e1c0d0d8SEdward Tomasz Napierala lun_path:	PATH STR
1084009ea47eSEdward Tomasz Napierala 	{
1085009ea47eSEdward Tomasz Napierala 		if (lun->l_path != NULL) {
1086920c6cbaSAlexander Motin 			log_warnx("path for lun \"%s\" "
1087009ea47eSEdward Tomasz Napierala 			    "specified more than once",
1088920c6cbaSAlexander Motin 			    lun->l_name);
1089009ea47eSEdward Tomasz Napierala 			free($2);
1090009ea47eSEdward Tomasz Napierala 			return (1);
1091009ea47eSEdward Tomasz Napierala 		}
1092009ea47eSEdward Tomasz Napierala 		lun_set_path(lun, $2);
1093009ea47eSEdward Tomasz Napierala 		free($2);
1094009ea47eSEdward Tomasz Napierala 	}
1095009ea47eSEdward Tomasz Napierala 	;
1096009ea47eSEdward Tomasz Napierala 
1097e1c0d0d8SEdward Tomasz Napierala lun_serial:	SERIAL STR
1098009ea47eSEdward Tomasz Napierala 	{
1099009ea47eSEdward Tomasz Napierala 		if (lun->l_serial != NULL) {
1100920c6cbaSAlexander Motin 			log_warnx("serial for lun \"%s\" "
1101009ea47eSEdward Tomasz Napierala 			    "specified more than once",
1102920c6cbaSAlexander Motin 			    lun->l_name);
1103009ea47eSEdward Tomasz Napierala 			free($2);
1104009ea47eSEdward Tomasz Napierala 			return (1);
1105009ea47eSEdward Tomasz Napierala 		}
1106009ea47eSEdward Tomasz Napierala 		lun_set_serial(lun, $2);
1107009ea47eSEdward Tomasz Napierala 		free($2);
1108009ea47eSEdward Tomasz Napierala 	}
1109009ea47eSEdward Tomasz Napierala 	;
1110009ea47eSEdward Tomasz Napierala 
11114524db57SEdward Tomasz Napierala lun_size:	SIZE STR
1112009ea47eSEdward Tomasz Napierala 	{
11134524db57SEdward Tomasz Napierala 		uint64_t tmp;
11144524db57SEdward Tomasz Napierala 
11154524db57SEdward Tomasz Napierala 		if (expand_number($2, &tmp) != 0) {
1116d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
11174524db57SEdward Tomasz Napierala 			free($2);
11184524db57SEdward Tomasz Napierala 			return (1);
11194524db57SEdward Tomasz Napierala 		}
11204524db57SEdward Tomasz Napierala 
1121009ea47eSEdward Tomasz Napierala 		if (lun->l_size != 0) {
1122920c6cbaSAlexander Motin 			log_warnx("size for lun \"%s\" "
1123009ea47eSEdward Tomasz Napierala 			    "specified more than once",
1124920c6cbaSAlexander Motin 			    lun->l_name);
1125009ea47eSEdward Tomasz Napierala 			return (1);
1126009ea47eSEdward Tomasz Napierala 		}
11274524db57SEdward Tomasz Napierala 		lun_set_size(lun, tmp);
1128009ea47eSEdward Tomasz Napierala 	}
1129009ea47eSEdward Tomasz Napierala 	;
1130009ea47eSEdward Tomasz Napierala %%
1131009ea47eSEdward Tomasz Napierala 
1132009ea47eSEdward Tomasz Napierala void
1133009ea47eSEdward Tomasz Napierala yyerror(const char *str)
1134009ea47eSEdward Tomasz Napierala {
1135009ea47eSEdward Tomasz Napierala 
1136009ea47eSEdward Tomasz Napierala 	log_warnx("error in configuration file at line %d near '%s': %s",
1137009ea47eSEdward Tomasz Napierala 	    lineno, yytext, str);
1138009ea47eSEdward Tomasz Napierala }
1139009ea47eSEdward Tomasz Napierala 
11405c734b04SJakub Wojciech Klama int
11415c734b04SJakub Wojciech Klama parse_conf(struct conf *newconf, const char *path)
1142009ea47eSEdward Tomasz Napierala {
1143009ea47eSEdward Tomasz Napierala 	int error;
1144009ea47eSEdward Tomasz Napierala 
11455c734b04SJakub Wojciech Klama 	conf = newconf;
1146009ea47eSEdward Tomasz Napierala 	yyin = fopen(path, "r");
1147009ea47eSEdward Tomasz Napierala 	if (yyin == NULL) {
1148009ea47eSEdward Tomasz Napierala 		log_warn("unable to open configuration file %s", path);
11495c734b04SJakub Wojciech Klama 		return (1);
1150009ea47eSEdward Tomasz Napierala 	}
11515c734b04SJakub Wojciech Klama 
11526dc3a9f4SEdward Tomasz Napierala 	lineno = 1;
1153009ea47eSEdward Tomasz Napierala 	yyrestart(yyin);
1154009ea47eSEdward Tomasz Napierala 	error = yyparse();
1155009ea47eSEdward Tomasz Napierala 	auth_group = NULL;
1156009ea47eSEdward Tomasz Napierala 	portal_group = NULL;
1157009ea47eSEdward Tomasz Napierala 	target = NULL;
1158009ea47eSEdward Tomasz Napierala 	lun = NULL;
1159009ea47eSEdward Tomasz Napierala 	fclose(yyin);
1160009ea47eSEdward Tomasz Napierala 
11615c734b04SJakub Wojciech Klama 	return (error);
1162009ea47eSEdward Tomasz Napierala }
1163