1*11767SAnurag.Maskey@Sun.COM /* 2*11767SAnurag.Maskey@Sun.COM * CDDL HEADER START 3*11767SAnurag.Maskey@Sun.COM * 4*11767SAnurag.Maskey@Sun.COM * The contents of this file are subject to the terms of the 5*11767SAnurag.Maskey@Sun.COM * Common Development and Distribution License (the "License"). 6*11767SAnurag.Maskey@Sun.COM * You may not use this file except in compliance with the License. 7*11767SAnurag.Maskey@Sun.COM * 8*11767SAnurag.Maskey@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*11767SAnurag.Maskey@Sun.COM * or http://www.opensolaris.org/os/licensing. 10*11767SAnurag.Maskey@Sun.COM * See the License for the specific language governing permissions 11*11767SAnurag.Maskey@Sun.COM * and limitations under the License. 12*11767SAnurag.Maskey@Sun.COM * 13*11767SAnurag.Maskey@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 14*11767SAnurag.Maskey@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*11767SAnurag.Maskey@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 16*11767SAnurag.Maskey@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 17*11767SAnurag.Maskey@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 18*11767SAnurag.Maskey@Sun.COM * 19*11767SAnurag.Maskey@Sun.COM * CDDL HEADER END 20*11767SAnurag.Maskey@Sun.COM */ 21*11767SAnurag.Maskey@Sun.COM 22*11767SAnurag.Maskey@Sun.COM /* 23*11767SAnurag.Maskey@Sun.COM * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 24*11767SAnurag.Maskey@Sun.COM * Use is subject to license terms. 25*11767SAnurag.Maskey@Sun.COM */ 26*11767SAnurag.Maskey@Sun.COM 27*11767SAnurag.Maskey@Sun.COM #include <assert.h> 28*11767SAnurag.Maskey@Sun.COM #include <ctype.h> 29*11767SAnurag.Maskey@Sun.COM #include <sys/param.h> 30*11767SAnurag.Maskey@Sun.COM #include <sys/types.h> 31*11767SAnurag.Maskey@Sun.COM #include <sys/stat.h> 32*11767SAnurag.Maskey@Sun.COM #include <stdio.h> 33*11767SAnurag.Maskey@Sun.COM #include <stdlib.h> 34*11767SAnurag.Maskey@Sun.COM #include <strings.h> 35*11767SAnurag.Maskey@Sun.COM #include <unistd.h> 36*11767SAnurag.Maskey@Sun.COM #include <libscf.h> 37*11767SAnurag.Maskey@Sun.COM 38*11767SAnurag.Maskey@Sun.COM #include "libnwam_impl.h" 39*11767SAnurag.Maskey@Sun.COM #include <libnwam_priv.h> 40*11767SAnurag.Maskey@Sun.COM #include <libnwam.h> 41*11767SAnurag.Maskey@Sun.COM 42*11767SAnurag.Maskey@Sun.COM /* 43*11767SAnurag.Maskey@Sun.COM * Functions to support creating, modifying, destroying, querying the 44*11767SAnurag.Maskey@Sun.COM * state of and changing the state of location objects. Locations 45*11767SAnurag.Maskey@Sun.COM * represent the configuration to be applied once basic network configuration 46*11767SAnurag.Maskey@Sun.COM * has been established - name services, IPsec config, etc, and can be enabled 47*11767SAnurag.Maskey@Sun.COM * either manually or conditionally for a combination of the set of 48*11767SAnurag.Maskey@Sun.COM * available conditions (an IP address is present, an ENM is active etc). 49*11767SAnurag.Maskey@Sun.COM */ 50*11767SAnurag.Maskey@Sun.COM 51*11767SAnurag.Maskey@Sun.COM #define NSSWITCH_PREFIX "/etc/nsswitch." 52*11767SAnurag.Maskey@Sun.COM 53*11767SAnurag.Maskey@Sun.COM typedef nwam_error_t (*nwam_loc_prop_validate_func_t)(nwam_value_t); 54*11767SAnurag.Maskey@Sun.COM 55*11767SAnurag.Maskey@Sun.COM static nwam_error_t valid_loc_activation_mode(nwam_value_t); 56*11767SAnurag.Maskey@Sun.COM static nwam_error_t valid_loc_condition(nwam_value_t); 57*11767SAnurag.Maskey@Sun.COM static nwam_error_t valid_nameservices(nwam_value_t); 58*11767SAnurag.Maskey@Sun.COM static nwam_error_t valid_configsrc(nwam_value_t); 59*11767SAnurag.Maskey@Sun.COM 60*11767SAnurag.Maskey@Sun.COM struct nwam_prop_table_entry loc_prop_table_entries[] = { 61*11767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_ACTIVATION_MODE, NWAM_VALUE_TYPE_UINT64, B_FALSE, 1, 1, 62*11767SAnurag.Maskey@Sun.COM valid_loc_activation_mode, 63*11767SAnurag.Maskey@Sun.COM "specifies the location activation mode - valid values are:\n" 64*11767SAnurag.Maskey@Sun.COM "\'manual\', \'conditional-any\' and \'conditional-all\'", 65*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 66*11767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_CONDITIONS, NWAM_VALUE_TYPE_STRING, B_FALSE, 0, 67*11767SAnurag.Maskey@Sun.COM NWAM_MAX_NUM_VALUES, valid_loc_condition, 68*11767SAnurag.Maskey@Sun.COM "specifies the activation condition. Conditions are of the form:\n" 69*11767SAnurag.Maskey@Sun.COM "ncp|ncu|enm name is|is-not active\n" 70*11767SAnurag.Maskey@Sun.COM "ip-address is|is-not|is-in-range|is-not-in-range| 1.2.3.4[/24]\n" 71*11767SAnurag.Maskey@Sun.COM "advertised-domain is|is-not|contains|does-not-contain string\n" 72*11767SAnurag.Maskey@Sun.COM "system-domain is|is-not|contains|does-not-contain string\n" 73*11767SAnurag.Maskey@Sun.COM "essid is|is-not|contains|does-not-contain string\n" 74*11767SAnurag.Maskey@Sun.COM "bssid is|is-not string", 75*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 76*11767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_ENABLED, NWAM_VALUE_TYPE_BOOLEAN, B_TRUE, 1, 1, 77*11767SAnurag.Maskey@Sun.COM nwam_valid_boolean, 78*11767SAnurag.Maskey@Sun.COM "specifies if location is to be enabled", 79*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 80*11767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_NAMESERVICES, NWAM_VALUE_TYPE_UINT64, B_FALSE, 1, 81*11767SAnurag.Maskey@Sun.COM NWAM_MAX_NUM_VALUES, valid_nameservices, 82*11767SAnurag.Maskey@Sun.COM "specifies name service(s) to be used - valid values are:\n" 83*11767SAnurag.Maskey@Sun.COM "\'files\', \'dns\', \'nis\', and \'ldap\'", 84*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 85*11767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE, NWAM_VALUE_TYPE_STRING, 86*11767SAnurag.Maskey@Sun.COM B_FALSE, 0, 1, nwam_valid_file, 87*11767SAnurag.Maskey@Sun.COM "specifies path to configuration file for name services switch " 88*11767SAnurag.Maskey@Sun.COM "for this location - see nsswitch.conf(4)", 89*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 90*11767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC, NWAM_VALUE_TYPE_UINT64, 91*11767SAnurag.Maskey@Sun.COM B_FALSE, 0, NWAM_MAX_NUM_VALUES, valid_configsrc, 92*11767SAnurag.Maskey@Sun.COM "specifies sources of DNS configuration parameters - valid values " 93*11767SAnurag.Maskey@Sun.COM "are:\n\'dhcp\', or \'manual\'", 94*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 95*11767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_DNS_NAMESERVICE_DOMAIN, NWAM_VALUE_TYPE_STRING, B_FALSE, 96*11767SAnurag.Maskey@Sun.COM 0, 1, nwam_valid_domain, 97*11767SAnurag.Maskey@Sun.COM "specifies DNS domain name to be set for this location", 98*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 99*11767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_DNS_NAMESERVICE_SERVERS, NWAM_VALUE_TYPE_STRING, B_FALSE, 100*11767SAnurag.Maskey@Sun.COM 0, NWAM_MAX_NUM_VALUES, nwam_valid_host_any, 101*11767SAnurag.Maskey@Sun.COM "specifies DNS server host address(es)", 102*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 103*11767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_DNS_NAMESERVICE_SEARCH, NWAM_VALUE_TYPE_STRING, B_FALSE, 104*11767SAnurag.Maskey@Sun.COM 0, NWAM_MAX_NUM_VALUES, nwam_valid_domain, 105*11767SAnurag.Maskey@Sun.COM "specifies DNS search list for host name lookup", 106*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 107*11767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_NIS_NAMESERVICE_CONFIGSRC, NWAM_VALUE_TYPE_UINT64, 108*11767SAnurag.Maskey@Sun.COM B_FALSE, 0, NWAM_MAX_NUM_VALUES, valid_configsrc, 109*11767SAnurag.Maskey@Sun.COM "specifies sources of NIS configuration parameters - valid values " 110*11767SAnurag.Maskey@Sun.COM "are:\n\'dhcp\', or \'manual\'", 111*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 112*11767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_NIS_NAMESERVICE_SERVERS, NWAM_VALUE_TYPE_STRING, B_FALSE, 113*11767SAnurag.Maskey@Sun.COM 0, NWAM_MAX_NUM_VALUES, nwam_valid_host_any, 114*11767SAnurag.Maskey@Sun.COM "specifies NIS server host address(es)", 115*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 116*11767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC, NWAM_VALUE_TYPE_UINT64, 117*11767SAnurag.Maskey@Sun.COM B_FALSE, 0, NWAM_MAX_NUM_VALUES, valid_configsrc, 118*11767SAnurag.Maskey@Sun.COM "specifies sources of NIS configuration parameters - currently, " 119*11767SAnurag.Maskey@Sun.COM "the only valid value is \'manual\'", 120*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 121*11767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_LDAP_NAMESERVICE_SERVERS, NWAM_VALUE_TYPE_STRING, 122*11767SAnurag.Maskey@Sun.COM B_FALSE, 0, NWAM_MAX_NUM_VALUES, nwam_valid_host_or_domain, 123*11767SAnurag.Maskey@Sun.COM "specifies LDAP server host address(es)", 124*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 125*11767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_DEFAULT_DOMAIN, NWAM_VALUE_TYPE_STRING, B_FALSE, 0, 1, 126*11767SAnurag.Maskey@Sun.COM nwam_valid_domain, 127*11767SAnurag.Maskey@Sun.COM "specifies the domainname(1M) to be set for this location", 128*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 129*11767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_NFSV4_DOMAIN, NWAM_VALUE_TYPE_STRING, B_FALSE, 0, 1, 130*11767SAnurag.Maskey@Sun.COM nwam_valid_domain, 131*11767SAnurag.Maskey@Sun.COM "specifies an NFSv4 domain for this location", 132*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 133*11767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_IPFILTER_CONFIG_FILE, NWAM_VALUE_TYPE_STRING, B_FALSE, 134*11767SAnurag.Maskey@Sun.COM 0, 1, nwam_valid_file, 135*11767SAnurag.Maskey@Sun.COM "specifies an absolute path to an ipf.conf(4) file for this " 136*11767SAnurag.Maskey@Sun.COM "location", 137*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 138*11767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_IPFILTER_V6_CONFIG_FILE, NWAM_VALUE_TYPE_STRING, 139*11767SAnurag.Maskey@Sun.COM B_FALSE, 0, 1, nwam_valid_file, 140*11767SAnurag.Maskey@Sun.COM "specifies an absolute path to an ipf6.conf file for this " 141*11767SAnurag.Maskey@Sun.COM "location", 142*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 143*11767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_IPNAT_CONFIG_FILE, NWAM_VALUE_TYPE_STRING, B_FALSE, 0, 144*11767SAnurag.Maskey@Sun.COM 1, nwam_valid_file, 145*11767SAnurag.Maskey@Sun.COM "specifies an absolute path to an ipnat.conf(4) file for this " 146*11767SAnurag.Maskey@Sun.COM "location", 147*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 148*11767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_IPPOOL_CONFIG_FILE, NWAM_VALUE_TYPE_STRING, B_FALSE, 0, 149*11767SAnurag.Maskey@Sun.COM 1, nwam_valid_file, 150*11767SAnurag.Maskey@Sun.COM "specifies an absolute path to an ippool.conf(4) file for this " 151*11767SAnurag.Maskey@Sun.COM "location", 152*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 153*11767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_IKE_CONFIG_FILE, NWAM_VALUE_TYPE_STRING, B_FALSE, 0, 1, 154*11767SAnurag.Maskey@Sun.COM nwam_valid_file, 155*11767SAnurag.Maskey@Sun.COM "specifies an absolute path to an ike config file " 156*11767SAnurag.Maskey@Sun.COM "(see ike.config(4))", 157*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 158*11767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_IPSECPOLICY_CONFIG_FILE, NWAM_VALUE_TYPE_STRING, 159*11767SAnurag.Maskey@Sun.COM B_FALSE, 0, 1, nwam_valid_file, 160*11767SAnurag.Maskey@Sun.COM "specifies an absolute path to an IPsec policy configuration file " 161*11767SAnurag.Maskey@Sun.COM "(see ipsecconf(1M)", 162*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 163*11767SAnurag.Maskey@Sun.COM }; 164*11767SAnurag.Maskey@Sun.COM 165*11767SAnurag.Maskey@Sun.COM #define NWAM_NUM_LOC_PROPS (sizeof (loc_prop_table_entries) / \ 166*11767SAnurag.Maskey@Sun.COM sizeof (*loc_prop_table_entries)) 167*11767SAnurag.Maskey@Sun.COM 168*11767SAnurag.Maskey@Sun.COM struct nwam_prop_table loc_prop_table = 169*11767SAnurag.Maskey@Sun.COM { NWAM_NUM_LOC_PROPS, loc_prop_table_entries }; 170*11767SAnurag.Maskey@Sun.COM 171*11767SAnurag.Maskey@Sun.COM static uint64_t 172*11767SAnurag.Maskey@Sun.COM nwam_loc_activation_to_flag(nwam_activation_mode_t activation) 173*11767SAnurag.Maskey@Sun.COM { 174*11767SAnurag.Maskey@Sun.COM switch (activation) { 175*11767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_MANUAL: 176*11767SAnurag.Maskey@Sun.COM return (NWAM_FLAG_ACTIVATION_MODE_MANUAL); 177*11767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_SYSTEM: 178*11767SAnurag.Maskey@Sun.COM return (NWAM_FLAG_ACTIVATION_MODE_SYSTEM); 179*11767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_CONDITIONAL_ANY: 180*11767SAnurag.Maskey@Sun.COM return (NWAM_FLAG_ACTIVATION_MODE_CONDITIONAL_ANY); 181*11767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_CONDITIONAL_ALL: 182*11767SAnurag.Maskey@Sun.COM return (NWAM_FLAG_ACTIVATION_MODE_CONDITIONAL_ALL); 183*11767SAnurag.Maskey@Sun.COM default: 184*11767SAnurag.Maskey@Sun.COM return (0); 185*11767SAnurag.Maskey@Sun.COM } 186*11767SAnurag.Maskey@Sun.COM } 187*11767SAnurag.Maskey@Sun.COM 188*11767SAnurag.Maskey@Sun.COM nwam_error_t 189*11767SAnurag.Maskey@Sun.COM nwam_loc_read(const char *name, uint64_t flags, nwam_loc_handle_t *lochp) 190*11767SAnurag.Maskey@Sun.COM { 191*11767SAnurag.Maskey@Sun.COM return (nwam_read(NWAM_OBJECT_TYPE_LOC, NWAM_LOC_CONF_FILE, name, 192*11767SAnurag.Maskey@Sun.COM flags, lochp)); 193*11767SAnurag.Maskey@Sun.COM } 194*11767SAnurag.Maskey@Sun.COM 195*11767SAnurag.Maskey@Sun.COM nwam_error_t 196*11767SAnurag.Maskey@Sun.COM nwam_loc_create(const char *name, nwam_loc_handle_t *lochp) 197*11767SAnurag.Maskey@Sun.COM { 198*11767SAnurag.Maskey@Sun.COM nwam_error_t err; 199*11767SAnurag.Maskey@Sun.COM nwam_value_t val = NULL; 200*11767SAnurag.Maskey@Sun.COM char *nsswitch = NULL; 201*11767SAnurag.Maskey@Sun.COM 202*11767SAnurag.Maskey@Sun.COM assert(lochp != NULL && name != NULL); 203*11767SAnurag.Maskey@Sun.COM 204*11767SAnurag.Maskey@Sun.COM if ((err = nwam_create(NWAM_OBJECT_TYPE_LOC, NWAM_LOC_CONF_FILE, name, 205*11767SAnurag.Maskey@Sun.COM lochp)) != NWAM_SUCCESS) 206*11767SAnurag.Maskey@Sun.COM return (err); 207*11767SAnurag.Maskey@Sun.COM 208*11767SAnurag.Maskey@Sun.COM /* Create new object list for loc */ 209*11767SAnurag.Maskey@Sun.COM if ((err = nwam_alloc_object_list(&((*lochp)->nwh_data))) 210*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) 211*11767SAnurag.Maskey@Sun.COM goto finish; 212*11767SAnurag.Maskey@Sun.COM 213*11767SAnurag.Maskey@Sun.COM /* NWAM_LOC_PROP_ACTIVATION_MODE is mandatory */ 214*11767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_uint64(NWAM_ACTIVATION_MODE_MANUAL, &val)) 215*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) { 216*11767SAnurag.Maskey@Sun.COM goto finish; 217*11767SAnurag.Maskey@Sun.COM } 218*11767SAnurag.Maskey@Sun.COM if ((err = nwam_set_prop_value((*lochp)->nwh_data, 219*11767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_ACTIVATION_MODE, val)) != NWAM_SUCCESS) { 220*11767SAnurag.Maskey@Sun.COM goto finish; 221*11767SAnurag.Maskey@Sun.COM } 222*11767SAnurag.Maskey@Sun.COM nwam_value_free(val); 223*11767SAnurag.Maskey@Sun.COM val = NULL; 224*11767SAnurag.Maskey@Sun.COM 225*11767SAnurag.Maskey@Sun.COM /* 226*11767SAnurag.Maskey@Sun.COM * NWAM_LOC_PROP_ENABLED defaults to false. 227*11767SAnurag.Maskey@Sun.COM */ 228*11767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_boolean(B_FALSE, &val)) != NWAM_SUCCESS) 229*11767SAnurag.Maskey@Sun.COM goto finish; 230*11767SAnurag.Maskey@Sun.COM if ((err = nwam_set_prop_value((*lochp)->nwh_data, 231*11767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_ENABLED, val)) != NWAM_SUCCESS) 232*11767SAnurag.Maskey@Sun.COM goto finish; 233*11767SAnurag.Maskey@Sun.COM nwam_value_free(val); 234*11767SAnurag.Maskey@Sun.COM val = NULL; 235*11767SAnurag.Maskey@Sun.COM 236*11767SAnurag.Maskey@Sun.COM /* 237*11767SAnurag.Maskey@Sun.COM * Initialize name service properties: use DNS, configured 238*11767SAnurag.Maskey@Sun.COM * via DHCP, with default nsswitch (/etc/nsswitch.dns). 239*11767SAnurag.Maskey@Sun.COM */ 240*11767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_uint64(NWAM_NAMESERVICES_DNS, &val)) != 241*11767SAnurag.Maskey@Sun.COM NWAM_SUCCESS) 242*11767SAnurag.Maskey@Sun.COM goto finish; 243*11767SAnurag.Maskey@Sun.COM if ((err = nwam_set_prop_value((*lochp)->nwh_data, 244*11767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_NAMESERVICES, val)) != NWAM_SUCCESS) 245*11767SAnurag.Maskey@Sun.COM goto finish; 246*11767SAnurag.Maskey@Sun.COM nwam_value_free(val); 247*11767SAnurag.Maskey@Sun.COM val = NULL; 248*11767SAnurag.Maskey@Sun.COM 249*11767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_uint64(NWAM_CONFIGSRC_DHCP, &val)) != 250*11767SAnurag.Maskey@Sun.COM NWAM_SUCCESS) 251*11767SAnurag.Maskey@Sun.COM goto finish; 252*11767SAnurag.Maskey@Sun.COM if ((err = nwam_set_prop_value((*lochp)->nwh_data, 253*11767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC, val)) != NWAM_SUCCESS) 254*11767SAnurag.Maskey@Sun.COM goto finish; 255*11767SAnurag.Maskey@Sun.COM nwam_value_free(val); 256*11767SAnurag.Maskey@Sun.COM val = NULL; 257*11767SAnurag.Maskey@Sun.COM 258*11767SAnurag.Maskey@Sun.COM /* concatenate these two strings */ 259*11767SAnurag.Maskey@Sun.COM nsswitch = strdup(NSSWITCH_PREFIX NWAM_NAMESERVICES_DNS_STRING); 260*11767SAnurag.Maskey@Sun.COM if (nsswitch == NULL) { 261*11767SAnurag.Maskey@Sun.COM err = NWAM_NO_MEMORY; 262*11767SAnurag.Maskey@Sun.COM goto finish; 263*11767SAnurag.Maskey@Sun.COM } 264*11767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_string(nsswitch, &val)) != NWAM_SUCCESS) 265*11767SAnurag.Maskey@Sun.COM goto finish; 266*11767SAnurag.Maskey@Sun.COM err = nwam_set_prop_value((*lochp)->nwh_data, 267*11767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE, val); 268*11767SAnurag.Maskey@Sun.COM 269*11767SAnurag.Maskey@Sun.COM finish: 270*11767SAnurag.Maskey@Sun.COM if (nsswitch != NULL) 271*11767SAnurag.Maskey@Sun.COM free(nsswitch); 272*11767SAnurag.Maskey@Sun.COM if (val != NULL) 273*11767SAnurag.Maskey@Sun.COM nwam_value_free(val); 274*11767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) { 275*11767SAnurag.Maskey@Sun.COM nwam_loc_free(*lochp); 276*11767SAnurag.Maskey@Sun.COM *lochp = NULL; 277*11767SAnurag.Maskey@Sun.COM } 278*11767SAnurag.Maskey@Sun.COM return (err); 279*11767SAnurag.Maskey@Sun.COM } 280*11767SAnurag.Maskey@Sun.COM 281*11767SAnurag.Maskey@Sun.COM nwam_error_t 282*11767SAnurag.Maskey@Sun.COM nwam_loc_get_name(nwam_loc_handle_t loch, char **namep) 283*11767SAnurag.Maskey@Sun.COM { 284*11767SAnurag.Maskey@Sun.COM return (nwam_get_name(loch, namep)); 285*11767SAnurag.Maskey@Sun.COM } 286*11767SAnurag.Maskey@Sun.COM 287*11767SAnurag.Maskey@Sun.COM nwam_error_t 288*11767SAnurag.Maskey@Sun.COM nwam_loc_set_name(nwam_loc_handle_t loch, const char *name) 289*11767SAnurag.Maskey@Sun.COM { 290*11767SAnurag.Maskey@Sun.COM return (nwam_set_name(loch, name)); 291*11767SAnurag.Maskey@Sun.COM } 292*11767SAnurag.Maskey@Sun.COM 293*11767SAnurag.Maskey@Sun.COM boolean_t 294*11767SAnurag.Maskey@Sun.COM nwam_loc_can_set_name(nwam_loc_handle_t loch) 295*11767SAnurag.Maskey@Sun.COM { 296*11767SAnurag.Maskey@Sun.COM return (!loch->nwh_committed); 297*11767SAnurag.Maskey@Sun.COM } 298*11767SAnurag.Maskey@Sun.COM 299*11767SAnurag.Maskey@Sun.COM /* ARGSUSED2 */ 300*11767SAnurag.Maskey@Sun.COM static int 301*11767SAnurag.Maskey@Sun.COM loc_selectcb(struct nwam_handle *hp, uint64_t flags, void *data) 302*11767SAnurag.Maskey@Sun.COM { 303*11767SAnurag.Maskey@Sun.COM nwam_loc_handle_t loch = hp; 304*11767SAnurag.Maskey@Sun.COM char *locname; 305*11767SAnurag.Maskey@Sun.COM uint64_t activation, actflag, walkfilter; 306*11767SAnurag.Maskey@Sun.COM nwam_value_t activationval; 307*11767SAnurag.Maskey@Sun.COM 308*11767SAnurag.Maskey@Sun.COM /* Skip the Legacy location in all cases */ 309*11767SAnurag.Maskey@Sun.COM if (nwam_loc_get_name(loch, &locname) != NWAM_SUCCESS) 310*11767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 311*11767SAnurag.Maskey@Sun.COM if (strcmp(locname, NWAM_LOC_NAME_LEGACY) == 0) { 312*11767SAnurag.Maskey@Sun.COM free(locname); 313*11767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 314*11767SAnurag.Maskey@Sun.COM } 315*11767SAnurag.Maskey@Sun.COM free(locname); 316*11767SAnurag.Maskey@Sun.COM 317*11767SAnurag.Maskey@Sun.COM /* 318*11767SAnurag.Maskey@Sun.COM * Get a bitmapped flag value corresponding to this loc's 319*11767SAnurag.Maskey@Sun.COM * activation. 320*11767SAnurag.Maskey@Sun.COM */ 321*11767SAnurag.Maskey@Sun.COM if (nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_ACTIVATION_MODE, 322*11767SAnurag.Maskey@Sun.COM &activationval) != NWAM_SUCCESS) { 323*11767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 324*11767SAnurag.Maskey@Sun.COM } 325*11767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64(activationval, &activation) != NWAM_SUCCESS) { 326*11767SAnurag.Maskey@Sun.COM nwam_value_free(activationval); 327*11767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 328*11767SAnurag.Maskey@Sun.COM } 329*11767SAnurag.Maskey@Sun.COM 330*11767SAnurag.Maskey@Sun.COM actflag = nwam_loc_activation_to_flag(activation); 331*11767SAnurag.Maskey@Sun.COM nwam_value_free(activationval); 332*11767SAnurag.Maskey@Sun.COM if ((walkfilter = (flags & NWAM_WALK_FILTER_MASK)) == 0) 333*11767SAnurag.Maskey@Sun.COM walkfilter = NWAM_FLAG_ACTIVATION_MODE_ALL; 334*11767SAnurag.Maskey@Sun.COM if (actflag & walkfilter) 335*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 336*11767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 337*11767SAnurag.Maskey@Sun.COM } 338*11767SAnurag.Maskey@Sun.COM 339*11767SAnurag.Maskey@Sun.COM nwam_error_t 340*11767SAnurag.Maskey@Sun.COM nwam_walk_locs(int(*cb)(nwam_loc_handle_t, void *), void *data, uint64_t flags, 341*11767SAnurag.Maskey@Sun.COM int *retp) 342*11767SAnurag.Maskey@Sun.COM { 343*11767SAnurag.Maskey@Sun.COM nwam_error_t err = nwam_valid_flags(flags, 344*11767SAnurag.Maskey@Sun.COM NWAM_FLAG_ACTIVATION_MODE_ALL | NWAM_FLAG_BLOCKING); 345*11767SAnurag.Maskey@Sun.COM 346*11767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) 347*11767SAnurag.Maskey@Sun.COM return (err); 348*11767SAnurag.Maskey@Sun.COM 349*11767SAnurag.Maskey@Sun.COM return (nwam_walk(NWAM_OBJECT_TYPE_LOC, NWAM_LOC_CONF_FILE, 350*11767SAnurag.Maskey@Sun.COM cb, data, flags, retp, loc_selectcb)); 351*11767SAnurag.Maskey@Sun.COM } 352*11767SAnurag.Maskey@Sun.COM 353*11767SAnurag.Maskey@Sun.COM void 354*11767SAnurag.Maskey@Sun.COM nwam_loc_free(nwam_loc_handle_t loch) 355*11767SAnurag.Maskey@Sun.COM { 356*11767SAnurag.Maskey@Sun.COM nwam_free(loch); 357*11767SAnurag.Maskey@Sun.COM } 358*11767SAnurag.Maskey@Sun.COM 359*11767SAnurag.Maskey@Sun.COM nwam_error_t 360*11767SAnurag.Maskey@Sun.COM nwam_loc_delete_prop(nwam_loc_handle_t loch, const char *propname) 361*11767SAnurag.Maskey@Sun.COM { 362*11767SAnurag.Maskey@Sun.COM nwam_error_t err; 363*11767SAnurag.Maskey@Sun.COM boolean_t ro; 364*11767SAnurag.Maskey@Sun.COM void *olddata; 365*11767SAnurag.Maskey@Sun.COM 366*11767SAnurag.Maskey@Sun.COM assert(loch != NULL && propname != NULL); 367*11767SAnurag.Maskey@Sun.COM 368*11767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_prop_read_only(propname, &ro)) != NWAM_SUCCESS) 369*11767SAnurag.Maskey@Sun.COM return (err); 370*11767SAnurag.Maskey@Sun.COM if (ro) 371*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_READ_ONLY); 372*11767SAnurag.Maskey@Sun.COM 373*11767SAnurag.Maskey@Sun.COM /* 374*11767SAnurag.Maskey@Sun.COM * Duplicate data, remove property and validate. If validation 375*11767SAnurag.Maskey@Sun.COM * fails, revert to data duplicated prior to remove. 376*11767SAnurag.Maskey@Sun.COM */ 377*11767SAnurag.Maskey@Sun.COM if ((err = nwam_dup_object_list(loch->nwh_data, &olddata)) 378*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) 379*11767SAnurag.Maskey@Sun.COM return (err); 380*11767SAnurag.Maskey@Sun.COM if ((err = nwam_delete_prop(loch->nwh_data, propname)) 381*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) { 382*11767SAnurag.Maskey@Sun.COM nwam_free_object_list(loch->nwh_data); 383*11767SAnurag.Maskey@Sun.COM loch->nwh_data = olddata; 384*11767SAnurag.Maskey@Sun.COM return (err); 385*11767SAnurag.Maskey@Sun.COM } 386*11767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_validate(loch, NULL)) != NWAM_SUCCESS) { 387*11767SAnurag.Maskey@Sun.COM nwam_free_object_list(loch->nwh_data); 388*11767SAnurag.Maskey@Sun.COM loch->nwh_data = olddata; 389*11767SAnurag.Maskey@Sun.COM return (err); 390*11767SAnurag.Maskey@Sun.COM } 391*11767SAnurag.Maskey@Sun.COM nwam_free_object_list(olddata); 392*11767SAnurag.Maskey@Sun.COM 393*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 394*11767SAnurag.Maskey@Sun.COM } 395*11767SAnurag.Maskey@Sun.COM 396*11767SAnurag.Maskey@Sun.COM nwam_error_t 397*11767SAnurag.Maskey@Sun.COM nwam_loc_set_prop_value(nwam_loc_handle_t loch, const char *propname, 398*11767SAnurag.Maskey@Sun.COM nwam_value_t value) 399*11767SAnurag.Maskey@Sun.COM { 400*11767SAnurag.Maskey@Sun.COM nwam_error_t err; 401*11767SAnurag.Maskey@Sun.COM boolean_t ro; 402*11767SAnurag.Maskey@Sun.COM 403*11767SAnurag.Maskey@Sun.COM assert(loch != NULL && propname != NULL && value != NULL); 404*11767SAnurag.Maskey@Sun.COM 405*11767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_validate_prop(loch, propname, value)) 406*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS || 407*11767SAnurag.Maskey@Sun.COM (err = nwam_loc_prop_read_only(propname, &ro)) != NWAM_SUCCESS) 408*11767SAnurag.Maskey@Sun.COM return (err); 409*11767SAnurag.Maskey@Sun.COM if (ro) 410*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_READ_ONLY); 411*11767SAnurag.Maskey@Sun.COM 412*11767SAnurag.Maskey@Sun.COM return (nwam_set_prop_value(loch->nwh_data, propname, value)); 413*11767SAnurag.Maskey@Sun.COM } 414*11767SAnurag.Maskey@Sun.COM 415*11767SAnurag.Maskey@Sun.COM nwam_error_t 416*11767SAnurag.Maskey@Sun.COM nwam_loc_get_prop_value(nwam_loc_handle_t loch, const char *propname, 417*11767SAnurag.Maskey@Sun.COM nwam_value_t *valuep) 418*11767SAnurag.Maskey@Sun.COM { 419*11767SAnurag.Maskey@Sun.COM return (nwam_get_prop_value(loch->nwh_data, propname, valuep)); 420*11767SAnurag.Maskey@Sun.COM } 421*11767SAnurag.Maskey@Sun.COM 422*11767SAnurag.Maskey@Sun.COM nwam_error_t 423*11767SAnurag.Maskey@Sun.COM nwam_loc_walk_props(nwam_loc_handle_t loch, 424*11767SAnurag.Maskey@Sun.COM int (*cb)(const char *, nwam_value_t, void *), 425*11767SAnurag.Maskey@Sun.COM void *data, uint64_t flags, int *retp) 426*11767SAnurag.Maskey@Sun.COM { 427*11767SAnurag.Maskey@Sun.COM return (nwam_walk_props(loch, cb, data, flags, retp)); 428*11767SAnurag.Maskey@Sun.COM } 429*11767SAnurag.Maskey@Sun.COM 430*11767SAnurag.Maskey@Sun.COM nwam_error_t 431*11767SAnurag.Maskey@Sun.COM nwam_loc_commit(nwam_loc_handle_t loch, uint64_t flags) 432*11767SAnurag.Maskey@Sun.COM { 433*11767SAnurag.Maskey@Sun.COM nwam_error_t err; 434*11767SAnurag.Maskey@Sun.COM 435*11767SAnurag.Maskey@Sun.COM assert(loch != NULL && loch->nwh_data != NULL); 436*11767SAnurag.Maskey@Sun.COM 437*11767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_validate(loch, NULL)) != NWAM_SUCCESS) 438*11767SAnurag.Maskey@Sun.COM return (err); 439*11767SAnurag.Maskey@Sun.COM 440*11767SAnurag.Maskey@Sun.COM return (nwam_commit(NWAM_LOC_CONF_FILE, loch, flags)); 441*11767SAnurag.Maskey@Sun.COM } 442*11767SAnurag.Maskey@Sun.COM 443*11767SAnurag.Maskey@Sun.COM nwam_error_t 444*11767SAnurag.Maskey@Sun.COM nwam_loc_destroy(nwam_loc_handle_t loch, uint64_t flags) 445*11767SAnurag.Maskey@Sun.COM { 446*11767SAnurag.Maskey@Sun.COM nwam_error_t err; 447*11767SAnurag.Maskey@Sun.COM nwam_value_t actval; 448*11767SAnurag.Maskey@Sun.COM uint64_t activation; 449*11767SAnurag.Maskey@Sun.COM 450*11767SAnurag.Maskey@Sun.COM /* 451*11767SAnurag.Maskey@Sun.COM * Automatic and NoNet are not destroyable and Legacy is 452*11767SAnurag.Maskey@Sun.COM * destroyable by netadm only. These have system activation-mode. 453*11767SAnurag.Maskey@Sun.COM */ 454*11767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_ACTIVATION_MODE, 455*11767SAnurag.Maskey@Sun.COM &actval)) != NWAM_SUCCESS) 456*11767SAnurag.Maskey@Sun.COM return (err); 457*11767SAnurag.Maskey@Sun.COM err = nwam_value_get_uint64(actval, &activation); 458*11767SAnurag.Maskey@Sun.COM nwam_value_free(actval); 459*11767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) 460*11767SAnurag.Maskey@Sun.COM return (err); 461*11767SAnurag.Maskey@Sun.COM 462*11767SAnurag.Maskey@Sun.COM if (activation == NWAM_ACTIVATION_MODE_SYSTEM) { 463*11767SAnurag.Maskey@Sun.COM if (strcmp(loch->nwh_name, NWAM_LOC_NAME_LEGACY) == 0) { 464*11767SAnurag.Maskey@Sun.COM if (!nwam_uid_is_netadm()) 465*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_NOT_DESTROYABLE); 466*11767SAnurag.Maskey@Sun.COM } else { 467*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_NOT_DESTROYABLE); 468*11767SAnurag.Maskey@Sun.COM } 469*11767SAnurag.Maskey@Sun.COM } 470*11767SAnurag.Maskey@Sun.COM 471*11767SAnurag.Maskey@Sun.COM return (nwam_destroy(NWAM_LOC_CONF_FILE, loch, flags)); 472*11767SAnurag.Maskey@Sun.COM } 473*11767SAnurag.Maskey@Sun.COM 474*11767SAnurag.Maskey@Sun.COM nwam_error_t 475*11767SAnurag.Maskey@Sun.COM nwam_loc_get_prop_description(const char *propname, const char **descriptionp) 476*11767SAnurag.Maskey@Sun.COM { 477*11767SAnurag.Maskey@Sun.COM return (nwam_get_prop_description(loc_prop_table, propname, 478*11767SAnurag.Maskey@Sun.COM descriptionp)); 479*11767SAnurag.Maskey@Sun.COM } 480*11767SAnurag.Maskey@Sun.COM 481*11767SAnurag.Maskey@Sun.COM nwam_error_t 482*11767SAnurag.Maskey@Sun.COM nwam_loc_prop_read_only(const char *propname, boolean_t *readp) 483*11767SAnurag.Maskey@Sun.COM { 484*11767SAnurag.Maskey@Sun.COM return (nwam_prop_read_only(loc_prop_table, propname, readp)); 485*11767SAnurag.Maskey@Sun.COM } 486*11767SAnurag.Maskey@Sun.COM 487*11767SAnurag.Maskey@Sun.COM static nwam_error_t 488*11767SAnurag.Maskey@Sun.COM valid_loc_activation_mode(nwam_value_t value) 489*11767SAnurag.Maskey@Sun.COM { 490*11767SAnurag.Maskey@Sun.COM uint64_t activation_mode; 491*11767SAnurag.Maskey@Sun.COM 492*11767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64(value, &activation_mode) != NWAM_SUCCESS) 493*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 494*11767SAnurag.Maskey@Sun.COM 495*11767SAnurag.Maskey@Sun.COM switch (activation_mode) { 496*11767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_MANUAL: 497*11767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_SYSTEM: 498*11767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_CONDITIONAL_ANY: 499*11767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_CONDITIONAL_ALL: 500*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 501*11767SAnurag.Maskey@Sun.COM } 502*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 503*11767SAnurag.Maskey@Sun.COM } 504*11767SAnurag.Maskey@Sun.COM 505*11767SAnurag.Maskey@Sun.COM /* 506*11767SAnurag.Maskey@Sun.COM * Identical to nwam_valid_condition(), except locations cannot specify other 507*11767SAnurag.Maskey@Sun.COM * location's activation as a condition, e.g. loc2 cannot specify 508*11767SAnurag.Maskey@Sun.COM * "loc1 is active" since only one location is active at a time, and 509*11767SAnurag.Maskey@Sun.COM * as a consequence the condition is unsatisfiable. 510*11767SAnurag.Maskey@Sun.COM */ 511*11767SAnurag.Maskey@Sun.COM nwam_error_t 512*11767SAnurag.Maskey@Sun.COM valid_loc_condition(nwam_value_t value) 513*11767SAnurag.Maskey@Sun.COM { 514*11767SAnurag.Maskey@Sun.COM char **conditions; 515*11767SAnurag.Maskey@Sun.COM uint_t i, numvalues; 516*11767SAnurag.Maskey@Sun.COM nwam_condition_object_type_t object_type; 517*11767SAnurag.Maskey@Sun.COM nwam_condition_t condition; 518*11767SAnurag.Maskey@Sun.COM 519*11767SAnurag.Maskey@Sun.COM if (nwam_value_get_string_array(value, &conditions, &numvalues) 520*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) 521*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 522*11767SAnurag.Maskey@Sun.COM 523*11767SAnurag.Maskey@Sun.COM for (i = 0; i < numvalues; i++) { 524*11767SAnurag.Maskey@Sun.COM char *object_name = NULL; 525*11767SAnurag.Maskey@Sun.COM 526*11767SAnurag.Maskey@Sun.COM if (nwam_condition_string_to_condition(conditions[i], 527*11767SAnurag.Maskey@Sun.COM &object_type, &condition, &object_name) != NWAM_SUCCESS) 528*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 529*11767SAnurag.Maskey@Sun.COM if (object_type == NWAM_CONDITION_OBJECT_TYPE_LOC && 530*11767SAnurag.Maskey@Sun.COM condition == NWAM_CONDITION_IS) { 531*11767SAnurag.Maskey@Sun.COM free(object_name); 532*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 533*11767SAnurag.Maskey@Sun.COM } 534*11767SAnurag.Maskey@Sun.COM if (object_name != NULL) 535*11767SAnurag.Maskey@Sun.COM free(object_name); 536*11767SAnurag.Maskey@Sun.COM } 537*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 538*11767SAnurag.Maskey@Sun.COM } 539*11767SAnurag.Maskey@Sun.COM 540*11767SAnurag.Maskey@Sun.COM static nwam_error_t 541*11767SAnurag.Maskey@Sun.COM valid_nameservices(nwam_value_t value) 542*11767SAnurag.Maskey@Sun.COM { 543*11767SAnurag.Maskey@Sun.COM uint64_t *nameservices; 544*11767SAnurag.Maskey@Sun.COM uint_t i, numvalues; 545*11767SAnurag.Maskey@Sun.COM 546*11767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64_array(value, &nameservices, &numvalues) 547*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) 548*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 549*11767SAnurag.Maskey@Sun.COM 550*11767SAnurag.Maskey@Sun.COM for (i = 0; i < numvalues; i++) { 551*11767SAnurag.Maskey@Sun.COM if (nameservices[i] > NWAM_NAMESERVICES_LDAP) 552*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 553*11767SAnurag.Maskey@Sun.COM } 554*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 555*11767SAnurag.Maskey@Sun.COM } 556*11767SAnurag.Maskey@Sun.COM 557*11767SAnurag.Maskey@Sun.COM static nwam_error_t 558*11767SAnurag.Maskey@Sun.COM valid_configsrc(nwam_value_t value) 559*11767SAnurag.Maskey@Sun.COM { 560*11767SAnurag.Maskey@Sun.COM uint64_t *configsrcs; 561*11767SAnurag.Maskey@Sun.COM uint_t i, numvalues; 562*11767SAnurag.Maskey@Sun.COM 563*11767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64_array(value, &configsrcs, &numvalues) 564*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) 565*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 566*11767SAnurag.Maskey@Sun.COM 567*11767SAnurag.Maskey@Sun.COM for (i = 0; i < numvalues; i++) { 568*11767SAnurag.Maskey@Sun.COM if (configsrcs[i] > NWAM_CONFIGSRC_DHCP) 569*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 570*11767SAnurag.Maskey@Sun.COM } 571*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 572*11767SAnurag.Maskey@Sun.COM } 573*11767SAnurag.Maskey@Sun.COM 574*11767SAnurag.Maskey@Sun.COM /* 575*11767SAnurag.Maskey@Sun.COM * Validates that the activation-mode is system for Automatic and NoNet 576*11767SAnurag.Maskey@Sun.COM * locations, and not system for all other locations. 577*11767SAnurag.Maskey@Sun.COM */ 578*11767SAnurag.Maskey@Sun.COM static nwam_error_t 579*11767SAnurag.Maskey@Sun.COM nwam_loc_validate_activation_mode(nwam_loc_handle_t loch, nwam_value_t actval) 580*11767SAnurag.Maskey@Sun.COM { 581*11767SAnurag.Maskey@Sun.COM nwam_error_t err; 582*11767SAnurag.Maskey@Sun.COM uint64_t activation; 583*11767SAnurag.Maskey@Sun.COM 584*11767SAnurag.Maskey@Sun.COM if ((err = nwam_value_get_uint64(actval, &activation)) != NWAM_SUCCESS) 585*11767SAnurag.Maskey@Sun.COM return (err); 586*11767SAnurag.Maskey@Sun.COM 587*11767SAnurag.Maskey@Sun.COM if (NWAM_LOC_NAME_PRE_DEFINED(loch->nwh_name)) { 588*11767SAnurag.Maskey@Sun.COM if (activation != NWAM_ACTIVATION_MODE_SYSTEM) 589*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 590*11767SAnurag.Maskey@Sun.COM } else { 591*11767SAnurag.Maskey@Sun.COM if (activation == NWAM_ACTIVATION_MODE_SYSTEM) 592*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 593*11767SAnurag.Maskey@Sun.COM } 594*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 595*11767SAnurag.Maskey@Sun.COM } 596*11767SAnurag.Maskey@Sun.COM 597*11767SAnurag.Maskey@Sun.COM /* 598*11767SAnurag.Maskey@Sun.COM * Helper function to validate one nameservice, used by 599*11767SAnurag.Maskey@Sun.COM * nwam_loc_validate_all_nameservices(). 600*11767SAnurag.Maskey@Sun.COM * 601*11767SAnurag.Maskey@Sun.COM * requiredprop denotes the property that is mandatory when the 602*11767SAnurag.Maskey@Sun.COM * configsrcprop is manual. errpropp is used to return the invalid 603*11767SAnurag.Maskey@Sun.COM * property. 604*11767SAnurag.Maskey@Sun.COM */ 605*11767SAnurag.Maskey@Sun.COM static nwam_error_t 606*11767SAnurag.Maskey@Sun.COM nwam_loc_validate_one_nameservice(nwam_loc_handle_t loch, 607*11767SAnurag.Maskey@Sun.COM const char *configsrcprop, const char *requiredprop, const char **errpropp) 608*11767SAnurag.Maskey@Sun.COM { 609*11767SAnurag.Maskey@Sun.COM nwam_value_t configsrcval, requiredval; 610*11767SAnurag.Maskey@Sun.COM uint64_t *configsrcs; 611*11767SAnurag.Maskey@Sun.COM uint_t i, numvalues; 612*11767SAnurag.Maskey@Sun.COM 613*11767SAnurag.Maskey@Sun.COM if (nwam_loc_get_prop_value(loch, configsrcprop, &configsrcval) 614*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) { 615*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 616*11767SAnurag.Maskey@Sun.COM *errpropp = configsrcprop; 617*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MISSING_MEMBER); 618*11767SAnurag.Maskey@Sun.COM } 619*11767SAnurag.Maskey@Sun.COM 620*11767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64_array(configsrcval, &configsrcs, &numvalues) 621*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) { 622*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 623*11767SAnurag.Maskey@Sun.COM *errpropp = configsrcprop; 624*11767SAnurag.Maskey@Sun.COM nwam_value_free(configsrcval); 625*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_NO_VALUE); 626*11767SAnurag.Maskey@Sun.COM } 627*11767SAnurag.Maskey@Sun.COM 628*11767SAnurag.Maskey@Sun.COM /* If -configsrc is manual, requiredprop is required */ 629*11767SAnurag.Maskey@Sun.COM for (i = 0; i < numvalues; i++) { 630*11767SAnurag.Maskey@Sun.COM if (configsrcs[i] == NWAM_CONFIGSRC_MANUAL) { 631*11767SAnurag.Maskey@Sun.COM if (nwam_loc_get_prop_value(loch, requiredprop, 632*11767SAnurag.Maskey@Sun.COM &requiredval) != NWAM_SUCCESS) { 633*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 634*11767SAnurag.Maskey@Sun.COM *errpropp = requiredprop; 635*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MISSING_MEMBER); 636*11767SAnurag.Maskey@Sun.COM } 637*11767SAnurag.Maskey@Sun.COM nwam_value_free(requiredval); 638*11767SAnurag.Maskey@Sun.COM } 639*11767SAnurag.Maskey@Sun.COM } 640*11767SAnurag.Maskey@Sun.COM nwam_value_free(configsrcval); 641*11767SAnurag.Maskey@Sun.COM 642*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 643*11767SAnurag.Maskey@Sun.COM } 644*11767SAnurag.Maskey@Sun.COM 645*11767SAnurag.Maskey@Sun.COM /* 646*11767SAnurag.Maskey@Sun.COM * Helper function to validate LDAP nameservice, used by 647*11767SAnurag.Maskey@Sun.COM * nwam_loc_validate_all_nameservices(). Separated because LDAP must be 648*11767SAnurag.Maskey@Sun.COM * configured manually only and both default-domain and -servers are required. 649*11767SAnurag.Maskey@Sun.COM */ 650*11767SAnurag.Maskey@Sun.COM static nwam_error_t 651*11767SAnurag.Maskey@Sun.COM nwam_loc_validate_ldap_nameservice(nwam_loc_handle_t loch, 652*11767SAnurag.Maskey@Sun.COM const char **errpropp) 653*11767SAnurag.Maskey@Sun.COM { 654*11767SAnurag.Maskey@Sun.COM nwam_value_t val; 655*11767SAnurag.Maskey@Sun.COM uint64_t *configsrcs; 656*11767SAnurag.Maskey@Sun.COM uint_t i, numvalues; 657*11767SAnurag.Maskey@Sun.COM 658*11767SAnurag.Maskey@Sun.COM if (nwam_loc_get_prop_value(loch, 659*11767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC, &val) != NWAM_SUCCESS) { 660*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 661*11767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC; 662*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MISSING_MEMBER); 663*11767SAnurag.Maskey@Sun.COM } 664*11767SAnurag.Maskey@Sun.COM /* -configsrc is defined as an array */ 665*11767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64_array(val, &configsrcs, &numvalues) 666*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) { 667*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 668*11767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC; 669*11767SAnurag.Maskey@Sun.COM nwam_value_free(val); 670*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_NO_VALUE); 671*11767SAnurag.Maskey@Sun.COM } 672*11767SAnurag.Maskey@Sun.COM 673*11767SAnurag.Maskey@Sun.COM /* -configsrc must be manual */ 674*11767SAnurag.Maskey@Sun.COM for (i = 0; i < numvalues; i++) { 675*11767SAnurag.Maskey@Sun.COM if (configsrcs[i] != NWAM_CONFIGSRC_MANUAL) { 676*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 677*11767SAnurag.Maskey@Sun.COM *errpropp = 678*11767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC; 679*11767SAnurag.Maskey@Sun.COM nwam_value_free(val); 680*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 681*11767SAnurag.Maskey@Sun.COM } 682*11767SAnurag.Maskey@Sun.COM } 683*11767SAnurag.Maskey@Sun.COM nwam_value_free(val); 684*11767SAnurag.Maskey@Sun.COM 685*11767SAnurag.Maskey@Sun.COM /* both default-domain and -servers are required */ 686*11767SAnurag.Maskey@Sun.COM if (nwam_loc_get_prop_value(loch, 687*11767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_DEFAULT_DOMAIN, &val) != NWAM_SUCCESS) { 688*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 689*11767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_DEFAULT_DOMAIN; 690*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MISSING_MEMBER); 691*11767SAnurag.Maskey@Sun.COM } 692*11767SAnurag.Maskey@Sun.COM nwam_value_free(val); 693*11767SAnurag.Maskey@Sun.COM 694*11767SAnurag.Maskey@Sun.COM if (nwam_loc_get_prop_value(loch, 695*11767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_LDAP_NAMESERVICE_SERVERS, &val) != NWAM_SUCCESS) { 696*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 697*11767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_LDAP_NAMESERVICE_SERVERS; 698*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MISSING_MEMBER); 699*11767SAnurag.Maskey@Sun.COM } 700*11767SAnurag.Maskey@Sun.COM nwam_value_free(val); 701*11767SAnurag.Maskey@Sun.COM 702*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 703*11767SAnurag.Maskey@Sun.COM } 704*11767SAnurag.Maskey@Sun.COM 705*11767SAnurag.Maskey@Sun.COM /* 706*11767SAnurag.Maskey@Sun.COM * Validates the different nameservices properties. 707*11767SAnurag.Maskey@Sun.COM * 708*11767SAnurag.Maskey@Sun.COM * If "nameservices" property has more than one nameservice to configure, 709*11767SAnurag.Maskey@Sun.COM * "nameservices-config-file" must be specified. If only one nameservice 710*11767SAnurag.Maskey@Sun.COM * is configured and "nameservices-config-file" is missing, set the 711*11767SAnurag.Maskey@Sun.COM * property with the appropriately suffixed nsswitch file. 712*11767SAnurag.Maskey@Sun.COM * 713*11767SAnurag.Maskey@Sun.COM * For any nameservice being configured, the respective -configsrc property 714*11767SAnurag.Maskey@Sun.COM * must be specified. For DNS, -servers is required if -configsrc is 715*11767SAnurag.Maskey@Sun.COM * manual. For NIS and LDAP, default-domain is required if -configsrc is 716*11767SAnurag.Maskey@Sun.COM * manual. For LDAP, -configsrc must be manual and -servers is required. 717*11767SAnurag.Maskey@Sun.COM */ 718*11767SAnurag.Maskey@Sun.COM static nwam_error_t 719*11767SAnurag.Maskey@Sun.COM nwam_loc_validate_all_nameservices(nwam_loc_handle_t loch, 720*11767SAnurag.Maskey@Sun.COM nwam_value_t nameservicesval, const char **errpropp) 721*11767SAnurag.Maskey@Sun.COM { 722*11767SAnurag.Maskey@Sun.COM nwam_error_t err; 723*11767SAnurag.Maskey@Sun.COM nwam_value_t val; 724*11767SAnurag.Maskey@Sun.COM uint64_t *nameservices; 725*11767SAnurag.Maskey@Sun.COM uint_t i, numvalues; 726*11767SAnurag.Maskey@Sun.COM 727*11767SAnurag.Maskey@Sun.COM if ((err = nwam_value_get_uint64_array(nameservicesval, &nameservices, 728*11767SAnurag.Maskey@Sun.COM &numvalues)) != NWAM_SUCCESS) 729*11767SAnurag.Maskey@Sun.COM return (err); 730*11767SAnurag.Maskey@Sun.COM 731*11767SAnurag.Maskey@Sun.COM /* 732*11767SAnurag.Maskey@Sun.COM * nameservices-config-file is required if nameservices has more 733*11767SAnurag.Maskey@Sun.COM * than one value. 734*11767SAnurag.Maskey@Sun.COM */ 735*11767SAnurag.Maskey@Sun.COM if (numvalues > 1) { 736*11767SAnurag.Maskey@Sun.COM if (nwam_loc_get_prop_value(loch, 737*11767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE, &val) 738*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) { 739*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 740*11767SAnurag.Maskey@Sun.COM *errpropp = 741*11767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE; 742*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MISSING_MEMBER); 743*11767SAnurag.Maskey@Sun.COM } 744*11767SAnurag.Maskey@Sun.COM nwam_value_free(val); 745*11767SAnurag.Maskey@Sun.COM } else if (numvalues == 1) { 746*11767SAnurag.Maskey@Sun.COM /* 747*11767SAnurag.Maskey@Sun.COM * If only one nameservice is being configured and 748*11767SAnurag.Maskey@Sun.COM * nameservices-config-file doesn't exist, create it to 749*11767SAnurag.Maskey@Sun.COM * point to the respective nsswitch file. 750*11767SAnurag.Maskey@Sun.COM */ 751*11767SAnurag.Maskey@Sun.COM err = nwam_loc_get_prop_value(loch, 752*11767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE, &val); 753*11767SAnurag.Maskey@Sun.COM if (err == NWAM_INVALID_ARG || err == NWAM_ENTITY_NOT_FOUND) { 754*11767SAnurag.Maskey@Sun.COM char *nsswitch; 755*11767SAnurag.Maskey@Sun.COM const char *nsswitch_suffix; 756*11767SAnurag.Maskey@Sun.COM 757*11767SAnurag.Maskey@Sun.COM /* get the single nameservice being configured */ 758*11767SAnurag.Maskey@Sun.COM if ((err = nwam_uint64_get_value_string( 759*11767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_NAMESERVICES, nameservices[0], 760*11767SAnurag.Maskey@Sun.COM &nsswitch_suffix)) != NWAM_SUCCESS) 761*11767SAnurag.Maskey@Sun.COM goto config_file_fail; 762*11767SAnurag.Maskey@Sun.COM if ((nsswitch = malloc(MAXPATHLEN)) == NULL) { 763*11767SAnurag.Maskey@Sun.COM err = NWAM_NO_MEMORY; 764*11767SAnurag.Maskey@Sun.COM goto config_file_fail; 765*11767SAnurag.Maskey@Sun.COM } 766*11767SAnurag.Maskey@Sun.COM 767*11767SAnurag.Maskey@Sun.COM /* create appropriately suffixed nsswitch name */ 768*11767SAnurag.Maskey@Sun.COM (void) snprintf(nsswitch, MAXPATHLEN, "%s%s", 769*11767SAnurag.Maskey@Sun.COM NSSWITCH_PREFIX, nsswitch_suffix); 770*11767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_string(nsswitch, &val)) 771*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) { 772*11767SAnurag.Maskey@Sun.COM free(nsswitch); 773*11767SAnurag.Maskey@Sun.COM goto config_file_fail; 774*11767SAnurag.Maskey@Sun.COM } 775*11767SAnurag.Maskey@Sun.COM 776*11767SAnurag.Maskey@Sun.COM err = nwam_set_prop_value(loch->nwh_data, 777*11767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE, val); 778*11767SAnurag.Maskey@Sun.COM free(nsswitch); 779*11767SAnurag.Maskey@Sun.COM nwam_value_free(val); 780*11767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) { 781*11767SAnurag.Maskey@Sun.COM nwam_value_free(val); 782*11767SAnurag.Maskey@Sun.COM goto config_file_fail; 783*11767SAnurag.Maskey@Sun.COM } 784*11767SAnurag.Maskey@Sun.COM } else if (err != NWAM_SUCCESS) { 785*11767SAnurag.Maskey@Sun.COM goto config_file_fail; 786*11767SAnurag.Maskey@Sun.COM } else { 787*11767SAnurag.Maskey@Sun.COM nwam_value_free(val); 788*11767SAnurag.Maskey@Sun.COM } 789*11767SAnurag.Maskey@Sun.COM } 790*11767SAnurag.Maskey@Sun.COM 791*11767SAnurag.Maskey@Sun.COM /* 792*11767SAnurag.Maskey@Sun.COM * validate the -configsrc property and the required default-domain 793*11767SAnurag.Maskey@Sun.COM * and/or -servers property for each nameservice being configured. 794*11767SAnurag.Maskey@Sun.COM */ 795*11767SAnurag.Maskey@Sun.COM for (i = 0; i < numvalues; i++) { 796*11767SAnurag.Maskey@Sun.COM switch (nameservices[i]) { 797*11767SAnurag.Maskey@Sun.COM case NWAM_NAMESERVICES_DNS: 798*11767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_validate_one_nameservice(loch, 799*11767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC, 800*11767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_DNS_NAMESERVICE_SERVERS, errpropp)) 801*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) 802*11767SAnurag.Maskey@Sun.COM return (err); 803*11767SAnurag.Maskey@Sun.COM break; 804*11767SAnurag.Maskey@Sun.COM case NWAM_NAMESERVICES_NIS: 805*11767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_validate_one_nameservice(loch, 806*11767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_NIS_NAMESERVICE_CONFIGSRC, 807*11767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_DEFAULT_DOMAIN, errpropp)) 808*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) 809*11767SAnurag.Maskey@Sun.COM return (err); 810*11767SAnurag.Maskey@Sun.COM break; 811*11767SAnurag.Maskey@Sun.COM case NWAM_NAMESERVICES_LDAP: 812*11767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_validate_ldap_nameservice(loch, 813*11767SAnurag.Maskey@Sun.COM errpropp)) != NWAM_SUCCESS) 814*11767SAnurag.Maskey@Sun.COM return (err); 815*11767SAnurag.Maskey@Sun.COM break; 816*11767SAnurag.Maskey@Sun.COM case NWAM_NAMESERVICES_FILES: 817*11767SAnurag.Maskey@Sun.COM break; 818*11767SAnurag.Maskey@Sun.COM default: 819*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 820*11767SAnurag.Maskey@Sun.COM } 821*11767SAnurag.Maskey@Sun.COM } 822*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 823*11767SAnurag.Maskey@Sun.COM 824*11767SAnurag.Maskey@Sun.COM config_file_fail: 825*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 826*11767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE; 827*11767SAnurag.Maskey@Sun.COM return (err); 828*11767SAnurag.Maskey@Sun.COM } 829*11767SAnurag.Maskey@Sun.COM 830*11767SAnurag.Maskey@Sun.COM nwam_error_t 831*11767SAnurag.Maskey@Sun.COM nwam_loc_validate(nwam_loc_handle_t loch, const char **errpropp) 832*11767SAnurag.Maskey@Sun.COM { 833*11767SAnurag.Maskey@Sun.COM nwam_error_t err; 834*11767SAnurag.Maskey@Sun.COM nwam_value_t activationval, conditionval, nameservicesval; 835*11767SAnurag.Maskey@Sun.COM uint64_t activation; 836*11767SAnurag.Maskey@Sun.COM char **conditions, *name; 837*11767SAnurag.Maskey@Sun.COM uint_t i, numvalues; 838*11767SAnurag.Maskey@Sun.COM nwam_condition_object_type_t object_type; 839*11767SAnurag.Maskey@Sun.COM nwam_condition_t condition; 840*11767SAnurag.Maskey@Sun.COM 841*11767SAnurag.Maskey@Sun.COM assert(loch != NULL); 842*11767SAnurag.Maskey@Sun.COM 843*11767SAnurag.Maskey@Sun.COM /* 844*11767SAnurag.Maskey@Sun.COM * Make sure loc is internally consistent: if activation type is 845*11767SAnurag.Maskey@Sun.COM * conditional, the condition string must be specified. 846*11767SAnurag.Maskey@Sun.COM */ 847*11767SAnurag.Maskey@Sun.COM if (nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_ACTIVATION_MODE, 848*11767SAnurag.Maskey@Sun.COM &activationval) != NWAM_SUCCESS) { 849*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 850*11767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_ACTIVATION_MODE; 851*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MISSING_MEMBER); 852*11767SAnurag.Maskey@Sun.COM } 853*11767SAnurag.Maskey@Sun.COM 854*11767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64(activationval, &activation) 855*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) { 856*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 857*11767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_ACTIVATION_MODE; 858*11767SAnurag.Maskey@Sun.COM nwam_value_free(activationval); 859*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_NO_VALUE); 860*11767SAnurag.Maskey@Sun.COM } 861*11767SAnurag.Maskey@Sun.COM 862*11767SAnurag.Maskey@Sun.COM /* validate activation against the location first */ 863*11767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_validate_activation_mode(loch, activationval)) 864*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) { 865*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 866*11767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_ACTIVATION_MODE; 867*11767SAnurag.Maskey@Sun.COM nwam_value_free(activationval); 868*11767SAnurag.Maskey@Sun.COM return (err); 869*11767SAnurag.Maskey@Sun.COM } 870*11767SAnurag.Maskey@Sun.COM nwam_value_free(activationval); 871*11767SAnurag.Maskey@Sun.COM 872*11767SAnurag.Maskey@Sun.COM if (activation == NWAM_ACTIVATION_MODE_CONDITIONAL_ANY || 873*11767SAnurag.Maskey@Sun.COM activation == NWAM_ACTIVATION_MODE_CONDITIONAL_ALL) { 874*11767SAnurag.Maskey@Sun.COM if (nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_CONDITIONS, 875*11767SAnurag.Maskey@Sun.COM &conditionval) != NWAM_SUCCESS) { 876*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 877*11767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_CONDITIONS; 878*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MISSING_MEMBER); 879*11767SAnurag.Maskey@Sun.COM } 880*11767SAnurag.Maskey@Sun.COM /* 881*11767SAnurag.Maskey@Sun.COM * Are conditions self-referential? In other words, do any 882*11767SAnurag.Maskey@Sun.COM * of the activation conditions refer to this location? 883*11767SAnurag.Maskey@Sun.COM */ 884*11767SAnurag.Maskey@Sun.COM if (nwam_value_get_string_array(conditionval, &conditions, 885*11767SAnurag.Maskey@Sun.COM &numvalues) != NWAM_SUCCESS) { 886*11767SAnurag.Maskey@Sun.COM nwam_value_free(conditionval); 887*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 888*11767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_CONDITIONS; 889*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 890*11767SAnurag.Maskey@Sun.COM } 891*11767SAnurag.Maskey@Sun.COM if (nwam_loc_get_name(loch, &name) != NWAM_SUCCESS) { 892*11767SAnurag.Maskey@Sun.COM nwam_value_free(conditionval); 893*11767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 894*11767SAnurag.Maskey@Sun.COM } 895*11767SAnurag.Maskey@Sun.COM for (i = 0; i < numvalues; i++) { 896*11767SAnurag.Maskey@Sun.COM char *object_name = NULL; 897*11767SAnurag.Maskey@Sun.COM 898*11767SAnurag.Maskey@Sun.COM if (nwam_condition_string_to_condition(conditions[i], 899*11767SAnurag.Maskey@Sun.COM &object_type, &condition, &object_name) 900*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) { 901*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 902*11767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_CONDITIONS; 903*11767SAnurag.Maskey@Sun.COM free(name); 904*11767SAnurag.Maskey@Sun.COM nwam_value_free(conditionval); 905*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 906*11767SAnurag.Maskey@Sun.COM } 907*11767SAnurag.Maskey@Sun.COM if (object_name != NULL && 908*11767SAnurag.Maskey@Sun.COM object_type == NWAM_CONDITION_OBJECT_TYPE_LOC && 909*11767SAnurag.Maskey@Sun.COM strcmp(object_name, name) == 0) { 910*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 911*11767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_CONDITIONS; 912*11767SAnurag.Maskey@Sun.COM free(name); 913*11767SAnurag.Maskey@Sun.COM free(object_name); 914*11767SAnurag.Maskey@Sun.COM nwam_value_free(conditionval); 915*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 916*11767SAnurag.Maskey@Sun.COM } 917*11767SAnurag.Maskey@Sun.COM free(object_name); 918*11767SAnurag.Maskey@Sun.COM } 919*11767SAnurag.Maskey@Sun.COM free(name); 920*11767SAnurag.Maskey@Sun.COM nwam_value_free(conditionval); 921*11767SAnurag.Maskey@Sun.COM } 922*11767SAnurag.Maskey@Sun.COM 923*11767SAnurag.Maskey@Sun.COM /* validate namerservices */ 924*11767SAnurag.Maskey@Sun.COM if (nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_NAMESERVICES, 925*11767SAnurag.Maskey@Sun.COM &nameservicesval) != NWAM_SUCCESS) { 926*11767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 927*11767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_NAMESERVICES; 928*11767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MISSING_MEMBER); 929*11767SAnurag.Maskey@Sun.COM } 930*11767SAnurag.Maskey@Sun.COM err = nwam_loc_validate_all_nameservices(loch, nameservicesval, 931*11767SAnurag.Maskey@Sun.COM errpropp); 932*11767SAnurag.Maskey@Sun.COM nwam_value_free(nameservicesval); 933*11767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) 934*11767SAnurag.Maskey@Sun.COM return (err); 935*11767SAnurag.Maskey@Sun.COM 936*11767SAnurag.Maskey@Sun.COM return (nwam_validate(loc_prop_table, loch, errpropp)); 937*11767SAnurag.Maskey@Sun.COM } 938*11767SAnurag.Maskey@Sun.COM 939*11767SAnurag.Maskey@Sun.COM nwam_error_t 940*11767SAnurag.Maskey@Sun.COM nwam_loc_validate_prop(nwam_loc_handle_t loch, const char *propname, 941*11767SAnurag.Maskey@Sun.COM nwam_value_t value) 942*11767SAnurag.Maskey@Sun.COM { 943*11767SAnurag.Maskey@Sun.COM nwam_error_t err; 944*11767SAnurag.Maskey@Sun.COM 945*11767SAnurag.Maskey@Sun.COM assert(loch != NULL); 946*11767SAnurag.Maskey@Sun.COM 947*11767SAnurag.Maskey@Sun.COM if (strcmp(propname, NWAM_LOC_PROP_ACTIVATION_MODE) == 0) { 948*11767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_validate_activation_mode(loch, value)) 949*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) 950*11767SAnurag.Maskey@Sun.COM return (err); 951*11767SAnurag.Maskey@Sun.COM } 952*11767SAnurag.Maskey@Sun.COM 953*11767SAnurag.Maskey@Sun.COM return (nwam_validate_prop(loc_prop_table, loch, propname, value)); 954*11767SAnurag.Maskey@Sun.COM } 955*11767SAnurag.Maskey@Sun.COM 956*11767SAnurag.Maskey@Sun.COM nwam_error_t 957*11767SAnurag.Maskey@Sun.COM nwam_loc_copy(nwam_loc_handle_t oldloch, const char *newname, 958*11767SAnurag.Maskey@Sun.COM nwam_loc_handle_t *newlochp) 959*11767SAnurag.Maskey@Sun.COM { 960*11767SAnurag.Maskey@Sun.COM nwam_error_t err; 961*11767SAnurag.Maskey@Sun.COM nwam_value_t val; 962*11767SAnurag.Maskey@Sun.COM 963*11767SAnurag.Maskey@Sun.COM if ((err = nwam_copy(NWAM_LOC_CONF_FILE, oldloch, newname, newlochp)) 964*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) 965*11767SAnurag.Maskey@Sun.COM return (err); 966*11767SAnurag.Maskey@Sun.COM 967*11767SAnurag.Maskey@Sun.COM /* If the activation-mode is system, change it to manual */ 968*11767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_get_prop_value(*newlochp, 969*11767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_ACTIVATION_MODE, &val)) != NWAM_SUCCESS) 970*11767SAnurag.Maskey@Sun.COM goto finish; 971*11767SAnurag.Maskey@Sun.COM err = nwam_loc_validate_activation_mode(*newlochp, val); 972*11767SAnurag.Maskey@Sun.COM nwam_value_free(val); 973*11767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) { 974*11767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_uint64(NWAM_ACTIVATION_MODE_MANUAL, 975*11767SAnurag.Maskey@Sun.COM &val)) != NWAM_SUCCESS) 976*11767SAnurag.Maskey@Sun.COM goto finish; 977*11767SAnurag.Maskey@Sun.COM err = nwam_set_prop_value((*newlochp)->nwh_data, 978*11767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_ACTIVATION_MODE, val); 979*11767SAnurag.Maskey@Sun.COM nwam_value_free(val); 980*11767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) 981*11767SAnurag.Maskey@Sun.COM goto finish; 982*11767SAnurag.Maskey@Sun.COM 983*11767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_boolean(B_FALSE, &val)) 984*11767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) 985*11767SAnurag.Maskey@Sun.COM goto finish; 986*11767SAnurag.Maskey@Sun.COM err = nwam_set_prop_value((*newlochp)->nwh_data, 987*11767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_ENABLED, val); 988*11767SAnurag.Maskey@Sun.COM nwam_value_free(val); 989*11767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) 990*11767SAnurag.Maskey@Sun.COM goto finish; 991*11767SAnurag.Maskey@Sun.COM } 992*11767SAnurag.Maskey@Sun.COM 993*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 994*11767SAnurag.Maskey@Sun.COM 995*11767SAnurag.Maskey@Sun.COM finish: 996*11767SAnurag.Maskey@Sun.COM nwam_loc_free(*newlochp); 997*11767SAnurag.Maskey@Sun.COM *newlochp = NULL; 998*11767SAnurag.Maskey@Sun.COM return (err); 999*11767SAnurag.Maskey@Sun.COM } 1000*11767SAnurag.Maskey@Sun.COM 1001*11767SAnurag.Maskey@Sun.COM /* 1002*11767SAnurag.Maskey@Sun.COM * Given a property, return expected property data type 1003*11767SAnurag.Maskey@Sun.COM */ 1004*11767SAnurag.Maskey@Sun.COM nwam_error_t 1005*11767SAnurag.Maskey@Sun.COM nwam_loc_get_prop_type(const char *propname, nwam_value_type_t *typep) 1006*11767SAnurag.Maskey@Sun.COM { 1007*11767SAnurag.Maskey@Sun.COM return (nwam_get_prop_type(loc_prop_table, propname, typep)); 1008*11767SAnurag.Maskey@Sun.COM } 1009*11767SAnurag.Maskey@Sun.COM 1010*11767SAnurag.Maskey@Sun.COM nwam_error_t 1011*11767SAnurag.Maskey@Sun.COM nwam_loc_prop_multivalued(const char *propname, boolean_t *multip) 1012*11767SAnurag.Maskey@Sun.COM { 1013*11767SAnurag.Maskey@Sun.COM return (nwam_prop_multivalued(loc_prop_table, propname, multip)); 1014*11767SAnurag.Maskey@Sun.COM } 1015*11767SAnurag.Maskey@Sun.COM 1016*11767SAnurag.Maskey@Sun.COM /* 1017*11767SAnurag.Maskey@Sun.COM * Determine if the location has manual activation-mode or not. 1018*11767SAnurag.Maskey@Sun.COM */ 1019*11767SAnurag.Maskey@Sun.COM nwam_error_t 1020*11767SAnurag.Maskey@Sun.COM nwam_loc_is_manual(nwam_loc_handle_t loch, boolean_t *manualp) 1021*11767SAnurag.Maskey@Sun.COM { 1022*11767SAnurag.Maskey@Sun.COM nwam_error_t err; 1023*11767SAnurag.Maskey@Sun.COM nwam_value_t actval; 1024*11767SAnurag.Maskey@Sun.COM uint64_t activation; 1025*11767SAnurag.Maskey@Sun.COM 1026*11767SAnurag.Maskey@Sun.COM assert(loch != NULL); 1027*11767SAnurag.Maskey@Sun.COM 1028*11767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_ACTIVATION_MODE, 1029*11767SAnurag.Maskey@Sun.COM &actval)) != NWAM_SUCCESS) 1030*11767SAnurag.Maskey@Sun.COM return (err); 1031*11767SAnurag.Maskey@Sun.COM err = nwam_value_get_uint64(actval, &activation); 1032*11767SAnurag.Maskey@Sun.COM nwam_value_free(actval); 1033*11767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) 1034*11767SAnurag.Maskey@Sun.COM return (err); 1035*11767SAnurag.Maskey@Sun.COM 1036*11767SAnurag.Maskey@Sun.COM if (activation == NWAM_ACTIVATION_MODE_MANUAL) 1037*11767SAnurag.Maskey@Sun.COM *manualp = B_TRUE; 1038*11767SAnurag.Maskey@Sun.COM else 1039*11767SAnurag.Maskey@Sun.COM *manualp = B_FALSE; 1040*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 1041*11767SAnurag.Maskey@Sun.COM } 1042*11767SAnurag.Maskey@Sun.COM 1043*11767SAnurag.Maskey@Sun.COM /* Determine if location is enabled or not */ 1044*11767SAnurag.Maskey@Sun.COM static nwam_error_t 1045*11767SAnurag.Maskey@Sun.COM nwam_loc_is_enabled(nwam_loc_handle_t loch, boolean_t *enabledp) 1046*11767SAnurag.Maskey@Sun.COM { 1047*11767SAnurag.Maskey@Sun.COM nwam_error_t err; 1048*11767SAnurag.Maskey@Sun.COM nwam_value_t enabledval; 1049*11767SAnurag.Maskey@Sun.COM 1050*11767SAnurag.Maskey@Sun.COM assert(loch != NULL); 1051*11767SAnurag.Maskey@Sun.COM 1052*11767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_ENABLED, 1053*11767SAnurag.Maskey@Sun.COM &enabledval)) != NWAM_SUCCESS) 1054*11767SAnurag.Maskey@Sun.COM return (err); 1055*11767SAnurag.Maskey@Sun.COM err = nwam_value_get_boolean(enabledval, enabledp); 1056*11767SAnurag.Maskey@Sun.COM nwam_value_free(enabledval); 1057*11767SAnurag.Maskey@Sun.COM return (err); 1058*11767SAnurag.Maskey@Sun.COM } 1059*11767SAnurag.Maskey@Sun.COM 1060*11767SAnurag.Maskey@Sun.COM /* 1061*11767SAnurag.Maskey@Sun.COM * Callback to disable all locations other than one to enable, the handle 1062*11767SAnurag.Maskey@Sun.COM * of which we pass in as an argument. If the argument is NULL, we disable 1063*11767SAnurag.Maskey@Sun.COM * all locations. 1064*11767SAnurag.Maskey@Sun.COM */ 1065*11767SAnurag.Maskey@Sun.COM static int 1066*11767SAnurag.Maskey@Sun.COM loc_set_enabled(nwam_loc_handle_t loch, void *data) 1067*11767SAnurag.Maskey@Sun.COM { 1068*11767SAnurag.Maskey@Sun.COM nwam_value_t enabledval; 1069*11767SAnurag.Maskey@Sun.COM boolean_t enabled = B_FALSE; 1070*11767SAnurag.Maskey@Sun.COM nwam_loc_handle_t testloch = data; 1071*11767SAnurag.Maskey@Sun.COM nwam_error_t err = NWAM_SUCCESS; 1072*11767SAnurag.Maskey@Sun.COM 1073*11767SAnurag.Maskey@Sun.COM if (testloch != NULL) { 1074*11767SAnurag.Maskey@Sun.COM char *name, *testname; 1075*11767SAnurag.Maskey@Sun.COM 1076*11767SAnurag.Maskey@Sun.COM if (nwam_loc_get_name(loch, &name) == NWAM_SUCCESS && 1077*11767SAnurag.Maskey@Sun.COM nwam_loc_get_name(testloch, &testname) == NWAM_SUCCESS && 1078*11767SAnurag.Maskey@Sun.COM strcmp(name, testname) == 0) { 1079*11767SAnurag.Maskey@Sun.COM /* We enable this location. */ 1080*11767SAnurag.Maskey@Sun.COM enabled = B_TRUE; 1081*11767SAnurag.Maskey@Sun.COM } 1082*11767SAnurag.Maskey@Sun.COM } 1083*11767SAnurag.Maskey@Sun.COM if (nwam_value_create_boolean(enabled, &enabledval) != NWAM_SUCCESS) 1084*11767SAnurag.Maskey@Sun.COM return (0); 1085*11767SAnurag.Maskey@Sun.COM if (nwam_set_prop_value(loch->nwh_data, NWAM_LOC_PROP_ENABLED, 1086*11767SAnurag.Maskey@Sun.COM enabledval) == NWAM_SUCCESS) 1087*11767SAnurag.Maskey@Sun.COM err = nwam_loc_commit(loch, NWAM_FLAG_ENTITY_ENABLE); 1088*11767SAnurag.Maskey@Sun.COM 1089*11767SAnurag.Maskey@Sun.COM nwam_value_free(enabledval); 1090*11767SAnurag.Maskey@Sun.COM return (err); 1091*11767SAnurag.Maskey@Sun.COM } 1092*11767SAnurag.Maskey@Sun.COM 1093*11767SAnurag.Maskey@Sun.COM /* 1094*11767SAnurag.Maskey@Sun.COM * Update the enabled property for this location (and for all others 1095*11767SAnurag.Maskey@Sun.COM * if necessary. 1096*11767SAnurag.Maskey@Sun.COM */ 1097*11767SAnurag.Maskey@Sun.COM static int 1098*11767SAnurag.Maskey@Sun.COM nwam_loc_update_enabled(nwam_loc_handle_t loch, boolean_t enabled) 1099*11767SAnurag.Maskey@Sun.COM { 1100*11767SAnurag.Maskey@Sun.COM nwam_error_t err; 1101*11767SAnurag.Maskey@Sun.COM int cb_ret; 1102*11767SAnurag.Maskey@Sun.COM 1103*11767SAnurag.Maskey@Sun.COM if (enabled) { 1104*11767SAnurag.Maskey@Sun.COM /* 1105*11767SAnurag.Maskey@Sun.COM * Disable all other locations that are manually enabled 1106*11767SAnurag.Maskey@Sun.COM * and enable this one - a maximum of 1 location can be 1107*11767SAnurag.Maskey@Sun.COM * enabled at once. 1108*11767SAnurag.Maskey@Sun.COM */ 1109*11767SAnurag.Maskey@Sun.COM err = nwam_walk_locs(loc_set_enabled, loch, 0, &cb_ret); 1110*11767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS && err != NWAM_WALK_HALTED) 1111*11767SAnurag.Maskey@Sun.COM cb_ret = err; 1112*11767SAnurag.Maskey@Sun.COM } else { 1113*11767SAnurag.Maskey@Sun.COM cb_ret = loc_set_enabled(loch, NULL); 1114*11767SAnurag.Maskey@Sun.COM } 1115*11767SAnurag.Maskey@Sun.COM return (cb_ret); 1116*11767SAnurag.Maskey@Sun.COM } 1117*11767SAnurag.Maskey@Sun.COM 1118*11767SAnurag.Maskey@Sun.COM nwam_error_t 1119*11767SAnurag.Maskey@Sun.COM nwam_loc_enable(nwam_loc_handle_t loch) 1120*11767SAnurag.Maskey@Sun.COM { 1121*11767SAnurag.Maskey@Sun.COM nwam_error_t err; 1122*11767SAnurag.Maskey@Sun.COM boolean_t enabled; 1123*11767SAnurag.Maskey@Sun.COM 1124*11767SAnurag.Maskey@Sun.COM assert(loch != NULL); 1125*11767SAnurag.Maskey@Sun.COM 1126*11767SAnurag.Maskey@Sun.COM /* Make sure location is not enabled */ 1127*11767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_is_enabled(loch, &enabled)) != NWAM_SUCCESS) 1128*11767SAnurag.Maskey@Sun.COM return (err); 1129*11767SAnurag.Maskey@Sun.COM if (enabled) 1130*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 1131*11767SAnurag.Maskey@Sun.COM 1132*11767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_update_enabled(loch, B_TRUE)) != NWAM_SUCCESS) 1133*11767SAnurag.Maskey@Sun.COM return (err); 1134*11767SAnurag.Maskey@Sun.COM 1135*11767SAnurag.Maskey@Sun.COM err = nwam_enable(NULL, loch); 1136*11767SAnurag.Maskey@Sun.COM 1137*11767SAnurag.Maskey@Sun.COM /* nwamd may not be running, that's okay. */ 1138*11767SAnurag.Maskey@Sun.COM if (err == NWAM_ERROR_BIND) 1139*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 1140*11767SAnurag.Maskey@Sun.COM else 1141*11767SAnurag.Maskey@Sun.COM return (err); 1142*11767SAnurag.Maskey@Sun.COM } 1143*11767SAnurag.Maskey@Sun.COM 1144*11767SAnurag.Maskey@Sun.COM nwam_error_t 1145*11767SAnurag.Maskey@Sun.COM nwam_loc_disable(nwam_loc_handle_t loch) 1146*11767SAnurag.Maskey@Sun.COM { 1147*11767SAnurag.Maskey@Sun.COM nwam_error_t err; 1148*11767SAnurag.Maskey@Sun.COM boolean_t enabled; 1149*11767SAnurag.Maskey@Sun.COM 1150*11767SAnurag.Maskey@Sun.COM assert(loch != NULL); 1151*11767SAnurag.Maskey@Sun.COM 1152*11767SAnurag.Maskey@Sun.COM /* Make sure location is enabled */ 1153*11767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_is_enabled(loch, &enabled)) != NWAM_SUCCESS) 1154*11767SAnurag.Maskey@Sun.COM return (err); 1155*11767SAnurag.Maskey@Sun.COM if (!enabled) 1156*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 1157*11767SAnurag.Maskey@Sun.COM 1158*11767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_update_enabled(loch, B_FALSE)) != NWAM_SUCCESS) 1159*11767SAnurag.Maskey@Sun.COM return (err); 1160*11767SAnurag.Maskey@Sun.COM 1161*11767SAnurag.Maskey@Sun.COM err = nwam_disable(NULL, loch); 1162*11767SAnurag.Maskey@Sun.COM 1163*11767SAnurag.Maskey@Sun.COM /* nwamd may not be running, that's okay. */ 1164*11767SAnurag.Maskey@Sun.COM if (err == NWAM_ERROR_BIND) 1165*11767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 1166*11767SAnurag.Maskey@Sun.COM else 1167*11767SAnurag.Maskey@Sun.COM return (err); 1168*11767SAnurag.Maskey@Sun.COM } 1169*11767SAnurag.Maskey@Sun.COM 1170*11767SAnurag.Maskey@Sun.COM nwam_error_t 1171*11767SAnurag.Maskey@Sun.COM nwam_loc_get_default_proplist(const char ***prop_list, uint_t *numvaluesp) 1172*11767SAnurag.Maskey@Sun.COM { 1173*11767SAnurag.Maskey@Sun.COM return (nwam_get_default_proplist(loc_prop_table, 1174*11767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY, prop_list, numvaluesp)); 1175*11767SAnurag.Maskey@Sun.COM } 1176*11767SAnurag.Maskey@Sun.COM 1177*11767SAnurag.Maskey@Sun.COM nwam_error_t 1178*11767SAnurag.Maskey@Sun.COM nwam_loc_get_state(nwam_loc_handle_t loch, nwam_state_t *statep, 1179*11767SAnurag.Maskey@Sun.COM nwam_aux_state_t *auxp) 1180*11767SAnurag.Maskey@Sun.COM { 1181*11767SAnurag.Maskey@Sun.COM return (nwam_get_state(NULL, loch, statep, auxp)); 1182*11767SAnurag.Maskey@Sun.COM } 1183