xref: /titanic_52/usr/src/cmd/cmd-inet/usr.sbin/nwamcfg/nwamcfg.c (revision 3290ae8418c12896dd59182e67b2c3b6130812f3)
16ba597c5SAnurag S. Maskey /*
26ba597c5SAnurag S. Maskey  * CDDL HEADER START
36ba597c5SAnurag S. Maskey  *
46ba597c5SAnurag S. Maskey  * The contents of this file are subject to the terms of the
56ba597c5SAnurag S. Maskey  * Common Development and Distribution License (the "License").
66ba597c5SAnurag S. Maskey  * You may not use this file except in compliance with the License.
76ba597c5SAnurag S. Maskey  *
86ba597c5SAnurag S. Maskey  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
96ba597c5SAnurag S. Maskey  * or http://www.opensolaris.org/os/licensing.
106ba597c5SAnurag S. Maskey  * See the License for the specific language governing permissions
116ba597c5SAnurag S. Maskey  * and limitations under the License.
126ba597c5SAnurag S. Maskey  *
136ba597c5SAnurag S. Maskey  * When distributing Covered Code, include this CDDL HEADER in each
146ba597c5SAnurag S. Maskey  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
156ba597c5SAnurag S. Maskey  * If applicable, add the following below this CDDL HEADER, with the
166ba597c5SAnurag S. Maskey  * fields enclosed by brackets "[]" replaced with your own identifying
176ba597c5SAnurag S. Maskey  * information: Portions Copyright [yyyy] [name of copyright owner]
186ba597c5SAnurag S. Maskey  *
196ba597c5SAnurag S. Maskey  * CDDL HEADER END
206ba597c5SAnurag S. Maskey  */
216ba597c5SAnurag S. Maskey 
226ba597c5SAnurag S. Maskey /*
23*3290ae84SAnurag S. Maskey  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
246ba597c5SAnurag S. Maskey  */
256ba597c5SAnurag S. Maskey 
266ba597c5SAnurag S. Maskey /*
276ba597c5SAnurag S. Maskey  * nwamcfg is a lex/yacc based command interpreter used to manage network
286ba597c5SAnurag S. Maskey  * configurations.  The lexer (see nwamcfg_lex.l) builds up tokens, which
296ba597c5SAnurag S. Maskey  * the grammar (see nwamcfg_grammar.y) builds up into commands, some of
306ba597c5SAnurag S. Maskey  * which takes resources and/or properties as arguments.
316ba597c5SAnurag S. Maskey  */
326ba597c5SAnurag S. Maskey 
336ba597c5SAnurag S. Maskey #include <arpa/inet.h>
346ba597c5SAnurag S. Maskey #include <assert.h>
356ba597c5SAnurag S. Maskey #include <ctype.h>
366ba597c5SAnurag S. Maskey #include <errno.h>
376ba597c5SAnurag S. Maskey #include <libnwam.h>
386ba597c5SAnurag S. Maskey #include <libtecla.h>
396ba597c5SAnurag S. Maskey #include <locale.h>
406ba597c5SAnurag S. Maskey #include <stdarg.h>
416ba597c5SAnurag S. Maskey #include <stdio.h>
426ba597c5SAnurag S. Maskey #include <string.h>
436ba597c5SAnurag S. Maskey #include <sys/stat.h>
446ba597c5SAnurag S. Maskey #include <sys/sysmacros.h>
456ba597c5SAnurag S. Maskey #include <sys/types.h>
466ba597c5SAnurag S. Maskey #include <unistd.h>
476ba597c5SAnurag S. Maskey 
486ba597c5SAnurag S. Maskey #include "nwamcfg.h"
496ba597c5SAnurag S. Maskey 
506ba597c5SAnurag S. Maskey #if !defined(TEXT_DOMAIN)		/* should be defined by cc -D */
516ba597c5SAnurag S. Maskey #define	TEXT_DOMAIN	"SYS_TEST"	/* Use this only if it wasn't */
526ba597c5SAnurag S. Maskey #endif
536ba597c5SAnurag S. Maskey 
546ba597c5SAnurag S. Maskey struct help {
556ba597c5SAnurag S. Maskey 	uint_t		cmd_num;
566ba597c5SAnurag S. Maskey 	const char	*cmd_name;
576ba597c5SAnurag S. Maskey 	const char	*cmd_usage;
586ba597c5SAnurag S. Maskey };
596ba597c5SAnurag S. Maskey 
606ba597c5SAnurag S. Maskey extern int yyparse(void);
616ba597c5SAnurag S. Maskey extern int lex_lineno;
626ba597c5SAnurag S. Maskey 
636ba597c5SAnurag S. Maskey #define	MAX_LINE_LEN	1024
646ba597c5SAnurag S. Maskey #define	MAX_CMD_HIST	1024
656ba597c5SAnurag S. Maskey 
666ba597c5SAnurag S. Maskey /* usage of commands */
676ba597c5SAnurag S. Maskey #define	SHELP_CANCEL	"cancel"
686ba597c5SAnurag S. Maskey #define	SHELP_CLEAR	"clear <prop-name>"
696ba597c5SAnurag S. Maskey #define	SHELP_COMMIT	"commit"
706ba597c5SAnurag S. Maskey #define	SHELP_CREATE	"create [-t <template>] <object-type> [<class>] " \
716ba597c5SAnurag S. Maskey 			"<object-name>"
726ba597c5SAnurag S. Maskey #define	SHELP_DESTROY	"destroy {-a | <object-type> [<class>] <object-name>}"
736ba597c5SAnurag S. Maskey #define	SHELP_END	"end"
746ba597c5SAnurag S. Maskey #define	SHELP_EXIT	"exit"
756ba597c5SAnurag S. Maskey #define	SHELP_EXPORT	"export [-d] [-f <output-file>] " \
766ba597c5SAnurag S. Maskey 			"[<object-type> [<class>] <object-name>]"
776ba597c5SAnurag S. Maskey #define	SHELP_GET	"get [-V] <prop-name>"
786ba597c5SAnurag S. Maskey #define	SHELP_HELP	"help [command-name]"
796ba597c5SAnurag S. Maskey #define	SHELP_LIST	"list [-a] [<object-type> [<class>] <object-name>]"
806ba597c5SAnurag S. Maskey #define	SHELP_REVERT	"revert"
816ba597c5SAnurag S. Maskey #define	SHELP_SELECT	"select <object-type> [<class>] <object-name>"
826ba597c5SAnurag S. Maskey #define	SHELP_SET	"set <prop-name>=<value1>[,<value2>...]"
836ba597c5SAnurag S. Maskey #define	SHELP_VERIFY	"verify"
846ba597c5SAnurag S. Maskey #define	SHELP_WALK	"walkprop [-a]"
856ba597c5SAnurag S. Maskey 
866ba597c5SAnurag S. Maskey /*
876ba597c5SAnurag S. Maskey  * Scope Definitions:
886ba597c5SAnurag S. Maskey  * Locations, ENMs, NCPs and Known WLANs are one scope level below global (GBL).
896ba597c5SAnurag S. Maskey  * NCUs are one more level beneath the NCP scope.
906ba597c5SAnurag S. Maskey  * Because the commands in Locations/ENM/Known WLAN and NCP level are different,
916ba597c5SAnurag S. Maskey  * the scope are divided accordingly.
926ba597c5SAnurag S. Maskey  *     GBL->LOC, GBL->ENM, GBL->WLAN or GBL->NCP->NCU
936ba597c5SAnurag S. Maskey  */
946ba597c5SAnurag S. Maskey #define	NWAM_SCOPE_GBL	0
956ba597c5SAnurag S. Maskey #define	NWAM_SCOPE_LOC	1
966ba597c5SAnurag S. Maskey #define	NWAM_SCOPE_ENM	2
976ba597c5SAnurag S. Maskey #define	NWAM_SCOPE_WLAN	3
986ba597c5SAnurag S. Maskey #define	NWAM_SCOPE_NCP	4
996ba597c5SAnurag S. Maskey #define	NWAM_SCOPE_NCU	5
1006ba597c5SAnurag S. Maskey 
1016ba597c5SAnurag S. Maskey /* delimiter used for list of values */
1026ba597c5SAnurag S. Maskey #define	NWAM_VALUE_DELIMITER_CHAR	','
1036ba597c5SAnurag S. Maskey #define	NWAM_VALUE_DELIMITER_STR	","
1046ba597c5SAnurag S. Maskey 
1056ba597c5SAnurag S. Maskey /* the max number of values for an enum used by some properties in libnwam */
1066ba597c5SAnurag S. Maskey 
1076ba597c5SAnurag S. Maskey /*
1086ba597c5SAnurag S. Maskey  * All arrays/tables are null-terminated, rather than defining the length of
1096ba597c5SAnurag S. Maskey  * the array.  When looping, check for NULL rather than using the size.
1106ba597c5SAnurag S. Maskey  */
1116ba597c5SAnurag S. Maskey 
1126ba597c5SAnurag S. Maskey static struct help helptab[] = {
1136ba597c5SAnurag S. Maskey 	{ CMD_CANCEL,	"cancel",	SHELP_CANCEL	},
1146ba597c5SAnurag S. Maskey 	{ CMD_CLEAR,	"clear",	SHELP_CLEAR	},
1156ba597c5SAnurag S. Maskey 	{ CMD_COMMIT,	"commit",	SHELP_COMMIT	},
1166ba597c5SAnurag S. Maskey 	{ CMD_CREATE,	"create",	SHELP_CREATE	},
1176ba597c5SAnurag S. Maskey 	{ CMD_DESTROY,	"destroy",	SHELP_DESTROY	},
1186ba597c5SAnurag S. Maskey 	{ CMD_END,	"end",		SHELP_END	},
1196ba597c5SAnurag S. Maskey 	{ CMD_EXIT,	"exit",		SHELP_EXIT	},
1206ba597c5SAnurag S. Maskey 	{ CMD_EXPORT,	"export",	SHELP_EXPORT	},
1216ba597c5SAnurag S. Maskey 	{ CMD_GET,	"get",		SHELP_GET	},
1226ba597c5SAnurag S. Maskey 	{ CMD_HELP,	"help",		SHELP_HELP	},
1236ba597c5SAnurag S. Maskey 	{ CMD_LIST,	"list",		SHELP_LIST	},
1246ba597c5SAnurag S. Maskey 	{ CMD_REVERT,	"revert",	SHELP_REVERT	},
1256ba597c5SAnurag S. Maskey 	{ CMD_SELECT,	"select",	SHELP_SELECT	},
1266ba597c5SAnurag S. Maskey 	{ CMD_SET,	"set",		SHELP_SET	},
1276ba597c5SAnurag S. Maskey 	{ CMD_VERIFY,	"verify",	SHELP_VERIFY	},
1286ba597c5SAnurag S. Maskey 	{ CMD_WALKPROP,	"walkprop",	SHELP_WALK	},
1296ba597c5SAnurag S. Maskey 	{ 0, NULL, NULL }
1306ba597c5SAnurag S. Maskey };
1316ba597c5SAnurag S. Maskey 
1326ba597c5SAnurag S. Maskey /* These *must* match the order of the RT1_ define's from nwamcfg.h */
1336ba597c5SAnurag S. Maskey static char *res1_types[] = {
1346ba597c5SAnurag S. Maskey 	"unknown",
1356ba597c5SAnurag S. Maskey 	"loc",
1366ba597c5SAnurag S. Maskey 	"ncp",
1376ba597c5SAnurag S. Maskey 	"enm",
1386ba597c5SAnurag S. Maskey 	"wlan",
1396ba597c5SAnurag S. Maskey 	NULL
1406ba597c5SAnurag S. Maskey };
1416ba597c5SAnurag S. Maskey 
1426ba597c5SAnurag S. Maskey /* These *must* match the order of the RT2_ define's from nwamcfg.h */
1436ba597c5SAnurag S. Maskey static char *res2_types[] = {
1446ba597c5SAnurag S. Maskey 	"unknown",
1456ba597c5SAnurag S. Maskey 	"ncu",
1466ba597c5SAnurag S. Maskey 	NULL
1476ba597c5SAnurag S. Maskey };
1486ba597c5SAnurag S. Maskey 
1496ba597c5SAnurag S. Maskey /*
1506ba597c5SAnurag S. Maskey  * No array for NCU_CLASS_.  The #define's in nwamcfg.h matches the
1516ba597c5SAnurag S. Maskey  * enum nwam_ncu_class_t in libnwam and thus uses libnwam functions to
1526ba597c5SAnurag S. Maskey  * retrieve the string representation.
1536ba597c5SAnurag S. Maskey  */
1546ba597c5SAnurag S. Maskey 
1556ba597c5SAnurag S. Maskey /* These *MUST* match the order of the PT_ define's from nwamcfg.h */
1566ba597c5SAnurag S. Maskey static char *pt_types[] = {
1576ba597c5SAnurag S. Maskey 	"unknown",
1586ba597c5SAnurag S. Maskey 	NWAM_NCU_PROP_ACTIVATION_MODE,
1596ba597c5SAnurag S. Maskey 	NWAM_NCU_PROP_ENABLED,
1606ba597c5SAnurag S. Maskey 	NWAM_NCU_PROP_TYPE,
1616ba597c5SAnurag S. Maskey 	NWAM_NCU_PROP_CLASS,
1626ba597c5SAnurag S. Maskey 	NWAM_NCU_PROP_PARENT_NCP,
1636ba597c5SAnurag S. Maskey 	NWAM_NCU_PROP_PRIORITY_GROUP,
1646ba597c5SAnurag S. Maskey 	NWAM_NCU_PROP_PRIORITY_MODE,
1656ba597c5SAnurag S. Maskey 	NWAM_NCU_PROP_LINK_MAC_ADDR,
1666ba597c5SAnurag S. Maskey 	NWAM_NCU_PROP_LINK_AUTOPUSH,
1676ba597c5SAnurag S. Maskey 	NWAM_NCU_PROP_LINK_MTU,
1686ba597c5SAnurag S. Maskey 	NWAM_NCU_PROP_IP_VERSION,
1696ba597c5SAnurag S. Maskey 	NWAM_NCU_PROP_IPV4_ADDRSRC,
1706ba597c5SAnurag S. Maskey 	NWAM_NCU_PROP_IPV4_ADDR,
1716ba597c5SAnurag S. Maskey 	NWAM_NCU_PROP_IPV4_DEFAULT_ROUTE,
1726ba597c5SAnurag S. Maskey 	NWAM_NCU_PROP_IPV6_ADDRSRC,
1736ba597c5SAnurag S. Maskey 	NWAM_NCU_PROP_IPV6_ADDR,
1746ba597c5SAnurag S. Maskey 	NWAM_NCU_PROP_IPV6_DEFAULT_ROUTE,
1756ba597c5SAnurag S. Maskey 	NWAM_LOC_PROP_CONDITIONS,
1766ba597c5SAnurag S. Maskey 	NWAM_ENM_PROP_FMRI,
1776ba597c5SAnurag S. Maskey 	NWAM_ENM_PROP_START,
1786ba597c5SAnurag S. Maskey 	NWAM_ENM_PROP_STOP,
1796ba597c5SAnurag S. Maskey 	NWAM_LOC_PROP_NAMESERVICES,
1806ba597c5SAnurag S. Maskey 	NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE,
1816ba597c5SAnurag S. Maskey 	NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC,
1826ba597c5SAnurag S. Maskey 	NWAM_LOC_PROP_DNS_NAMESERVICE_DOMAIN,
1836ba597c5SAnurag S. Maskey 	NWAM_LOC_PROP_DNS_NAMESERVICE_SERVERS,
1846ba597c5SAnurag S. Maskey 	NWAM_LOC_PROP_DNS_NAMESERVICE_SEARCH,
1856ba597c5SAnurag S. Maskey 	NWAM_LOC_PROP_NIS_NAMESERVICE_CONFIGSRC,
1866ba597c5SAnurag S. Maskey 	NWAM_LOC_PROP_NIS_NAMESERVICE_SERVERS,
1876ba597c5SAnurag S. Maskey 	NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC,
1886ba597c5SAnurag S. Maskey 	NWAM_LOC_PROP_LDAP_NAMESERVICE_SERVERS,
1896ba597c5SAnurag S. Maskey 	NWAM_LOC_PROP_DEFAULT_DOMAIN,
1906ba597c5SAnurag S. Maskey 	NWAM_LOC_PROP_NFSV4_DOMAIN,
1916ba597c5SAnurag S. Maskey 	NWAM_LOC_PROP_IPFILTER_CONFIG_FILE,
1926ba597c5SAnurag S. Maskey 	NWAM_LOC_PROP_IPFILTER_V6_CONFIG_FILE,
1936ba597c5SAnurag S. Maskey 	NWAM_LOC_PROP_IPNAT_CONFIG_FILE,
1946ba597c5SAnurag S. Maskey 	NWAM_LOC_PROP_IPPOOL_CONFIG_FILE,
1956ba597c5SAnurag S. Maskey 	NWAM_LOC_PROP_IKE_CONFIG_FILE,
1966ba597c5SAnurag S. Maskey 	NWAM_LOC_PROP_IPSECPOLICY_CONFIG_FILE,
1976ba597c5SAnurag S. Maskey 	NWAM_KNOWN_WLAN_PROP_BSSIDS,
1986ba597c5SAnurag S. Maskey 	NWAM_KNOWN_WLAN_PROP_PRIORITY,
1996ba597c5SAnurag S. Maskey 	NWAM_KNOWN_WLAN_PROP_KEYNAME,
2006ba597c5SAnurag S. Maskey 	NWAM_KNOWN_WLAN_PROP_KEYSLOT,
2016ba597c5SAnurag S. Maskey 	NWAM_KNOWN_WLAN_PROP_SECURITY_MODE
2026ba597c5SAnurag S. Maskey };
2036ba597c5SAnurag S. Maskey 
2046ba597c5SAnurag S. Maskey /* properties table: maps PT_* constants to property names */
2056ba597c5SAnurag S. Maskey typedef struct prop_table_entry {
2066ba597c5SAnurag S. Maskey 	int			pte_type;
2076ba597c5SAnurag S. Maskey 	const char		*pte_name;
2086ba597c5SAnurag S. Maskey } prop_table_entry_t;
2096ba597c5SAnurag S. Maskey 
2106ba597c5SAnurag S. Maskey /* NCU properties table */
2116ba597c5SAnurag S. Maskey static prop_table_entry_t ncu_prop_table[] = {
2126ba597c5SAnurag S. Maskey 	{ PT_TYPE, 			NWAM_NCU_PROP_TYPE },
2136ba597c5SAnurag S. Maskey 	{ PT_CLASS, 			NWAM_NCU_PROP_CLASS },
2146ba597c5SAnurag S. Maskey 	{ PT_PARENT, 			NWAM_NCU_PROP_PARENT_NCP },
2156ba597c5SAnurag S. Maskey 	{ PT_ACTIVATION_MODE,		NWAM_NCU_PROP_ACTIVATION_MODE },
2166ba597c5SAnurag S. Maskey 	{ PT_ENABLED, 			NWAM_NCU_PROP_ENABLED },
2176ba597c5SAnurag S. Maskey 	{ PT_PRIORITY_GROUP, 		NWAM_NCU_PROP_PRIORITY_GROUP },
2186ba597c5SAnurag S. Maskey 	{ PT_PRIORITY_MODE,		NWAM_NCU_PROP_PRIORITY_MODE },
2196ba597c5SAnurag S. Maskey 	{ PT_LINK_MACADDR, 		NWAM_NCU_PROP_LINK_MAC_ADDR },
2206ba597c5SAnurag S. Maskey 	{ PT_LINK_AUTOPUSH, 		NWAM_NCU_PROP_LINK_AUTOPUSH },
2216ba597c5SAnurag S. Maskey 	{ PT_LINK_MTU, 			NWAM_NCU_PROP_LINK_MTU },
2226ba597c5SAnurag S. Maskey 	{ PT_IP_VERSION, 		NWAM_NCU_PROP_IP_VERSION },
2236ba597c5SAnurag S. Maskey 	{ PT_IPV4_ADDRSRC, 		NWAM_NCU_PROP_IPV4_ADDRSRC },
2246ba597c5SAnurag S. Maskey 	{ PT_IPV4_ADDR, 		NWAM_NCU_PROP_IPV4_ADDR },
2256ba597c5SAnurag S. Maskey 	{ PT_IPV4_DEFAULT_ROUTE,	NWAM_NCU_PROP_IPV4_DEFAULT_ROUTE },
2266ba597c5SAnurag S. Maskey 	{ PT_IPV6_ADDRSRC, 		NWAM_NCU_PROP_IPV6_ADDRSRC },
2276ba597c5SAnurag S. Maskey 	{ PT_IPV6_ADDR, 		NWAM_NCU_PROP_IPV6_ADDR },
2286ba597c5SAnurag S. Maskey 	{ PT_IPV6_DEFAULT_ROUTE,	NWAM_NCU_PROP_IPV6_DEFAULT_ROUTE },
2296ba597c5SAnurag S. Maskey 	{ 0, NULL }
2306ba597c5SAnurag S. Maskey };
2316ba597c5SAnurag S. Maskey 
2326ba597c5SAnurag S. Maskey /* ENM properties table */
2336ba597c5SAnurag S. Maskey static prop_table_entry_t enm_prop_table[] = {
2346ba597c5SAnurag S. Maskey 	{ PT_ENM_FMRI, 		NWAM_ENM_PROP_FMRI },
2356ba597c5SAnurag S. Maskey 	{ PT_ENM_START, 	NWAM_ENM_PROP_START },
2366ba597c5SAnurag S. Maskey 	{ PT_ENM_STOP, 		NWAM_ENM_PROP_STOP },
2376ba597c5SAnurag S. Maskey 	{ PT_ACTIVATION_MODE, 	NWAM_ENM_PROP_ACTIVATION_MODE },
2386ba597c5SAnurag S. Maskey 	{ PT_CONDITIONS, 	NWAM_ENM_PROP_CONDITIONS },
2396ba597c5SAnurag S. Maskey 	{ PT_ENABLED, 		NWAM_ENM_PROP_ENABLED },
2406ba597c5SAnurag S. Maskey 	{ 0, NULL }
2416ba597c5SAnurag S. Maskey };
2426ba597c5SAnurag S. Maskey 
2436ba597c5SAnurag S. Maskey /* LOCation properties table */
2446ba597c5SAnurag S. Maskey static prop_table_entry_t loc_prop_table[] = {
2456ba597c5SAnurag S. Maskey 	{ PT_ACTIVATION_MODE, 	NWAM_LOC_PROP_ACTIVATION_MODE },
2466ba597c5SAnurag S. Maskey 	{ PT_CONDITIONS, 	NWAM_LOC_PROP_CONDITIONS },
2476ba597c5SAnurag S. Maskey 	{ PT_ENABLED, 		NWAM_LOC_PROP_ENABLED },
2486ba597c5SAnurag S. Maskey 	{ PT_LOC_NAMESERVICES, 	NWAM_LOC_PROP_NAMESERVICES },
2496ba597c5SAnurag S. Maskey 	{ PT_LOC_NAMESERVICES_CONFIG, NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE },
2506ba597c5SAnurag S. Maskey 	{ PT_LOC_DNS_CONFIGSRC, NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC },
2516ba597c5SAnurag S. Maskey 	{ PT_LOC_DNS_DOMAIN, 	NWAM_LOC_PROP_DNS_NAMESERVICE_DOMAIN },
2526ba597c5SAnurag S. Maskey 	{ PT_LOC_DNS_SERVERS, 	NWAM_LOC_PROP_DNS_NAMESERVICE_SERVERS },
2536ba597c5SAnurag S. Maskey 	{ PT_LOC_DNS_SEARCH, 	NWAM_LOC_PROP_DNS_NAMESERVICE_SEARCH },
2546ba597c5SAnurag S. Maskey 	{ PT_LOC_NIS_CONFIGSRC, NWAM_LOC_PROP_NIS_NAMESERVICE_CONFIGSRC },
2556ba597c5SAnurag S. Maskey 	{ PT_LOC_NIS_SERVERS, 	NWAM_LOC_PROP_NIS_NAMESERVICE_SERVERS },
2566ba597c5SAnurag S. Maskey 	{ PT_LOC_LDAP_CONFIGSRC, NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC },
2576ba597c5SAnurag S. Maskey 	{ PT_LOC_LDAP_SERVERS,	NWAM_LOC_PROP_LDAP_NAMESERVICE_SERVERS },
2586ba597c5SAnurag S. Maskey 	{ PT_LOC_DEFAULT_DOMAIN, NWAM_LOC_PROP_DEFAULT_DOMAIN },
2596ba597c5SAnurag S. Maskey 	{ PT_LOC_NFSV4_DOMAIN, 	NWAM_LOC_PROP_NFSV4_DOMAIN },
2606ba597c5SAnurag S. Maskey 	{ PT_LOC_IPF_CONFIG, 	NWAM_LOC_PROP_IPFILTER_CONFIG_FILE },
2616ba597c5SAnurag S. Maskey 	{ PT_LOC_IPF_V6_CONFIG, NWAM_LOC_PROP_IPFILTER_V6_CONFIG_FILE },
2626ba597c5SAnurag S. Maskey 	{ PT_LOC_IPNAT_CONFIG, 	NWAM_LOC_PROP_IPNAT_CONFIG_FILE },
2636ba597c5SAnurag S. Maskey 	{ PT_LOC_IPPOOL_CONFIG, NWAM_LOC_PROP_IPPOOL_CONFIG_FILE },
2646ba597c5SAnurag S. Maskey 	{ PT_LOC_IKE_CONFIG, 	NWAM_LOC_PROP_IKE_CONFIG_FILE },
2656ba597c5SAnurag S. Maskey 	{ PT_LOC_IPSECPOL_CONFIG, NWAM_LOC_PROP_IPSECPOLICY_CONFIG_FILE },
2666ba597c5SAnurag S. Maskey 	{ 0, NULL }
2676ba597c5SAnurag S. Maskey };
2686ba597c5SAnurag S. Maskey 
2696ba597c5SAnurag S. Maskey /* Known WLAN properties table */
2706ba597c5SAnurag S. Maskey static prop_table_entry_t wlan_prop_table[] = {
2716ba597c5SAnurag S. Maskey 	{ PT_WLAN_BSSIDS, 	NWAM_KNOWN_WLAN_PROP_BSSIDS },
2726ba597c5SAnurag S. Maskey 	{ PT_WLAN_PRIORITY, 	NWAM_KNOWN_WLAN_PROP_PRIORITY },
2736ba597c5SAnurag S. Maskey 	{ PT_WLAN_KEYNAME, 	NWAM_KNOWN_WLAN_PROP_KEYNAME },
2746ba597c5SAnurag S. Maskey 	{ PT_WLAN_KEYSLOT, 	NWAM_KNOWN_WLAN_PROP_KEYSLOT },
2756ba597c5SAnurag S. Maskey 	{ PT_WLAN_SECURITY_MODE, NWAM_KNOWN_WLAN_PROP_SECURITY_MODE },
2766ba597c5SAnurag S. Maskey 	{ 0, NULL }
2776ba597c5SAnurag S. Maskey };
2786ba597c5SAnurag S. Maskey 
2796ba597c5SAnurag S. Maskey /* Returns the appropriate properties table for the given object type */
2806ba597c5SAnurag S. Maskey static prop_table_entry_t *
2816ba597c5SAnurag S. Maskey get_prop_table(nwam_object_type_t object_type)
2826ba597c5SAnurag S. Maskey {
2836ba597c5SAnurag S. Maskey 	switch (object_type) {
2846ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_NCU:
2856ba597c5SAnurag S. Maskey 		return (ncu_prop_table);
2866ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_LOC:
2876ba597c5SAnurag S. Maskey 		return (loc_prop_table);
2886ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_ENM:
2896ba597c5SAnurag S. Maskey 		return (enm_prop_table);
2906ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_KNOWN_WLAN:
2916ba597c5SAnurag S. Maskey 		return (wlan_prop_table);
2926ba597c5SAnurag S. Maskey 	}
2936ba597c5SAnurag S. Maskey 	return (NULL);
2946ba597c5SAnurag S. Maskey }
2956ba597c5SAnurag S. Maskey 
2966ba597c5SAnurag S. Maskey /* Global variables */
2976ba597c5SAnurag S. Maskey 
2986ba597c5SAnurag S. Maskey /* set early in main(), never modified thereafter, used all over the place */
2996ba597c5SAnurag S. Maskey static char *execname;
3006ba597c5SAnurag S. Maskey 
3016ba597c5SAnurag S. Maskey /* set in modifying functions, checked in read_input() */
3026ba597c5SAnurag S. Maskey boolean_t saw_error = B_FALSE;
3036ba597c5SAnurag S. Maskey 
3046ba597c5SAnurag S. Maskey /* set in yacc parser, checked in read_input() */
3056ba597c5SAnurag S. Maskey boolean_t newline_terminated;
3066ba597c5SAnurag S. Maskey 
3076ba597c5SAnurag S. Maskey /* set in main(), checked in lex error handler */
3086ba597c5SAnurag S. Maskey boolean_t cmd_file_mode = B_FALSE;
3096ba597c5SAnurag S. Maskey 
3106ba597c5SAnurag S. Maskey /* set in exit_func(), checked in read_input() */
3116ba597c5SAnurag S. Maskey static boolean_t time_to_exit = B_FALSE;
3126ba597c5SAnurag S. Maskey 
3136ba597c5SAnurag S. Maskey /* used in nerr() and nwamerr() */
3146ba597c5SAnurag S. Maskey static char *cmd_file_name = NULL;
3156ba597c5SAnurag S. Maskey 
3166ba597c5SAnurag S. Maskey /* used with cmd_file to destroy all configurations */
3176ba597c5SAnurag S. Maskey static boolean_t remove_all_configurations = B_FALSE;
3186ba597c5SAnurag S. Maskey 
3196ba597c5SAnurag S. Maskey /* checked in read_input() and other places */
3206ba597c5SAnurag S. Maskey static boolean_t ok_to_prompt = B_FALSE;
3216ba597c5SAnurag S. Maskey 
3226ba597c5SAnurag S. Maskey /* initialized in do_interactive(), checked in initialize() */
3236ba597c5SAnurag S. Maskey static boolean_t interactive_mode;
3246ba597c5SAnurag S. Maskey 
3256ba597c5SAnurag S. Maskey static boolean_t need_to_commit = B_FALSE;
3266ba597c5SAnurag S. Maskey 
3276ba597c5SAnurag S. Maskey /* The gl_get_line() resource object */
3286ba597c5SAnurag S. Maskey static GetLine *gl;
3296ba597c5SAnurag S. Maskey 
3306ba597c5SAnurag S. Maskey /* set when create or read objects, used by other func */
3316ba597c5SAnurag S. Maskey static nwam_loc_handle_t loc_h = NULL;
3326ba597c5SAnurag S. Maskey static nwam_enm_handle_t enm_h = NULL;
3336ba597c5SAnurag S. Maskey static nwam_known_wlan_handle_t wlan_h = NULL;
3346ba597c5SAnurag S. Maskey static nwam_ncu_handle_t ncu_h = NULL;
3356ba597c5SAnurag S. Maskey static nwam_ncp_handle_t ncp_h = NULL;
3366ba597c5SAnurag S. Maskey 
3376ba597c5SAnurag S. Maskey static int current_scope = NWAM_SCOPE_GBL;
3386ba597c5SAnurag S. Maskey 
3396ba597c5SAnurag S. Maskey /* obj1_* are used in NWAM_SCOPE_{NCP,LOC,ENM,WLAN} */
3406ba597c5SAnurag S. Maskey static int obj1_type;
3416ba597c5SAnurag S. Maskey static char obj1_name[NWAM_MAX_NAME_LEN + 1];
3426ba597c5SAnurag S. Maskey 
3436ba597c5SAnurag S. Maskey /* obj2_* are used in NWAM_SCOPE_NCU only */
3446ba597c5SAnurag S. Maskey static int obj2_type;
3456ba597c5SAnurag S. Maskey static char obj2_name[NWAM_MAX_NAME_LEN + 1];
3466ba597c5SAnurag S. Maskey 
3476ba597c5SAnurag S. Maskey /* arrays for tab-completion */
3486ba597c5SAnurag S. Maskey /* commands at NWAM_SCOPE_GBL */
3496ba597c5SAnurag S. Maskey static const char *global_scope_cmds[] = {
3506ba597c5SAnurag S. Maskey 	"create ",
3516ba597c5SAnurag S. Maskey 	"destroy ",
3526ba597c5SAnurag S. Maskey 	"end ",
3536ba597c5SAnurag S. Maskey 	"exit ",
3546ba597c5SAnurag S. Maskey 	"export ",
3556ba597c5SAnurag S. Maskey 	"help ",
3566ba597c5SAnurag S. Maskey 	"list ",
3576ba597c5SAnurag S. Maskey 	"select ",
3586ba597c5SAnurag S. Maskey 	NULL
3596ba597c5SAnurag S. Maskey };
3606ba597c5SAnurag S. Maskey 
3616ba597c5SAnurag S. Maskey static const char *global_create_cmds[] = {
3626ba597c5SAnurag S. Maskey 	"create loc ",
3636ba597c5SAnurag S. Maskey 	"create enm ",
3646ba597c5SAnurag S. Maskey 	"create ncp ",
3656ba597c5SAnurag S. Maskey 	"create wlan ",
3666ba597c5SAnurag S. Maskey 	"create -t ",		/* template */
3676ba597c5SAnurag S. Maskey 	NULL
3686ba597c5SAnurag S. Maskey };
3696ba597c5SAnurag S. Maskey 
3706ba597c5SAnurag S. Maskey static const char *global_destroy_cmds[] = {
3716ba597c5SAnurag S. Maskey 	"destroy -a ",
3726ba597c5SAnurag S. Maskey 	"destroy loc ",
3736ba597c5SAnurag S. Maskey 	"destroy enm ",
3746ba597c5SAnurag S. Maskey 	"destroy ncp ",
3756ba597c5SAnurag S. Maskey 	"destroy wlan ",
3766ba597c5SAnurag S. Maskey 	NULL
3776ba597c5SAnurag S. Maskey };
3786ba597c5SAnurag S. Maskey 
3796ba597c5SAnurag S. Maskey static const char *global_export_cmds[] = {
3806ba597c5SAnurag S. Maskey 	"export ",
3816ba597c5SAnurag S. Maskey 	"export -d ",		/* add destroy -a */
3826ba597c5SAnurag S. Maskey 	"export -f ",		/* to file */
3836ba597c5SAnurag S. Maskey 	"export -d -f ",	/* add destroy -a to file */
3846ba597c5SAnurag S. Maskey 	"export loc ",
3856ba597c5SAnurag S. Maskey 	"export enm ",
3866ba597c5SAnurag S. Maskey 	"export ncp ",
3876ba597c5SAnurag S. Maskey 	"export wlan ",
3886ba597c5SAnurag S. Maskey 	NULL
3896ba597c5SAnurag S. Maskey };
3906ba597c5SAnurag S. Maskey 
3916ba597c5SAnurag S. Maskey static const char *global_list_cmds[] = {
3926ba597c5SAnurag S. Maskey 	"list ",
3936ba597c5SAnurag S. Maskey 	"list loc ",
3946ba597c5SAnurag S. Maskey 	"list enm ",
3956ba597c5SAnurag S. Maskey 	"list ncp ",
3966ba597c5SAnurag S. Maskey 	"list wlan ",
3976ba597c5SAnurag S. Maskey 	"list -a loc ",
3986ba597c5SAnurag S. Maskey 	"list -a enm ",
3996ba597c5SAnurag S. Maskey 	"list -a wlan ",
4006ba597c5SAnurag S. Maskey 	NULL
4016ba597c5SAnurag S. Maskey };
4026ba597c5SAnurag S. Maskey 
4036ba597c5SAnurag S. Maskey static const char *global_select_cmds[] = {
4046ba597c5SAnurag S. Maskey 	"select loc ",
4056ba597c5SAnurag S. Maskey 	"select enm ",
4066ba597c5SAnurag S. Maskey 	"select ncp ",
4076ba597c5SAnurag S. Maskey 	"select wlan ",
4086ba597c5SAnurag S. Maskey 	NULL
4096ba597c5SAnurag S. Maskey };
4106ba597c5SAnurag S. Maskey 
4116ba597c5SAnurag S. Maskey /* commands at NWAM_SCOPE_LOC, _ENM, _WLAN and _NCU */
4126ba597c5SAnurag S. Maskey static const char *non_ncp_scope_cmds[] = {
4136ba597c5SAnurag S. Maskey 	"cancel ",
4146ba597c5SAnurag S. Maskey 	"clear ",
4156ba597c5SAnurag S. Maskey 	"commit ",
4166ba597c5SAnurag S. Maskey 	"end ",
4176ba597c5SAnurag S. Maskey 	"exit ",
4186ba597c5SAnurag S. Maskey 	"export ",
4196ba597c5SAnurag S. Maskey 	"export -f ",
4206ba597c5SAnurag S. Maskey 	"get ",
4216ba597c5SAnurag S. Maskey 	"get -V ",	/* value only */
4226ba597c5SAnurag S. Maskey 	"help ",
4236ba597c5SAnurag S. Maskey 	"list ",
4246ba597c5SAnurag S. Maskey 	"list -a ",	/* all properties */
4256ba597c5SAnurag S. Maskey 	"revert ",
4266ba597c5SAnurag S. Maskey 	"set ",
4276ba597c5SAnurag S. Maskey 	"verify ",
4286ba597c5SAnurag S. Maskey 	"walkprop ",
4296ba597c5SAnurag S. Maskey 	"walkprop -a ",	/* all properties */
4306ba597c5SAnurag S. Maskey 	NULL
4316ba597c5SAnurag S. Maskey };
4326ba597c5SAnurag S. Maskey 
4336ba597c5SAnurag S. Maskey /* commands at NWAM_SCOPE_NCP */
4346ba597c5SAnurag S. Maskey static const char *ncp_scope_cmds[] = {
4356ba597c5SAnurag S. Maskey 	"cancel ",
4366ba597c5SAnurag S. Maskey 	"create ",
4376ba597c5SAnurag S. Maskey 	"destroy ",
4386ba597c5SAnurag S. Maskey 	"end ",
4396ba597c5SAnurag S. Maskey 	"exit ",
4406ba597c5SAnurag S. Maskey 	"export ",
4416ba597c5SAnurag S. Maskey 	"help ",
4426ba597c5SAnurag S. Maskey 	"list ",
4436ba597c5SAnurag S. Maskey 	"select ",
4446ba597c5SAnurag S. Maskey 	NULL
4456ba597c5SAnurag S. Maskey };
4466ba597c5SAnurag S. Maskey 
4476ba597c5SAnurag S. Maskey static const char *ncp_create_cmds[] = {
4486ba597c5SAnurag S. Maskey 	"create ncu ip ",
4496ba597c5SAnurag S. Maskey 	"create ncu phys ",
4506ba597c5SAnurag S. Maskey 	"create -t ",		/* template */
4516ba597c5SAnurag S. Maskey 	NULL
4526ba597c5SAnurag S. Maskey };
4536ba597c5SAnurag S. Maskey 
4546ba597c5SAnurag S. Maskey static const char *ncp_destroy_cmds[] = {
4556ba597c5SAnurag S. Maskey 	"destroy ncu ",
4566ba597c5SAnurag S. Maskey 	"destroy ncu ip ",
4576ba597c5SAnurag S. Maskey 	"destroy ncu phys ",
4586ba597c5SAnurag S. Maskey 	NULL
4596ba597c5SAnurag S. Maskey };
4606ba597c5SAnurag S. Maskey 
4616ba597c5SAnurag S. Maskey static const char *ncp_export_cmds[] = {
4626ba597c5SAnurag S. Maskey 	"export ",
4636ba597c5SAnurag S. Maskey 	"export -f ",		/* to file */
4646ba597c5SAnurag S. Maskey 	"export ncu ",
4656ba597c5SAnurag S. Maskey 	"export ncu ip ",
4666ba597c5SAnurag S. Maskey 	"export ncu phys ",
4676ba597c5SAnurag S. Maskey 	NULL
4686ba597c5SAnurag S. Maskey };
4696ba597c5SAnurag S. Maskey 
4706ba597c5SAnurag S. Maskey static const char *ncp_list_cmds[] = {
4716ba597c5SAnurag S. Maskey 	"list ",
4726ba597c5SAnurag S. Maskey 	"list ncu ",
4736ba597c5SAnurag S. Maskey 	"list ncu ip ",
4746ba597c5SAnurag S. Maskey 	"list ncu phys ",
4756ba597c5SAnurag S. Maskey 	"list -a ncu ",
4766ba597c5SAnurag S. Maskey 	"list -a ncu ip ",
4776ba597c5SAnurag S. Maskey 	"list -a ncu phys ",
4786ba597c5SAnurag S. Maskey 	NULL
4796ba597c5SAnurag S. Maskey };
4806ba597c5SAnurag S. Maskey 
4816ba597c5SAnurag S. Maskey static const char *ncp_select_cmds[] = {
4826ba597c5SAnurag S. Maskey 	"select ncu ",
4836ba597c5SAnurag S. Maskey 	"select ncu ip ",
4846ba597c5SAnurag S. Maskey 	"select ncu phys ",
4856ba597c5SAnurag S. Maskey 	NULL
4866ba597c5SAnurag S. Maskey };
4876ba597c5SAnurag S. Maskey 
4886ba597c5SAnurag S. Maskey /* Functions begin here */
4896ba597c5SAnurag S. Maskey 
4906ba597c5SAnurag S. Maskey cmd_t *
4916ba597c5SAnurag S. Maskey alloc_cmd(void)
4926ba597c5SAnurag S. Maskey {
4936ba597c5SAnurag S. Maskey 	cmd_t *cmd = calloc(1, sizeof (cmd_t));
4946ba597c5SAnurag S. Maskey 	if (cmd == NULL) {
4956ba597c5SAnurag S. Maskey 		nerr("Out of memory");
4966ba597c5SAnurag S. Maskey 		return (NULL);
4976ba597c5SAnurag S. Maskey 	}
4986ba597c5SAnurag S. Maskey 	cmd->cmd_argc = 0;
4996ba597c5SAnurag S. Maskey 	cmd->cmd_argv[0] = NULL;
5006ba597c5SAnurag S. Maskey 
5016ba597c5SAnurag S. Maskey 	return (cmd);
5026ba597c5SAnurag S. Maskey }
5036ba597c5SAnurag S. Maskey 
5046ba597c5SAnurag S. Maskey void
5056ba597c5SAnurag S. Maskey free_cmd(cmd_t *cmd)
5066ba597c5SAnurag S. Maskey {
5076ba597c5SAnurag S. Maskey 	int i;
5086ba597c5SAnurag S. Maskey 
5096ba597c5SAnurag S. Maskey 	for (i = 0; i < cmd->cmd_argc; i++)
5106ba597c5SAnurag S. Maskey 		free(cmd->cmd_argv[i]);
5116ba597c5SAnurag S. Maskey 	free(cmd);
5126ba597c5SAnurag S. Maskey }
5136ba597c5SAnurag S. Maskey 
5146ba597c5SAnurag S. Maskey void
5156ba597c5SAnurag S. Maskey array_free(void **array, int nelem)
5166ba597c5SAnurag S. Maskey {
5176ba597c5SAnurag S. Maskey 	int i;
5186ba597c5SAnurag S. Maskey 	for (i = 0; i < nelem; i++)
5196ba597c5SAnurag S. Maskey 		free(array[i]);
5206ba597c5SAnurag S. Maskey 	free(array);
5216ba597c5SAnurag S. Maskey }
5226ba597c5SAnurag S. Maskey 
5236ba597c5SAnurag S. Maskey static boolean_t
5246ba597c5SAnurag S. Maskey initial_match(const char *line1, const char *line2, int word_end)
5256ba597c5SAnurag S. Maskey {
5266ba597c5SAnurag S. Maskey 	if (word_end <= 0)
5276ba597c5SAnurag S. Maskey 		return (B_TRUE);
5286ba597c5SAnurag S. Maskey 	return (strncmp(line1, line2, word_end) == 0);
5296ba597c5SAnurag S. Maskey }
5306ba597c5SAnurag S. Maskey 
5316ba597c5SAnurag S. Maskey static int
5326ba597c5SAnurag S. Maskey add_stuff(WordCompletion *cpl, const char *line1, const char **list,
5336ba597c5SAnurag S. Maskey     int word_end)
5346ba597c5SAnurag S. Maskey {
5356ba597c5SAnurag S. Maskey 	int i, err;
5366ba597c5SAnurag S. Maskey 
5376ba597c5SAnurag S. Maskey 	for (i = 0; list[i] != NULL; i++) {
5386ba597c5SAnurag S. Maskey 		if (initial_match(line1, list[i], word_end)) {
5396ba597c5SAnurag S. Maskey 			err = cpl_add_completion(cpl, line1, 0, word_end,
5406ba597c5SAnurag S. Maskey 			    list[i] + word_end, "", "");
5416ba597c5SAnurag S. Maskey 			if (err != 0)
5426ba597c5SAnurag S. Maskey 				return (err);
5436ba597c5SAnurag S. Maskey 		}
5446ba597c5SAnurag S. Maskey 	}
5456ba597c5SAnurag S. Maskey 	return (0);
5466ba597c5SAnurag S. Maskey }
5476ba597c5SAnurag S. Maskey 
5486ba597c5SAnurag S. Maskey /*
5496ba597c5SAnurag S. Maskey  * To fill in the rest of a string when user types the tab key.
5506ba597c5SAnurag S. Maskey  * First digital number is the length of the string, the second digital number
5516ba597c5SAnurag S. Maskey  * is the min number of chars that is needed to uniquely identify a string.
5526ba597c5SAnurag S. Maskey  */
5536ba597c5SAnurag S. Maskey #define	MINI_STR(l, s, m, n) strncmp(l, s, MAX(MIN(sizeof (s) - 1, m), n))
5546ba597c5SAnurag S. Maskey 
5556ba597c5SAnurag S. Maskey /* ARGSUSED */
5566ba597c5SAnurag S. Maskey static
5576ba597c5SAnurag S. Maskey CPL_MATCH_FN(cmd_cpl_fn)
5586ba597c5SAnurag S. Maskey {
5596ba597c5SAnurag S. Maskey 	/* tab-complete according to the current scope */
5606ba597c5SAnurag S. Maskey 	switch (current_scope) {
5616ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_GBL:
5626ba597c5SAnurag S. Maskey 		if (MINI_STR(line, "create ", word_end, 2) == 0)
5636ba597c5SAnurag S. Maskey 			return (add_stuff(cpl, line, global_create_cmds,
5646ba597c5SAnurag S. Maskey 			    word_end));
5656ba597c5SAnurag S. Maskey 		if (MINI_STR(line, "destroy ", word_end, 1) == 0)
5666ba597c5SAnurag S. Maskey 			return (add_stuff(cpl, line, global_destroy_cmds,
5676ba597c5SAnurag S. Maskey 			    word_end));
5686ba597c5SAnurag S. Maskey 		if (MINI_STR(line, "export ", word_end, 3) == 0)
5696ba597c5SAnurag S. Maskey 			return (add_stuff(cpl, line, global_export_cmds,
5706ba597c5SAnurag S. Maskey 			    word_end));
5716ba597c5SAnurag S. Maskey 		if (MINI_STR(line, "list ", word_end, 1) == 0)
5726ba597c5SAnurag S. Maskey 			return (add_stuff(cpl, line, global_list_cmds,
5736ba597c5SAnurag S. Maskey 			    word_end));
5746ba597c5SAnurag S. Maskey 		if (MINI_STR(line, "select ", word_end, 1) == 0)
5756ba597c5SAnurag S. Maskey 			return (add_stuff(cpl, line, global_select_cmds,
5766ba597c5SAnurag S. Maskey 			    word_end));
5776ba597c5SAnurag S. Maskey 		return (add_stuff(cpl, line, global_scope_cmds, word_end));
5786ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_LOC:
5796ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_ENM:
5806ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_WLAN:
5816ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_NCU:
5826ba597c5SAnurag S. Maskey 		return (add_stuff(cpl, line, non_ncp_scope_cmds, word_end));
5836ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_NCP:
5846ba597c5SAnurag S. Maskey 		if (MINI_STR(line, "create ", word_end, 2) == 0)
5856ba597c5SAnurag S. Maskey 			return (add_stuff(cpl, line, ncp_create_cmds,
5866ba597c5SAnurag S. Maskey 			    word_end));
5876ba597c5SAnurag S. Maskey 		if (MINI_STR(line, "destroy ", word_end, 1) == 0)
5886ba597c5SAnurag S. Maskey 			return (add_stuff(cpl, line, ncp_destroy_cmds,
5896ba597c5SAnurag S. Maskey 			    word_end));
5906ba597c5SAnurag S. Maskey 		if (MINI_STR(line, "export ", word_end, 3) == 0)
5916ba597c5SAnurag S. Maskey 			return (add_stuff(cpl, line, ncp_export_cmds,
5926ba597c5SAnurag S. Maskey 			    word_end));
5936ba597c5SAnurag S. Maskey 		if (MINI_STR(line, "list ", word_end, 1) == 0)
5946ba597c5SAnurag S. Maskey 			return (add_stuff(cpl, line, ncp_list_cmds, word_end));
5956ba597c5SAnurag S. Maskey 		if (MINI_STR(line, "select ", word_end, 1) == 0)
5966ba597c5SAnurag S. Maskey 			return (add_stuff(cpl, line, ncp_select_cmds,
5976ba597c5SAnurag S. Maskey 			    word_end));
5986ba597c5SAnurag S. Maskey 		return (add_stuff(cpl, line, ncp_scope_cmds, word_end));
5996ba597c5SAnurag S. Maskey 	}
6006ba597c5SAnurag S. Maskey 	/* should never get here */
6016ba597c5SAnurag S. Maskey 	return (NULL);
6026ba597c5SAnurag S. Maskey }
6036ba597c5SAnurag S. Maskey 
6046ba597c5SAnurag S. Maskey const char *
6056ba597c5SAnurag S. Maskey cmd_to_str(int cmd_num)
6066ba597c5SAnurag S. Maskey {
6076ba597c5SAnurag S. Maskey 	assert(cmd_num >= CMD_MIN && cmd_num <= CMD_MAX);
6086ba597c5SAnurag S. Maskey 	return (helptab[cmd_num].cmd_name);
6096ba597c5SAnurag S. Maskey }
6106ba597c5SAnurag S. Maskey 
6116ba597c5SAnurag S. Maskey /* Returns "loc", "enm", "wlan" or "ncp" as string */
6126ba597c5SAnurag S. Maskey static const char *
6136ba597c5SAnurag S. Maskey rt1_to_str(int res_type)
6146ba597c5SAnurag S. Maskey {
6156ba597c5SAnurag S. Maskey 	assert(res_type >= RT1_MIN && res_type <= RT1_MAX);
6166ba597c5SAnurag S. Maskey 	return (res1_types[res_type]);
6176ba597c5SAnurag S. Maskey }
6186ba597c5SAnurag S. Maskey 
6196ba597c5SAnurag S. Maskey /* Returns "ncu" as string */
6206ba597c5SAnurag S. Maskey static const char *
6216ba597c5SAnurag S. Maskey rt2_to_str(int res_type)
6226ba597c5SAnurag S. Maskey {
6236ba597c5SAnurag S. Maskey 	assert(res_type >= RT2_MIN && res_type <= RT2_MAX);
6246ba597c5SAnurag S. Maskey 	return (res2_types[res_type]);
6256ba597c5SAnurag S. Maskey }
6266ba597c5SAnurag S. Maskey 
6276ba597c5SAnurag S. Maskey /* Returns "ncp, "ncu", "loc", "enm", or "wlan" according to the scope */
6286ba597c5SAnurag S. Maskey static const char *
6296ba597c5SAnurag S. Maskey scope_to_str(int scope) {
6306ba597c5SAnurag S. Maskey 	switch (scope) {
6316ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_GBL:
6326ba597c5SAnurag S. Maskey 		return ("global");
6336ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_NCP:
6346ba597c5SAnurag S. Maskey 		return ("ncp");
6356ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_NCU:
6366ba597c5SAnurag S. Maskey 		return ("ncu");
6376ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_LOC:
6386ba597c5SAnurag S. Maskey 		return ("loc");
6396ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_ENM:
6406ba597c5SAnurag S. Maskey 		return ("enm");
6416ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_WLAN:
6426ba597c5SAnurag S. Maskey 		return ("wlan");
6436ba597c5SAnurag S. Maskey 	default:
6446ba597c5SAnurag S. Maskey 		return ("invalid");
6456ba597c5SAnurag S. Maskey 	}
6466ba597c5SAnurag S. Maskey }
6476ba597c5SAnurag S. Maskey 
6486ba597c5SAnurag S. Maskey /* Given an enm property and value, returns it as a string */
6496ba597c5SAnurag S. Maskey static const char *
6506ba597c5SAnurag S. Maskey propval_to_str(const char *propname, uint64_t value)
6516ba597c5SAnurag S. Maskey {
6526ba597c5SAnurag S. Maskey 	const char *str;
6536ba597c5SAnurag S. Maskey 
6546ba597c5SAnurag S. Maskey 	if (nwam_uint64_get_value_string(propname, value, &str) == NWAM_SUCCESS)
6556ba597c5SAnurag S. Maskey 		return (str);
6566ba597c5SAnurag S. Maskey 	return (NULL);
6576ba597c5SAnurag S. Maskey }
6586ba597c5SAnurag S. Maskey 
6596ba597c5SAnurag S. Maskey /* Given an int for a prop, returns it as string */
6606ba597c5SAnurag S. Maskey static const char *
6616ba597c5SAnurag S. Maskey pt_to_str(int prop_type)
6626ba597c5SAnurag S. Maskey {
6636ba597c5SAnurag S. Maskey 	assert(prop_type >= PT_MIN && prop_type <= PT_MAX);
6646ba597c5SAnurag S. Maskey 	return (pt_types[prop_type]);
6656ba597c5SAnurag S. Maskey }
6666ba597c5SAnurag S. Maskey 
6676ba597c5SAnurag S. Maskey /* Return B_TRUE if string starts with "t" or is 1, B_FALSE otherwise */
6686ba597c5SAnurag S. Maskey static boolean_t
6696ba597c5SAnurag S. Maskey str_to_boolean(const char *str)
6706ba597c5SAnurag S. Maskey {
6716ba597c5SAnurag S. Maskey 	if (strncasecmp(str, "t", 1) == 0 || atoi(str) == 1)
6726ba597c5SAnurag S. Maskey 		return (B_TRUE);
6736ba597c5SAnurag S. Maskey 	else
6746ba597c5SAnurag S. Maskey 		return (B_FALSE);
6756ba597c5SAnurag S. Maskey }
6766ba597c5SAnurag S. Maskey 
6776ba597c5SAnurag S. Maskey /*
6786ba597c5SAnurag S. Maskey  * This is a separate function rather than a set of define's because of the
6796ba597c5SAnurag S. Maskey  * gettext() wrapping.
6806ba597c5SAnurag S. Maskey  */
6816ba597c5SAnurag S. Maskey 
6826ba597c5SAnurag S. Maskey /*
6836ba597c5SAnurag S. Maskey  * TRANSLATION_NOTE
6846ba597c5SAnurag S. Maskey  * Each string below should have \t follow \n whenever needed; the
6856ba597c5SAnurag S. Maskey  * initial \t and the terminal \n will be provided by the calling function.
6866ba597c5SAnurag S. Maskey  */
6876ba597c5SAnurag S. Maskey 
6886ba597c5SAnurag S. Maskey static const char *
6896ba597c5SAnurag S. Maskey long_help(int cmd_num)
6906ba597c5SAnurag S. Maskey {
6916ba597c5SAnurag S. Maskey 	assert(cmd_num >= CMD_MIN && cmd_num <= CMD_MAX);
6926ba597c5SAnurag S. Maskey 	switch (cmd_num) {
6936ba597c5SAnurag S. Maskey 		case CMD_CANCEL:
6946ba597c5SAnurag S. Maskey 			return (gettext("Cancels the current configuration "
6956ba597c5SAnurag S. Maskey 			    "changes."));
6966ba597c5SAnurag S. Maskey 		case CMD_CLEAR:
6976ba597c5SAnurag S. Maskey 			return (gettext("Clears the value for the specified "
6986ba597c5SAnurag S. Maskey 			    "property."));
6996ba597c5SAnurag S. Maskey 		case CMD_COMMIT:
7006ba597c5SAnurag S. Maskey 			return (gettext("Commits the current configuration."));
7016ba597c5SAnurag S. Maskey 		case CMD_CREATE:
7026ba597c5SAnurag S. Maskey 			return (gettext("Creates a new profile or resource."));
7036ba597c5SAnurag S. Maskey 		case CMD_DESTROY:
7046ba597c5SAnurag S. Maskey 			return (gettext("Destroys the specified profile or "
7056ba597c5SAnurag S. Maskey 			    "resource."));
7066ba597c5SAnurag S. Maskey 		case CMD_END:
7076ba597c5SAnurag S. Maskey 			return (gettext("Ends specification of a resource."));
7086ba597c5SAnurag S. Maskey 		case CMD_EXIT:
7096ba597c5SAnurag S. Maskey 			return (gettext("Exits the program."));
7106ba597c5SAnurag S. Maskey 		case CMD_EXPORT:
7116ba597c5SAnurag S. Maskey 			return (gettext("Exports the configuration."));
7126ba597c5SAnurag S. Maskey 		case CMD_GET:
7136ba597c5SAnurag S. Maskey 			return (gettext("Gets the value of the specified "
7146ba597c5SAnurag S. Maskey 			    "property."));
7156ba597c5SAnurag S. Maskey 		case CMD_HELP:
7166ba597c5SAnurag S. Maskey 			return (gettext("Prints help message."));
7176ba597c5SAnurag S. Maskey 		case CMD_LIST:
7186ba597c5SAnurag S. Maskey 			return (gettext("Lists existing objects."));
7196ba597c5SAnurag S. Maskey 		case CMD_REVERT:
7206ba597c5SAnurag S. Maskey 			return (gettext("Reverts to the previous "
7216ba597c5SAnurag S. Maskey 			    "configuration."));
7226ba597c5SAnurag S. Maskey 		case CMD_SELECT:
7236ba597c5SAnurag S. Maskey 			return (gettext("Selects a resource to modify."));
7246ba597c5SAnurag S. Maskey 		case CMD_SET:
7256ba597c5SAnurag S. Maskey 			return (gettext("Sets the value of the specified "
7266ba597c5SAnurag S. Maskey 			    "property."));
7276ba597c5SAnurag S. Maskey 		case CMD_VERIFY:
7286ba597c5SAnurag S. Maskey 			return (gettext("Verifies an object."));
7296ba597c5SAnurag S. Maskey 		case CMD_WALKPROP:
7306ba597c5SAnurag S. Maskey 			return (gettext("Iterates over properties."));
7316ba597c5SAnurag S. Maskey 		default:
7326ba597c5SAnurag S. Maskey 			return (gettext("Unknown command."));
7336ba597c5SAnurag S. Maskey 	}
7346ba597c5SAnurag S. Maskey }
7356ba597c5SAnurag S. Maskey 
7366ba597c5SAnurag S. Maskey void
7376ba597c5SAnurag S. Maskey command_usage(int command)
7386ba597c5SAnurag S. Maskey {
7396ba597c5SAnurag S. Maskey 	if (command < CMD_MIN || command > CMD_MAX) {
7406ba597c5SAnurag S. Maskey 		nerr("Unknown command");
7416ba597c5SAnurag S. Maskey 	} else {
7426ba597c5SAnurag S. Maskey 		nerr("%s: %s: %s", gettext("Error"), gettext("usage"),
7436ba597c5SAnurag S. Maskey 		    helptab[command].cmd_usage);
7446ba597c5SAnurag S. Maskey 	}
7456ba597c5SAnurag S. Maskey }
7466ba597c5SAnurag S. Maskey 
7476ba597c5SAnurag S. Maskey static void
7486ba597c5SAnurag S. Maskey long_usage(uint_t cmd_num)
7496ba597c5SAnurag S. Maskey {
7506ba597c5SAnurag S. Maskey 	(void) printf("%s: %s\n", gettext("usage"),
7516ba597c5SAnurag S. Maskey 	    helptab[cmd_num].cmd_usage);
7526ba597c5SAnurag S. Maskey 	(void) printf("\t%s\n", long_help(cmd_num));
7536ba597c5SAnurag S. Maskey }
7546ba597c5SAnurag S. Maskey 
7556ba597c5SAnurag S. Maskey /* Prints usage for command line options */
7566ba597c5SAnurag S. Maskey static void
7576ba597c5SAnurag S. Maskey cmd_line_usage()
7586ba597c5SAnurag S. Maskey {
7596ba597c5SAnurag S. Maskey 	(void) printf("%s:\t%s\t\t\t\t(%s)\n", gettext("usage"), execname,
7606ba597c5SAnurag S. Maskey 	    gettext("interactive-mode"));
7616ba597c5SAnurag S. Maskey 	(void) printf("\t%s <%s> [%s...]\n", execname, gettext("command"),
7626ba597c5SAnurag S. Maskey 	    gettext("options"));
7636ba597c5SAnurag S. Maskey 	(void) printf("\t%s [-d] -f <%s>\n", execname, gettext("command-file"));
7646ba597c5SAnurag S. Maskey 	(void) printf("\t%s %s [<%s>]\n", execname, cmd_to_str(CMD_HELP),
7656ba597c5SAnurag S. Maskey 	    gettext("command"));
7666ba597c5SAnurag S. Maskey }
7676ba597c5SAnurag S. Maskey 
7686ba597c5SAnurag S. Maskey /* Prints the line number of the current command if in command-file mode */
7696ba597c5SAnurag S. Maskey static void
7706ba597c5SAnurag S. Maskey print_lineno()
7716ba597c5SAnurag S. Maskey {
7726ba597c5SAnurag S. Maskey 	static int last_lineno;
7736ba597c5SAnurag S. Maskey 
7746ba597c5SAnurag S. Maskey 	/* lex_lineno has already been incremented in the lexer; compensate */
7756ba597c5SAnurag S. Maskey 	if (cmd_file_mode && lex_lineno > last_lineno) {
7766ba597c5SAnurag S. Maskey 		if (strcmp(cmd_file_name, "-") == 0)
7776ba597c5SAnurag S. Maskey 			(void) fprintf(stderr, gettext("On line %d:\n"),
7786ba597c5SAnurag S. Maskey 			    lex_lineno - 1);
7796ba597c5SAnurag S. Maskey 		else
7806ba597c5SAnurag S. Maskey 			(void) fprintf(stderr, gettext("On line %d of %s:\n"),
7816ba597c5SAnurag S. Maskey 			    lex_lineno - 1, cmd_file_name);
7826ba597c5SAnurag S. Maskey 		last_lineno = lex_lineno;
7836ba597c5SAnurag S. Maskey 	}
7846ba597c5SAnurag S. Maskey }
7856ba597c5SAnurag S. Maskey 
7866ba597c5SAnurag S. Maskey /* PRINTFLIKE1 */
7876ba597c5SAnurag S. Maskey void
7886ba597c5SAnurag S. Maskey nerr(const char *format, ...)
7896ba597c5SAnurag S. Maskey {
7906ba597c5SAnurag S. Maskey 	va_list	alist;
7916ba597c5SAnurag S. Maskey 
7926ba597c5SAnurag S. Maskey 	print_lineno();
7936ba597c5SAnurag S. Maskey 
7946ba597c5SAnurag S. Maskey 	format = gettext(format);
7956ba597c5SAnurag S. Maskey 	va_start(alist, format);
7966ba597c5SAnurag S. Maskey 	(void) vfprintf(stderr, format, alist);
7976ba597c5SAnurag S. Maskey 	va_end(alist);
7986ba597c5SAnurag S. Maskey 	(void) fprintf(stderr, "\n");
7996ba597c5SAnurag S. Maskey 
8006ba597c5SAnurag S. Maskey 	saw_error = B_TRUE;
8016ba597c5SAnurag S. Maskey }
8026ba597c5SAnurag S. Maskey 
8036ba597c5SAnurag S. Maskey /* PRINTFLIKE2 */
8046ba597c5SAnurag S. Maskey static void
8056ba597c5SAnurag S. Maskey nwamerr(nwam_error_t err, const char *format, ...)
8066ba597c5SAnurag S. Maskey {
8076ba597c5SAnurag S. Maskey 	va_list	alist;
8086ba597c5SAnurag S. Maskey 
8096ba597c5SAnurag S. Maskey 	print_lineno();
8106ba597c5SAnurag S. Maskey 
8116ba597c5SAnurag S. Maskey 	format = gettext(format);
8126ba597c5SAnurag S. Maskey 	va_start(alist, format);
8136ba597c5SAnurag S. Maskey 	(void) vfprintf(stderr, format, alist);
8146ba597c5SAnurag S. Maskey 	va_end(alist);
8156ba597c5SAnurag S. Maskey 	(void) fprintf(stderr, ": %s\n", nwam_strerror(err));
8166ba597c5SAnurag S. Maskey 
8176ba597c5SAnurag S. Maskey 	saw_error = B_TRUE;
8186ba597c5SAnurag S. Maskey }
8196ba597c5SAnurag S. Maskey 
8206ba597c5SAnurag S. Maskey void
8216ba597c5SAnurag S. Maskey properr(const char *prop)
8226ba597c5SAnurag S. Maskey {
8236ba597c5SAnurag S. Maskey 	nerr("Invalid property: '%s'", prop);
8246ba597c5SAnurag S. Maskey }
8256ba597c5SAnurag S. Maskey 
8266ba597c5SAnurag S. Maskey /*
8276ba597c5SAnurag S. Maskey  * If free_ncu_only == B_TRUE, only ncu handle is freed, ncp handle remains the
8286ba597c5SAnurag S. Maskey  * same.  Since nwam_ncp_free() takes care of its ncus, no need to explicitly
8296ba597c5SAnurag S. Maskey  * call nwam_ncu_free() afterwards.
8306ba597c5SAnurag S. Maskey  */
8316ba597c5SAnurag S. Maskey static void
8326ba597c5SAnurag S. Maskey free_handle(boolean_t free_ncu_only)
8336ba597c5SAnurag S. Maskey {
8346ba597c5SAnurag S. Maskey 	if (ncp_h != NULL) {
8356ba597c5SAnurag S. Maskey 		if (!free_ncu_only) {
8366ba597c5SAnurag S. Maskey 			nwam_ncp_free(ncp_h);
8376ba597c5SAnurag S. Maskey 			ncp_h = NULL;
8386ba597c5SAnurag S. Maskey 			ncu_h = NULL;
8396ba597c5SAnurag S. Maskey 		} else if (ncu_h != NULL) {
8406ba597c5SAnurag S. Maskey 			nwam_ncu_free(ncu_h);
8416ba597c5SAnurag S. Maskey 			ncu_h = NULL;
8426ba597c5SAnurag S. Maskey 		}
8436ba597c5SAnurag S. Maskey 	}
8446ba597c5SAnurag S. Maskey 
8456ba597c5SAnurag S. Maskey 	if (enm_h != NULL) {
8466ba597c5SAnurag S. Maskey 		nwam_enm_free(enm_h);
8476ba597c5SAnurag S. Maskey 		enm_h = NULL;
8486ba597c5SAnurag S. Maskey 	}
8496ba597c5SAnurag S. Maskey 
8506ba597c5SAnurag S. Maskey 	if (loc_h != NULL) {
8516ba597c5SAnurag S. Maskey 		nwam_loc_free(loc_h);
8526ba597c5SAnurag S. Maskey 		loc_h = NULL;
8536ba597c5SAnurag S. Maskey 	}
8546ba597c5SAnurag S. Maskey 
8556ba597c5SAnurag S. Maskey 	if (wlan_h != NULL) {
8566ba597c5SAnurag S. Maskey 		nwam_known_wlan_free(wlan_h);
8576ba597c5SAnurag S. Maskey 		wlan_h = NULL;
8586ba597c5SAnurag S. Maskey 	}
8596ba597c5SAnurag S. Maskey }
8606ba597c5SAnurag S. Maskey 
8616ba597c5SAnurag S. Maskey /*
8626ba597c5SAnurag S. Maskey  * On input, TRUE => yes, FALSE => no.
8636ba597c5SAnurag S. Maskey  * On return, TRUE => 1, FALSE => no, could not ask => -1.
8646ba597c5SAnurag S. Maskey  */
8656ba597c5SAnurag S. Maskey static int
8666ba597c5SAnurag S. Maskey ask_yesno(boolean_t default_answer, const char *question)
8676ba597c5SAnurag S. Maskey {
8686ba597c5SAnurag S. Maskey 	char line[64];  /* should be enough to answer yes or no */
8696ba597c5SAnurag S. Maskey 
8706ba597c5SAnurag S. Maskey 	if (!ok_to_prompt) {
8716ba597c5SAnurag S. Maskey 		saw_error = B_TRUE;
8726ba597c5SAnurag S. Maskey 		return (-1);
8736ba597c5SAnurag S. Maskey 	}
8746ba597c5SAnurag S. Maskey 	for (;;) {
8756ba597c5SAnurag S. Maskey 		if (printf("%s (%s)? ", gettext(question),
8766ba597c5SAnurag S. Maskey 		    default_answer ? "[y]/n" : "y/[n]") < 0)
8776ba597c5SAnurag S. Maskey 			return (-1);
8786ba597c5SAnurag S. Maskey 		if (fgets(line, sizeof (line), stdin) == NULL)
8796ba597c5SAnurag S. Maskey 			return (-1);
8806ba597c5SAnurag S. Maskey 
8816ba597c5SAnurag S. Maskey 		if (line[0] == '\n')
8826ba597c5SAnurag S. Maskey 			return (default_answer ? 1 : 0);
8836ba597c5SAnurag S. Maskey 		if (tolower(line[0]) == 'y')
8846ba597c5SAnurag S. Maskey 			return (1);
8856ba597c5SAnurag S. Maskey 		if (tolower(line[0]) == 'n')
8866ba597c5SAnurag S. Maskey 			return (0);
8876ba597c5SAnurag S. Maskey 	}
8886ba597c5SAnurag S. Maskey }
8896ba597c5SAnurag S. Maskey 
8906ba597c5SAnurag S. Maskey /* This is the back-end helper function for read_input() below. */
8916ba597c5SAnurag S. Maskey static int
8926ba597c5SAnurag S. Maskey cleanup()
8936ba597c5SAnurag S. Maskey {
8946ba597c5SAnurag S. Maskey 	int answer;
8956ba597c5SAnurag S. Maskey 
8966ba597c5SAnurag S. Maskey 	if (!interactive_mode && !cmd_file_mode) {
8976ba597c5SAnurag S. Maskey 		/*
8986ba597c5SAnurag S. Maskey 		 * If we're not in interactive mode, and we're not in command
8996ba597c5SAnurag S. Maskey 		 * file mode, then we must be in commands-from-the-command-line
9006ba597c5SAnurag S. Maskey 		 * mode.  As such, we can't loop back and ask for more input.
9016ba597c5SAnurag S. Maskey 		 * It was OK to prompt for such things as whether or not to
9026ba597c5SAnurag S. Maskey 		 * really delete something in the command handler called from
9036ba597c5SAnurag S. Maskey 		 * yyparse() above, but "really quit?" makes no sense in this
9046ba597c5SAnurag S. Maskey 		 * context.  So disable prompting.
9056ba597c5SAnurag S. Maskey 		 */
9066ba597c5SAnurag S. Maskey 		ok_to_prompt = B_FALSE;
9076ba597c5SAnurag S. Maskey 	}
9086ba597c5SAnurag S. Maskey 	if (need_to_commit) {
9096ba597c5SAnurag S. Maskey 		answer = ask_yesno(B_FALSE,
9106ba597c5SAnurag S. Maskey 		    "Configuration not saved; really quit");
9116ba597c5SAnurag S. Maskey 		switch (answer) {
9126ba597c5SAnurag S. Maskey 		case -1:
9136ba597c5SAnurag S. Maskey 			/* issue error here */
9146ba597c5SAnurag S. Maskey 			return (NWAM_ERR);
9156ba597c5SAnurag S. Maskey 		case 1:
9166ba597c5SAnurag S. Maskey 			/*
9176ba597c5SAnurag S. Maskey 			 * don't want to save, just exit. handles are freed at
9186ba597c5SAnurag S. Maskey 			 * end_func() or exit_func().
9196ba597c5SAnurag S. Maskey 			 */
9206ba597c5SAnurag S. Maskey 			return (NWAM_OK);
9216ba597c5SAnurag S. Maskey 		default:
9226ba597c5SAnurag S. Maskey 			/* loop back to read input */
9236ba597c5SAnurag S. Maskey 			time_to_exit = B_FALSE;
9246ba597c5SAnurag S. Maskey 			yyin = stdin;
9256ba597c5SAnurag S. Maskey 			return (NWAM_REPEAT);
9266ba597c5SAnurag S. Maskey 		}
9276ba597c5SAnurag S. Maskey 	}
9286ba597c5SAnurag S. Maskey 	return (saw_error ? NWAM_ERR : NWAM_OK);
9296ba597c5SAnurag S. Maskey }
9306ba597c5SAnurag S. Maskey 
9316ba597c5SAnurag S. Maskey static int
9326ba597c5SAnurag S. Maskey string_to_yyin(char *string)
9336ba597c5SAnurag S. Maskey {
9346ba597c5SAnurag S. Maskey 	if ((yyin = tmpfile()) == NULL)
9356ba597c5SAnurag S. Maskey 		goto error;
9366ba597c5SAnurag S. Maskey 	if (fwrite(string, strlen(string), 1, yyin) != 1)
9376ba597c5SAnurag S. Maskey 		goto error;
9386ba597c5SAnurag S. Maskey 	if (fseek(yyin, 0, SEEK_SET) != 0)
9396ba597c5SAnurag S. Maskey 		goto error;
9406ba597c5SAnurag S. Maskey 
9416ba597c5SAnurag S. Maskey 	return (NWAM_OK);
9426ba597c5SAnurag S. Maskey 
9436ba597c5SAnurag S. Maskey error:
9446ba597c5SAnurag S. Maskey 	nerr("problem creating temporary file");
9456ba597c5SAnurag S. Maskey 	return (NWAM_ERR);
9466ba597c5SAnurag S. Maskey }
9476ba597c5SAnurag S. Maskey 
9486ba597c5SAnurag S. Maskey /*
9496ba597c5SAnurag S. Maskey  * read_input() is the driver of this program.  It is a wrapper around
9506ba597c5SAnurag S. Maskey  * yyparse(), printing appropriate prompts when needed, checking for
9516ba597c5SAnurag S. Maskey  * exit conditions and reacting appropriately.  This function is
9526ba597c5SAnurag S. Maskey  * called when in interactive mode or command-file mode.
9536ba597c5SAnurag S. Maskey  */
9546ba597c5SAnurag S. Maskey static int
9556ba597c5SAnurag S. Maskey read_input(void)
9566ba597c5SAnurag S. Maskey {
9576ba597c5SAnurag S. Maskey 	boolean_t yyin_is_a_tty = isatty(fileno(yyin));
9586ba597c5SAnurag S. Maskey 	/*
9596ba597c5SAnurag S. Maskey 	 * The prompt is "e> " or "e:t1:o1> " or "e:t1:o1:t2:o2> " where e is
9606ba597c5SAnurag S. Maskey 	 * execname, t is resource type, o is object name.
9616ba597c5SAnurag S. Maskey 	 */
9626ba597c5SAnurag S. Maskey 	char prompt[MAXPATHLEN + (2 * (NWAM_MAX_TYPE_LEN + NWAM_MAX_NAME_LEN))
9636ba597c5SAnurag S. Maskey 	    + sizeof ("::::> ")];
9646ba597c5SAnurag S. Maskey 	char *line;
9656ba597c5SAnurag S. Maskey 
9666ba597c5SAnurag S. Maskey 	/* yyin should have been set to the appropriate (FILE *) if not stdin */
9676ba597c5SAnurag S. Maskey 	newline_terminated = B_TRUE;
9686ba597c5SAnurag S. Maskey 	for (;;) {
9696ba597c5SAnurag S. Maskey 		if (yyin_is_a_tty) {
9706ba597c5SAnurag S. Maskey 			if (newline_terminated) {
9716ba597c5SAnurag S. Maskey 				switch (current_scope) {
9726ba597c5SAnurag S. Maskey 				case NWAM_SCOPE_GBL:
9736ba597c5SAnurag S. Maskey 					(void) snprintf(prompt, sizeof (prompt),
9746ba597c5SAnurag S. Maskey 					    "%s> ", execname);
9756ba597c5SAnurag S. Maskey 					break;
9766ba597c5SAnurag S. Maskey 				case NWAM_SCOPE_LOC:
9776ba597c5SAnurag S. Maskey 				case NWAM_SCOPE_ENM:
9786ba597c5SAnurag S. Maskey 				case NWAM_SCOPE_WLAN:
9796ba597c5SAnurag S. Maskey 				case NWAM_SCOPE_NCP:
9806ba597c5SAnurag S. Maskey 					(void) snprintf(prompt, sizeof (prompt),
9816ba597c5SAnurag S. Maskey 					    "%s:%s:%s> ", execname,
9826ba597c5SAnurag S. Maskey 					    rt1_to_str(obj1_type), obj1_name);
9836ba597c5SAnurag S. Maskey 
9846ba597c5SAnurag S. Maskey 					break;
9856ba597c5SAnurag S. Maskey 				case NWAM_SCOPE_NCU:
9866ba597c5SAnurag S. Maskey 					(void) snprintf(prompt, sizeof (prompt),
9876ba597c5SAnurag S. Maskey 					    "%s:%s:%s:%s:%s> ", execname,
9886ba597c5SAnurag S. Maskey 					    rt1_to_str(obj1_type), obj1_name,
9896ba597c5SAnurag S. Maskey 					    rt2_to_str(obj2_type), obj2_name);
9906ba597c5SAnurag S. Maskey 				}
9916ba597c5SAnurag S. Maskey 			}
9926ba597c5SAnurag S. Maskey 			/*
9936ba597c5SAnurag S. Maskey 			 * If the user hits ^C then we want to catch it and
9946ba597c5SAnurag S. Maskey 			 * start over.  If the user hits EOF then we want to
9956ba597c5SAnurag S. Maskey 			 * bail out.
9966ba597c5SAnurag S. Maskey 			 */
9976ba597c5SAnurag S. Maskey 			line = gl_get_line(gl, prompt, NULL, -1);
9986ba597c5SAnurag S. Maskey 			if (gl_return_status(gl) == GLR_SIGNAL) {
9996ba597c5SAnurag S. Maskey 				gl_abandon_line(gl);
10006ba597c5SAnurag S. Maskey 				continue;
10016ba597c5SAnurag S. Maskey 			}
10026ba597c5SAnurag S. Maskey 			if (line == NULL)
10036ba597c5SAnurag S. Maskey 				break;
10046ba597c5SAnurag S. Maskey 			if (string_to_yyin(line) != NWAM_OK)
10056ba597c5SAnurag S. Maskey 				break;
10066ba597c5SAnurag S. Maskey 			while (!feof(yyin)) {
10076ba597c5SAnurag S. Maskey 				yyparse();
10086ba597c5SAnurag S. Maskey 
10096ba597c5SAnurag S. Maskey 				/*
10106ba597c5SAnurag S. Maskey 				 * If any command on a list of commands
10116ba597c5SAnurag S. Maskey 				 * give an error, don't continue with the
10126ba597c5SAnurag S. Maskey 				 * remaining commands.
10136ba597c5SAnurag S. Maskey 				 */
10146ba597c5SAnurag S. Maskey 				if (saw_error || time_to_exit)
10156ba597c5SAnurag S. Maskey 					break;
10166ba597c5SAnurag S. Maskey 			}
10176ba597c5SAnurag S. Maskey 		} else {
10186ba597c5SAnurag S. Maskey 			yyparse();
10196ba597c5SAnurag S. Maskey 		}
10206ba597c5SAnurag S. Maskey 
10216ba597c5SAnurag S. Maskey 		/* Bail out on an error in command-file mode. */
10226ba597c5SAnurag S. Maskey 		if (saw_error && cmd_file_mode && !interactive_mode)
10236ba597c5SAnurag S. Maskey 			time_to_exit = B_TRUE;
10246ba597c5SAnurag S. Maskey 		if (time_to_exit || (!yyin_is_a_tty && feof(yyin)))
10256ba597c5SAnurag S. Maskey 			break;
10266ba597c5SAnurag S. Maskey 	}
10276ba597c5SAnurag S. Maskey 	return (cleanup());
10286ba597c5SAnurag S. Maskey }
10296ba597c5SAnurag S. Maskey 
10306ba597c5SAnurag S. Maskey /*
10316ba597c5SAnurag S. Maskey  * This function is used in the interactive-mode scenario: it just calls
10326ba597c5SAnurag S. Maskey  * read_input() until we are done.
10336ba597c5SAnurag S. Maskey  */
10346ba597c5SAnurag S. Maskey static int
10356ba597c5SAnurag S. Maskey do_interactive(void)
10366ba597c5SAnurag S. Maskey {
10376ba597c5SAnurag S. Maskey 	int err;
10386ba597c5SAnurag S. Maskey 
10396ba597c5SAnurag S. Maskey 	interactive_mode = B_TRUE;
10406ba597c5SAnurag S. Maskey 	do {
10416ba597c5SAnurag S. Maskey 		err = read_input();
10426ba597c5SAnurag S. Maskey 	} while (err == NWAM_REPEAT);
10436ba597c5SAnurag S. Maskey 	return (err);
10446ba597c5SAnurag S. Maskey }
10456ba597c5SAnurag S. Maskey 
10466ba597c5SAnurag S. Maskey /* Calls the help_func() to print the usage of all commands */
10476ba597c5SAnurag S. Maskey void
10486ba597c5SAnurag S. Maskey help_wrap()
10496ba597c5SAnurag S. Maskey {
10506ba597c5SAnurag S. Maskey 	cmd_t *help_cmd;
10516ba597c5SAnurag S. Maskey 
10526ba597c5SAnurag S. Maskey 	if ((help_cmd = alloc_cmd()) == NULL)
10536ba597c5SAnurag S. Maskey 		exit(NWAM_ERR);
10546ba597c5SAnurag S. Maskey 	help_func(help_cmd);
10556ba597c5SAnurag S. Maskey 	free_cmd(help_cmd);
10566ba597c5SAnurag S. Maskey }
10576ba597c5SAnurag S. Maskey 
10586ba597c5SAnurag S. Maskey /* Check if the given command is allowed in the current scope */
10596ba597c5SAnurag S. Maskey boolean_t
10606ba597c5SAnurag S. Maskey check_scope(int cmd)
10616ba597c5SAnurag S. Maskey {
10626ba597c5SAnurag S. Maskey 	/* allowed in all scopes */
10636ba597c5SAnurag S. Maskey 	switch (cmd) {
10646ba597c5SAnurag S. Maskey 	case CMD_END:
10656ba597c5SAnurag S. Maskey 	case CMD_EXIT:
10666ba597c5SAnurag S. Maskey 	case CMD_HELP:
10676ba597c5SAnurag S. Maskey 	case CMD_LIST:
10686ba597c5SAnurag S. Maskey 	case CMD_EXPORT:
10696ba597c5SAnurag S. Maskey 		return (B_TRUE);
10706ba597c5SAnurag S. Maskey 	}
10716ba597c5SAnurag S. Maskey 	/* scope-specific */
10726ba597c5SAnurag S. Maskey 	switch (current_scope) {
10736ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_GBL:
10746ba597c5SAnurag S. Maskey 		switch (cmd) {
10756ba597c5SAnurag S. Maskey 		case CMD_CREATE:
10766ba597c5SAnurag S. Maskey 		case CMD_DESTROY:
10776ba597c5SAnurag S. Maskey 		case CMD_SELECT:
10786ba597c5SAnurag S. Maskey 			return (B_TRUE);
10796ba597c5SAnurag S. Maskey 		}
10806ba597c5SAnurag S. Maskey 		break;
10816ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_LOC:
10826ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_ENM:
10836ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_WLAN:
10846ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_NCU:
10856ba597c5SAnurag S. Maskey 		switch (cmd) {
10866ba597c5SAnurag S. Maskey 		case CMD_CANCEL:
10876ba597c5SAnurag S. Maskey 		case CMD_CLEAR:
10886ba597c5SAnurag S. Maskey 		case CMD_COMMIT:
10896ba597c5SAnurag S. Maskey 		case CMD_GET:
10906ba597c5SAnurag S. Maskey 		case CMD_REVERT:
10916ba597c5SAnurag S. Maskey 		case CMD_SET:
10926ba597c5SAnurag S. Maskey 		case CMD_VERIFY:
10936ba597c5SAnurag S. Maskey 		case CMD_WALKPROP:
10946ba597c5SAnurag S. Maskey 			return (B_TRUE);
10956ba597c5SAnurag S. Maskey 		}
10966ba597c5SAnurag S. Maskey 		break;
10976ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_NCP:
10986ba597c5SAnurag S. Maskey 		switch (cmd) {
10996ba597c5SAnurag S. Maskey 		case CMD_CANCEL:
11006ba597c5SAnurag S. Maskey 		case CMD_CREATE:
11016ba597c5SAnurag S. Maskey 		case CMD_DESTROY:
11026ba597c5SAnurag S. Maskey 		case CMD_SELECT:
11036ba597c5SAnurag S. Maskey 			return (B_TRUE);
11046ba597c5SAnurag S. Maskey 		}
11056ba597c5SAnurag S. Maskey 		break;
11066ba597c5SAnurag S. Maskey 	default:
11076ba597c5SAnurag S. Maskey 		nerr("Invalid scope");
11086ba597c5SAnurag S. Maskey 	}
11096ba597c5SAnurag S. Maskey 	nerr("'%s' is not allowed at this scope", cmd_to_str(cmd));
11106ba597c5SAnurag S. Maskey 	return (B_FALSE);
11116ba597c5SAnurag S. Maskey }
11126ba597c5SAnurag S. Maskey 
11136ba597c5SAnurag S. Maskey /* Returns the active object type depending on which handle is not NULL */
11146ba597c5SAnurag S. Maskey static nwam_object_type_t
11156ba597c5SAnurag S. Maskey active_object_type()
11166ba597c5SAnurag S. Maskey {
11176ba597c5SAnurag S. Maskey 	/* Check ncu_h before ncp_h, ncp_h must be loaded before ncu_h */
11186ba597c5SAnurag S. Maskey 	if (ncu_h != NULL)
11196ba597c5SAnurag S. Maskey 		return (NWAM_OBJECT_TYPE_NCU);
11206ba597c5SAnurag S. Maskey 	else if (ncp_h != NULL)
11216ba597c5SAnurag S. Maskey 		return (NWAM_OBJECT_TYPE_NCP);
11226ba597c5SAnurag S. Maskey 	else if (loc_h != NULL)
11236ba597c5SAnurag S. Maskey 		return (NWAM_OBJECT_TYPE_LOC);
11246ba597c5SAnurag S. Maskey 	else if (enm_h != NULL)
11256ba597c5SAnurag S. Maskey 		return (NWAM_OBJECT_TYPE_ENM);
11266ba597c5SAnurag S. Maskey 	else if (wlan_h != NULL)
11276ba597c5SAnurag S. Maskey 		return (NWAM_OBJECT_TYPE_KNOWN_WLAN);
11286ba597c5SAnurag S. Maskey 	else
11296ba597c5SAnurag S. Maskey 		return (NWAM_OBJECT_TYPE_UNKNOWN);
11306ba597c5SAnurag S. Maskey }
11316ba597c5SAnurag S. Maskey 
11326ba597c5SAnurag S. Maskey /* Retrive the name of the object from its handle */
11336ba597c5SAnurag S. Maskey static nwam_error_t
11346ba597c5SAnurag S. Maskey object_name_from_handle(nwam_object_type_t object_type, void *handle,
11356ba597c5SAnurag S. Maskey     char **namep)
11366ba597c5SAnurag S. Maskey {
11376ba597c5SAnurag S. Maskey 	switch (object_type) {
11386ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_NCP:
11396ba597c5SAnurag S. Maskey 		return (nwam_ncp_get_name(handle, namep));
11406ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_NCU:
11416ba597c5SAnurag S. Maskey 		return (nwam_ncu_get_name(handle, namep));
11426ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_LOC:
11436ba597c5SAnurag S. Maskey 		return (nwam_loc_get_name(handle, namep));
11446ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_ENM:
11456ba597c5SAnurag S. Maskey 		return (nwam_enm_get_name(handle, namep));
11466ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_KNOWN_WLAN:
11476ba597c5SAnurag S. Maskey 		return (nwam_known_wlan_get_name(handle, namep));
11486ba597c5SAnurag S. Maskey 	}
11496ba597c5SAnurag S. Maskey 	return (NWAM_INVALID_ARG);
11506ba597c5SAnurag S. Maskey }
11516ba597c5SAnurag S. Maskey 
11526ba597c5SAnurag S. Maskey static void
11536ba597c5SAnurag S. Maskey do_commit()
11546ba597c5SAnurag S. Maskey {
11556ba597c5SAnurag S. Maskey 	nwam_error_t	ret = NWAM_SUCCESS;
11566ba597c5SAnurag S. Maskey 	const char	*errprop;
11576ba597c5SAnurag S. Maskey 
11586ba597c5SAnurag S. Maskey 	if (!need_to_commit)
11596ba597c5SAnurag S. Maskey 		return;
11606ba597c5SAnurag S. Maskey 
11616ba597c5SAnurag S. Maskey 	switch (active_object_type()) {
11626ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_NCU:
11636ba597c5SAnurag S. Maskey 		ret = nwam_ncu_commit(ncu_h, 0);
11646ba597c5SAnurag S. Maskey 		break;
11656ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_ENM:
11666ba597c5SAnurag S. Maskey 		ret = nwam_enm_commit(enm_h, 0);
11676ba597c5SAnurag S. Maskey 		break;
11686ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_LOC:
11696ba597c5SAnurag S. Maskey 		ret = nwam_loc_commit(loc_h, 0);
11706ba597c5SAnurag S. Maskey 		break;
11716ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_KNOWN_WLAN:
11726ba597c5SAnurag S. Maskey 		ret = nwam_known_wlan_commit(wlan_h, 0);
11736ba597c5SAnurag S. Maskey 		break;
11746ba597c5SAnurag S. Maskey 	}
11756ba597c5SAnurag S. Maskey 
11766ba597c5SAnurag S. Maskey 	if (ret == NWAM_SUCCESS) {
11776ba597c5SAnurag S. Maskey 		need_to_commit = B_FALSE;
11786ba597c5SAnurag S. Maskey 		if (interactive_mode)
11796ba597c5SAnurag S. Maskey 			(void) printf(gettext("Committed changes\n"));
11806ba597c5SAnurag S. Maskey 	} else {
11816ba597c5SAnurag S. Maskey 		nwam_error_t verr;
11826ba597c5SAnurag S. Maskey 
11836ba597c5SAnurag S. Maskey 		/* Find property that caused failure */
11846ba597c5SAnurag S. Maskey 		switch (active_object_type()) {
11856ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_NCU:
11866ba597c5SAnurag S. Maskey 			verr = nwam_ncu_validate(ncu_h, &errprop);
11876ba597c5SAnurag S. Maskey 			break;
11886ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_ENM:
11896ba597c5SAnurag S. Maskey 			verr = nwam_enm_validate(enm_h, &errprop);
11906ba597c5SAnurag S. Maskey 			break;
11916ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_LOC:
11926ba597c5SAnurag S. Maskey 			verr = nwam_loc_validate(loc_h, &errprop);
11936ba597c5SAnurag S. Maskey 			break;
11946ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_KNOWN_WLAN:
11956ba597c5SAnurag S. Maskey 			verr = nwam_known_wlan_validate(wlan_h, &errprop);
11966ba597c5SAnurag S. Maskey 			break;
11976ba597c5SAnurag S. Maskey 		}
11986ba597c5SAnurag S. Maskey 
11996ba597c5SAnurag S. Maskey 		if (verr != NWAM_SUCCESS)
12006ba597c5SAnurag S. Maskey 			nwamerr(ret, "Commit error on property '%s'", errprop);
12016ba597c5SAnurag S. Maskey 		else
12026ba597c5SAnurag S. Maskey 			nwamerr(ret, "Commit error");
12036ba597c5SAnurag S. Maskey 	}
12046ba597c5SAnurag S. Maskey }
12056ba597c5SAnurag S. Maskey 
12066ba597c5SAnurag S. Maskey /*
12076ba597c5SAnurag S. Maskey  * Saves the current configuration to persistent storage.
12086ba597c5SAnurag S. Maskey  */
12096ba597c5SAnurag S. Maskey /* ARGSUSED */
12106ba597c5SAnurag S. Maskey void
12116ba597c5SAnurag S. Maskey commit_func(cmd_t *cmd)
12126ba597c5SAnurag S. Maskey {
12136ba597c5SAnurag S. Maskey 	if (!need_to_commit) {
12146ba597c5SAnurag S. Maskey 		if (interactive_mode)
12156ba597c5SAnurag S. Maskey 			(void) printf(gettext("Nothing to commit\n"));
12166ba597c5SAnurag S. Maskey 	} else {
12176ba597c5SAnurag S. Maskey 		do_commit();
12186ba597c5SAnurag S. Maskey 	}
12196ba597c5SAnurag S. Maskey }
12206ba597c5SAnurag S. Maskey 
12216ba597c5SAnurag S. Maskey static void
12226ba597c5SAnurag S. Maskey do_cancel()
12236ba597c5SAnurag S. Maskey {
12246ba597c5SAnurag S. Maskey 	switch (current_scope) {
12256ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_NCU:
12266ba597c5SAnurag S. Maskey 		current_scope = NWAM_SCOPE_NCP;
12276ba597c5SAnurag S. Maskey 		obj2_type = 0;
12286ba597c5SAnurag S. Maskey 		free_handle(B_TRUE);
12296ba597c5SAnurag S. Maskey 		break;
12306ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_NCP:
12316ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_ENM:
12326ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_WLAN:
12336ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_LOC:
12346ba597c5SAnurag S. Maskey 		current_scope = NWAM_SCOPE_GBL;
12356ba597c5SAnurag S. Maskey 		obj1_type = 0;
12366ba597c5SAnurag S. Maskey 		free_handle(B_FALSE);
12376ba597c5SAnurag S. Maskey 		break;
12386ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_GBL:
12396ba597c5SAnurag S. Maskey 		free_handle(B_FALSE);
12406ba597c5SAnurag S. Maskey 		break;
12416ba597c5SAnurag S. Maskey 	default:
12426ba597c5SAnurag S. Maskey 		nerr("Invalid scope");
12436ba597c5SAnurag S. Maskey 		return;
12446ba597c5SAnurag S. Maskey 	}
12456ba597c5SAnurag S. Maskey 	need_to_commit = B_FALSE;
12466ba597c5SAnurag S. Maskey }
12476ba597c5SAnurag S. Maskey 
12486ba597c5SAnurag S. Maskey /*
12496ba597c5SAnurag S. Maskey  * End operation on current scope and go up one scope.
12506ba597c5SAnurag S. Maskey  * Changes are not saved, no prompt either.
12516ba597c5SAnurag S. Maskey  */
12526ba597c5SAnurag S. Maskey /* ARGSUSED */
12536ba597c5SAnurag S. Maskey void
12546ba597c5SAnurag S. Maskey cancel_func(cmd_t *cmd)
12556ba597c5SAnurag S. Maskey {
12566ba597c5SAnurag S. Maskey 	do_cancel();
12576ba597c5SAnurag S. Maskey }
12586ba597c5SAnurag S. Maskey 
12596ba597c5SAnurag S. Maskey /*
12606ba597c5SAnurag S. Maskey  * Removes leading and trailing quotes from a string.
12616ba597c5SAnurag S. Maskey  * Caller must free returned string.
12626ba597c5SAnurag S. Maskey  */
12636ba597c5SAnurag S. Maskey static char *
12646ba597c5SAnurag S. Maskey trim_quotes(const char *quoted_str)
12656ba597c5SAnurag S. Maskey {
12666ba597c5SAnurag S. Maskey 	char *str;
12676ba597c5SAnurag S. Maskey 	int end;
12686ba597c5SAnurag S. Maskey 
12696ba597c5SAnurag S. Maskey 	/* export_func() and list_func() can pass NULL here */
12706ba597c5SAnurag S. Maskey 	if (quoted_str == NULL)
12716ba597c5SAnurag S. Maskey 		return (NULL);
12726ba597c5SAnurag S. Maskey 
12736ba597c5SAnurag S. Maskey 	/* remove leading quote */
12746ba597c5SAnurag S. Maskey 	if (quoted_str[0] == '"')
12756ba597c5SAnurag S. Maskey 		str = strdup(quoted_str + 1);
12766ba597c5SAnurag S. Maskey 	else
12776ba597c5SAnurag S. Maskey 		str = strdup(quoted_str);
12786ba597c5SAnurag S. Maskey 	if (str == NULL)
12796ba597c5SAnurag S. Maskey 		return (NULL);
12806ba597c5SAnurag S. Maskey 
12816ba597c5SAnurag S. Maskey 	/* remove trailing quote and newline */
12826ba597c5SAnurag S. Maskey 	end = strlen(str) - 1;
12836ba597c5SAnurag S. Maskey 	while (end >= 0 && (str[end] == '"' || str[end] == '\n'))
12846ba597c5SAnurag S. Maskey 		end--;
12856ba597c5SAnurag S. Maskey 	str[end+1] = 0;
12866ba597c5SAnurag S. Maskey 
12876ba597c5SAnurag S. Maskey 	return (str);
12886ba597c5SAnurag S. Maskey }
12896ba597c5SAnurag S. Maskey 
12906ba597c5SAnurag S. Maskey /*
12916ba597c5SAnurag S. Maskey  * Creates a new resource and enters the scope of that resource.
12926ba597c5SAnurag S. Maskey  * The new resource can also be a copy of an existing resource (-t option).
12936ba597c5SAnurag S. Maskey  * If in interactive mode, then after creation call walkprop_func()
12946ba597c5SAnurag S. Maskey  * to do walk the properties for the new object.
12956ba597c5SAnurag S. Maskey  */
12966ba597c5SAnurag S. Maskey void
12976ba597c5SAnurag S. Maskey create_func(cmd_t *cmd)
12986ba597c5SAnurag S. Maskey {
12996ba597c5SAnurag S. Maskey 	nwam_error_t	ret = NWAM_SUCCESS;
13006ba597c5SAnurag S. Maskey 	int		c;
13016ba597c5SAnurag S. Maskey 	boolean_t	template = B_FALSE;
13026ba597c5SAnurag S. Maskey 	char		*newname = NULL, *oldname = NULL;
13036ba597c5SAnurag S. Maskey 	cmd_t		*walkprop_cmd;
13046ba597c5SAnurag S. Maskey 
13056ba597c5SAnurag S. Maskey 	/* make sure right command at the right scope */
13066ba597c5SAnurag S. Maskey 	if (current_scope == NWAM_SCOPE_GBL &&
13076ba597c5SAnurag S. Maskey 	    cmd->cmd_res2_type == RT2_NCU) {
13086ba597c5SAnurag S. Maskey 		nerr("cannot create ncu at global scope");
13096ba597c5SAnurag S. Maskey 		return;
13106ba597c5SAnurag S. Maskey 	}
13116ba597c5SAnurag S. Maskey 	if (current_scope == NWAM_SCOPE_NCP &&
13126ba597c5SAnurag S. Maskey 	    cmd->cmd_res2_type != RT2_NCU) {
13136ba597c5SAnurag S. Maskey 		nerr("Cannot create given object at this scope");
13146ba597c5SAnurag S. Maskey 		return;
13156ba597c5SAnurag S. Maskey 	}
13166ba597c5SAnurag S. Maskey 
13176ba597c5SAnurag S. Maskey 	assert(cmd->cmd_argc > 0);
13186ba597c5SAnurag S. Maskey 	optind = 0;
13196ba597c5SAnurag S. Maskey 	while ((c = getopt(cmd->cmd_argc, cmd->cmd_argv, "t:")) != EOF) {
13206ba597c5SAnurag S. Maskey 		switch (c) {
13216ba597c5SAnurag S. Maskey 		case 't':
13226ba597c5SAnurag S. Maskey 			template = B_TRUE;
13236ba597c5SAnurag S. Maskey 			break;
13246ba597c5SAnurag S. Maskey 		default:
13256ba597c5SAnurag S. Maskey 			command_usage(CMD_CREATE);
13266ba597c5SAnurag S. Maskey 			return;
13276ba597c5SAnurag S. Maskey 		}
13286ba597c5SAnurag S. Maskey 	}
13296ba597c5SAnurag S. Maskey 
13306ba597c5SAnurag S. Maskey 	if (!template) {
13316ba597c5SAnurag S. Maskey 		/* no template given */
13326ba597c5SAnurag S. Maskey 		/* argv[0] is name */
13336ba597c5SAnurag S. Maskey 		newname = trim_quotes(cmd->cmd_argv[0]);
13346ba597c5SAnurag S. Maskey 		if (cmd->cmd_res1_type == RT1_ENM) {
13356ba597c5SAnurag S. Maskey 			ret = nwam_enm_create(newname, NULL, &enm_h);
13366ba597c5SAnurag S. Maskey 		} else if (cmd->cmd_res1_type == RT1_LOC) {
13376ba597c5SAnurag S. Maskey 			ret = nwam_loc_create(newname, &loc_h);
13386ba597c5SAnurag S. Maskey 		} else if (cmd->cmd_res1_type == RT1_WLAN) {
13396ba597c5SAnurag S. Maskey 			ret = nwam_known_wlan_create(newname, &wlan_h);
13406ba597c5SAnurag S. Maskey 		} else if (cmd->cmd_res1_type == RT1_NCP &&
13416ba597c5SAnurag S. Maskey 		    current_scope == NWAM_SCOPE_GBL) {
13426ba597c5SAnurag S. Maskey 			ret = nwam_ncp_create(newname, 0, &ncp_h);
13436ba597c5SAnurag S. Maskey 		} else if (cmd->cmd_res2_type == RT2_NCU) {
13446ba597c5SAnurag S. Maskey 			nwam_ncu_type_t		ncu_type;
13456ba597c5SAnurag S. Maskey 			nwam_ncu_class_t	ncu_class;
13466ba597c5SAnurag S. Maskey 
13476ba597c5SAnurag S. Maskey 			/* ncp must already be read */
13486ba597c5SAnurag S. Maskey 			if (ncp_h == NULL) {
13496ba597c5SAnurag S. Maskey 				nerr("Create error: NCP has not been read");
13506ba597c5SAnurag S. Maskey 				goto done;
13516ba597c5SAnurag S. Maskey 			}
13526ba597c5SAnurag S. Maskey 
13536ba597c5SAnurag S. Maskey 			ncu_class = (nwam_ncu_class_t)cmd->cmd_ncu_class_type;
13546ba597c5SAnurag S. Maskey 			ncu_type = nwam_ncu_class_to_type(ncu_class);
13556ba597c5SAnurag S. Maskey 			ret = nwam_ncu_create(ncp_h, newname, ncu_type,
13566ba597c5SAnurag S. Maskey 			    ncu_class, &ncu_h);
13576ba597c5SAnurag S. Maskey 		}
13586ba597c5SAnurag S. Maskey 
13596ba597c5SAnurag S. Maskey 		if (ret != NWAM_SUCCESS) {
13606ba597c5SAnurag S. Maskey 			nwamerr(ret, "Create error");
13616ba597c5SAnurag S. Maskey 			goto done;
13626ba597c5SAnurag S. Maskey 		}
13636ba597c5SAnurag S. Maskey 
13646ba597c5SAnurag S. Maskey 	} else {
13656ba597c5SAnurag S. Maskey 		/* template given */
13666ba597c5SAnurag S. Maskey 		/* argv[0] is -t, argv[1] is old name, argv[2] is new name */
13676ba597c5SAnurag S. Maskey 		oldname = trim_quotes(cmd->cmd_argv[1]);
13686ba597c5SAnurag S. Maskey 		newname = trim_quotes(cmd->cmd_argv[2]);
13696ba597c5SAnurag S. Maskey 		if (cmd->cmd_res1_type == RT1_ENM) {
13706ba597c5SAnurag S. Maskey 			nwam_enm_handle_t oldenm_h;
13716ba597c5SAnurag S. Maskey 
13726ba597c5SAnurag S. Maskey 			ret = nwam_enm_read(oldname, 0, &oldenm_h);
13736ba597c5SAnurag S. Maskey 			if (ret != NWAM_SUCCESS)
13746ba597c5SAnurag S. Maskey 				goto read_error;
13756ba597c5SAnurag S. Maskey 			ret = nwam_enm_copy(oldenm_h, newname, &enm_h);
13766ba597c5SAnurag S. Maskey 			nwam_enm_free(oldenm_h);
13776ba597c5SAnurag S. Maskey 		} else if (cmd->cmd_res1_type == RT1_LOC) {
13786ba597c5SAnurag S. Maskey 			nwam_loc_handle_t oldloc_h;
13796ba597c5SAnurag S. Maskey 
13806ba597c5SAnurag S. Maskey 			ret = nwam_loc_read(oldname, 0, &oldloc_h);
13816ba597c5SAnurag S. Maskey 			if (ret != NWAM_SUCCESS)
13826ba597c5SAnurag S. Maskey 				goto read_error;
13836ba597c5SAnurag S. Maskey 			ret = nwam_loc_copy(oldloc_h, newname, &loc_h);
13846ba597c5SAnurag S. Maskey 			nwam_loc_free(oldloc_h);
13856ba597c5SAnurag S. Maskey 		} else if (cmd->cmd_res1_type == RT1_WLAN) {
13866ba597c5SAnurag S. Maskey 			nwam_known_wlan_handle_t oldwlan_h;
13876ba597c5SAnurag S. Maskey 
13886ba597c5SAnurag S. Maskey 			ret = nwam_known_wlan_read(oldname, 0, &oldwlan_h);
13896ba597c5SAnurag S. Maskey 			if (ret != NWAM_SUCCESS)
13906ba597c5SAnurag S. Maskey 				goto read_error;
13916ba597c5SAnurag S. Maskey 			ret = nwam_known_wlan_copy(oldwlan_h, newname, &wlan_h);
13926ba597c5SAnurag S. Maskey 			nwam_known_wlan_free(oldwlan_h);
13936ba597c5SAnurag S. Maskey 		} else if (cmd->cmd_res1_type == RT1_NCP &&
13946ba597c5SAnurag S. Maskey 		    current_scope == NWAM_SCOPE_GBL) {
13956ba597c5SAnurag S. Maskey 			nwam_ncp_handle_t oldncp_h;
13966ba597c5SAnurag S. Maskey 
13976ba597c5SAnurag S. Maskey 			ret = nwam_ncp_read(oldname, 0, &oldncp_h);
13986ba597c5SAnurag S. Maskey 			if (ret != NWAM_SUCCESS)
13996ba597c5SAnurag S. Maskey 				goto read_error;
14006ba597c5SAnurag S. Maskey 			ret = nwam_ncp_copy(oldncp_h, newname, &ncp_h);
14016ba597c5SAnurag S. Maskey 			nwam_ncp_free(oldncp_h);
14026ba597c5SAnurag S. Maskey 		} else if (cmd->cmd_res2_type == RT2_NCU) {
14036ba597c5SAnurag S. Maskey 			nwam_ncu_handle_t	oldncu_h;
14046ba597c5SAnurag S. Maskey 			nwam_ncu_type_t		ncu_type;
14056ba597c5SAnurag S. Maskey 			nwam_ncu_class_t	ncu_class;
14066ba597c5SAnurag S. Maskey 
14076ba597c5SAnurag S. Maskey 			/* ncp must already be read */
14086ba597c5SAnurag S. Maskey 			if (ncp_h == NULL) {
14096ba597c5SAnurag S. Maskey 				nerr("Copy error: NCP has not been read");
14106ba597c5SAnurag S. Maskey 				goto done;
14116ba597c5SAnurag S. Maskey 			}
14126ba597c5SAnurag S. Maskey 			ncu_class = (nwam_ncu_class_t)cmd->cmd_ncu_class_type;
14136ba597c5SAnurag S. Maskey 			ncu_type = nwam_ncu_class_to_type(ncu_class);
14146ba597c5SAnurag S. Maskey 			ret = nwam_ncu_read(ncp_h, oldname, ncu_type, 0,
14156ba597c5SAnurag S. Maskey 			    &oldncu_h);
14166ba597c5SAnurag S. Maskey 			if (ret != NWAM_SUCCESS)
14176ba597c5SAnurag S. Maskey 				goto read_error;
14186ba597c5SAnurag S. Maskey 			ret = nwam_ncu_copy(oldncu_h, newname, &ncu_h);
14196ba597c5SAnurag S. Maskey 			nwam_ncu_free(oldncu_h);
14206ba597c5SAnurag S. Maskey 		}
14216ba597c5SAnurag S. Maskey 
14226ba597c5SAnurag S. Maskey 		if (ret != NWAM_SUCCESS) {
14236ba597c5SAnurag S. Maskey 			nwamerr(ret, "Copy error");
14246ba597c5SAnurag S. Maskey 			goto done;
14256ba597c5SAnurag S. Maskey 		}
14266ba597c5SAnurag S. Maskey 	}
14276ba597c5SAnurag S. Maskey 
14286ba597c5SAnurag S. Maskey 	if (current_scope == NWAM_SCOPE_GBL) {
14296ba597c5SAnurag S. Maskey 		(void) strlcpy(obj1_name, newname, sizeof (obj1_name));
14306ba597c5SAnurag S. Maskey 		obj1_type = cmd->cmd_res1_type;
14316ba597c5SAnurag S. Maskey 		if (obj1_type == RT1_ENM)
14326ba597c5SAnurag S. Maskey 			current_scope = NWAM_SCOPE_ENM;
14336ba597c5SAnurag S. Maskey 		else if (obj1_type == RT1_LOC)
14346ba597c5SAnurag S. Maskey 			current_scope = NWAM_SCOPE_LOC;
14356ba597c5SAnurag S. Maskey 		else if (obj1_type == RT1_WLAN)
14366ba597c5SAnurag S. Maskey 			current_scope = NWAM_SCOPE_WLAN;
14376ba597c5SAnurag S. Maskey 		else if (obj1_type == RT1_NCP)
14386ba597c5SAnurag S. Maskey 			current_scope = NWAM_SCOPE_NCP;
14396ba597c5SAnurag S. Maskey 	} else {
14406ba597c5SAnurag S. Maskey 		(void) strlcpy(obj2_name, newname, sizeof (obj2_name));
14416ba597c5SAnurag S. Maskey 		current_scope = NWAM_SCOPE_NCU;
14426ba597c5SAnurag S. Maskey 		obj2_type = cmd->cmd_res2_type;
14436ba597c5SAnurag S. Maskey 	}
14446ba597c5SAnurag S. Maskey 	if (current_scope != NWAM_SCOPE_NCP)
14456ba597c5SAnurag S. Maskey 		need_to_commit = B_TRUE;
14466ba597c5SAnurag S. Maskey 
14476ba597c5SAnurag S. Maskey 	/* do a walk of the properties if in interactive mode */
14486ba597c5SAnurag S. Maskey 	if (interactive_mode && current_scope != NWAM_SCOPE_NCP) {
14496ba597c5SAnurag S. Maskey 		(void) printf(gettext("Created %s '%s'.  "
14506ba597c5SAnurag S. Maskey 		    "Walking properties ...\n"),
14516ba597c5SAnurag S. Maskey 		    scope_to_str(current_scope), newname);
14526ba597c5SAnurag S. Maskey 		if ((walkprop_cmd = alloc_cmd()) == NULL)
14536ba597c5SAnurag S. Maskey 			goto done;
14546ba597c5SAnurag S. Maskey 		walkprop_func(walkprop_cmd);
14556ba597c5SAnurag S. Maskey 		free(walkprop_cmd);
14566ba597c5SAnurag S. Maskey 	}
14576ba597c5SAnurag S. Maskey 
14586ba597c5SAnurag S. Maskey read_error:
14596ba597c5SAnurag S. Maskey 	if (ret != NWAM_SUCCESS)
14606ba597c5SAnurag S. Maskey 		nwamerr(ret, "Copy error reading '%s'", oldname);
14616ba597c5SAnurag S. Maskey 
14626ba597c5SAnurag S. Maskey done:
14636ba597c5SAnurag S. Maskey 	free(oldname);
14646ba597c5SAnurag S. Maskey 	free(newname);
14656ba597c5SAnurag S. Maskey }
14666ba597c5SAnurag S. Maskey 
14676ba597c5SAnurag S. Maskey /* Processing of return value for destroy_*_callback() */
14686ba597c5SAnurag S. Maskey static int
14696ba597c5SAnurag S. Maskey destroy_ret(nwam_object_type_t object_type, nwam_error_t ret, void *handle)
14706ba597c5SAnurag S. Maskey {
14716ba597c5SAnurag S. Maskey 	if (ret == NWAM_ENTITY_NOT_DESTROYABLE) {
14726ba597c5SAnurag S. Maskey 		/* log a message to stderr, but don't consider it an error */
14736ba597c5SAnurag S. Maskey 		char *name;
14746ba597c5SAnurag S. Maskey 		if (object_name_from_handle(object_type, handle, &name)
14756ba597c5SAnurag S. Maskey 		    == NWAM_SUCCESS) {
14766ba597c5SAnurag S. Maskey 			(void) fprintf(stderr,
14776ba597c5SAnurag S. Maskey 			    gettext("%s '%s' cannot be removed\n"),
14786ba597c5SAnurag S. Maskey 			    nwam_object_type_to_string(object_type), name);
14796ba597c5SAnurag S. Maskey 			free(name);
14806ba597c5SAnurag S. Maskey 		}
14816ba597c5SAnurag S. Maskey 		return (0);
14826ba597c5SAnurag S. Maskey 	}
14836ba597c5SAnurag S. Maskey 
14846ba597c5SAnurag S. Maskey 	if (ret == NWAM_SUCCESS || ret == NWAM_ENTITY_IN_USE)
14856ba597c5SAnurag S. Maskey 		return (0);
14866ba597c5SAnurag S. Maskey 
14876ba597c5SAnurag S. Maskey 	return (1);
14886ba597c5SAnurag S. Maskey }
14896ba597c5SAnurag S. Maskey 
14906ba597c5SAnurag S. Maskey /*
14916ba597c5SAnurag S. Maskey  * NWAM_FLAG_DO_NOT_FREE is passed to nwam_*_destory() so that it does not
14926ba597c5SAnurag S. Maskey  * free the handle.  The calling nwam_walk_*() function frees this handle
14936ba597c5SAnurag S. Maskey  * as it is the function that created the handle.
14946ba597c5SAnurag S. Maskey  *
14956ba597c5SAnurag S. Maskey  * Objects that are not destroyable or are active cannot be destroyed.
14966ba597c5SAnurag S. Maskey  * Don't return error in these situations so the walk can continue.
14976ba597c5SAnurag S. Maskey  */
14986ba597c5SAnurag S. Maskey /* ARGSUSED */
14996ba597c5SAnurag S. Maskey static int
15006ba597c5SAnurag S. Maskey destroy_ncp_callback(nwam_ncp_handle_t ncp, void *arg)
15016ba597c5SAnurag S. Maskey {
15026ba597c5SAnurag S. Maskey 	/* The file is deleted, so NCUs are also removed */
15036ba597c5SAnurag S. Maskey 	nwam_error_t ret = nwam_ncp_destroy(ncp, NWAM_FLAG_DO_NOT_FREE);
15046ba597c5SAnurag S. Maskey 	return (destroy_ret(NWAM_OBJECT_TYPE_NCP, ret, ncp));
15056ba597c5SAnurag S. Maskey }
15066ba597c5SAnurag S. Maskey 
15076ba597c5SAnurag S. Maskey /* ARGSUSED */
15086ba597c5SAnurag S. Maskey static int
15096ba597c5SAnurag S. Maskey destroy_loc_callback(nwam_loc_handle_t loc, void *arg)
15106ba597c5SAnurag S. Maskey {
15116ba597c5SAnurag S. Maskey 	nwam_error_t ret = nwam_loc_destroy(loc, NWAM_FLAG_DO_NOT_FREE);
15126ba597c5SAnurag S. Maskey 	return (destroy_ret(NWAM_OBJECT_TYPE_LOC, ret, loc));
15136ba597c5SAnurag S. Maskey }
15146ba597c5SAnurag S. Maskey 
15156ba597c5SAnurag S. Maskey /* ARGSUSED */
15166ba597c5SAnurag S. Maskey static int
15176ba597c5SAnurag S. Maskey destroy_enm_callback(nwam_enm_handle_t enm, void *arg)
15186ba597c5SAnurag S. Maskey {
15196ba597c5SAnurag S. Maskey 	nwam_error_t ret = nwam_enm_destroy(enm, NWAM_FLAG_DO_NOT_FREE);
15206ba597c5SAnurag S. Maskey 	return (destroy_ret(NWAM_OBJECT_TYPE_ENM, ret, enm));
15216ba597c5SAnurag S. Maskey }
15226ba597c5SAnurag S. Maskey 
15236ba597c5SAnurag S. Maskey /* ARGSUSED */
15246ba597c5SAnurag S. Maskey static int
15256ba597c5SAnurag S. Maskey destroy_wlan_callback(nwam_known_wlan_handle_t wlan, void *arg)
15266ba597c5SAnurag S. Maskey {
15276ba597c5SAnurag S. Maskey 	nwam_error_t ret = nwam_known_wlan_destroy(wlan, NWAM_FLAG_DO_NOT_FREE);
15286ba597c5SAnurag S. Maskey 	return (destroy_ret(NWAM_OBJECT_TYPE_KNOWN_WLAN, ret, wlan));
15296ba597c5SAnurag S. Maskey }
15306ba597c5SAnurag S. Maskey 
15316ba597c5SAnurag S. Maskey /*
15326ba597c5SAnurag S. Maskey  * Remove all existing configuration that are not read-only.
15336ba597c5SAnurag S. Maskey  * walk through all ncps, locs, enms, wlans and destroy each one.
15346ba597c5SAnurag S. Maskey  */
15356ba597c5SAnurag S. Maskey static nwam_error_t
15366ba597c5SAnurag S. Maskey destroy_all(void)
15376ba597c5SAnurag S. Maskey {
15386ba597c5SAnurag S. Maskey 	nwam_error_t	ret;
15396ba597c5SAnurag S. Maskey 
15406ba597c5SAnurag S. Maskey 	assert(remove_all_configurations);
15416ba597c5SAnurag S. Maskey 
15426ba597c5SAnurag S. Maskey 	ret = nwam_walk_ncps(destroy_ncp_callback, NULL, 0, NULL);
15436ba597c5SAnurag S. Maskey 	if (ret != NWAM_SUCCESS)
15446ba597c5SAnurag S. Maskey 		goto done;
15456ba597c5SAnurag S. Maskey 
15466ba597c5SAnurag S. Maskey 	ret = nwam_walk_enms(destroy_enm_callback, NULL,
15476ba597c5SAnurag S. Maskey 	    NWAM_FLAG_ACTIVATION_MODE_ALL, NULL);
15486ba597c5SAnurag S. Maskey 	if (ret != NWAM_SUCCESS)
15496ba597c5SAnurag S. Maskey 		goto done;
15506ba597c5SAnurag S. Maskey 
15516ba597c5SAnurag S. Maskey 	ret = nwam_walk_locs(destroy_loc_callback, NULL,
15526ba597c5SAnurag S. Maskey 	    NWAM_FLAG_ACTIVATION_MODE_ALL, NULL);
15536ba597c5SAnurag S. Maskey 	if (ret != NWAM_SUCCESS)
15546ba597c5SAnurag S. Maskey 		goto done;
15556ba597c5SAnurag S. Maskey 
15566ba597c5SAnurag S. Maskey 	ret = nwam_walk_known_wlans(destroy_wlan_callback, NULL, 0, NULL);
15576ba597c5SAnurag S. Maskey 	if (ret != NWAM_SUCCESS)
15586ba597c5SAnurag S. Maskey 		goto done;
15596ba597c5SAnurag S. Maskey 
15606ba597c5SAnurag S. Maskey 	if (interactive_mode)
15616ba597c5SAnurag S. Maskey 		(void) printf(gettext("All user-defined entities destroyed\n"));
15626ba597c5SAnurag S. Maskey 	remove_all_configurations = B_FALSE;
15636ba597c5SAnurag S. Maskey 
15646ba597c5SAnurag S. Maskey done:
15656ba597c5SAnurag S. Maskey 	if (ret != NWAM_SUCCESS) {
15666ba597c5SAnurag S. Maskey 		nwamerr(ret, "Destroy error: "
15676ba597c5SAnurag S. Maskey 		    "could not destroy all configurations");
15686ba597c5SAnurag S. Maskey 	}
15696ba597c5SAnurag S. Maskey 	return (ret);
15706ba597c5SAnurag S. Maskey }
15716ba597c5SAnurag S. Maskey 
15726ba597c5SAnurag S. Maskey /*
15736ba597c5SAnurag S. Maskey  * Destroys an instance in persistent repository, and is permanent.
15746ba597c5SAnurag S. Maskey  * If interactive mode, it is allowed at global scope only
15756ba597c5SAnurag S. Maskey  * option -a destroys everything.
15766ba597c5SAnurag S. Maskey  */
15776ba597c5SAnurag S. Maskey void
15786ba597c5SAnurag S. Maskey destroy_func(cmd_t *cmd)
15796ba597c5SAnurag S. Maskey {
15806ba597c5SAnurag S. Maskey 	nwam_error_t	ret;
15816ba597c5SAnurag S. Maskey 	char		*name, *realname = NULL;
15826ba597c5SAnurag S. Maskey 
15836ba597c5SAnurag S. Maskey 	if (current_scope == NWAM_SCOPE_NCP &&
15846ba597c5SAnurag S. Maskey 	    (cmd->cmd_res1_type == RT1_ENM || cmd->cmd_res1_type == RT1_LOC ||
15856ba597c5SAnurag S. Maskey 	    cmd->cmd_res1_type == RT1_WLAN)) {
15866ba597c5SAnurag S. Maskey 		nerr("Destroy error: only NCUs can be destroyed in NCP scope");
15876ba597c5SAnurag S. Maskey 		return;
15886ba597c5SAnurag S. Maskey 	}
15896ba597c5SAnurag S. Maskey 
15906ba597c5SAnurag S. Maskey 	assert(cmd->cmd_argc > 0);
15916ba597c5SAnurag S. Maskey 
15926ba597c5SAnurag S. Maskey 	/* res1_type is -1 if -a flag is used */
15936ba597c5SAnurag S. Maskey 	if (cmd->cmd_res1_type == -1) {
15946ba597c5SAnurag S. Maskey 		int c;
15956ba597c5SAnurag S. Maskey 
15966ba597c5SAnurag S. Maskey 		if (current_scope != NWAM_SCOPE_GBL) {
15976ba597c5SAnurag S. Maskey 			nerr("Cannot destroy all configurations in a "
15986ba597c5SAnurag S. Maskey 			    "non-global scope");
15996ba597c5SAnurag S. Maskey 			return;
16006ba597c5SAnurag S. Maskey 		}
16016ba597c5SAnurag S. Maskey 
16026ba597c5SAnurag S. Maskey 		optind = 0;
16036ba597c5SAnurag S. Maskey 		while ((c = getopt(cmd->cmd_argc, cmd->cmd_argv, "a")) != EOF) {
16046ba597c5SAnurag S. Maskey 			switch (c) {
16056ba597c5SAnurag S. Maskey 			case 'a':
16066ba597c5SAnurag S. Maskey 				remove_all_configurations = B_TRUE;
16076ba597c5SAnurag S. Maskey 				break;
16086ba597c5SAnurag S. Maskey 			default:
16096ba597c5SAnurag S. Maskey 				command_usage(CMD_DESTROY);
16106ba597c5SAnurag S. Maskey 				return;
16116ba597c5SAnurag S. Maskey 			}
16126ba597c5SAnurag S. Maskey 		}
16136ba597c5SAnurag S. Maskey 		if (remove_all_configurations) {
16146ba597c5SAnurag S. Maskey 			(void) destroy_all();
16156ba597c5SAnurag S. Maskey 			return;
16166ba597c5SAnurag S. Maskey 		}
16176ba597c5SAnurag S. Maskey 	}
16186ba597c5SAnurag S. Maskey 
16196ba597c5SAnurag S. Maskey 	/* argv[0] is name */
16206ba597c5SAnurag S. Maskey 	name = trim_quotes(cmd->cmd_argv[0]);
16216ba597c5SAnurag S. Maskey 	if (cmd->cmd_res2_type == RT2_NCU) {
16226ba597c5SAnurag S. Maskey 		nwam_ncu_type_t		ncu_type;
16236ba597c5SAnurag S. Maskey 		nwam_ncu_class_t	ncu_class;
16246ba597c5SAnurag S. Maskey 
16256ba597c5SAnurag S. Maskey 		/* ncp must already be read */
16266ba597c5SAnurag S. Maskey 		if (ncp_h == NULL) {
16276ba597c5SAnurag S. Maskey 			nerr("Destroy ncu error: NCP has not been read");
16286ba597c5SAnurag S. Maskey 			return;
16296ba597c5SAnurag S. Maskey 		}
16306ba597c5SAnurag S. Maskey 		ncu_class = (nwam_ncu_class_t)cmd->cmd_ncu_class_type;
16316ba597c5SAnurag S. Maskey 		ncu_type = nwam_ncu_class_to_type(ncu_class);
16326ba597c5SAnurag S. Maskey 		ret = nwam_ncu_read(ncp_h, name, ncu_type, 0, &ncu_h);
16336ba597c5SAnurag S. Maskey 		if (ret != NWAM_SUCCESS)
16346ba597c5SAnurag S. Maskey 			goto done;
16356ba597c5SAnurag S. Maskey 		(void) object_name_from_handle(NWAM_OBJECT_TYPE_NCU, ncu_h,
16366ba597c5SAnurag S. Maskey 		    &realname);
16376ba597c5SAnurag S. Maskey 		ret = nwam_ncu_destroy(ncu_h, 0);
16386ba597c5SAnurag S. Maskey 		ncu_h = NULL;
16396ba597c5SAnurag S. Maskey 	} else if (cmd->cmd_res1_type == RT1_ENM) {
16406ba597c5SAnurag S. Maskey 		if ((ret = nwam_enm_read(name, 0, &enm_h)) != NWAM_SUCCESS)
16416ba597c5SAnurag S. Maskey 			goto done;
16426ba597c5SAnurag S. Maskey 		(void) object_name_from_handle(NWAM_OBJECT_TYPE_ENM, enm_h,
16436ba597c5SAnurag S. Maskey 		    &realname);
16446ba597c5SAnurag S. Maskey 		ret = nwam_enm_destroy(enm_h, 0);
16456ba597c5SAnurag S. Maskey 		enm_h = NULL;
16466ba597c5SAnurag S. Maskey 	} else if (cmd->cmd_res1_type == RT1_LOC) {
16476ba597c5SAnurag S. Maskey 		if ((ret = nwam_loc_read(name, 0, &loc_h)) != NWAM_SUCCESS)
16486ba597c5SAnurag S. Maskey 			goto done;
16496ba597c5SAnurag S. Maskey 		(void) object_name_from_handle(NWAM_OBJECT_TYPE_LOC, loc_h,
16506ba597c5SAnurag S. Maskey 		    &realname);
16516ba597c5SAnurag S. Maskey 		ret = nwam_loc_destroy(loc_h, 0);
16526ba597c5SAnurag S. Maskey 		loc_h = NULL;
16536ba597c5SAnurag S. Maskey 	} else if (cmd->cmd_res1_type == RT1_WLAN) {
16546ba597c5SAnurag S. Maskey 		if ((ret = nwam_known_wlan_read(name, 0, &wlan_h))
16556ba597c5SAnurag S. Maskey 		    != NWAM_SUCCESS)
16566ba597c5SAnurag S. Maskey 			goto done;
16576ba597c5SAnurag S. Maskey 		(void) object_name_from_handle(NWAM_OBJECT_TYPE_KNOWN_WLAN,
16586ba597c5SAnurag S. Maskey 		    wlan_h, &realname);
16596ba597c5SAnurag S. Maskey 		ret = nwam_known_wlan_destroy(wlan_h, 0);
16606ba597c5SAnurag S. Maskey 		wlan_h = NULL;
16616ba597c5SAnurag S. Maskey 	} else if (cmd->cmd_res1_type == RT1_NCP) {
16626ba597c5SAnurag S. Maskey 		if ((ret = nwam_ncp_read(name, 0, &ncp_h)) != NWAM_SUCCESS)
16636ba597c5SAnurag S. Maskey 			goto done;
16646ba597c5SAnurag S. Maskey 		(void) object_name_from_handle(NWAM_OBJECT_TYPE_NCP, ncp_h,
16656ba597c5SAnurag S. Maskey 		    &realname);
16666ba597c5SAnurag S. Maskey 		ret = nwam_ncp_destroy(ncp_h, 0);
16676ba597c5SAnurag S. Maskey 		ncp_h = NULL;
16686ba597c5SAnurag S. Maskey 	} else {
16696ba597c5SAnurag S. Maskey 		nerr("Destroy error: unknown object-type");
16706ba597c5SAnurag S. Maskey 	}
16716ba597c5SAnurag S. Maskey 
16726ba597c5SAnurag S. Maskey done:
16736ba597c5SAnurag S. Maskey 	if (ret == NWAM_ENTITY_IN_USE)  {
16746ba597c5SAnurag S. Maskey 		nerr("Destroy error: active entity cannot be destroyed");
16756ba597c5SAnurag S. Maskey 	} else if (ret != NWAM_SUCCESS) {
16766ba597c5SAnurag S. Maskey 		nwamerr(ret, "Destroy error");
16776ba597c5SAnurag S. Maskey 	} else if (interactive_mode) {
16786ba597c5SAnurag S. Maskey 		(void) printf(gettext("Destroyed %s '%s'\n"),
16796ba597c5SAnurag S. Maskey 		    (cmd->cmd_res2_type == RT2_NCU ?
16806ba597c5SAnurag S. Maskey 		    rt2_to_str(cmd->cmd_res2_type) :
16816ba597c5SAnurag S. Maskey 		    rt1_to_str(cmd->cmd_res1_type)),
16826ba597c5SAnurag S. Maskey 		    realname != NULL ? realname : name);
16836ba597c5SAnurag S. Maskey 	}
16846ba597c5SAnurag S. Maskey 	free(name);
16856ba597c5SAnurag S. Maskey 	free(realname);
16866ba597c5SAnurag S. Maskey }
16876ba597c5SAnurag S. Maskey 
16886ba597c5SAnurag S. Maskey /*
16896ba597c5SAnurag S. Maskey  * End operation on current scope and go up one scope.
16906ba597c5SAnurag S. Maskey  * Changes are saved.
16916ba597c5SAnurag S. Maskey  */
16926ba597c5SAnurag S. Maskey /* ARGSUSED */
16936ba597c5SAnurag S. Maskey void
16946ba597c5SAnurag S. Maskey end_func(cmd_t *cmd)
16956ba597c5SAnurag S. Maskey {
16966ba597c5SAnurag S. Maskey 	/* if need_to_commit is set, commit changes */
16976ba597c5SAnurag S. Maskey 	if (need_to_commit)
16986ba597c5SAnurag S. Maskey 		do_commit();
16996ba597c5SAnurag S. Maskey 
17006ba597c5SAnurag S. Maskey 	/*
17016ba597c5SAnurag S. Maskey 	 * Call do_cancel() to go up one scope.  If commit fails,
17026ba597c5SAnurag S. Maskey 	 * need_to_commit is not reset and users are asked if they want to end.
17036ba597c5SAnurag S. Maskey 	 */
17046ba597c5SAnurag S. Maskey 	if (!need_to_commit ||
17056ba597c5SAnurag S. Maskey 	    (need_to_commit && (ask_yesno(B_FALSE,
17066ba597c5SAnurag S. Maskey 	    "Configuration not saved; really end")) == 1)) {
17076ba597c5SAnurag S. Maskey 		/* set time_to_exit if in global scope */
17086ba597c5SAnurag S. Maskey 		if (current_scope == NWAM_SCOPE_GBL)
17096ba597c5SAnurag S. Maskey 			time_to_exit = B_TRUE;
17106ba597c5SAnurag S. Maskey 		/* call do_cancel() to go up one scope */
17116ba597c5SAnurag S. Maskey 		do_cancel();
17126ba597c5SAnurag S. Maskey 	}
17136ba597c5SAnurag S. Maskey }
17146ba597c5SAnurag S. Maskey 
17156ba597c5SAnurag S. Maskey /*
17166ba597c5SAnurag S. Maskey  * Exit immediately.  Configuration changes are saved by calling end_func().
17176ba597c5SAnurag S. Maskey  */
17186ba597c5SAnurag S. Maskey /* ARGSUSED */
17196ba597c5SAnurag S. Maskey void
17206ba597c5SAnurag S. Maskey exit_func(cmd_t *cmd)
17216ba597c5SAnurag S. Maskey {
17226ba597c5SAnurag S. Maskey 	cmd_t *end_cmd;
17236ba597c5SAnurag S. Maskey 
17246ba597c5SAnurag S. Maskey 	if (need_to_commit) {
17256ba597c5SAnurag S. Maskey 		if ((end_cmd = alloc_cmd()) == NULL) {
17266ba597c5SAnurag S. Maskey 			nerr("Exit error");
17276ba597c5SAnurag S. Maskey 			return;
17286ba597c5SAnurag S. Maskey 		}
17296ba597c5SAnurag S. Maskey 		end_func(end_cmd);
17306ba597c5SAnurag S. Maskey 		free_cmd(end_cmd);
17316ba597c5SAnurag S. Maskey 	}
17326ba597c5SAnurag S. Maskey 
17336ba597c5SAnurag S. Maskey 	/*
17346ba597c5SAnurag S. Maskey 	 * If need_to_commit is still set, then the commit failed.
17356ba597c5SAnurag S. Maskey 	 * Otherwise, exit.
17366ba597c5SAnurag S. Maskey 	 */
17376ba597c5SAnurag S. Maskey 	if (!need_to_commit)
17386ba597c5SAnurag S. Maskey 		time_to_exit = B_TRUE;
17396ba597c5SAnurag S. Maskey }
17406ba597c5SAnurag S. Maskey 
17416ba597c5SAnurag S. Maskey void
17426ba597c5SAnurag S. Maskey help_func(cmd_t *cmd)
17436ba597c5SAnurag S. Maskey {
17446ba597c5SAnurag S. Maskey 	int i;
17456ba597c5SAnurag S. Maskey 
17466ba597c5SAnurag S. Maskey 	if (cmd->cmd_argc == 0) {
17476ba597c5SAnurag S. Maskey 		(void) printf(gettext("commands:\n"));
17486ba597c5SAnurag S. Maskey 		for (i = CMD_MIN; i <= CMD_MAX; i++)
17496ba597c5SAnurag S. Maskey 			(void) printf("\t%s\n", helptab[i].cmd_usage);
17506ba597c5SAnurag S. Maskey 		return;
17516ba597c5SAnurag S. Maskey 	}
17526ba597c5SAnurag S. Maskey 
17536ba597c5SAnurag S. Maskey 	for (i = CMD_MIN; i <= CMD_MAX; i++) {
17546ba597c5SAnurag S. Maskey 		if (strcmp(cmd->cmd_argv[0], cmd_to_str(i)) == 0) {
17556ba597c5SAnurag S. Maskey 			long_usage(i);
17566ba597c5SAnurag S. Maskey 			return;
17576ba597c5SAnurag S. Maskey 		}
17586ba597c5SAnurag S. Maskey 	}
17596ba597c5SAnurag S. Maskey 	(void) fprintf(stderr, gettext("Unknown command: '%s'\n"),
17606ba597c5SAnurag S. Maskey 	    cmd->cmd_argv[0]);
17616ba597c5SAnurag S. Maskey 	help_wrap();
17626ba597c5SAnurag S. Maskey }
17636ba597c5SAnurag S. Maskey 
17646ba597c5SAnurag S. Maskey /*
17656ba597c5SAnurag S. Maskey  * Revert configuration of an instance to latest previous version.
17666ba597c5SAnurag S. Maskey  * Free the handle and read again.
17676ba597c5SAnurag S. Maskey  */
17686ba597c5SAnurag S. Maskey /* ARGSUSED */
17696ba597c5SAnurag S. Maskey void
17706ba597c5SAnurag S. Maskey revert_func(cmd_t *cmd)
17716ba597c5SAnurag S. Maskey {
17726ba597c5SAnurag S. Maskey 	nwam_error_t		ret;
17736ba597c5SAnurag S. Maskey 	char			*name = NULL;
17746ba597c5SAnurag S. Maskey 	nwam_ncu_type_t		ncu_type;
1775*3290ae84SAnurag S. Maskey 	nwam_object_type_t	object_type = active_object_type();
17766ba597c5SAnurag S. Maskey 
1777*3290ae84SAnurag S. Maskey 	switch (object_type) {
17786ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_NCU:
17796ba597c5SAnurag S. Maskey 		/* retrieve name and type to use later */
17806ba597c5SAnurag S. Maskey 		if ((ret = nwam_ncu_get_ncu_type(ncu_h, &ncu_type))
17816ba597c5SAnurag S. Maskey 		    != NWAM_SUCCESS) {
17826ba597c5SAnurag S. Maskey 			nwamerr(ret, "Revert error: Get ncu type error");
17836ba597c5SAnurag S. Maskey 			return;
17846ba597c5SAnurag S. Maskey 		}
17856ba597c5SAnurag S. Maskey 		if ((ret = nwam_ncu_get_name(ncu_h, &name)) != NWAM_SUCCESS)
17866ba597c5SAnurag S. Maskey 			goto name_error;
17876ba597c5SAnurag S. Maskey 		nwam_ncu_free(ncu_h);
17886ba597c5SAnurag S. Maskey 		ncu_h = NULL;
17896ba597c5SAnurag S. Maskey 		ret = nwam_ncu_read(ncp_h, name, ncu_type, 0, &ncu_h);
17906ba597c5SAnurag S. Maskey 		break;
17916ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_ENM:
17926ba597c5SAnurag S. Maskey 		if ((ret = nwam_enm_get_name(enm_h, &name)) != NWAM_SUCCESS)
17936ba597c5SAnurag S. Maskey 			goto name_error;
17946ba597c5SAnurag S. Maskey 		nwam_enm_free(enm_h);
17956ba597c5SAnurag S. Maskey 		enm_h = NULL;
17966ba597c5SAnurag S. Maskey 		ret = nwam_enm_read(name, 0, &enm_h);
17976ba597c5SAnurag S. Maskey 		break;
17986ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_LOC:
17996ba597c5SAnurag S. Maskey 		if ((ret = nwam_loc_get_name(loc_h, &name)) != NWAM_SUCCESS)
18006ba597c5SAnurag S. Maskey 			goto name_error;
18016ba597c5SAnurag S. Maskey 		nwam_loc_free(loc_h);
18026ba597c5SAnurag S. Maskey 		loc_h = NULL;
18036ba597c5SAnurag S. Maskey 		ret = nwam_loc_read(name, 0, &loc_h);
18046ba597c5SAnurag S. Maskey 		break;
18056ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_KNOWN_WLAN:
18066ba597c5SAnurag S. Maskey 		if ((ret = nwam_known_wlan_get_name(wlan_h, &name))
18076ba597c5SAnurag S. Maskey 		    != NWAM_SUCCESS)
18086ba597c5SAnurag S. Maskey 			goto name_error;
18096ba597c5SAnurag S. Maskey 		nwam_known_wlan_free(wlan_h);
18106ba597c5SAnurag S. Maskey 		wlan_h = NULL;
18116ba597c5SAnurag S. Maskey 		ret = nwam_known_wlan_read(name, 0, &wlan_h);
18126ba597c5SAnurag S. Maskey 		break;
18136ba597c5SAnurag S. Maskey 	}
18146ba597c5SAnurag S. Maskey 
18156ba597c5SAnurag S. Maskey 	/* Exit this scope because handle already freed (call do_cancel()) */
18166ba597c5SAnurag S. Maskey 	need_to_commit = B_FALSE;
1817*3290ae84SAnurag S. Maskey 
18186ba597c5SAnurag S. Maskey 	if (ret != NWAM_SUCCESS) {
1819*3290ae84SAnurag S. Maskey 		if (ret == NWAM_ENTITY_NOT_FOUND) {
1820*3290ae84SAnurag S. Maskey 			nerr("%s '%s' does not exist to revert to, removing it",
1821*3290ae84SAnurag S. Maskey 			    nwam_object_type_to_string(object_type), name);
1822*3290ae84SAnurag S. Maskey 		} else {
18236ba597c5SAnurag S. Maskey 			nwamerr(ret, "Revert error");
1824*3290ae84SAnurag S. Maskey 		}
18256ba597c5SAnurag S. Maskey 		do_cancel();
18266ba597c5SAnurag S. Maskey 	}
1827*3290ae84SAnurag S. Maskey 	free(name);
18286ba597c5SAnurag S. Maskey 	return;
18296ba597c5SAnurag S. Maskey 
18306ba597c5SAnurag S. Maskey name_error:
18316ba597c5SAnurag S. Maskey 	if (ret != NWAM_SUCCESS)
18326ba597c5SAnurag S. Maskey 		nwamerr(ret, "Revert error: get name error");
18336ba597c5SAnurag S. Maskey }
18346ba597c5SAnurag S. Maskey 
18356ba597c5SAnurag S. Maskey /*
18366ba597c5SAnurag S. Maskey  * Load a resource from persistent repository and enter the scope
18376ba597c5SAnurag S. Maskey  * of that resource.
18386ba597c5SAnurag S. Maskey  */
18396ba597c5SAnurag S. Maskey void
18406ba597c5SAnurag S. Maskey select_func(cmd_t *cmd)
18416ba597c5SAnurag S. Maskey {
18426ba597c5SAnurag S. Maskey 	nwam_error_t	ret;
18436ba597c5SAnurag S. Maskey 	char		*name, *realname = NULL;
18446ba597c5SAnurag S. Maskey 
18456ba597c5SAnurag S. Maskey 	assert(cmd->cmd_argc > 0);
18466ba597c5SAnurag S. Maskey 	if (current_scope == NWAM_SCOPE_NCP && cmd->cmd_res2_type != RT2_NCU) {
18476ba597c5SAnurag S. Maskey 		nerr("cannot select '%s' at this scope",
18486ba597c5SAnurag S. Maskey 		    rt1_to_str(cmd->cmd_res1_type));
18496ba597c5SAnurag S. Maskey 		return;
18506ba597c5SAnurag S. Maskey 	}
18516ba597c5SAnurag S. Maskey 
18526ba597c5SAnurag S. Maskey 	/* argv[0] is name */
18536ba597c5SAnurag S. Maskey 	name = trim_quotes(cmd->cmd_argv[0]);
18546ba597c5SAnurag S. Maskey 	switch (cmd->cmd_res1_type) {
18556ba597c5SAnurag S. Maskey 	case RT1_LOC:
18566ba597c5SAnurag S. Maskey 		ret = nwam_loc_read(name, 0, &loc_h);
18576ba597c5SAnurag S. Maskey 		if (ret == NWAM_SUCCESS) {
18586ba597c5SAnurag S. Maskey 			current_scope = NWAM_SCOPE_LOC;
18596ba597c5SAnurag S. Maskey 			(void) object_name_from_handle(NWAM_OBJECT_TYPE_LOC,
18606ba597c5SAnurag S. Maskey 			    loc_h, &realname);
18616ba597c5SAnurag S. Maskey 		}
18626ba597c5SAnurag S. Maskey 		break;
18636ba597c5SAnurag S. Maskey 	case RT1_ENM:
18646ba597c5SAnurag S. Maskey 		ret = nwam_enm_read(name, 0, &enm_h);
18656ba597c5SAnurag S. Maskey 		if (ret == NWAM_SUCCESS) {
18666ba597c5SAnurag S. Maskey 			current_scope = NWAM_SCOPE_ENM;
18676ba597c5SAnurag S. Maskey 			(void) object_name_from_handle(NWAM_OBJECT_TYPE_ENM,
18686ba597c5SAnurag S. Maskey 			    enm_h, &realname);
18696ba597c5SAnurag S. Maskey 		}
18706ba597c5SAnurag S. Maskey 		break;
18716ba597c5SAnurag S. Maskey 	case RT1_WLAN:
18726ba597c5SAnurag S. Maskey 		ret = nwam_known_wlan_read(name, 0, &wlan_h);
18736ba597c5SAnurag S. Maskey 		if (ret == NWAM_SUCCESS) {
18746ba597c5SAnurag S. Maskey 			current_scope = NWAM_SCOPE_WLAN;
18756ba597c5SAnurag S. Maskey 			(void) object_name_from_handle
18766ba597c5SAnurag S. Maskey 			    (NWAM_OBJECT_TYPE_KNOWN_WLAN, wlan_h, &realname);
18776ba597c5SAnurag S. Maskey 		}
18786ba597c5SAnurag S. Maskey 		break;
18796ba597c5SAnurag S. Maskey 	case RT1_NCP:
18806ba597c5SAnurag S. Maskey 		if (cmd->cmd_res2_type == RT2_NCU) {
18816ba597c5SAnurag S. Maskey 			nwam_ncu_type_t		ncu_type;
18826ba597c5SAnurag S. Maskey 			nwam_ncu_class_t	ncu_class;
18836ba597c5SAnurag S. Maskey 
18846ba597c5SAnurag S. Maskey 			/* ncp must already be read */
18856ba597c5SAnurag S. Maskey 			if (ncp_h == NULL) {
18866ba597c5SAnurag S. Maskey 				nerr("Select error: NCP has not been read");
18876ba597c5SAnurag S. Maskey 				free(name);
18886ba597c5SAnurag S. Maskey 				return;
18896ba597c5SAnurag S. Maskey 			}
18906ba597c5SAnurag S. Maskey 			ncu_class = (nwam_ncu_class_t)cmd->cmd_ncu_class_type;
18916ba597c5SAnurag S. Maskey 			ncu_type = nwam_ncu_class_to_type(ncu_class);
18926ba597c5SAnurag S. Maskey 			ret = nwam_ncu_read(ncp_h, name, ncu_type, 0, &ncu_h);
18936ba597c5SAnurag S. Maskey 			if (ret == NWAM_SUCCESS) {
18946ba597c5SAnurag S. Maskey 				current_scope = NWAM_SCOPE_NCU;
18956ba597c5SAnurag S. Maskey 				(void) object_name_from_handle
18966ba597c5SAnurag S. Maskey 				    (NWAM_OBJECT_TYPE_NCU, ncu_h, &realname);
18976ba597c5SAnurag S. Maskey 			}
18986ba597c5SAnurag S. Maskey 		} else {
18996ba597c5SAnurag S. Maskey 			ret = nwam_ncp_read(name, 0, &ncp_h);
19006ba597c5SAnurag S. Maskey 			if (ret == NWAM_SUCCESS) {
19016ba597c5SAnurag S. Maskey 				current_scope = NWAM_SCOPE_NCP;
19026ba597c5SAnurag S. Maskey 				(void) object_name_from_handle
19036ba597c5SAnurag S. Maskey 				    (NWAM_OBJECT_TYPE_NCP, ncp_h, &realname);
19046ba597c5SAnurag S. Maskey 			}
19056ba597c5SAnurag S. Maskey 		}
19066ba597c5SAnurag S. Maskey 		break;
19076ba597c5SAnurag S. Maskey 	default:
19086ba597c5SAnurag S. Maskey 		nerr("Select error: unknown object-type");
19096ba597c5SAnurag S. Maskey 		free(name);
19106ba597c5SAnurag S. Maskey 		return;
19116ba597c5SAnurag S. Maskey 	}
19126ba597c5SAnurag S. Maskey 
19136ba597c5SAnurag S. Maskey 	if (ret != NWAM_SUCCESS) {
19146ba597c5SAnurag S. Maskey 		nwamerr(ret, "Select error");
19156ba597c5SAnurag S. Maskey 	} else {
19166ba597c5SAnurag S. Maskey 		/* set the obj*_name or obj*_type depending on current scope */
19176ba597c5SAnurag S. Maskey 		if (current_scope == NWAM_SCOPE_NCU) {
19186ba597c5SAnurag S. Maskey 			obj2_type = RT2_NCU;
19196ba597c5SAnurag S. Maskey 			(void) strlcpy(obj2_name,
19206ba597c5SAnurag S. Maskey 			    realname != NULL ? realname : name,
19216ba597c5SAnurag S. Maskey 			    sizeof (obj2_name));
19226ba597c5SAnurag S. Maskey 		} else {
19236ba597c5SAnurag S. Maskey 			(void) strlcpy(obj1_name,
19246ba597c5SAnurag S. Maskey 			    realname != NULL ? realname : name,
19256ba597c5SAnurag S. Maskey 			    sizeof (obj1_name));
19266ba597c5SAnurag S. Maskey 			obj1_type = cmd->cmd_res1_type;
19276ba597c5SAnurag S. Maskey 		}
19286ba597c5SAnurag S. Maskey 	}
19296ba597c5SAnurag S. Maskey 	free(name);
19306ba597c5SAnurag S. Maskey 	free(realname);
19316ba597c5SAnurag S. Maskey }
19326ba597c5SAnurag S. Maskey 
19336ba597c5SAnurag S. Maskey /* Given an int for prop, returns it as string */
19346ba597c5SAnurag S. Maskey static const char *
19356ba597c5SAnurag S. Maskey pt_to_prop_name(nwam_object_type_t object_type, int pt_type)
19366ba597c5SAnurag S. Maskey {
19376ba597c5SAnurag S. Maskey 	int i;
19386ba597c5SAnurag S. Maskey 	prop_table_entry_t *prop_table = get_prop_table(object_type);
19396ba597c5SAnurag S. Maskey 
19406ba597c5SAnurag S. Maskey 	for (i = 0; prop_table[i].pte_name != NULL; i++) {
19416ba597c5SAnurag S. Maskey 		if (pt_type == prop_table[i].pte_type)
19426ba597c5SAnurag S. Maskey 			return (prop_table[i].pte_name);
19436ba597c5SAnurag S. Maskey 	}
19446ba597c5SAnurag S. Maskey 	return (NULL);
19456ba597c5SAnurag S. Maskey }
19466ba597c5SAnurag S. Maskey 
19476ba597c5SAnurag S. Maskey /* Given a prop as a string, returns it as an int */
19486ba597c5SAnurag S. Maskey static int
19496ba597c5SAnurag S. Maskey prop_to_pt(nwam_object_type_t object_type, const char *prop)
19506ba597c5SAnurag S. Maskey {
19516ba597c5SAnurag S. Maskey 	int i;
19526ba597c5SAnurag S. Maskey 	prop_table_entry_t *prop_table = get_prop_table(object_type);
19536ba597c5SAnurag S. Maskey 
19546ba597c5SAnurag S. Maskey 	for (i = 0; prop_table[i].pte_name != NULL; i++) {
19556ba597c5SAnurag S. Maskey 		if (strcmp(prop, prop_table[i].pte_name) == 0)
19566ba597c5SAnurag S. Maskey 			return (prop_table[i].pte_type);
19576ba597c5SAnurag S. Maskey 	}
19586ba597c5SAnurag S. Maskey 	return (-1);
19596ba597c5SAnurag S. Maskey }
19606ba597c5SAnurag S. Maskey 
19616ba597c5SAnurag S. Maskey /* Given a prop as an int, returns its type (nwam_value_type_t) */
19626ba597c5SAnurag S. Maskey static nwam_value_type_t
19636ba597c5SAnurag S. Maskey prop_value_type(nwam_object_type_t object_type, const char *prop)
19646ba597c5SAnurag S. Maskey {
19656ba597c5SAnurag S. Maskey 	nwam_error_t		ret;
19666ba597c5SAnurag S. Maskey 	nwam_value_type_t	value_type;
19676ba597c5SAnurag S. Maskey 
19686ba597c5SAnurag S. Maskey 	switch (object_type) {
19696ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_NCU:
19706ba597c5SAnurag S. Maskey 		ret = nwam_ncu_get_prop_type(prop, &value_type);
19716ba597c5SAnurag S. Maskey 		break;
19726ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_LOC:
19736ba597c5SAnurag S. Maskey 		ret = nwam_loc_get_prop_type(prop, &value_type);
19746ba597c5SAnurag S. Maskey 		break;
19756ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_ENM:
19766ba597c5SAnurag S. Maskey 		ret = nwam_enm_get_prop_type(prop, &value_type);
19776ba597c5SAnurag S. Maskey 		break;
19786ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_KNOWN_WLAN:
19796ba597c5SAnurag S. Maskey 		ret = nwam_known_wlan_get_prop_type(prop, &value_type);
19806ba597c5SAnurag S. Maskey 		break;
19816ba597c5SAnurag S. Maskey 	}
19826ba597c5SAnurag S. Maskey 
19836ba597c5SAnurag S. Maskey 	if (ret != NWAM_SUCCESS)
19846ba597c5SAnurag S. Maskey 		value_type = NWAM_VALUE_TYPE_UNKNOWN;
19856ba597c5SAnurag S. Maskey 
19866ba597c5SAnurag S. Maskey 	return (value_type);
19876ba597c5SAnurag S. Maskey }
19886ba597c5SAnurag S. Maskey 
19896ba597c5SAnurag S. Maskey /*
19906ba597c5SAnurag S. Maskey  * Converts input_str to an array nwam_value.
19916ba597c5SAnurag S. Maskey  * If is_list_prop, break input_str into array of strings first.
19926ba597c5SAnurag S. Maskey  */
19936ba597c5SAnurag S. Maskey static nwam_value_t
19946ba597c5SAnurag S. Maskey str_to_nwam_value(nwam_object_type_t object_type, char *input_str, int pt_type,
19956ba597c5SAnurag S. Maskey     boolean_t is_list_prop)
19966ba597c5SAnurag S. Maskey {
19976ba597c5SAnurag S. Maskey 	int		i, n = 0, ret;
19986ba597c5SAnurag S. Maskey 	nwam_value_t	data;
19996ba597c5SAnurag S. Maskey 	char		**val;
20006ba597c5SAnurag S. Maskey 	int		max_str_num;
20016ba597c5SAnurag S. Maskey 
20026ba597c5SAnurag S. Maskey 	nwam_value_type_t	value_type;
20036ba597c5SAnurag S. Maskey 	int64_t			*int_vals;
20046ba597c5SAnurag S. Maskey 	uint64_t		*uint_vals;
20056ba597c5SAnurag S. Maskey 	boolean_t		*boolean_vals;
20066ba597c5SAnurag S. Maskey 
20076ba597c5SAnurag S. Maskey 	/*
20086ba597c5SAnurag S. Maskey 	 * Worst case is that each char separated by DELIMITER, so the
20096ba597c5SAnurag S. Maskey 	 * max number of sub strings is half of string length + 1.
20106ba597c5SAnurag S. Maskey 	 */
20116ba597c5SAnurag S. Maskey 	max_str_num = strlen(input_str) / 2 + 1;
20126ba597c5SAnurag S. Maskey 
20136ba597c5SAnurag S. Maskey 	val = calloc(max_str_num, sizeof (char *));
20146ba597c5SAnurag S. Maskey 	if (val == NULL) {
20156ba597c5SAnurag S. Maskey 		nerr("Out of memory");
20166ba597c5SAnurag S. Maskey 		return (NULL);
20176ba597c5SAnurag S. Maskey 	}
20186ba597c5SAnurag S. Maskey 
20196ba597c5SAnurag S. Maskey 	if (is_list_prop) {
20206ba597c5SAnurag S. Maskey 		char *tmp, *next;
20216ba597c5SAnurag S. Maskey 		/*
20226ba597c5SAnurag S. Maskey 		 * Break down input_str and save as array of sub strings.
20236ba597c5SAnurag S. Maskey 		 * Set num as the number of the sub strings.
20246ba597c5SAnurag S. Maskey 		 * Use nwam_tokenize_by_unescaped_delim() rather than strtok()
20256ba597c5SAnurag S. Maskey 		 * because DELIMITER may be escaped
20266ba597c5SAnurag S. Maskey 		 */
20276ba597c5SAnurag S. Maskey 		tmp = (char *)input_str;
20286ba597c5SAnurag S. Maskey 		while ((tmp = nwam_tokenize_by_unescaped_delim(tmp,
20296ba597c5SAnurag S. Maskey 		    NWAM_VALUE_DELIMITER_CHAR, &next)) != NULL) {
20306ba597c5SAnurag S. Maskey 			val[n++] = trim_quotes(tmp);
20316ba597c5SAnurag S. Maskey 			tmp = next;
20326ba597c5SAnurag S. Maskey 		}
20336ba597c5SAnurag S. Maskey 	} else {
20346ba597c5SAnurag S. Maskey 		val[n++] = trim_quotes(input_str);
20356ba597c5SAnurag S. Maskey 	}
20366ba597c5SAnurag S. Maskey 
20376ba597c5SAnurag S. Maskey 	/* initialize int_vals or booleans_vals depending on pt_type */
20386ba597c5SAnurag S. Maskey 	value_type = prop_value_type(object_type,
20396ba597c5SAnurag S. Maskey 	    pt_to_prop_name(object_type, pt_type));
20406ba597c5SAnurag S. Maskey 	if (value_type == NWAM_VALUE_TYPE_INT64) {
20416ba597c5SAnurag S. Maskey 		int_vals = calloc(n, sizeof (int64_t));
20426ba597c5SAnurag S. Maskey 		if (int_vals == NULL) {
20436ba597c5SAnurag S. Maskey 			nerr("Out of memory");
20446ba597c5SAnurag S. Maskey 			array_free((void **)val, max_str_num);
20456ba597c5SAnurag S. Maskey 			return (NULL);
20466ba597c5SAnurag S. Maskey 		}
20476ba597c5SAnurag S. Maskey 	} else if (value_type == NWAM_VALUE_TYPE_UINT64) {
20486ba597c5SAnurag S. Maskey 		uint_vals = calloc(n, sizeof (uint64_t));
20496ba597c5SAnurag S. Maskey 		if (uint_vals == NULL) {
20506ba597c5SAnurag S. Maskey 			nerr("Out of memory");
20516ba597c5SAnurag S. Maskey 			array_free((void **)val, max_str_num);
20526ba597c5SAnurag S. Maskey 			return (NULL);
20536ba597c5SAnurag S. Maskey 		}
20546ba597c5SAnurag S. Maskey 	} else if (value_type == NWAM_VALUE_TYPE_BOOLEAN) {
20556ba597c5SAnurag S. Maskey 		boolean_vals = calloc(n, sizeof (boolean_t));
20566ba597c5SAnurag S. Maskey 		if (boolean_vals == NULL) {
20576ba597c5SAnurag S. Maskey 			nerr("Out of memory");
20586ba597c5SAnurag S. Maskey 			array_free((void **)val, max_str_num);
20596ba597c5SAnurag S. Maskey 			return (NULL);
20606ba597c5SAnurag S. Maskey 		}
20616ba597c5SAnurag S. Maskey 	}
20626ba597c5SAnurag S. Maskey 	/* set the appropriate array */
20636ba597c5SAnurag S. Maskey 	for (i = 0; i < n; i++) {
20646ba597c5SAnurag S. Maskey 		switch (value_type) {
20656ba597c5SAnurag S. Maskey 		case NWAM_VALUE_TYPE_STRING:
20666ba597c5SAnurag S. Maskey 			/* nothing to do - val already has the char** array */
20676ba597c5SAnurag S. Maskey 			break;
20686ba597c5SAnurag S. Maskey 		case NWAM_VALUE_TYPE_INT64:
20696ba597c5SAnurag S. Maskey 		{
20706ba597c5SAnurag S. Maskey 			int_vals[i] = (int64_t)atoi(val[i]);
20716ba597c5SAnurag S. Maskey 			break;
20726ba597c5SAnurag S. Maskey 		}
20736ba597c5SAnurag S. Maskey 		case NWAM_VALUE_TYPE_UINT64:
20746ba597c5SAnurag S. Maskey 		{
20756ba597c5SAnurag S. Maskey 			uint64_t str_as_enum;
20766ba597c5SAnurag S. Maskey 			char *endptr;
20776ba597c5SAnurag S. Maskey 
20786ba597c5SAnurag S. Maskey 			ret = nwam_value_string_get_uint64(
20796ba597c5SAnurag S. Maskey 			    pt_to_prop_name(object_type, pt_type),
20806ba597c5SAnurag S. Maskey 			    val[i], &str_as_enum);
20816ba597c5SAnurag S. Maskey 			/*
20826ba597c5SAnurag S. Maskey 			 * Returns _SUCCESS if value for enum is valid.
20836ba597c5SAnurag S. Maskey 			 * Returns _INVALID_ARG if property is not an enum.
20846ba597c5SAnurag S. Maskey 			 */
20856ba597c5SAnurag S. Maskey 			if (ret == NWAM_SUCCESS) {
20866ba597c5SAnurag S. Maskey 				uint_vals[i] = str_as_enum;
20876ba597c5SAnurag S. Maskey 			} else if (ret == NWAM_INVALID_ARG) {
20886ba597c5SAnurag S. Maskey 				uint_vals[i] = strtoul(val[i], &endptr, 10);
20896ba597c5SAnurag S. Maskey 				/* verify conversion is valid */
20906ba597c5SAnurag S. Maskey 				if (endptr == val[i]) {
20916ba597c5SAnurag S. Maskey 					free(uint_vals);
20926ba597c5SAnurag S. Maskey 					array_free((void **)val, max_str_num);
20936ba597c5SAnurag S. Maskey 					return (NULL);
20946ba597c5SAnurag S. Maskey 				}
20956ba597c5SAnurag S. Maskey 			} else {
20966ba597c5SAnurag S. Maskey 				free(uint_vals);
20976ba597c5SAnurag S. Maskey 				array_free((void **)val, max_str_num);
20986ba597c5SAnurag S. Maskey 				return (NULL);
20996ba597c5SAnurag S. Maskey 			}
21006ba597c5SAnurag S. Maskey 			break;
21016ba597c5SAnurag S. Maskey 		}
21026ba597c5SAnurag S. Maskey 		case NWAM_VALUE_TYPE_BOOLEAN:
21036ba597c5SAnurag S. Maskey 			boolean_vals[i] = str_to_boolean(val[i]);
21046ba597c5SAnurag S. Maskey 			break;
21056ba597c5SAnurag S. Maskey 		default:
21066ba597c5SAnurag S. Maskey 			array_free((void **)val, max_str_num);
21076ba597c5SAnurag S. Maskey 			return (NULL);
21086ba597c5SAnurag S. Maskey 		}
21096ba597c5SAnurag S. Maskey 	}
21106ba597c5SAnurag S. Maskey 
21116ba597c5SAnurag S. Maskey 	/* create nwam_value_t */
21126ba597c5SAnurag S. Maskey 	if (value_type == NWAM_VALUE_TYPE_STRING) {
21136ba597c5SAnurag S. Maskey 		ret = nwam_value_create_string_array(val, n, &data);
21146ba597c5SAnurag S. Maskey 	} else if (value_type == NWAM_VALUE_TYPE_INT64) {
21156ba597c5SAnurag S. Maskey 		ret = nwam_value_create_int64_array(int_vals, n, &data);
21166ba597c5SAnurag S. Maskey 		free(int_vals);
21176ba597c5SAnurag S. Maskey 	} else if (value_type == NWAM_VALUE_TYPE_UINT64) {
21186ba597c5SAnurag S. Maskey 		ret = nwam_value_create_uint64_array(uint_vals, n, &data);
21196ba597c5SAnurag S. Maskey 		free(uint_vals);
21206ba597c5SAnurag S. Maskey 	} else if (value_type == NWAM_VALUE_TYPE_BOOLEAN) {
21216ba597c5SAnurag S. Maskey 		ret = nwam_value_create_boolean_array(boolean_vals, n, &data);
21226ba597c5SAnurag S. Maskey 		free(boolean_vals);
21236ba597c5SAnurag S. Maskey 	}
21246ba597c5SAnurag S. Maskey 	array_free((void **)val, max_str_num);
21256ba597c5SAnurag S. Maskey 
21266ba597c5SAnurag S. Maskey 	if (ret != NWAM_SUCCESS) {
21276ba597c5SAnurag S. Maskey 		nwamerr(ret, "Failed creating nwam_value");
21286ba597c5SAnurag S. Maskey 		return (NULL);
21296ba597c5SAnurag S. Maskey 	}
21306ba597c5SAnurag S. Maskey 
21316ba597c5SAnurag S. Maskey 	return (data);
21326ba597c5SAnurag S. Maskey }
21336ba597c5SAnurag S. Maskey 
21346ba597c5SAnurag S. Maskey /*
21356ba597c5SAnurag S. Maskey  * Displaying/Skipping of properties
21366ba597c5SAnurag S. Maskey  * ---------------------------------
21376ba597c5SAnurag S. Maskey  *
21386ba597c5SAnurag S. Maskey  * This table shows if a specific property should be shown if some
21396ba597c5SAnurag S. Maskey  * other property has a specific value.  This table is used by
21406ba597c5SAnurag S. Maskey  * show_prop_test(), which is called by set_func() and walkprop_func().
21416ba597c5SAnurag S. Maskey  *
21426ba597c5SAnurag S. Maskey  * An entry in the table looks like:
21436ba597c5SAnurag S. Maskey  *	{ property1, property2, { val1, val2, -1 } }
21446ba597c5SAnurag S. Maskey  * This is read as:
21456ba597c5SAnurag S. Maskey  *	"show property1 only if property2 has value val1 or val2"
21466ba597c5SAnurag S. Maskey  *
21476ba597c5SAnurag S. Maskey  * NB: If a property does not appear in this table, then that implies
21486ba597c5SAnurag S. Maskey  * that the property is always shown.
21496ba597c5SAnurag S. Maskey  *
21506ba597c5SAnurag S. Maskey  * A property can have more than one rule.  In such a case, the property is
21516ba597c5SAnurag S. Maskey  * displayed only any of the rules is satisfied.  This checking, however,
21526ba597c5SAnurag S. Maskey  * is recursive.  If a rule says that a property can be displayed, then the
21536ba597c5SAnurag S. Maskey  * property that's checked should also satisfy its rules.  In the above
21546ba597c5SAnurag S. Maskey  * example, if property1 is to be displayed, then property2 should also
21556ba597c5SAnurag S. Maskey  * satisfy its rules and be displayable.  This recursion is necessary as
21566ba597c5SAnurag S. Maskey  * properties that are not displayed (because rules are not satisfied) are
21576ba597c5SAnurag S. Maskey  * not deleted.
21586ba597c5SAnurag S. Maskey  */
21596ba597c5SAnurag S. Maskey 
21606ba597c5SAnurag S. Maskey /* The most number of values in pde_checkvals below */
21616ba597c5SAnurag S. Maskey #define	NWAM_CHECKVALS_MAX	5
21626ba597c5SAnurag S. Maskey 
21636ba597c5SAnurag S. Maskey typedef struct prop_display_entry {
21646ba597c5SAnurag S. Maskey 	const char	*pde_name;		/* property to show */
21656ba597c5SAnurag S. Maskey 	const char	*pde_checkname;		/* property to check */
21666ba597c5SAnurag S. Maskey 	int64_t	pde_checkvals[NWAM_CHECKVALS_MAX]; /* show prop for these */
21676ba597c5SAnurag S. Maskey } prop_display_entry_t;
21686ba597c5SAnurag S. Maskey 
21696ba597c5SAnurag S. Maskey /* Rules for showing properties: commented for clarity */
21706ba597c5SAnurag S. Maskey 
21716ba597c5SAnurag S. Maskey /*
21726ba597c5SAnurag S. Maskey  * Rules for NCUs
21736ba597c5SAnurag S. Maskey  * NB: There is no need to have an entry if a property is for IP only.
21746ba597c5SAnurag S. Maskey  *     This is taken care of in libnwam_ncp.c
21756ba597c5SAnurag S. Maskey  */
21766ba597c5SAnurag S. Maskey static prop_display_entry_t ncu_prop_display_entry_table[] = {
21776ba597c5SAnurag S. Maskey 	/* show priority-{group,mode} if activation == prioritized */
21786ba597c5SAnurag S. Maskey 	{ NWAM_NCU_PROP_PRIORITY_GROUP, NWAM_NCU_PROP_ACTIVATION_MODE,
21796ba597c5SAnurag S. Maskey 	    { NWAM_ACTIVATION_MODE_PRIORITIZED, -1 } },
21806ba597c5SAnurag S. Maskey 	{ NWAM_NCU_PROP_PRIORITY_MODE, NWAM_NCU_PROP_ACTIVATION_MODE,
21816ba597c5SAnurag S. Maskey 	    { NWAM_ACTIVATION_MODE_PRIORITIZED, -1 } },
21826ba597c5SAnurag S. Maskey 	/* show ipv4-addrsrc if ip-version == ipv4 */
21836ba597c5SAnurag S. Maskey 	{ NWAM_NCU_PROP_IPV4_ADDRSRC, NWAM_NCU_PROP_IP_VERSION,
21846ba597c5SAnurag S. Maskey 	    { IPV4_VERSION, -1 } },
21856ba597c5SAnurag S. Maskey 	/* show ipv4-addr if ipv4-addrsrc == static */
21866ba597c5SAnurag S. Maskey 	{ NWAM_NCU_PROP_IPV4_ADDR, NWAM_NCU_PROP_IPV4_ADDRSRC,
21876ba597c5SAnurag S. Maskey 	    { NWAM_ADDRSRC_STATIC, -1 } },
21886ba597c5SAnurag S. Maskey 	/* show ipv4-default-route if ip-version == ipv4 */
21896ba597c5SAnurag S. Maskey 	{ NWAM_NCU_PROP_IPV4_DEFAULT_ROUTE, NWAM_NCU_PROP_IP_VERSION,
21906ba597c5SAnurag S. Maskey 	    { IPV4_VERSION, -1 } },
21916ba597c5SAnurag S. Maskey 	/* show ipv6-addrsrc if ip-version == ipv6 */
21926ba597c5SAnurag S. Maskey 	{ NWAM_NCU_PROP_IPV6_ADDRSRC, NWAM_NCU_PROP_IP_VERSION,
21936ba597c5SAnurag S. Maskey 	    { IPV6_VERSION, -1 } },
21946ba597c5SAnurag S. Maskey 	/* show ipv6-addr if ipv6-addrsrc == static */
21956ba597c5SAnurag S. Maskey 	{ NWAM_NCU_PROP_IPV6_ADDR, NWAM_NCU_PROP_IPV6_ADDRSRC,
21966ba597c5SAnurag S. Maskey 	    { NWAM_ADDRSRC_STATIC, -1 } },
21976ba597c5SAnurag S. Maskey 	/* show ipv6-default-route if ip-version == ipv6 */
21986ba597c5SAnurag S. Maskey 	{ NWAM_NCU_PROP_IPV6_DEFAULT_ROUTE, NWAM_NCU_PROP_IP_VERSION,
21996ba597c5SAnurag S. Maskey 	    { IPV6_VERSION, -1 } },
22006ba597c5SAnurag S. Maskey 	{ NULL, NULL, { -1 } }
22016ba597c5SAnurag S. Maskey };
22026ba597c5SAnurag S. Maskey 
22036ba597c5SAnurag S. Maskey /* Rules for ENMs */
22046ba597c5SAnurag S. Maskey static prop_display_entry_t enm_prop_display_entry_table[] = {
22056ba597c5SAnurag S. Maskey 	/* show conditions if activation-mode == conditional-{all,any} */
22066ba597c5SAnurag S. Maskey 	{ NWAM_ENM_PROP_CONDITIONS, NWAM_ENM_PROP_ACTIVATION_MODE,
22076ba597c5SAnurag S. Maskey 	    { NWAM_ACTIVATION_MODE_CONDITIONAL_ALL,
22086ba597c5SAnurag S. Maskey 	    NWAM_ACTIVATION_MODE_CONDITIONAL_ANY, -1 } },
22096ba597c5SAnurag S. Maskey 	{ NULL, NULL, { -1 } }
22106ba597c5SAnurag S. Maskey };
22116ba597c5SAnurag S. Maskey 
22126ba597c5SAnurag S. Maskey /* Rules for LOCations */
22136ba597c5SAnurag S. Maskey static prop_display_entry_t loc_prop_display_entry_table[] = {
22146ba597c5SAnurag S. Maskey 	/* show conditions if activation-mode == conditional-{all,any} */
22156ba597c5SAnurag S. Maskey 	{ NWAM_LOC_PROP_CONDITIONS, NWAM_LOC_PROP_ACTIVATION_MODE,
22166ba597c5SAnurag S. Maskey 	    { NWAM_ACTIVATION_MODE_CONDITIONAL_ALL,
22176ba597c5SAnurag S. Maskey 	    NWAM_ACTIVATION_MODE_CONDITIONAL_ANY, -1 } },
22186ba597c5SAnurag S. Maskey 	/* show dns-nameservice-configsrc if nameservices == dns */
22196ba597c5SAnurag S. Maskey 	{ NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC, NWAM_LOC_PROP_NAMESERVICES,
22206ba597c5SAnurag S. Maskey 	    { NWAM_NAMESERVICES_DNS, -1 } },
22216ba597c5SAnurag S. Maskey 	/* show other DNS options if dns-nameservices-configsrc == manual */
22226ba597c5SAnurag S. Maskey 	{ NWAM_LOC_PROP_DNS_NAMESERVICE_DOMAIN,
22236ba597c5SAnurag S. Maskey 	    NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC,
22246ba597c5SAnurag S. Maskey 	    { NWAM_CONFIGSRC_MANUAL, -1 } },
22256ba597c5SAnurag S. Maskey 	{ NWAM_LOC_PROP_DNS_NAMESERVICE_SERVERS,
22266ba597c5SAnurag S. Maskey 	    NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC,
22276ba597c5SAnurag S. Maskey 	    { NWAM_CONFIGSRC_MANUAL, -1 } },
22286ba597c5SAnurag S. Maskey 	{ NWAM_LOC_PROP_DNS_NAMESERVICE_SEARCH,
22296ba597c5SAnurag S. Maskey 	    NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC,
22306ba597c5SAnurag S. Maskey 	    { NWAM_CONFIGSRC_MANUAL, -1 } },
22316ba597c5SAnurag S. Maskey 	/* show nis-nameservice-configsrc if nameservices == nis */
22326ba597c5SAnurag S. Maskey 	{ NWAM_LOC_PROP_NIS_NAMESERVICE_CONFIGSRC, NWAM_LOC_PROP_NAMESERVICES,
22336ba597c5SAnurag S. Maskey 	    { NWAM_NAMESERVICES_NIS, -1 } },
22346ba597c5SAnurag S. Maskey 	/* show nis-nameservice-servers if nis-nameservice-configsrc = manual */
22356ba597c5SAnurag S. Maskey 	{ NWAM_LOC_PROP_NIS_NAMESERVICE_SERVERS,
22366ba597c5SAnurag S. Maskey 	    NWAM_LOC_PROP_NIS_NAMESERVICE_CONFIGSRC,
22376ba597c5SAnurag S. Maskey 	    { NWAM_CONFIGSRC_MANUAL, -1 } },
22386ba597c5SAnurag S. Maskey 	/* show ldap-nameservice-configsrc if nameservices == ldap */
22396ba597c5SAnurag S. Maskey 	{ NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC, NWAM_LOC_PROP_NAMESERVICES,
22406ba597c5SAnurag S. Maskey 	    { NWAM_NAMESERVICES_LDAP, -1 } },
22416ba597c5SAnurag S. Maskey 	/* show ldap-nameservice-servers if ldap-nameservice-configsrc=manual */
22426ba597c5SAnurag S. Maskey 	{ NWAM_LOC_PROP_LDAP_NAMESERVICE_SERVERS,
22436ba597c5SAnurag S. Maskey 	    NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC,
22446ba597c5SAnurag S. Maskey 	    { NWAM_CONFIGSRC_MANUAL, -1 } },
22456ba597c5SAnurag S. Maskey 	/* show default-domain if {nis,ldap}-nameservice-configsrc == manual */
22466ba597c5SAnurag S. Maskey 	{ NWAM_LOC_PROP_DEFAULT_DOMAIN, NWAM_LOC_PROP_NIS_NAMESERVICE_CONFIGSRC,
22476ba597c5SAnurag S. Maskey 	    { NWAM_CONFIGSRC_MANUAL, -1 } },
22486ba597c5SAnurag S. Maskey 	{ NWAM_LOC_PROP_DEFAULT_DOMAIN,
22496ba597c5SAnurag S. Maskey 	    NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC,
22506ba597c5SAnurag S. Maskey 	    { NWAM_CONFIGSRC_MANUAL, -1 } },
22516ba597c5SAnurag S. Maskey 	{ NULL, NULL, { -1 } }
22526ba597c5SAnurag S. Maskey };
22536ba597c5SAnurag S. Maskey 
22546ba597c5SAnurag S. Maskey /* Rules for Known WLANs */
22556ba597c5SAnurag S. Maskey static prop_display_entry_t wlan_prop_display_entry_table[] = {
22566ba597c5SAnurag S. Maskey 	/* no rules for WLANs */
22576ba597c5SAnurag S. Maskey 	{ NULL, NULL, { -1 } }
22586ba597c5SAnurag S. Maskey };
22596ba597c5SAnurag S. Maskey 
22606ba597c5SAnurag S. Maskey /* Returns the appropriate rules table for the given object type */
22616ba597c5SAnurag S. Maskey static prop_display_entry_t *
22626ba597c5SAnurag S. Maskey get_prop_display_table(nwam_object_type_t object_type)
22636ba597c5SAnurag S. Maskey {
22646ba597c5SAnurag S. Maskey 	switch (object_type) {
22656ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_NCU:
22666ba597c5SAnurag S. Maskey 		return (ncu_prop_display_entry_table);
22676ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_LOC:
22686ba597c5SAnurag S. Maskey 		return (loc_prop_display_entry_table);
22696ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_ENM:
22706ba597c5SAnurag S. Maskey 		return (enm_prop_display_entry_table);
22716ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_KNOWN_WLAN:
22726ba597c5SAnurag S. Maskey 		return (wlan_prop_display_entry_table);
22736ba597c5SAnurag S. Maskey 	}
22746ba597c5SAnurag S. Maskey 	return (NULL);
22756ba597c5SAnurag S. Maskey }
22766ba597c5SAnurag S. Maskey 
22776ba597c5SAnurag S. Maskey /*
22786ba597c5SAnurag S. Maskey  * Tests whether prop must be shown during a walk depending on the
22796ba597c5SAnurag S. Maskey  * value of a different property.
22806ba597c5SAnurag S. Maskey  *
22816ba597c5SAnurag S. Maskey  * This function is also used by set_func() to determine whether the
22826ba597c5SAnurag S. Maskey  * property being set should be allowed or not.  If the property
22836ba597c5SAnurag S. Maskey  * would not be displayed in a walk, then it should not be set.
22846ba597c5SAnurag S. Maskey  *
22856ba597c5SAnurag S. Maskey  * The checked_props and num_checked arguments are used to avoid circular
22866ba597c5SAnurag S. Maskey  * dependencies between properties.  When this function recursively calls
22876ba597c5SAnurag S. Maskey  * itself, it adds the property that it just checked to the checked_props
22886ba597c5SAnurag S. Maskey  * list.
22896ba597c5SAnurag S. Maskey  */
22906ba597c5SAnurag S. Maskey static boolean_t
22916ba597c5SAnurag S. Maskey show_prop_test(nwam_object_type_t object_type, const char *prop,
22926ba597c5SAnurag S. Maskey     prop_display_entry_t *display_list, char **checked_props, int num_checked)
22936ba597c5SAnurag S. Maskey {
22946ba597c5SAnurag S. Maskey 	nwam_error_t		ret;
22956ba597c5SAnurag S. Maskey 	nwam_value_t		prop_val;
22966ba597c5SAnurag S. Maskey 	nwam_value_type_t	prop_type;
22976ba597c5SAnurag S. Maskey 	int			i, j, k;
22986ba597c5SAnurag S. Maskey 	boolean_t		prop_found = B_FALSE, show_prop = B_FALSE;
22996ba597c5SAnurag S. Maskey 
23006ba597c5SAnurag S. Maskey 	/*
23016ba597c5SAnurag S. Maskey 	 * Check if this property has already been checked previously in
23026ba597c5SAnurag S. Maskey 	 * the recursion.  If so, return B_FALSE so that the initial prop
23036ba597c5SAnurag S. Maskey 	 * is not displayed.
23046ba597c5SAnurag S. Maskey 	 */
23056ba597c5SAnurag S. Maskey 	for (i = 0; i < num_checked; i++) {
23066ba597c5SAnurag S. Maskey 		if (strcmp(prop, checked_props[i]) == 0) {
23076ba597c5SAnurag S. Maskey 			free(checked_props);
23086ba597c5SAnurag S. Maskey 			return (B_FALSE);
23096ba597c5SAnurag S. Maskey 		}
23106ba597c5SAnurag S. Maskey 	}
23116ba597c5SAnurag S. Maskey 
23126ba597c5SAnurag S. Maskey 	for (i = 0; display_list[i].pde_name != NULL; i++) {
23136ba597c5SAnurag S. Maskey 		if (strcmp(prop, display_list[i].pde_name) != 0)
23146ba597c5SAnurag S. Maskey 			continue;
23156ba597c5SAnurag S. Maskey 		prop_found = B_TRUE;
23166ba597c5SAnurag S. Maskey 
23176ba597c5SAnurag S. Maskey 		/* get the value(s) of the (other) property to check */
23186ba597c5SAnurag S. Maskey 		switch (object_type) {
23196ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_NCU:
23206ba597c5SAnurag S. Maskey 			ret = nwam_ncu_get_prop_value(ncu_h,
23216ba597c5SAnurag S. Maskey 			    display_list[i].pde_checkname, &prop_val);
23226ba597c5SAnurag S. Maskey 			break;
23236ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_LOC:
23246ba597c5SAnurag S. Maskey 			ret = nwam_loc_get_prop_value(loc_h,
23256ba597c5SAnurag S. Maskey 			    display_list[i].pde_checkname, &prop_val);
23266ba597c5SAnurag S. Maskey 			break;
23276ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_ENM:
23286ba597c5SAnurag S. Maskey 			ret = nwam_enm_get_prop_value(enm_h,
23296ba597c5SAnurag S. Maskey 			    display_list[i].pde_checkname, &prop_val);
23306ba597c5SAnurag S. Maskey 			break;
23316ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_KNOWN_WLAN:
23326ba597c5SAnurag S. Maskey 			return (B_TRUE);
23336ba597c5SAnurag S. Maskey 		}
23346ba597c5SAnurag S. Maskey 		if (ret != NWAM_SUCCESS)
23356ba597c5SAnurag S. Maskey 			continue;
23366ba597c5SAnurag S. Maskey 
23376ba597c5SAnurag S. Maskey 		/* prop_val may contain a uint64 array or a boolean */
23386ba597c5SAnurag S. Maskey 		if (nwam_value_get_type(prop_val, &prop_type) != NWAM_SUCCESS)
23396ba597c5SAnurag S. Maskey 			continue;
23406ba597c5SAnurag S. Maskey 
23416ba597c5SAnurag S. Maskey 		if (prop_type == NWAM_VALUE_TYPE_UINT64) {
23426ba597c5SAnurag S. Maskey 			uint64_t	*prop_uvals;
23436ba597c5SAnurag S. Maskey 			int64_t		*check_uvals;
23446ba597c5SAnurag S. Maskey 			uint_t		numvals;
23456ba597c5SAnurag S. Maskey 
23466ba597c5SAnurag S. Maskey 			if (nwam_value_get_uint64_array(prop_val, &prop_uvals,
23476ba597c5SAnurag S. Maskey 			    &numvals) != NWAM_SUCCESS) {
23486ba597c5SAnurag S. Maskey 				nwam_value_free(prop_val);
23496ba597c5SAnurag S. Maskey 				continue;
23506ba597c5SAnurag S. Maskey 			}
23516ba597c5SAnurag S. Maskey 
23526ba597c5SAnurag S. Maskey 			/* for each value in uvals, check each value in table */
23536ba597c5SAnurag S. Maskey 			for (j = 0; j < numvals; j++) {
23546ba597c5SAnurag S. Maskey 				check_uvals = display_list[i].pde_checkvals;
23556ba597c5SAnurag S. Maskey 				for (k = 0; check_uvals[k] != -1; k++) {
23566ba597c5SAnurag S. Maskey 					/* show if uvals[j] matches */
23576ba597c5SAnurag S. Maskey 					if (prop_uvals[j] ==
23586ba597c5SAnurag S. Maskey 					    (uint64_t)check_uvals[k]) {
23596ba597c5SAnurag S. Maskey 						show_prop = B_TRUE;
23606ba597c5SAnurag S. Maskey 						goto next_rule;
23616ba597c5SAnurag S. Maskey 					}
23626ba597c5SAnurag S. Maskey 				}
23636ba597c5SAnurag S. Maskey 			}
23646ba597c5SAnurag S. Maskey 		} else if (prop_type == NWAM_VALUE_TYPE_BOOLEAN) {
23656ba597c5SAnurag S. Maskey 			boolean_t bval;
23666ba597c5SAnurag S. Maskey 
23676ba597c5SAnurag S. Maskey 			if (nwam_value_get_boolean(prop_val, &bval) !=
23686ba597c5SAnurag S. Maskey 			    NWAM_SUCCESS) {
23696ba597c5SAnurag S. Maskey 				nwam_value_free(prop_val);
23706ba597c5SAnurag S. Maskey 				continue;
23716ba597c5SAnurag S. Maskey 			}
23726ba597c5SAnurag S. Maskey 
23736ba597c5SAnurag S. Maskey 			for (k = 0;
23746ba597c5SAnurag S. Maskey 			    display_list[i].pde_checkvals[k] != -1;
23756ba597c5SAnurag S. Maskey 			    k++) {
23766ba597c5SAnurag S. Maskey 				/* show if bval matches */
23776ba597c5SAnurag S. Maskey 				if (bval == (boolean_t)
23786ba597c5SAnurag S. Maskey 				    display_list[i].pde_checkvals[k]) {
23796ba597c5SAnurag S. Maskey 					show_prop = B_TRUE;
23806ba597c5SAnurag S. Maskey 					goto next_rule;
23816ba597c5SAnurag S. Maskey 				}
23826ba597c5SAnurag S. Maskey 			}
23836ba597c5SAnurag S. Maskey 		}
23846ba597c5SAnurag S. Maskey 
23856ba597c5SAnurag S. Maskey next_rule:
23866ba597c5SAnurag S. Maskey 		nwam_value_free(prop_val);
23876ba597c5SAnurag S. Maskey 		/*
23886ba597c5SAnurag S. Maskey 		 * If show_prop is set, then a rule is satisfied; no need to
23896ba597c5SAnurag S. Maskey 		 * check other rules for this prop.  However, recursively
23906ba597c5SAnurag S. Maskey 		 * check if the checked prop (pde_checkname) satisfies its
23916ba597c5SAnurag S. Maskey 		 * rules.  Also, update the check_props array with this prop.
23926ba597c5SAnurag S. Maskey 		 */
23936ba597c5SAnurag S. Maskey 		if (show_prop) {
23946ba597c5SAnurag S. Maskey 			char **newprops = realloc(checked_props,
23956ba597c5SAnurag S. Maskey 			    ++num_checked * sizeof (char *));
23966ba597c5SAnurag S. Maskey 			if (newprops == NULL) {
23976ba597c5SAnurag S. Maskey 				free(checked_props);
23986ba597c5SAnurag S. Maskey 				return (B_FALSE);
23996ba597c5SAnurag S. Maskey 			}
24006ba597c5SAnurag S. Maskey 			checked_props = newprops;
24016ba597c5SAnurag S. Maskey 			checked_props[num_checked - 1] = (char *)prop;
24026ba597c5SAnurag S. Maskey 
24036ba597c5SAnurag S. Maskey 			return (show_prop_test(object_type,
24046ba597c5SAnurag S. Maskey 			    display_list[i].pde_checkname, display_list,
24056ba597c5SAnurag S. Maskey 			    checked_props, num_checked));
24066ba597c5SAnurag S. Maskey 		}
24076ba597c5SAnurag S. Maskey 	}
24086ba597c5SAnurag S. Maskey 
24096ba597c5SAnurag S. Maskey 	/*
24106ba597c5SAnurag S. Maskey 	 * If we are here and prop_found is set, it means that no rules were
24116ba597c5SAnurag S. Maskey 	 * satisfied by prop; return B_FALSE.  If prop_found is not set, then
24126ba597c5SAnurag S. Maskey 	 * prop did not have a rule so it must be displayed; return B_TRUE.
24136ba597c5SAnurag S. Maskey 	 */
24146ba597c5SAnurag S. Maskey 	free(checked_props);
24156ba597c5SAnurag S. Maskey 	if (prop_found)
24166ba597c5SAnurag S. Maskey 		return (B_FALSE);
24176ba597c5SAnurag S. Maskey 	else
24186ba597c5SAnurag S. Maskey 		return (B_TRUE);
24196ba597c5SAnurag S. Maskey }
24206ba597c5SAnurag S. Maskey 
24216ba597c5SAnurag S. Maskey /*
24226ba597c5SAnurag S. Maskey  * Returns true if the given property is read-only and cannot be modified.
24236ba597c5SAnurag S. Maskey  */
24246ba597c5SAnurag S. Maskey static boolean_t
24256ba597c5SAnurag S. Maskey is_prop_read_only(nwam_object_type_t object_type, const char *prop)
24266ba597c5SAnurag S. Maskey {
24276ba597c5SAnurag S. Maskey 	boolean_t ro;
24286ba597c5SAnurag S. Maskey 
24296ba597c5SAnurag S. Maskey 	switch (object_type) {
24306ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_NCU:
24316ba597c5SAnurag S. Maskey 		if (nwam_ncu_prop_read_only(prop, &ro) == NWAM_SUCCESS && ro)
24326ba597c5SAnurag S. Maskey 			return (B_TRUE);
24336ba597c5SAnurag S. Maskey 		break;
24346ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_ENM:
24356ba597c5SAnurag S. Maskey 		if (nwam_enm_prop_read_only(prop, &ro) == NWAM_SUCCESS && ro)
24366ba597c5SAnurag S. Maskey 			return (B_TRUE);
24376ba597c5SAnurag S. Maskey 		break;
24386ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_LOC:
24396ba597c5SAnurag S. Maskey 		if (nwam_loc_prop_read_only(prop, &ro) == NWAM_SUCCESS && ro)
24406ba597c5SAnurag S. Maskey 			return (B_TRUE);
24416ba597c5SAnurag S. Maskey 		break;
24426ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_KNOWN_WLAN:
24436ba597c5SAnurag S. Maskey 		/* no read-only properties for WLANs */
24446ba597c5SAnurag S. Maskey 		return (B_FALSE);
24456ba597c5SAnurag S. Maskey 	}
24466ba597c5SAnurag S. Maskey 	return (B_FALSE);
24476ba597c5SAnurag S. Maskey }
24486ba597c5SAnurag S. Maskey 
24496ba597c5SAnurag S. Maskey /* Returns true if the property is multi-valued */
24506ba597c5SAnurag S. Maskey static boolean_t
24516ba597c5SAnurag S. Maskey is_prop_multivalued(nwam_object_type_t object_type, const char *prop)
24526ba597c5SAnurag S. Maskey {
24536ba597c5SAnurag S. Maskey 	nwam_error_t	ret;
24546ba597c5SAnurag S. Maskey 	boolean_t	multi;
24556ba597c5SAnurag S. Maskey 
24566ba597c5SAnurag S. Maskey 	switch (object_type) {
24576ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_NCU:
24586ba597c5SAnurag S. Maskey 		ret = nwam_ncu_prop_multivalued(prop, &multi);
24596ba597c5SAnurag S. Maskey 		break;
24606ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_LOC:
24616ba597c5SAnurag S. Maskey 		ret = nwam_loc_prop_multivalued(prop, &multi);
24626ba597c5SAnurag S. Maskey 		break;
24636ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_ENM:
24646ba597c5SAnurag S. Maskey 		ret = nwam_enm_prop_multivalued(prop, &multi);
24656ba597c5SAnurag S. Maskey 		break;
24666ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_KNOWN_WLAN:
24676ba597c5SAnurag S. Maskey 		ret = nwam_known_wlan_prop_multivalued(prop, &multi);
24686ba597c5SAnurag S. Maskey 		break;
24696ba597c5SAnurag S. Maskey 	}
24706ba597c5SAnurag S. Maskey 
24716ba597c5SAnurag S. Maskey 	if (ret != NWAM_SUCCESS)
24726ba597c5SAnurag S. Maskey 		multi = B_FALSE;
24736ba597c5SAnurag S. Maskey 	return (multi);
24746ba597c5SAnurag S. Maskey }
24756ba597c5SAnurag S. Maskey 
24766ba597c5SAnurag S. Maskey /*
24776ba597c5SAnurag S. Maskey  * Prints out error message specific to property that could not be set.
24786ba597c5SAnurag S. Maskey  * Property description is used to help guide user in entering correct value.
24796ba597c5SAnurag S. Maskey  */
24806ba597c5SAnurag S. Maskey static void
24816ba597c5SAnurag S. Maskey invalid_set_prop_msg(const char *prop, nwam_error_t err)
24826ba597c5SAnurag S. Maskey {
24836ba597c5SAnurag S. Maskey 	const char *description;
24846ba597c5SAnurag S. Maskey 
24856ba597c5SAnurag S. Maskey 	if (err == NWAM_SUCCESS)
24866ba597c5SAnurag S. Maskey 		return;
24876ba597c5SAnurag S. Maskey 
24886ba597c5SAnurag S. Maskey 	if (err != NWAM_ENTITY_INVALID_VALUE) {
24896ba597c5SAnurag S. Maskey 		nwamerr(err, "Set error");
24906ba597c5SAnurag S. Maskey 		return;
24916ba597c5SAnurag S. Maskey 	}
24926ba597c5SAnurag S. Maskey 
24936ba597c5SAnurag S. Maskey 	switch (active_object_type()) {
24946ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_NCU:
24956ba597c5SAnurag S. Maskey 		(void) nwam_ncu_get_prop_description(prop, &description);
24966ba597c5SAnurag S. Maskey 		break;
24976ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_LOC:
24986ba597c5SAnurag S. Maskey 		(void) nwam_loc_get_prop_description(prop, &description);
24996ba597c5SAnurag S. Maskey 		break;
25006ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_ENM:
25016ba597c5SAnurag S. Maskey 		(void) nwam_enm_get_prop_description(prop, &description);
25026ba597c5SAnurag S. Maskey 		break;
25036ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_KNOWN_WLAN:
25046ba597c5SAnurag S. Maskey 		(void) nwam_known_wlan_get_prop_description(prop,
25056ba597c5SAnurag S. Maskey 		    &description);
25066ba597c5SAnurag S. Maskey 		break;
25076ba597c5SAnurag S. Maskey 	}
25086ba597c5SAnurag S. Maskey 	nerr("Set error: invalid value\n'%s' %s", prop, description);
25096ba597c5SAnurag S. Maskey }
25106ba597c5SAnurag S. Maskey 
25116ba597c5SAnurag S. Maskey /*
25126ba597c5SAnurag S. Maskey  * Sets the property value.
25136ba597c5SAnurag S. Maskey  * Read-only properties and objects cannot be set.
25146ba597c5SAnurag S. Maskey  * "read-only" is a special in that it can be set on a read-only object.
25156ba597c5SAnurag S. Maskey  * The object has to be committed before other properties can be set.
25166ba597c5SAnurag S. Maskey  * Also uses show_prop_test() to test if the property being set would
25176ba597c5SAnurag S. Maskey  * be skipped during a walk (as determined by the value of some other
25186ba597c5SAnurag S. Maskey  * property).  If so, then it cannot be set.
25196ba597c5SAnurag S. Maskey  */
25206ba597c5SAnurag S. Maskey void
25216ba597c5SAnurag S. Maskey set_func(cmd_t *cmd)
25226ba597c5SAnurag S. Maskey {
25236ba597c5SAnurag S. Maskey 	int			pt_type = cmd->cmd_prop_type;
25246ba597c5SAnurag S. Maskey 	nwam_error_t		ret = NWAM_SUCCESS;
25256ba597c5SAnurag S. Maskey 	nwam_value_t		prop_value;
25266ba597c5SAnurag S. Maskey 	const char		*prop;
25276ba597c5SAnurag S. Maskey 	boolean_t		is_listprop = B_FALSE;
25286ba597c5SAnurag S. Maskey 	nwam_object_type_t	object_type;
25296ba597c5SAnurag S. Maskey 	prop_display_entry_t	*prop_table;
25306ba597c5SAnurag S. Maskey 	char			**checked = NULL;
25316ba597c5SAnurag S. Maskey 
25326ba597c5SAnurag S. Maskey 	assert(cmd->cmd_argc > 0);
25336ba597c5SAnurag S. Maskey 
25346ba597c5SAnurag S. Maskey 	object_type = active_object_type();
25356ba597c5SAnurag S. Maskey 	prop_table = get_prop_display_table(object_type);
25366ba597c5SAnurag S. Maskey 
25376ba597c5SAnurag S. Maskey 	/* argv[0] is property value */
25386ba597c5SAnurag S. Maskey 	if ((prop = pt_to_prop_name(object_type, pt_type)) == NULL) {
25396ba597c5SAnurag S. Maskey 		nerr("Set error: invalid %s property: '%s'",
25406ba597c5SAnurag S. Maskey 		    scope_to_str(current_scope), pt_to_str(pt_type));
25416ba597c5SAnurag S. Maskey 		return;
25426ba597c5SAnurag S. Maskey 	}
25436ba597c5SAnurag S. Maskey 
25446ba597c5SAnurag S. Maskey 	/* check if property can be set */
25456ba597c5SAnurag S. Maskey 	if (is_prop_read_only(object_type, prop)) {
25466ba597c5SAnurag S. Maskey 		nerr("Set error: property '%s' is read-only", prop);
25476ba597c5SAnurag S. Maskey 		return;
25486ba597c5SAnurag S. Maskey 	}
25496ba597c5SAnurag S. Maskey 	if (!show_prop_test(object_type, prop, prop_table, checked, 0)) {
25506ba597c5SAnurag S. Maskey 		if (interactive_mode) {
25516ba597c5SAnurag S. Maskey 			(void) printf(gettext("setting property '%s' "
25526ba597c5SAnurag S. Maskey 			    "has no effect\n"), prop);
25536ba597c5SAnurag S. Maskey 		}
25546ba597c5SAnurag S. Maskey 	}
25556ba597c5SAnurag S. Maskey 
25566ba597c5SAnurag S. Maskey 	is_listprop = is_prop_multivalued(object_type, prop);
25576ba597c5SAnurag S. Maskey 	prop_value = str_to_nwam_value(object_type, cmd->cmd_argv[0], pt_type,
25586ba597c5SAnurag S. Maskey 	    is_listprop);
25596ba597c5SAnurag S. Maskey 	if (prop_value == NULL) {
25606ba597c5SAnurag S. Maskey 		invalid_set_prop_msg(prop, NWAM_ENTITY_INVALID_VALUE);
25616ba597c5SAnurag S. Maskey 		return;
25626ba597c5SAnurag S. Maskey 	}
25636ba597c5SAnurag S. Maskey 
25646ba597c5SAnurag S. Maskey 	/* set the property value */
25656ba597c5SAnurag S. Maskey 	switch (object_type) {
25666ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_NCU:
25676ba597c5SAnurag S. Maskey 		ret = nwam_ncu_set_prop_value(ncu_h, prop, prop_value);
25686ba597c5SAnurag S. Maskey 		break;
25696ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_LOC:
25706ba597c5SAnurag S. Maskey 		ret = nwam_loc_set_prop_value(loc_h, prop, prop_value);
25716ba597c5SAnurag S. Maskey 		break;
25726ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_ENM:
25736ba597c5SAnurag S. Maskey 		ret = nwam_enm_set_prop_value(enm_h, prop, prop_value);
25746ba597c5SAnurag S. Maskey 		break;
25756ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_KNOWN_WLAN:
25766ba597c5SAnurag S. Maskey 		ret = nwam_known_wlan_set_prop_value(wlan_h, prop, prop_value);
25776ba597c5SAnurag S. Maskey 		break;
25786ba597c5SAnurag S. Maskey 	}
25796ba597c5SAnurag S. Maskey 	nwam_value_free(prop_value);
25806ba597c5SAnurag S. Maskey 
25816ba597c5SAnurag S. Maskey 	/* delete other properties if needed */
25826ba597c5SAnurag S. Maskey 	if (ret == NWAM_SUCCESS)
25836ba597c5SAnurag S. Maskey 		need_to_commit = B_TRUE;
25846ba597c5SAnurag S. Maskey 	else
25856ba597c5SAnurag S. Maskey 		invalid_set_prop_msg(prop, ret);
25866ba597c5SAnurag S. Maskey }
25876ba597c5SAnurag S. Maskey 
25886ba597c5SAnurag S. Maskey static int
25896ba597c5SAnurag S. Maskey list_callback(nwam_object_type_t object_type, void *handle,
25906ba597c5SAnurag S. Maskey     boolean_t *list_msgp, const char *msg)
25916ba597c5SAnurag S. Maskey {
25926ba597c5SAnurag S. Maskey 	nwam_error_t		ret;
25936ba597c5SAnurag S. Maskey 	char			*name;
25946ba597c5SAnurag S. Maskey 	nwam_ncu_class_t	class;
25956ba597c5SAnurag S. Maskey 
25966ba597c5SAnurag S. Maskey 	if (*list_msgp) {
25976ba597c5SAnurag S. Maskey 		(void) printf("%s:\n", msg);
25986ba597c5SAnurag S. Maskey 		*list_msgp = B_FALSE;
25996ba597c5SAnurag S. Maskey 	}
26006ba597c5SAnurag S. Maskey 
26016ba597c5SAnurag S. Maskey 	ret = object_name_from_handle(object_type, handle, &name);
26026ba597c5SAnurag S. Maskey 	if (ret != NWAM_SUCCESS) {
26036ba597c5SAnurag S. Maskey 		nwamerr(ret, "List error: failed to get name");
26046ba597c5SAnurag S. Maskey 		return (1);
26056ba597c5SAnurag S. Maskey 	}
26066ba597c5SAnurag S. Maskey 
26076ba597c5SAnurag S. Maskey 	/* If NCU, get its class and print */
26086ba597c5SAnurag S. Maskey 	if (object_type == NWAM_OBJECT_TYPE_NCU) {
26096ba597c5SAnurag S. Maskey 		if ((ret = nwam_ncu_get_ncu_class(handle, &class))
26106ba597c5SAnurag S. Maskey 		    != NWAM_SUCCESS) {
26116ba597c5SAnurag S. Maskey 			nwamerr(ret, "List error: failed to get ncu class");
26126ba597c5SAnurag S. Maskey 			free(name);
26136ba597c5SAnurag S. Maskey 			return (1);
26146ba597c5SAnurag S. Maskey 		} else {
26156ba597c5SAnurag S. Maskey 			(void) printf("\t%s",
26166ba597c5SAnurag S. Maskey 			    propval_to_str(NWAM_NCU_PROP_CLASS, class));
26176ba597c5SAnurag S. Maskey 		}
26186ba597c5SAnurag S. Maskey 	}
26196ba597c5SAnurag S. Maskey 	(void) printf("\t%s\n", name);
26206ba597c5SAnurag S. Maskey 
26216ba597c5SAnurag S. Maskey 	free(name);
26226ba597c5SAnurag S. Maskey 	return (0);
26236ba597c5SAnurag S. Maskey }
26246ba597c5SAnurag S. Maskey 
26256ba597c5SAnurag S. Maskey /* Print out name, type and status */
26266ba597c5SAnurag S. Maskey static int
26276ba597c5SAnurag S. Maskey list_loc_callback(nwam_loc_handle_t loc, void *arg)
26286ba597c5SAnurag S. Maskey {
26296ba597c5SAnurag S. Maskey 	return (list_callback(NWAM_OBJECT_TYPE_LOC, loc, arg, "Locations"));
26306ba597c5SAnurag S. Maskey }
26316ba597c5SAnurag S. Maskey 
26326ba597c5SAnurag S. Maskey static int
26336ba597c5SAnurag S. Maskey list_enm_callback(nwam_enm_handle_t enm, void *arg)
26346ba597c5SAnurag S. Maskey {
26356ba597c5SAnurag S. Maskey 	return (list_callback(NWAM_OBJECT_TYPE_ENM, enm, arg, "ENMs"));
26366ba597c5SAnurag S. Maskey }
26376ba597c5SAnurag S. Maskey 
26386ba597c5SAnurag S. Maskey static int
26396ba597c5SAnurag S. Maskey list_wlan_callback(nwam_known_wlan_handle_t wlan, void *arg)
26406ba597c5SAnurag S. Maskey {
26416ba597c5SAnurag S. Maskey 	return (list_callback(NWAM_OBJECT_TYPE_KNOWN_WLAN, wlan, arg, "WLANs"));
26426ba597c5SAnurag S. Maskey }
26436ba597c5SAnurag S. Maskey 
26446ba597c5SAnurag S. Maskey static int
26456ba597c5SAnurag S. Maskey list_ncp_callback(nwam_ncp_handle_t ncp, void *arg)
26466ba597c5SAnurag S. Maskey {
26476ba597c5SAnurag S. Maskey 	return (list_callback(NWAM_OBJECT_TYPE_NCP, ncp, arg, "NCPs"));
26486ba597c5SAnurag S. Maskey }
26496ba597c5SAnurag S. Maskey 
26506ba597c5SAnurag S. Maskey static int
26516ba597c5SAnurag S. Maskey list_ncu_callback(nwam_ncu_handle_t ncu, void *arg)
26526ba597c5SAnurag S. Maskey {
26536ba597c5SAnurag S. Maskey 	return (list_callback(NWAM_OBJECT_TYPE_NCU, ncu, arg, "NCUs"));
26546ba597c5SAnurag S. Maskey }
26556ba597c5SAnurag S. Maskey 
26566ba597c5SAnurag S. Maskey /* functions to convert a value to a string */
26576ba597c5SAnurag S. Maskey /* ARGSUSED */
26586ba597c5SAnurag S. Maskey static const char *
26596ba597c5SAnurag S. Maskey str2str(void *s, const char *prop, char *str)
26606ba597c5SAnurag S. Maskey {
26616ba597c5SAnurag S. Maskey 	(void) snprintf(str, NWAM_MAX_VALUE_LEN, "%s", s);
26626ba597c5SAnurag S. Maskey 	return (str);
26636ba597c5SAnurag S. Maskey }
26646ba597c5SAnurag S. Maskey 
26656ba597c5SAnurag S. Maskey /* ARGSUSED */
26666ba597c5SAnurag S. Maskey static const char *
26676ba597c5SAnurag S. Maskey str2qstr(void *s, const char *prop, char *qstr)
26686ba597c5SAnurag S. Maskey {
26696ba597c5SAnurag S. Maskey 	/* quoted strings */
26706ba597c5SAnurag S. Maskey 	(void) snprintf(qstr, NWAM_MAX_VALUE_LEN, "\"%s\"", s);
26716ba597c5SAnurag S. Maskey 	return (qstr);
26726ba597c5SAnurag S. Maskey }
26736ba597c5SAnurag S. Maskey 
26746ba597c5SAnurag S. Maskey /* ARGSUSED */
26756ba597c5SAnurag S. Maskey static const char *
26766ba597c5SAnurag S. Maskey int2str(void *in, const char *prop, char *instr)
26776ba597c5SAnurag S. Maskey {
26786ba597c5SAnurag S. Maskey 	(void) snprintf(instr, NWAM_MAX_VALUE_LEN, "%lld", *((int64_t *)in));
26796ba597c5SAnurag S. Maskey 	return (instr);
26806ba597c5SAnurag S. Maskey }
26816ba597c5SAnurag S. Maskey 
26826ba597c5SAnurag S. Maskey static const char *
26836ba597c5SAnurag S. Maskey uint2str(void *uin, const char *prop, char *uintstr)
26846ba597c5SAnurag S. Maskey {
26856ba597c5SAnurag S. Maskey 	/* returns NWAM_SUCCESS if prop is enum with string in uintstr */
26866ba597c5SAnurag S. Maskey 	if (nwam_uint64_get_value_string(prop, *((uint64_t *)uin),
26876ba597c5SAnurag S. Maskey 	    (const char **)&uintstr) != NWAM_SUCCESS) {
26886ba597c5SAnurag S. Maskey 		(void) snprintf(uintstr, NWAM_MAX_VALUE_LEN, "%lld",
26896ba597c5SAnurag S. Maskey 		    *((uint64_t *)uin));
26906ba597c5SAnurag S. Maskey 	}
26916ba597c5SAnurag S. Maskey 	return (uintstr);
26926ba597c5SAnurag S. Maskey }
26936ba597c5SAnurag S. Maskey 
26946ba597c5SAnurag S. Maskey /* ARGSUSED */
26956ba597c5SAnurag S. Maskey static const char *
26966ba597c5SAnurag S. Maskey bool2str(void *bool, const char *prop, char *boolstr)
26976ba597c5SAnurag S. Maskey {
26986ba597c5SAnurag S. Maskey 	(void) snprintf(boolstr, NWAM_MAX_VALUE_LEN, "%s",
26996ba597c5SAnurag S. Maskey 	    *((boolean_t *)bool) ? "true" : "false");
27006ba597c5SAnurag S. Maskey 	return (boolstr);
27016ba597c5SAnurag S. Maskey }
27026ba597c5SAnurag S. Maskey 
27036ba597c5SAnurag S. Maskey /*
27046ba597c5SAnurag S. Maskey  * Print the value (enums are converted to string), use DELIMITER for
27056ba597c5SAnurag S. Maskey  * array.  If strings are to be "quoted", pass B_TRUE for quoted_strings.
27066ba597c5SAnurag S. Maskey  */
27076ba597c5SAnurag S. Maskey static void
27086ba597c5SAnurag S. Maskey output_prop_val(const char *prop_name, nwam_value_t value, FILE *wf,
27096ba597c5SAnurag S. Maskey     boolean_t quoted_strings)
27106ba597c5SAnurag S. Maskey {
27116ba597c5SAnurag S. Maskey 	nwam_value_type_t	value_type;
27126ba597c5SAnurag S. Maskey 	uint_t			num;
27136ba597c5SAnurag S. Maskey 
27146ba597c5SAnurag S. Maskey 	/* arrays for values retrieved according to the type of value */
27156ba597c5SAnurag S. Maskey 	char		**svals;
27166ba597c5SAnurag S. Maskey 	uint64_t	*uvals;
27176ba597c5SAnurag S. Maskey 	int64_t		*ivals;
27186ba597c5SAnurag S. Maskey 	boolean_t	*bvals;
27196ba597c5SAnurag S. Maskey 
27206ba597c5SAnurag S. Maskey 	/* pointer to function to generate string representation of value */
27216ba597c5SAnurag S. Maskey 	const char	*(*tostr)(void *, const char *, char *);
27226ba597c5SAnurag S. Maskey 	char		str[NWAM_MAX_VALUE_LEN]; /* to store the string */
27236ba597c5SAnurag S. Maskey 	int		i;
27246ba597c5SAnurag S. Maskey 
27256ba597c5SAnurag S. Maskey 	if (nwam_value_get_type(value, &value_type) != NWAM_SUCCESS) {
27266ba597c5SAnurag S. Maskey 		nerr("Get value type error");
27276ba597c5SAnurag S. Maskey 		return;
27286ba597c5SAnurag S. Maskey 	}
27296ba597c5SAnurag S. Maskey 
27306ba597c5SAnurag S. Maskey 	if (value_type == NWAM_VALUE_TYPE_STRING) {
27316ba597c5SAnurag S. Maskey 		if (nwam_value_get_string_array(value, &svals, &num) !=
27326ba597c5SAnurag S. Maskey 		    NWAM_SUCCESS) {
27336ba597c5SAnurag S. Maskey 			nerr("Get string array error");
27346ba597c5SAnurag S. Maskey 			return;
27356ba597c5SAnurag S. Maskey 		}
27366ba597c5SAnurag S. Maskey 		tostr = quoted_strings ? str2qstr : str2str;
27376ba597c5SAnurag S. Maskey 	} else if (value_type == NWAM_VALUE_TYPE_INT64) {
27386ba597c5SAnurag S. Maskey 		if (nwam_value_get_int64_array(value, &ivals, &num) !=
27396ba597c5SAnurag S. Maskey 		    NWAM_SUCCESS) {
27406ba597c5SAnurag S. Maskey 			nerr("Get int64 array error");
27416ba597c5SAnurag S. Maskey 			return;
27426ba597c5SAnurag S. Maskey 		}
27436ba597c5SAnurag S. Maskey 		tostr = int2str;
27446ba597c5SAnurag S. Maskey 	} else if (value_type == NWAM_VALUE_TYPE_UINT64) {
27456ba597c5SAnurag S. Maskey 		if (nwam_value_get_uint64_array(value, &uvals, &num) !=
27466ba597c5SAnurag S. Maskey 		    NWAM_SUCCESS) {
27476ba597c5SAnurag S. Maskey 			nerr("Get uint64 array error");
27486ba597c5SAnurag S. Maskey 			return;
27496ba597c5SAnurag S. Maskey 		}
27506ba597c5SAnurag S. Maskey 		tostr = uint2str;
27516ba597c5SAnurag S. Maskey 	} else if (value_type == NWAM_VALUE_TYPE_BOOLEAN) {
27526ba597c5SAnurag S. Maskey 		if (nwam_value_get_boolean_array(value, &bvals, &num) !=
27536ba597c5SAnurag S. Maskey 		    NWAM_SUCCESS) {
27546ba597c5SAnurag S. Maskey 			nerr("Get boolean array error");
27556ba597c5SAnurag S. Maskey 			return;
27566ba597c5SAnurag S. Maskey 		}
27576ba597c5SAnurag S. Maskey 		tostr = bool2str;
27586ba597c5SAnurag S. Maskey 	}
27596ba597c5SAnurag S. Maskey 
27606ba597c5SAnurag S. Maskey 	/* now, loop and print each value */
27616ba597c5SAnurag S. Maskey 	for (i = 0; i < num; i++) {
27626ba597c5SAnurag S. Maskey 		void *val;
27636ba597c5SAnurag S. Maskey 
27646ba597c5SAnurag S. Maskey 		/* get the pointer to the ith value to pass to func() */
27656ba597c5SAnurag S. Maskey 		if (value_type == NWAM_VALUE_TYPE_STRING)
27666ba597c5SAnurag S. Maskey 			val = svals[i];
27676ba597c5SAnurag S. Maskey 		else if (value_type == NWAM_VALUE_TYPE_UINT64)
27686ba597c5SAnurag S. Maskey 			val = &(uvals[i]);
27696ba597c5SAnurag S. Maskey 		else if (value_type == NWAM_VALUE_TYPE_INT64)
27706ba597c5SAnurag S. Maskey 			val = &(ivals[i]);
27716ba597c5SAnurag S. Maskey 		else if (value_type == NWAM_VALUE_TYPE_BOOLEAN)
27726ba597c5SAnurag S. Maskey 			val = &(bvals[i]);
27736ba597c5SAnurag S. Maskey 
27746ba597c5SAnurag S. Maskey 		(void) fprintf(wf, "%s%s", tostr(val, prop_name, str),
27756ba597c5SAnurag S. Maskey 		    i != num-1 ? NWAM_VALUE_DELIMITER_STR : "");
27766ba597c5SAnurag S. Maskey 	}
27776ba597c5SAnurag S. Maskey }
27786ba597c5SAnurag S. Maskey 
27796ba597c5SAnurag S. Maskey /* Prints the property names aligned (for list/get) or "prop=" (for export) */
27806ba597c5SAnurag S. Maskey static int
27816ba597c5SAnurag S. Maskey output_propname_common(const char *prop, nwam_value_t values, void *arg,
27826ba597c5SAnurag S. Maskey     int width)
27836ba597c5SAnurag S. Maskey {
27846ba597c5SAnurag S. Maskey 	FILE *of = (arg == NULL) ? stdout : arg;
27856ba597c5SAnurag S. Maskey 
27866ba597c5SAnurag S. Maskey 	/* arg is NULL for list/get, not NULL for export */
27876ba597c5SAnurag S. Maskey 	if (arg == NULL)
27886ba597c5SAnurag S. Maskey 		(void) fprintf(of, "\t%-*s\t", width, prop);
27896ba597c5SAnurag S. Maskey 	else
27906ba597c5SAnurag S. Maskey 		(void) fprintf(of, "%s=", prop);
27916ba597c5SAnurag S. Maskey 
27926ba597c5SAnurag S. Maskey 	if (values != NULL)
27936ba597c5SAnurag S. Maskey 		output_prop_val(prop, values, of, B_TRUE);
27946ba597c5SAnurag S. Maskey 
27956ba597c5SAnurag S. Maskey 	(void) fprintf(of, "\n");
27966ba597c5SAnurag S. Maskey 	return (0);
27976ba597c5SAnurag S. Maskey }
27986ba597c5SAnurag S. Maskey 
27996ba597c5SAnurag S. Maskey static int
28006ba597c5SAnurag S. Maskey output_propname(const char *prop, nwam_value_t values, void *arg)
28016ba597c5SAnurag S. Maskey {
28026ba597c5SAnurag S. Maskey 	return (output_propname_common(prop, values, arg, 16));
28036ba597c5SAnurag S. Maskey }
28046ba597c5SAnurag S. Maskey 
28056ba597c5SAnurag S. Maskey /* For locations because of longer property names */
28066ba597c5SAnurag S. Maskey static int
28076ba597c5SAnurag S. Maskey output_loc_propname(const char *prop, nwam_value_t values, void *arg)
28086ba597c5SAnurag S. Maskey {
28096ba597c5SAnurag S. Maskey 	return (output_propname_common(prop, values, arg, 25));
28106ba597c5SAnurag S. Maskey }
28116ba597c5SAnurag S. Maskey 
28126ba597c5SAnurag S. Maskey /*
28136ba597c5SAnurag S. Maskey  * all_props specifies whether properties that have not been set should be
28146ba597c5SAnurag S. Maskey  * printed or not.  ncp and ncu_type are used only when the object_type is
28156ba597c5SAnurag S. Maskey  * NCU.
28166ba597c5SAnurag S. Maskey  */
28176ba597c5SAnurag S. Maskey static nwam_error_t
28186ba597c5SAnurag S. Maskey listprop(nwam_object_type_t object_type, void *handle, const char *name,
28196ba597c5SAnurag S. Maskey     boolean_t all_props, nwam_ncp_handle_t ncp, nwam_ncu_type_t ncu_type)
28206ba597c5SAnurag S. Maskey {
28216ba597c5SAnurag S. Maskey 	nwam_error_t	ret;
28226ba597c5SAnurag S. Maskey 	char		*lname = NULL, *realname = NULL;
28236ba597c5SAnurag S. Maskey 	boolean_t	lhandle = B_FALSE;
28246ba597c5SAnurag S. Maskey 	const char	**props = NULL;
28256ba597c5SAnurag S. Maskey 	uint_t		prop_num;
28266ba597c5SAnurag S. Maskey 	int		i;
28276ba597c5SAnurag S. Maskey 	nwam_value_t	vals;
28286ba597c5SAnurag S. Maskey 
28296ba597c5SAnurag S. Maskey 	/*
28306ba597c5SAnurag S. Maskey 	 * handle is NULL if called from a scope higher than the object's
28316ba597c5SAnurag S. Maskey 	 * scope, but name must be given; so get the handle.
28326ba597c5SAnurag S. Maskey 	 */
28336ba597c5SAnurag S. Maskey 	if (handle == NULL) {
28346ba597c5SAnurag S. Maskey 		lname = trim_quotes(name); /* name may have quotes */
28356ba597c5SAnurag S. Maskey 		switch (object_type) {
28366ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_NCP:
28376ba597c5SAnurag S. Maskey 			if ((ret = nwam_ncp_read(lname, 0,
28386ba597c5SAnurag S. Maskey 			    (nwam_ncp_handle_t *)&handle)) != NWAM_SUCCESS)
28396ba597c5SAnurag S. Maskey 				goto readfail;
28406ba597c5SAnurag S. Maskey 			break;
28416ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_NCU:
28426ba597c5SAnurag S. Maskey 			ret = nwam_ncu_read(ncp, lname, ncu_type, 0,
28436ba597c5SAnurag S. Maskey 			    (nwam_ncu_handle_t *)&handle);
28446ba597c5SAnurag S. Maskey 			if (ret == NWAM_ENTITY_MULTIPLE_VALUES) {
28456ba597c5SAnurag S. Maskey 				/*
28466ba597c5SAnurag S. Maskey 				 * Multiple NCUs with the given name exists.
28476ba597c5SAnurag S. Maskey 				 * Call listprop() for each NCU type.
28486ba597c5SAnurag S. Maskey 				 */
28496ba597c5SAnurag S. Maskey 				if ((ret = listprop(object_type, NULL, lname,
28506ba597c5SAnurag S. Maskey 				    all_props, ncp, NWAM_NCU_TYPE_LINK))
28516ba597c5SAnurag S. Maskey 				    != NWAM_SUCCESS)
28526ba597c5SAnurag S. Maskey 					goto done;
28536ba597c5SAnurag S. Maskey 				ret = listprop(object_type, NULL, lname,
28546ba597c5SAnurag S. Maskey 				    all_props, ncp, NWAM_NCU_TYPE_INTERFACE);
28556ba597c5SAnurag S. Maskey 				goto done;
28566ba597c5SAnurag S. Maskey 			} else if (ret != NWAM_SUCCESS) {
28576ba597c5SAnurag S. Maskey 				goto readfail;
28586ba597c5SAnurag S. Maskey 			}
28596ba597c5SAnurag S. Maskey 			break;
28606ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_LOC:
28616ba597c5SAnurag S. Maskey 			if ((ret = nwam_loc_read(lname, 0,
28626ba597c5SAnurag S. Maskey 			    (nwam_loc_handle_t *)&handle)) != NWAM_SUCCESS)
28636ba597c5SAnurag S. Maskey 				goto readfail;
28646ba597c5SAnurag S. Maskey 			break;
28656ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_ENM:
28666ba597c5SAnurag S. Maskey 			if ((ret = nwam_enm_read(lname, 0,
28676ba597c5SAnurag S. Maskey 			    (nwam_enm_handle_t *)&handle)) != NWAM_SUCCESS)
28686ba597c5SAnurag S. Maskey 				goto readfail;
28696ba597c5SAnurag S. Maskey 			break;
28706ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_KNOWN_WLAN:
28716ba597c5SAnurag S. Maskey 			if ((ret = nwam_known_wlan_read(lname, 0,
28726ba597c5SAnurag S. Maskey 			    (nwam_known_wlan_handle_t *)&handle))
28736ba597c5SAnurag S. Maskey 			    != NWAM_SUCCESS)
28746ba597c5SAnurag S. Maskey 				goto readfail;
28756ba597c5SAnurag S. Maskey 			break;
28766ba597c5SAnurag S. Maskey 		}
28776ba597c5SAnurag S. Maskey 		lhandle = B_TRUE;
28786ba597c5SAnurag S. Maskey 	}
28796ba597c5SAnurag S. Maskey 
28806ba597c5SAnurag S. Maskey 	if ((ret = object_name_from_handle(object_type, handle, &realname))
28816ba597c5SAnurag S. Maskey 	    != NWAM_SUCCESS)
28826ba597c5SAnurag S. Maskey 		goto done;
28836ba597c5SAnurag S. Maskey 
28846ba597c5SAnurag S. Maskey 	/* get the property list */
28856ba597c5SAnurag S. Maskey 	switch (object_type) {
28866ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_NCP:
28876ba597c5SAnurag S. Maskey 	{
28886ba597c5SAnurag S. Maskey 		/* walk NCUs */
28896ba597c5SAnurag S. Maskey 		boolean_t list_msg = B_TRUE;
28906ba597c5SAnurag S. Maskey 		ret = nwam_ncp_walk_ncus(handle, list_ncu_callback, &list_msg,
28916ba597c5SAnurag S. Maskey 		    NWAM_FLAG_NCU_TYPE_CLASS_ALL, NULL);
28926ba597c5SAnurag S. Maskey 		goto done;
28936ba597c5SAnurag S. Maskey 	}
28946ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_NCU:
28956ba597c5SAnurag S. Maskey 	{
28966ba597c5SAnurag S. Maskey 		nwam_ncu_type_t		ncu_type;
28976ba597c5SAnurag S. Maskey 		nwam_ncu_class_t	ncu_class;
28986ba597c5SAnurag S. Maskey 
28996ba597c5SAnurag S. Maskey 		if ((ret = nwam_ncu_get_ncu_type(handle, &ncu_type))
29006ba597c5SAnurag S. Maskey 		    != NWAM_SUCCESS)
29016ba597c5SAnurag S. Maskey 			goto done;
29026ba597c5SAnurag S. Maskey 		if ((ret = nwam_ncu_get_ncu_class(handle, &ncu_class))
29036ba597c5SAnurag S. Maskey 		    != NWAM_SUCCESS)
29046ba597c5SAnurag S. Maskey 			goto done;
29056ba597c5SAnurag S. Maskey 
29066ba597c5SAnurag S. Maskey 		ret = nwam_ncu_get_default_proplist(ncu_type, ncu_class, &props,
29076ba597c5SAnurag S. Maskey 		    &prop_num);
29086ba597c5SAnurag S. Maskey 		break;
29096ba597c5SAnurag S. Maskey 	}
29106ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_LOC:
29116ba597c5SAnurag S. Maskey 		ret = nwam_loc_get_default_proplist(&props, &prop_num);
29126ba597c5SAnurag S. Maskey 		break;
29136ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_ENM:
29146ba597c5SAnurag S. Maskey 		ret = nwam_enm_get_default_proplist(&props, &prop_num);
29156ba597c5SAnurag S. Maskey 		break;
29166ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_KNOWN_WLAN:
29176ba597c5SAnurag S. Maskey 		ret = nwam_known_wlan_get_default_proplist(&props, &prop_num);
29186ba597c5SAnurag S. Maskey 		break;
29196ba597c5SAnurag S. Maskey 	}
29206ba597c5SAnurag S. Maskey 	if (ret != NWAM_SUCCESS)
29216ba597c5SAnurag S. Maskey 		goto done;
29226ba597c5SAnurag S. Maskey 
29236ba597c5SAnurag S. Maskey 	/* print object type and name */
29246ba597c5SAnurag S. Maskey 	(void) printf("%s:%s\n", nwam_object_type_to_string(object_type),
29256ba597c5SAnurag S. Maskey 	    realname);
29266ba597c5SAnurag S. Maskey 
29276ba597c5SAnurag S. Maskey 	/* Loop through the properties and print */
29286ba597c5SAnurag S. Maskey 	for (i = 0; i < prop_num; i++) {
29296ba597c5SAnurag S. Maskey 		/* get the existing value for this property */
29306ba597c5SAnurag S. Maskey 		switch (object_type) {
29316ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_NCU:
29326ba597c5SAnurag S. Maskey 			ret = nwam_ncu_get_prop_value(handle, props[i], &vals);
29336ba597c5SAnurag S. Maskey 			break;
29346ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_LOC:
29356ba597c5SAnurag S. Maskey 			ret = nwam_loc_get_prop_value(handle, props[i], &vals);
29366ba597c5SAnurag S. Maskey 			break;
29376ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_ENM:
29386ba597c5SAnurag S. Maskey 			ret = nwam_enm_get_prop_value(handle, props[i], &vals);
29396ba597c5SAnurag S. Maskey 			break;
29406ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_KNOWN_WLAN:
29416ba597c5SAnurag S. Maskey 			ret = nwam_known_wlan_get_prop_value(handle, props[i],
29426ba597c5SAnurag S. Maskey 			    &vals);
29436ba597c5SAnurag S. Maskey 			break;
29446ba597c5SAnurag S. Maskey 		}
29456ba597c5SAnurag S. Maskey 		if (ret != NWAM_SUCCESS) {
29466ba597c5SAnurag S. Maskey 			/* _ENTITY_NOT_FOUND is ok if listing for all props */
29476ba597c5SAnurag S. Maskey 			if (!all_props)
29486ba597c5SAnurag S. Maskey 				continue;
29496ba597c5SAnurag S. Maskey 			else if (ret != NWAM_ENTITY_NOT_FOUND)
29506ba597c5SAnurag S. Maskey 				continue;
29516ba597c5SAnurag S. Maskey 		}
29526ba597c5SAnurag S. Maskey 
29536ba597c5SAnurag S. Maskey 		/* print property and value */
29546ba597c5SAnurag S. Maskey 		if (object_type == NWAM_OBJECT_TYPE_LOC)
29556ba597c5SAnurag S. Maskey 			output_loc_propname(props[i], vals, NULL);
29566ba597c5SAnurag S. Maskey 		else
29576ba597c5SAnurag S. Maskey 			output_propname(props[i], vals, NULL);
29586ba597c5SAnurag S. Maskey 		nwam_value_free(vals);
29596ba597c5SAnurag S. Maskey 	}
29606ba597c5SAnurag S. Maskey 
29616ba597c5SAnurag S. Maskey done:
29626ba597c5SAnurag S. Maskey 	free(lname);
29636ba597c5SAnurag S. Maskey 	free(realname);
29646ba597c5SAnurag S. Maskey 	if (props != NULL)
29656ba597c5SAnurag S. Maskey 		free(props);
29666ba597c5SAnurag S. Maskey 	if (lhandle) {
29676ba597c5SAnurag S. Maskey 		switch (object_type) {
29686ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_NCP:
29696ba597c5SAnurag S. Maskey 			nwam_ncp_free(handle);
29706ba597c5SAnurag S. Maskey 			break;
29716ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_NCU:
29726ba597c5SAnurag S. Maskey 			nwam_ncu_free(handle);
29736ba597c5SAnurag S. Maskey 			break;
29746ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_LOC:
29756ba597c5SAnurag S. Maskey 			nwam_loc_free(handle);
29766ba597c5SAnurag S. Maskey 			break;
29776ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_ENM:
29786ba597c5SAnurag S. Maskey 			nwam_enm_free(handle);
29796ba597c5SAnurag S. Maskey 			break;
29806ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_KNOWN_WLAN:
29816ba597c5SAnurag S. Maskey 			nwam_known_wlan_free(handle);
29826ba597c5SAnurag S. Maskey 			break;
29836ba597c5SAnurag S. Maskey 		}
29846ba597c5SAnurag S. Maskey 	}
29856ba597c5SAnurag S. Maskey 	/* don't treat _ENTITY_NOT_FOUND as an error */
29866ba597c5SAnurag S. Maskey 	if (ret == NWAM_ENTITY_NOT_FOUND)
29876ba597c5SAnurag S. Maskey 		ret = NWAM_SUCCESS;
29886ba597c5SAnurag S. Maskey 	return (ret);
29896ba597c5SAnurag S. Maskey 
29906ba597c5SAnurag S. Maskey readfail:
29916ba597c5SAnurag S. Maskey 	/* When nwam_*_read() fails */
29926ba597c5SAnurag S. Maskey 	free(lname);
29936ba597c5SAnurag S. Maskey 	return (ret);
29946ba597c5SAnurag S. Maskey }
29956ba597c5SAnurag S. Maskey 
29966ba597c5SAnurag S. Maskey /*
29976ba597c5SAnurag S. Maskey  * List profiles or property and its values.
29986ba597c5SAnurag S. Maskey  * If the -a option is specified, all properties are listed.
29996ba597c5SAnurag S. Maskey  */
30006ba597c5SAnurag S. Maskey void
30016ba597c5SAnurag S. Maskey list_func(cmd_t *cmd)
30026ba597c5SAnurag S. Maskey {
30036ba597c5SAnurag S. Maskey 	nwam_error_t	ret = NWAM_SUCCESS;
30046ba597c5SAnurag S. Maskey 	boolean_t	list_msg = B_TRUE;
30056ba597c5SAnurag S. Maskey 
30066ba597c5SAnurag S. Maskey 	boolean_t	list_loc = B_FALSE, list_enm = B_FALSE;
30076ba597c5SAnurag S. Maskey 	boolean_t	list_ncp = B_FALSE, list_ncu = B_FALSE;
30086ba597c5SAnurag S. Maskey 	boolean_t	list_wlan = B_FALSE;
30096ba597c5SAnurag S. Maskey 
30106ba597c5SAnurag S. Maskey 	/* whether all properties should be listed, given by the -a option */
30116ba597c5SAnurag S. Maskey 	boolean_t	all_props = B_FALSE;
30126ba597c5SAnurag S. Maskey 
30136ba597c5SAnurag S. Maskey 	/*
30146ba597c5SAnurag S. Maskey 	 * list_props says whether the properties should be listed.
30156ba597c5SAnurag S. Maskey 	 * Note that, here NCUs are treated as properties of NCPs.
30166ba597c5SAnurag S. Maskey 	 */
30176ba597c5SAnurag S. Maskey 	boolean_t	list_props = B_FALSE;
30186ba597c5SAnurag S. Maskey 
30196ba597c5SAnurag S. Maskey 	/* determine which properties to list, also validity tests */
30206ba597c5SAnurag S. Maskey 	if (current_scope == NWAM_SCOPE_GBL) {
30216ba597c5SAnurag S. Maskey 		/* res1_type is -1 if only "list -a" is used */
30226ba597c5SAnurag S. Maskey 		if (cmd->cmd_res1_type == -1) {
30236ba597c5SAnurag S. Maskey 			nerr("'list' requires an object to be specified with "
30246ba597c5SAnurag S. Maskey 			    "the -a option in the global scope");
30256ba597c5SAnurag S. Maskey 			return;
30266ba597c5SAnurag S. Maskey 		}
30276ba597c5SAnurag S. Maskey 		if (cmd->cmd_res1_type == RT1_LOC) {
30286ba597c5SAnurag S. Maskey 			list_props = B_TRUE;
30296ba597c5SAnurag S. Maskey 			list_loc = B_TRUE;
30306ba597c5SAnurag S. Maskey 		} else if (cmd->cmd_res1_type == RT1_ENM) {
30316ba597c5SAnurag S. Maskey 			list_props = B_TRUE;
30326ba597c5SAnurag S. Maskey 			list_enm = B_TRUE;
30336ba597c5SAnurag S. Maskey 		} else if (cmd->cmd_res1_type == RT1_WLAN) {
30346ba597c5SAnurag S. Maskey 			list_props = B_TRUE;
30356ba597c5SAnurag S. Maskey 			list_wlan = B_TRUE;
30366ba597c5SAnurag S. Maskey 		} else if (cmd->cmd_res1_type == RT1_NCP) {
30376ba597c5SAnurag S. Maskey 			list_ncp = B_TRUE;
30386ba597c5SAnurag S. Maskey 			list_props = B_TRUE;
30396ba597c5SAnurag S. Maskey 		} else {
30406ba597c5SAnurag S. Maskey 			list_loc = B_TRUE;
30416ba597c5SAnurag S. Maskey 			list_enm = B_TRUE;
30426ba597c5SAnurag S. Maskey 			list_wlan = B_TRUE;
30436ba597c5SAnurag S. Maskey 			list_ncp = B_TRUE;
30446ba597c5SAnurag S. Maskey 		}
30456ba597c5SAnurag S. Maskey 	}
30466ba597c5SAnurag S. Maskey 	if ((current_scope == NWAM_SCOPE_LOC ||
30476ba597c5SAnurag S. Maskey 	    current_scope == NWAM_SCOPE_ENM ||
30486ba597c5SAnurag S. Maskey 	    current_scope == NWAM_SCOPE_WLAN ||
30496ba597c5SAnurag S. Maskey 	    current_scope == NWAM_SCOPE_NCU) &&
30506ba597c5SAnurag S. Maskey 	    (cmd->cmd_argc >= 1 && cmd->cmd_res1_type != -1)) {
30516ba597c5SAnurag S. Maskey 		nerr("Additional options are not allowed with the -a option "
30526ba597c5SAnurag S. Maskey 		    "at this scope");
30536ba597c5SAnurag S. Maskey 		return;
30546ba597c5SAnurag S. Maskey 	}
30556ba597c5SAnurag S. Maskey 	if (current_scope == NWAM_SCOPE_LOC) {
30566ba597c5SAnurag S. Maskey 		list_loc = B_TRUE;
30576ba597c5SAnurag S. Maskey 		list_props = B_TRUE;
30586ba597c5SAnurag S. Maskey 	}
30596ba597c5SAnurag S. Maskey 	if (current_scope == NWAM_SCOPE_ENM) {
30606ba597c5SAnurag S. Maskey 		list_enm = B_TRUE;
30616ba597c5SAnurag S. Maskey 		list_props = B_TRUE;
30626ba597c5SAnurag S. Maskey 	}
30636ba597c5SAnurag S. Maskey 	if (current_scope == NWAM_SCOPE_WLAN) {
30646ba597c5SAnurag S. Maskey 		list_wlan = B_TRUE;
30656ba597c5SAnurag S. Maskey 		list_props = B_TRUE;
30666ba597c5SAnurag S. Maskey 	}
30676ba597c5SAnurag S. Maskey 	if (current_scope == NWAM_SCOPE_NCP) {
30686ba597c5SAnurag S. Maskey 		if (cmd->cmd_res1_type == RT1_ENM ||
30696ba597c5SAnurag S. Maskey 		    cmd->cmd_res1_type == RT1_LOC ||
30706ba597c5SAnurag S. Maskey 		    cmd->cmd_res1_type == RT1_WLAN) {
30716ba597c5SAnurag S. Maskey 			nerr("only ncu can be listed at this scope");
30726ba597c5SAnurag S. Maskey 			return;
30736ba597c5SAnurag S. Maskey 		}
30746ba597c5SAnurag S. Maskey 		if (cmd->cmd_res2_type == RT2_NCU) {
30756ba597c5SAnurag S. Maskey 			list_ncu = B_TRUE;
30766ba597c5SAnurag S. Maskey 			list_props = B_TRUE;
30776ba597c5SAnurag S. Maskey 		} else {
30786ba597c5SAnurag S. Maskey 			list_ncp = B_TRUE;
30796ba597c5SAnurag S. Maskey 			list_props = B_TRUE;
30806ba597c5SAnurag S. Maskey 		}
30816ba597c5SAnurag S. Maskey 	}
30826ba597c5SAnurag S. Maskey 	if (current_scope == NWAM_SCOPE_NCU) {
30836ba597c5SAnurag S. Maskey 		list_ncu = B_TRUE;
30846ba597c5SAnurag S. Maskey 		list_props = B_TRUE;
30856ba597c5SAnurag S. Maskey 	}
30866ba597c5SAnurag S. Maskey 
30876ba597c5SAnurag S. Maskey 	/* Check if the -a option is specified to list all properties */
30886ba597c5SAnurag S. Maskey 	if (cmd->cmd_res1_type == -1 || cmd->cmd_argc == 2) {
30896ba597c5SAnurag S. Maskey 		int c, argc = 1;
30906ba597c5SAnurag S. Maskey 		char **argv;
30916ba597c5SAnurag S. Maskey 		optind = 0;
30926ba597c5SAnurag S. Maskey 
30936ba597c5SAnurag S. Maskey 		/* if res1_type is -1, option is in argv[0], else in argv[1] */
30946ba597c5SAnurag S. Maskey 		if (cmd->cmd_res1_type == -1)
30956ba597c5SAnurag S. Maskey 			argv = cmd->cmd_argv;
30966ba597c5SAnurag S. Maskey 		else
30976ba597c5SAnurag S. Maskey 			argv = &(cmd->cmd_argv[1]);
30986ba597c5SAnurag S. Maskey 		while ((c = getopt(argc, argv, "a")) != EOF) {
30996ba597c5SAnurag S. Maskey 			switch (c) {
31006ba597c5SAnurag S. Maskey 			case 'a':
31016ba597c5SAnurag S. Maskey 				all_props = B_TRUE;
31026ba597c5SAnurag S. Maskey 				break;
31036ba597c5SAnurag S. Maskey 			default:
31046ba597c5SAnurag S. Maskey 				command_usage(CMD_LIST);
31056ba597c5SAnurag S. Maskey 				return;
31066ba597c5SAnurag S. Maskey 			}
31076ba597c5SAnurag S. Maskey 		}
31086ba597c5SAnurag S. Maskey 		if (cmd->cmd_res1_type == -1)
31096ba597c5SAnurag S. Maskey 			cmd->cmd_argv[0] = NULL;
31106ba597c5SAnurag S. Maskey 	}
31116ba597c5SAnurag S. Maskey 
31126ba597c5SAnurag S. Maskey 	/*
31136ba597c5SAnurag S. Maskey 	 * Now, print objects and/or according to the flags set.
31146ba597c5SAnurag S. Maskey 	 * name, if requested, is in argv[0].
31156ba597c5SAnurag S. Maskey 	 */
31166ba597c5SAnurag S. Maskey 	if (list_ncp) {
31176ba597c5SAnurag S. Maskey 		list_msg = B_TRUE;
31186ba597c5SAnurag S. Maskey 		if (list_props) {
31196ba597c5SAnurag S. Maskey 			ret = listprop(NWAM_OBJECT_TYPE_NCP, ncp_h,
31206ba597c5SAnurag S. Maskey 			    cmd->cmd_argv[0], all_props, NULL, -1);
31216ba597c5SAnurag S. Maskey 		} else {
31226ba597c5SAnurag S. Maskey 			ret = nwam_walk_ncps(list_ncp_callback, &list_msg, 0,
31236ba597c5SAnurag S. Maskey 			    NULL);
31246ba597c5SAnurag S. Maskey 		}
31256ba597c5SAnurag S. Maskey 		if (ret != NWAM_SUCCESS)
31266ba597c5SAnurag S. Maskey 			goto done;
31276ba597c5SAnurag S. Maskey 	}
31286ba597c5SAnurag S. Maskey 
31296ba597c5SAnurag S. Maskey 	if (list_ncu) {
31306ba597c5SAnurag S. Maskey 		list_msg = B_TRUE;
31316ba597c5SAnurag S. Maskey 		if (ncp_h == NULL) {
31326ba597c5SAnurag S. Maskey 			nerr("NCP has not been read");
31336ba597c5SAnurag S. Maskey 			return;
31346ba597c5SAnurag S. Maskey 		}
31356ba597c5SAnurag S. Maskey 		if (list_props) {
31366ba597c5SAnurag S. Maskey 			nwam_ncu_class_t	ncu_class;
31376ba597c5SAnurag S. Maskey 			nwam_ncu_type_t		ncu_type;
31386ba597c5SAnurag S. Maskey 
31396ba597c5SAnurag S. Maskey 			/* determine the NCU type first */
31406ba597c5SAnurag S. Maskey 			if (ncu_h == NULL) {
31416ba597c5SAnurag S. Maskey 				ncu_class = (nwam_ncu_class_t)
31426ba597c5SAnurag S. Maskey 				    cmd->cmd_ncu_class_type;
31436ba597c5SAnurag S. Maskey 				ncu_type = nwam_ncu_class_to_type(ncu_class);
31446ba597c5SAnurag S. Maskey 			} else {
31456ba597c5SAnurag S. Maskey 				if ((ret = nwam_ncu_get_ncu_type(ncu_h,
31466ba597c5SAnurag S. Maskey 				    &ncu_type)) != NWAM_SUCCESS)
31476ba597c5SAnurag S. Maskey 					goto done;
31486ba597c5SAnurag S. Maskey 			}
31496ba597c5SAnurag S. Maskey 			ret = listprop(NWAM_OBJECT_TYPE_NCU, ncu_h,
31506ba597c5SAnurag S. Maskey 			    cmd->cmd_argv[0], all_props, ncp_h, ncu_type);
31516ba597c5SAnurag S. Maskey 			if (ret != NWAM_SUCCESS)
31526ba597c5SAnurag S. Maskey 				goto done;
31536ba597c5SAnurag S. Maskey 		}
31546ba597c5SAnurag S. Maskey 	}
31556ba597c5SAnurag S. Maskey 
31566ba597c5SAnurag S. Maskey 	if (list_loc) {
31576ba597c5SAnurag S. Maskey 		list_msg = B_TRUE;
31586ba597c5SAnurag S. Maskey 		if (list_props) {
31596ba597c5SAnurag S. Maskey 			ret = listprop(NWAM_OBJECT_TYPE_LOC, loc_h,
31606ba597c5SAnurag S. Maskey 			    cmd->cmd_argv[0], all_props, NULL, -1);
31616ba597c5SAnurag S. Maskey 		} else {
31626ba597c5SAnurag S. Maskey 			ret = nwam_walk_locs(list_loc_callback, &list_msg,
31636ba597c5SAnurag S. Maskey 			    NWAM_FLAG_ACTIVATION_MODE_ALL, NULL);
31646ba597c5SAnurag S. Maskey 		}
31656ba597c5SAnurag S. Maskey 		if (ret != NWAM_SUCCESS)
31666ba597c5SAnurag S. Maskey 			goto done;
31676ba597c5SAnurag S. Maskey 	}
31686ba597c5SAnurag S. Maskey 
31696ba597c5SAnurag S. Maskey 	if (list_enm) {
31706ba597c5SAnurag S. Maskey 		list_msg = B_TRUE;
31716ba597c5SAnurag S. Maskey 		if (list_props) {
31726ba597c5SAnurag S. Maskey 			ret = listprop(NWAM_OBJECT_TYPE_ENM, enm_h,
31736ba597c5SAnurag S. Maskey 			    cmd->cmd_argv[0], all_props, NULL, -1);
31746ba597c5SAnurag S. Maskey 		} else {
31756ba597c5SAnurag S. Maskey 			ret = nwam_walk_enms(list_enm_callback, &list_msg,
31766ba597c5SAnurag S. Maskey 			    NWAM_FLAG_ACTIVATION_MODE_ALL, NULL);
31776ba597c5SAnurag S. Maskey 		}
31786ba597c5SAnurag S. Maskey 		if (ret != NWAM_SUCCESS)
31796ba597c5SAnurag S. Maskey 			goto done;
31806ba597c5SAnurag S. Maskey 	}
31816ba597c5SAnurag S. Maskey 
31826ba597c5SAnurag S. Maskey 	if (list_wlan) {
31836ba597c5SAnurag S. Maskey 		list_msg = B_TRUE;
31846ba597c5SAnurag S. Maskey 		if (list_props) {
31856ba597c5SAnurag S. Maskey 			ret = listprop(NWAM_OBJECT_TYPE_KNOWN_WLAN, wlan_h,
31866ba597c5SAnurag S. Maskey 			    cmd->cmd_argv[0], all_props, NULL, -1);
31876ba597c5SAnurag S. Maskey 		} else {
31886ba597c5SAnurag S. Maskey 			ret = nwam_walk_known_wlans(list_wlan_callback,
31896ba597c5SAnurag S. Maskey 			    &list_msg, NWAM_FLAG_KNOWN_WLAN_WALK_PRIORITY_ORDER,
31906ba597c5SAnurag S. Maskey 			    NULL);
31916ba597c5SAnurag S. Maskey 		}
31926ba597c5SAnurag S. Maskey 		if (ret != NWAM_SUCCESS)
31936ba597c5SAnurag S. Maskey 			goto done;
31946ba597c5SAnurag S. Maskey 	}
31956ba597c5SAnurag S. Maskey 
31966ba597c5SAnurag S. Maskey done:
31976ba597c5SAnurag S. Maskey 	if (ret != NWAM_SUCCESS)
31986ba597c5SAnurag S. Maskey 		nwamerr(ret, "List error");
31996ba597c5SAnurag S. Maskey }
32006ba597c5SAnurag S. Maskey 
32016ba597c5SAnurag S. Maskey static int
32026ba597c5SAnurag S. Maskey write_export_command(nwam_object_type_t object_type, const char *prop,
32036ba597c5SAnurag S. Maskey     nwam_value_t values, FILE *of)
32046ba597c5SAnurag S. Maskey {
32056ba597c5SAnurag S. Maskey 	/* exclude read-only properties */
32066ba597c5SAnurag S. Maskey 	if (is_prop_read_only(object_type, prop))
32076ba597c5SAnurag S. Maskey 		return (0);
32086ba597c5SAnurag S. Maskey 
32096ba597c5SAnurag S. Maskey 	(void) fprintf(of, "set ");
32106ba597c5SAnurag S. Maskey 	output_propname(prop, values, of);
32116ba597c5SAnurag S. Maskey 	return (0);
32126ba597c5SAnurag S. Maskey }
32136ba597c5SAnurag S. Maskey 
32146ba597c5SAnurag S. Maskey static int
32156ba597c5SAnurag S. Maskey export_ncu_callback(nwam_ncu_handle_t ncu, void *arg)
32166ba597c5SAnurag S. Maskey {
32176ba597c5SAnurag S. Maskey 	char		*name;
32186ba597c5SAnurag S. Maskey 	const char	**props;
32196ba597c5SAnurag S. Maskey 	nwam_ncu_type_t type;
32206ba597c5SAnurag S. Maskey 	nwam_ncu_class_t class;
32216ba597c5SAnurag S. Maskey 	nwam_value_t	vals;
32226ba597c5SAnurag S. Maskey 	nwam_error_t	ret;
32236ba597c5SAnurag S. Maskey 	uint_t		num;
32246ba597c5SAnurag S. Maskey 	int		i;
32256ba597c5SAnurag S. Maskey 	FILE		*of = arg;
32266ba597c5SAnurag S. Maskey 
32276ba597c5SAnurag S. Maskey 	assert(of != NULL);
32286ba597c5SAnurag S. Maskey 
32296ba597c5SAnurag S. Maskey 	/* get the NCU's type and class */
32306ba597c5SAnurag S. Maskey 	if ((ret = nwam_ncu_get_ncu_type(ncu, &type)) != NWAM_SUCCESS)
32316ba597c5SAnurag S. Maskey 		return (ret);
32326ba597c5SAnurag S. Maskey 	if ((ret = nwam_ncu_get_ncu_class(ncu, &class)) != NWAM_SUCCESS)
32336ba597c5SAnurag S. Maskey 		return (ret);
32346ba597c5SAnurag S. Maskey 
32356ba597c5SAnurag S. Maskey 	if ((ret = nwam_ncu_get_name(ncu, &name)) != NWAM_SUCCESS)
32366ba597c5SAnurag S. Maskey 		return (ret);
32376ba597c5SAnurag S. Maskey 
32386ba597c5SAnurag S. Maskey 	(void) fprintf(of, "create ncu %s \"%s\"\n",
32396ba597c5SAnurag S. Maskey 	    propval_to_str(NWAM_NCU_PROP_CLASS, class), name);
32406ba597c5SAnurag S. Maskey 	free(name);
32416ba597c5SAnurag S. Maskey 	/*
32426ba597c5SAnurag S. Maskey 	 * Because of dependencies between properties, they have to be
32436ba597c5SAnurag S. Maskey 	 * exported in the same order as when they are walked.
32446ba597c5SAnurag S. Maskey 	 */
32456ba597c5SAnurag S. Maskey 	if ((ret = nwam_ncu_get_default_proplist(type, class, &props, &num))
32466ba597c5SAnurag S. Maskey 	    != NWAM_SUCCESS)
32476ba597c5SAnurag S. Maskey 		return (ret);
32486ba597c5SAnurag S. Maskey 	for (i = 0; i < num; i++) {
32496ba597c5SAnurag S. Maskey 		ret = nwam_ncu_get_prop_value(ncu, props[i], &vals);
32506ba597c5SAnurag S. Maskey 		if (ret == NWAM_SUCCESS) {
32516ba597c5SAnurag S. Maskey 			write_export_command(NWAM_OBJECT_TYPE_NCU, props[i],
32526ba597c5SAnurag S. Maskey 			    vals, of);
32536ba597c5SAnurag S. Maskey 			nwam_value_free(vals);
32546ba597c5SAnurag S. Maskey 		}
32556ba597c5SAnurag S. Maskey 	}
32566ba597c5SAnurag S. Maskey 	(void) fprintf(of, "end\n");
32576ba597c5SAnurag S. Maskey 
32586ba597c5SAnurag S. Maskey 	free(props);
32596ba597c5SAnurag S. Maskey 	return (0);
32606ba597c5SAnurag S. Maskey }
32616ba597c5SAnurag S. Maskey 
32626ba597c5SAnurag S. Maskey static int
32636ba597c5SAnurag S. Maskey export_ncp_callback(nwam_ncp_handle_t ncp, void *arg)
32646ba597c5SAnurag S. Maskey {
32656ba597c5SAnurag S. Maskey 	char		*name;
32666ba597c5SAnurag S. Maskey 	nwam_error_t	ret;
32676ba597c5SAnurag S. Maskey 	FILE		*of = arg;
32686ba597c5SAnurag S. Maskey 
32696ba597c5SAnurag S. Maskey 	assert(of != NULL);
32706ba597c5SAnurag S. Maskey 
32716ba597c5SAnurag S. Maskey 	if ((ret = nwam_ncp_get_name(ncp, &name)) != NWAM_SUCCESS)
32726ba597c5SAnurag S. Maskey 		return (ret);
32736ba597c5SAnurag S. Maskey 
32746ba597c5SAnurag S. Maskey 	/* Do not export "automatic" NCP */
32756ba597c5SAnurag S. Maskey 	if (NWAM_NCP_AUTOMATIC(name)) {
32766ba597c5SAnurag S. Maskey 		free(name);
32776ba597c5SAnurag S. Maskey 		return (0);
32786ba597c5SAnurag S. Maskey 	}
32796ba597c5SAnurag S. Maskey 
32806ba597c5SAnurag S. Maskey 	(void) fprintf(of, "create ncp \"%s\"\n", name);
32816ba597c5SAnurag S. Maskey 	free(name);
32826ba597c5SAnurag S. Maskey 
32836ba597c5SAnurag S. Maskey 	/* now walk NCUs for this ncp */
32846ba597c5SAnurag S. Maskey 	ret = nwam_ncp_walk_ncus(ncp, export_ncu_callback, of,
32856ba597c5SAnurag S. Maskey 	    NWAM_FLAG_NCU_TYPE_CLASS_ALL, NULL);
32866ba597c5SAnurag S. Maskey 	if (ret != NWAM_SUCCESS) {
32876ba597c5SAnurag S. Maskey 		nwamerr(ret, "Export ncp error: failed to walk ncus");
32886ba597c5SAnurag S. Maskey 		return (ret);
32896ba597c5SAnurag S. Maskey 	}
32906ba597c5SAnurag S. Maskey 	(void) fprintf(of, "end\n");
32916ba597c5SAnurag S. Maskey 	return (0);
32926ba597c5SAnurag S. Maskey }
32936ba597c5SAnurag S. Maskey 
32946ba597c5SAnurag S. Maskey static int
32956ba597c5SAnurag S. Maskey export_enm_callback(nwam_enm_handle_t enm, void *arg)
32966ba597c5SAnurag S. Maskey {
32976ba597c5SAnurag S. Maskey 	char		*name;
32986ba597c5SAnurag S. Maskey 	const char	**props;
32996ba597c5SAnurag S. Maskey 	nwam_value_t	vals;
33006ba597c5SAnurag S. Maskey 	nwam_error_t	ret;
33016ba597c5SAnurag S. Maskey 	uint_t		num;
33026ba597c5SAnurag S. Maskey 	int		i;
33036ba597c5SAnurag S. Maskey 	FILE		*of = arg;
33046ba597c5SAnurag S. Maskey 
33056ba597c5SAnurag S. Maskey 	assert(of != NULL);
33066ba597c5SAnurag S. Maskey 
33076ba597c5SAnurag S. Maskey 	if ((ret = nwam_enm_get_name(enm, &name)) != NWAM_SUCCESS)
33086ba597c5SAnurag S. Maskey 		return (ret);
33096ba597c5SAnurag S. Maskey 
33106ba597c5SAnurag S. Maskey 	(void) fprintf(of, "create enm \"%s\"\n", name);
33116ba597c5SAnurag S. Maskey 	free(name);
33126ba597c5SAnurag S. Maskey 	/*
33136ba597c5SAnurag S. Maskey 	 * Because of dependencies between properties, they have to be
33146ba597c5SAnurag S. Maskey 	 * exported in the same order as when they are walked.
33156ba597c5SAnurag S. Maskey 	 */
33166ba597c5SAnurag S. Maskey 	if ((ret = nwam_enm_get_default_proplist(&props, &num)) != NWAM_SUCCESS)
33176ba597c5SAnurag S. Maskey 		return (ret);
33186ba597c5SAnurag S. Maskey 	for (i = 0; i < num; i++) {
33196ba597c5SAnurag S. Maskey 		ret = nwam_enm_get_prop_value(enm, props[i], &vals);
33206ba597c5SAnurag S. Maskey 		if (ret == NWAM_SUCCESS) {
33216ba597c5SAnurag S. Maskey 			write_export_command(NWAM_OBJECT_TYPE_ENM, props[i],
33226ba597c5SAnurag S. Maskey 			    vals, of);
33236ba597c5SAnurag S. Maskey 			nwam_value_free(vals);
33246ba597c5SAnurag S. Maskey 		}
33256ba597c5SAnurag S. Maskey 	}
33266ba597c5SAnurag S. Maskey 	(void) fprintf(of, "end\n");
33276ba597c5SAnurag S. Maskey 
33286ba597c5SAnurag S. Maskey 	free(props);
33296ba597c5SAnurag S. Maskey 	return (0);
33306ba597c5SAnurag S. Maskey }
33316ba597c5SAnurag S. Maskey 
33326ba597c5SAnurag S. Maskey static int
33336ba597c5SAnurag S. Maskey export_loc_callback(nwam_loc_handle_t loc, void *arg)
33346ba597c5SAnurag S. Maskey {
33356ba597c5SAnurag S. Maskey 	char		*name;
33366ba597c5SAnurag S. Maskey 	const char	**props;
33376ba597c5SAnurag S. Maskey 	nwam_value_t	vals;
33386ba597c5SAnurag S. Maskey 	nwam_error_t	ret;
33396ba597c5SAnurag S. Maskey 	uint_t		num;
33406ba597c5SAnurag S. Maskey 	int		i;
33416ba597c5SAnurag S. Maskey 	FILE		*of = arg;
33426ba597c5SAnurag S. Maskey 
33436ba597c5SAnurag S. Maskey 	assert(of != NULL);
33446ba597c5SAnurag S. Maskey 
33456ba597c5SAnurag S. Maskey 	if ((ret = nwam_loc_get_name(loc, &name)) != NWAM_SUCCESS)
33466ba597c5SAnurag S. Maskey 		return (ret);
33476ba597c5SAnurag S. Maskey 
33486ba597c5SAnurag S. Maskey 	/* Do not export Automatic, NoNet or Legacy locations */
33496ba597c5SAnurag S. Maskey 	if (NWAM_LOC_NAME_PRE_DEFINED(name)) {
33506ba597c5SAnurag S. Maskey 		free(name);
33516ba597c5SAnurag S. Maskey 		return (0);
33526ba597c5SAnurag S. Maskey 	}
33536ba597c5SAnurag S. Maskey 
33546ba597c5SAnurag S. Maskey 	(void) fprintf(of, "create loc \"%s\"\n", name);
33556ba597c5SAnurag S. Maskey 	free(name);
33566ba597c5SAnurag S. Maskey 	/*
33576ba597c5SAnurag S. Maskey 	 * Because of dependencies between properties, they have to be
33586ba597c5SAnurag S. Maskey 	 * exported in the same order as when they are walked.
33596ba597c5SAnurag S. Maskey 	 */
33606ba597c5SAnurag S. Maskey 	if ((ret = nwam_loc_get_default_proplist(&props, &num)) != NWAM_SUCCESS)
33616ba597c5SAnurag S. Maskey 		return (ret);
33626ba597c5SAnurag S. Maskey 	for (i = 0; i < num; i++) {
33636ba597c5SAnurag S. Maskey 		ret = nwam_loc_get_prop_value(loc, props[i], &vals);
33646ba597c5SAnurag S. Maskey 		if (ret == NWAM_SUCCESS) {
33656ba597c5SAnurag S. Maskey 			write_export_command(NWAM_OBJECT_TYPE_LOC, props[i],
33666ba597c5SAnurag S. Maskey 			    vals, of);
33676ba597c5SAnurag S. Maskey 			nwam_value_free(vals);
33686ba597c5SAnurag S. Maskey 		}
33696ba597c5SAnurag S. Maskey 	}
33706ba597c5SAnurag S. Maskey 	(void) fprintf(of, "end\n");
33716ba597c5SAnurag S. Maskey 
33726ba597c5SAnurag S. Maskey 	free(props);
33736ba597c5SAnurag S. Maskey 	return (0);
33746ba597c5SAnurag S. Maskey }
33756ba597c5SAnurag S. Maskey 
33766ba597c5SAnurag S. Maskey static int
33776ba597c5SAnurag S. Maskey export_wlan_callback(nwam_known_wlan_handle_t wlan, void *arg)
33786ba597c5SAnurag S. Maskey {
33796ba597c5SAnurag S. Maskey 	char		*name;
33806ba597c5SAnurag S. Maskey 	const char	**props;
33816ba597c5SAnurag S. Maskey 	nwam_value_t	vals;
33826ba597c5SAnurag S. Maskey 	nwam_error_t	ret;
33836ba597c5SAnurag S. Maskey 	uint_t		num;
33846ba597c5SAnurag S. Maskey 	int		i;
33856ba597c5SAnurag S. Maskey 	FILE		*of = arg;
33866ba597c5SAnurag S. Maskey 
33876ba597c5SAnurag S. Maskey 	assert(of != NULL);
33886ba597c5SAnurag S. Maskey 
33896ba597c5SAnurag S. Maskey 	if ((ret = nwam_known_wlan_get_name(wlan, &name)) != NWAM_SUCCESS)
33906ba597c5SAnurag S. Maskey 		return (ret);
33916ba597c5SAnurag S. Maskey 
33926ba597c5SAnurag S. Maskey 	(void) fprintf(of, "create wlan \"%s\"\n", name);
33936ba597c5SAnurag S. Maskey 	free(name);
33946ba597c5SAnurag S. Maskey 	/*
33956ba597c5SAnurag S. Maskey 	 * Because of dependencies between properties, they have to be
33966ba597c5SAnurag S. Maskey 	 * exported in the same order as when they are walked.
33976ba597c5SAnurag S. Maskey 	 */
33986ba597c5SAnurag S. Maskey 	if ((ret = nwam_known_wlan_get_default_proplist(&props, &num))
33996ba597c5SAnurag S. Maskey 	    != NWAM_SUCCESS)
34006ba597c5SAnurag S. Maskey 		return (ret);
34016ba597c5SAnurag S. Maskey 	for (i = 0; i < num; i++) {
34026ba597c5SAnurag S. Maskey 		ret = nwam_known_wlan_get_prop_value(wlan, props[i], &vals);
34036ba597c5SAnurag S. Maskey 		if (ret == NWAM_SUCCESS) {
34046ba597c5SAnurag S. Maskey 			write_export_command(NWAM_OBJECT_TYPE_KNOWN_WLAN,
34056ba597c5SAnurag S. Maskey 			    props[i], vals, of);
34066ba597c5SAnurag S. Maskey 			nwam_value_free(vals);
34076ba597c5SAnurag S. Maskey 		}
34086ba597c5SAnurag S. Maskey 	}
34096ba597c5SAnurag S. Maskey 	(void) fprintf(of, "end\n");
34106ba597c5SAnurag S. Maskey 
34116ba597c5SAnurag S. Maskey 	free(props);
34126ba597c5SAnurag S. Maskey 	return (0);
34136ba597c5SAnurag S. Maskey }
34146ba597c5SAnurag S. Maskey 
34156ba597c5SAnurag S. Maskey /*
34166ba597c5SAnurag S. Maskey  * Writes configuration to screen or file (with -f option).
34176ba597c5SAnurag S. Maskey  * Writes a "destroy -a" if option -d is given.
34186ba597c5SAnurag S. Maskey  */
34196ba597c5SAnurag S. Maskey void
34206ba597c5SAnurag S. Maskey export_func(cmd_t *cmd)
34216ba597c5SAnurag S. Maskey {
34226ba597c5SAnurag S. Maskey 	int		c;
34236ba597c5SAnurag S. Maskey 	boolean_t	need_to_close = B_FALSE, write_to_file = B_FALSE;
34246ba597c5SAnurag S. Maskey 	boolean_t	add_destroy = B_FALSE, lhandle = B_FALSE;
34256ba597c5SAnurag S. Maskey 	char		filepath[MAXPATHLEN];
34266ba597c5SAnurag S. Maskey 	nwam_error_t	ret = NWAM_SUCCESS;
34276ba597c5SAnurag S. Maskey 	FILE		*of = NULL; /* either filename or stdout */
34286ba597c5SAnurag S. Maskey 
34296ba597c5SAnurag S. Maskey 	/* what to export */
34306ba597c5SAnurag S. Maskey 	boolean_t export_ncp = B_FALSE, export_ncu = B_FALSE;
34316ba597c5SAnurag S. Maskey 	boolean_t export_loc = B_FALSE, export_enm = B_FALSE;
34326ba597c5SAnurag S. Maskey 	boolean_t export_wlan = B_FALSE;
34336ba597c5SAnurag S. Maskey 	char *name = NULL;
34346ba597c5SAnurag S. Maskey 
34356ba597c5SAnurag S. Maskey 	/* check for -d and -f flags */
34366ba597c5SAnurag S. Maskey 	filepath[0] = '\0';
34376ba597c5SAnurag S. Maskey 	optind = 0;
34386ba597c5SAnurag S. Maskey 	while ((c = getopt(cmd->cmd_argc, cmd->cmd_argv, "df:")) != EOF) {
34396ba597c5SAnurag S. Maskey 		switch (c) {
34406ba597c5SAnurag S. Maskey 		case 'f':
34416ba597c5SAnurag S. Maskey 			write_to_file = B_TRUE;
34426ba597c5SAnurag S. Maskey 			break;
34436ba597c5SAnurag S. Maskey 		case 'd':
34446ba597c5SAnurag S. Maskey 			add_destroy = B_TRUE;
34456ba597c5SAnurag S. Maskey 			break;
34466ba597c5SAnurag S. Maskey 		default:
34476ba597c5SAnurag S. Maskey 			command_usage(CMD_EXPORT);
34486ba597c5SAnurag S. Maskey 			return;
34496ba597c5SAnurag S. Maskey 		}
34506ba597c5SAnurag S. Maskey 	}
34516ba597c5SAnurag S. Maskey 
34526ba597c5SAnurag S. Maskey 	/* determine where to export */
34536ba597c5SAnurag S. Maskey 	if (!write_to_file) {
34546ba597c5SAnurag S. Maskey 		of = stdout;
34556ba597c5SAnurag S. Maskey 	} else {
34566ba597c5SAnurag S. Maskey 		/*
34576ba597c5SAnurag S. Maskey 		 * If -d was specified with -f, then argv[2] is filename,
34586ba597c5SAnurag S. Maskey 		 * otherwise, argv[1] is filename.
34596ba597c5SAnurag S. Maskey 		 */
34606ba597c5SAnurag S. Maskey 		(void) strlcpy(filepath,
34616ba597c5SAnurag S. Maskey 		    (add_destroy ? cmd->cmd_argv[2] : cmd->cmd_argv[1]),
34626ba597c5SAnurag S. Maskey 		    sizeof (filepath));
34636ba597c5SAnurag S. Maskey 		if ((of = fopen(filepath, "w")) == NULL) {
34646ba597c5SAnurag S. Maskey 			nerr(gettext("opening file '%s': %s"), filepath,
34656ba597c5SAnurag S. Maskey 			    strerror(errno));
34666ba597c5SAnurag S. Maskey 			goto done;
34676ba597c5SAnurag S. Maskey 		}
34686ba597c5SAnurag S. Maskey 		setbuf(of, NULL);
34696ba597c5SAnurag S. Maskey 		need_to_close = B_TRUE;
34706ba597c5SAnurag S. Maskey 	}
34716ba597c5SAnurag S. Maskey 
34726ba597c5SAnurag S. Maskey 	if (add_destroy) {
34736ba597c5SAnurag S. Maskey 		/* only possible in global scope */
34746ba597c5SAnurag S. Maskey 		if (current_scope == NWAM_SCOPE_GBL) {
34756ba597c5SAnurag S. Maskey 			(void) fprintf(of, "destroy -a\n");
34766ba597c5SAnurag S. Maskey 		} else {
34776ba597c5SAnurag S. Maskey 			nerr("Option -d is not allowed in non-global scope");
34786ba597c5SAnurag S. Maskey 			goto done;
34796ba597c5SAnurag S. Maskey 		}
34806ba597c5SAnurag S. Maskey 	}
34816ba597c5SAnurag S. Maskey 
34826ba597c5SAnurag S. Maskey 	/* In the following scopes, only the -f argument is valid */
34836ba597c5SAnurag S. Maskey 	if (((current_scope == NWAM_SCOPE_LOC ||
34846ba597c5SAnurag S. Maskey 	    current_scope == NWAM_SCOPE_ENM ||
34856ba597c5SAnurag S. Maskey 	    current_scope == NWAM_SCOPE_WLAN ||
34866ba597c5SAnurag S. Maskey 	    current_scope == NWAM_SCOPE_NCU) &&
34876ba597c5SAnurag S. Maskey 	    cmd->cmd_argc != 0 && !write_to_file)) {
34886ba597c5SAnurag S. Maskey 		nerr("'export' does not take arguments at this scope");
34896ba597c5SAnurag S. Maskey 		goto done;
34906ba597c5SAnurag S. Maskey 	}
34916ba597c5SAnurag S. Maskey 	if (current_scope == NWAM_SCOPE_NCP) {
34926ba597c5SAnurag S. Maskey 		if (cmd->cmd_res1_type == RT1_ENM ||
34936ba597c5SAnurag S. Maskey 		    cmd->cmd_res1_type == RT1_LOC ||
34946ba597c5SAnurag S. Maskey 		    cmd->cmd_res1_type == RT1_WLAN) {
34956ba597c5SAnurag S. Maskey 			nerr("only ncu can be exported at this scope");
34966ba597c5SAnurag S. Maskey 			goto done;
34976ba597c5SAnurag S. Maskey 		}
34986ba597c5SAnurag S. Maskey 	}
34996ba597c5SAnurag S. Maskey 
35006ba597c5SAnurag S. Maskey 	/*
35016ba597c5SAnurag S. Maskey 	 * Determine what objects to export depending on scope and command
35026ba597c5SAnurag S. Maskey 	 * arguments.  If -f is specified, then the object name is argv[2].
35036ba597c5SAnurag S. Maskey 	 * Otherwise, argv[0] is name, unless exporting all in global
35046ba597c5SAnurag S. Maskey 	 * scope in which case name is set back to NULL.
35056ba597c5SAnurag S. Maskey 	 */
35066ba597c5SAnurag S. Maskey 	switch (current_scope) {
35076ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_GBL:
35086ba597c5SAnurag S. Maskey 		name = (write_to_file ? trim_quotes(cmd->cmd_argv[2]) :
35096ba597c5SAnurag S. Maskey 		    trim_quotes(cmd->cmd_argv[0]));
35106ba597c5SAnurag S. Maskey 		switch (cmd->cmd_res1_type) {
35116ba597c5SAnurag S. Maskey 		case RT1_LOC:
35126ba597c5SAnurag S. Maskey 			export_loc = B_TRUE;
35136ba597c5SAnurag S. Maskey 			break;
35146ba597c5SAnurag S. Maskey 		case RT1_ENM:
35156ba597c5SAnurag S. Maskey 			export_enm = B_TRUE;
35166ba597c5SAnurag S. Maskey 			break;
35176ba597c5SAnurag S. Maskey 		case RT1_WLAN:
35186ba597c5SAnurag S. Maskey 			export_wlan = B_TRUE;
35196ba597c5SAnurag S. Maskey 			break;
35206ba597c5SAnurag S. Maskey 		case RT1_NCP:
35216ba597c5SAnurag S. Maskey 			export_ncp = B_TRUE;
35226ba597c5SAnurag S. Maskey 			if (cmd->cmd_res2_type == RT2_NCU) {
35236ba597c5SAnurag S. Maskey 				nerr("cannot export ncu at from global scope");
35246ba597c5SAnurag S. Maskey 				goto done;
35256ba597c5SAnurag S. Maskey 			}
35266ba597c5SAnurag S. Maskey 			break;
35276ba597c5SAnurag S. Maskey 		default:
35286ba597c5SAnurag S. Maskey 			/* export everything */
35296ba597c5SAnurag S. Maskey 			export_loc = B_TRUE;
35306ba597c5SAnurag S. Maskey 			export_enm = B_TRUE;
35316ba597c5SAnurag S. Maskey 			export_wlan = B_TRUE;
35326ba597c5SAnurag S. Maskey 			export_ncp = B_TRUE; /* NCP will export the NCUs */
35336ba597c5SAnurag S. Maskey 			free(name);
35346ba597c5SAnurag S. Maskey 			name = NULL; /* exporting all, undo name */
35356ba597c5SAnurag S. Maskey 			break;
35366ba597c5SAnurag S. Maskey 		}
35376ba597c5SAnurag S. Maskey 		break;
35386ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_LOC:
35396ba597c5SAnurag S. Maskey 		export_loc = B_TRUE;
35406ba597c5SAnurag S. Maskey 		ret = nwam_loc_get_name(loc_h, &name);
35416ba597c5SAnurag S. Maskey 		if (ret != NWAM_SUCCESS)
35426ba597c5SAnurag S. Maskey 			goto fail;
35436ba597c5SAnurag S. Maskey 		break;
35446ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_ENM:
35456ba597c5SAnurag S. Maskey 		export_enm = B_TRUE;
35466ba597c5SAnurag S. Maskey 		ret = nwam_enm_get_name(enm_h, &name);
35476ba597c5SAnurag S. Maskey 		if (ret != NWAM_SUCCESS)
35486ba597c5SAnurag S. Maskey 			goto fail;
35496ba597c5SAnurag S. Maskey 		break;
35506ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_WLAN:
35516ba597c5SAnurag S. Maskey 		export_wlan = B_TRUE;
35526ba597c5SAnurag S. Maskey 		ret = nwam_known_wlan_get_name(wlan_h, &name);
35536ba597c5SAnurag S. Maskey 		if (ret != NWAM_SUCCESS)
35546ba597c5SAnurag S. Maskey 			goto fail;
35556ba597c5SAnurag S. Maskey 		break;
35566ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_NCP:
35576ba597c5SAnurag S. Maskey 		if (cmd->cmd_res2_type == RT2_NCU) {
35586ba597c5SAnurag S. Maskey 			export_ncu = B_TRUE;
35596ba597c5SAnurag S. Maskey 			name = (write_to_file ? trim_quotes(cmd->cmd_argv[2]) :
35606ba597c5SAnurag S. Maskey 			    trim_quotes(cmd->cmd_argv[0]));
35616ba597c5SAnurag S. Maskey 		} else {
35626ba597c5SAnurag S. Maskey 			export_ncp = B_TRUE;
35636ba597c5SAnurag S. Maskey 			ret = nwam_ncp_get_name(ncp_h, &name);
35646ba597c5SAnurag S. Maskey 			if (ret != NWAM_SUCCESS)
35656ba597c5SAnurag S. Maskey 				goto fail;
35666ba597c5SAnurag S. Maskey 		}
35676ba597c5SAnurag S. Maskey 		break;
35686ba597c5SAnurag S. Maskey 	case NWAM_SCOPE_NCU:
35696ba597c5SAnurag S. Maskey 		export_ncu = B_TRUE;
35706ba597c5SAnurag S. Maskey 		ret = nwam_ncu_get_name(ncu_h, &name);
35716ba597c5SAnurag S. Maskey 		if (ret != NWAM_SUCCESS)
35726ba597c5SAnurag S. Maskey 			goto fail;
35736ba597c5SAnurag S. Maskey 		break;
35746ba597c5SAnurag S. Maskey 	default:
35756ba597c5SAnurag S. Maskey 		nerr("Invalid scope");
35766ba597c5SAnurag S. Maskey 		goto done;
35776ba597c5SAnurag S. Maskey 	}
35786ba597c5SAnurag S. Maskey 
35796ba597c5SAnurag S. Maskey 	/* Now, export objects according to the flags set */
35806ba597c5SAnurag S. Maskey 	if (export_ncp) {
35816ba597c5SAnurag S. Maskey 		lhandle = B_FALSE;
35826ba597c5SAnurag S. Maskey 		if (name == NULL) {
35836ba597c5SAnurag S. Maskey 			/* export all NCPs */
35846ba597c5SAnurag S. Maskey 			ret = nwam_walk_ncps(export_ncp_callback, of, 0, NULL);
35856ba597c5SAnurag S. Maskey 		} else if (NWAM_NCP_AUTOMATIC(name)) {
35866ba597c5SAnurag S. Maskey 			nerr("'%s' ncp cannot be exported", name);
35876ba597c5SAnurag S. Maskey 			goto fail;
35886ba597c5SAnurag S. Maskey 		} else {
35896ba597c5SAnurag S. Maskey 			if (ncp_h == NULL) {
35906ba597c5SAnurag S. Maskey 				ret = nwam_ncp_read(name, 0, &ncp_h);
35916ba597c5SAnurag S. Maskey 				if (ret != NWAM_SUCCESS)
35926ba597c5SAnurag S. Maskey 					goto fail;
35936ba597c5SAnurag S. Maskey 				lhandle = B_TRUE;
35946ba597c5SAnurag S. Maskey 			}
35956ba597c5SAnurag S. Maskey 			/* will export NCUs also */
35966ba597c5SAnurag S. Maskey 			ret = export_ncp_callback(ncp_h, of);
35976ba597c5SAnurag S. Maskey 			if (lhandle) {
35986ba597c5SAnurag S. Maskey 				nwam_ncp_free(ncp_h);
35996ba597c5SAnurag S. Maskey 				ncp_h = NULL;
36006ba597c5SAnurag S. Maskey 			}
36016ba597c5SAnurag S. Maskey 		}
36026ba597c5SAnurag S. Maskey 		if (ret != NWAM_SUCCESS)
36036ba597c5SAnurag S. Maskey 			goto fail;
36046ba597c5SAnurag S. Maskey 	}
36056ba597c5SAnurag S. Maskey 
36066ba597c5SAnurag S. Maskey 	if (export_ncu) {
36076ba597c5SAnurag S. Maskey 		if (name == NULL) {
36086ba597c5SAnurag S. Maskey 			/* export all NCUs */
36096ba597c5SAnurag S. Maskey 			ret = nwam_ncp_walk_ncus(ncp_h, export_ncu_callback, of,
36106ba597c5SAnurag S. Maskey 			    NWAM_FLAG_NCU_TYPE_CLASS_ALL, NULL);
36116ba597c5SAnurag S. Maskey 		} else {
36126ba597c5SAnurag S. Maskey 			if (ncu_h == NULL) {
36136ba597c5SAnurag S. Maskey 				/* no NCU handle -> called from NCP scope */
36146ba597c5SAnurag S. Maskey 				nwam_ncu_type_t		ncu_type;
36156ba597c5SAnurag S. Maskey 				nwam_ncu_class_t	ncu_class;
36166ba597c5SAnurag S. Maskey 
36176ba597c5SAnurag S. Maskey 				ncu_class = (nwam_ncu_class_t)
36186ba597c5SAnurag S. Maskey 				    cmd->cmd_ncu_class_type;
36196ba597c5SAnurag S. Maskey 				ncu_type = nwam_ncu_class_to_type(ncu_class);
36206ba597c5SAnurag S. Maskey 				ret = nwam_ncu_read(ncp_h, name,
36216ba597c5SAnurag S. Maskey 				    ncu_type, 0, &ncu_h);
36226ba597c5SAnurag S. Maskey 				if (ret == NWAM_SUCCESS) {
36236ba597c5SAnurag S. Maskey 					/* one NCU with given name */
36246ba597c5SAnurag S. Maskey 					ret = export_ncu_callback(ncu_h, of);
36256ba597c5SAnurag S. Maskey 					nwam_ncu_free(ncu_h);
36266ba597c5SAnurag S. Maskey 					ncu_h = NULL;
36276ba597c5SAnurag S. Maskey 				} else if (ret == NWAM_ENTITY_MULTIPLE_VALUES) {
36286ba597c5SAnurag S. Maskey 					/* multiple NCUs with given name */
36296ba597c5SAnurag S. Maskey 					ret = nwam_ncu_read(ncp_h, name,
36306ba597c5SAnurag S. Maskey 					    NWAM_NCU_TYPE_LINK, 0, &ncu_h);
36316ba597c5SAnurag S. Maskey 					if (ret != NWAM_SUCCESS)
36326ba597c5SAnurag S. Maskey 						goto fail;
36336ba597c5SAnurag S. Maskey 					ret = export_ncu_callback(ncu_h, of);
36346ba597c5SAnurag S. Maskey 					nwam_ncu_free(ncu_h);
36356ba597c5SAnurag S. Maskey 					ncu_h = NULL;
36366ba597c5SAnurag S. Maskey 
36376ba597c5SAnurag S. Maskey 					ret = nwam_ncu_read(ncp_h, name,
36386ba597c5SAnurag S. Maskey 					    NWAM_NCU_TYPE_INTERFACE, 0, &ncu_h);
36396ba597c5SAnurag S. Maskey 					if (ret != NWAM_SUCCESS)
36406ba597c5SAnurag S. Maskey 						goto fail;
36416ba597c5SAnurag S. Maskey 					ret = export_ncu_callback(ncu_h, of);
36426ba597c5SAnurag S. Maskey 					nwam_ncu_free(ncu_h);
36436ba597c5SAnurag S. Maskey 					ncu_h = NULL;
36446ba597c5SAnurag S. Maskey 				} else {
36456ba597c5SAnurag S. Maskey 					goto fail;
36466ba597c5SAnurag S. Maskey 				}
36476ba597c5SAnurag S. Maskey 			} else {
36486ba597c5SAnurag S. Maskey 				/* NCU handle exists */
36496ba597c5SAnurag S. Maskey 				ret = export_ncu_callback(ncu_h, of);
36506ba597c5SAnurag S. Maskey 			}
36516ba597c5SAnurag S. Maskey 		}
36526ba597c5SAnurag S. Maskey 		if (ret != NWAM_SUCCESS)
36536ba597c5SAnurag S. Maskey 			goto fail;
36546ba597c5SAnurag S. Maskey 	}
36556ba597c5SAnurag S. Maskey 
36566ba597c5SAnurag S. Maskey 	if (export_loc) {
36576ba597c5SAnurag S. Maskey 		lhandle = B_FALSE;
36586ba597c5SAnurag S. Maskey 		if (name == NULL) {
36596ba597c5SAnurag S. Maskey 			/* export all locations */
36606ba597c5SAnurag S. Maskey 			ret = nwam_walk_locs(export_loc_callback, of,
36616ba597c5SAnurag S. Maskey 			    NWAM_FLAG_ACTIVATION_MODE_ALL, NULL);
36626ba597c5SAnurag S. Maskey 		} else if (NWAM_LOC_NAME_PRE_DEFINED(name)) {
36636ba597c5SAnurag S. Maskey 			nerr("'%s' loc cannot be exported", name);
36646ba597c5SAnurag S. Maskey 			goto fail;
36656ba597c5SAnurag S. Maskey 		} else {
36666ba597c5SAnurag S. Maskey 			if (loc_h == NULL) {
36676ba597c5SAnurag S. Maskey 				ret = nwam_loc_read(name, 0, &loc_h);
36686ba597c5SAnurag S. Maskey 				if (ret != NWAM_SUCCESS)
36696ba597c5SAnurag S. Maskey 					goto fail;
36706ba597c5SAnurag S. Maskey 				lhandle = B_TRUE;
36716ba597c5SAnurag S. Maskey 			}
36726ba597c5SAnurag S. Maskey 			ret = export_loc_callback(loc_h, of);
36736ba597c5SAnurag S. Maskey 			if (lhandle) {
36746ba597c5SAnurag S. Maskey 				nwam_loc_free(loc_h);
36756ba597c5SAnurag S. Maskey 				loc_h = NULL;
36766ba597c5SAnurag S. Maskey 			}
36776ba597c5SAnurag S. Maskey 		}
36786ba597c5SAnurag S. Maskey 		if (ret != NWAM_SUCCESS)
36796ba597c5SAnurag S. Maskey 			goto fail;
36806ba597c5SAnurag S. Maskey 	}
36816ba597c5SAnurag S. Maskey 
36826ba597c5SAnurag S. Maskey 	if (export_enm) {
36836ba597c5SAnurag S. Maskey 		lhandle = B_FALSE;
36846ba597c5SAnurag S. Maskey 		if (name == NULL) {
36856ba597c5SAnurag S. Maskey 			/* export all ENMs */
36866ba597c5SAnurag S. Maskey 			ret = nwam_walk_enms(export_enm_callback, of,
36876ba597c5SAnurag S. Maskey 			    NWAM_FLAG_ACTIVATION_MODE_ALL, NULL);
36886ba597c5SAnurag S. Maskey 		} else {
36896ba597c5SAnurag S. Maskey 			if (enm_h == NULL) {
36906ba597c5SAnurag S. Maskey 				ret = nwam_enm_read(name, 0, &enm_h);
36916ba597c5SAnurag S. Maskey 				if (ret != NWAM_SUCCESS)
36926ba597c5SAnurag S. Maskey 					goto fail;
36936ba597c5SAnurag S. Maskey 				lhandle = B_TRUE;
36946ba597c5SAnurag S. Maskey 			}
36956ba597c5SAnurag S. Maskey 			ret = export_enm_callback(enm_h, of);
36966ba597c5SAnurag S. Maskey 			if (lhandle) {
36976ba597c5SAnurag S. Maskey 				nwam_enm_free(enm_h);
36986ba597c5SAnurag S. Maskey 				enm_h = NULL;
36996ba597c5SAnurag S. Maskey 			}
37006ba597c5SAnurag S. Maskey 		}
37016ba597c5SAnurag S. Maskey 		if (ret != NWAM_SUCCESS)
37026ba597c5SAnurag S. Maskey 			goto fail;
37036ba597c5SAnurag S. Maskey 	}
37046ba597c5SAnurag S. Maskey 
37056ba597c5SAnurag S. Maskey 	if (export_wlan) {
37066ba597c5SAnurag S. Maskey 		lhandle = B_FALSE;
37076ba597c5SAnurag S. Maskey 		if (name == NULL) {
37086ba597c5SAnurag S. Maskey 			/* export all WLANs */
37096ba597c5SAnurag S. Maskey 			ret = nwam_walk_known_wlans(export_wlan_callback, of,
37106ba597c5SAnurag S. Maskey 			    NWAM_FLAG_KNOWN_WLAN_WALK_PRIORITY_ORDER, NULL);
37116ba597c5SAnurag S. Maskey 		} else {
37126ba597c5SAnurag S. Maskey 			if (wlan_h == NULL) {
37136ba597c5SAnurag S. Maskey 				ret = nwam_known_wlan_read(name, 0,
37146ba597c5SAnurag S. Maskey 				    &wlan_h);
37156ba597c5SAnurag S. Maskey 				if (ret != NWAM_SUCCESS)
37166ba597c5SAnurag S. Maskey 					goto fail;
37176ba597c5SAnurag S. Maskey 				lhandle = B_TRUE;
37186ba597c5SAnurag S. Maskey 			}
37196ba597c5SAnurag S. Maskey 			ret = export_wlan_callback(wlan_h, of);
37206ba597c5SAnurag S. Maskey 			if (lhandle) {
37216ba597c5SAnurag S. Maskey 				nwam_known_wlan_free(wlan_h);
37226ba597c5SAnurag S. Maskey 				wlan_h = NULL;
37236ba597c5SAnurag S. Maskey 			}
37246ba597c5SAnurag S. Maskey 		}
37256ba597c5SAnurag S. Maskey 		if (ret != NWAM_SUCCESS)
37266ba597c5SAnurag S. Maskey 			goto fail;
37276ba597c5SAnurag S. Maskey 	}
37286ba597c5SAnurag S. Maskey 
37296ba597c5SAnurag S. Maskey fail:
37306ba597c5SAnurag S. Maskey 	free(name);
37316ba597c5SAnurag S. Maskey 	if (ret != NWAM_SUCCESS)
37326ba597c5SAnurag S. Maskey 		nwamerr(ret, "Export error");
37336ba597c5SAnurag S. Maskey 
37346ba597c5SAnurag S. Maskey done:
37356ba597c5SAnurag S. Maskey 	if (need_to_close)
37366ba597c5SAnurag S. Maskey 		(void) fclose(of);
37376ba597c5SAnurag S. Maskey }
37386ba597c5SAnurag S. Maskey 
37396ba597c5SAnurag S. Maskey /*
37406ba597c5SAnurag S. Maskey  * Get property value.  If the -V option is specified, only the value is
37416ba597c5SAnurag S. Maskey  * printed without the property name.
37426ba597c5SAnurag S. Maskey  */
37436ba597c5SAnurag S. Maskey void
37446ba597c5SAnurag S. Maskey get_func(cmd_t *cmd)
37456ba597c5SAnurag S. Maskey {
37466ba597c5SAnurag S. Maskey 	nwam_error_t		ret = NWAM_SUCCESS;
37476ba597c5SAnurag S. Maskey 	nwam_value_t		prop_value;
37486ba597c5SAnurag S. Maskey 	const char		*prop;
37496ba597c5SAnurag S. Maskey 	boolean_t		value_only = B_FALSE;
37506ba597c5SAnurag S. Maskey 	nwam_object_type_t	object_type = active_object_type();
37516ba597c5SAnurag S. Maskey 
37526ba597c5SAnurag S. Maskey 	/* check if option is -V to print value only */
37536ba597c5SAnurag S. Maskey 	if (cmd->cmd_argc == 1) {
37546ba597c5SAnurag S. Maskey 		int c;
37556ba597c5SAnurag S. Maskey 
37566ba597c5SAnurag S. Maskey 		optind = 0;
37576ba597c5SAnurag S. Maskey 		while ((c = getopt(cmd->cmd_argc, cmd->cmd_argv, "V")) != EOF) {
37586ba597c5SAnurag S. Maskey 			switch (c) {
37596ba597c5SAnurag S. Maskey 			case 'V':
37606ba597c5SAnurag S. Maskey 				value_only = B_TRUE;
37616ba597c5SAnurag S. Maskey 				break;
37626ba597c5SAnurag S. Maskey 			default:
37636ba597c5SAnurag S. Maskey 				command_usage(CMD_GET);
37646ba597c5SAnurag S. Maskey 				return;
37656ba597c5SAnurag S. Maskey 			}
37666ba597c5SAnurag S. Maskey 		}
37676ba597c5SAnurag S. Maskey 	}
37686ba597c5SAnurag S. Maskey 
37696ba597c5SAnurag S. Maskey 	/* property to get is in cmd->cmd_prop_type */
37706ba597c5SAnurag S. Maskey 	if ((prop = pt_to_prop_name(object_type, cmd->cmd_prop_type)) == NULL) {
37716ba597c5SAnurag S. Maskey 		nerr("Get error: invalid %s property: '%s'",
37726ba597c5SAnurag S. Maskey 		    scope_to_str(current_scope), pt_to_str(cmd->cmd_prop_type));
37736ba597c5SAnurag S. Maskey 		return;
37746ba597c5SAnurag S. Maskey 	}
37756ba597c5SAnurag S. Maskey 
37766ba597c5SAnurag S. Maskey 	switch (object_type) {
37776ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_NCU:
37786ba597c5SAnurag S. Maskey 		ret = nwam_ncu_get_prop_value(ncu_h, prop, &prop_value);
37796ba597c5SAnurag S. Maskey 		break;
37806ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_LOC:
37816ba597c5SAnurag S. Maskey 		ret = nwam_loc_get_prop_value(loc_h, prop, &prop_value);
37826ba597c5SAnurag S. Maskey 		break;
37836ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_ENM:
37846ba597c5SAnurag S. Maskey 		ret = nwam_enm_get_prop_value(enm_h, prop, &prop_value);
37856ba597c5SAnurag S. Maskey 		break;
37866ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_KNOWN_WLAN:
37876ba597c5SAnurag S. Maskey 		ret = nwam_known_wlan_get_prop_value(wlan_h, prop, &prop_value);
37886ba597c5SAnurag S. Maskey 		break;
37896ba597c5SAnurag S. Maskey 	}
37906ba597c5SAnurag S. Maskey 
37916ba597c5SAnurag S. Maskey 	if (ret != NWAM_SUCCESS) {
37926ba597c5SAnurag S. Maskey 		if (ret == NWAM_ENTITY_NOT_FOUND)
37936ba597c5SAnurag S. Maskey 			nerr("Get error: property '%s' has not been set", prop);
37946ba597c5SAnurag S. Maskey 		else
37956ba597c5SAnurag S. Maskey 			nwamerr(ret, "Get error");
37966ba597c5SAnurag S. Maskey 		return;
37976ba597c5SAnurag S. Maskey 	}
37986ba597c5SAnurag S. Maskey 
37996ba597c5SAnurag S. Maskey 	if (value_only) {
38006ba597c5SAnurag S. Maskey 		output_prop_val(prop, prop_value, stdout, B_FALSE);
38016ba597c5SAnurag S. Maskey 		(void) printf("\n");
38026ba597c5SAnurag S. Maskey 	} else {
38036ba597c5SAnurag S. Maskey 		output_propname(prop, prop_value, NULL);
38046ba597c5SAnurag S. Maskey 	}
38056ba597c5SAnurag S. Maskey 	nwam_value_free(prop_value);
38066ba597c5SAnurag S. Maskey }
38076ba597c5SAnurag S. Maskey 
38086ba597c5SAnurag S. Maskey /*
38096ba597c5SAnurag S. Maskey  * Clears value of a property.
38106ba597c5SAnurag S. Maskey  * Read-only properties cannot be cleared.
38116ba597c5SAnurag S. Maskey  * If clearing a property invalidates the object, then that property
38126ba597c5SAnurag S. Maskey  * cannot be cleared.
38136ba597c5SAnurag S. Maskey  */
38146ba597c5SAnurag S. Maskey void
38156ba597c5SAnurag S. Maskey clear_func(cmd_t *cmd)
38166ba597c5SAnurag S. Maskey {
38176ba597c5SAnurag S. Maskey 	nwam_error_t		ret;
38186ba597c5SAnurag S. Maskey 	const char		*prop;
38196ba597c5SAnurag S. Maskey 	nwam_object_type_t	object_type = active_object_type();
38206ba597c5SAnurag S. Maskey 
38216ba597c5SAnurag S. Maskey 	/* property to clear is in cmd->cmd_prop_type */
38226ba597c5SAnurag S. Maskey 	if ((prop = pt_to_prop_name(object_type, cmd->cmd_prop_type)) == NULL) {
38236ba597c5SAnurag S. Maskey 		nerr("Clear error: invalid %s property: '%s'",
38246ba597c5SAnurag S. Maskey 		    scope_to_str(current_scope), pt_to_str(cmd->cmd_prop_type));
38256ba597c5SAnurag S. Maskey 		return;
38266ba597c5SAnurag S. Maskey 	}
38276ba597c5SAnurag S. Maskey 	if (is_prop_read_only(object_type, prop)) {
38286ba597c5SAnurag S. Maskey 		nerr("Clear error: property '%s' is read-only", prop);
38296ba597c5SAnurag S. Maskey 		return;
38306ba597c5SAnurag S. Maskey 	}
38316ba597c5SAnurag S. Maskey 
38326ba597c5SAnurag S. Maskey 	switch (object_type) {
38336ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_NCU:
38346ba597c5SAnurag S. Maskey 		ret = nwam_ncu_delete_prop(ncu_h, prop);
38356ba597c5SAnurag S. Maskey 		break;
38366ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_LOC:
38376ba597c5SAnurag S. Maskey 		ret = nwam_loc_delete_prop(loc_h, prop);
38386ba597c5SAnurag S. Maskey 		break;
38396ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_ENM:
38406ba597c5SAnurag S. Maskey 		ret = nwam_enm_delete_prop(enm_h, prop);
38416ba597c5SAnurag S. Maskey 		break;
38426ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_KNOWN_WLAN:
38436ba597c5SAnurag S. Maskey 		ret = nwam_known_wlan_delete_prop(wlan_h, prop);
38446ba597c5SAnurag S. Maskey 		break;
38456ba597c5SAnurag S. Maskey 	}
38466ba597c5SAnurag S. Maskey 
38476ba597c5SAnurag S. Maskey 	if (ret != NWAM_SUCCESS) {
38486ba597c5SAnurag S. Maskey 		if (ret == NWAM_INVALID_ARG || ret == NWAM_ENTITY_NOT_FOUND) {
38496ba597c5SAnurag S. Maskey 			nerr("Clear error: property '%s' has not been set",
38506ba597c5SAnurag S. Maskey 			    prop);
38516ba597c5SAnurag S. Maskey 		} else {
38526ba597c5SAnurag S. Maskey 			nwamerr(ret, "Clear error");
38536ba597c5SAnurag S. Maskey 		}
38546ba597c5SAnurag S. Maskey 		return;
38556ba597c5SAnurag S. Maskey 	}
38566ba597c5SAnurag S. Maskey 
38576ba597c5SAnurag S. Maskey 	need_to_commit = B_TRUE;
38586ba597c5SAnurag S. Maskey }
38596ba597c5SAnurag S. Maskey 
38606ba597c5SAnurag S. Maskey /*
38616ba597c5SAnurag S. Maskey  * Prints all the choices available for an enum property [c1|c2|c3].
38626ba597c5SAnurag S. Maskey  * Prints [true|false] for a boolean property.
38636ba597c5SAnurag S. Maskey  */
38646ba597c5SAnurag S. Maskey static void
38656ba597c5SAnurag S. Maskey print_all_prop_choices(nwam_object_type_t object_type, const char *prop)
38666ba597c5SAnurag S. Maskey {
38676ba597c5SAnurag S. Maskey 	uint64_t		i = 0;
38686ba597c5SAnurag S. Maskey 	const char		*str;
38696ba597c5SAnurag S. Maskey 	boolean_t		choices = B_FALSE;
38706ba597c5SAnurag S. Maskey 	nwam_value_type_t	value_type;
38716ba597c5SAnurag S. Maskey 	nwam_error_t		ret;
38726ba597c5SAnurag S. Maskey 
38736ba597c5SAnurag S. Maskey 	/* Special case: print object-specific options for activation-mode */
38746ba597c5SAnurag S. Maskey 	if (strcmp(prop, NWAM_NCU_PROP_ACTIVATION_MODE) == 0) {
38756ba597c5SAnurag S. Maskey 		/* "manual" for all objects */
38766ba597c5SAnurag S. Maskey 		(void) printf(" [%s|",
38776ba597c5SAnurag S. Maskey 		    propval_to_str(NWAM_NCU_PROP_ACTIVATION_MODE,
38786ba597c5SAnurag S. Maskey 		    NWAM_ACTIVATION_MODE_MANUAL));
38796ba597c5SAnurag S. Maskey 		if (object_type == NWAM_OBJECT_TYPE_NCU) {
38806ba597c5SAnurag S. Maskey 			(void) printf("%s]",
38816ba597c5SAnurag S. Maskey 			    propval_to_str(NWAM_NCU_PROP_ACTIVATION_MODE,
38826ba597c5SAnurag S. Maskey 			    NWAM_ACTIVATION_MODE_PRIORITIZED));
38836ba597c5SAnurag S. Maskey 		} else {
38846ba597c5SAnurag S. Maskey 			(void) printf("%s|%s]",
38856ba597c5SAnurag S. Maskey 			    propval_to_str(NWAM_NCU_PROP_ACTIVATION_MODE,
38866ba597c5SAnurag S. Maskey 			    NWAM_ACTIVATION_MODE_CONDITIONAL_ANY),
38876ba597c5SAnurag S. Maskey 			    propval_to_str(NWAM_NCU_PROP_ACTIVATION_MODE,
38886ba597c5SAnurag S. Maskey 			    NWAM_ACTIVATION_MODE_CONDITIONAL_ALL));
38896ba597c5SAnurag S. Maskey 		}
38906ba597c5SAnurag S. Maskey 		return;
38916ba597c5SAnurag S. Maskey 	}
38926ba597c5SAnurag S. Maskey 
38936ba597c5SAnurag S. Maskey 	/* Special case: only "manual" configsrc is allowed for LDAP */
38946ba597c5SAnurag S. Maskey 	if (strcmp(prop, NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC) == 0) {
38956ba597c5SAnurag S. Maskey 		(void) printf(" [%s]",
38966ba597c5SAnurag S. Maskey 		    propval_to_str(NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC,
38976ba597c5SAnurag S. Maskey 		    NWAM_CONFIGSRC_MANUAL));
38986ba597c5SAnurag S. Maskey 		return;
38996ba597c5SAnurag S. Maskey 	}
39006ba597c5SAnurag S. Maskey 
39016ba597c5SAnurag S. Maskey 	value_type = prop_value_type(object_type, prop);
39026ba597c5SAnurag S. Maskey 	switch (value_type) {
39036ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_UINT64:
39046ba597c5SAnurag S. Maskey 		/* uint64 may be an enum, will print nothing if not an enum */
39056ba597c5SAnurag S. Maskey 		while ((ret = nwam_uint64_get_value_string(prop, i++, &str))
39066ba597c5SAnurag S. Maskey 		    == NWAM_SUCCESS || ret == NWAM_ENTITY_INVALID_VALUE) {
39076ba597c5SAnurag S. Maskey 			/* No string representation for i, continue. */
39086ba597c5SAnurag S. Maskey 			if (ret == NWAM_ENTITY_INVALID_VALUE)
39096ba597c5SAnurag S. Maskey 				continue;
39106ba597c5SAnurag S. Maskey 
39116ba597c5SAnurag S. Maskey 			if (!choices)
39126ba597c5SAnurag S. Maskey 				(void) printf("%s", " [");
39136ba597c5SAnurag S. Maskey 			(void) printf("%s%s", choices ? "|" : "", str);
39146ba597c5SAnurag S. Maskey 			choices = B_TRUE;
39156ba597c5SAnurag S. Maskey 		}
39166ba597c5SAnurag S. Maskey 		if (choices)
39176ba597c5SAnurag S. Maskey 			(void) putchar(']');
39186ba597c5SAnurag S. Maskey 		break;
39196ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_BOOLEAN:
39206ba597c5SAnurag S. Maskey 		(void) printf(" [%s|%s]", "true", "false");
39216ba597c5SAnurag S. Maskey 		break;
39226ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_STRING:
39236ba597c5SAnurag S. Maskey 		break;
39246ba597c5SAnurag S. Maskey 	}
39256ba597c5SAnurag S. Maskey }
39266ba597c5SAnurag S. Maskey 
39276ba597c5SAnurag S. Maskey /*
39286ba597c5SAnurag S. Maskey  * Walk through object properties.
39296ba597c5SAnurag S. Maskey  * For newly-created object, the property name with no value is displayed, and
39306ba597c5SAnurag S. Maskey  * the user can input a value for each property.
39316ba597c5SAnurag S. Maskey  * For existing object, the current value is displayed and user input overwrites
39326ba597c5SAnurag S. Maskey  * the existing one. If no input is given, the existing value remains.
39336ba597c5SAnurag S. Maskey  * Read-only properties are not displayed.
39346ba597c5SAnurag S. Maskey  * Read-only objects cannot be walked.
39356ba597c5SAnurag S. Maskey  * If the -a option is specified, no properties are skipped.
39366ba597c5SAnurag S. Maskey  */
39376ba597c5SAnurag S. Maskey void
39386ba597c5SAnurag S. Maskey walkprop_func(cmd_t *cmd)
39396ba597c5SAnurag S. Maskey {
39406ba597c5SAnurag S. Maskey 	nwam_error_t	ret = NWAM_SUCCESS;
39416ba597c5SAnurag S. Maskey 	nwam_value_t	vals = NULL; /* freed in _wait_input() */
39426ba597c5SAnurag S. Maskey 	int		i;
39436ba597c5SAnurag S. Maskey 	uint_t		prop_num;
39446ba597c5SAnurag S. Maskey 	const char	**props;
39456ba597c5SAnurag S. Maskey 	boolean_t	read_only = B_FALSE, all_props = B_FALSE;
39466ba597c5SAnurag S. Maskey 
39476ba597c5SAnurag S. Maskey 	nwam_object_type_t object_type;
39486ba597c5SAnurag S. Maskey 	prop_display_entry_t *prop_table;
39496ba597c5SAnurag S. Maskey 
39506ba597c5SAnurag S. Maskey 	if (!interactive_mode) {
39516ba597c5SAnurag S. Maskey 		nerr("'walkprop' is only allowed in interactive mode");
39526ba597c5SAnurag S. Maskey 		return;
39536ba597c5SAnurag S. Maskey 	}
39546ba597c5SAnurag S. Maskey 
39556ba597c5SAnurag S. Maskey 	/* check if option -a is specified to show all properties */
39566ba597c5SAnurag S. Maskey 	if (cmd->cmd_argc == 1) {
39576ba597c5SAnurag S. Maskey 		int c;
39586ba597c5SAnurag S. Maskey 		optind = 0;
39596ba597c5SAnurag S. Maskey 		while ((c = getopt(cmd->cmd_argc, cmd->cmd_argv, "a")) != EOF) {
39606ba597c5SAnurag S. Maskey 			switch (c) {
39616ba597c5SAnurag S. Maskey 			case 'a':
39626ba597c5SAnurag S. Maskey 				all_props = B_TRUE;
39636ba597c5SAnurag S. Maskey 				break;
39646ba597c5SAnurag S. Maskey 			default:
39656ba597c5SAnurag S. Maskey 				command_usage(CMD_WALKPROP);
39666ba597c5SAnurag S. Maskey 				return;
39676ba597c5SAnurag S. Maskey 			}
39686ba597c5SAnurag S. Maskey 		}
39696ba597c5SAnurag S. Maskey 	}
39706ba597c5SAnurag S. Maskey 
39716ba597c5SAnurag S. Maskey 	/* read-only objects cannot be walked */
39726ba597c5SAnurag S. Maskey 	if (obj1_type == RT1_NCP) {
39736ba597c5SAnurag S. Maskey 		/* must be in NCU scope, NCP scope doesn't get here */
39746ba597c5SAnurag S. Maskey 		(void) nwam_ncu_get_read_only(ncu_h, &read_only);
39756ba597c5SAnurag S. Maskey 	}
39766ba597c5SAnurag S. Maskey 	if (read_only) {
39776ba597c5SAnurag S. Maskey 		nerr("'walkprop' cannot be used in read-only objects");
39786ba597c5SAnurag S. Maskey 		return;
39796ba597c5SAnurag S. Maskey 	}
39806ba597c5SAnurag S. Maskey 
39816ba597c5SAnurag S. Maskey 	/* get the current object type and the prop_display_table */
39826ba597c5SAnurag S. Maskey 	object_type = active_object_type();
39836ba597c5SAnurag S. Maskey 	prop_table = get_prop_display_table(object_type);
39846ba597c5SAnurag S. Maskey 
39856ba597c5SAnurag S. Maskey 	/* get the property list depending on the object type */
39866ba597c5SAnurag S. Maskey 	switch (object_type) {
39876ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_NCU:
39886ba597c5SAnurag S. Maskey 	{
39896ba597c5SAnurag S. Maskey 		nwam_ncu_type_t		ncu_type;
39906ba597c5SAnurag S. Maskey 		nwam_ncu_class_t	ncu_class;
39916ba597c5SAnurag S. Maskey 
39926ba597c5SAnurag S. Maskey 		if ((ret = nwam_ncu_get_ncu_type(ncu_h, &ncu_type))
39936ba597c5SAnurag S. Maskey 		    != NWAM_SUCCESS)
39946ba597c5SAnurag S. Maskey 			break;
39956ba597c5SAnurag S. Maskey 		if ((ret = nwam_ncu_get_ncu_class(ncu_h, &ncu_class))
39966ba597c5SAnurag S. Maskey 		    != NWAM_SUCCESS)
39976ba597c5SAnurag S. Maskey 			break;
39986ba597c5SAnurag S. Maskey 
39996ba597c5SAnurag S. Maskey 		ret = nwam_ncu_get_default_proplist(ncu_type, ncu_class, &props,
40006ba597c5SAnurag S. Maskey 		    &prop_num);
40016ba597c5SAnurag S. Maskey 		break;
40026ba597c5SAnurag S. Maskey 	}
40036ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_LOC:
40046ba597c5SAnurag S. Maskey 		ret = nwam_loc_get_default_proplist(&props, &prop_num);
40056ba597c5SAnurag S. Maskey 		break;
40066ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_ENM:
40076ba597c5SAnurag S. Maskey 		ret = nwam_enm_get_default_proplist(&props, &prop_num);
40086ba597c5SAnurag S. Maskey 		break;
40096ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_KNOWN_WLAN:
40106ba597c5SAnurag S. Maskey 		ret = nwam_known_wlan_get_default_proplist(&props, &prop_num);
40116ba597c5SAnurag S. Maskey 		break;
40126ba597c5SAnurag S. Maskey 	}
40136ba597c5SAnurag S. Maskey 	if (ret != NWAM_SUCCESS) {
40146ba597c5SAnurag S. Maskey 		nwamerr(ret, "Walkprop error: could not get property list");
40156ba597c5SAnurag S. Maskey 		return;
40166ba597c5SAnurag S. Maskey 	}
40176ba597c5SAnurag S. Maskey 
40186ba597c5SAnurag S. Maskey 	/* Loop through the properties */
40196ba597c5SAnurag S. Maskey 	if (all_props)
40206ba597c5SAnurag S. Maskey 		(void) printf(gettext("Walking all properties ...\n"));
40216ba597c5SAnurag S. Maskey 	for (i = 0; i < prop_num; i++) {
40226ba597c5SAnurag S. Maskey 		char line[NWAM_MAX_VALUE_LEN];
40236ba597c5SAnurag S. Maskey 		char **checked = NULL;
40246ba597c5SAnurag S. Maskey 
40256ba597c5SAnurag S. Maskey 		/* check if this property should be displayed */
40266ba597c5SAnurag S. Maskey 		if (is_prop_read_only(object_type, props[i]))
40276ba597c5SAnurag S. Maskey 			continue;
40286ba597c5SAnurag S. Maskey 		if (!all_props &&
40296ba597c5SAnurag S. Maskey 		    !show_prop_test(object_type, props[i], prop_table,
40306ba597c5SAnurag S. Maskey 		    checked, 0))
40316ba597c5SAnurag S. Maskey 			continue;
40326ba597c5SAnurag S. Maskey 
40336ba597c5SAnurag S. Maskey 		/* get the existing value for this property */
40346ba597c5SAnurag S. Maskey 		switch (object_type) {
40356ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_NCU:
40366ba597c5SAnurag S. Maskey 			ret = nwam_ncu_get_prop_value(ncu_h, props[i], &vals);
40376ba597c5SAnurag S. Maskey 			break;
40386ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_LOC:
40396ba597c5SAnurag S. Maskey 			ret = nwam_loc_get_prop_value(loc_h, props[i], &vals);
40406ba597c5SAnurag S. Maskey 			break;
40416ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_ENM:
40426ba597c5SAnurag S. Maskey 			ret = nwam_enm_get_prop_value(enm_h, props[i], &vals);
40436ba597c5SAnurag S. Maskey 			break;
40446ba597c5SAnurag S. Maskey 		case NWAM_OBJECT_TYPE_KNOWN_WLAN:
40456ba597c5SAnurag S. Maskey 			ret = nwam_known_wlan_get_prop_value(wlan_h, props[i],
40466ba597c5SAnurag S. Maskey 			    &vals);
40476ba597c5SAnurag S. Maskey 			break;
40486ba597c5SAnurag S. Maskey 		}
40496ba597c5SAnurag S. Maskey 		/* returns NWAM_ENTITY_NOT_FOUND if no existing value */
40506ba597c5SAnurag S. Maskey 		if (ret != NWAM_SUCCESS && ret != NWAM_ENTITY_NOT_FOUND)
40516ba597c5SAnurag S. Maskey 			continue;
40526ba597c5SAnurag S. Maskey 
40536ba597c5SAnurag S. Maskey 		/* print property */
40546ba597c5SAnurag S. Maskey 		(void) printf("%s", props[i]);
40556ba597c5SAnurag S. Maskey 		/* print the existing value(s) if they exist */
40566ba597c5SAnurag S. Maskey 		if (ret == NWAM_SUCCESS) {
40576ba597c5SAnurag S. Maskey 			(void) printf(" (");
40586ba597c5SAnurag S. Maskey 			output_prop_val(props[i], vals, stdout, B_TRUE);
40596ba597c5SAnurag S. Maskey 			(void) putchar(')');
40606ba597c5SAnurag S. Maskey 			nwam_value_free(vals);
40616ba597c5SAnurag S. Maskey 		}
40626ba597c5SAnurag S. Maskey 		/* print choices, won't print anything if there aren't any */
40636ba597c5SAnurag S. Maskey 		print_all_prop_choices(object_type, props[i]);
40646ba597c5SAnurag S. Maskey 		(void) printf("> ");
40656ba597c5SAnurag S. Maskey 
40666ba597c5SAnurag S. Maskey 		/* wait for user input */
40676ba597c5SAnurag S. Maskey 		if (fgets(line, sizeof (line), stdin) == NULL)
40686ba597c5SAnurag S. Maskey 			continue;
40696ba597c5SAnurag S. Maskey 
40706ba597c5SAnurag S. Maskey 		/* if user input new value, existing value is overrode */
40716ba597c5SAnurag S. Maskey 		if (line[0] != '\n') {
40726ba597c5SAnurag S. Maskey 			boolean_t is_listprop;
40736ba597c5SAnurag S. Maskey 			int pt_type = prop_to_pt(object_type, props[i]);
40746ba597c5SAnurag S. Maskey 
40756ba597c5SAnurag S. Maskey 			is_listprop = is_prop_multivalued(object_type,
40766ba597c5SAnurag S. Maskey 			    props[i]);
40776ba597c5SAnurag S. Maskey 			vals = str_to_nwam_value(object_type, line, pt_type,
40786ba597c5SAnurag S. Maskey 			    is_listprop);
40796ba597c5SAnurag S. Maskey 			if (vals == NULL) {
40806ba597c5SAnurag S. Maskey 				ret = NWAM_ENTITY_INVALID_VALUE;
40816ba597c5SAnurag S. Maskey 				goto repeat;
40826ba597c5SAnurag S. Maskey 			}
40836ba597c5SAnurag S. Maskey 
40846ba597c5SAnurag S. Maskey 			/* set the new value for the property */
40856ba597c5SAnurag S. Maskey 			switch (object_type) {
40866ba597c5SAnurag S. Maskey 			case NWAM_OBJECT_TYPE_NCU:
40876ba597c5SAnurag S. Maskey 				ret = nwam_ncu_set_prop_value(ncu_h, props[i],
40886ba597c5SAnurag S. Maskey 				    vals);
40896ba597c5SAnurag S. Maskey 				break;
40906ba597c5SAnurag S. Maskey 			case NWAM_OBJECT_TYPE_LOC:
40916ba597c5SAnurag S. Maskey 				ret = nwam_loc_set_prop_value(loc_h, props[i],
40926ba597c5SAnurag S. Maskey 				    vals);
40936ba597c5SAnurag S. Maskey 				break;
40946ba597c5SAnurag S. Maskey 			case NWAM_OBJECT_TYPE_ENM:
40956ba597c5SAnurag S. Maskey 				ret = nwam_enm_set_prop_value(enm_h, props[i],
40966ba597c5SAnurag S. Maskey 				    vals);
40976ba597c5SAnurag S. Maskey 				break;
40986ba597c5SAnurag S. Maskey 			case NWAM_OBJECT_TYPE_KNOWN_WLAN:
40996ba597c5SAnurag S. Maskey 				ret = nwam_known_wlan_set_prop_value(wlan_h,
41006ba597c5SAnurag S. Maskey 				    props[i], vals);
41016ba597c5SAnurag S. Maskey 				break;
41026ba597c5SAnurag S. Maskey 			}
41036ba597c5SAnurag S. Maskey 			nwam_value_free(vals);
41046ba597c5SAnurag S. Maskey 
41056ba597c5SAnurag S. Maskey 			if (ret != NWAM_SUCCESS)
41066ba597c5SAnurag S. Maskey 				goto repeat;
41076ba597c5SAnurag S. Maskey 
41086ba597c5SAnurag S. Maskey 			need_to_commit = B_TRUE;
41096ba597c5SAnurag S. Maskey 			continue;
41106ba597c5SAnurag S. Maskey 
41116ba597c5SAnurag S. Maskey repeat:
41126ba597c5SAnurag S. Maskey 			invalid_set_prop_msg(props[i], ret);
41136ba597c5SAnurag S. Maskey 			i--; /* decrement i to repeat */
41146ba597c5SAnurag S. Maskey 		}
41156ba597c5SAnurag S. Maskey 	}
41166ba597c5SAnurag S. Maskey 
41176ba597c5SAnurag S. Maskey 	free(props);
41186ba597c5SAnurag S. Maskey }
41196ba597c5SAnurag S. Maskey 
41206ba597c5SAnurag S. Maskey /*
41216ba597c5SAnurag S. Maskey  * Verify whether all properties of a resource are valid.
41226ba597c5SAnurag S. Maskey  */
41236ba597c5SAnurag S. Maskey /* ARGSUSED */
41246ba597c5SAnurag S. Maskey void
41256ba597c5SAnurag S. Maskey verify_func(cmd_t *cmd)
41266ba597c5SAnurag S. Maskey {
41276ba597c5SAnurag S. Maskey 	nwam_error_t	ret;
41286ba597c5SAnurag S. Maskey 	const char	*errprop;
41296ba597c5SAnurag S. Maskey 
41306ba597c5SAnurag S. Maskey 	switch (active_object_type()) {
41316ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_NCU:
41326ba597c5SAnurag S. Maskey 		ret = nwam_ncu_validate(ncu_h, &errprop);
41336ba597c5SAnurag S. Maskey 		break;
41346ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_LOC:
41356ba597c5SAnurag S. Maskey 		ret = nwam_loc_validate(loc_h, &errprop);
41366ba597c5SAnurag S. Maskey 		break;
41376ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_ENM:
41386ba597c5SAnurag S. Maskey 		ret = nwam_enm_validate(enm_h, &errprop);
41396ba597c5SAnurag S. Maskey 		break;
41406ba597c5SAnurag S. Maskey 	case NWAM_OBJECT_TYPE_KNOWN_WLAN:
41416ba597c5SAnurag S. Maskey 		ret = nwam_known_wlan_validate(wlan_h, &errprop);
41426ba597c5SAnurag S. Maskey 		break;
41436ba597c5SAnurag S. Maskey 	}
41446ba597c5SAnurag S. Maskey 	if (ret != NWAM_SUCCESS)
41456ba597c5SAnurag S. Maskey 		nwamerr(ret, "Verify error on property '%s'", errprop);
41466ba597c5SAnurag S. Maskey 	else if (interactive_mode)
41476ba597c5SAnurag S. Maskey 		(void) printf(gettext("All properties verified\n"));
41486ba597c5SAnurag S. Maskey }
41496ba597c5SAnurag S. Maskey 
41506ba597c5SAnurag S. Maskey /*
41516ba597c5SAnurag S. Maskey  * command-line mode (# nwamcfg list or # nwamcfg "select loc test; list")
41526ba597c5SAnurag S. Maskey  */
41536ba597c5SAnurag S. Maskey static int
41546ba597c5SAnurag S. Maskey one_command_at_a_time(int argc, char *argv[])
41556ba597c5SAnurag S. Maskey {
41566ba597c5SAnurag S. Maskey 	char *command;
41576ba597c5SAnurag S. Maskey 	size_t len = 2; /* terminal \n\0 */
41586ba597c5SAnurag S. Maskey 	int i, err;
41596ba597c5SAnurag S. Maskey 
41606ba597c5SAnurag S. Maskey 	for (i = 0; i < argc; i++)
41616ba597c5SAnurag S. Maskey 		len += strlen(argv[i]) + 1;
41626ba597c5SAnurag S. Maskey 	if ((command = malloc(len)) == NULL) {
41636ba597c5SAnurag S. Maskey 		nerr("Out of memory");
41646ba597c5SAnurag S. Maskey 		return (NWAM_ERR);
41656ba597c5SAnurag S. Maskey 	}
41666ba597c5SAnurag S. Maskey 	(void) strlcpy(command, argv[0], len);
41676ba597c5SAnurag S. Maskey 	for (i = 1; i < argc; i++) {
41686ba597c5SAnurag S. Maskey 		(void) strlcat(command, " ", len);
41696ba597c5SAnurag S. Maskey 		(void) strlcat(command, argv[i], len);
41706ba597c5SAnurag S. Maskey 	}
41716ba597c5SAnurag S. Maskey 	(void) strlcat(command, "\n", len);
41726ba597c5SAnurag S. Maskey 	err = string_to_yyin(command);
41736ba597c5SAnurag S. Maskey 	free(command);
41746ba597c5SAnurag S. Maskey 	if (err != NWAM_OK)
41756ba597c5SAnurag S. Maskey 		return (err);
41766ba597c5SAnurag S. Maskey 	while (!feof(yyin)) {
41776ba597c5SAnurag S. Maskey 		yyparse();
41786ba597c5SAnurag S. Maskey 
41796ba597c5SAnurag S. Maskey 		/*
41806ba597c5SAnurag S. Maskey 		 * If any command on a list of commands give an error,
41816ba597c5SAnurag S. Maskey 		 * don't continue with the remaining commands.
41826ba597c5SAnurag S. Maskey 		 */
41836ba597c5SAnurag S. Maskey 		if (saw_error || time_to_exit)
41846ba597c5SAnurag S. Maskey 			return (cleanup());
41856ba597c5SAnurag S. Maskey 	}
41866ba597c5SAnurag S. Maskey 
41876ba597c5SAnurag S. Maskey 	/* if there are changes to commit, commit it */
41886ba597c5SAnurag S. Maskey 	if (need_to_commit) {
41896ba597c5SAnurag S. Maskey 		do_commit();
41906ba597c5SAnurag S. Maskey 		/* if need_to_commit is not set, then there was a error */
41916ba597c5SAnurag S. Maskey 		if (need_to_commit)
41926ba597c5SAnurag S. Maskey 			return (NWAM_ERR);
41936ba597c5SAnurag S. Maskey 	}
41946ba597c5SAnurag S. Maskey 
41956ba597c5SAnurag S. Maskey 	if (!interactive_mode)
41966ba597c5SAnurag S. Maskey 		return (cleanup());
41976ba597c5SAnurag S. Maskey 	else {
41986ba597c5SAnurag S. Maskey 		yyin = stdin;
41996ba597c5SAnurag S. Maskey 		return (read_input());
42006ba597c5SAnurag S. Maskey 	}
42016ba597c5SAnurag S. Maskey }
42026ba597c5SAnurag S. Maskey 
42036ba597c5SAnurag S. Maskey /*
42046ba597c5SAnurag S. Maskey  * cmd_file is slightly more complicated, as it has to open the command file
42056ba597c5SAnurag S. Maskey  * and set yyin appropriately.  Once that is done, though, it just calls
42066ba597c5SAnurag S. Maskey  * read_input(), and only once, since prompting is not possible.
42076ba597c5SAnurag S. Maskey  */
42086ba597c5SAnurag S. Maskey static int
42096ba597c5SAnurag S. Maskey cmd_file(char *file)
42106ba597c5SAnurag S. Maskey {
42116ba597c5SAnurag S. Maskey 	FILE *infile;
42126ba597c5SAnurag S. Maskey 	int err;
42136ba597c5SAnurag S. Maskey 	struct stat statbuf;
42146ba597c5SAnurag S. Maskey 	boolean_t using_real_file = (strcmp(file, "-") != 0);
42156ba597c5SAnurag S. Maskey 
42166ba597c5SAnurag S. Maskey 	if (using_real_file) {
42176ba597c5SAnurag S. Maskey 		/*
42186ba597c5SAnurag S. Maskey 		 * nerr() prints a line number in cmd_file_mode, which we do
42196ba597c5SAnurag S. Maskey 		 * not want here, so temporarily unset it.
42206ba597c5SAnurag S. Maskey 		 */
42216ba597c5SAnurag S. Maskey 		cmd_file_mode = B_FALSE;
42226ba597c5SAnurag S. Maskey 		if ((infile = fopen(file, "r")) == NULL) {
42236ba597c5SAnurag S. Maskey 			nerr(gettext("could not open file '%s': %s"),
42246ba597c5SAnurag S. Maskey 			    file, strerror(errno));
42256ba597c5SAnurag S. Maskey 			return (1);
42266ba597c5SAnurag S. Maskey 		}
42276ba597c5SAnurag S. Maskey 		if ((err = fstat(fileno(infile), &statbuf)) != 0) {
42286ba597c5SAnurag S. Maskey 			nerr(gettext("could not stat file '%s': %s"),
42296ba597c5SAnurag S. Maskey 			    file, strerror(errno));
42306ba597c5SAnurag S. Maskey 			err = 1;
42316ba597c5SAnurag S. Maskey 			goto done;
42326ba597c5SAnurag S. Maskey 		}
42336ba597c5SAnurag S. Maskey 		if (!S_ISREG(statbuf.st_mode)) {
42346ba597c5SAnurag S. Maskey 			nerr(gettext("'%s' is not a regular file."), file);
42356ba597c5SAnurag S. Maskey 			err = 1;
42366ba597c5SAnurag S. Maskey 			goto done;
42376ba597c5SAnurag S. Maskey 		}
42386ba597c5SAnurag S. Maskey 
42396ba597c5SAnurag S. Maskey 		/*
42406ba597c5SAnurag S. Maskey 		 * If -d was passed on the command-line, we need to
42416ba597c5SAnurag S. Maskey 		 * start by removing any existing configuration.
42426ba597c5SAnurag S. Maskey 		 * Alternatively, the file may begin with 'destroy -a';
42436ba597c5SAnurag S. Maskey 		 * but in that case, the line will go through the lexer
42446ba597c5SAnurag S. Maskey 		 * and be processed as it's encountered in the file.
42456ba597c5SAnurag S. Maskey 		 */
42466ba597c5SAnurag S. Maskey 		if (remove_all_configurations && destroy_all() != NWAM_SUCCESS)
42476ba597c5SAnurag S. Maskey 			goto done;
42486ba597c5SAnurag S. Maskey 
42496ba597c5SAnurag S. Maskey 		/* set up for lexer */
42506ba597c5SAnurag S. Maskey 		yyin = infile;
42516ba597c5SAnurag S. Maskey 		cmd_file_mode = B_TRUE;
42526ba597c5SAnurag S. Maskey 		ok_to_prompt = B_FALSE;
42536ba597c5SAnurag S. Maskey 	} else {
42546ba597c5SAnurag S. Maskey 		/*
42556ba597c5SAnurag S. Maskey 		 * "-f -" is essentially the same as interactive mode,
42566ba597c5SAnurag S. Maskey 		 * so treat it that way.
42576ba597c5SAnurag S. Maskey 		 */
42586ba597c5SAnurag S. Maskey 		interactive_mode = B_TRUE;
42596ba597c5SAnurag S. Maskey 	}
42606ba597c5SAnurag S. Maskey 	/* NWAM_REPEAT is for interactive mode; treat it like NWAM_ERR here. */
42616ba597c5SAnurag S. Maskey 	if ((err = read_input()) == NWAM_REPEAT)
42626ba597c5SAnurag S. Maskey 		err = NWAM_ERR;
42636ba597c5SAnurag S. Maskey 	if (err == NWAM_OK)
42646ba597c5SAnurag S. Maskey 		(void) printf(gettext("Configuration read.\n"));
42656ba597c5SAnurag S. Maskey 
42666ba597c5SAnurag S. Maskey done:
42676ba597c5SAnurag S. Maskey 	if (using_real_file)
42686ba597c5SAnurag S. Maskey 		(void) fclose(infile);
42696ba597c5SAnurag S. Maskey 	return (err);
42706ba597c5SAnurag S. Maskey }
42716ba597c5SAnurag S. Maskey 
42726ba597c5SAnurag S. Maskey int
42736ba597c5SAnurag S. Maskey main(int argc, char *argv[])
42746ba597c5SAnurag S. Maskey {
42756ba597c5SAnurag S. Maskey 	int	err;
42766ba597c5SAnurag S. Maskey 	char	c;
42776ba597c5SAnurag S. Maskey 
42786ba597c5SAnurag S. Maskey 	/* This must be before anything goes to stdout. */
42796ba597c5SAnurag S. Maskey 	setbuf(stdout, NULL);
42806ba597c5SAnurag S. Maskey 
42816ba597c5SAnurag S. Maskey 	if ((execname = strrchr(argv[0], '/')) == NULL)
42826ba597c5SAnurag S. Maskey 		execname = argv[0];
42836ba597c5SAnurag S. Maskey 	else
42846ba597c5SAnurag S. Maskey 		execname++;
42856ba597c5SAnurag S. Maskey 
42866ba597c5SAnurag S. Maskey 	(void) setlocale(LC_ALL, "");
42876ba597c5SAnurag S. Maskey 	(void) textdomain(TEXT_DOMAIN);
42886ba597c5SAnurag S. Maskey 
42896ba597c5SAnurag S. Maskey 	while ((c = getopt(argc, argv, "?hf:d")) != EOF) {
42906ba597c5SAnurag S. Maskey 		switch (c) {
42916ba597c5SAnurag S. Maskey 		case 'f':
42926ba597c5SAnurag S. Maskey 			cmd_file_name = optarg;
42936ba597c5SAnurag S. Maskey 			cmd_file_mode = B_TRUE;
42946ba597c5SAnurag S. Maskey 			break;
42956ba597c5SAnurag S. Maskey 		case '?':
42966ba597c5SAnurag S. Maskey 		case 'h':
42976ba597c5SAnurag S. Maskey 			cmd_line_usage();
42986ba597c5SAnurag S. Maskey 			return (NWAM_OK);
42996ba597c5SAnurag S. Maskey 		case 'd':
43006ba597c5SAnurag S. Maskey 			remove_all_configurations = B_TRUE;
43016ba597c5SAnurag S. Maskey 			break;
43026ba597c5SAnurag S. Maskey 		default:
43036ba597c5SAnurag S. Maskey 			cmd_line_usage();
43046ba597c5SAnurag S. Maskey 			return (NWAM_ERR);
43056ba597c5SAnurag S. Maskey 		}
43066ba597c5SAnurag S. Maskey 	}
43076ba597c5SAnurag S. Maskey 	/* -d can only be used with -f */
43086ba597c5SAnurag S. Maskey 	if (remove_all_configurations && !cmd_file_mode) {
43096ba597c5SAnurag S. Maskey 		nerr("Option -d can only be used with -f");
43106ba597c5SAnurag S. Maskey 		return (NWAM_ERR);
43116ba597c5SAnurag S. Maskey 	}
43126ba597c5SAnurag S. Maskey 
43136ba597c5SAnurag S. Maskey 	/*
43146ba597c5SAnurag S. Maskey 	 * This may get set back to FALSE again in cmd_file() if cmd_file_name
43156ba597c5SAnurag S. Maskey 	 * is a "real" file as opposed to "-" (i.e. meaning use stdin).
43166ba597c5SAnurag S. Maskey 	 */
43176ba597c5SAnurag S. Maskey 	if (isatty(STDIN_FILENO))
43186ba597c5SAnurag S. Maskey 		ok_to_prompt = B_TRUE;
43196ba597c5SAnurag S. Maskey 	if ((gl = new_GetLine(MAX_LINE_LEN, MAX_CMD_HIST)) == NULL)
43206ba597c5SAnurag S. Maskey 		exit(NWAM_ERR);
43216ba597c5SAnurag S. Maskey 	if (gl_customize_completion(gl, NULL, cmd_cpl_fn) != 0)
43226ba597c5SAnurag S. Maskey 		exit(NWAM_ERR);
43236ba597c5SAnurag S. Maskey 	(void) sigset(SIGINT, SIG_IGN);
43246ba597c5SAnurag S. Maskey 
43256ba597c5SAnurag S. Maskey 	if (optind == argc) {
43266ba597c5SAnurag S. Maskey 		/* interactive or command-file mode */
43276ba597c5SAnurag S. Maskey 		if (!cmd_file_mode)
43286ba597c5SAnurag S. Maskey 			err = do_interactive();
43296ba597c5SAnurag S. Maskey 		else
43306ba597c5SAnurag S. Maskey 			err = cmd_file(cmd_file_name);
43316ba597c5SAnurag S. Maskey 	} else {
43326ba597c5SAnurag S. Maskey 		/* command-line mode */
43336ba597c5SAnurag S. Maskey 		err = one_command_at_a_time(argc - optind, &(argv[optind]));
43346ba597c5SAnurag S. Maskey 	}
43356ba597c5SAnurag S. Maskey 	(void) del_GetLine(gl);
43366ba597c5SAnurag S. Maskey 
43376ba597c5SAnurag S. Maskey 	return (err);
43386ba597c5SAnurag S. Maskey }
4339