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 extern void yyerror(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 yyerror("Out of memory");
267 exit(1);
268 }
269 return (result);
270 }
271
272 void
273 yyerror(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;
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 }