16ba597c5SAnurag S. Maskey %{
26ba597c5SAnurag S. Maskey /*
36ba597c5SAnurag S. Maskey  * CDDL HEADER START
46ba597c5SAnurag S. Maskey  *
56ba597c5SAnurag S. Maskey  * The contents of this file are subject to the terms of the
66ba597c5SAnurag S. Maskey  * Common Development and Distribution License (the "License").
76ba597c5SAnurag S. Maskey  * You may not use this file except in compliance with the License.
86ba597c5SAnurag S. Maskey  *
96ba597c5SAnurag S. Maskey  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
106ba597c5SAnurag S. Maskey  * or http://www.opensolaris.org/os/licensing.
116ba597c5SAnurag S. Maskey  * See the License for the specific language governing permissions
126ba597c5SAnurag S. Maskey  * and limitations under the License.
136ba597c5SAnurag S. Maskey  *
146ba597c5SAnurag S. Maskey  * When distributing Covered Code, include this CDDL HEADER in each
156ba597c5SAnurag S. Maskey  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
166ba597c5SAnurag S. Maskey  * If applicable, add the following below this CDDL HEADER, with the
176ba597c5SAnurag S. Maskey  * fields enclosed by brackets "[]" replaced with your own identifying
186ba597c5SAnurag S. Maskey  * information: Portions Copyright [yyyy] [name of copyright owner]
196ba597c5SAnurag S. Maskey  *
206ba597c5SAnurag S. Maskey  * CDDL HEADER END
216ba597c5SAnurag S. Maskey  */
226ba597c5SAnurag S. Maskey 
236ba597c5SAnurag S. Maskey /*
246ba597c5SAnurag S. Maskey  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
256ba597c5SAnurag S. Maskey  * Use is subject to license terms.
26*b31320a7SChris Fraire  * Copyright (c) 2016, Chris Fraire <cfraire@me.com>.
276ba597c5SAnurag S. Maskey  */
286ba597c5SAnurag S. Maskey 
296ba597c5SAnurag S. Maskey #include <string.h>
306ba597c5SAnurag S. Maskey #include <libintl.h>
316ba597c5SAnurag S. Maskey #include <sys/types.h>
326ba597c5SAnurag S. Maskey #include "nwamcfg.h"
336ba597c5SAnurag S. Maskey #include "nwamcfg_grammar.tab.h"
346ba597c5SAnurag S. Maskey 
356ba597c5SAnurag S. Maskey int lex_lineno = 1;	/* line number for error reporting */
366ba597c5SAnurag S. Maskey static int state = INITIAL;
376ba597c5SAnurag S. Maskey extern boolean_t cmd_file_mode;
386ba597c5SAnurag S. Maskey 
396ba597c5SAnurag S. Maskey extern void yyerror(char *s);
406ba597c5SAnurag S. Maskey char *safe_strdup(char *s);
416ba597c5SAnurag S. Maskey %}
426ba597c5SAnurag S. Maskey 
436ba597c5SAnurag S. Maskey %a 7000
446ba597c5SAnurag S. Maskey %p 5000
456ba597c5SAnurag S. Maskey %e 2000
466ba597c5SAnurag S. Maskey %n 800
476ba597c5SAnurag S. Maskey %o 12000
486ba597c5SAnurag S. Maskey 
496ba597c5SAnurag S. Maskey %{
506ba597c5SAnurag S. Maskey /*
516ba597c5SAnurag S. Maskey  * The state below are for tokens.
526ba597c5SAnurag S. Maskey  */
536ba597c5SAnurag S. Maskey %}
546ba597c5SAnurag S. Maskey %s TSTATE
556ba597c5SAnurag S. Maskey %%
566ba597c5SAnurag S. Maskey 
576ba597c5SAnurag S. Maskey <INITIAL>"#"[^\n]*	{ }
586ba597c5SAnurag S. Maskey 
596ba597c5SAnurag S. Maskey <INITIAL>cancel {
606ba597c5SAnurag S. Maskey 			BEGIN TSTATE;
616ba597c5SAnurag S. Maskey 			state = TSTATE;
626ba597c5SAnurag S. Maskey 			return CANCEL;
636ba597c5SAnurag S. Maskey 		}
646ba597c5SAnurag S. Maskey 
656ba597c5SAnurag S. Maskey <INITIAL>clear	{
666ba597c5SAnurag S. Maskey 			BEGIN TSTATE;
676ba597c5SAnurag S. Maskey 			state = TSTATE;
686ba597c5SAnurag S. Maskey 			return CLEAR;
696ba597c5SAnurag S. Maskey 		}
706ba597c5SAnurag S. Maskey 
716ba597c5SAnurag S. Maskey <INITIAL>commit	{
726ba597c5SAnurag S. Maskey 			BEGIN TSTATE;
736ba597c5SAnurag S. Maskey 			state = TSTATE;
746ba597c5SAnurag S. Maskey 			return COMMIT;
756ba597c5SAnurag S. Maskey 		}
766ba597c5SAnurag S. Maskey 
776ba597c5SAnurag S. Maskey <INITIAL>create	{
786ba597c5SAnurag S. Maskey 			BEGIN TSTATE;
796ba597c5SAnurag S. Maskey 			state = TSTATE;
806ba597c5SAnurag S. Maskey 			return CREATE;
816ba597c5SAnurag S. Maskey 		}
826ba597c5SAnurag S. Maskey 
836ba597c5SAnurag S. Maskey 
846ba597c5SAnurag S. Maskey <INITIAL>destroy {
856ba597c5SAnurag S. Maskey 			BEGIN TSTATE;
866ba597c5SAnurag S. Maskey 			state = TSTATE;
876ba597c5SAnurag S. Maskey 			return DESTROY;
886ba597c5SAnurag S. Maskey 		}
896ba597c5SAnurag S. Maskey 
906ba597c5SAnurag S. Maskey <INITIAL>end	{
916ba597c5SAnurag S. Maskey 			BEGIN TSTATE;
926ba597c5SAnurag S. Maskey 			state = TSTATE;
936ba597c5SAnurag S. Maskey 			return END;
946ba597c5SAnurag S. Maskey 		}
956ba597c5SAnurag S. Maskey 
966ba597c5SAnurag S. Maskey <INITIAL>exit|quit {
976ba597c5SAnurag S. Maskey 			BEGIN TSTATE;
986ba597c5SAnurag S. Maskey 			state = TSTATE;
996ba597c5SAnurag S. Maskey 			return EXIT;
1006ba597c5SAnurag S. Maskey 		}
1016ba597c5SAnurag S. Maskey 
1026ba597c5SAnurag S. Maskey <INITIAL>export	{
1036ba597c5SAnurag S. Maskey 			BEGIN TSTATE;
1046ba597c5SAnurag S. Maskey 			state = TSTATE;
1056ba597c5SAnurag S. Maskey 			return EXPORT;
1066ba597c5SAnurag S. Maskey 		}
1076ba597c5SAnurag S. Maskey 
1086ba597c5SAnurag S. Maskey <INITIAL>get	{
1096ba597c5SAnurag S. Maskey 			BEGIN TSTATE;
1106ba597c5SAnurag S. Maskey 			state = TSTATE;
1116ba597c5SAnurag S. Maskey 			return GET;
1126ba597c5SAnurag S. Maskey 		}
1136ba597c5SAnurag S. Maskey 
1146ba597c5SAnurag S. Maskey <INITIAL>"?"|help {
1156ba597c5SAnurag S. Maskey 			BEGIN TSTATE;
1166ba597c5SAnurag S. Maskey 			state = TSTATE;
1176ba597c5SAnurag S. Maskey 			return HELP;
1186ba597c5SAnurag S. Maskey 		}
1196ba597c5SAnurag S. Maskey 
1206ba597c5SAnurag S. Maskey <INITIAL>list	{
1216ba597c5SAnurag S. Maskey 			BEGIN TSTATE;
1226ba597c5SAnurag S. Maskey 			state = TSTATE;
1236ba597c5SAnurag S. Maskey 			return LIST;
1246ba597c5SAnurag S. Maskey 		}
1256ba597c5SAnurag S. Maskey 
1266ba597c5SAnurag S. Maskey <INITIAL>revert	{
1276ba597c5SAnurag S. Maskey 			BEGIN TSTATE;
1286ba597c5SAnurag S. Maskey 			state = TSTATE;
1296ba597c5SAnurag S. Maskey 			return REVERT;
1306ba597c5SAnurag S. Maskey 		}
1316ba597c5SAnurag S. Maskey 
1326ba597c5SAnurag S. Maskey <INITIAL>select	{
1336ba597c5SAnurag S. Maskey 			BEGIN TSTATE;
1346ba597c5SAnurag S. Maskey 			state = TSTATE;
1356ba597c5SAnurag S. Maskey 			return SELECT;
1366ba597c5SAnurag S. Maskey 		}
1376ba597c5SAnurag S. Maskey 
1386ba597c5SAnurag S. Maskey <INITIAL>set	{
1396ba597c5SAnurag S. Maskey 			BEGIN TSTATE;
1406ba597c5SAnurag S. Maskey 			state = TSTATE;
1416ba597c5SAnurag S. Maskey 			return SET;
1426ba597c5SAnurag S. Maskey 		}
1436ba597c5SAnurag S. Maskey 
1446ba597c5SAnurag S. Maskey <INITIAL>verify	{
1456ba597c5SAnurag S. Maskey 			BEGIN TSTATE;
1466ba597c5SAnurag S. Maskey 			state = TSTATE;
1476ba597c5SAnurag S. Maskey 			return VERIFY;
1486ba597c5SAnurag S. Maskey 		}
1496ba597c5SAnurag S. Maskey 
1506ba597c5SAnurag S. Maskey <INITIAL>walkprop {
1516ba597c5SAnurag S. Maskey 			BEGIN TSTATE;
1526ba597c5SAnurag S. Maskey 			state = TSTATE;
1536ba597c5SAnurag S. Maskey 			return WALKPROP;
1546ba597c5SAnurag S. Maskey 		}
1556ba597c5SAnurag S. Maskey 
1566ba597c5SAnurag S. Maskey <TSTATE>[Ll][Oo][Cc]		{ return LOC; }
1576ba597c5SAnurag S. Maskey <TSTATE>[Nn][Cc][Pp]		{ return NCP; }
1586ba597c5SAnurag S. Maskey <TSTATE>[Ee][Nn][Mm]		{ return ENM; }
1596ba597c5SAnurag S. Maskey <TSTATE>[Ww][Ll][Aa][Nn]	{ return WLAN; }
1606ba597c5SAnurag S. Maskey 
1616ba597c5SAnurag S. Maskey <TSTATE>[Nn][Cc][Uu]		{ return NCU; }
1626ba597c5SAnurag S. Maskey 
1636ba597c5SAnurag S. Maskey <TSTATE>[Pp][Hh][Yy][Ss]	{ return PHYS; }
1646ba597c5SAnurag S. Maskey <TSTATE>[Ii][Pp]		{ return IP; }
1656ba597c5SAnurag S. Maskey 
1666ba597c5SAnurag S. Maskey <TSTATE>unknown		{ return UNKNOWN; }
1676ba597c5SAnurag S. Maskey <TSTATE>activation-mode	{ return ACTIVATION_MODE; }
1686ba597c5SAnurag S. Maskey <TSTATE>conditions	{ return CONDITIONS; }
1696ba597c5SAnurag S. Maskey <TSTATE>enabled		{ return ENABLED; }
1706ba597c5SAnurag S. Maskey 
1716ba597c5SAnurag S. Maskey <TSTATE>type			{ return TYPE; }
1726ba597c5SAnurag S. Maskey <TSTATE>class			{ return CLASS; }
1736ba597c5SAnurag S. Maskey <TSTATE>parent			{ return PARENT; }
1746ba597c5SAnurag S. Maskey <TSTATE>priority-group		{ return PRIORITY_GROUP; }
1756ba597c5SAnurag S. Maskey <TSTATE>priority-mode		{ return PRIORITY_MODE; }
1766ba597c5SAnurag S. Maskey <TSTATE>link-mac-addr		{ return LINK_MACADDR; }
1776ba597c5SAnurag S. Maskey <TSTATE>link-autopush		{ return LINK_AUTOPUSH; }
1786ba597c5SAnurag S. Maskey <TSTATE>link-mtu		{ return LINK_MTU; }
1796ba597c5SAnurag S. Maskey <TSTATE>ip-version		{ return IP_VERSION; }
1806ba597c5SAnurag S. Maskey <TSTATE>ipv4-addrsrc		{ return IPV4_ADDRSRC; }
1816ba597c5SAnurag S. Maskey <TSTATE>ipv4-addr		{ return IPV4_ADDR; }
1826ba597c5SAnurag S. Maskey <TSTATE>ipv4-default-route	{ return IPV4_DEFAULT_ROUTE; }
1836ba597c5SAnurag S. Maskey <TSTATE>ipv6-addrsrc		{ return IPV6_ADDRSRC; }
1846ba597c5SAnurag S. Maskey <TSTATE>ipv6-addr		{ return IPV6_ADDR; }
1856ba597c5SAnurag S. Maskey <TSTATE>ipv6-default-route	{ return IPV6_DEFAULT_ROUTE; }
186*b31320a7SChris Fraire <TSTATE>ip-primary		{ return IP_PRIMARY; }
187*b31320a7SChris Fraire <TSTATE>ip-reqhost		{ return IP_REQHOST; }
1886ba597c5SAnurag S. Maskey 
1896ba597c5SAnurag S. Maskey <TSTATE>state		{ return ENM_STATE; }
1906ba597c5SAnurag S. Maskey <TSTATE>fmri		{ return ENM_FMRI; }
1916ba597c5SAnurag S. Maskey <TSTATE>start		{ return ENM_START; }
1926ba597c5SAnurag S. Maskey <TSTATE>stop		{ return ENM_STOP; }
1936ba597c5SAnurag S. Maskey 
1946ba597c5SAnurag S. Maskey <TSTATE>nameservices			{ return LOC_NAMESERVICES; }
1956ba597c5SAnurag S. Maskey <TSTATE>nameservices-config-file	{ return LOC_NAMESERVICES_CONFIG; }
1966ba597c5SAnurag S. Maskey <TSTATE>dns-nameservice-configsrc	{ return LOC_DNS_CONFIGSRC; }
1976ba597c5SAnurag S. Maskey <TSTATE>dns-nameservice-domain		{ return LOC_DNS_DOMAIN; }
1986ba597c5SAnurag S. Maskey <TSTATE>dns-nameservice-servers		{ return LOC_DNS_SERVERS; }
1996ba597c5SAnurag S. Maskey <TSTATE>dns-nameservice-search		{ return LOC_DNS_SEARCH; }
2006ba597c5SAnurag S. Maskey <TSTATE>nis-nameservice-configsrc	{ return LOC_NIS_CONFIGSRC; }
2016ba597c5SAnurag S. Maskey <TSTATE>nis-nameservice-servers		{ return LOC_NIS_SERVERS; }
2026ba597c5SAnurag S. Maskey <TSTATE>ldap-nameservice-configsrc	{ return LOC_LDAP_CONFIGSRC; }
2036ba597c5SAnurag S. Maskey <TSTATE>ldap-nameservice-servers	{ return LOC_LDAP_SERVERS; }
2046ba597c5SAnurag S. Maskey <TSTATE>default-domain			{ return LOC_DEFAULT_DOMAIN; }
2056ba597c5SAnurag S. Maskey <TSTATE>nfsv4-domain			{ return LOC_NFSV4_DOMAIN; }
2066ba597c5SAnurag S. Maskey <TSTATE>ipfilter-config-file		{ return LOC_IPF_CONFIG; }
2076ba597c5SAnurag S. Maskey <TSTATE>ipfilter-v6-config-file		{ return LOC_IPF_V6_CONFIG; }
2086ba597c5SAnurag S. Maskey <TSTATE>ipnat-config-file		{ return LOC_IPNAT_CONFIG; }
2096ba597c5SAnurag S. Maskey <TSTATE>ippool-config-file		{ return LOC_IPPOOL_CONFIG; }
2106ba597c5SAnurag S. Maskey <TSTATE>ike-config-file			{ return LOC_IKE_CONFIG; }
2116ba597c5SAnurag S. Maskey <TSTATE>ipsecpolicy-config-file		{ return LOC_IPSECPOL_CONFIG; }
2126ba597c5SAnurag S. Maskey 
2136ba597c5SAnurag S. Maskey <TSTATE>bssids		{ return WLAN_BSSIDS; }
2146ba597c5SAnurag S. Maskey <TSTATE>priority	{ return WLAN_PRIORITY; }
2156ba597c5SAnurag S. Maskey <TSTATE>keyname		{ return WLAN_KEYNAME; }
2166ba597c5SAnurag S. Maskey <TSTATE>keyslot		{ return WLAN_KEYSLOT; }
2176ba597c5SAnurag S. Maskey <TSTATE>security-mode	{ return WLAN_SECURITY_MODE; }
2186ba597c5SAnurag S. Maskey 
2196ba597c5SAnurag S. Maskey <TSTATE>=		{ return EQUAL; }
2206ba597c5SAnurag S. Maskey 
2216ba597c5SAnurag S. Maskey <TSTATE>\-[adftV] {	/* matches options */
2226ba597c5SAnurag S. Maskey 			yylval.strval = safe_strdup(yytext);
2236ba597c5SAnurag S. Maskey 			return OPTION;
2246ba597c5SAnurag S. Maskey 		}
2256ba597c5SAnurag S. Maskey 
2266ba597c5SAnurag S. Maskey <TSTATE>[^ \t\n\";=\[\]\(\)]+	{	/* matches non-quoted values */
2276ba597c5SAnurag S. Maskey 			yylval.strval = safe_strdup(yytext);
2286ba597c5SAnurag S. Maskey 			return TOKEN;
2296ba597c5SAnurag S. Maskey 		}
2306ba597c5SAnurag S. Maskey 
2316ba597c5SAnurag S. Maskey <TSTATE>\"[^\"\n]*[\"\n] {	/* matches string with quotes */
2326ba597c5SAnurag S. Maskey 			yylval.strval = safe_strdup(yytext);
2336ba597c5SAnurag S. Maskey 			return TOKEN;
2346ba597c5SAnurag S. Maskey 		}
2356ba597c5SAnurag S. Maskey 
2366ba597c5SAnurag S. Maskey <TSTATE>\".*\"\,\".*\" {	/* matches string list of the form "a","b",.. */
2376ba597c5SAnurag S. Maskey 			yylval.strval = safe_strdup(yytext);
2386ba597c5SAnurag S. Maskey 			return TOKEN;
2396ba597c5SAnurag S. Maskey 		}
2406ba597c5SAnurag S. Maskey 
2416ba597c5SAnurag S. Maskey ";"		{
2426ba597c5SAnurag S. Maskey 			BEGIN INITIAL;
2436ba597c5SAnurag S. Maskey 			return (yytext[0]);
2446ba597c5SAnurag S. Maskey 		}
2456ba597c5SAnurag S. Maskey 
2466ba597c5SAnurag S. Maskey \n		{
2476ba597c5SAnurag S. Maskey 			lex_lineno++;
2486ba597c5SAnurag S. Maskey 			BEGIN INITIAL;
2496ba597c5SAnurag S. Maskey 			return (yytext[0]);
2506ba597c5SAnurag S. Maskey 		}
2516ba597c5SAnurag S. Maskey 
2526ba597c5SAnurag S. Maskey [ \t]		;	/* ignore white space */
2536ba597c5SAnurag S. Maskey 
2546ba597c5SAnurag S. Maskey .		{	/* matches all single otherwise unmatched characters */
2556ba597c5SAnurag S. Maskey 			return (yytext[0]);
2566ba597c5SAnurag S. Maskey 		}
2576ba597c5SAnurag S. Maskey 
2586ba597c5SAnurag S. Maskey %%
2596ba597c5SAnurag S. Maskey 
2606ba597c5SAnurag S. Maskey char *
2616ba597c5SAnurag S. Maskey safe_strdup(char *s)
2626ba597c5SAnurag S. Maskey {
2636ba597c5SAnurag S. Maskey 	char *result;
2646ba597c5SAnurag S. Maskey 
2656ba597c5SAnurag S. Maskey 	if ((result = strdup(s)) == NULL) {
2666ba597c5SAnurag S. Maskey 		yyerror("Out of memory");
2676ba597c5SAnurag S. Maskey 		exit(1);
2686ba597c5SAnurag S. Maskey 	}
2696ba597c5SAnurag S. Maskey 	return (result);
2706ba597c5SAnurag S. Maskey }
2716ba597c5SAnurag S. Maskey 
2726ba597c5SAnurag S. Maskey void
2736ba597c5SAnurag S. Maskey yyerror(char *s)
2746ba597c5SAnurag S. Maskey {
2756ba597c5SAnurag S. Maskey 	/* feof(yyin) is not an error; anything else is, so we set saw_error */
2766ba597c5SAnurag S. Maskey 	if (yytext[0] == '\0') {
2776ba597c5SAnurag S. Maskey 		if (!feof(yyin)) {
2786ba597c5SAnurag S. Maskey 			saw_error = B_TRUE;
2796ba597c5SAnurag S. Maskey 			(void) fprintf(stderr, gettext("%s, token expected\n"),
2806ba597c5SAnurag S. Maskey 			    s);
2816ba597c5SAnurag S. Maskey 		}
2826ba597c5SAnurag S. Maskey 		return;
2836ba597c5SAnurag S. Maskey 	}
2846ba597c5SAnurag S. Maskey 
2856ba597c5SAnurag S. Maskey 	saw_error = B_TRUE;
2866ba597c5SAnurag S. Maskey 	if (cmd_file_mode) {
2876ba597c5SAnurag S. Maskey 		(void) fprintf(stderr, gettext("%s on line %d at '%s'\n"), s,
2886ba597c5SAnurag S. Maskey 		    lex_lineno, (yytext[0] == '\n') ? "\\n" : yytext);
2896ba597c5SAnurag S. Maskey 	} else {
2906ba597c5SAnurag S. Maskey 		(void) fprintf(stderr, gettext("%s at '%s'\n\n"), s,
2916ba597c5SAnurag S. Maskey 		    (yytext[0] == '\n') ? "\\n" : yytext);
2926ba597c5SAnurag S. Maskey 	}
2936ba597c5SAnurag S. Maskey 	help_wrap();
2946ba597c5SAnurag S. Maskey }
295