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