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