xref: /freebsd/usr.sbin/ctld/parse.y (revision b3e76948)
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/queue.h>
33009ea47eSEdward Tomasz Napierala #include <sys/types.h>
34009ea47eSEdward Tomasz Napierala #include <sys/stat.h>
35009ea47eSEdward Tomasz Napierala #include <assert.h>
36009ea47eSEdward Tomasz Napierala #include <stdio.h>
37009ea47eSEdward Tomasz Napierala #include <stdlib.h>
38009ea47eSEdward Tomasz Napierala #include <string.h>
39009ea47eSEdward Tomasz Napierala 
40009ea47eSEdward Tomasz Napierala #include "ctld.h"
4164ffe6d4SRichard Scheffenegger #include <netinet/in.h>
4264ffe6d4SRichard Scheffenegger #include <netinet/ip.h>
43009ea47eSEdward Tomasz Napierala 
44009ea47eSEdward Tomasz Napierala extern FILE *yyin;
45009ea47eSEdward Tomasz Napierala extern char *yytext;
46009ea47eSEdward Tomasz Napierala extern int lineno;
47009ea47eSEdward Tomasz Napierala 
48009ea47eSEdward Tomasz Napierala static struct conf *conf = NULL;
49009ea47eSEdward Tomasz Napierala static struct auth_group *auth_group = NULL;
50009ea47eSEdward Tomasz Napierala static struct portal_group *portal_group = NULL;
51009ea47eSEdward Tomasz Napierala static struct target *target = NULL;
52009ea47eSEdward Tomasz Napierala static struct lun *lun = NULL;
53009ea47eSEdward Tomasz Napierala 
54009ea47eSEdward Tomasz Napierala extern void	yyerror(const char *);
55009ea47eSEdward Tomasz Napierala extern void	yyrestart(FILE *);
56009ea47eSEdward Tomasz Napierala 
57009ea47eSEdward Tomasz Napierala %}
58009ea47eSEdward Tomasz Napierala 
59df9900fbSEdward Tomasz Napierala %token ALIAS AUTH_GROUP AUTH_TYPE BACKEND BLOCKSIZE CHAP CHAP_MUTUAL
6091be33dcSAlexander Motin %token CLOSING_BRACKET CTL_LUN DEBUG DEVICE_ID DEVICE_TYPE
6164ffe6d4SRichard Scheffenegger %token DISCOVERY_AUTH_GROUP DISCOVERY_FILTER DSCP FOREIGN
62dbb1ee18SEdward Tomasz Napierala %token INITIATOR_NAME INITIATOR_PORTAL ISNS_SERVER ISNS_PERIOD ISNS_TIMEOUT
6307b49a3eSEdward Tomasz Napierala %token LISTEN LISTEN_ISER LUN MAXPROC OFFLOAD OPENING_BRACKET OPTION
64ea8f1280SRichard Scheffenegger %token PATH PCP PIDFILE PORT PORTAL_GROUP REDIRECT SEMICOLON SERIAL
65ea8f1280SRichard Scheffenegger %token SIZE STR TAG TARGET TIMEOUT
6664ffe6d4SRichard Scheffenegger %token AF11 AF12 AF13 AF21 AF22 AF23 AF31 AF32 AF33 AF41 AF42 AF43
6764ffe6d4SRichard Scheffenegger %token BE EF CS0 CS1 CS2 CS3 CS4 CS5 CS6 CS7
68009ea47eSEdward Tomasz Napierala 
69009ea47eSEdward Tomasz Napierala %union
70009ea47eSEdward Tomasz Napierala {
71009ea47eSEdward Tomasz Napierala 	char *str;
72009ea47eSEdward Tomasz Napierala }
73009ea47eSEdward Tomasz Napierala 
74009ea47eSEdward Tomasz Napierala %token <str> STR
75009ea47eSEdward Tomasz Napierala 
76009ea47eSEdward Tomasz Napierala %%
77009ea47eSEdward Tomasz Napierala 
78009ea47eSEdward Tomasz Napierala statements:
79009ea47eSEdward Tomasz Napierala 	|
80009ea47eSEdward Tomasz Napierala 	statements statement
81f9488580SEdward Tomasz Napierala 	|
82f9488580SEdward Tomasz Napierala 	statements statement SEMICOLON
83009ea47eSEdward Tomasz Napierala 	;
84009ea47eSEdward Tomasz Napierala 
85009ea47eSEdward Tomasz Napierala statement:
86e1c0d0d8SEdward Tomasz Napierala 	debug
87009ea47eSEdward Tomasz Napierala 	|
88e1c0d0d8SEdward Tomasz Napierala 	timeout
89009ea47eSEdward Tomasz Napierala 	|
90e1c0d0d8SEdward Tomasz Napierala 	maxproc
91009ea47eSEdward Tomasz Napierala 	|
92e1c0d0d8SEdward Tomasz Napierala 	pidfile
93009ea47eSEdward Tomasz Napierala 	|
94829603e2SAlexander Motin 	isns_server
95829603e2SAlexander Motin 	|
96829603e2SAlexander Motin 	isns_period
97829603e2SAlexander Motin 	|
98829603e2SAlexander Motin 	isns_timeout
99829603e2SAlexander Motin 	|
100e1c0d0d8SEdward Tomasz Napierala 	auth_group
101009ea47eSEdward Tomasz Napierala 	|
102e1c0d0d8SEdward Tomasz Napierala 	portal_group
103009ea47eSEdward Tomasz Napierala 	|
104920c6cbaSAlexander Motin 	lun
105920c6cbaSAlexander Motin 	|
106e1c0d0d8SEdward Tomasz Napierala 	target
107009ea47eSEdward Tomasz Napierala 	;
108009ea47eSEdward Tomasz Napierala 
1094524db57SEdward Tomasz Napierala debug:		DEBUG STR
110009ea47eSEdward Tomasz Napierala 	{
1114524db57SEdward Tomasz Napierala 		uint64_t tmp;
1124524db57SEdward Tomasz Napierala 
1134524db57SEdward Tomasz Napierala 		if (expand_number($2, &tmp) != 0) {
114d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
1154524db57SEdward Tomasz Napierala 			free($2);
1164524db57SEdward Tomasz Napierala 			return (1);
1174524db57SEdward Tomasz Napierala 		}
1184524db57SEdward Tomasz Napierala 
1194524db57SEdward Tomasz Napierala 		conf->conf_debug = tmp;
120009ea47eSEdward Tomasz Napierala 	}
121009ea47eSEdward Tomasz Napierala 	;
122009ea47eSEdward Tomasz Napierala 
1234524db57SEdward Tomasz Napierala timeout:	TIMEOUT STR
124009ea47eSEdward Tomasz Napierala 	{
1254524db57SEdward Tomasz Napierala 		uint64_t tmp;
1264524db57SEdward Tomasz Napierala 
1274524db57SEdward Tomasz Napierala 		if (expand_number($2, &tmp) != 0) {
128d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
1294524db57SEdward Tomasz Napierala 			free($2);
1304524db57SEdward Tomasz Napierala 			return (1);
1314524db57SEdward Tomasz Napierala 		}
1324524db57SEdward Tomasz Napierala 
1334524db57SEdward Tomasz Napierala 		conf->conf_timeout = tmp;
134009ea47eSEdward Tomasz Napierala 	}
135009ea47eSEdward Tomasz Napierala 	;
136009ea47eSEdward Tomasz Napierala 
1374524db57SEdward Tomasz Napierala maxproc:	MAXPROC STR
138009ea47eSEdward Tomasz Napierala 	{
1394524db57SEdward Tomasz Napierala 		uint64_t tmp;
1404524db57SEdward Tomasz Napierala 
1414524db57SEdward Tomasz Napierala 		if (expand_number($2, &tmp) != 0) {
142d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
1434524db57SEdward Tomasz Napierala 			free($2);
1444524db57SEdward Tomasz Napierala 			return (1);
1454524db57SEdward Tomasz Napierala 		}
1464524db57SEdward Tomasz Napierala 
1474524db57SEdward Tomasz Napierala 		conf->conf_maxproc = tmp;
148009ea47eSEdward Tomasz Napierala 	}
149009ea47eSEdward Tomasz Napierala 	;
150009ea47eSEdward Tomasz Napierala 
151e1c0d0d8SEdward Tomasz Napierala pidfile:	PIDFILE STR
152009ea47eSEdward Tomasz Napierala 	{
153009ea47eSEdward Tomasz Napierala 		if (conf->conf_pidfile_path != NULL) {
154009ea47eSEdward Tomasz Napierala 			log_warnx("pidfile specified more than once");
155009ea47eSEdward Tomasz Napierala 			free($2);
156009ea47eSEdward Tomasz Napierala 			return (1);
157009ea47eSEdward Tomasz Napierala 		}
158009ea47eSEdward Tomasz Napierala 		conf->conf_pidfile_path = $2;
159009ea47eSEdward Tomasz Napierala 	}
160009ea47eSEdward Tomasz Napierala 	;
161009ea47eSEdward Tomasz Napierala 
162829603e2SAlexander Motin isns_server:	ISNS_SERVER STR
163829603e2SAlexander Motin 	{
164829603e2SAlexander Motin 		int error;
165829603e2SAlexander Motin 
166829603e2SAlexander Motin 		error = isns_new(conf, $2);
167829603e2SAlexander Motin 		free($2);
168829603e2SAlexander Motin 		if (error != 0)
169829603e2SAlexander Motin 			return (1);
170829603e2SAlexander Motin 	}
171829603e2SAlexander Motin 	;
172829603e2SAlexander Motin 
173d9b4554dSEdward Tomasz Napierala isns_period:	ISNS_PERIOD STR
174829603e2SAlexander Motin 	{
175d9b4554dSEdward Tomasz Napierala 		uint64_t tmp;
176d9b4554dSEdward Tomasz Napierala 
177d9b4554dSEdward Tomasz Napierala 		if (expand_number($2, &tmp) != 0) {
178d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
179d9b4554dSEdward Tomasz Napierala 			free($2);
180d9b4554dSEdward Tomasz Napierala 			return (1);
181d9b4554dSEdward Tomasz Napierala 		}
182d9b4554dSEdward Tomasz Napierala 
183d9b4554dSEdward Tomasz Napierala 		conf->conf_isns_period = tmp;
184829603e2SAlexander Motin 	}
185829603e2SAlexander Motin 	;
186829603e2SAlexander Motin 
187d9b4554dSEdward Tomasz Napierala isns_timeout:	ISNS_TIMEOUT STR
188829603e2SAlexander Motin 	{
189d9b4554dSEdward Tomasz Napierala 		uint64_t tmp;
190d9b4554dSEdward Tomasz Napierala 
191d9b4554dSEdward Tomasz Napierala 		if (expand_number($2, &tmp) != 0) {
192d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
193d9b4554dSEdward Tomasz Napierala 			free($2);
194d9b4554dSEdward Tomasz Napierala 			return (1);
195d9b4554dSEdward Tomasz Napierala 		}
196d9b4554dSEdward Tomasz Napierala 
197d9b4554dSEdward Tomasz Napierala 		conf->conf_isns_timeout = tmp;
198829603e2SAlexander Motin 	}
199829603e2SAlexander Motin 	;
200829603e2SAlexander Motin 
201e1c0d0d8SEdward Tomasz Napierala auth_group:	AUTH_GROUP auth_group_name
202009ea47eSEdward Tomasz Napierala     OPENING_BRACKET auth_group_entries CLOSING_BRACKET
203009ea47eSEdward Tomasz Napierala 	{
204009ea47eSEdward Tomasz Napierala 		auth_group = NULL;
205009ea47eSEdward Tomasz Napierala 	}
206009ea47eSEdward Tomasz Napierala 	;
207009ea47eSEdward Tomasz Napierala 
208009ea47eSEdward Tomasz Napierala auth_group_name:	STR
209009ea47eSEdward Tomasz Napierala 	{
210e7977549SEdward Tomasz Napierala 		/*
211e7977549SEdward Tomasz Napierala 		 * Make it possible to redefine default
212e7977549SEdward Tomasz Napierala 		 * auth-group. but only once.
213e7977549SEdward Tomasz Napierala 		 */
214e7977549SEdward Tomasz Napierala 		if (strcmp($1, "default") == 0 &&
215e7977549SEdward Tomasz Napierala 		    conf->conf_default_ag_defined == false) {
216e7977549SEdward Tomasz Napierala 			auth_group = auth_group_find(conf, $1);
217e7977549SEdward Tomasz Napierala 			conf->conf_default_ag_defined = true;
218e7977549SEdward Tomasz Napierala 		} else {
219009ea47eSEdward Tomasz Napierala 			auth_group = auth_group_new(conf, $1);
220e7977549SEdward Tomasz Napierala 		}
221009ea47eSEdward Tomasz Napierala 		free($1);
222009ea47eSEdward Tomasz Napierala 		if (auth_group == NULL)
223009ea47eSEdward Tomasz Napierala 			return (1);
224009ea47eSEdward Tomasz Napierala 	}
225009ea47eSEdward Tomasz Napierala 	;
226009ea47eSEdward Tomasz Napierala 
227009ea47eSEdward Tomasz Napierala auth_group_entries:
228009ea47eSEdward Tomasz Napierala 	|
229009ea47eSEdward Tomasz Napierala 	auth_group_entries auth_group_entry
230f9488580SEdward Tomasz Napierala 	|
231f9488580SEdward Tomasz Napierala 	auth_group_entries auth_group_entry SEMICOLON
232009ea47eSEdward Tomasz Napierala 	;
233009ea47eSEdward Tomasz Napierala 
234009ea47eSEdward Tomasz Napierala auth_group_entry:
235df9900fbSEdward Tomasz Napierala 	auth_group_auth_type
236df9900fbSEdward Tomasz Napierala 	|
237009ea47eSEdward Tomasz Napierala 	auth_group_chap
238009ea47eSEdward Tomasz Napierala 	|
239009ea47eSEdward Tomasz Napierala 	auth_group_chap_mutual
2408cb2e958SEdward Tomasz Napierala 	|
2418cb2e958SEdward Tomasz Napierala 	auth_group_initiator_name
2428cb2e958SEdward Tomasz Napierala 	|
2438cb2e958SEdward Tomasz Napierala 	auth_group_initiator_portal
244009ea47eSEdward Tomasz Napierala 	;
245009ea47eSEdward Tomasz Napierala 
246df9900fbSEdward Tomasz Napierala auth_group_auth_type:	AUTH_TYPE STR
247df9900fbSEdward Tomasz Napierala 	{
248df9900fbSEdward Tomasz Napierala 		int error;
249df9900fbSEdward Tomasz Napierala 
250bd833b11SEdward Tomasz Napierala 		error = auth_group_set_type(auth_group, $2);
251df9900fbSEdward Tomasz Napierala 		free($2);
252df9900fbSEdward Tomasz Napierala 		if (error != 0)
253df9900fbSEdward Tomasz Napierala 			return (1);
254df9900fbSEdward Tomasz Napierala 	}
255df9900fbSEdward Tomasz Napierala 	;
256df9900fbSEdward Tomasz Napierala 
257009ea47eSEdward Tomasz Napierala auth_group_chap:	CHAP STR STR
258009ea47eSEdward Tomasz Napierala 	{
259009ea47eSEdward Tomasz Napierala 		const struct auth *ca;
260009ea47eSEdward Tomasz Napierala 
261009ea47eSEdward Tomasz Napierala 		ca = auth_new_chap(auth_group, $2, $3);
262009ea47eSEdward Tomasz Napierala 		free($2);
263009ea47eSEdward Tomasz Napierala 		free($3);
264009ea47eSEdward Tomasz Napierala 		if (ca == NULL)
265009ea47eSEdward Tomasz Napierala 			return (1);
266009ea47eSEdward Tomasz Napierala 	}
267009ea47eSEdward Tomasz Napierala 	;
268009ea47eSEdward Tomasz Napierala 
269009ea47eSEdward Tomasz Napierala auth_group_chap_mutual:	CHAP_MUTUAL STR STR STR STR
270009ea47eSEdward Tomasz Napierala 	{
271009ea47eSEdward Tomasz Napierala 		const struct auth *ca;
272009ea47eSEdward Tomasz Napierala 
273009ea47eSEdward Tomasz Napierala 		ca = auth_new_chap_mutual(auth_group, $2, $3, $4, $5);
274009ea47eSEdward Tomasz Napierala 		free($2);
275009ea47eSEdward Tomasz Napierala 		free($3);
276009ea47eSEdward Tomasz Napierala 		free($4);
277009ea47eSEdward Tomasz Napierala 		free($5);
278009ea47eSEdward Tomasz Napierala 		if (ca == NULL)
279009ea47eSEdward Tomasz Napierala 			return (1);
280009ea47eSEdward Tomasz Napierala 	}
281009ea47eSEdward Tomasz Napierala 	;
282009ea47eSEdward Tomasz Napierala 
2838cb2e958SEdward Tomasz Napierala auth_group_initiator_name:	INITIATOR_NAME STR
2848cb2e958SEdward Tomasz Napierala 	{
2858cb2e958SEdward Tomasz Napierala 		const struct auth_name *an;
2868cb2e958SEdward Tomasz Napierala 
2878cb2e958SEdward Tomasz Napierala 		an = auth_name_new(auth_group, $2);
2888cb2e958SEdward Tomasz Napierala 		free($2);
2898cb2e958SEdward Tomasz Napierala 		if (an == NULL)
2908cb2e958SEdward Tomasz Napierala 			return (1);
2918cb2e958SEdward Tomasz Napierala 	}
2928cb2e958SEdward Tomasz Napierala 	;
2938cb2e958SEdward Tomasz Napierala 
2948cb2e958SEdward Tomasz Napierala auth_group_initiator_portal:	INITIATOR_PORTAL STR
2958cb2e958SEdward Tomasz Napierala 	{
2968cb2e958SEdward Tomasz Napierala 		const struct auth_portal *ap;
2978cb2e958SEdward Tomasz Napierala 
2988cb2e958SEdward Tomasz Napierala 		ap = auth_portal_new(auth_group, $2);
2998cb2e958SEdward Tomasz Napierala 		free($2);
3008cb2e958SEdward Tomasz Napierala 		if (ap == NULL)
3018cb2e958SEdward Tomasz Napierala 			return (1);
3028cb2e958SEdward Tomasz Napierala 	}
3038cb2e958SEdward Tomasz Napierala 	;
3048cb2e958SEdward Tomasz Napierala 
305e1c0d0d8SEdward Tomasz Napierala portal_group:	PORTAL_GROUP portal_group_name
306009ea47eSEdward Tomasz Napierala     OPENING_BRACKET portal_group_entries CLOSING_BRACKET
307009ea47eSEdward Tomasz Napierala 	{
308009ea47eSEdward Tomasz Napierala 		portal_group = NULL;
309009ea47eSEdward Tomasz Napierala 	}
310009ea47eSEdward Tomasz Napierala 	;
311009ea47eSEdward Tomasz Napierala 
312009ea47eSEdward Tomasz Napierala portal_group_name:	STR
313009ea47eSEdward Tomasz Napierala 	{
314252d941cSEdward Tomasz Napierala 		/*
315252d941cSEdward Tomasz Napierala 		 * Make it possible to redefine default
316252d941cSEdward Tomasz Napierala 		 * portal-group. but only once.
317252d941cSEdward Tomasz Napierala 		 */
318252d941cSEdward Tomasz Napierala 		if (strcmp($1, "default") == 0 &&
319252d941cSEdward Tomasz Napierala 		    conf->conf_default_pg_defined == false) {
320252d941cSEdward Tomasz Napierala 			portal_group = portal_group_find(conf, $1);
321252d941cSEdward Tomasz Napierala 			conf->conf_default_pg_defined = true;
322252d941cSEdward Tomasz Napierala 		} else {
323009ea47eSEdward Tomasz Napierala 			portal_group = portal_group_new(conf, $1);
324252d941cSEdward Tomasz Napierala 		}
325009ea47eSEdward Tomasz Napierala 		free($1);
326009ea47eSEdward Tomasz Napierala 		if (portal_group == NULL)
327009ea47eSEdward Tomasz Napierala 			return (1);
328009ea47eSEdward Tomasz Napierala 	}
329009ea47eSEdward Tomasz Napierala 	;
330009ea47eSEdward Tomasz Napierala 
331009ea47eSEdward Tomasz Napierala portal_group_entries:
332009ea47eSEdward Tomasz Napierala 	|
333009ea47eSEdward Tomasz Napierala 	portal_group_entries portal_group_entry
334f9488580SEdward Tomasz Napierala 	|
335f9488580SEdward Tomasz Napierala 	portal_group_entries portal_group_entry SEMICOLON
336009ea47eSEdward Tomasz Napierala 	;
337009ea47eSEdward Tomasz Napierala 
338009ea47eSEdward Tomasz Napierala portal_group_entry:
339009ea47eSEdward Tomasz Napierala 	portal_group_discovery_auth_group
340009ea47eSEdward Tomasz Napierala 	|
34105374883SEdward Tomasz Napierala 	portal_group_discovery_filter
34205374883SEdward Tomasz Napierala 	|
343db7bf2baSAlexander Motin 	portal_group_foreign
344db7bf2baSAlexander Motin 	|
345009ea47eSEdward Tomasz Napierala 	portal_group_listen
346009ea47eSEdward Tomasz Napierala 	|
347009ea47eSEdward Tomasz Napierala 	portal_group_listen_iser
3486dbdbf82SEdward Tomasz Napierala 	|
349a9d78210SEdward Tomasz Napierala 	portal_group_offload
350a9d78210SEdward Tomasz Napierala 	|
351398290f2SAlexander Motin 	portal_group_option
352398290f2SAlexander Motin 	|
3536dbdbf82SEdward Tomasz Napierala 	portal_group_redirect
354db7bf2baSAlexander Motin 	|
355db7bf2baSAlexander Motin 	portal_group_tag
35664ffe6d4SRichard Scheffenegger 	|
35764ffe6d4SRichard Scheffenegger 	portal_group_dscp
358ea8f1280SRichard Scheffenegger 	|
359ea8f1280SRichard Scheffenegger 	portal_group_pcp
360009ea47eSEdward Tomasz Napierala 	;
361009ea47eSEdward Tomasz Napierala 
362009ea47eSEdward Tomasz Napierala portal_group_discovery_auth_group:	DISCOVERY_AUTH_GROUP STR
363009ea47eSEdward Tomasz Napierala 	{
364009ea47eSEdward Tomasz Napierala 		if (portal_group->pg_discovery_auth_group != NULL) {
365009ea47eSEdward Tomasz Napierala 			log_warnx("discovery-auth-group for portal-group "
366009ea47eSEdward Tomasz Napierala 			    "\"%s\" specified more than once",
367009ea47eSEdward Tomasz Napierala 			    portal_group->pg_name);
368009ea47eSEdward Tomasz Napierala 			return (1);
369009ea47eSEdward Tomasz Napierala 		}
370009ea47eSEdward Tomasz Napierala 		portal_group->pg_discovery_auth_group =
371009ea47eSEdward Tomasz Napierala 		    auth_group_find(conf, $2);
372009ea47eSEdward Tomasz Napierala 		if (portal_group->pg_discovery_auth_group == NULL) {
373009ea47eSEdward Tomasz Napierala 			log_warnx("unknown discovery-auth-group \"%s\" "
374009ea47eSEdward Tomasz Napierala 			    "for portal-group \"%s\"",
375009ea47eSEdward Tomasz Napierala 			    $2, portal_group->pg_name);
376009ea47eSEdward Tomasz Napierala 			return (1);
377009ea47eSEdward Tomasz Napierala 		}
378009ea47eSEdward Tomasz Napierala 		free($2);
379009ea47eSEdward Tomasz Napierala 	}
380009ea47eSEdward Tomasz Napierala 	;
381009ea47eSEdward Tomasz Napierala 
38205374883SEdward Tomasz Napierala portal_group_discovery_filter:	DISCOVERY_FILTER STR
38305374883SEdward Tomasz Napierala 	{
38405374883SEdward Tomasz Napierala 		int error;
38505374883SEdward Tomasz Napierala 
386bd833b11SEdward Tomasz Napierala 		error = portal_group_set_filter(portal_group, $2);
38705374883SEdward Tomasz Napierala 		free($2);
38805374883SEdward Tomasz Napierala 		if (error != 0)
38905374883SEdward Tomasz Napierala 			return (1);
39005374883SEdward Tomasz Napierala 	}
39105374883SEdward Tomasz Napierala 	;
39205374883SEdward Tomasz Napierala 
393db7bf2baSAlexander Motin portal_group_foreign:	FOREIGN
394db7bf2baSAlexander Motin 	{
395db7bf2baSAlexander Motin 
396db7bf2baSAlexander Motin 		portal_group->pg_foreign = 1;
397db7bf2baSAlexander Motin 	}
398db7bf2baSAlexander Motin 	;
399db7bf2baSAlexander Motin 
400009ea47eSEdward Tomasz Napierala portal_group_listen:	LISTEN STR
401009ea47eSEdward Tomasz Napierala 	{
402009ea47eSEdward Tomasz Napierala 		int error;
403009ea47eSEdward Tomasz Napierala 
404009ea47eSEdward Tomasz Napierala 		error = portal_group_add_listen(portal_group, $2, false);
405009ea47eSEdward Tomasz Napierala 		free($2);
406009ea47eSEdward Tomasz Napierala 		if (error != 0)
407009ea47eSEdward Tomasz Napierala 			return (1);
408009ea47eSEdward Tomasz Napierala 	}
409009ea47eSEdward Tomasz Napierala 	;
410009ea47eSEdward Tomasz Napierala 
411009ea47eSEdward Tomasz Napierala portal_group_listen_iser:	LISTEN_ISER STR
412009ea47eSEdward Tomasz Napierala 	{
413009ea47eSEdward Tomasz Napierala 		int error;
414009ea47eSEdward Tomasz Napierala 
415009ea47eSEdward Tomasz Napierala 		error = portal_group_add_listen(portal_group, $2, true);
416009ea47eSEdward Tomasz Napierala 		free($2);
417009ea47eSEdward Tomasz Napierala 		if (error != 0)
418009ea47eSEdward Tomasz Napierala 			return (1);
419009ea47eSEdward Tomasz Napierala 	}
420009ea47eSEdward Tomasz Napierala 	;
421009ea47eSEdward Tomasz Napierala 
422a9d78210SEdward Tomasz Napierala portal_group_offload:	OFFLOAD STR
423a9d78210SEdward Tomasz Napierala 	{
424a9d78210SEdward Tomasz Napierala 		int error;
425a9d78210SEdward Tomasz Napierala 
426a9d78210SEdward Tomasz Napierala 		error = portal_group_set_offload(portal_group, $2);
427a9d78210SEdward Tomasz Napierala 		free($2);
428a9d78210SEdward Tomasz Napierala 		if (error != 0)
429a9d78210SEdward Tomasz Napierala 			return (1);
430a9d78210SEdward Tomasz Napierala 	}
431a9d78210SEdward Tomasz Napierala 	;
432a9d78210SEdward Tomasz Napierala 
433398290f2SAlexander Motin portal_group_option:	OPTION STR STR
434398290f2SAlexander Motin 	{
435398290f2SAlexander Motin 		struct option *o;
436398290f2SAlexander Motin 
437398290f2SAlexander Motin 		o = option_new(&portal_group->pg_options, $2, $3);
438398290f2SAlexander Motin 		free($2);
439398290f2SAlexander Motin 		free($3);
440398290f2SAlexander Motin 		if (o == NULL)
441398290f2SAlexander Motin 			return (1);
442398290f2SAlexander Motin 	}
443398290f2SAlexander Motin 	;
444398290f2SAlexander Motin 
4456dbdbf82SEdward Tomasz Napierala portal_group_redirect:	REDIRECT STR
4466dbdbf82SEdward Tomasz Napierala 	{
4476dbdbf82SEdward Tomasz Napierala 		int error;
4486dbdbf82SEdward Tomasz Napierala 
4496dbdbf82SEdward Tomasz Napierala 		error = portal_group_set_redirection(portal_group, $2);
4506dbdbf82SEdward Tomasz Napierala 		free($2);
4516dbdbf82SEdward Tomasz Napierala 		if (error != 0)
4526dbdbf82SEdward Tomasz Napierala 			return (1);
4536dbdbf82SEdward Tomasz Napierala 	}
4546dbdbf82SEdward Tomasz Napierala 	;
4556dbdbf82SEdward Tomasz Napierala 
456db7bf2baSAlexander Motin portal_group_tag:	TAG STR
457db7bf2baSAlexander Motin 	{
458db7bf2baSAlexander Motin 		uint64_t tmp;
459db7bf2baSAlexander Motin 
460db7bf2baSAlexander Motin 		if (expand_number($2, &tmp) != 0) {
461db7bf2baSAlexander Motin 			yyerror("invalid numeric value");
462db7bf2baSAlexander Motin 			free($2);
463db7bf2baSAlexander Motin 			return (1);
464db7bf2baSAlexander Motin 		}
465db7bf2baSAlexander Motin 
466db7bf2baSAlexander Motin 		portal_group->pg_tag = tmp;
467db7bf2baSAlexander Motin 	}
468db7bf2baSAlexander Motin 	;
469db7bf2baSAlexander Motin 
47064ffe6d4SRichard Scheffenegger portal_group_dscp
47164ffe6d4SRichard Scheffenegger : DSCP STR
47264ffe6d4SRichard Scheffenegger 	{
47364ffe6d4SRichard Scheffenegger 		uint64_t tmp;
47464ffe6d4SRichard Scheffenegger 
47564ffe6d4SRichard Scheffenegger 		if (strcmp($2, "0x") == 0) {
47664ffe6d4SRichard Scheffenegger 			tmp = strtol($2 + 2, NULL, 16);
47764ffe6d4SRichard Scheffenegger 		} else if (expand_number($2, &tmp) != 0) {
47864ffe6d4SRichard Scheffenegger 			yyerror("invalid numeric value");
47964ffe6d4SRichard Scheffenegger 			free($2);
48064ffe6d4SRichard Scheffenegger 			return(1);
48164ffe6d4SRichard Scheffenegger 		}
48264ffe6d4SRichard Scheffenegger 		if (tmp >= 0x40) {
48364ffe6d4SRichard Scheffenegger 			yyerror("invalid dscp value");
48464ffe6d4SRichard Scheffenegger 			return(1);
48564ffe6d4SRichard Scheffenegger 		}
48664ffe6d4SRichard Scheffenegger 
48764ffe6d4SRichard Scheffenegger 		portal_group->pg_dscp = tmp;
48864ffe6d4SRichard Scheffenegger 	}
48964ffe6d4SRichard Scheffenegger | DSCP BE	{ portal_group->pg_dscp = IPTOS_DSCP_CS0  >> 2 ; }
49064ffe6d4SRichard Scheffenegger | DSCP EF	{ portal_group->pg_dscp = IPTOS_DSCP_EF   >> 2 ; }
49164ffe6d4SRichard Scheffenegger | DSCP CS0	{ portal_group->pg_dscp = IPTOS_DSCP_CS0  >> 2 ; }
49264ffe6d4SRichard Scheffenegger | DSCP CS1	{ portal_group->pg_dscp = IPTOS_DSCP_CS1  >> 2 ; }
49364ffe6d4SRichard Scheffenegger | DSCP CS2	{ portal_group->pg_dscp = IPTOS_DSCP_CS2  >> 2 ; }
49464ffe6d4SRichard Scheffenegger | DSCP CS3	{ portal_group->pg_dscp = IPTOS_DSCP_CS3  >> 2 ; }
49564ffe6d4SRichard Scheffenegger | DSCP CS4	{ portal_group->pg_dscp = IPTOS_DSCP_CS4  >> 2 ; }
49664ffe6d4SRichard Scheffenegger | DSCP CS5	{ portal_group->pg_dscp = IPTOS_DSCP_CS5  >> 2 ; }
49764ffe6d4SRichard Scheffenegger | DSCP CS6	{ portal_group->pg_dscp = IPTOS_DSCP_CS6  >> 2 ; }
49864ffe6d4SRichard Scheffenegger | DSCP CS7	{ portal_group->pg_dscp = IPTOS_DSCP_CS7  >> 2 ; }
49964ffe6d4SRichard Scheffenegger | DSCP AF11	{ portal_group->pg_dscp = IPTOS_DSCP_AF11 >> 2 ; }
50064ffe6d4SRichard Scheffenegger | DSCP AF12	{ portal_group->pg_dscp = IPTOS_DSCP_AF12 >> 2 ; }
50164ffe6d4SRichard Scheffenegger | DSCP AF13	{ portal_group->pg_dscp = IPTOS_DSCP_AF13 >> 2 ; }
50264ffe6d4SRichard Scheffenegger | DSCP AF21	{ portal_group->pg_dscp = IPTOS_DSCP_AF21 >> 2 ; }
50364ffe6d4SRichard Scheffenegger | DSCP AF22	{ portal_group->pg_dscp = IPTOS_DSCP_AF22 >> 2 ; }
50464ffe6d4SRichard Scheffenegger | DSCP AF23	{ portal_group->pg_dscp = IPTOS_DSCP_AF23 >> 2 ; }
50564ffe6d4SRichard Scheffenegger | DSCP AF31	{ portal_group->pg_dscp = IPTOS_DSCP_AF31 >> 2 ; }
50664ffe6d4SRichard Scheffenegger | DSCP AF32	{ portal_group->pg_dscp = IPTOS_DSCP_AF32 >> 2 ; }
50764ffe6d4SRichard Scheffenegger | DSCP AF33	{ portal_group->pg_dscp = IPTOS_DSCP_AF33 >> 2 ; }
50864ffe6d4SRichard Scheffenegger | DSCP AF41	{ portal_group->pg_dscp = IPTOS_DSCP_AF41 >> 2 ; }
50964ffe6d4SRichard Scheffenegger | DSCP AF42	{ portal_group->pg_dscp = IPTOS_DSCP_AF42 >> 2 ; }
51064ffe6d4SRichard Scheffenegger | DSCP AF43	{ portal_group->pg_dscp = IPTOS_DSCP_AF43 >> 2 ; }
51164ffe6d4SRichard Scheffenegger 	;
51264ffe6d4SRichard Scheffenegger 
513ea8f1280SRichard Scheffenegger portal_group_pcp:	PCP STR
514ea8f1280SRichard Scheffenegger 	{
515ea8f1280SRichard Scheffenegger 		uint64_t tmp;
516ea8f1280SRichard Scheffenegger 
517ea8f1280SRichard Scheffenegger 		if (expand_number($2, &tmp) != 0) {
518ea8f1280SRichard Scheffenegger 			yyerror("invalid numeric value");
519ea8f1280SRichard Scheffenegger 			free($2);
520ea8f1280SRichard Scheffenegger 			return (1);
521ea8f1280SRichard Scheffenegger 		}
522e72a100bSAdrian Chadd 		if (tmp > 7) {
523ea8f1280SRichard Scheffenegger 			yyerror("invalid pcp value");
524ea8f1280SRichard Scheffenegger 			free($2);
525ea8f1280SRichard Scheffenegger 			return (1);
526ea8f1280SRichard Scheffenegger 		}
527ea8f1280SRichard Scheffenegger 
528ea8f1280SRichard Scheffenegger 		portal_group->pg_pcp = tmp;
529ea8f1280SRichard Scheffenegger 	}
530ea8f1280SRichard Scheffenegger 	;
53164ffe6d4SRichard Scheffenegger 
532920c6cbaSAlexander Motin lun:	LUN lun_name
533920c6cbaSAlexander Motin     OPENING_BRACKET lun_entries CLOSING_BRACKET
534920c6cbaSAlexander Motin 	{
535920c6cbaSAlexander Motin 		lun = NULL;
536920c6cbaSAlexander Motin 	}
537920c6cbaSAlexander Motin 	;
538920c6cbaSAlexander Motin 
539920c6cbaSAlexander Motin lun_name:	STR
540920c6cbaSAlexander Motin 	{
541920c6cbaSAlexander Motin 		lun = lun_new(conf, $1);
542920c6cbaSAlexander Motin 		free($1);
543920c6cbaSAlexander Motin 		if (lun == NULL)
544920c6cbaSAlexander Motin 			return (1);
545920c6cbaSAlexander Motin 	}
546920c6cbaSAlexander Motin 	;
547920c6cbaSAlexander Motin 
548e1c0d0d8SEdward Tomasz Napierala target:	TARGET target_name
549009ea47eSEdward Tomasz Napierala     OPENING_BRACKET target_entries CLOSING_BRACKET
550009ea47eSEdward Tomasz Napierala 	{
551009ea47eSEdward Tomasz Napierala 		target = NULL;
552009ea47eSEdward Tomasz Napierala 	}
553009ea47eSEdward Tomasz Napierala 	;
554009ea47eSEdward Tomasz Napierala 
555e1c0d0d8SEdward Tomasz Napierala target_name:	STR
556009ea47eSEdward Tomasz Napierala 	{
557009ea47eSEdward Tomasz Napierala 		target = target_new(conf, $1);
558009ea47eSEdward Tomasz Napierala 		free($1);
559009ea47eSEdward Tomasz Napierala 		if (target == NULL)
560009ea47eSEdward Tomasz Napierala 			return (1);
561009ea47eSEdward Tomasz Napierala 	}
562009ea47eSEdward Tomasz Napierala 	;
563009ea47eSEdward Tomasz Napierala 
564009ea47eSEdward Tomasz Napierala target_entries:
565009ea47eSEdward Tomasz Napierala 	|
566009ea47eSEdward Tomasz Napierala 	target_entries target_entry
567f9488580SEdward Tomasz Napierala 	|
568f9488580SEdward Tomasz Napierala 	target_entries target_entry SEMICOLON
569009ea47eSEdward Tomasz Napierala 	;
570009ea47eSEdward Tomasz Napierala 
571009ea47eSEdward Tomasz Napierala target_entry:
572e1c0d0d8SEdward Tomasz Napierala 	target_alias
573009ea47eSEdward Tomasz Napierala 	|
574e1c0d0d8SEdward Tomasz Napierala 	target_auth_group
575009ea47eSEdward Tomasz Napierala 	|
576df9900fbSEdward Tomasz Napierala 	target_auth_type
577df9900fbSEdward Tomasz Napierala 	|
578e1c0d0d8SEdward Tomasz Napierala 	target_chap
579009ea47eSEdward Tomasz Napierala 	|
580e1c0d0d8SEdward Tomasz Napierala 	target_chap_mutual
581009ea47eSEdward Tomasz Napierala 	|
582e1c0d0d8SEdward Tomasz Napierala 	target_initiator_name
5838cb2e958SEdward Tomasz Napierala 	|
584e1c0d0d8SEdward Tomasz Napierala 	target_initiator_portal
5858cb2e958SEdward Tomasz Napierala 	|
586e1c0d0d8SEdward Tomasz Napierala 	target_portal_group
587009ea47eSEdward Tomasz Napierala 	|
588057abcb0SAlexander Motin 	target_port
589057abcb0SAlexander Motin 	|
5906dbdbf82SEdward Tomasz Napierala 	target_redirect
5916dbdbf82SEdward Tomasz Napierala 	|
592e1c0d0d8SEdward Tomasz Napierala 	target_lun
593920c6cbaSAlexander Motin 	|
594920c6cbaSAlexander Motin 	target_lun_ref
595009ea47eSEdward Tomasz Napierala 	;
596009ea47eSEdward Tomasz Napierala 
597e1c0d0d8SEdward Tomasz Napierala target_alias:	ALIAS STR
598009ea47eSEdward Tomasz Napierala 	{
599009ea47eSEdward Tomasz Napierala 		if (target->t_alias != NULL) {
600009ea47eSEdward Tomasz Napierala 			log_warnx("alias for target \"%s\" "
601f7ae5bf8SEdward Tomasz Napierala 			    "specified more than once", target->t_name);
602009ea47eSEdward Tomasz Napierala 			return (1);
603009ea47eSEdward Tomasz Napierala 		}
604009ea47eSEdward Tomasz Napierala 		target->t_alias = $2;
605009ea47eSEdward Tomasz Napierala 	}
606009ea47eSEdward Tomasz Napierala 	;
607009ea47eSEdward Tomasz Napierala 
608e1c0d0d8SEdward Tomasz Napierala target_auth_group:	AUTH_GROUP STR
609009ea47eSEdward Tomasz Napierala 	{
610009ea47eSEdward Tomasz Napierala 		if (target->t_auth_group != NULL) {
611009ea47eSEdward Tomasz Napierala 			if (target->t_auth_group->ag_name != NULL)
612009ea47eSEdward Tomasz Napierala 				log_warnx("auth-group for target \"%s\" "
613f7ae5bf8SEdward Tomasz Napierala 				    "specified more than once", target->t_name);
614009ea47eSEdward Tomasz Napierala 			else
615df9900fbSEdward Tomasz Napierala 				log_warnx("cannot use both auth-group and explicit "
616009ea47eSEdward Tomasz Napierala 				    "authorisations for target \"%s\"",
617f7ae5bf8SEdward Tomasz Napierala 				    target->t_name);
618009ea47eSEdward Tomasz Napierala 			return (1);
619009ea47eSEdward Tomasz Napierala 		}
620009ea47eSEdward Tomasz Napierala 		target->t_auth_group = auth_group_find(conf, $2);
621009ea47eSEdward Tomasz Napierala 		if (target->t_auth_group == NULL) {
622009ea47eSEdward Tomasz Napierala 			log_warnx("unknown auth-group \"%s\" for target "
623f7ae5bf8SEdward Tomasz Napierala 			    "\"%s\"", $2, target->t_name);
624009ea47eSEdward Tomasz Napierala 			return (1);
625009ea47eSEdward Tomasz Napierala 		}
626009ea47eSEdward Tomasz Napierala 		free($2);
627009ea47eSEdward Tomasz Napierala 	}
628009ea47eSEdward Tomasz Napierala 	;
629009ea47eSEdward Tomasz Napierala 
630df9900fbSEdward Tomasz Napierala target_auth_type:	AUTH_TYPE STR
631df9900fbSEdward Tomasz Napierala 	{
632df9900fbSEdward Tomasz Napierala 		int error;
633df9900fbSEdward Tomasz Napierala 
634df9900fbSEdward Tomasz Napierala 		if (target->t_auth_group != NULL) {
635df9900fbSEdward Tomasz Napierala 			if (target->t_auth_group->ag_name != NULL) {
636df9900fbSEdward Tomasz Napierala 				log_warnx("cannot use both auth-group and "
637df9900fbSEdward Tomasz Napierala 				    "auth-type for target \"%s\"",
638df9900fbSEdward Tomasz Napierala 				    target->t_name);
639df9900fbSEdward Tomasz Napierala 				return (1);
640df9900fbSEdward Tomasz Napierala 			}
641df9900fbSEdward Tomasz Napierala 		} else {
642df9900fbSEdward Tomasz Napierala 			target->t_auth_group = auth_group_new(conf, NULL);
643df9900fbSEdward Tomasz Napierala 			if (target->t_auth_group == NULL) {
644df9900fbSEdward Tomasz Napierala 				free($2);
645df9900fbSEdward Tomasz Napierala 				return (1);
646df9900fbSEdward Tomasz Napierala 			}
647df9900fbSEdward Tomasz Napierala 			target->t_auth_group->ag_target = target;
648df9900fbSEdward Tomasz Napierala 		}
649bd833b11SEdward Tomasz Napierala 		error = auth_group_set_type(target->t_auth_group, $2);
650df9900fbSEdward Tomasz Napierala 		free($2);
651df9900fbSEdward Tomasz Napierala 		if (error != 0)
652df9900fbSEdward Tomasz Napierala 			return (1);
653df9900fbSEdward Tomasz Napierala 	}
654df9900fbSEdward Tomasz Napierala 	;
655df9900fbSEdward Tomasz Napierala 
656e1c0d0d8SEdward Tomasz Napierala target_chap:	CHAP STR STR
657009ea47eSEdward Tomasz Napierala 	{
658009ea47eSEdward Tomasz Napierala 		const struct auth *ca;
659009ea47eSEdward Tomasz Napierala 
660009ea47eSEdward Tomasz Napierala 		if (target->t_auth_group != NULL) {
661009ea47eSEdward Tomasz Napierala 			if (target->t_auth_group->ag_name != NULL) {
662df9900fbSEdward Tomasz Napierala 				log_warnx("cannot use both auth-group and "
663df9900fbSEdward Tomasz Napierala 				    "chap for target \"%s\"",
664f7ae5bf8SEdward Tomasz Napierala 				    target->t_name);
665009ea47eSEdward Tomasz Napierala 				free($2);
666009ea47eSEdward Tomasz Napierala 				free($3);
667009ea47eSEdward Tomasz Napierala 				return (1);
668009ea47eSEdward Tomasz Napierala 			}
669009ea47eSEdward Tomasz Napierala 		} else {
670009ea47eSEdward Tomasz Napierala 			target->t_auth_group = auth_group_new(conf, NULL);
671009ea47eSEdward Tomasz Napierala 			if (target->t_auth_group == NULL) {
672009ea47eSEdward Tomasz Napierala 				free($2);
673009ea47eSEdward Tomasz Napierala 				free($3);
674009ea47eSEdward Tomasz Napierala 				return (1);
675009ea47eSEdward Tomasz Napierala 			}
676009ea47eSEdward Tomasz Napierala 			target->t_auth_group->ag_target = target;
677009ea47eSEdward Tomasz Napierala 		}
678009ea47eSEdward Tomasz Napierala 		ca = auth_new_chap(target->t_auth_group, $2, $3);
679009ea47eSEdward Tomasz Napierala 		free($2);
680009ea47eSEdward Tomasz Napierala 		free($3);
681009ea47eSEdward Tomasz Napierala 		if (ca == NULL)
682009ea47eSEdward Tomasz Napierala 			return (1);
683009ea47eSEdward Tomasz Napierala 	}
684009ea47eSEdward Tomasz Napierala 	;
685009ea47eSEdward Tomasz Napierala 
686e1c0d0d8SEdward Tomasz Napierala target_chap_mutual:	CHAP_MUTUAL STR STR STR STR
687009ea47eSEdward Tomasz Napierala 	{
688009ea47eSEdward Tomasz Napierala 		const struct auth *ca;
689009ea47eSEdward Tomasz Napierala 
690009ea47eSEdward Tomasz Napierala 		if (target->t_auth_group != NULL) {
691009ea47eSEdward Tomasz Napierala 			if (target->t_auth_group->ag_name != NULL) {
692df9900fbSEdward Tomasz Napierala 				log_warnx("cannot use both auth-group and "
693df9900fbSEdward Tomasz Napierala 				    "chap-mutual for target \"%s\"",
694f7ae5bf8SEdward Tomasz Napierala 				    target->t_name);
695009ea47eSEdward Tomasz Napierala 				free($2);
696009ea47eSEdward Tomasz Napierala 				free($3);
697009ea47eSEdward Tomasz Napierala 				free($4);
698009ea47eSEdward Tomasz Napierala 				free($5);
699009ea47eSEdward Tomasz Napierala 				return (1);
700009ea47eSEdward Tomasz Napierala 			}
701009ea47eSEdward Tomasz Napierala 		} else {
702009ea47eSEdward Tomasz Napierala 			target->t_auth_group = auth_group_new(conf, NULL);
703009ea47eSEdward Tomasz Napierala 			if (target->t_auth_group == NULL) {
704009ea47eSEdward Tomasz Napierala 				free($2);
705009ea47eSEdward Tomasz Napierala 				free($3);
706009ea47eSEdward Tomasz Napierala 				free($4);
707009ea47eSEdward Tomasz Napierala 				free($5);
708009ea47eSEdward Tomasz Napierala 				return (1);
709009ea47eSEdward Tomasz Napierala 			}
710009ea47eSEdward Tomasz Napierala 			target->t_auth_group->ag_target = target;
711009ea47eSEdward Tomasz Napierala 		}
712009ea47eSEdward Tomasz Napierala 		ca = auth_new_chap_mutual(target->t_auth_group,
713009ea47eSEdward Tomasz Napierala 		    $2, $3, $4, $5);
714009ea47eSEdward Tomasz Napierala 		free($2);
715009ea47eSEdward Tomasz Napierala 		free($3);
716009ea47eSEdward Tomasz Napierala 		free($4);
717009ea47eSEdward Tomasz Napierala 		free($5);
718009ea47eSEdward Tomasz Napierala 		if (ca == NULL)
719009ea47eSEdward Tomasz Napierala 			return (1);
720009ea47eSEdward Tomasz Napierala 	}
721009ea47eSEdward Tomasz Napierala 	;
722009ea47eSEdward Tomasz Napierala 
723e1c0d0d8SEdward Tomasz Napierala target_initiator_name:	INITIATOR_NAME STR
7248cb2e958SEdward Tomasz Napierala 	{
7258cb2e958SEdward Tomasz Napierala 		const struct auth_name *an;
7268cb2e958SEdward Tomasz Napierala 
7278cb2e958SEdward Tomasz Napierala 		if (target->t_auth_group != NULL) {
7288cb2e958SEdward Tomasz Napierala 			if (target->t_auth_group->ag_name != NULL) {
729df9900fbSEdward Tomasz Napierala 				log_warnx("cannot use both auth-group and "
7308cb2e958SEdward Tomasz Napierala 				    "initiator-name for target \"%s\"",
731f7ae5bf8SEdward Tomasz Napierala 				    target->t_name);
7328cb2e958SEdward Tomasz Napierala 				free($2);
7338cb2e958SEdward Tomasz Napierala 				return (1);
7348cb2e958SEdward Tomasz Napierala 			}
7358cb2e958SEdward Tomasz Napierala 		} else {
7368cb2e958SEdward Tomasz Napierala 			target->t_auth_group = auth_group_new(conf, NULL);
7378cb2e958SEdward Tomasz Napierala 			if (target->t_auth_group == NULL) {
7388cb2e958SEdward Tomasz Napierala 				free($2);
7398cb2e958SEdward Tomasz Napierala 				return (1);
7408cb2e958SEdward Tomasz Napierala 			}
7418cb2e958SEdward Tomasz Napierala 			target->t_auth_group->ag_target = target;
7428cb2e958SEdward Tomasz Napierala 		}
7438cb2e958SEdward Tomasz Napierala 		an = auth_name_new(target->t_auth_group, $2);
7448cb2e958SEdward Tomasz Napierala 		free($2);
7458cb2e958SEdward Tomasz Napierala 		if (an == NULL)
7468cb2e958SEdward Tomasz Napierala 			return (1);
7478cb2e958SEdward Tomasz Napierala 	}
7488cb2e958SEdward Tomasz Napierala 	;
7498cb2e958SEdward Tomasz Napierala 
750e1c0d0d8SEdward Tomasz Napierala target_initiator_portal:	INITIATOR_PORTAL STR
7518cb2e958SEdward Tomasz Napierala 	{
7528cb2e958SEdward Tomasz Napierala 		const struct auth_portal *ap;
7538cb2e958SEdward Tomasz Napierala 
7548cb2e958SEdward Tomasz Napierala 		if (target->t_auth_group != NULL) {
7558cb2e958SEdward Tomasz Napierala 			if (target->t_auth_group->ag_name != NULL) {
756df9900fbSEdward Tomasz Napierala 				log_warnx("cannot use both auth-group and "
7578cb2e958SEdward Tomasz Napierala 				    "initiator-portal for target \"%s\"",
758f7ae5bf8SEdward Tomasz Napierala 				    target->t_name);
7598cb2e958SEdward Tomasz Napierala 				free($2);
7608cb2e958SEdward Tomasz Napierala 				return (1);
7618cb2e958SEdward Tomasz Napierala 			}
7628cb2e958SEdward Tomasz Napierala 		} else {
7638cb2e958SEdward Tomasz Napierala 			target->t_auth_group = auth_group_new(conf, NULL);
7648cb2e958SEdward Tomasz Napierala 			if (target->t_auth_group == NULL) {
7658cb2e958SEdward Tomasz Napierala 				free($2);
7668cb2e958SEdward Tomasz Napierala 				return (1);
7678cb2e958SEdward Tomasz Napierala 			}
7688cb2e958SEdward Tomasz Napierala 			target->t_auth_group->ag_target = target;
7698cb2e958SEdward Tomasz Napierala 		}
7708cb2e958SEdward Tomasz Napierala 		ap = auth_portal_new(target->t_auth_group, $2);
7718cb2e958SEdward Tomasz Napierala 		free($2);
7728cb2e958SEdward Tomasz Napierala 		if (ap == NULL)
7738cb2e958SEdward Tomasz Napierala 			return (1);
7748cb2e958SEdward Tomasz Napierala 	}
7758cb2e958SEdward Tomasz Napierala 	;
7768cb2e958SEdward Tomasz Napierala 
77792847ee1SAlexander Motin target_portal_group:	PORTAL_GROUP STR STR
778009ea47eSEdward Tomasz Napierala 	{
77992847ee1SAlexander Motin 		struct portal_group *tpg;
78092847ee1SAlexander Motin 		struct auth_group *tag;
78192847ee1SAlexander Motin 		struct port *tp;
78292847ee1SAlexander Motin 
78392847ee1SAlexander Motin 		tpg = portal_group_find(conf, $2);
78492847ee1SAlexander Motin 		if (tpg == NULL) {
78592847ee1SAlexander Motin 			log_warnx("unknown portal-group \"%s\" for target "
78692847ee1SAlexander Motin 			    "\"%s\"", $2, target->t_name);
78792847ee1SAlexander Motin 			free($2);
78892847ee1SAlexander Motin 			free($3);
78992847ee1SAlexander Motin 			return (1);
79092847ee1SAlexander Motin 		}
79192847ee1SAlexander Motin 		tag = auth_group_find(conf, $3);
79292847ee1SAlexander Motin 		if (tag == NULL) {
79392847ee1SAlexander Motin 			log_warnx("unknown auth-group \"%s\" for target "
79492847ee1SAlexander Motin 			    "\"%s\"", $3, target->t_name);
79592847ee1SAlexander Motin 			free($2);
79692847ee1SAlexander Motin 			free($3);
79792847ee1SAlexander Motin 			return (1);
79892847ee1SAlexander Motin 		}
79992847ee1SAlexander Motin 		tp = port_new(conf, target, tpg);
80092847ee1SAlexander Motin 		if (tp == NULL) {
80192847ee1SAlexander Motin 			log_warnx("can't link portal-group \"%s\" to target "
80292847ee1SAlexander Motin 			    "\"%s\"", $2, target->t_name);
803009ea47eSEdward Tomasz Napierala 			free($2);
804009ea47eSEdward Tomasz Napierala 			return (1);
805009ea47eSEdward Tomasz Napierala 		}
80692847ee1SAlexander Motin 		tp->p_auth_group = tag;
80792847ee1SAlexander Motin 		free($2);
80892847ee1SAlexander Motin 		free($3);
80992847ee1SAlexander Motin 	}
81092847ee1SAlexander Motin 	|		PORTAL_GROUP STR
81192847ee1SAlexander Motin 	{
81292847ee1SAlexander Motin 		struct portal_group *tpg;
81392847ee1SAlexander Motin 		struct port *tp;
81492847ee1SAlexander Motin 
81592847ee1SAlexander Motin 		tpg = portal_group_find(conf, $2);
81692847ee1SAlexander Motin 		if (tpg == NULL) {
817009ea47eSEdward Tomasz Napierala 			log_warnx("unknown portal-group \"%s\" for target "
818f7ae5bf8SEdward Tomasz Napierala 			    "\"%s\"", $2, target->t_name);
819009ea47eSEdward Tomasz Napierala 			free($2);
820009ea47eSEdward Tomasz Napierala 			return (1);
821009ea47eSEdward Tomasz Napierala 		}
82292847ee1SAlexander Motin 		tp = port_new(conf, target, tpg);
82392847ee1SAlexander Motin 		if (tp == NULL) {
82492847ee1SAlexander Motin 			log_warnx("can't link portal-group \"%s\" to target "
82592847ee1SAlexander Motin 			    "\"%s\"", $2, target->t_name);
82692847ee1SAlexander Motin 			free($2);
82792847ee1SAlexander Motin 			return (1);
82892847ee1SAlexander Motin 		}
829009ea47eSEdward Tomasz Napierala 		free($2);
830009ea47eSEdward Tomasz Napierala 	}
831009ea47eSEdward Tomasz Napierala 	;
832009ea47eSEdward Tomasz Napierala 
833057abcb0SAlexander Motin target_port:	PORT STR
834057abcb0SAlexander Motin 	{
835057abcb0SAlexander Motin 		struct pport *pp;
836057abcb0SAlexander Motin 		struct port *tp;
8378951f055SMarcelo Araujo 		int ret, i_pp, i_vp = 0;
838057abcb0SAlexander Motin 
8398951f055SMarcelo Araujo 		ret = sscanf($2, "ioctl/%d/%d", &i_pp, &i_vp);
8408951f055SMarcelo Araujo 		if (ret > 0) {
8418951f055SMarcelo Araujo 			tp = port_new_ioctl(conf, target, i_pp, i_vp);
8428951f055SMarcelo Araujo 			if (tp == NULL) {
8438951f055SMarcelo Araujo 				log_warnx("can't create new ioctl port for "
8448951f055SMarcelo Araujo 				    "target \"%s\"", target->t_name);
8458951f055SMarcelo Araujo 				free($2);
8468951f055SMarcelo Araujo 				return (1);
8478951f055SMarcelo Araujo 			}
8488951f055SMarcelo Araujo 		} else {
849057abcb0SAlexander Motin 			pp = pport_find(conf, $2);
850057abcb0SAlexander Motin 			if (pp == NULL) {
851057abcb0SAlexander Motin 				log_warnx("unknown port \"%s\" for target \"%s\"",
852057abcb0SAlexander Motin 				    $2, target->t_name);
853057abcb0SAlexander Motin 				free($2);
854057abcb0SAlexander Motin 				return (1);
855057abcb0SAlexander Motin 			}
856057abcb0SAlexander Motin 			if (!TAILQ_EMPTY(&pp->pp_ports)) {
857057abcb0SAlexander Motin 				log_warnx("can't link port \"%s\" to target \"%s\", "
858057abcb0SAlexander Motin 				    "port already linked to some target",
859057abcb0SAlexander Motin 				    $2, target->t_name);
860057abcb0SAlexander Motin 				free($2);
861057abcb0SAlexander Motin 				return (1);
862057abcb0SAlexander Motin 			}
863057abcb0SAlexander Motin 			tp = port_new_pp(conf, target, pp);
864057abcb0SAlexander Motin 			if (tp == NULL) {
865057abcb0SAlexander Motin 				log_warnx("can't link port \"%s\" to target \"%s\"",
866057abcb0SAlexander Motin 				    $2, target->t_name);
867057abcb0SAlexander Motin 				free($2);
868057abcb0SAlexander Motin 				return (1);
869057abcb0SAlexander Motin 			}
8708951f055SMarcelo Araujo 		}
8718951f055SMarcelo Araujo 
872057abcb0SAlexander Motin 		free($2);
873057abcb0SAlexander Motin 	}
874057abcb0SAlexander Motin 	;
875057abcb0SAlexander Motin 
8766dbdbf82SEdward Tomasz Napierala target_redirect:	REDIRECT STR
8776dbdbf82SEdward Tomasz Napierala 	{
8786dbdbf82SEdward Tomasz Napierala 		int error;
8796dbdbf82SEdward Tomasz Napierala 
8806dbdbf82SEdward Tomasz Napierala 		error = target_set_redirection(target, $2);
8816dbdbf82SEdward Tomasz Napierala 		free($2);
8826dbdbf82SEdward Tomasz Napierala 		if (error != 0)
8836dbdbf82SEdward Tomasz Napierala 			return (1);
8846dbdbf82SEdward Tomasz Napierala 	}
8856dbdbf82SEdward Tomasz Napierala 	;
8866dbdbf82SEdward Tomasz Napierala 
887e1c0d0d8SEdward Tomasz Napierala target_lun:	LUN lun_number
888e1c0d0d8SEdward Tomasz Napierala     OPENING_BRACKET lun_entries CLOSING_BRACKET
889009ea47eSEdward Tomasz Napierala 	{
890009ea47eSEdward Tomasz Napierala 		lun = NULL;
891009ea47eSEdward Tomasz Napierala 	}
892009ea47eSEdward Tomasz Napierala 	;
893009ea47eSEdward Tomasz Napierala 
8944524db57SEdward Tomasz Napierala lun_number:	STR
895009ea47eSEdward Tomasz Napierala 	{
8964524db57SEdward Tomasz Napierala 		uint64_t tmp;
897f584f51dSEdward Tomasz Napierala 		int ret;
898920c6cbaSAlexander Motin 		char *name;
8994524db57SEdward Tomasz Napierala 
9004524db57SEdward Tomasz Napierala 		if (expand_number($1, &tmp) != 0) {
901d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
9024524db57SEdward Tomasz Napierala 			free($1);
9034524db57SEdward Tomasz Napierala 			return (1);
9044524db57SEdward Tomasz Napierala 		}
905dad99db2SAlexander Motin 		if (tmp >= MAX_LUNS) {
906dad99db2SAlexander Motin 			yyerror("LU number is too big");
907dad99db2SAlexander Motin 			free($1);
908dad99db2SAlexander Motin 			return (1);
909dad99db2SAlexander Motin 		}
9104524db57SEdward Tomasz Napierala 
911f584f51dSEdward Tomasz Napierala 		ret = asprintf(&name, "%s,lun,%ju", target->t_name, tmp);
912f584f51dSEdward Tomasz Napierala 		if (ret <= 0)
913f584f51dSEdward Tomasz Napierala 			log_err(1, "asprintf");
914920c6cbaSAlexander Motin 		lun = lun_new(conf, name);
915009ea47eSEdward Tomasz Napierala 		if (lun == NULL)
916009ea47eSEdward Tomasz Napierala 			return (1);
917920c6cbaSAlexander Motin 
918920c6cbaSAlexander Motin 		lun_set_scsiname(lun, name);
919920c6cbaSAlexander Motin 		target->t_luns[tmp] = lun;
920920c6cbaSAlexander Motin 	}
921920c6cbaSAlexander Motin 	;
922920c6cbaSAlexander Motin 
923920c6cbaSAlexander Motin target_lun_ref:	LUN STR STR
924920c6cbaSAlexander Motin 	{
925920c6cbaSAlexander Motin 		uint64_t tmp;
926920c6cbaSAlexander Motin 
927920c6cbaSAlexander Motin 		if (expand_number($2, &tmp) != 0) {
928920c6cbaSAlexander Motin 			yyerror("invalid numeric value");
929920c6cbaSAlexander Motin 			free($2);
930920c6cbaSAlexander Motin 			free($3);
931920c6cbaSAlexander Motin 			return (1);
932920c6cbaSAlexander Motin 		}
933920c6cbaSAlexander Motin 		free($2);
934dad99db2SAlexander Motin 		if (tmp >= MAX_LUNS) {
935dad99db2SAlexander Motin 			yyerror("LU number is too big");
936dad99db2SAlexander Motin 			free($3);
937dad99db2SAlexander Motin 			return (1);
938dad99db2SAlexander Motin 		}
939920c6cbaSAlexander Motin 
940920c6cbaSAlexander Motin 		lun = lun_find(conf, $3);
941920c6cbaSAlexander Motin 		free($3);
942920c6cbaSAlexander Motin 		if (lun == NULL)
943920c6cbaSAlexander Motin 			return (1);
944920c6cbaSAlexander Motin 
945920c6cbaSAlexander Motin 		target->t_luns[tmp] = lun;
946009ea47eSEdward Tomasz Napierala 	}
947009ea47eSEdward Tomasz Napierala 	;
948009ea47eSEdward Tomasz Napierala 
949e1c0d0d8SEdward Tomasz Napierala lun_entries:
950009ea47eSEdward Tomasz Napierala 	|
951e1c0d0d8SEdward Tomasz Napierala 	lun_entries lun_entry
952f9488580SEdward Tomasz Napierala 	|
953f9488580SEdward Tomasz Napierala 	lun_entries lun_entry SEMICOLON
954009ea47eSEdward Tomasz Napierala 	;
955009ea47eSEdward Tomasz Napierala 
956e1c0d0d8SEdward Tomasz Napierala lun_entry:
957e1c0d0d8SEdward Tomasz Napierala 	lun_backend
958009ea47eSEdward Tomasz Napierala 	|
959e1c0d0d8SEdward Tomasz Napierala 	lun_blocksize
960009ea47eSEdward Tomasz Napierala 	|
961e1c0d0d8SEdward Tomasz Napierala 	lun_device_id
962009ea47eSEdward Tomasz Napierala 	|
96391be33dcSAlexander Motin 	lun_device_type
96491be33dcSAlexander Motin 	|
9653933f7b1SAlexander Motin 	lun_ctl_lun
9663933f7b1SAlexander Motin 	|
967e1c0d0d8SEdward Tomasz Napierala 	lun_option
968009ea47eSEdward Tomasz Napierala 	|
969e1c0d0d8SEdward Tomasz Napierala 	lun_path
970009ea47eSEdward Tomasz Napierala 	|
971e1c0d0d8SEdward Tomasz Napierala 	lun_serial
972009ea47eSEdward Tomasz Napierala 	|
973e1c0d0d8SEdward Tomasz Napierala 	lun_size
974009ea47eSEdward Tomasz Napierala 	;
975009ea47eSEdward Tomasz Napierala 
976e1c0d0d8SEdward Tomasz Napierala lun_backend:	BACKEND STR
977009ea47eSEdward Tomasz Napierala 	{
978009ea47eSEdward Tomasz Napierala 		if (lun->l_backend != NULL) {
979920c6cbaSAlexander Motin 			log_warnx("backend for lun \"%s\" "
980009ea47eSEdward Tomasz Napierala 			    "specified more than once",
981920c6cbaSAlexander Motin 			    lun->l_name);
982009ea47eSEdward Tomasz Napierala 			free($2);
983009ea47eSEdward Tomasz Napierala 			return (1);
984009ea47eSEdward Tomasz Napierala 		}
985009ea47eSEdward Tomasz Napierala 		lun_set_backend(lun, $2);
986009ea47eSEdward Tomasz Napierala 		free($2);
987009ea47eSEdward Tomasz Napierala 	}
988009ea47eSEdward Tomasz Napierala 	;
989009ea47eSEdward Tomasz Napierala 
9904524db57SEdward Tomasz Napierala lun_blocksize:	BLOCKSIZE STR
991009ea47eSEdward Tomasz Napierala 	{
9924524db57SEdward Tomasz Napierala 		uint64_t tmp;
9934524db57SEdward Tomasz Napierala 
9944524db57SEdward Tomasz Napierala 		if (expand_number($2, &tmp) != 0) {
995d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
9964524db57SEdward Tomasz Napierala 			free($2);
9974524db57SEdward Tomasz Napierala 			return (1);
9984524db57SEdward Tomasz Napierala 		}
9994524db57SEdward Tomasz Napierala 
1000009ea47eSEdward Tomasz Napierala 		if (lun->l_blocksize != 0) {
1001920c6cbaSAlexander Motin 			log_warnx("blocksize for lun \"%s\" "
1002009ea47eSEdward Tomasz Napierala 			    "specified more than once",
1003920c6cbaSAlexander Motin 			    lun->l_name);
1004009ea47eSEdward Tomasz Napierala 			return (1);
1005009ea47eSEdward Tomasz Napierala 		}
10064524db57SEdward Tomasz Napierala 		lun_set_blocksize(lun, tmp);
1007009ea47eSEdward Tomasz Napierala 	}
1008009ea47eSEdward Tomasz Napierala 	;
1009009ea47eSEdward Tomasz Napierala 
1010e1c0d0d8SEdward Tomasz Napierala lun_device_id:	DEVICE_ID STR
1011009ea47eSEdward Tomasz Napierala 	{
1012009ea47eSEdward Tomasz Napierala 		if (lun->l_device_id != NULL) {
1013920c6cbaSAlexander Motin 			log_warnx("device_id for lun \"%s\" "
1014009ea47eSEdward Tomasz Napierala 			    "specified more than once",
1015920c6cbaSAlexander Motin 			    lun->l_name);
1016009ea47eSEdward Tomasz Napierala 			free($2);
1017009ea47eSEdward Tomasz Napierala 			return (1);
1018009ea47eSEdward Tomasz Napierala 		}
1019009ea47eSEdward Tomasz Napierala 		lun_set_device_id(lun, $2);
1020009ea47eSEdward Tomasz Napierala 		free($2);
1021009ea47eSEdward Tomasz Napierala 	}
1022009ea47eSEdward Tomasz Napierala 	;
1023009ea47eSEdward Tomasz Napierala 
102491be33dcSAlexander Motin lun_device_type:	DEVICE_TYPE STR
102591be33dcSAlexander Motin 	{
102691be33dcSAlexander Motin 		uint64_t tmp;
102791be33dcSAlexander Motin 
102891be33dcSAlexander Motin 		if (strcasecmp($2, "disk") == 0 ||
102991be33dcSAlexander Motin 		    strcasecmp($2, "direct") == 0)
103091be33dcSAlexander Motin 			tmp = 0;
103191be33dcSAlexander Motin 		else if (strcasecmp($2, "processor") == 0)
103291be33dcSAlexander Motin 			tmp = 3;
103391be33dcSAlexander Motin 		else if (strcasecmp($2, "cd") == 0 ||
103491be33dcSAlexander Motin 		    strcasecmp($2, "cdrom") == 0 ||
103591be33dcSAlexander Motin 		    strcasecmp($2, "dvd") == 0 ||
103691be33dcSAlexander Motin 		    strcasecmp($2, "dvdrom") == 0)
103791be33dcSAlexander Motin 			tmp = 5;
103891be33dcSAlexander Motin 		else if (expand_number($2, &tmp) != 0 ||
103991be33dcSAlexander Motin 		    tmp > 15) {
104091be33dcSAlexander Motin 			yyerror("invalid numeric value");
104191be33dcSAlexander Motin 			free($2);
104291be33dcSAlexander Motin 			return (1);
104391be33dcSAlexander Motin 		}
104491be33dcSAlexander Motin 
104591be33dcSAlexander Motin 		lun_set_device_type(lun, tmp);
104691be33dcSAlexander Motin 	}
104791be33dcSAlexander Motin 	;
104891be33dcSAlexander Motin 
10493933f7b1SAlexander Motin lun_ctl_lun:	CTL_LUN STR
10503933f7b1SAlexander Motin 	{
10513933f7b1SAlexander Motin 		uint64_t tmp;
10523933f7b1SAlexander Motin 
10533933f7b1SAlexander Motin 		if (expand_number($2, &tmp) != 0) {
10543933f7b1SAlexander Motin 			yyerror("invalid numeric value");
10553933f7b1SAlexander Motin 			free($2);
10563933f7b1SAlexander Motin 			return (1);
10573933f7b1SAlexander Motin 		}
10583933f7b1SAlexander Motin 
10593933f7b1SAlexander Motin 		if (lun->l_ctl_lun >= 0) {
10603933f7b1SAlexander Motin 			log_warnx("ctl_lun for lun \"%s\" "
10613933f7b1SAlexander Motin 			    "specified more than once",
10623933f7b1SAlexander Motin 			    lun->l_name);
10633933f7b1SAlexander Motin 			return (1);
10643933f7b1SAlexander Motin 		}
10653933f7b1SAlexander Motin 		lun_set_ctl_lun(lun, tmp);
10663933f7b1SAlexander Motin 	}
10673933f7b1SAlexander Motin 	;
10683933f7b1SAlexander Motin 
1069e1c0d0d8SEdward Tomasz Napierala lun_option:	OPTION STR STR
1070009ea47eSEdward Tomasz Napierala 	{
1071398290f2SAlexander Motin 		struct option *o;
1072009ea47eSEdward Tomasz Napierala 
1073398290f2SAlexander Motin 		o = option_new(&lun->l_options, $2, $3);
1074009ea47eSEdward Tomasz Napierala 		free($2);
1075009ea47eSEdward Tomasz Napierala 		free($3);
1076398290f2SAlexander Motin 		if (o == NULL)
1077009ea47eSEdward Tomasz Napierala 			return (1);
1078009ea47eSEdward Tomasz Napierala 	}
1079009ea47eSEdward Tomasz Napierala 	;
1080009ea47eSEdward Tomasz Napierala 
1081e1c0d0d8SEdward Tomasz Napierala lun_path:	PATH STR
1082009ea47eSEdward Tomasz Napierala 	{
1083009ea47eSEdward Tomasz Napierala 		if (lun->l_path != NULL) {
1084920c6cbaSAlexander Motin 			log_warnx("path for lun \"%s\" "
1085009ea47eSEdward Tomasz Napierala 			    "specified more than once",
1086920c6cbaSAlexander Motin 			    lun->l_name);
1087009ea47eSEdward Tomasz Napierala 			free($2);
1088009ea47eSEdward Tomasz Napierala 			return (1);
1089009ea47eSEdward Tomasz Napierala 		}
1090009ea47eSEdward Tomasz Napierala 		lun_set_path(lun, $2);
1091009ea47eSEdward Tomasz Napierala 		free($2);
1092009ea47eSEdward Tomasz Napierala 	}
1093009ea47eSEdward Tomasz Napierala 	;
1094009ea47eSEdward Tomasz Napierala 
1095e1c0d0d8SEdward Tomasz Napierala lun_serial:	SERIAL STR
1096009ea47eSEdward Tomasz Napierala 	{
1097009ea47eSEdward Tomasz Napierala 		if (lun->l_serial != NULL) {
1098920c6cbaSAlexander Motin 			log_warnx("serial for lun \"%s\" "
1099009ea47eSEdward Tomasz Napierala 			    "specified more than once",
1100920c6cbaSAlexander Motin 			    lun->l_name);
1101009ea47eSEdward Tomasz Napierala 			free($2);
1102009ea47eSEdward Tomasz Napierala 			return (1);
1103009ea47eSEdward Tomasz Napierala 		}
1104009ea47eSEdward Tomasz Napierala 		lun_set_serial(lun, $2);
1105009ea47eSEdward Tomasz Napierala 		free($2);
1106009ea47eSEdward Tomasz Napierala 	}
1107009ea47eSEdward Tomasz Napierala 	;
1108009ea47eSEdward Tomasz Napierala 
11094524db57SEdward Tomasz Napierala lun_size:	SIZE STR
1110009ea47eSEdward Tomasz Napierala 	{
11114524db57SEdward Tomasz Napierala 		uint64_t tmp;
11124524db57SEdward Tomasz Napierala 
11134524db57SEdward Tomasz Napierala 		if (expand_number($2, &tmp) != 0) {
1114d9b4554dSEdward Tomasz Napierala 			yyerror("invalid numeric value");
11154524db57SEdward Tomasz Napierala 			free($2);
11164524db57SEdward Tomasz Napierala 			return (1);
11174524db57SEdward Tomasz Napierala 		}
11184524db57SEdward Tomasz Napierala 
1119009ea47eSEdward Tomasz Napierala 		if (lun->l_size != 0) {
1120920c6cbaSAlexander Motin 			log_warnx("size for lun \"%s\" "
1121009ea47eSEdward Tomasz Napierala 			    "specified more than once",
1122920c6cbaSAlexander Motin 			    lun->l_name);
1123009ea47eSEdward Tomasz Napierala 			return (1);
1124009ea47eSEdward Tomasz Napierala 		}
11254524db57SEdward Tomasz Napierala 		lun_set_size(lun, tmp);
1126009ea47eSEdward Tomasz Napierala 	}
1127009ea47eSEdward Tomasz Napierala 	;
1128009ea47eSEdward Tomasz Napierala %%
1129009ea47eSEdward Tomasz Napierala 
1130009ea47eSEdward Tomasz Napierala void
1131009ea47eSEdward Tomasz Napierala yyerror(const char *str)
1132009ea47eSEdward Tomasz Napierala {
1133009ea47eSEdward Tomasz Napierala 
1134009ea47eSEdward Tomasz Napierala 	log_warnx("error in configuration file at line %d near '%s': %s",
1135009ea47eSEdward Tomasz Napierala 	    lineno, yytext, str);
1136009ea47eSEdward Tomasz Napierala }
1137009ea47eSEdward Tomasz Napierala 
11385c734b04SJakub Wojciech Klama int
parse_conf(struct conf * newconf,const char * path)11395c734b04SJakub Wojciech Klama parse_conf(struct conf *newconf, const char *path)
1140009ea47eSEdward Tomasz Napierala {
1141009ea47eSEdward Tomasz Napierala 	int error;
1142009ea47eSEdward Tomasz Napierala 
11435c734b04SJakub Wojciech Klama 	conf = newconf;
1144009ea47eSEdward Tomasz Napierala 	yyin = fopen(path, "r");
1145009ea47eSEdward Tomasz Napierala 	if (yyin == NULL) {
1146009ea47eSEdward Tomasz Napierala 		log_warn("unable to open configuration file %s", path);
11475c734b04SJakub Wojciech Klama 		return (1);
1148009ea47eSEdward Tomasz Napierala 	}
11495c734b04SJakub Wojciech Klama 
11506dc3a9f4SEdward Tomasz Napierala 	lineno = 1;
1151009ea47eSEdward Tomasz Napierala 	yyrestart(yyin);
1152009ea47eSEdward Tomasz Napierala 	error = yyparse();
1153009ea47eSEdward Tomasz Napierala 	auth_group = NULL;
1154009ea47eSEdward Tomasz Napierala 	portal_group = NULL;
1155009ea47eSEdward Tomasz Napierala 	target = NULL;
1156009ea47eSEdward Tomasz Napierala 	lun = NULL;
1157009ea47eSEdward Tomasz Napierala 	fclose(yyin);
1158009ea47eSEdward Tomasz Napierala 
11595c734b04SJakub Wojciech Klama 	return (error);
1160009ea47eSEdward Tomasz Napierala }
1161