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 2010 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 <sys/types.h>
31#include "nwamcfg.h"
32#include "nwamcfg_grammar.tab.h"
33
34int lex_lineno = 1;	/* line number for error reporting */
35static int state = INITIAL;
36extern boolean_t cmd_file_mode;
37
38extern void yyerror(char *s);
39char *safe_strdup(char *s);
40%}
41
42%a 7000
43%p 5000
44%e 2000
45%n 800
46%o 12000
47
48%{
49/*
50 * The state below are for tokens.
51 */
52%}
53%s TSTATE
54%%
55
56<INITIAL>"#"[^\n]*	{ }
57
58<INITIAL>cancel {
59			BEGIN TSTATE;
60			state = TSTATE;
61			return CANCEL;
62		}
63
64<INITIAL>clear	{
65			BEGIN TSTATE;
66			state = TSTATE;
67			return CLEAR;
68		}
69
70<INITIAL>commit	{
71			BEGIN TSTATE;
72			state = TSTATE;
73			return COMMIT;
74		}
75
76<INITIAL>create	{
77			BEGIN TSTATE;
78			state = TSTATE;
79			return CREATE;
80		}
81
82
83<INITIAL>destroy {
84			BEGIN TSTATE;
85			state = TSTATE;
86			return DESTROY;
87		}
88
89<INITIAL>end	{
90			BEGIN TSTATE;
91			state = TSTATE;
92			return END;
93		}
94
95<INITIAL>exit|quit {
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>get	{
108			BEGIN TSTATE;
109			state = TSTATE;
110			return GET;
111		}
112
113<INITIAL>"?"|help {
114			BEGIN TSTATE;
115			state = TSTATE;
116			return HELP;
117		}
118
119<INITIAL>list	{
120			BEGIN TSTATE;
121			state = TSTATE;
122			return LIST;
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>verify	{
144			BEGIN TSTATE;
145			state = TSTATE;
146			return VERIFY;
147		}
148
149<INITIAL>walkprop {
150			BEGIN TSTATE;
151			state = TSTATE;
152			return WALKPROP;
153		}
154
155<TSTATE>[Ll][Oo][Cc]		{ return LOC; }
156<TSTATE>[Nn][Cc][Pp]		{ return NCP; }
157<TSTATE>[Ee][Nn][Mm]		{ return ENM; }
158<TSTATE>[Ww][Ll][Aa][Nn]	{ return WLAN; }
159
160<TSTATE>[Nn][Cc][Uu]		{ return NCU; }
161
162<TSTATE>[Pp][Hh][Yy][Ss]	{ return PHYS; }
163<TSTATE>[Ii][Pp]		{ return IP; }
164
165<TSTATE>unknown		{ return UNKNOWN; }
166<TSTATE>activation-mode	{ return ACTIVATION_MODE; }
167<TSTATE>conditions	{ return CONDITIONS; }
168<TSTATE>enabled		{ return ENABLED; }
169
170<TSTATE>type			{ return TYPE; }
171<TSTATE>class			{ return CLASS; }
172<TSTATE>parent			{ return PARENT; }
173<TSTATE>priority-group		{ return PRIORITY_GROUP; }
174<TSTATE>priority-mode		{ return PRIORITY_MODE; }
175<TSTATE>link-mac-addr		{ return LINK_MACADDR; }
176<TSTATE>link-autopush		{ return LINK_AUTOPUSH; }
177<TSTATE>link-mtu		{ return LINK_MTU; }
178<TSTATE>ip-version		{ return IP_VERSION; }
179<TSTATE>ipv4-addrsrc		{ return IPV4_ADDRSRC; }
180<TSTATE>ipv4-addr		{ return IPV4_ADDR; }
181<TSTATE>ipv4-default-route	{ return IPV4_DEFAULT_ROUTE; }
182<TSTATE>ipv6-addrsrc		{ return IPV6_ADDRSRC; }
183<TSTATE>ipv6-addr		{ return IPV6_ADDR; }
184<TSTATE>ipv6-default-route	{ return IPV6_DEFAULT_ROUTE; }
185
186<TSTATE>state		{ return ENM_STATE; }
187<TSTATE>fmri		{ return ENM_FMRI; }
188<TSTATE>start		{ return ENM_START; }
189<TSTATE>stop		{ return ENM_STOP; }
190
191<TSTATE>nameservices			{ return LOC_NAMESERVICES; }
192<TSTATE>nameservices-config-file	{ return LOC_NAMESERVICES_CONFIG; }
193<TSTATE>dns-nameservice-configsrc	{ return LOC_DNS_CONFIGSRC; }
194<TSTATE>dns-nameservice-domain		{ return LOC_DNS_DOMAIN; }
195<TSTATE>dns-nameservice-servers		{ return LOC_DNS_SERVERS; }
196<TSTATE>dns-nameservice-search		{ return LOC_DNS_SEARCH; }
197<TSTATE>nis-nameservice-configsrc	{ return LOC_NIS_CONFIGSRC; }
198<TSTATE>nis-nameservice-servers		{ return LOC_NIS_SERVERS; }
199<TSTATE>ldap-nameservice-configsrc	{ return LOC_LDAP_CONFIGSRC; }
200<TSTATE>ldap-nameservice-servers	{ return LOC_LDAP_SERVERS; }
201<TSTATE>default-domain			{ return LOC_DEFAULT_DOMAIN; }
202<TSTATE>nfsv4-domain			{ return LOC_NFSV4_DOMAIN; }
203<TSTATE>ipfilter-config-file		{ return LOC_IPF_CONFIG; }
204<TSTATE>ipfilter-v6-config-file		{ return LOC_IPF_V6_CONFIG; }
205<TSTATE>ipnat-config-file		{ return LOC_IPNAT_CONFIG; }
206<TSTATE>ippool-config-file		{ return LOC_IPPOOL_CONFIG; }
207<TSTATE>ike-config-file			{ return LOC_IKE_CONFIG; }
208<TSTATE>ipsecpolicy-config-file		{ return LOC_IPSECPOL_CONFIG; }
209
210<TSTATE>bssids		{ return WLAN_BSSIDS; }
211<TSTATE>priority	{ return WLAN_PRIORITY; }
212<TSTATE>keyname		{ return WLAN_KEYNAME; }
213<TSTATE>keyslot		{ return WLAN_KEYSLOT; }
214<TSTATE>security-mode	{ return WLAN_SECURITY_MODE; }
215
216<TSTATE>=		{ return EQUAL; }
217
218<TSTATE>\-[adftV] {	/* matches options */
219			yylval.strval = safe_strdup(yytext);
220			return OPTION;
221		}
222
223<TSTATE>[^ \t\n\";=\[\]\(\)]+	{	/* matches non-quoted values */
224			yylval.strval = safe_strdup(yytext);
225			return TOKEN;
226		}
227
228<TSTATE>\"[^\"\n]*[\"\n] {	/* matches string with quotes */
229			yylval.strval = safe_strdup(yytext);
230			return TOKEN;
231		}
232
233<TSTATE>\".*\"\,\".*\" {	/* matches string list of the form "a","b",.. */
234			yylval.strval = safe_strdup(yytext);
235			return TOKEN;
236		}
237
238";"		{
239			BEGIN INITIAL;
240			return (yytext[0]);
241		}
242
243\n		{
244			lex_lineno++;
245			BEGIN INITIAL;
246			return (yytext[0]);
247		}
248
249[ \t]		;	/* ignore white space */
250
251.		{	/* matches all single otherwise unmatched characters */
252			return (yytext[0]);
253		}
254
255%%
256
257char *
258safe_strdup(char *s)
259{
260	char *result;
261
262	if ((result = strdup(s)) == NULL) {
263		yyerror("Out of memory");
264		exit(1);
265	}
266	return (result);
267}
268
269void
270yyerror(char *s)
271{
272	/* feof(yyin) is not an error; anything else is, so we set saw_error */
273	if (yytext[0] == '\0') {
274		if (!feof(yyin)) {
275			saw_error = B_TRUE;
276			(void) fprintf(stderr, gettext("%s, token expected\n"),
277			    s);
278		}
279		return;
280	}
281
282	saw_error = B_TRUE;
283	if (cmd_file_mode) {
284		(void) fprintf(stderr, gettext("%s on line %d at '%s'\n"), s,
285		    lex_lineno, (yytext[0] == '\n') ? "\\n" : yytext);
286	} else {
287		(void) fprintf(stderr, gettext("%s at '%s'\n\n"), s,
288		    (yytext[0] == '\n') ? "\\n" : yytext);
289	}
290	help_wrap();
291}
292