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