zonecfg_lex.l revision 3448:aaf16568054b
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 2007 Sun Microsystems, Inc.  All rights reserved.
25 * Use is subject to license terms.
26 */
27
28#pragma ident	"%Z%%M%	%I%	%E% SMI"
29
30#include <string.h>
31#include <libintl.h>
32#include "zonecfg.h"
33#include "zonecfg_grammar.tab.h"
34
35int lex_lineno = 1;	/* line number for error reporting */
36static int state = INITIAL;
37extern bool cmd_file_mode;
38extern bool saw_error;
39extern void yyerror(char *s);
40char *safe_strdup(char *s);
41%}
42
43%a 6000
44%p 4000
45%e 2000
46%n 1000
47
48%{
49/*
50 * The three states below are for tokens, lists and complex property values.
51 * Note that simple property values are a subset of tokens.
52 */
53%}
54%s TSTATE
55%s LSTATE
56%s CSTATE
57%%
58
59<INITIAL>"#"[^\n]*	{ }
60
61<INITIAL>add	{
62			BEGIN TSTATE;
63			state = TSTATE;
64			return ADD;
65		}
66
67<INITIAL>cancel	{
68			BEGIN TSTATE;
69			state = TSTATE;
70			return CANCEL;
71		}
72
73<INITIAL>commit	{
74			BEGIN TSTATE;
75			state = TSTATE;
76			return COMMIT;
77		}
78
79<INITIAL>create	{
80			BEGIN TSTATE;
81			state = TSTATE;
82			return CREATE;
83		}
84
85<INITIAL>delete {
86			BEGIN TSTATE;
87			state = TSTATE;
88			return DELETE;
89		}
90
91<INITIAL>end	{
92			BEGIN TSTATE;
93			state = TSTATE;
94			return END;
95		}
96
97<INITIAL>exit	{
98			BEGIN TSTATE;
99			state = TSTATE;
100			return EXIT;
101		}
102
103<INITIAL>export	{
104			BEGIN TSTATE;
105			state = TSTATE;
106			return EXPORT;
107		}
108
109<INITIAL>"?"|help {
110			BEGIN TSTATE;
111			state = TSTATE;
112			return HELP;
113		}
114
115<INITIAL>info	{
116			BEGIN TSTATE;
117			state = TSTATE;
118			return INFO;
119		}
120
121<INITIAL>remove	{
122			BEGIN TSTATE;
123			state = TSTATE;
124			return REMOVE;
125		}
126
127<INITIAL>revert	{
128			BEGIN TSTATE;
129			state = TSTATE;
130			return REVERT;
131		}
132
133<INITIAL>select {
134			BEGIN TSTATE;
135			state = TSTATE;
136			return SELECT;
137		}
138
139<INITIAL>set {
140			BEGIN TSTATE;
141			state = TSTATE;
142			return SET;
143		}
144
145<INITIAL>clear {
146			BEGIN TSTATE;
147			state = TSTATE;
148			return CLEAR;
149		}
150
151<INITIAL>verify	{
152			BEGIN TSTATE;
153			state = TSTATE;
154			return VERIFY;
155		}
156
157<TSTATE>net	{ return NET; }
158
159<TSTATE>fs	{ return FS; }
160
161<TSTATE>inherit-pkg-dir	{ return IPD; }
162
163<TSTATE>device	{ return DEVICE; }
164
165<TSTATE>rctl	{ return RCTL; }
166
167<TSTATE>attr	{ return ATTR; }
168
169<TSTATE>zonename	{ return ZONENAME; }
170<CSTATE>zonename	{ return ZONENAME; }
171
172<TSTATE>dataset	{ return DATASET; }
173
174<TSTATE>dedicated-cpu	{ return PSET; }
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>dir	{ return DIR; }
215<CSTATE>dir	{ return DIR; }
216
217<TSTATE>special	{ return SPECIAL; }
218<CSTATE>special	{ return SPECIAL; }
219
220<TSTATE>raw	{ return RAW; }
221<CSTATE>raw	{ return RAW; }
222
223<TSTATE>name	{ return NAME; }
224<CSTATE>name	{ return NAME; }
225
226<TSTATE>match	{ return MATCH; }
227<CSTATE>match	{ return MATCH; }
228
229<TSTATE>priv	{ return PRIV; }
230<CSTATE>priv	{ return PRIV; }
231
232<TSTATE>limit	{ return LIMIT; }
233<CSTATE>limit	{ return LIMIT; }
234
235<TSTATE>action	{ return ACTION; }
236<CSTATE>action	{ return ACTION; }
237
238<TSTATE>ncpus	{ return NCPUS; }
239<CSTATE>ncpus	{ return NCPUS; }
240
241<TSTATE>locked	{ return LOCKED; }
242<CSTATE>locked	{ return LOCKED; }
243
244<TSTATE>swap	{ return SWAP; }
245<CSTATE>swap	{ return SWAP; }
246
247<TSTATE>importance	{ return IMPORTANCE; }
248<CSTATE>importance	{ return IMPORTANCE; }
249
250<TSTATE>cpu-shares	{ return SHARES; }
251<CSTATE>cpu-shares	{ return SHARES; }
252
253<TSTATE>max-lwps	{ return MAXLWPS; }
254<CSTATE>max-lwps	{ return MAXLWPS; }
255
256<TSTATE>max-shm-memory	{ return MAXSHMMEM; }
257<CSTATE>max-shm-memory	{ return MAXSHMMEM; }
258
259<TSTATE>max-shm-ids	{ return MAXSHMIDS; }
260<CSTATE>max-shm-ids	{ return MAXSHMIDS; }
261
262<TSTATE>max-msg-ids	{ return MAXMSGIDS; }
263<CSTATE>max-msg-ids	{ return MAXMSGIDS; }
264
265<TSTATE>max-sem-ids	{ return MAXSEMIDS; }
266<CSTATE>max-sem-ids	{ return MAXSEMIDS; }
267
268<TSTATE>scheduling-class	{ return SCHED; }
269<CSTATE>scheduling-class	{ return SCHED; }
270
271<TSTATE>=	{ return EQUAL; }
272<LSTATE>=	{ return EQUAL; }
273<CSTATE>=	{ return EQUAL; }
274
275<TSTATE>"["	{
276			BEGIN LSTATE;
277			state = LSTATE;
278			return OPEN_SQ_BRACKET;
279		}
280
281<LSTATE>"]"	{
282			BEGIN TSTATE;
283			state = TSTATE;
284			return CLOSE_SQ_BRACKET;
285		}
286
287<TSTATE>"("	{
288			BEGIN CSTATE;
289			return OPEN_PAREN;
290		}
291
292<LSTATE>"("	{
293			BEGIN CSTATE;
294			return OPEN_PAREN;
295		}
296
297<CSTATE>")"	{
298			BEGIN state;
299			return CLOSE_PAREN;
300		}
301
302<LSTATE>","	{ return COMMA; }
303<CSTATE>","	{ return COMMA; }
304
305<TSTATE>[^ \t\n\";=\[\]\(\)]+	{
306			yylval.strval = safe_strdup(yytext);
307			return TOKEN;
308		}
309
310<LSTATE>[^ \t\n\",;=\[\]\(\)]+	{
311			yylval.strval = safe_strdup(yytext);
312			return TOKEN;
313		}
314
315<CSTATE>[^ \t\n\",;=\(\)]+	{
316			yylval.strval = safe_strdup(yytext);
317			return TOKEN;
318		}
319
320<TSTATE>\"[^\"\n]*[\"\n] {
321			yylval.strval = safe_strdup(yytext + 1);
322			if (yylval.strval[yyleng - 2] == '"')
323				yylval.strval[yyleng - 2] = 0;
324			return TOKEN;
325		}
326
327<LSTATE>\"[^\"\n]*[\"\n] {
328			yylval.strval = safe_strdup(yytext + 1);
329			if (yylval.strval[yyleng - 2] == '"')
330				yylval.strval[yyleng - 2] = 0;
331			return TOKEN;
332		}
333
334";"		{
335			BEGIN INITIAL;
336			return (yytext[0]);
337		}
338
339\n		{
340			lex_lineno++;
341			BEGIN INITIAL;
342			return (yytext[0]);
343		}
344
345[ \t]		;	/* Ignore whitespace */
346
347.		{
348			return (yytext[0]);
349		}
350
351%%
352
353char *
354safe_strdup(char *s)
355{
356	char *result;
357
358	if ((result = strdup(s)) == NULL) {
359		yyerror("Out of memory");
360		exit(Z_ERR);
361	}
362	return (result);
363}
364
365void
366yyerror(char *s)
367{
368	/* feof(yyin) is not an error; anything else is, so we set saw_error */
369	if (yytext[0] == '\0') {
370		if (!feof(yyin)) {
371			saw_error = TRUE;
372			(void) fprintf(stderr, gettext("%s, token expected\n"),
373			    s);
374		}
375		return;
376	}
377
378	saw_error = TRUE;
379	if (cmd_file_mode)
380		(void) fprintf(stderr, gettext("%s on line %d at '%s'\n"), s,
381		    lex_lineno, (yytext[0] == '\n') ? "\\n" : yytext);
382	else
383		(void) fprintf(stderr, gettext("%s at '%s'\n"), s,
384		    (yytext[0] == '\n') ? "\\n" : yytext);
385	usage(FALSE, HELP_SUBCMDS);
386}
387