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