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 <stdio.h>
29#include <sys/types.h>
30
31#include "nwamcfg.h"
32
33static cmd_t *cmd = NULL;		/* Command being processed */
34
35/* yacc externals */
36extern int yydebug;
37extern void yyerror(char *s);
38
39extern boolean_t newline_terminated;
40
41%}
42
43%union {
44	int ival;
45	char *strval;
46	cmd_t *cmd;
47}
48
49%start commands
50
51%token CANCEL CLEAR COMMIT CREATE DESTROY END EXIT EXPORT GET HELP
52%token LIST REVERT SELECT SET VERIFY WALKPROP
53%token LOC NCP NCU ENM WLAN
54%token PHYS IP
55%token TOKEN EQUAL OPTION
56%token UNKNOWN ACTIVATION_MODE CONDITIONS ENABLED
57%token TYPE CLASS PARENT PRIORITY_GROUP PRIORITY_MODE
58%token LINK_MACADDR LINK_AUTOPUSH LINK_MTU
59%token IP_VERSION IPV4_ADDRSRC IPV4_ADDR IPV4_DEFAULT_ROUTE
60%token IPV6_ADDRSRC IPV6_ADDR IPV6_DEFAULT_ROUTE
61%token ENM_STATE ENM_FMRI ENM_START ENM_STOP
62%token LOC_NAMESERVICES LOC_NAMESERVICES_CONFIG
63%token LOC_DNS_CONFIGSRC LOC_DNS_DOMAIN LOC_DNS_SERVERS LOC_DNS_SEARCH
64%token LOC_NIS_CONFIGSRC LOC_NIS_SERVERS
65%token LOC_LDAP_CONFIGSRC LOC_LDAP_SERVERS
66%token LOC_DEFAULT_DOMAIN LOC_NFSV4_DOMAIN
67%token LOC_IPF_CONFIG LOC_IPF_V6_CONFIG
68%token LOC_IPNAT_CONFIG LOC_IPPOOL_CONFIG LOC_IKE_CONFIG LOC_IPSECPOL_CONFIG
69%token WLAN_BSSIDS WLAN_PRIORITY WLAN_KEYNAME WLAN_KEYSLOT WLAN_SECURITY_MODE
70
71%type <strval> TOKEN EQUAL OPTION
72%type <ival> resource1_type LOC NCP ENM WLAN
73%type <ival> resource2_type NCU
74%type <ival> ncu_class_type PHYS IP
75%type <ival> property_type UNKNOWN ACTIVATION_MODE CONDITIONS ENABLED
76    TYPE CLASS PARENT PRIORITY_GROUP PRIORITY_MODE
77    LINK_MACADDR LINK_AUTOPUSH LINK_MTU
78    IP_VERSION IPV4_ADDRSRC IPV4_ADDR IPV4_DEFAULT_ROUTE
79    IPV6_ADDRSRC IPV6_ADDR IPV6_DEFAULT_ROUTE
80    ENM_STATE ENM_FMRI ENM_START ENM_STOP
81    LOC_NAMESERVICES LOC_NAMESERVICES_CONFIG
82    LOC_DNS_CONFIGSRC LOC_DNS_DOMAIN LOC_DNS_SERVERS LOC_DNS_SEARCH
83    LOC_NIS_CONFIGSRC LOC_NIS_SERVERS
84    LOC_LDAP_CONFIGSRC LOC_LDAP_SERVERS
85    LOC_DEFAULT_DOMAIN LOC_NFSV4_DOMAIN
86    LOC_IPF_CONFIG LOC_IPF_V6_CONFIG
87    LOC_IPNAT_CONFIG LOC_IPPOOL_CONFIG LOC_IKE_CONFIG LOC_IPSECPOL_CONFIG
88    WLAN_BSSIDS WLAN_PRIORITY WLAN_KEYNAME WLAN_KEYSLOT WLAN_SECURITY_MODE
89%type <cmd> command
90%type <cmd> cancel_command CANCEL
91%type <cmd> clear_command CLEAR
92%type <cmd> commit_command COMMIT
93%type <cmd> create_command CREATE
94%type <cmd> destroy_command DESTROY
95%type <cmd> end_command END
96%type <cmd> exit_command EXIT
97%type <cmd> export_command EXPORT
98%type <cmd> get_command GET
99%type <cmd> help_command HELP
100%type <cmd> list_command LIST
101%type <cmd> revert_command REVERT
102%type <cmd> select_command SELECT
103%type <cmd> set_command SET
104%type <cmd> verify_command VERIFY
105%type <cmd> walkprop_command WALKPROP
106%type <cmd> terminator
107
108%%
109
110commands: command terminator
111	{
112		if ($1 != NULL) {
113			if ($1->cmd_handler != NULL)
114				if (check_scope($1->cmd_num))
115					$1->cmd_handler($1);
116			free_cmd($1);
117		}
118		return (0);
119	}
120	| command error terminator
121	{
122		if ($1 != NULL)
123			free_cmd($1);
124		if (YYRECOVERING())
125			YYABORT;
126		yyclearin;
127		yyerrok;
128	}
129	| error terminator
130	{
131		if (YYRECOVERING())
132			YYABORT;
133		yyclearin;
134		yyerrok;
135	}
136	| terminator
137	{
138		return (0);
139	}
140
141command: cancel_command
142	| clear_command
143	| commit_command
144	| create_command
145	| destroy_command
146	| end_command
147	| exit_command
148	| export_command
149	| get_command
150	| help_command
151	| list_command
152	| revert_command
153	| select_command
154	| set_command
155	| verify_command
156	| walkprop_command
157
158terminator:	'\n'	{ newline_terminated = B_TRUE; }
159	|	';'	{ newline_terminated = B_FALSE; }
160
161cancel_command: CANCEL
162	{
163		if (($$ = alloc_cmd()) == NULL)
164			YYERROR;
165		cmd = $$;
166		$$->cmd_num = CMD_CANCEL;
167		$$->cmd_handler = &cancel_func;
168		$$->cmd_argc = 0;
169		$$->cmd_argv[0] = NULL;
170	}
171
172clear_command: CLEAR
173	{
174		command_usage(CMD_CLEAR);
175		YYERROR;
176	}
177	|	CLEAR TOKEN
178	{
179		properr($2);
180		YYERROR;
181	}
182	|	CLEAR property_type
183	{
184		/* clear prop */
185		if (($$ = alloc_cmd()) == NULL)
186			YYERROR;
187		cmd = $$;
188		$$->cmd_num = CMD_CLEAR;
189		$$->cmd_handler = &clear_func;
190		$$->cmd_prop_type = $2;
191		$$->cmd_argc = 0;
192		$$->cmd_argv[0] = NULL;
193	}
194
195commit_command: COMMIT
196	{
197		if (($$ = alloc_cmd()) == NULL)
198			YYERROR;
199		cmd = $$;
200		$$->cmd_num = CMD_COMMIT;
201		$$->cmd_handler = &commit_func;
202		$$->cmd_argc = 0;
203		$$->cmd_argv[0] = NULL;
204	}
205
206create_command: CREATE
207	{
208		command_usage(CMD_CREATE);
209		YYERROR;
210	}
211	|	CREATE TOKEN
212	{
213		command_usage(CMD_CREATE);
214		YYERROR;
215	}
216	|	CREATE resource1_type
217	{
218		command_usage(CMD_CREATE);
219		YYERROR;
220	}
221	|	CREATE resource2_type
222	{
223		command_usage(CMD_CREATE);
224		YYERROR;
225	}
226	|	CREATE resource1_type TOKEN
227	{
228		/* create enm/loc/ncp test */
229		if (($$ = alloc_cmd()) == NULL)
230			YYERROR;
231		cmd = $$;
232		$$->cmd_num = CMD_CREATE;
233		$$->cmd_handler = &create_func;
234		$$->cmd_res1_type = $2;
235		$$->cmd_argc = 1;
236		$$->cmd_argv[0] = $3;
237		$$->cmd_argv[1] = NULL;
238	}
239	|	CREATE resource2_type ncu_class_type TOKEN
240	{
241		/* create ncu ip/phys test */
242		if (($$ = alloc_cmd()) == NULL)
243			YYERROR;
244		cmd = $$;
245		$$->cmd_num = CMD_CREATE;
246		$$->cmd_handler = &create_func;
247		$$->cmd_res1_type = RT1_NCP;
248		$$->cmd_res2_type = $2;
249		$$->cmd_ncu_class_type = $3;
250		$$->cmd_argc = 1;
251		$$->cmd_argv[0] = $4;
252		$$->cmd_argv[1] = NULL;
253	}
254	|	CREATE OPTION TOKEN resource1_type TOKEN
255	{
256		/* create -t old enm/loc/ncp test */
257		if (($$ = alloc_cmd()) == NULL)
258			YYERROR;
259		cmd = $$;
260		$$->cmd_num = CMD_CREATE;
261		$$->cmd_handler = &create_func;
262		$$->cmd_res1_type = $4;
263		$$->cmd_argc = 3;
264		$$->cmd_argv[0] = $2;
265		$$->cmd_argv[1] = $3;
266		$$->cmd_argv[2] = $5;
267		$$->cmd_argv[3] = NULL;
268	}
269	|	CREATE OPTION TOKEN resource2_type ncu_class_type TOKEN
270	{
271		/* create -t old ncu ip/phys test */
272		if (($$ = alloc_cmd()) == NULL)
273			YYERROR;
274		cmd = $$;
275		$$->cmd_num = CMD_CREATE;
276		$$->cmd_handler = &create_func;
277		$$->cmd_res1_type = RT1_NCP;
278		$$->cmd_res2_type = $4;
279		$$->cmd_ncu_class_type = $5;
280		$$->cmd_argc = 3;
281		$$->cmd_argv[0] = $2;
282		$$->cmd_argv[1] = $3;
283		$$->cmd_argv[2] = $6;
284		$$->cmd_argv[3] = NULL;
285	}
286
287destroy_command: DESTROY
288	{
289		command_usage(CMD_DESTROY);
290		YYERROR;
291	}
292	|	DESTROY OPTION
293	{
294		/* destroy -a */
295		if (($$ = alloc_cmd()) == NULL)
296			YYERROR;
297		cmd = $$;
298		$$->cmd_num = CMD_DESTROY;
299		$$->cmd_handler = &destroy_func;
300		$$->cmd_res1_type = -1; /* special value */
301		$$->cmd_argc = 1;
302		$$->cmd_argv[0] = $2;
303		$$->cmd_argv[1] = NULL;
304	}
305	|	DESTROY resource1_type
306	{
307		command_usage(CMD_DESTROY);
308		YYERROR;
309	}
310	|	DESTROY resource2_type
311	{
312		command_usage(CMD_DESTROY);
313		YYERROR;
314	}
315	|	DESTROY resource1_type TOKEN
316	{
317		/* destroy enm/loc/ncp test */
318		if (($$ = alloc_cmd()) == NULL)
319			YYERROR;
320		cmd = $$;
321		$$->cmd_num = CMD_DESTROY;
322		$$->cmd_handler = &destroy_func;
323		$$->cmd_res1_type = $2;
324		$$->cmd_argc = 1;
325		$$->cmd_argv[0] = $3;
326		$$->cmd_argv[1] = NULL;
327	}
328	|	DESTROY resource2_type TOKEN
329	{
330		/* destroy ncu test (class inferred) */
331		if (($$ = alloc_cmd()) == NULL)
332			YYERROR;
333		cmd = $$;
334		$$->cmd_num = CMD_DESTROY;
335		$$->cmd_handler = &destroy_func;
336		$$->cmd_res1_type = RT1_NCP;
337		$$->cmd_res2_type = $2;
338		$$->cmd_ncu_class_type = NCU_CLASS_ANY;
339		$$->cmd_argc = 1;
340		$$->cmd_argv[0] = $3;
341		$$->cmd_argv[1] = NULL;
342	}
343	|	DESTROY resource2_type ncu_class_type TOKEN
344	{
345		/* destroy ncu ip/phys test */
346		if (($$ = alloc_cmd()) == NULL)
347			YYERROR;
348		cmd = $$;
349		$$->cmd_num = CMD_DESTROY;
350		$$->cmd_handler = &destroy_func;
351		$$->cmd_res1_type = RT1_NCP;
352		$$->cmd_res2_type = $2;
353		$$->cmd_ncu_class_type = $3;
354		$$->cmd_argc = 1;
355		$$->cmd_argv[0] = $4;
356		$$->cmd_argv[1] = NULL;
357	}
358
359end_command:	END
360	{
361		if (($$ = alloc_cmd()) == NULL)
362			YYERROR;
363		cmd = $$;
364		$$->cmd_num = CMD_END;
365		$$->cmd_handler = &end_func;
366		$$->cmd_argc = 0;
367		$$->cmd_argv[0] = NULL;
368	}
369
370exit_command:	EXIT
371	{
372		if (($$ = alloc_cmd()) == NULL)
373			YYERROR;
374		cmd = $$;
375		$$->cmd_num = CMD_EXIT;
376		$$->cmd_handler = &exit_func;
377		$$->cmd_argc = 0;
378		$$->cmd_argv[0] = NULL;
379	}
380
381export_command:	EXPORT
382	{
383		if (($$ = alloc_cmd()) == NULL)
384			YYERROR;
385		cmd = $$;
386		$$->cmd_num = CMD_EXPORT;
387		$$->cmd_handler = &export_func;
388		$$->cmd_argc = 0;
389		$$->cmd_argv[0] = NULL;
390	}
391	|	EXPORT TOKEN
392	{
393		command_usage(CMD_EXPORT);
394		YYERROR;
395	}
396 	|	EXPORT OPTION
397	{
398		/* export -d */
399		if (($$ = alloc_cmd()) == NULL)
400			YYERROR;
401		cmd = $$;
402		$$->cmd_num = CMD_EXPORT;
403		$$->cmd_handler = &export_func;
404		$$->cmd_argc = 1;
405		$$->cmd_argv[0] = $2;
406		$$->cmd_argv[1] = NULL;
407	}
408	|	EXPORT OPTION TOKEN
409	{
410		/* export -f file */
411		if (($$ = alloc_cmd()) == NULL)
412			YYERROR;
413		cmd = $$;
414		$$->cmd_num = CMD_EXPORT;
415		$$->cmd_handler = &export_func;
416		$$->cmd_argc = 2;
417		$$->cmd_argv[0] = $2;
418		$$->cmd_argv[1] = $3;
419		$$->cmd_argv[2] = NULL;
420	}
421	|	EXPORT OPTION OPTION TOKEN
422	{
423		/* export -d -f file */
424		if (($$ = alloc_cmd()) == NULL)
425			YYERROR;
426		cmd = $$;
427		$$->cmd_num = CMD_EXPORT;
428		$$->cmd_handler = &export_func;
429		$$->cmd_argc = 3;
430		$$->cmd_argv[0] = $2;
431		$$->cmd_argv[1] = $3;
432		$$->cmd_argv[2] = $4;
433		$$->cmd_argv[3] = NULL;
434	}
435	|	EXPORT resource1_type TOKEN
436	{
437		/* export enm/loc/ncp test */
438		if (($$ = alloc_cmd()) == NULL)
439			YYERROR;
440		cmd = $$;
441		$$->cmd_num = CMD_EXPORT;
442		$$->cmd_handler = &export_func;
443		$$->cmd_res1_type = $2;
444		$$->cmd_argc = 1;
445		$$->cmd_argv[0] = $3;
446		$$->cmd_argv[1] = NULL;
447	}
448	|	EXPORT resource2_type TOKEN
449	{
450		/* export ncu test (all ncu's named test) */
451		if (($$ = alloc_cmd()) == NULL)
452			YYERROR;
453		cmd = $$;
454		$$->cmd_num = CMD_EXPORT;
455		$$->cmd_handler = &export_func;
456		$$->cmd_res1_type = RT1_NCP;
457		$$->cmd_res2_type = $2;
458		$$->cmd_ncu_class_type = NCU_CLASS_ANY;
459		$$->cmd_argc = 1;
460		$$->cmd_argv[0] = $3;
461		$$->cmd_argv[1] = NULL;
462	}
463	|	EXPORT resource2_type ncu_class_type TOKEN
464	{
465		/* export ncu ip/phys test */
466		if (($$ = alloc_cmd()) == NULL)
467			YYERROR;
468		cmd = $$;
469		$$->cmd_num = CMD_EXPORT;
470		$$->cmd_handler = &export_func;
471		$$->cmd_res1_type = RT1_NCP;
472		$$->cmd_res2_type = $2;
473		$$->cmd_ncu_class_type = $3;
474		$$->cmd_argc = 1;
475		$$->cmd_argv[0] = $4;
476		$$->cmd_argv[1] = NULL;
477	}
478	|	EXPORT OPTION TOKEN resource1_type TOKEN
479	{
480		/* export -f file enm/loc/ncp test */
481		if (($$ = alloc_cmd()) == NULL)
482			YYERROR;
483		cmd = $$;
484		$$->cmd_num = CMD_EXPORT;
485		$$->cmd_handler = &export_func;
486		$$->cmd_res1_type = $4;
487		$$->cmd_argc = 3;
488		$$->cmd_argv[0] = $2;
489		$$->cmd_argv[1] = $3;
490		$$->cmd_argv[2] = $5;
491		$$->cmd_argv[3] = NULL;
492	}
493	|	EXPORT OPTION TOKEN resource2_type TOKEN
494	{
495		/* export -f file ncu test (all ncu's named test) */
496		if (($$ = alloc_cmd()) == NULL)
497			YYERROR;
498		cmd = $$;
499		$$->cmd_num = CMD_EXPORT;
500		$$->cmd_handler = &export_func;
501		$$->cmd_res1_type = RT1_NCP;
502		$$->cmd_res2_type = $4;
503		$$->cmd_ncu_class_type = NCU_CLASS_ANY;
504		$$->cmd_argc = 3;
505		$$->cmd_argv[0] = $2;
506		$$->cmd_argv[1] = $3;
507		$$->cmd_argv[2] = $5;
508		$$->cmd_argv[3] = NULL;
509	}
510	|	EXPORT OPTION TOKEN resource2_type ncu_class_type TOKEN
511	{
512		/* export -f file ncu ip/phys test */
513		if (($$ = alloc_cmd()) == NULL)
514			YYERROR;
515		cmd = $$;
516		$$->cmd_num = CMD_EXPORT;
517		$$->cmd_handler = &export_func;
518		$$->cmd_res1_type = RT1_NCP;
519		$$->cmd_res2_type = $4;
520		$$->cmd_ncu_class_type = $5;
521		$$->cmd_argc = 3;
522		$$->cmd_argv[0] = $2;
523		$$->cmd_argv[1] = $3;
524		$$->cmd_argv[2] = $6;
525		$$->cmd_argv[3] = NULL;
526	}
527
528get_command: GET
529	{
530		command_usage(CMD_GET);
531		YYERROR;
532	}
533	|	GET TOKEN
534	{
535		properr($2);
536		YYERROR;
537	}
538	|	GET property_type
539	{
540		/* get prop */
541		if (($$ = alloc_cmd()) == NULL)
542			YYERROR;
543		cmd = $$;
544		$$->cmd_num = CMD_GET;
545		$$->cmd_handler = &get_func;
546		$$->cmd_prop_type = $2;
547		$$->cmd_argc = 0;
548		$$->cmd_argv[0] = NULL;
549	}
550	|	GET OPTION property_type
551	{
552		/* get -V prop */
553		if (($$ = alloc_cmd()) == NULL)
554			YYERROR;
555		cmd = $$;
556		$$->cmd_num = CMD_GET;
557		$$->cmd_handler = &get_func;
558		$$->cmd_prop_type = $3;
559		$$->cmd_argc = 1;
560		$$->cmd_argv[0] = $2;
561		$$->cmd_argv[1] = NULL;
562	}
563
564help_command:	HELP
565	{
566		if (($$ = alloc_cmd()) == NULL)
567			YYERROR;
568		cmd = $$;
569		$$->cmd_num = CMD_HELP;
570		$$->cmd_handler = &help_func;
571		$$->cmd_argc = 0;
572		$$->cmd_argv[0] = NULL;
573	}
574	|	HELP TOKEN
575	{
576		/* help command */
577		if (($$ = alloc_cmd()) == NULL)
578			YYERROR;
579		cmd = $$;
580		$$->cmd_num = CMD_HELP;
581		$$->cmd_handler = &help_func;
582		$$->cmd_argc = 1;
583		$$->cmd_argv[0] = $2;
584		$$->cmd_argv[1] = NULL;
585	}
586
587list_command:	LIST
588	{
589		if (($$ = alloc_cmd()) == NULL)
590			YYERROR;
591		cmd = $$;
592		$$->cmd_num = CMD_LIST;
593		$$->cmd_handler = &list_func;
594		$$->cmd_argc = 0;
595		$$->cmd_argv[0] = NULL;
596	}
597	|	LIST TOKEN
598	{
599		command_usage(CMD_LIST);
600		YYERROR;
601	}
602	|	LIST OPTION
603	{
604		/* list -a */
605		if (($$ = alloc_cmd()) == NULL)
606			YYERROR;
607		cmd = $$;
608		$$->cmd_num = CMD_LIST;
609		$$->cmd_handler = &list_func;
610		$$->cmd_res1_type = -1; /* special value */
611		$$->cmd_argc = 1;
612		$$->cmd_argv[0] = $2;
613		$$->cmd_argv[1] = NULL;
614	}
615	|	LIST resource1_type
616	{
617		command_usage(CMD_LIST);
618		YYERROR;
619	}
620	|	LIST resource2_type
621	{
622		command_usage(CMD_LIST);
623		YYERROR;
624	}
625	|	LIST resource1_type TOKEN
626	{
627		/* list enm/loc/ncp test */
628		if (($$ = alloc_cmd()) == NULL)
629			YYERROR;
630		cmd = $$;
631		$$->cmd_num = CMD_LIST;
632		$$->cmd_handler = &list_func;
633		$$->cmd_res1_type = $2;
634		$$->cmd_argc = 1;
635		$$->cmd_argv[0] = $3;
636		$$->cmd_argv[1] = NULL;
637	}
638	|	LIST resource2_type TOKEN
639	{
640		/* list ncu test (all ncu's named test) */
641		if (($$ = alloc_cmd()) == NULL)
642			YYERROR;
643		cmd = $$;
644		$$->cmd_num = CMD_LIST;
645		$$->cmd_handler = &list_func;
646		$$->cmd_res1_type = RT1_NCP;
647		$$->cmd_res2_type = $2;
648		$$->cmd_ncu_class_type = NCU_CLASS_ANY;
649		$$->cmd_argc = 1;
650		$$->cmd_argv[0] = $3;
651		$$->cmd_argv[1] = NULL;
652	}
653	|	LIST resource2_type ncu_class_type TOKEN
654	{
655		/* list ncu ip/phys test */
656		if (($$ = alloc_cmd()) == NULL)
657			YYERROR;
658		cmd = $$;
659		$$->cmd_num = CMD_LIST;
660		$$->cmd_handler = &list_func;
661		$$->cmd_res1_type = RT1_NCP;
662		$$->cmd_res2_type = $2;
663		$$->cmd_ncu_class_type = $3;
664		$$->cmd_argc = 1;
665		$$->cmd_argv[0] = $4;
666		$$->cmd_argv[1] = NULL;
667	}
668	|	LIST OPTION resource1_type TOKEN
669	{
670		/* list -a enm/loc/ncp test */
671		if (($$ = alloc_cmd()) == NULL)
672			YYERROR;
673		cmd = $$;
674		$$->cmd_num = CMD_LIST;
675		$$->cmd_handler = &list_func;
676		$$->cmd_res1_type = $3;
677		$$->cmd_argc = 2;
678		$$->cmd_argv[0] = $4;
679		$$->cmd_argv[1] = $2;
680		$$->cmd_argv[2] = NULL;
681	}
682	|	LIST OPTION resource2_type TOKEN
683	{
684		/* list -a ncu test (all ncu's named test) */
685		if (($$ = alloc_cmd()) == NULL)
686			YYERROR;
687		cmd = $$;
688		$$->cmd_num = CMD_LIST;
689		$$->cmd_handler = &list_func;
690		$$->cmd_res1_type = RT1_NCP;
691		$$->cmd_res2_type = $3;
692		$$->cmd_ncu_class_type = NCU_CLASS_ANY;
693		$$->cmd_argc = 2;
694		$$->cmd_argv[0] = $4;
695		$$->cmd_argv[1] = $2;
696		$$->cmd_argv[2] = NULL;
697	}
698	|	LIST OPTION resource2_type ncu_class_type TOKEN
699	{
700		/* list -a ncu ip/phys test */
701		if (($$ = alloc_cmd()) == NULL)
702			YYERROR;
703		cmd = $$;
704		$$->cmd_num = CMD_LIST;
705		$$->cmd_handler = &list_func;
706		$$->cmd_res1_type = RT1_NCP;
707		$$->cmd_res2_type = $3;
708		$$->cmd_ncu_class_type = $4;
709		$$->cmd_argc = 2;
710		$$->cmd_argv[0] = $5;
711		$$->cmd_argv[1] = $2;
712		$$->cmd_argv[2] = NULL;
713	}
714
715revert_command: REVERT
716	{
717		if (($$ = alloc_cmd()) == NULL)
718			YYERROR;
719		cmd = $$;
720		$$->cmd_num = CMD_REVERT;
721		$$->cmd_handler = &revert_func;
722		$$->cmd_argc = 0;
723		$$->cmd_argv[0] = NULL;
724	}
725
726select_command:	SELECT
727	{
728		command_usage(CMD_SELECT);
729		YYERROR;
730	}
731	|	SELECT TOKEN
732	{
733		command_usage(CMD_SELECT);
734		YYERROR;
735	}
736	|	SELECT resource1_type
737	{
738		command_usage(CMD_SELECT);
739		YYERROR;
740	}
741	|	SELECT resource2_type
742	{
743		command_usage(CMD_SELECT);
744		YYERROR;
745	}
746	|	SELECT resource1_type TOKEN
747	{
748		/* select enm/loc/ncp test */
749		if (($$ = alloc_cmd()) == NULL)
750			YYERROR;
751		cmd = $$;
752		$$->cmd_num = CMD_SELECT;
753		$$->cmd_handler = &select_func;
754		$$->cmd_res1_type = $2;
755		$$->cmd_argc = 1;
756		$$->cmd_argv[0] = $3;
757		$$->cmd_argv[1] = NULL;
758	}
759	|	SELECT resource2_type TOKEN
760	{
761		/* select ncu test (class inferred) */
762		if (($$ = alloc_cmd()) == NULL)
763			YYERROR;
764		cmd = $$;
765		$$->cmd_num = CMD_SELECT;
766		$$->cmd_handler = &select_func;
767		$$->cmd_res1_type = RT1_NCP;
768		$$->cmd_res2_type = $2;
769		$$->cmd_ncu_class_type = NCU_CLASS_ANY;
770		$$->cmd_argc = 1;
771		$$->cmd_argv[0] = $3;
772		$$->cmd_argv[1] = NULL;
773	}
774	|	SELECT resource2_type ncu_class_type TOKEN
775	{
776		/* select ncu ip/phys test */
777		if (($$ = alloc_cmd()) == NULL)
778			YYERROR;
779		cmd = $$;
780		$$->cmd_num = CMD_SELECT;
781		$$->cmd_handler = &select_func;
782		$$->cmd_res1_type = RT1_NCP;
783		$$->cmd_res2_type = $2;
784		$$->cmd_ncu_class_type = $3;
785		$$->cmd_argc = 1;
786		$$->cmd_argv[0] = $4;
787		$$->cmd_argv[1] = NULL;
788	}
789
790set_command:	SET
791	{
792		command_usage(CMD_SET);
793		YYERROR;
794	}
795	|	SET TOKEN
796	{
797		properr($2);
798		YYERROR;
799	}
800	|	SET property_type EQUAL TOKEN
801	{
802		/* set prop=value */
803		if (($$ = alloc_cmd()) == NULL)
804			YYERROR;
805		cmd = $$;
806		$$->cmd_num = CMD_SET;
807		$$->cmd_handler = &set_func;
808		$$->cmd_prop_type = $2;
809		$$->cmd_argc = 1;
810		$$->cmd_argv[0] = $4;
811		$$->cmd_argv[1] = NULL;
812	}
813
814verify_command: VERIFY
815	{
816		if (($$ = alloc_cmd()) == NULL)
817			YYERROR;
818		cmd = $$;
819		$$->cmd_num = CMD_VERIFY;
820		$$->cmd_handler = &verify_func;
821		$$->cmd_argc = 0;
822		$$->cmd_argv[0] = NULL;
823	}
824
825walkprop_command: WALKPROP
826	{
827		if (($$ = alloc_cmd()) == NULL)
828			YYERROR;
829		cmd = $$;
830		$$->cmd_num = CMD_WALKPROP;
831		$$->cmd_handler = &walkprop_func;
832		$$->cmd_argc = 0;
833		$$->cmd_argv[0] = NULL;
834	}
835	|	WALKPROP OPTION
836	{
837		/* walkprop -a */
838		if (($$ = alloc_cmd()) == NULL)
839			YYERROR;
840		cmd = $$;
841		$$->cmd_num = CMD_WALKPROP;
842		$$->cmd_handler = &walkprop_func;
843		$$->cmd_argc = 1;
844		$$->cmd_argv[0] = $2;
845		$$->cmd_argv[1] = NULL;
846	}
847
848resource1_type: LOC	{ $$ = RT1_LOC; }
849	|	NCP	{ $$ = RT1_NCP; }
850	|	ENM	{ $$ = RT1_ENM; }
851	|	WLAN	{ $$ = RT1_WLAN; }
852
853resource2_type: NCU	{ $$ = RT2_NCU; }
854
855ncu_class_type:	PHYS		{ $$ = NCU_CLASS_PHYS; }
856	|	IP		{ $$ = NCU_CLASS_IP; }
857
858property_type:	UNKNOWN			{ $$ = PT_UNKNOWN; }
859	|	ACTIVATION_MODE		{ $$ = PT_ACTIVATION_MODE; }
860	|	CONDITIONS		{ $$ = PT_CONDITIONS; }
861	|	ENABLED			{ $$ = PT_ENABLED; }
862	|	TYPE			{ $$ = PT_TYPE; }
863	|	CLASS			{ $$ = PT_CLASS; }
864	|	PARENT			{ $$ = PT_PARENT; }
865	|	PRIORITY_GROUP		{ $$ = PT_PRIORITY_GROUP; }
866	|	PRIORITY_MODE		{ $$ = PT_PRIORITY_MODE; }
867	|	LINK_MACADDR		{ $$ = PT_LINK_MACADDR; }
868	|	LINK_AUTOPUSH		{ $$ = PT_LINK_AUTOPUSH; }
869	|	LINK_MTU		{ $$ = PT_LINK_MTU; }
870	|	IP_VERSION		{ $$ = PT_IP_VERSION; }
871	|	IPV4_ADDRSRC		{ $$ = PT_IPV4_ADDRSRC; }
872	|	IPV4_ADDR		{ $$ = PT_IPV4_ADDR; }
873	|	IPV4_DEFAULT_ROUTE	{ $$ = PT_IPV4_DEFAULT_ROUTE; }
874	|	IPV6_ADDRSRC		{ $$ = PT_IPV6_ADDRSRC; }
875	|	IPV6_ADDR		{ $$ = PT_IPV6_ADDR; }
876	|	IPV6_DEFAULT_ROUTE	{ $$ = PT_IPV6_DEFAULT_ROUTE; }
877	|	ENM_FMRI		{ $$ = PT_ENM_FMRI; }
878	|	ENM_START		{ $$ = PT_ENM_START; }
879	|	ENM_STOP		{ $$ = PT_ENM_STOP; }
880	|	LOC_NAMESERVICES	{ $$ = PT_LOC_NAMESERVICES; }
881	|	LOC_NAMESERVICES_CONFIG	{ $$ = PT_LOC_NAMESERVICES_CONFIG; }
882	|	LOC_DNS_CONFIGSRC	{ $$ = PT_LOC_DNS_CONFIGSRC; }
883	|	LOC_DNS_DOMAIN		{ $$ = PT_LOC_DNS_DOMAIN; }
884	|	LOC_DNS_SERVERS		{ $$ = PT_LOC_DNS_SERVERS; }
885	|	LOC_DNS_SEARCH		{ $$ = PT_LOC_DNS_SEARCH; }
886	|	LOC_NIS_CONFIGSRC	{ $$ = PT_LOC_NIS_CONFIGSRC; }
887	|	LOC_NIS_SERVERS		{ $$ = PT_LOC_NIS_SERVERS; }
888	|	LOC_LDAP_CONFIGSRC	{ $$ = PT_LOC_LDAP_CONFIGSRC; }
889	|	LOC_LDAP_SERVERS	{ $$ = PT_LOC_LDAP_SERVERS; }
890	|	LOC_DEFAULT_DOMAIN	{ $$ = PT_LOC_DEFAULT_DOMAIN; }
891	|	LOC_NFSV4_DOMAIN	{ $$ = PT_LOC_NFSV4_DOMAIN; }
892	|	LOC_IPF_CONFIG		{ $$ = PT_LOC_IPF_CONFIG; }
893	|	LOC_IPF_V6_CONFIG	{ $$ = PT_LOC_IPF_V6_CONFIG; }
894	|	LOC_IPNAT_CONFIG	{ $$ = PT_LOC_IPNAT_CONFIG; }
895	|	LOC_IPPOOL_CONFIG	{ $$ = PT_LOC_IPPOOL_CONFIG; }
896	|	LOC_IKE_CONFIG		{ $$ = PT_LOC_IKE_CONFIG; }
897	|	LOC_IPSECPOL_CONFIG	{ $$ = PT_LOC_IPSECPOL_CONFIG; }
898	|	WLAN_BSSIDS		{ $$ = PT_WLAN_BSSIDS; }
899	|	WLAN_PRIORITY		{ $$ = PT_WLAN_PRIORITY; }
900	|	WLAN_KEYNAME		{ $$ = PT_WLAN_KEYNAME; }
901	|	WLAN_KEYSLOT		{ $$ = PT_WLAN_KEYSLOT; }
902	|	WLAN_SECURITY_MODE	{ $$ = PT_WLAN_SECURITY_MODE; }
903
904%%
905