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