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