111767SAnurag.Maskey@Sun.COM /* 211767SAnurag.Maskey@Sun.COM * CDDL HEADER START 311767SAnurag.Maskey@Sun.COM * 411767SAnurag.Maskey@Sun.COM * The contents of this file are subject to the terms of the 511767SAnurag.Maskey@Sun.COM * Common Development and Distribution License (the "License"). 611767SAnurag.Maskey@Sun.COM * You may not use this file except in compliance with the License. 711767SAnurag.Maskey@Sun.COM * 811767SAnurag.Maskey@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 911767SAnurag.Maskey@Sun.COM * or http://www.opensolaris.org/os/licensing. 1011767SAnurag.Maskey@Sun.COM * See the License for the specific language governing permissions 1111767SAnurag.Maskey@Sun.COM * and limitations under the License. 1211767SAnurag.Maskey@Sun.COM * 1311767SAnurag.Maskey@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 1411767SAnurag.Maskey@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1511767SAnurag.Maskey@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 1611767SAnurag.Maskey@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 1711767SAnurag.Maskey@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 1811767SAnurag.Maskey@Sun.COM * 1911767SAnurag.Maskey@Sun.COM * CDDL HEADER END 2011767SAnurag.Maskey@Sun.COM */ 2111767SAnurag.Maskey@Sun.COM 2211767SAnurag.Maskey@Sun.COM /* 2311767SAnurag.Maskey@Sun.COM * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 2411767SAnurag.Maskey@Sun.COM * Use is subject to license terms. 2511767SAnurag.Maskey@Sun.COM */ 2611767SAnurag.Maskey@Sun.COM 2711767SAnurag.Maskey@Sun.COM #include <assert.h> 2811767SAnurag.Maskey@Sun.COM #include <ctype.h> 2911767SAnurag.Maskey@Sun.COM #include <sys/param.h> 3011767SAnurag.Maskey@Sun.COM #include <sys/types.h> 3111767SAnurag.Maskey@Sun.COM #include <sys/stat.h> 3211767SAnurag.Maskey@Sun.COM #include <stdio.h> 3311767SAnurag.Maskey@Sun.COM #include <stdlib.h> 3411767SAnurag.Maskey@Sun.COM #include <strings.h> 3511767SAnurag.Maskey@Sun.COM #include <unistd.h> 3611767SAnurag.Maskey@Sun.COM #include <libscf.h> 3711767SAnurag.Maskey@Sun.COM 3811767SAnurag.Maskey@Sun.COM #include "libnwam_impl.h" 3911767SAnurag.Maskey@Sun.COM #include <libnwam_priv.h> 4011767SAnurag.Maskey@Sun.COM #include <libnwam.h> 4111767SAnurag.Maskey@Sun.COM 4211767SAnurag.Maskey@Sun.COM /* 4311767SAnurag.Maskey@Sun.COM * Functions to support creating, modifying, destroying, querying the 4411767SAnurag.Maskey@Sun.COM * state of and changing the state of location objects. Locations 4511767SAnurag.Maskey@Sun.COM * represent the configuration to be applied once basic network configuration 4611767SAnurag.Maskey@Sun.COM * has been established - name services, IPsec config, etc, and can be enabled 4711767SAnurag.Maskey@Sun.COM * either manually or conditionally for a combination of the set of 4811767SAnurag.Maskey@Sun.COM * available conditions (an IP address is present, an ENM is active etc). 4911767SAnurag.Maskey@Sun.COM */ 5011767SAnurag.Maskey@Sun.COM 5111767SAnurag.Maskey@Sun.COM #define NSSWITCH_PREFIX "/etc/nsswitch." 5211767SAnurag.Maskey@Sun.COM 5311767SAnurag.Maskey@Sun.COM typedef nwam_error_t (*nwam_loc_prop_validate_func_t)(nwam_value_t); 5411767SAnurag.Maskey@Sun.COM 5511767SAnurag.Maskey@Sun.COM static nwam_error_t valid_loc_activation_mode(nwam_value_t); 5611767SAnurag.Maskey@Sun.COM static nwam_error_t valid_loc_condition(nwam_value_t); 5711767SAnurag.Maskey@Sun.COM static nwam_error_t valid_nameservices(nwam_value_t); 5811767SAnurag.Maskey@Sun.COM static nwam_error_t valid_configsrc(nwam_value_t); 5911767SAnurag.Maskey@Sun.COM 6011767SAnurag.Maskey@Sun.COM struct nwam_prop_table_entry loc_prop_table_entries[] = { 6111767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_ACTIVATION_MODE, NWAM_VALUE_TYPE_UINT64, B_FALSE, 1, 1, 6211767SAnurag.Maskey@Sun.COM valid_loc_activation_mode, 6311767SAnurag.Maskey@Sun.COM "specifies the location activation mode - valid values are:\n" 6411767SAnurag.Maskey@Sun.COM "\'manual\', \'conditional-any\' and \'conditional-all\'", 6511767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 6611767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_CONDITIONS, NWAM_VALUE_TYPE_STRING, B_FALSE, 0, 6711767SAnurag.Maskey@Sun.COM NWAM_MAX_NUM_VALUES, valid_loc_condition, 6811767SAnurag.Maskey@Sun.COM "specifies the activation condition. Conditions are of the form:\n" 6911767SAnurag.Maskey@Sun.COM "ncp|ncu|enm name is|is-not active\n" 7011767SAnurag.Maskey@Sun.COM "ip-address is|is-not|is-in-range|is-not-in-range| 1.2.3.4[/24]\n" 7111767SAnurag.Maskey@Sun.COM "advertised-domain is|is-not|contains|does-not-contain string\n" 7211767SAnurag.Maskey@Sun.COM "system-domain is|is-not|contains|does-not-contain string\n" 7311767SAnurag.Maskey@Sun.COM "essid is|is-not|contains|does-not-contain string\n" 7411767SAnurag.Maskey@Sun.COM "bssid is|is-not string", 7511767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 7611767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_ENABLED, NWAM_VALUE_TYPE_BOOLEAN, B_TRUE, 1, 1, 7711767SAnurag.Maskey@Sun.COM nwam_valid_boolean, 7811767SAnurag.Maskey@Sun.COM "specifies if location is to be enabled", 7911767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 8011767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_NAMESERVICES, NWAM_VALUE_TYPE_UINT64, B_FALSE, 1, 8111767SAnurag.Maskey@Sun.COM NWAM_MAX_NUM_VALUES, valid_nameservices, 8211767SAnurag.Maskey@Sun.COM "specifies name service(s) to be used - valid values are:\n" 8311767SAnurag.Maskey@Sun.COM "\'files\', \'dns\', \'nis\', and \'ldap\'", 8411767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 8511767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE, NWAM_VALUE_TYPE_STRING, 8611767SAnurag.Maskey@Sun.COM B_FALSE, 0, 1, nwam_valid_file, 8711767SAnurag.Maskey@Sun.COM "specifies path to configuration file for name services switch " 8811767SAnurag.Maskey@Sun.COM "for this location - see nsswitch.conf(4)", 8911767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 9011767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC, NWAM_VALUE_TYPE_UINT64, 9111767SAnurag.Maskey@Sun.COM B_FALSE, 0, NWAM_MAX_NUM_VALUES, valid_configsrc, 9211767SAnurag.Maskey@Sun.COM "specifies sources of DNS configuration parameters - valid values " 9311767SAnurag.Maskey@Sun.COM "are:\n\'dhcp\', or \'manual\'", 9411767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 9511767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_DNS_NAMESERVICE_DOMAIN, NWAM_VALUE_TYPE_STRING, B_FALSE, 9611767SAnurag.Maskey@Sun.COM 0, 1, nwam_valid_domain, 9711767SAnurag.Maskey@Sun.COM "specifies DNS domain name to be set for this location", 9811767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 9911767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_DNS_NAMESERVICE_SERVERS, NWAM_VALUE_TYPE_STRING, B_FALSE, 10011767SAnurag.Maskey@Sun.COM 0, NWAM_MAX_NUM_VALUES, nwam_valid_host_any, 10111767SAnurag.Maskey@Sun.COM "specifies DNS server host address(es)", 10211767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 10311767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_DNS_NAMESERVICE_SEARCH, NWAM_VALUE_TYPE_STRING, B_FALSE, 10411767SAnurag.Maskey@Sun.COM 0, NWAM_MAX_NUM_VALUES, nwam_valid_domain, 10511767SAnurag.Maskey@Sun.COM "specifies DNS search list for host name lookup", 10611767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 10711767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_NIS_NAMESERVICE_CONFIGSRC, NWAM_VALUE_TYPE_UINT64, 10811767SAnurag.Maskey@Sun.COM B_FALSE, 0, NWAM_MAX_NUM_VALUES, valid_configsrc, 10911767SAnurag.Maskey@Sun.COM "specifies sources of NIS configuration parameters - valid values " 11011767SAnurag.Maskey@Sun.COM "are:\n\'dhcp\', or \'manual\'", 11111767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 11211767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_NIS_NAMESERVICE_SERVERS, NWAM_VALUE_TYPE_STRING, B_FALSE, 11311767SAnurag.Maskey@Sun.COM 0, NWAM_MAX_NUM_VALUES, nwam_valid_host_any, 11411767SAnurag.Maskey@Sun.COM "specifies NIS server host address(es)", 11511767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 11611767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC, NWAM_VALUE_TYPE_UINT64, 11711767SAnurag.Maskey@Sun.COM B_FALSE, 0, NWAM_MAX_NUM_VALUES, valid_configsrc, 11811767SAnurag.Maskey@Sun.COM "specifies sources of NIS configuration parameters - currently, " 11911767SAnurag.Maskey@Sun.COM "the only valid value is \'manual\'", 12011767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 12111767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_LDAP_NAMESERVICE_SERVERS, NWAM_VALUE_TYPE_STRING, 12211767SAnurag.Maskey@Sun.COM B_FALSE, 0, NWAM_MAX_NUM_VALUES, nwam_valid_host_or_domain, 12311767SAnurag.Maskey@Sun.COM "specifies LDAP server host address(es)", 12411767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 12511767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_DEFAULT_DOMAIN, NWAM_VALUE_TYPE_STRING, B_FALSE, 0, 1, 12611767SAnurag.Maskey@Sun.COM nwam_valid_domain, 12711767SAnurag.Maskey@Sun.COM "specifies the domainname(1M) to be set for this location", 12811767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 12911767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_NFSV4_DOMAIN, NWAM_VALUE_TYPE_STRING, B_FALSE, 0, 1, 13011767SAnurag.Maskey@Sun.COM nwam_valid_domain, 13111767SAnurag.Maskey@Sun.COM "specifies an NFSv4 domain for this location", 13211767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 13311767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_IPFILTER_CONFIG_FILE, NWAM_VALUE_TYPE_STRING, B_FALSE, 13411767SAnurag.Maskey@Sun.COM 0, 1, nwam_valid_file, 13511767SAnurag.Maskey@Sun.COM "specifies an absolute path to an ipf.conf(4) file for this " 13611767SAnurag.Maskey@Sun.COM "location", 13711767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 13811767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_IPFILTER_V6_CONFIG_FILE, NWAM_VALUE_TYPE_STRING, 13911767SAnurag.Maskey@Sun.COM B_FALSE, 0, 1, nwam_valid_file, 14011767SAnurag.Maskey@Sun.COM "specifies an absolute path to an ipf6.conf file for this " 14111767SAnurag.Maskey@Sun.COM "location", 14211767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 14311767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_IPNAT_CONFIG_FILE, NWAM_VALUE_TYPE_STRING, B_FALSE, 0, 14411767SAnurag.Maskey@Sun.COM 1, nwam_valid_file, 14511767SAnurag.Maskey@Sun.COM "specifies an absolute path to an ipnat.conf(4) file for this " 14611767SAnurag.Maskey@Sun.COM "location", 14711767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 14811767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_IPPOOL_CONFIG_FILE, NWAM_VALUE_TYPE_STRING, B_FALSE, 0, 14911767SAnurag.Maskey@Sun.COM 1, nwam_valid_file, 15011767SAnurag.Maskey@Sun.COM "specifies an absolute path to an ippool.conf(4) file for this " 15111767SAnurag.Maskey@Sun.COM "location", 15211767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 15311767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_IKE_CONFIG_FILE, NWAM_VALUE_TYPE_STRING, B_FALSE, 0, 1, 15411767SAnurag.Maskey@Sun.COM nwam_valid_file, 15511767SAnurag.Maskey@Sun.COM "specifies an absolute path to an ike config file " 15611767SAnurag.Maskey@Sun.COM "(see ike.config(4))", 15711767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 15811767SAnurag.Maskey@Sun.COM {NWAM_LOC_PROP_IPSECPOLICY_CONFIG_FILE, NWAM_VALUE_TYPE_STRING, 15911767SAnurag.Maskey@Sun.COM B_FALSE, 0, 1, nwam_valid_file, 16011767SAnurag.Maskey@Sun.COM "specifies an absolute path to an IPsec policy configuration file " 16111767SAnurag.Maskey@Sun.COM "(see ipsecconf(1M)", 16211767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY}, 16311767SAnurag.Maskey@Sun.COM }; 16411767SAnurag.Maskey@Sun.COM 16511767SAnurag.Maskey@Sun.COM #define NWAM_NUM_LOC_PROPS (sizeof (loc_prop_table_entries) / \ 16611767SAnurag.Maskey@Sun.COM sizeof (*loc_prop_table_entries)) 16711767SAnurag.Maskey@Sun.COM 16811767SAnurag.Maskey@Sun.COM struct nwam_prop_table loc_prop_table = 16911767SAnurag.Maskey@Sun.COM { NWAM_NUM_LOC_PROPS, loc_prop_table_entries }; 17011767SAnurag.Maskey@Sun.COM 17111767SAnurag.Maskey@Sun.COM static uint64_t 17211767SAnurag.Maskey@Sun.COM nwam_loc_activation_to_flag(nwam_activation_mode_t activation) 17311767SAnurag.Maskey@Sun.COM { 17411767SAnurag.Maskey@Sun.COM switch (activation) { 17511767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_MANUAL: 17611767SAnurag.Maskey@Sun.COM return (NWAM_FLAG_ACTIVATION_MODE_MANUAL); 17711767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_SYSTEM: 17811767SAnurag.Maskey@Sun.COM return (NWAM_FLAG_ACTIVATION_MODE_SYSTEM); 17911767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_CONDITIONAL_ANY: 18011767SAnurag.Maskey@Sun.COM return (NWAM_FLAG_ACTIVATION_MODE_CONDITIONAL_ANY); 18111767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_CONDITIONAL_ALL: 18211767SAnurag.Maskey@Sun.COM return (NWAM_FLAG_ACTIVATION_MODE_CONDITIONAL_ALL); 18311767SAnurag.Maskey@Sun.COM default: 18411767SAnurag.Maskey@Sun.COM return (0); 18511767SAnurag.Maskey@Sun.COM } 18611767SAnurag.Maskey@Sun.COM } 18711767SAnurag.Maskey@Sun.COM 18811767SAnurag.Maskey@Sun.COM nwam_error_t 18911767SAnurag.Maskey@Sun.COM nwam_loc_read(const char *name, uint64_t flags, nwam_loc_handle_t *lochp) 19011767SAnurag.Maskey@Sun.COM { 19111767SAnurag.Maskey@Sun.COM return (nwam_read(NWAM_OBJECT_TYPE_LOC, NWAM_LOC_CONF_FILE, name, 19211767SAnurag.Maskey@Sun.COM flags, lochp)); 19311767SAnurag.Maskey@Sun.COM } 19411767SAnurag.Maskey@Sun.COM 19511767SAnurag.Maskey@Sun.COM nwam_error_t 19611767SAnurag.Maskey@Sun.COM nwam_loc_create(const char *name, nwam_loc_handle_t *lochp) 19711767SAnurag.Maskey@Sun.COM { 19811767SAnurag.Maskey@Sun.COM nwam_error_t err; 19911767SAnurag.Maskey@Sun.COM nwam_value_t val = NULL; 20011767SAnurag.Maskey@Sun.COM char *nsswitch = NULL; 20111767SAnurag.Maskey@Sun.COM 20211767SAnurag.Maskey@Sun.COM assert(lochp != NULL && name != NULL); 20311767SAnurag.Maskey@Sun.COM 20411767SAnurag.Maskey@Sun.COM if ((err = nwam_create(NWAM_OBJECT_TYPE_LOC, NWAM_LOC_CONF_FILE, name, 20511767SAnurag.Maskey@Sun.COM lochp)) != NWAM_SUCCESS) 20611767SAnurag.Maskey@Sun.COM return (err); 20711767SAnurag.Maskey@Sun.COM 20811767SAnurag.Maskey@Sun.COM /* Create new object list for loc */ 20911767SAnurag.Maskey@Sun.COM if ((err = nwam_alloc_object_list(&((*lochp)->nwh_data))) 21011767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) 21111767SAnurag.Maskey@Sun.COM goto finish; 21211767SAnurag.Maskey@Sun.COM 21311767SAnurag.Maskey@Sun.COM /* NWAM_LOC_PROP_ACTIVATION_MODE is mandatory */ 21411767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_uint64(NWAM_ACTIVATION_MODE_MANUAL, &val)) 21511767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) { 21611767SAnurag.Maskey@Sun.COM goto finish; 21711767SAnurag.Maskey@Sun.COM } 21811767SAnurag.Maskey@Sun.COM if ((err = nwam_set_prop_value((*lochp)->nwh_data, 21911767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_ACTIVATION_MODE, val)) != NWAM_SUCCESS) { 22011767SAnurag.Maskey@Sun.COM goto finish; 22111767SAnurag.Maskey@Sun.COM } 22211767SAnurag.Maskey@Sun.COM nwam_value_free(val); 22311767SAnurag.Maskey@Sun.COM val = NULL; 22411767SAnurag.Maskey@Sun.COM 22511767SAnurag.Maskey@Sun.COM /* 22611767SAnurag.Maskey@Sun.COM * NWAM_LOC_PROP_ENABLED defaults to false. 22711767SAnurag.Maskey@Sun.COM */ 22811767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_boolean(B_FALSE, &val)) != NWAM_SUCCESS) 22911767SAnurag.Maskey@Sun.COM goto finish; 23011767SAnurag.Maskey@Sun.COM if ((err = nwam_set_prop_value((*lochp)->nwh_data, 23111767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_ENABLED, val)) != NWAM_SUCCESS) 23211767SAnurag.Maskey@Sun.COM goto finish; 23311767SAnurag.Maskey@Sun.COM nwam_value_free(val); 23411767SAnurag.Maskey@Sun.COM val = NULL; 23511767SAnurag.Maskey@Sun.COM 23611767SAnurag.Maskey@Sun.COM /* 23711767SAnurag.Maskey@Sun.COM * Initialize name service properties: use DNS, configured 23811767SAnurag.Maskey@Sun.COM * via DHCP, with default nsswitch (/etc/nsswitch.dns). 23911767SAnurag.Maskey@Sun.COM */ 24011767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_uint64(NWAM_NAMESERVICES_DNS, &val)) != 24111767SAnurag.Maskey@Sun.COM NWAM_SUCCESS) 24211767SAnurag.Maskey@Sun.COM goto finish; 24311767SAnurag.Maskey@Sun.COM if ((err = nwam_set_prop_value((*lochp)->nwh_data, 24411767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_NAMESERVICES, val)) != NWAM_SUCCESS) 24511767SAnurag.Maskey@Sun.COM goto finish; 24611767SAnurag.Maskey@Sun.COM nwam_value_free(val); 24711767SAnurag.Maskey@Sun.COM val = NULL; 24811767SAnurag.Maskey@Sun.COM 24911767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_uint64(NWAM_CONFIGSRC_DHCP, &val)) != 25011767SAnurag.Maskey@Sun.COM NWAM_SUCCESS) 25111767SAnurag.Maskey@Sun.COM goto finish; 25211767SAnurag.Maskey@Sun.COM if ((err = nwam_set_prop_value((*lochp)->nwh_data, 25311767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC, val)) != NWAM_SUCCESS) 25411767SAnurag.Maskey@Sun.COM goto finish; 25511767SAnurag.Maskey@Sun.COM nwam_value_free(val); 25611767SAnurag.Maskey@Sun.COM val = NULL; 25711767SAnurag.Maskey@Sun.COM 25811767SAnurag.Maskey@Sun.COM /* concatenate these two strings */ 25911767SAnurag.Maskey@Sun.COM nsswitch = strdup(NSSWITCH_PREFIX NWAM_NAMESERVICES_DNS_STRING); 26011767SAnurag.Maskey@Sun.COM if (nsswitch == NULL) { 26111767SAnurag.Maskey@Sun.COM err = NWAM_NO_MEMORY; 26211767SAnurag.Maskey@Sun.COM goto finish; 26311767SAnurag.Maskey@Sun.COM } 26411767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_string(nsswitch, &val)) != NWAM_SUCCESS) 26511767SAnurag.Maskey@Sun.COM goto finish; 26611767SAnurag.Maskey@Sun.COM err = nwam_set_prop_value((*lochp)->nwh_data, 26711767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE, val); 26811767SAnurag.Maskey@Sun.COM 26911767SAnurag.Maskey@Sun.COM finish: 27011767SAnurag.Maskey@Sun.COM if (nsswitch != NULL) 27111767SAnurag.Maskey@Sun.COM free(nsswitch); 27211767SAnurag.Maskey@Sun.COM if (val != NULL) 27311767SAnurag.Maskey@Sun.COM nwam_value_free(val); 27411767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) { 27511767SAnurag.Maskey@Sun.COM nwam_loc_free(*lochp); 27611767SAnurag.Maskey@Sun.COM *lochp = NULL; 27711767SAnurag.Maskey@Sun.COM } 27811767SAnurag.Maskey@Sun.COM return (err); 27911767SAnurag.Maskey@Sun.COM } 28011767SAnurag.Maskey@Sun.COM 28111767SAnurag.Maskey@Sun.COM nwam_error_t 28211767SAnurag.Maskey@Sun.COM nwam_loc_get_name(nwam_loc_handle_t loch, char **namep) 28311767SAnurag.Maskey@Sun.COM { 28411767SAnurag.Maskey@Sun.COM return (nwam_get_name(loch, namep)); 28511767SAnurag.Maskey@Sun.COM } 28611767SAnurag.Maskey@Sun.COM 28711767SAnurag.Maskey@Sun.COM nwam_error_t 28811767SAnurag.Maskey@Sun.COM nwam_loc_set_name(nwam_loc_handle_t loch, const char *name) 28911767SAnurag.Maskey@Sun.COM { 29011767SAnurag.Maskey@Sun.COM return (nwam_set_name(loch, name)); 29111767SAnurag.Maskey@Sun.COM } 29211767SAnurag.Maskey@Sun.COM 29311767SAnurag.Maskey@Sun.COM boolean_t 29411767SAnurag.Maskey@Sun.COM nwam_loc_can_set_name(nwam_loc_handle_t loch) 29511767SAnurag.Maskey@Sun.COM { 29611767SAnurag.Maskey@Sun.COM return (!loch->nwh_committed); 29711767SAnurag.Maskey@Sun.COM } 29811767SAnurag.Maskey@Sun.COM 29911767SAnurag.Maskey@Sun.COM /* ARGSUSED2 */ 30011767SAnurag.Maskey@Sun.COM static int 30111767SAnurag.Maskey@Sun.COM loc_selectcb(struct nwam_handle *hp, uint64_t flags, void *data) 30211767SAnurag.Maskey@Sun.COM { 30311767SAnurag.Maskey@Sun.COM nwam_loc_handle_t loch = hp; 30411767SAnurag.Maskey@Sun.COM char *locname; 30511767SAnurag.Maskey@Sun.COM uint64_t activation, actflag, walkfilter; 30611767SAnurag.Maskey@Sun.COM nwam_value_t activationval; 30711767SAnurag.Maskey@Sun.COM 30811767SAnurag.Maskey@Sun.COM /* Skip the Legacy location in all cases */ 30911767SAnurag.Maskey@Sun.COM if (nwam_loc_get_name(loch, &locname) != NWAM_SUCCESS) 31011767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 31111767SAnurag.Maskey@Sun.COM if (strcmp(locname, NWAM_LOC_NAME_LEGACY) == 0) { 31211767SAnurag.Maskey@Sun.COM free(locname); 31311767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 31411767SAnurag.Maskey@Sun.COM } 31511767SAnurag.Maskey@Sun.COM free(locname); 31611767SAnurag.Maskey@Sun.COM 31711767SAnurag.Maskey@Sun.COM /* 31811767SAnurag.Maskey@Sun.COM * Get a bitmapped flag value corresponding to this loc's 31911767SAnurag.Maskey@Sun.COM * activation. 32011767SAnurag.Maskey@Sun.COM */ 32111767SAnurag.Maskey@Sun.COM if (nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_ACTIVATION_MODE, 32211767SAnurag.Maskey@Sun.COM &activationval) != NWAM_SUCCESS) { 32311767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 32411767SAnurag.Maskey@Sun.COM } 32511767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64(activationval, &activation) != NWAM_SUCCESS) { 32611767SAnurag.Maskey@Sun.COM nwam_value_free(activationval); 32711767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 32811767SAnurag.Maskey@Sun.COM } 32911767SAnurag.Maskey@Sun.COM 33011767SAnurag.Maskey@Sun.COM actflag = nwam_loc_activation_to_flag(activation); 33111767SAnurag.Maskey@Sun.COM nwam_value_free(activationval); 33211767SAnurag.Maskey@Sun.COM if ((walkfilter = (flags & NWAM_WALK_FILTER_MASK)) == 0) 33311767SAnurag.Maskey@Sun.COM walkfilter = NWAM_FLAG_ACTIVATION_MODE_ALL; 33411767SAnurag.Maskey@Sun.COM if (actflag & walkfilter) 33511767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 33611767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 33711767SAnurag.Maskey@Sun.COM } 33811767SAnurag.Maskey@Sun.COM 33911767SAnurag.Maskey@Sun.COM nwam_error_t 34011767SAnurag.Maskey@Sun.COM nwam_walk_locs(int(*cb)(nwam_loc_handle_t, void *), void *data, uint64_t flags, 34111767SAnurag.Maskey@Sun.COM int *retp) 34211767SAnurag.Maskey@Sun.COM { 34311767SAnurag.Maskey@Sun.COM nwam_error_t err = nwam_valid_flags(flags, 34411767SAnurag.Maskey@Sun.COM NWAM_FLAG_ACTIVATION_MODE_ALL | NWAM_FLAG_BLOCKING); 34511767SAnurag.Maskey@Sun.COM 34611767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) 34711767SAnurag.Maskey@Sun.COM return (err); 34811767SAnurag.Maskey@Sun.COM 34911767SAnurag.Maskey@Sun.COM return (nwam_walk(NWAM_OBJECT_TYPE_LOC, NWAM_LOC_CONF_FILE, 35011767SAnurag.Maskey@Sun.COM cb, data, flags, retp, loc_selectcb)); 35111767SAnurag.Maskey@Sun.COM } 35211767SAnurag.Maskey@Sun.COM 35311767SAnurag.Maskey@Sun.COM void 35411767SAnurag.Maskey@Sun.COM nwam_loc_free(nwam_loc_handle_t loch) 35511767SAnurag.Maskey@Sun.COM { 35611767SAnurag.Maskey@Sun.COM nwam_free(loch); 35711767SAnurag.Maskey@Sun.COM } 35811767SAnurag.Maskey@Sun.COM 35911767SAnurag.Maskey@Sun.COM nwam_error_t 36011767SAnurag.Maskey@Sun.COM nwam_loc_delete_prop(nwam_loc_handle_t loch, const char *propname) 36111767SAnurag.Maskey@Sun.COM { 36211767SAnurag.Maskey@Sun.COM nwam_error_t err; 36311767SAnurag.Maskey@Sun.COM boolean_t ro; 36411767SAnurag.Maskey@Sun.COM void *olddata; 36511767SAnurag.Maskey@Sun.COM 36611767SAnurag.Maskey@Sun.COM assert(loch != NULL && propname != NULL); 36711767SAnurag.Maskey@Sun.COM 36811767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_prop_read_only(propname, &ro)) != NWAM_SUCCESS) 36911767SAnurag.Maskey@Sun.COM return (err); 37011767SAnurag.Maskey@Sun.COM if (ro) 37111767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_READ_ONLY); 37211767SAnurag.Maskey@Sun.COM 37311767SAnurag.Maskey@Sun.COM /* 37411767SAnurag.Maskey@Sun.COM * Duplicate data, remove property and validate. If validation 37511767SAnurag.Maskey@Sun.COM * fails, revert to data duplicated prior to remove. 37611767SAnurag.Maskey@Sun.COM */ 37711767SAnurag.Maskey@Sun.COM if ((err = nwam_dup_object_list(loch->nwh_data, &olddata)) 37811767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) 37911767SAnurag.Maskey@Sun.COM return (err); 38011767SAnurag.Maskey@Sun.COM if ((err = nwam_delete_prop(loch->nwh_data, propname)) 38111767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) { 38211767SAnurag.Maskey@Sun.COM nwam_free_object_list(loch->nwh_data); 38311767SAnurag.Maskey@Sun.COM loch->nwh_data = olddata; 38411767SAnurag.Maskey@Sun.COM return (err); 38511767SAnurag.Maskey@Sun.COM } 38611767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_validate(loch, NULL)) != NWAM_SUCCESS) { 38711767SAnurag.Maskey@Sun.COM nwam_free_object_list(loch->nwh_data); 38811767SAnurag.Maskey@Sun.COM loch->nwh_data = olddata; 38911767SAnurag.Maskey@Sun.COM return (err); 39011767SAnurag.Maskey@Sun.COM } 39111767SAnurag.Maskey@Sun.COM nwam_free_object_list(olddata); 39211767SAnurag.Maskey@Sun.COM 39311767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 39411767SAnurag.Maskey@Sun.COM } 39511767SAnurag.Maskey@Sun.COM 39611767SAnurag.Maskey@Sun.COM nwam_error_t 39711767SAnurag.Maskey@Sun.COM nwam_loc_set_prop_value(nwam_loc_handle_t loch, const char *propname, 39811767SAnurag.Maskey@Sun.COM nwam_value_t value) 39911767SAnurag.Maskey@Sun.COM { 40011767SAnurag.Maskey@Sun.COM nwam_error_t err; 40111767SAnurag.Maskey@Sun.COM boolean_t ro; 40211767SAnurag.Maskey@Sun.COM 40311767SAnurag.Maskey@Sun.COM assert(loch != NULL && propname != NULL && value != NULL); 40411767SAnurag.Maskey@Sun.COM 40511767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_validate_prop(loch, propname, value)) 40611767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS || 40711767SAnurag.Maskey@Sun.COM (err = nwam_loc_prop_read_only(propname, &ro)) != NWAM_SUCCESS) 40811767SAnurag.Maskey@Sun.COM return (err); 40911767SAnurag.Maskey@Sun.COM if (ro) 41011767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_READ_ONLY); 41111767SAnurag.Maskey@Sun.COM 41211767SAnurag.Maskey@Sun.COM return (nwam_set_prop_value(loch->nwh_data, propname, value)); 41311767SAnurag.Maskey@Sun.COM } 41411767SAnurag.Maskey@Sun.COM 41511767SAnurag.Maskey@Sun.COM nwam_error_t 41611767SAnurag.Maskey@Sun.COM nwam_loc_get_prop_value(nwam_loc_handle_t loch, const char *propname, 41711767SAnurag.Maskey@Sun.COM nwam_value_t *valuep) 41811767SAnurag.Maskey@Sun.COM { 41911767SAnurag.Maskey@Sun.COM return (nwam_get_prop_value(loch->nwh_data, propname, valuep)); 42011767SAnurag.Maskey@Sun.COM } 42111767SAnurag.Maskey@Sun.COM 42211767SAnurag.Maskey@Sun.COM nwam_error_t 42311767SAnurag.Maskey@Sun.COM nwam_loc_walk_props(nwam_loc_handle_t loch, 42411767SAnurag.Maskey@Sun.COM int (*cb)(const char *, nwam_value_t, void *), 42511767SAnurag.Maskey@Sun.COM void *data, uint64_t flags, int *retp) 42611767SAnurag.Maskey@Sun.COM { 42711767SAnurag.Maskey@Sun.COM return (nwam_walk_props(loch, cb, data, flags, retp)); 42811767SAnurag.Maskey@Sun.COM } 42911767SAnurag.Maskey@Sun.COM 43011767SAnurag.Maskey@Sun.COM nwam_error_t 43111767SAnurag.Maskey@Sun.COM nwam_loc_commit(nwam_loc_handle_t loch, uint64_t flags) 43211767SAnurag.Maskey@Sun.COM { 43311767SAnurag.Maskey@Sun.COM nwam_error_t err; 43411767SAnurag.Maskey@Sun.COM 43511767SAnurag.Maskey@Sun.COM assert(loch != NULL && loch->nwh_data != NULL); 43611767SAnurag.Maskey@Sun.COM 43711767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_validate(loch, NULL)) != NWAM_SUCCESS) 43811767SAnurag.Maskey@Sun.COM return (err); 43911767SAnurag.Maskey@Sun.COM 44011767SAnurag.Maskey@Sun.COM return (nwam_commit(NWAM_LOC_CONF_FILE, loch, flags)); 44111767SAnurag.Maskey@Sun.COM } 44211767SAnurag.Maskey@Sun.COM 44311767SAnurag.Maskey@Sun.COM nwam_error_t 44411767SAnurag.Maskey@Sun.COM nwam_loc_destroy(nwam_loc_handle_t loch, uint64_t flags) 44511767SAnurag.Maskey@Sun.COM { 44611767SAnurag.Maskey@Sun.COM nwam_error_t err; 44711767SAnurag.Maskey@Sun.COM nwam_value_t actval; 44811767SAnurag.Maskey@Sun.COM uint64_t activation; 44911767SAnurag.Maskey@Sun.COM 45011767SAnurag.Maskey@Sun.COM /* 45111767SAnurag.Maskey@Sun.COM * Automatic and NoNet are not destroyable and Legacy is 45211767SAnurag.Maskey@Sun.COM * destroyable by netadm only. These have system activation-mode. 45311767SAnurag.Maskey@Sun.COM */ 45411767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_ACTIVATION_MODE, 45511767SAnurag.Maskey@Sun.COM &actval)) != NWAM_SUCCESS) 45611767SAnurag.Maskey@Sun.COM return (err); 45711767SAnurag.Maskey@Sun.COM err = nwam_value_get_uint64(actval, &activation); 45811767SAnurag.Maskey@Sun.COM nwam_value_free(actval); 45911767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) 46011767SAnurag.Maskey@Sun.COM return (err); 46111767SAnurag.Maskey@Sun.COM 46211767SAnurag.Maskey@Sun.COM if (activation == NWAM_ACTIVATION_MODE_SYSTEM) { 46311767SAnurag.Maskey@Sun.COM if (strcmp(loch->nwh_name, NWAM_LOC_NAME_LEGACY) == 0) { 464*12036SMichael.Hunter@Sun.COM if (!nwam_uid_is_special()) 46511767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_NOT_DESTROYABLE); 46611767SAnurag.Maskey@Sun.COM } else { 46711767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_NOT_DESTROYABLE); 46811767SAnurag.Maskey@Sun.COM } 46911767SAnurag.Maskey@Sun.COM } 47011767SAnurag.Maskey@Sun.COM 47111767SAnurag.Maskey@Sun.COM return (nwam_destroy(NWAM_LOC_CONF_FILE, loch, flags)); 47211767SAnurag.Maskey@Sun.COM } 47311767SAnurag.Maskey@Sun.COM 47411767SAnurag.Maskey@Sun.COM nwam_error_t 47511767SAnurag.Maskey@Sun.COM nwam_loc_get_prop_description(const char *propname, const char **descriptionp) 47611767SAnurag.Maskey@Sun.COM { 47711767SAnurag.Maskey@Sun.COM return (nwam_get_prop_description(loc_prop_table, propname, 47811767SAnurag.Maskey@Sun.COM descriptionp)); 47911767SAnurag.Maskey@Sun.COM } 48011767SAnurag.Maskey@Sun.COM 48111767SAnurag.Maskey@Sun.COM nwam_error_t 48211767SAnurag.Maskey@Sun.COM nwam_loc_prop_read_only(const char *propname, boolean_t *readp) 48311767SAnurag.Maskey@Sun.COM { 48411767SAnurag.Maskey@Sun.COM return (nwam_prop_read_only(loc_prop_table, propname, readp)); 48511767SAnurag.Maskey@Sun.COM } 48611767SAnurag.Maskey@Sun.COM 48711767SAnurag.Maskey@Sun.COM static nwam_error_t 48811767SAnurag.Maskey@Sun.COM valid_loc_activation_mode(nwam_value_t value) 48911767SAnurag.Maskey@Sun.COM { 49011767SAnurag.Maskey@Sun.COM uint64_t activation_mode; 49111767SAnurag.Maskey@Sun.COM 49211767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64(value, &activation_mode) != NWAM_SUCCESS) 49311767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 49411767SAnurag.Maskey@Sun.COM 49511767SAnurag.Maskey@Sun.COM switch (activation_mode) { 49611767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_MANUAL: 49711767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_SYSTEM: 49811767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_CONDITIONAL_ANY: 49911767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_CONDITIONAL_ALL: 50011767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 50111767SAnurag.Maskey@Sun.COM } 50211767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 50311767SAnurag.Maskey@Sun.COM } 50411767SAnurag.Maskey@Sun.COM 50511767SAnurag.Maskey@Sun.COM /* 50611767SAnurag.Maskey@Sun.COM * Identical to nwam_valid_condition(), except locations cannot specify other 50711767SAnurag.Maskey@Sun.COM * location's activation as a condition, e.g. loc2 cannot specify 50811767SAnurag.Maskey@Sun.COM * "loc1 is active" since only one location is active at a time, and 50911767SAnurag.Maskey@Sun.COM * as a consequence the condition is unsatisfiable. 51011767SAnurag.Maskey@Sun.COM */ 51111767SAnurag.Maskey@Sun.COM nwam_error_t 51211767SAnurag.Maskey@Sun.COM valid_loc_condition(nwam_value_t value) 51311767SAnurag.Maskey@Sun.COM { 51411767SAnurag.Maskey@Sun.COM char **conditions; 51511767SAnurag.Maskey@Sun.COM uint_t i, numvalues; 51611767SAnurag.Maskey@Sun.COM nwam_condition_object_type_t object_type; 51711767SAnurag.Maskey@Sun.COM nwam_condition_t condition; 51811767SAnurag.Maskey@Sun.COM 51911767SAnurag.Maskey@Sun.COM if (nwam_value_get_string_array(value, &conditions, &numvalues) 52011767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) 52111767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 52211767SAnurag.Maskey@Sun.COM 52311767SAnurag.Maskey@Sun.COM for (i = 0; i < numvalues; i++) { 52411767SAnurag.Maskey@Sun.COM char *object_name = NULL; 52511767SAnurag.Maskey@Sun.COM 52611767SAnurag.Maskey@Sun.COM if (nwam_condition_string_to_condition(conditions[i], 52711767SAnurag.Maskey@Sun.COM &object_type, &condition, &object_name) != NWAM_SUCCESS) 52811767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 52911767SAnurag.Maskey@Sun.COM if (object_type == NWAM_CONDITION_OBJECT_TYPE_LOC && 53011767SAnurag.Maskey@Sun.COM condition == NWAM_CONDITION_IS) { 53111767SAnurag.Maskey@Sun.COM free(object_name); 53211767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 53311767SAnurag.Maskey@Sun.COM } 53411767SAnurag.Maskey@Sun.COM if (object_name != NULL) 53511767SAnurag.Maskey@Sun.COM free(object_name); 53611767SAnurag.Maskey@Sun.COM } 53711767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 53811767SAnurag.Maskey@Sun.COM } 53911767SAnurag.Maskey@Sun.COM 54011767SAnurag.Maskey@Sun.COM static nwam_error_t 54111767SAnurag.Maskey@Sun.COM valid_nameservices(nwam_value_t value) 54211767SAnurag.Maskey@Sun.COM { 54311767SAnurag.Maskey@Sun.COM uint64_t *nameservices; 54411767SAnurag.Maskey@Sun.COM uint_t i, numvalues; 54511767SAnurag.Maskey@Sun.COM 54611767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64_array(value, &nameservices, &numvalues) 54711767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) 54811767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 54911767SAnurag.Maskey@Sun.COM 55011767SAnurag.Maskey@Sun.COM for (i = 0; i < numvalues; i++) { 55111767SAnurag.Maskey@Sun.COM if (nameservices[i] > NWAM_NAMESERVICES_LDAP) 55211767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 55311767SAnurag.Maskey@Sun.COM } 55411767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 55511767SAnurag.Maskey@Sun.COM } 55611767SAnurag.Maskey@Sun.COM 55711767SAnurag.Maskey@Sun.COM static nwam_error_t 55811767SAnurag.Maskey@Sun.COM valid_configsrc(nwam_value_t value) 55911767SAnurag.Maskey@Sun.COM { 56011767SAnurag.Maskey@Sun.COM uint64_t *configsrcs; 56111767SAnurag.Maskey@Sun.COM uint_t i, numvalues; 56211767SAnurag.Maskey@Sun.COM 56311767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64_array(value, &configsrcs, &numvalues) 56411767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) 56511767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 56611767SAnurag.Maskey@Sun.COM 56711767SAnurag.Maskey@Sun.COM for (i = 0; i < numvalues; i++) { 56811767SAnurag.Maskey@Sun.COM if (configsrcs[i] > NWAM_CONFIGSRC_DHCP) 56911767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 57011767SAnurag.Maskey@Sun.COM } 57111767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 57211767SAnurag.Maskey@Sun.COM } 57311767SAnurag.Maskey@Sun.COM 57411767SAnurag.Maskey@Sun.COM /* 57511767SAnurag.Maskey@Sun.COM * Validates that the activation-mode is system for Automatic and NoNet 57611767SAnurag.Maskey@Sun.COM * locations, and not system for all other locations. 57711767SAnurag.Maskey@Sun.COM */ 57811767SAnurag.Maskey@Sun.COM static nwam_error_t 57911767SAnurag.Maskey@Sun.COM nwam_loc_validate_activation_mode(nwam_loc_handle_t loch, nwam_value_t actval) 58011767SAnurag.Maskey@Sun.COM { 58111767SAnurag.Maskey@Sun.COM nwam_error_t err; 58211767SAnurag.Maskey@Sun.COM uint64_t activation; 58311767SAnurag.Maskey@Sun.COM 58411767SAnurag.Maskey@Sun.COM if ((err = nwam_value_get_uint64(actval, &activation)) != NWAM_SUCCESS) 58511767SAnurag.Maskey@Sun.COM return (err); 58611767SAnurag.Maskey@Sun.COM 58711767SAnurag.Maskey@Sun.COM if (NWAM_LOC_NAME_PRE_DEFINED(loch->nwh_name)) { 58811767SAnurag.Maskey@Sun.COM if (activation != NWAM_ACTIVATION_MODE_SYSTEM) 58911767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 59011767SAnurag.Maskey@Sun.COM } else { 59111767SAnurag.Maskey@Sun.COM if (activation == NWAM_ACTIVATION_MODE_SYSTEM) 59211767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 59311767SAnurag.Maskey@Sun.COM } 59411767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 59511767SAnurag.Maskey@Sun.COM } 59611767SAnurag.Maskey@Sun.COM 59711767SAnurag.Maskey@Sun.COM /* 59811767SAnurag.Maskey@Sun.COM * Helper function to validate one nameservice, used by 59911767SAnurag.Maskey@Sun.COM * nwam_loc_validate_all_nameservices(). 60011767SAnurag.Maskey@Sun.COM * 60111767SAnurag.Maskey@Sun.COM * requiredprop denotes the property that is mandatory when the 60211767SAnurag.Maskey@Sun.COM * configsrcprop is manual. errpropp is used to return the invalid 60311767SAnurag.Maskey@Sun.COM * property. 60411767SAnurag.Maskey@Sun.COM */ 60511767SAnurag.Maskey@Sun.COM static nwam_error_t 60611767SAnurag.Maskey@Sun.COM nwam_loc_validate_one_nameservice(nwam_loc_handle_t loch, 60711767SAnurag.Maskey@Sun.COM const char *configsrcprop, const char *requiredprop, const char **errpropp) 60811767SAnurag.Maskey@Sun.COM { 60911767SAnurag.Maskey@Sun.COM nwam_value_t configsrcval, requiredval; 61011767SAnurag.Maskey@Sun.COM uint64_t *configsrcs; 61111767SAnurag.Maskey@Sun.COM uint_t i, numvalues; 61211767SAnurag.Maskey@Sun.COM 61311767SAnurag.Maskey@Sun.COM if (nwam_loc_get_prop_value(loch, configsrcprop, &configsrcval) 61411767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) { 61511767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 61611767SAnurag.Maskey@Sun.COM *errpropp = configsrcprop; 61711767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MISSING_MEMBER); 61811767SAnurag.Maskey@Sun.COM } 61911767SAnurag.Maskey@Sun.COM 62011767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64_array(configsrcval, &configsrcs, &numvalues) 62111767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) { 62211767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 62311767SAnurag.Maskey@Sun.COM *errpropp = configsrcprop; 62411767SAnurag.Maskey@Sun.COM nwam_value_free(configsrcval); 62511767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_NO_VALUE); 62611767SAnurag.Maskey@Sun.COM } 62711767SAnurag.Maskey@Sun.COM 62811767SAnurag.Maskey@Sun.COM /* If -configsrc is manual, requiredprop is required */ 62911767SAnurag.Maskey@Sun.COM for (i = 0; i < numvalues; i++) { 63011767SAnurag.Maskey@Sun.COM if (configsrcs[i] == NWAM_CONFIGSRC_MANUAL) { 63111767SAnurag.Maskey@Sun.COM if (nwam_loc_get_prop_value(loch, requiredprop, 63211767SAnurag.Maskey@Sun.COM &requiredval) != NWAM_SUCCESS) { 63311767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 63411767SAnurag.Maskey@Sun.COM *errpropp = requiredprop; 63511767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MISSING_MEMBER); 63611767SAnurag.Maskey@Sun.COM } 63711767SAnurag.Maskey@Sun.COM nwam_value_free(requiredval); 63811767SAnurag.Maskey@Sun.COM } 63911767SAnurag.Maskey@Sun.COM } 64011767SAnurag.Maskey@Sun.COM nwam_value_free(configsrcval); 64111767SAnurag.Maskey@Sun.COM 64211767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 64311767SAnurag.Maskey@Sun.COM } 64411767SAnurag.Maskey@Sun.COM 64511767SAnurag.Maskey@Sun.COM /* 64611767SAnurag.Maskey@Sun.COM * Helper function to validate LDAP nameservice, used by 64711767SAnurag.Maskey@Sun.COM * nwam_loc_validate_all_nameservices(). Separated because LDAP must be 64811767SAnurag.Maskey@Sun.COM * configured manually only and both default-domain and -servers are required. 64911767SAnurag.Maskey@Sun.COM */ 65011767SAnurag.Maskey@Sun.COM static nwam_error_t 65111767SAnurag.Maskey@Sun.COM nwam_loc_validate_ldap_nameservice(nwam_loc_handle_t loch, 65211767SAnurag.Maskey@Sun.COM const char **errpropp) 65311767SAnurag.Maskey@Sun.COM { 65411767SAnurag.Maskey@Sun.COM nwam_value_t val; 65511767SAnurag.Maskey@Sun.COM uint64_t *configsrcs; 65611767SAnurag.Maskey@Sun.COM uint_t i, numvalues; 65711767SAnurag.Maskey@Sun.COM 65811767SAnurag.Maskey@Sun.COM if (nwam_loc_get_prop_value(loch, 65911767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC, &val) != NWAM_SUCCESS) { 66011767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 66111767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC; 66211767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MISSING_MEMBER); 66311767SAnurag.Maskey@Sun.COM } 66411767SAnurag.Maskey@Sun.COM /* -configsrc is defined as an array */ 66511767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64_array(val, &configsrcs, &numvalues) 66611767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) { 66711767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 66811767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC; 66911767SAnurag.Maskey@Sun.COM nwam_value_free(val); 67011767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_NO_VALUE); 67111767SAnurag.Maskey@Sun.COM } 67211767SAnurag.Maskey@Sun.COM 67311767SAnurag.Maskey@Sun.COM /* -configsrc must be manual */ 67411767SAnurag.Maskey@Sun.COM for (i = 0; i < numvalues; i++) { 67511767SAnurag.Maskey@Sun.COM if (configsrcs[i] != NWAM_CONFIGSRC_MANUAL) { 67611767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 67711767SAnurag.Maskey@Sun.COM *errpropp = 67811767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC; 67911767SAnurag.Maskey@Sun.COM nwam_value_free(val); 68011767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 68111767SAnurag.Maskey@Sun.COM } 68211767SAnurag.Maskey@Sun.COM } 68311767SAnurag.Maskey@Sun.COM nwam_value_free(val); 68411767SAnurag.Maskey@Sun.COM 68511767SAnurag.Maskey@Sun.COM /* both default-domain and -servers are required */ 68611767SAnurag.Maskey@Sun.COM if (nwam_loc_get_prop_value(loch, 68711767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_DEFAULT_DOMAIN, &val) != NWAM_SUCCESS) { 68811767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 68911767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_DEFAULT_DOMAIN; 69011767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MISSING_MEMBER); 69111767SAnurag.Maskey@Sun.COM } 69211767SAnurag.Maskey@Sun.COM nwam_value_free(val); 69311767SAnurag.Maskey@Sun.COM 69411767SAnurag.Maskey@Sun.COM if (nwam_loc_get_prop_value(loch, 69511767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_LDAP_NAMESERVICE_SERVERS, &val) != NWAM_SUCCESS) { 69611767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 69711767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_LDAP_NAMESERVICE_SERVERS; 69811767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MISSING_MEMBER); 69911767SAnurag.Maskey@Sun.COM } 70011767SAnurag.Maskey@Sun.COM nwam_value_free(val); 70111767SAnurag.Maskey@Sun.COM 70211767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 70311767SAnurag.Maskey@Sun.COM } 70411767SAnurag.Maskey@Sun.COM 70511767SAnurag.Maskey@Sun.COM /* 70611767SAnurag.Maskey@Sun.COM * Validates the different nameservices properties. 70711767SAnurag.Maskey@Sun.COM * 70811767SAnurag.Maskey@Sun.COM * If "nameservices" property has more than one nameservice to configure, 70911767SAnurag.Maskey@Sun.COM * "nameservices-config-file" must be specified. If only one nameservice 71011767SAnurag.Maskey@Sun.COM * is configured and "nameservices-config-file" is missing, set the 71111767SAnurag.Maskey@Sun.COM * property with the appropriately suffixed nsswitch file. 71211767SAnurag.Maskey@Sun.COM * 71311767SAnurag.Maskey@Sun.COM * For any nameservice being configured, the respective -configsrc property 71411767SAnurag.Maskey@Sun.COM * must be specified. For DNS, -servers is required if -configsrc is 71511767SAnurag.Maskey@Sun.COM * manual. For NIS and LDAP, default-domain is required if -configsrc is 71611767SAnurag.Maskey@Sun.COM * manual. For LDAP, -configsrc must be manual and -servers is required. 71711767SAnurag.Maskey@Sun.COM */ 71811767SAnurag.Maskey@Sun.COM static nwam_error_t 71911767SAnurag.Maskey@Sun.COM nwam_loc_validate_all_nameservices(nwam_loc_handle_t loch, 72011767SAnurag.Maskey@Sun.COM nwam_value_t nameservicesval, const char **errpropp) 72111767SAnurag.Maskey@Sun.COM { 72211767SAnurag.Maskey@Sun.COM nwam_error_t err; 72311767SAnurag.Maskey@Sun.COM nwam_value_t val; 72411767SAnurag.Maskey@Sun.COM uint64_t *nameservices; 72511767SAnurag.Maskey@Sun.COM uint_t i, numvalues; 72611767SAnurag.Maskey@Sun.COM 72711767SAnurag.Maskey@Sun.COM if ((err = nwam_value_get_uint64_array(nameservicesval, &nameservices, 72811767SAnurag.Maskey@Sun.COM &numvalues)) != NWAM_SUCCESS) 72911767SAnurag.Maskey@Sun.COM return (err); 73011767SAnurag.Maskey@Sun.COM 73111767SAnurag.Maskey@Sun.COM /* 73211767SAnurag.Maskey@Sun.COM * nameservices-config-file is required if nameservices has more 73311767SAnurag.Maskey@Sun.COM * than one value. 73411767SAnurag.Maskey@Sun.COM */ 73511767SAnurag.Maskey@Sun.COM if (numvalues > 1) { 73611767SAnurag.Maskey@Sun.COM if (nwam_loc_get_prop_value(loch, 73711767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE, &val) 73811767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) { 73911767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 74011767SAnurag.Maskey@Sun.COM *errpropp = 74111767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE; 74211767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MISSING_MEMBER); 74311767SAnurag.Maskey@Sun.COM } 74411767SAnurag.Maskey@Sun.COM nwam_value_free(val); 74511767SAnurag.Maskey@Sun.COM } else if (numvalues == 1) { 74611767SAnurag.Maskey@Sun.COM /* 74711767SAnurag.Maskey@Sun.COM * If only one nameservice is being configured and 74811767SAnurag.Maskey@Sun.COM * nameservices-config-file doesn't exist, create it to 74911767SAnurag.Maskey@Sun.COM * point to the respective nsswitch file. 75011767SAnurag.Maskey@Sun.COM */ 75111767SAnurag.Maskey@Sun.COM err = nwam_loc_get_prop_value(loch, 75211767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE, &val); 75311767SAnurag.Maskey@Sun.COM if (err == NWAM_INVALID_ARG || err == NWAM_ENTITY_NOT_FOUND) { 75411767SAnurag.Maskey@Sun.COM char *nsswitch; 75511767SAnurag.Maskey@Sun.COM const char *nsswitch_suffix; 75611767SAnurag.Maskey@Sun.COM 75711767SAnurag.Maskey@Sun.COM /* get the single nameservice being configured */ 75811767SAnurag.Maskey@Sun.COM if ((err = nwam_uint64_get_value_string( 75911767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_NAMESERVICES, nameservices[0], 76011767SAnurag.Maskey@Sun.COM &nsswitch_suffix)) != NWAM_SUCCESS) 76111767SAnurag.Maskey@Sun.COM goto config_file_fail; 76211767SAnurag.Maskey@Sun.COM if ((nsswitch = malloc(MAXPATHLEN)) == NULL) { 76311767SAnurag.Maskey@Sun.COM err = NWAM_NO_MEMORY; 76411767SAnurag.Maskey@Sun.COM goto config_file_fail; 76511767SAnurag.Maskey@Sun.COM } 76611767SAnurag.Maskey@Sun.COM 76711767SAnurag.Maskey@Sun.COM /* create appropriately suffixed nsswitch name */ 76811767SAnurag.Maskey@Sun.COM (void) snprintf(nsswitch, MAXPATHLEN, "%s%s", 76911767SAnurag.Maskey@Sun.COM NSSWITCH_PREFIX, nsswitch_suffix); 77011767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_string(nsswitch, &val)) 77111767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) { 77211767SAnurag.Maskey@Sun.COM free(nsswitch); 77311767SAnurag.Maskey@Sun.COM goto config_file_fail; 77411767SAnurag.Maskey@Sun.COM } 77511767SAnurag.Maskey@Sun.COM 77611767SAnurag.Maskey@Sun.COM err = nwam_set_prop_value(loch->nwh_data, 77711767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE, val); 77811767SAnurag.Maskey@Sun.COM free(nsswitch); 77911767SAnurag.Maskey@Sun.COM nwam_value_free(val); 78011767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) { 78111767SAnurag.Maskey@Sun.COM nwam_value_free(val); 78211767SAnurag.Maskey@Sun.COM goto config_file_fail; 78311767SAnurag.Maskey@Sun.COM } 78411767SAnurag.Maskey@Sun.COM } else if (err != NWAM_SUCCESS) { 78511767SAnurag.Maskey@Sun.COM goto config_file_fail; 78611767SAnurag.Maskey@Sun.COM } else { 78711767SAnurag.Maskey@Sun.COM nwam_value_free(val); 78811767SAnurag.Maskey@Sun.COM } 78911767SAnurag.Maskey@Sun.COM } 79011767SAnurag.Maskey@Sun.COM 79111767SAnurag.Maskey@Sun.COM /* 79211767SAnurag.Maskey@Sun.COM * validate the -configsrc property and the required default-domain 79311767SAnurag.Maskey@Sun.COM * and/or -servers property for each nameservice being configured. 79411767SAnurag.Maskey@Sun.COM */ 79511767SAnurag.Maskey@Sun.COM for (i = 0; i < numvalues; i++) { 79611767SAnurag.Maskey@Sun.COM switch (nameservices[i]) { 79711767SAnurag.Maskey@Sun.COM case NWAM_NAMESERVICES_DNS: 79811767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_validate_one_nameservice(loch, 79911767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC, 80011767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_DNS_NAMESERVICE_SERVERS, errpropp)) 80111767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) 80211767SAnurag.Maskey@Sun.COM return (err); 80311767SAnurag.Maskey@Sun.COM break; 80411767SAnurag.Maskey@Sun.COM case NWAM_NAMESERVICES_NIS: 80511767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_validate_one_nameservice(loch, 80611767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_NIS_NAMESERVICE_CONFIGSRC, 80711767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_DEFAULT_DOMAIN, errpropp)) 80811767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) 80911767SAnurag.Maskey@Sun.COM return (err); 81011767SAnurag.Maskey@Sun.COM break; 81111767SAnurag.Maskey@Sun.COM case NWAM_NAMESERVICES_LDAP: 81211767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_validate_ldap_nameservice(loch, 81311767SAnurag.Maskey@Sun.COM errpropp)) != NWAM_SUCCESS) 81411767SAnurag.Maskey@Sun.COM return (err); 81511767SAnurag.Maskey@Sun.COM break; 81611767SAnurag.Maskey@Sun.COM case NWAM_NAMESERVICES_FILES: 81711767SAnurag.Maskey@Sun.COM break; 81811767SAnurag.Maskey@Sun.COM default: 81911767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 82011767SAnurag.Maskey@Sun.COM } 82111767SAnurag.Maskey@Sun.COM } 82211767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 82311767SAnurag.Maskey@Sun.COM 82411767SAnurag.Maskey@Sun.COM config_file_fail: 82511767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 82611767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE; 82711767SAnurag.Maskey@Sun.COM return (err); 82811767SAnurag.Maskey@Sun.COM } 82911767SAnurag.Maskey@Sun.COM 83011767SAnurag.Maskey@Sun.COM nwam_error_t 83111767SAnurag.Maskey@Sun.COM nwam_loc_validate(nwam_loc_handle_t loch, const char **errpropp) 83211767SAnurag.Maskey@Sun.COM { 83311767SAnurag.Maskey@Sun.COM nwam_error_t err; 83411767SAnurag.Maskey@Sun.COM nwam_value_t activationval, conditionval, nameservicesval; 83511767SAnurag.Maskey@Sun.COM uint64_t activation; 83611767SAnurag.Maskey@Sun.COM char **conditions, *name; 83711767SAnurag.Maskey@Sun.COM uint_t i, numvalues; 83811767SAnurag.Maskey@Sun.COM nwam_condition_object_type_t object_type; 83911767SAnurag.Maskey@Sun.COM nwam_condition_t condition; 84011767SAnurag.Maskey@Sun.COM 84111767SAnurag.Maskey@Sun.COM assert(loch != NULL); 84211767SAnurag.Maskey@Sun.COM 84311767SAnurag.Maskey@Sun.COM /* 84411767SAnurag.Maskey@Sun.COM * Make sure loc is internally consistent: if activation type is 84511767SAnurag.Maskey@Sun.COM * conditional, the condition string must be specified. 84611767SAnurag.Maskey@Sun.COM */ 84711767SAnurag.Maskey@Sun.COM if (nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_ACTIVATION_MODE, 84811767SAnurag.Maskey@Sun.COM &activationval) != NWAM_SUCCESS) { 84911767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 85011767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_ACTIVATION_MODE; 85111767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MISSING_MEMBER); 85211767SAnurag.Maskey@Sun.COM } 85311767SAnurag.Maskey@Sun.COM 85411767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64(activationval, &activation) 85511767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) { 85611767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 85711767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_ACTIVATION_MODE; 85811767SAnurag.Maskey@Sun.COM nwam_value_free(activationval); 85911767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_NO_VALUE); 86011767SAnurag.Maskey@Sun.COM } 86111767SAnurag.Maskey@Sun.COM 86211767SAnurag.Maskey@Sun.COM /* validate activation against the location first */ 86311767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_validate_activation_mode(loch, activationval)) 86411767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) { 86511767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 86611767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_ACTIVATION_MODE; 86711767SAnurag.Maskey@Sun.COM nwam_value_free(activationval); 86811767SAnurag.Maskey@Sun.COM return (err); 86911767SAnurag.Maskey@Sun.COM } 87011767SAnurag.Maskey@Sun.COM nwam_value_free(activationval); 87111767SAnurag.Maskey@Sun.COM 87211767SAnurag.Maskey@Sun.COM if (activation == NWAM_ACTIVATION_MODE_CONDITIONAL_ANY || 87311767SAnurag.Maskey@Sun.COM activation == NWAM_ACTIVATION_MODE_CONDITIONAL_ALL) { 87411767SAnurag.Maskey@Sun.COM if (nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_CONDITIONS, 87511767SAnurag.Maskey@Sun.COM &conditionval) != NWAM_SUCCESS) { 87611767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 87711767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_CONDITIONS; 87811767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MISSING_MEMBER); 87911767SAnurag.Maskey@Sun.COM } 88011767SAnurag.Maskey@Sun.COM /* 88111767SAnurag.Maskey@Sun.COM * Are conditions self-referential? In other words, do any 88211767SAnurag.Maskey@Sun.COM * of the activation conditions refer to this location? 88311767SAnurag.Maskey@Sun.COM */ 88411767SAnurag.Maskey@Sun.COM if (nwam_value_get_string_array(conditionval, &conditions, 88511767SAnurag.Maskey@Sun.COM &numvalues) != NWAM_SUCCESS) { 88611767SAnurag.Maskey@Sun.COM nwam_value_free(conditionval); 88711767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 88811767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_CONDITIONS; 88911767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 89011767SAnurag.Maskey@Sun.COM } 89111767SAnurag.Maskey@Sun.COM if (nwam_loc_get_name(loch, &name) != NWAM_SUCCESS) { 89211767SAnurag.Maskey@Sun.COM nwam_value_free(conditionval); 89311767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG); 89411767SAnurag.Maskey@Sun.COM } 89511767SAnurag.Maskey@Sun.COM for (i = 0; i < numvalues; i++) { 89611767SAnurag.Maskey@Sun.COM char *object_name = NULL; 89711767SAnurag.Maskey@Sun.COM 89811767SAnurag.Maskey@Sun.COM if (nwam_condition_string_to_condition(conditions[i], 89911767SAnurag.Maskey@Sun.COM &object_type, &condition, &object_name) 90011767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) { 90111767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 90211767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_CONDITIONS; 90311767SAnurag.Maskey@Sun.COM free(name); 90411767SAnurag.Maskey@Sun.COM nwam_value_free(conditionval); 90511767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 90611767SAnurag.Maskey@Sun.COM } 90711767SAnurag.Maskey@Sun.COM if (object_name != NULL && 90811767SAnurag.Maskey@Sun.COM object_type == NWAM_CONDITION_OBJECT_TYPE_LOC && 90911767SAnurag.Maskey@Sun.COM strcmp(object_name, name) == 0) { 91011767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 91111767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_CONDITIONS; 91211767SAnurag.Maskey@Sun.COM free(name); 91311767SAnurag.Maskey@Sun.COM free(object_name); 91411767SAnurag.Maskey@Sun.COM nwam_value_free(conditionval); 91511767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE); 91611767SAnurag.Maskey@Sun.COM } 91711767SAnurag.Maskey@Sun.COM free(object_name); 91811767SAnurag.Maskey@Sun.COM } 91911767SAnurag.Maskey@Sun.COM free(name); 92011767SAnurag.Maskey@Sun.COM nwam_value_free(conditionval); 92111767SAnurag.Maskey@Sun.COM } 92211767SAnurag.Maskey@Sun.COM 92311767SAnurag.Maskey@Sun.COM /* validate namerservices */ 92411767SAnurag.Maskey@Sun.COM if (nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_NAMESERVICES, 92511767SAnurag.Maskey@Sun.COM &nameservicesval) != NWAM_SUCCESS) { 92611767SAnurag.Maskey@Sun.COM if (errpropp != NULL) 92711767SAnurag.Maskey@Sun.COM *errpropp = NWAM_LOC_PROP_NAMESERVICES; 92811767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_MISSING_MEMBER); 92911767SAnurag.Maskey@Sun.COM } 93011767SAnurag.Maskey@Sun.COM err = nwam_loc_validate_all_nameservices(loch, nameservicesval, 93111767SAnurag.Maskey@Sun.COM errpropp); 93211767SAnurag.Maskey@Sun.COM nwam_value_free(nameservicesval); 93311767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) 93411767SAnurag.Maskey@Sun.COM return (err); 93511767SAnurag.Maskey@Sun.COM 93611767SAnurag.Maskey@Sun.COM return (nwam_validate(loc_prop_table, loch, errpropp)); 93711767SAnurag.Maskey@Sun.COM } 93811767SAnurag.Maskey@Sun.COM 93911767SAnurag.Maskey@Sun.COM nwam_error_t 94011767SAnurag.Maskey@Sun.COM nwam_loc_validate_prop(nwam_loc_handle_t loch, const char *propname, 94111767SAnurag.Maskey@Sun.COM nwam_value_t value) 94211767SAnurag.Maskey@Sun.COM { 94311767SAnurag.Maskey@Sun.COM nwam_error_t err; 94411767SAnurag.Maskey@Sun.COM 94511767SAnurag.Maskey@Sun.COM assert(loch != NULL); 94611767SAnurag.Maskey@Sun.COM 94711767SAnurag.Maskey@Sun.COM if (strcmp(propname, NWAM_LOC_PROP_ACTIVATION_MODE) == 0) { 94811767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_validate_activation_mode(loch, value)) 94911767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) 95011767SAnurag.Maskey@Sun.COM return (err); 95111767SAnurag.Maskey@Sun.COM } 95211767SAnurag.Maskey@Sun.COM 95311767SAnurag.Maskey@Sun.COM return (nwam_validate_prop(loc_prop_table, loch, propname, value)); 95411767SAnurag.Maskey@Sun.COM } 95511767SAnurag.Maskey@Sun.COM 95611767SAnurag.Maskey@Sun.COM nwam_error_t 95711767SAnurag.Maskey@Sun.COM nwam_loc_copy(nwam_loc_handle_t oldloch, const char *newname, 95811767SAnurag.Maskey@Sun.COM nwam_loc_handle_t *newlochp) 95911767SAnurag.Maskey@Sun.COM { 96011767SAnurag.Maskey@Sun.COM nwam_error_t err; 96111767SAnurag.Maskey@Sun.COM nwam_value_t val; 96211767SAnurag.Maskey@Sun.COM 96311767SAnurag.Maskey@Sun.COM if ((err = nwam_copy(NWAM_LOC_CONF_FILE, oldloch, newname, newlochp)) 96411767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) 96511767SAnurag.Maskey@Sun.COM return (err); 96611767SAnurag.Maskey@Sun.COM 96711767SAnurag.Maskey@Sun.COM /* If the activation-mode is system, change it to manual */ 96811767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_get_prop_value(*newlochp, 96911767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_ACTIVATION_MODE, &val)) != NWAM_SUCCESS) 97011767SAnurag.Maskey@Sun.COM goto finish; 97111767SAnurag.Maskey@Sun.COM err = nwam_loc_validate_activation_mode(*newlochp, val); 97211767SAnurag.Maskey@Sun.COM nwam_value_free(val); 97311767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) { 97411767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_uint64(NWAM_ACTIVATION_MODE_MANUAL, 97511767SAnurag.Maskey@Sun.COM &val)) != NWAM_SUCCESS) 97611767SAnurag.Maskey@Sun.COM goto finish; 97711767SAnurag.Maskey@Sun.COM err = nwam_set_prop_value((*newlochp)->nwh_data, 97811767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_ACTIVATION_MODE, val); 97911767SAnurag.Maskey@Sun.COM nwam_value_free(val); 98011767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) 98111767SAnurag.Maskey@Sun.COM goto finish; 98211767SAnurag.Maskey@Sun.COM 98311767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_boolean(B_FALSE, &val)) 98411767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) 98511767SAnurag.Maskey@Sun.COM goto finish; 98611767SAnurag.Maskey@Sun.COM err = nwam_set_prop_value((*newlochp)->nwh_data, 98711767SAnurag.Maskey@Sun.COM NWAM_LOC_PROP_ENABLED, val); 98811767SAnurag.Maskey@Sun.COM nwam_value_free(val); 98911767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) 99011767SAnurag.Maskey@Sun.COM goto finish; 99111767SAnurag.Maskey@Sun.COM } 99211767SAnurag.Maskey@Sun.COM 99311767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 99411767SAnurag.Maskey@Sun.COM 99511767SAnurag.Maskey@Sun.COM finish: 99611767SAnurag.Maskey@Sun.COM nwam_loc_free(*newlochp); 99711767SAnurag.Maskey@Sun.COM *newlochp = NULL; 99811767SAnurag.Maskey@Sun.COM return (err); 99911767SAnurag.Maskey@Sun.COM } 100011767SAnurag.Maskey@Sun.COM 100111767SAnurag.Maskey@Sun.COM /* 100211767SAnurag.Maskey@Sun.COM * Given a property, return expected property data type 100311767SAnurag.Maskey@Sun.COM */ 100411767SAnurag.Maskey@Sun.COM nwam_error_t 100511767SAnurag.Maskey@Sun.COM nwam_loc_get_prop_type(const char *propname, nwam_value_type_t *typep) 100611767SAnurag.Maskey@Sun.COM { 100711767SAnurag.Maskey@Sun.COM return (nwam_get_prop_type(loc_prop_table, propname, typep)); 100811767SAnurag.Maskey@Sun.COM } 100911767SAnurag.Maskey@Sun.COM 101011767SAnurag.Maskey@Sun.COM nwam_error_t 101111767SAnurag.Maskey@Sun.COM nwam_loc_prop_multivalued(const char *propname, boolean_t *multip) 101211767SAnurag.Maskey@Sun.COM { 101311767SAnurag.Maskey@Sun.COM return (nwam_prop_multivalued(loc_prop_table, propname, multip)); 101411767SAnurag.Maskey@Sun.COM } 101511767SAnurag.Maskey@Sun.COM 101611767SAnurag.Maskey@Sun.COM /* 101711767SAnurag.Maskey@Sun.COM * Determine if the location has manual activation-mode or not. 101811767SAnurag.Maskey@Sun.COM */ 101911767SAnurag.Maskey@Sun.COM nwam_error_t 102011767SAnurag.Maskey@Sun.COM nwam_loc_is_manual(nwam_loc_handle_t loch, boolean_t *manualp) 102111767SAnurag.Maskey@Sun.COM { 102211767SAnurag.Maskey@Sun.COM nwam_error_t err; 102311767SAnurag.Maskey@Sun.COM nwam_value_t actval; 102411767SAnurag.Maskey@Sun.COM uint64_t activation; 102511767SAnurag.Maskey@Sun.COM 102611767SAnurag.Maskey@Sun.COM assert(loch != NULL); 102711767SAnurag.Maskey@Sun.COM 102811767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_ACTIVATION_MODE, 102911767SAnurag.Maskey@Sun.COM &actval)) != NWAM_SUCCESS) 103011767SAnurag.Maskey@Sun.COM return (err); 103111767SAnurag.Maskey@Sun.COM err = nwam_value_get_uint64(actval, &activation); 103211767SAnurag.Maskey@Sun.COM nwam_value_free(actval); 103311767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) 103411767SAnurag.Maskey@Sun.COM return (err); 103511767SAnurag.Maskey@Sun.COM 103611767SAnurag.Maskey@Sun.COM if (activation == NWAM_ACTIVATION_MODE_MANUAL) 103711767SAnurag.Maskey@Sun.COM *manualp = B_TRUE; 103811767SAnurag.Maskey@Sun.COM else 103911767SAnurag.Maskey@Sun.COM *manualp = B_FALSE; 104011767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 104111767SAnurag.Maskey@Sun.COM } 104211767SAnurag.Maskey@Sun.COM 104311767SAnurag.Maskey@Sun.COM /* Determine if location is enabled or not */ 104411767SAnurag.Maskey@Sun.COM static nwam_error_t 104511767SAnurag.Maskey@Sun.COM nwam_loc_is_enabled(nwam_loc_handle_t loch, boolean_t *enabledp) 104611767SAnurag.Maskey@Sun.COM { 104711767SAnurag.Maskey@Sun.COM nwam_error_t err; 104811767SAnurag.Maskey@Sun.COM nwam_value_t enabledval; 104911767SAnurag.Maskey@Sun.COM 105011767SAnurag.Maskey@Sun.COM assert(loch != NULL); 105111767SAnurag.Maskey@Sun.COM 105211767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_ENABLED, 105311767SAnurag.Maskey@Sun.COM &enabledval)) != NWAM_SUCCESS) 105411767SAnurag.Maskey@Sun.COM return (err); 105511767SAnurag.Maskey@Sun.COM err = nwam_value_get_boolean(enabledval, enabledp); 105611767SAnurag.Maskey@Sun.COM nwam_value_free(enabledval); 105711767SAnurag.Maskey@Sun.COM return (err); 105811767SAnurag.Maskey@Sun.COM } 105911767SAnurag.Maskey@Sun.COM 106011767SAnurag.Maskey@Sun.COM /* 106111767SAnurag.Maskey@Sun.COM * Callback to disable all locations other than one to enable, the handle 106211767SAnurag.Maskey@Sun.COM * of which we pass in as an argument. If the argument is NULL, we disable 106311767SAnurag.Maskey@Sun.COM * all locations. 106411767SAnurag.Maskey@Sun.COM */ 106511767SAnurag.Maskey@Sun.COM static int 106611767SAnurag.Maskey@Sun.COM loc_set_enabled(nwam_loc_handle_t loch, void *data) 106711767SAnurag.Maskey@Sun.COM { 106811767SAnurag.Maskey@Sun.COM nwam_value_t enabledval; 106911767SAnurag.Maskey@Sun.COM boolean_t enabled = B_FALSE; 107011767SAnurag.Maskey@Sun.COM nwam_loc_handle_t testloch = data; 107111767SAnurag.Maskey@Sun.COM nwam_error_t err = NWAM_SUCCESS; 107211767SAnurag.Maskey@Sun.COM 107311767SAnurag.Maskey@Sun.COM if (testloch != NULL) { 107411767SAnurag.Maskey@Sun.COM char *name, *testname; 107511767SAnurag.Maskey@Sun.COM 107611767SAnurag.Maskey@Sun.COM if (nwam_loc_get_name(loch, &name) == NWAM_SUCCESS && 107711767SAnurag.Maskey@Sun.COM nwam_loc_get_name(testloch, &testname) == NWAM_SUCCESS && 107811767SAnurag.Maskey@Sun.COM strcmp(name, testname) == 0) { 107911767SAnurag.Maskey@Sun.COM /* We enable this location. */ 108011767SAnurag.Maskey@Sun.COM enabled = B_TRUE; 108111767SAnurag.Maskey@Sun.COM } 108211767SAnurag.Maskey@Sun.COM } 108311767SAnurag.Maskey@Sun.COM if (nwam_value_create_boolean(enabled, &enabledval) != NWAM_SUCCESS) 108411767SAnurag.Maskey@Sun.COM return (0); 108511767SAnurag.Maskey@Sun.COM if (nwam_set_prop_value(loch->nwh_data, NWAM_LOC_PROP_ENABLED, 108611767SAnurag.Maskey@Sun.COM enabledval) == NWAM_SUCCESS) 108711767SAnurag.Maskey@Sun.COM err = nwam_loc_commit(loch, NWAM_FLAG_ENTITY_ENABLE); 108811767SAnurag.Maskey@Sun.COM 108911767SAnurag.Maskey@Sun.COM nwam_value_free(enabledval); 109011767SAnurag.Maskey@Sun.COM return (err); 109111767SAnurag.Maskey@Sun.COM } 109211767SAnurag.Maskey@Sun.COM 109311767SAnurag.Maskey@Sun.COM /* 109411767SAnurag.Maskey@Sun.COM * Update the enabled property for this location (and for all others 109511767SAnurag.Maskey@Sun.COM * if necessary. 109611767SAnurag.Maskey@Sun.COM */ 109711767SAnurag.Maskey@Sun.COM static int 109811767SAnurag.Maskey@Sun.COM nwam_loc_update_enabled(nwam_loc_handle_t loch, boolean_t enabled) 109911767SAnurag.Maskey@Sun.COM { 110011767SAnurag.Maskey@Sun.COM nwam_error_t err; 110111767SAnurag.Maskey@Sun.COM int cb_ret; 110211767SAnurag.Maskey@Sun.COM 110311767SAnurag.Maskey@Sun.COM if (enabled) { 110411767SAnurag.Maskey@Sun.COM /* 110511767SAnurag.Maskey@Sun.COM * Disable all other locations that are manually enabled 110611767SAnurag.Maskey@Sun.COM * and enable this one - a maximum of 1 location can be 110711767SAnurag.Maskey@Sun.COM * enabled at once. 110811767SAnurag.Maskey@Sun.COM */ 110911767SAnurag.Maskey@Sun.COM err = nwam_walk_locs(loc_set_enabled, loch, 0, &cb_ret); 111011767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS && err != NWAM_WALK_HALTED) 111111767SAnurag.Maskey@Sun.COM cb_ret = err; 111211767SAnurag.Maskey@Sun.COM } else { 111311767SAnurag.Maskey@Sun.COM cb_ret = loc_set_enabled(loch, NULL); 111411767SAnurag.Maskey@Sun.COM } 111511767SAnurag.Maskey@Sun.COM return (cb_ret); 111611767SAnurag.Maskey@Sun.COM } 111711767SAnurag.Maskey@Sun.COM 111811767SAnurag.Maskey@Sun.COM nwam_error_t 111911767SAnurag.Maskey@Sun.COM nwam_loc_enable(nwam_loc_handle_t loch) 112011767SAnurag.Maskey@Sun.COM { 112111767SAnurag.Maskey@Sun.COM nwam_error_t err; 112211767SAnurag.Maskey@Sun.COM boolean_t enabled; 112311767SAnurag.Maskey@Sun.COM 112411767SAnurag.Maskey@Sun.COM assert(loch != NULL); 112511767SAnurag.Maskey@Sun.COM 112611767SAnurag.Maskey@Sun.COM /* Make sure location is not enabled */ 112711767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_is_enabled(loch, &enabled)) != NWAM_SUCCESS) 112811767SAnurag.Maskey@Sun.COM return (err); 112911767SAnurag.Maskey@Sun.COM if (enabled) 113011767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 113111767SAnurag.Maskey@Sun.COM 113211767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_update_enabled(loch, B_TRUE)) != NWAM_SUCCESS) 113311767SAnurag.Maskey@Sun.COM return (err); 113411767SAnurag.Maskey@Sun.COM 113511767SAnurag.Maskey@Sun.COM err = nwam_enable(NULL, loch); 113611767SAnurag.Maskey@Sun.COM 113711767SAnurag.Maskey@Sun.COM /* nwamd may not be running, that's okay. */ 113811767SAnurag.Maskey@Sun.COM if (err == NWAM_ERROR_BIND) 113911767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 114011767SAnurag.Maskey@Sun.COM else 114111767SAnurag.Maskey@Sun.COM return (err); 114211767SAnurag.Maskey@Sun.COM } 114311767SAnurag.Maskey@Sun.COM 114411767SAnurag.Maskey@Sun.COM nwam_error_t 114511767SAnurag.Maskey@Sun.COM nwam_loc_disable(nwam_loc_handle_t loch) 114611767SAnurag.Maskey@Sun.COM { 114711767SAnurag.Maskey@Sun.COM nwam_error_t err; 114811767SAnurag.Maskey@Sun.COM boolean_t enabled; 114911767SAnurag.Maskey@Sun.COM 115011767SAnurag.Maskey@Sun.COM assert(loch != NULL); 115111767SAnurag.Maskey@Sun.COM 115211767SAnurag.Maskey@Sun.COM /* Make sure location is enabled */ 115311767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_is_enabled(loch, &enabled)) != NWAM_SUCCESS) 115411767SAnurag.Maskey@Sun.COM return (err); 115511767SAnurag.Maskey@Sun.COM if (!enabled) 115611767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 115711767SAnurag.Maskey@Sun.COM 115811767SAnurag.Maskey@Sun.COM if ((err = nwam_loc_update_enabled(loch, B_FALSE)) != NWAM_SUCCESS) 115911767SAnurag.Maskey@Sun.COM return (err); 116011767SAnurag.Maskey@Sun.COM 116111767SAnurag.Maskey@Sun.COM err = nwam_disable(NULL, loch); 116211767SAnurag.Maskey@Sun.COM 116311767SAnurag.Maskey@Sun.COM /* nwamd may not be running, that's okay. */ 116411767SAnurag.Maskey@Sun.COM if (err == NWAM_ERROR_BIND) 116511767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS); 116611767SAnurag.Maskey@Sun.COM else 116711767SAnurag.Maskey@Sun.COM return (err); 116811767SAnurag.Maskey@Sun.COM } 116911767SAnurag.Maskey@Sun.COM 117011767SAnurag.Maskey@Sun.COM nwam_error_t 117111767SAnurag.Maskey@Sun.COM nwam_loc_get_default_proplist(const char ***prop_list, uint_t *numvaluesp) 117211767SAnurag.Maskey@Sun.COM { 117311767SAnurag.Maskey@Sun.COM return (nwam_get_default_proplist(loc_prop_table, 117411767SAnurag.Maskey@Sun.COM NWAM_TYPE_ANY, NWAM_CLASS_ANY, prop_list, numvaluesp)); 117511767SAnurag.Maskey@Sun.COM } 117611767SAnurag.Maskey@Sun.COM 117711767SAnurag.Maskey@Sun.COM nwam_error_t 117811767SAnurag.Maskey@Sun.COM nwam_loc_get_state(nwam_loc_handle_t loch, nwam_state_t *statep, 117911767SAnurag.Maskey@Sun.COM nwam_aux_state_t *auxp) 118011767SAnurag.Maskey@Sun.COM { 118111767SAnurag.Maskey@Sun.COM return (nwam_get_state(NULL, loch, statep, auxp)); 118211767SAnurag.Maskey@Sun.COM } 1183