xref: /illumos-gate/usr/src/cmd/zonecfg/zonecfg_lex.l (revision 581cede61ac9c14d8d4ea452562a567189eead78)
1 %{
2 /*
3  * CDDL HEADER START
4  *
5  * The contents of this file are subject to the terms of the
6  * Common Development and Distribution License (the "License").
7  * You may not use this file except in compliance with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 
23 /*
24  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
25  * Use is subject to license terms.
26  */
27 
28 #include <string.h>
29 #include <libintl.h>
30 #include "zonecfg.h"
31 #include "zonecfg_grammar.tab.h"
32 
33 int lex_lineno = 1;	/* line number for error reporting */
34 static int state = INITIAL;
35 extern boolean_t cmd_file_mode;
36 extern boolean_t saw_error;
37 extern void yyerror(char *s);
38 char *safe_strdup(char *s);
39 %}
40 
41 %a 6000
42 %p 4000
43 %e 2000
44 %n 1000
45 
46 %{
47 /*
48  * The three states below are for tokens, lists and complex property values.
49  * Note that simple property values are a subset of tokens.
50  */
51 %}
52 %s TSTATE
53 %s LSTATE
54 %s CSTATE
55 %%
56 
57 <INITIAL>"#"[^\n]*	{ }
58 
59 <INITIAL>add	{
60 			BEGIN TSTATE;
61 			state = TSTATE;
62 			return ADD;
63 		}
64 
65 <INITIAL>cancel	{
66 			BEGIN TSTATE;
67 			state = TSTATE;
68 			return CANCEL;
69 		}
70 
71 <INITIAL>commit	{
72 			BEGIN TSTATE;
73 			state = TSTATE;
74 			return COMMIT;
75 		}
76 
77 <INITIAL>create	{
78 			BEGIN TSTATE;
79 			state = TSTATE;
80 			return CREATE;
81 		}
82 
83 <INITIAL>delete {
84 			BEGIN TSTATE;
85 			state = TSTATE;
86 			return DELETE;
87 		}
88 
89 <INITIAL>end	{
90 			BEGIN TSTATE;
91 			state = TSTATE;
92 			return END;
93 		}
94 
95 <INITIAL>exit	{
96 			BEGIN TSTATE;
97 			state = TSTATE;
98 			return EXIT;
99 		}
100 
101 <INITIAL>export	{
102 			BEGIN TSTATE;
103 			state = TSTATE;
104 			return EXPORT;
105 		}
106 
107 <INITIAL>"?"|help {
108 			BEGIN TSTATE;
109 			state = TSTATE;
110 			return HELP;
111 		}
112 
113 <INITIAL>info	{
114 			BEGIN TSTATE;
115 			state = TSTATE;
116 			return INFO;
117 		}
118 
119 <INITIAL>remove	{
120 			BEGIN TSTATE;
121 			state = TSTATE;
122 			return REMOVE;
123 		}
124 
125 <INITIAL>revert	{
126 			BEGIN TSTATE;
127 			state = TSTATE;
128 			return REVERT;
129 		}
130 
131 <INITIAL>select {
132 			BEGIN TSTATE;
133 			state = TSTATE;
134 			return SELECT;
135 		}
136 
137 <INITIAL>set {
138 			BEGIN TSTATE;
139 			state = TSTATE;
140 			return SET;
141 		}
142 
143 <INITIAL>clear {
144 			BEGIN TSTATE;
145 			state = TSTATE;
146 			return CLEAR;
147 		}
148 
149 <INITIAL>verify	{
150 			BEGIN TSTATE;
151 			state = TSTATE;
152 			return VERIFY;
153 		}
154 
155 <TSTATE>net	{ return NET; }
156 
157 <TSTATE>fs	{ return FS; }
158 
159 <TSTATE>inherit-pkg-dir	{ return IPD; }
160 
161 <TSTATE>device	{ return DEVICE; }
162 
163 <TSTATE>rctl	{ return RCTL; }
164 
165 <TSTATE>attr	{ return ATTR; }
166 
167 <TSTATE>zonename	{ return ZONENAME; }
168 <CSTATE>zonename	{ return ZONENAME; }
169 
170 <TSTATE>dataset	{ return DATASET; }
171 
172 <TSTATE>dedicated-cpu	{ return PSET; }
173 
174 <TSTATE>capped-cpu	{ return PCAP; }
175 
176 <TSTATE>capped-memory	{ return MCAP; }
177 
178 <TSTATE>zonepath	{ return ZONEPATH; }
179 <CSTATE>zonepath	{ return ZONEPATH; }
180 
181 <TSTATE>brand	{ return BRAND; }
182 <CSTATE>brand	{ return BRAND; }
183 
184 <TSTATE>autoboot	{ return AUTOBOOT; }
185 <CSTATE>autoboot	{ return AUTOBOOT; }
186 
187 <TSTATE>ip-type		{ return IPTYPE; }
188 <CSTATE>ip-type		{ return IPTYPE; }
189 
190 <TSTATE>pool	{ return POOL; }
191 <CSTATE>pool	{ return POOL; }
192 
193 <TSTATE>limitpriv	{ return LIMITPRIV; }
194 <CSTATE>limitpriv	{ return LIMITPRIV; }
195 
196 <TSTATE>bootargs	{ return BOOTARGS; }
197 <CSTATE>bootargs	{ return BOOTARGS; }
198 
199 <TSTATE>type	{ return TYPE; }
200 <CSTATE>type	{ return TYPE; }
201 
202 <TSTATE>value	{ return VALUE; }
203 <CSTATE>value	{ return VALUE; }
204 
205 <TSTATE>options	{ return OPTIONS; }
206 <CSTATE>options	{ return OPTIONS; }
207 
208 <TSTATE>address	{ return ADDRESS; }
209 <CSTATE>address	{ return ADDRESS; }
210 
211 <TSTATE>physical	{ return PHYSICAL; }
212 <CSTATE>physical	{ return PHYSICAL; }
213 
214 <TSTATE>defrouter	{ return DEFROUTER; }
215 <CSTATE>defrouter	{ return DEFROUTER; }
216 
217 <TSTATE>dir	{ return DIR; }
218 <CSTATE>dir	{ return DIR; }
219 
220 <TSTATE>special	{ return SPECIAL; }
221 <CSTATE>special	{ return SPECIAL; }
222 
223 <TSTATE>raw	{ return RAW; }
224 <CSTATE>raw	{ return RAW; }
225 
226 <TSTATE>name	{ return NAME; }
227 <CSTATE>name	{ return NAME; }
228 
229 <TSTATE>match	{ return MATCH; }
230 <CSTATE>match	{ return MATCH; }
231 
232 <TSTATE>priv	{ return PRIV; }
233 <CSTATE>priv	{ return PRIV; }
234 
235 <TSTATE>limit	{ return LIMIT; }
236 <CSTATE>limit	{ return LIMIT; }
237 
238 <TSTATE>action	{ return ACTION; }
239 <CSTATE>action	{ return ACTION; }
240 
241 <TSTATE>ncpus	{ return NCPUS; }
242 <CSTATE>ncpus	{ return NCPUS; }
243 
244 <TSTATE>locked	{ return LOCKED; }
245 <CSTATE>locked	{ return LOCKED; }
246 
247 <TSTATE>swap	{ return SWAP; }
248 <CSTATE>swap	{ return SWAP; }
249 
250 <TSTATE>importance	{ return IMPORTANCE; }
251 <CSTATE>importance	{ return IMPORTANCE; }
252 
253 <TSTATE>cpu-shares	{ return SHARES; }
254 <CSTATE>cpu-shares	{ return SHARES; }
255 
256 <TSTATE>max-lwps	{ return MAXLWPS; }
257 <CSTATE>max-lwps	{ return MAXLWPS; }
258 
259 <TSTATE>max-shm-memory	{ return MAXSHMMEM; }
260 <CSTATE>max-shm-memory	{ return MAXSHMMEM; }
261 
262 <TSTATE>max-shm-ids	{ return MAXSHMIDS; }
263 <CSTATE>max-shm-ids	{ return MAXSHMIDS; }
264 
265 <TSTATE>max-msg-ids	{ return MAXMSGIDS; }
266 <CSTATE>max-msg-ids	{ return MAXMSGIDS; }
267 
268 <TSTATE>max-sem-ids	{ return MAXSEMIDS; }
269 <CSTATE>max-sem-ids	{ return MAXSEMIDS; }
270 
271 <TSTATE>scheduling-class	{ return SCHED; }
272 <CSTATE>scheduling-class	{ return SCHED; }
273 
274 <TSTATE>hostid		{ return HOSTID; }
275 <CSTATE>hostid		{ return HOSTID; }
276 
277 <TSTATE>=	{ return EQUAL; }
278 <LSTATE>=	{ return EQUAL; }
279 <CSTATE>=	{ return EQUAL; }
280 
281 <TSTATE>"["	{
282 			BEGIN LSTATE;
283 			state = LSTATE;
284 			return OPEN_SQ_BRACKET;
285 		}
286 
287 <LSTATE>"]"	{
288 			BEGIN TSTATE;
289 			state = TSTATE;
290 			return CLOSE_SQ_BRACKET;
291 		}
292 
293 <TSTATE>"("	{
294 			BEGIN CSTATE;
295 			return OPEN_PAREN;
296 		}
297 
298 <LSTATE>"("	{
299 			BEGIN CSTATE;
300 			return OPEN_PAREN;
301 		}
302 
303 <CSTATE>")"	{
304 			BEGIN state;
305 			return CLOSE_PAREN;
306 		}
307 
308 <LSTATE>","	{ return COMMA; }
309 <CSTATE>","	{ return COMMA; }
310 
311 <TSTATE>[^ \t\n\";=\[\]\(\)]+	{
312 			yylval.strval = safe_strdup(yytext);
313 			return TOKEN;
314 		}
315 
316 <LSTATE>[^ \t\n\",;=\[\]\(\)]+	{
317 			yylval.strval = safe_strdup(yytext);
318 			return TOKEN;
319 		}
320 
321 <CSTATE>[^ \t\n\",;=\(\)]+	{
322 			yylval.strval = safe_strdup(yytext);
323 			return TOKEN;
324 		}
325 
326 <TSTATE>\"[^\"\n]*[\"\n] {
327 			yylval.strval = safe_strdup(yytext + 1);
328 			if (yylval.strval[yyleng - 2] == '"')
329 				yylval.strval[yyleng - 2] = 0;
330 			return TOKEN;
331 		}
332 
333 <LSTATE>\"[^\"\n]*[\"\n] {
334 			yylval.strval = safe_strdup(yytext + 1);
335 			if (yylval.strval[yyleng - 2] == '"')
336 				yylval.strval[yyleng - 2] = 0;
337 			return TOKEN;
338 		}
339 
340 ";"		{
341 			BEGIN INITIAL;
342 			return (yytext[0]);
343 		}
344 
345 \n		{
346 			lex_lineno++;
347 			BEGIN INITIAL;
348 			return (yytext[0]);
349 		}
350 
351 [ \t]		;	/* Ignore whitespace */
352 
353 .		{
354 			return (yytext[0]);
355 		}
356 
357 %%
358 
359 char *
360 safe_strdup(char *s)
361 {
362 	char *result;
363 
364 	if ((result = strdup(s)) == NULL) {
365 		yyerror("Out of memory");
366 		exit(Z_ERR);
367 	}
368 	return (result);
369 }
370 
371 void
372 yyerror(char *s)
373 {
374 	/* feof(yyin) is not an error; anything else is, so we set saw_error */
375 	if (yytext[0] == '\0') {
376 		if (!feof(yyin)) {
377 			saw_error = B_TRUE;
378 			(void) fprintf(stderr, gettext("%s, token expected\n"),
379 			    s);
380 		}
381 		return;
382 	}
383 
384 	saw_error = B_TRUE;
385 	if (cmd_file_mode)
386 		(void) fprintf(stderr, gettext("%s on line %d at '%s'\n"), s,
387 		    lex_lineno, (yytext[0] == '\n') ? "\\n" : yytext);
388 	else
389 		(void) fprintf(stderr, gettext("%s at '%s'\n"), s,
390 		    (yytext[0] == '\n') ? "\\n" : yytext);
391 	usage(B_FALSE, HELP_SUBCMDS);
392 }
393