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 
33 static cmd_t *cmd = NULL;		/* Command being processed */
34 
35 /* yacc externals */
36 extern int yydebug;
37 extern void yyerror(char *s);
38 
39 extern 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 
110 commands: 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 
141 command: 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 
158 terminator:	'\n'	{ newline_terminated = B_TRUE; }
159 	|	';'	{ newline_terminated = B_FALSE; }
160 
161 cancel_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 
172 clear_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 
195 commit_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 
206 create_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 
287 destroy_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 
359 end_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 
370 exit_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 
381 export_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 
528 get_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 
564 help_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 
587 list_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 
715 revert_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 
726 select_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 
790 set_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 
814 verify_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 
825 walkprop_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 
848 resource1_type: LOC	{ $$ = RT1_LOC; }
849 	|	NCP	{ $$ = RT1_NCP; }
850 	|	ENM	{ $$ = RT1_ENM; }
851 	|	WLAN	{ $$ = RT1_WLAN; }
852 
853 resource2_type: NCU	{ $$ = RT2_NCU; }
854 
855 ncu_class_type:	PHYS		{ $$ = NCU_CLASS_PHYS; }
856 	|	IP		{ $$ = NCU_CLASS_IP; }
857 
858 property_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