jailparse.y revision 293290
1%{
2/*-
3 * Copyright (c) 2011 James Gritton
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28#include <sys/cdefs.h>
29__FBSDID("$FreeBSD: stable/10/usr.sbin/jail/jailparse.y 293290 2016-01-07 00:40:51Z bdrewery $");
30
31#include <stdlib.h>
32#include <string.h>
33
34#include "jailp.h"
35
36#ifdef DEBUG
37#define YYDEBUG 1
38#endif
39%}
40
41%union {
42	struct cfjail		*j;
43	struct cfparams		*pp;
44	struct cfparam		*p;
45	struct cfstrings	*ss;
46	struct cfstring		*s;
47	char			*cs;
48}
49
50%token      PLEQ
51%token <cs> STR STR1 VAR VAR1
52
53%type <j>  jail
54%type <pp> param_l
55%type <p>  param name
56%type <ss> value
57%type <s>  string
58
59%%
60
61/*
62 * A config file is a series of jails (containing parameters) and jail-less
63 * parameters which realy belong to a global pseudo-jail.
64 */
65conf	:
66	;
67	| conf jail
68	;
69	| conf param ';'
70	{
71		struct cfjail *j;
72
73		j = TAILQ_LAST(&cfjails, cfjails);
74		if (!j || strcmp(j->name, "*")) {
75			j = add_jail();
76			j->name = estrdup("*");
77		}
78		TAILQ_INSERT_TAIL(&j->params, $2, tq);
79	}
80	| conf ';'
81
82jail	: STR '{' param_l '}'
83	{
84		$$ = add_jail();
85		$$->name = $1;
86		TAILQ_CONCAT(&$$->params, $3, tq);
87		free($3);
88	}
89	;
90
91param_l	:
92	{
93		$$ = emalloc(sizeof(struct cfparams));
94		TAILQ_INIT($$);
95	}
96	| param_l param ';'
97	{
98		$$ = $1;
99		TAILQ_INSERT_TAIL($$, $2, tq);
100	}
101	| param_l ';'
102	;
103
104/*
105 * Parameters have a name and an optional list of value strings,
106 * which may have "+=" or "=" preceding them.
107 */
108param	: name
109	{
110		$$ = $1;
111	}
112	| name '=' value
113	{
114		$$ = $1;
115		TAILQ_CONCAT(&$$->val, $3, tq);
116		free($3);
117	}
118	| name PLEQ value
119	{
120		$$ = $1;
121		TAILQ_CONCAT(&$$->val, $3, tq);
122		$$->flags |= PF_APPEND;
123		free($3);
124	}
125	| name value
126	{
127		$$ = $1;
128		TAILQ_CONCAT(&$$->val, $2, tq);
129		free($2);
130	}
131	| error
132	{
133	}
134	;
135
136/*
137 * A parameter has a fixed name.  A variable definition looks just like a
138 * parameter except that the name is a variable.
139 */
140name	: STR
141	{
142		$$ = emalloc(sizeof(struct cfparam));
143		$$->name = $1;
144		TAILQ_INIT(&$$->val);
145		$$->flags = 0;
146	}
147	| VAR
148	{
149		$$ = emalloc(sizeof(struct cfparam));
150		$$->name = $1;
151		TAILQ_INIT(&$$->val);
152		$$->flags = PF_VAR;
153	}
154	;
155
156value	: string
157	{
158		$$ = emalloc(sizeof(struct cfstrings));
159		TAILQ_INIT($$);
160		TAILQ_INSERT_TAIL($$, $1, tq);
161	}
162	| value ',' string
163	{
164		$$ = $1;
165		TAILQ_INSERT_TAIL($$, $3, tq);
166	}
167	;
168
169/*
170 * Strings may be passed in pieces, because of quoting and/or variable
171 * interpolation.  Reassemble them into a single string.
172 */
173string	: STR
174	{
175		$$ = emalloc(sizeof(struct cfstring));
176		$$->s = $1;
177		$$->len = strlen($1);
178		STAILQ_INIT(&$$->vars);
179	}
180	| VAR
181	{
182		struct cfvar *v;
183
184		$$ = emalloc(sizeof(struct cfstring));
185		$$->s = estrdup("");
186		$$->len = 0;
187		STAILQ_INIT(&$$->vars);
188		v = emalloc(sizeof(struct cfvar));
189		v->name = $1;
190		v->pos = 0;
191		STAILQ_INSERT_TAIL(&$$->vars, v, tq);
192	}
193	| string STR1
194	{
195		size_t len1;
196
197		$$ = $1;
198		len1 = strlen($2);
199		$$->s = erealloc($$->s, $$->len + len1 + 1);
200		strcpy($$->s + $$->len, $2);
201		free($2);
202		$$->len += len1;
203	}
204	| string VAR1
205	{
206		struct cfvar *v;
207
208		$$ = $1;
209		v = emalloc(sizeof(struct cfvar));
210		v->name = $2;
211		v->pos = $$->len;
212		STAILQ_INSERT_TAIL(&$$->vars, v, tq);
213	}
214	;
215
216%%
217