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