1214117Sjamie%{
2214117Sjamie/*-
3223190Sjamie * Copyright (c) 2011 James Gritton
4214117Sjamie * All rights reserved.
5214117Sjamie *
6214117Sjamie * Redistribution and use in source and binary forms, with or without
7214117Sjamie * modification, are permitted provided that the following conditions
8214117Sjamie * are met:
9214117Sjamie * 1. Redistributions of source code must retain the above copyright
10214117Sjamie *    notice, this list of conditions and the following disclaimer.
11214117Sjamie * 2. Redistributions in binary form must reproduce the above copyright
12214117Sjamie *    notice, this list of conditions and the following disclaimer in the
13214117Sjamie *    documentation and/or other materials provided with the distribution.
14214117Sjamie *
15214117Sjamie * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16214117Sjamie * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17214117Sjamie * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18214117Sjamie * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19214117Sjamie * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20214117Sjamie * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21214117Sjamie * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22214117Sjamie * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23214117Sjamie * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24214117Sjamie * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25214117Sjamie * SUCH DAMAGE.
26214117Sjamie */
27214117Sjamie
28214117Sjamie#include <sys/cdefs.h>
29214117Sjamie__FBSDID("$FreeBSD$");
30214117Sjamie
31214117Sjamie#include <stdlib.h>
32214117Sjamie#include <string.h>
33214117Sjamie
34214117Sjamie#include "jailp.h"
35214117Sjamie
36214117Sjamie#ifdef DEBUG
37214117Sjamie#define YYDEBUG 1
38214117Sjamie#endif
39214117Sjamie%}
40214117Sjamie
41214117Sjamie%union {
42214117Sjamie	struct cfjail		*j;
43214117Sjamie	struct cfparams		*pp;
44214117Sjamie	struct cfparam		*p;
45214117Sjamie	struct cfstrings	*ss;
46214117Sjamie	struct cfstring		*s;
47214117Sjamie	char			*cs;
48214117Sjamie}
49214117Sjamie
50214117Sjamie%token      PLEQ
51214117Sjamie%token <cs> STR STR1 VAR VAR1
52214117Sjamie
53214117Sjamie%type <j>  jail
54214117Sjamie%type <pp> param_l
55214117Sjamie%type <p>  param name
56214117Sjamie%type <ss> value
57214117Sjamie%type <s>  string
58214117Sjamie
59214117Sjamie%%
60214117Sjamie
61214117Sjamie/*
62214117Sjamie * A config file is a series of jails (containing parameters) and jail-less
63214117Sjamie * parameters which realy belong to a global pseudo-jail.
64214117Sjamie */
65214117Sjamieconf	:
66214117Sjamie	;
67214117Sjamie	| conf jail
68214117Sjamie	;
69214117Sjamie	| conf param ';'
70214117Sjamie	{
71214117Sjamie		struct cfjail *j;
72214117Sjamie
73214117Sjamie		j = TAILQ_LAST(&cfjails, cfjails);
74214117Sjamie		if (!j || strcmp(j->name, "*")) {
75214117Sjamie			j = add_jail();
76214117Sjamie			j->name = estrdup("*");
77214117Sjamie		}
78214117Sjamie		TAILQ_INSERT_TAIL(&j->params, $2, tq);
79214117Sjamie	}
80214117Sjamie	| conf ';'
81214117Sjamie
82214117Sjamiejail	: STR '{' param_l '}'
83214117Sjamie	{
84214117Sjamie		$$ = add_jail();
85214117Sjamie		$$->name = $1;
86214117Sjamie		TAILQ_CONCAT(&$$->params, $3, tq);
87214117Sjamie		free($3);
88214117Sjamie	}
89214117Sjamie	;
90214117Sjamie
91214117Sjamieparam_l	:
92214117Sjamie	{
93214117Sjamie		$$ = emalloc(sizeof(struct cfparams));
94214117Sjamie		TAILQ_INIT($$);
95214117Sjamie	}
96214117Sjamie	| param_l param ';'
97214117Sjamie	{
98214117Sjamie		$$ = $1;
99214117Sjamie		TAILQ_INSERT_TAIL($$, $2, tq);
100214117Sjamie	}
101214117Sjamie	| param_l ';'
102214117Sjamie	;
103214117Sjamie
104214117Sjamie/*
105214117Sjamie * Parameters have a name and an optional list of value strings,
106293290Sbdrewery * which may have "+=" or "=" preceding them.
107214117Sjamie */
108214117Sjamieparam	: name
109214117Sjamie	{
110214117Sjamie		$$ = $1;
111214117Sjamie	}
112214117Sjamie	| name '=' value
113214117Sjamie	{
114214117Sjamie		$$ = $1;
115223188Sjamie		TAILQ_CONCAT(&$$->val, $3, tq);
116214117Sjamie		free($3);
117214117Sjamie	}
118214117Sjamie	| name PLEQ value
119214117Sjamie	{
120214117Sjamie		$$ = $1;
121223188Sjamie		TAILQ_CONCAT(&$$->val, $3, tq);
122214117Sjamie		$$->flags |= PF_APPEND;
123214117Sjamie		free($3);
124214117Sjamie	}
125214117Sjamie	| name value
126214117Sjamie	{
127214117Sjamie		$$ = $1;
128223188Sjamie		TAILQ_CONCAT(&$$->val, $2, tq);
129214117Sjamie		free($2);
130214117Sjamie	}
131214117Sjamie	| error
132214117Sjamie	{
133214117Sjamie	}
134214117Sjamie	;
135214117Sjamie
136214117Sjamie/*
137214117Sjamie * A parameter has a fixed name.  A variable definition looks just like a
138214117Sjamie * parameter except that the name is a variable.
139214117Sjamie */
140214117Sjamiename	: STR
141214117Sjamie	{
142214117Sjamie		$$ = emalloc(sizeof(struct cfparam));
143214117Sjamie		$$->name = $1;
144223188Sjamie		TAILQ_INIT(&$$->val);
145214117Sjamie		$$->flags = 0;
146214117Sjamie	}
147214117Sjamie	| VAR
148214117Sjamie	{
149214117Sjamie		$$ = emalloc(sizeof(struct cfparam));
150214117Sjamie		$$->name = $1;
151223188Sjamie		TAILQ_INIT(&$$->val);
152214117Sjamie		$$->flags = PF_VAR;
153214117Sjamie	}
154214117Sjamie	;
155214117Sjamie
156214117Sjamievalue	: string
157214117Sjamie	{
158214117Sjamie		$$ = emalloc(sizeof(struct cfstrings));
159223188Sjamie		TAILQ_INIT($$);
160223188Sjamie		TAILQ_INSERT_TAIL($$, $1, tq);
161214117Sjamie	}
162214117Sjamie	| value ',' string
163214117Sjamie	{
164214117Sjamie		$$ = $1;
165223188Sjamie		TAILQ_INSERT_TAIL($$, $3, tq);
166214117Sjamie	}
167214117Sjamie	;
168214117Sjamie
169214117Sjamie/*
170214117Sjamie * Strings may be passed in pieces, because of quoting and/or variable
171214117Sjamie * interpolation.  Reassemble them into a single string.
172214117Sjamie */
173214117Sjamiestring	: STR
174214117Sjamie	{
175214117Sjamie		$$ = emalloc(sizeof(struct cfstring));
176214117Sjamie		$$->s = $1;
177214117Sjamie		$$->len = strlen($1);
178214117Sjamie		STAILQ_INIT(&$$->vars);
179214117Sjamie	}
180214117Sjamie	| VAR
181214117Sjamie	{
182214117Sjamie		struct cfvar *v;
183214117Sjamie
184214117Sjamie		$$ = emalloc(sizeof(struct cfstring));
185214117Sjamie		$$->s = estrdup("");
186214117Sjamie		$$->len = 0;
187214117Sjamie		STAILQ_INIT(&$$->vars);
188214117Sjamie		v = emalloc(sizeof(struct cfvar));
189214117Sjamie		v->name = $1;
190214117Sjamie		v->pos = 0;
191214117Sjamie		STAILQ_INSERT_TAIL(&$$->vars, v, tq);
192214117Sjamie	}
193214117Sjamie	| string STR1
194214117Sjamie	{
195214117Sjamie		size_t len1;
196214117Sjamie
197214117Sjamie		$$ = $1;
198214117Sjamie		len1 = strlen($2);
199214117Sjamie		$$->s = erealloc($$->s, $$->len + len1 + 1);
200214117Sjamie		strcpy($$->s + $$->len, $2);
201214117Sjamie		free($2);
202214117Sjamie		$$->len += len1;
203214117Sjamie	}
204214117Sjamie	| string VAR1
205214117Sjamie	{
206214117Sjamie		struct cfvar *v;
207214117Sjamie
208214117Sjamie		$$ = $1;
209214117Sjamie		v = emalloc(sizeof(struct cfvar));
210214117Sjamie		v->name = $2;
211214117Sjamie		v->pos = $$->len;
212214117Sjamie		STAILQ_INSERT_TAIL(&$$->vars, v, tq);
213214117Sjamie	}
214214117Sjamie	;
215214117Sjamie
216214117Sjamie%%
217