16ba597c5SAnurag S. Maskey /*
26ba597c5SAnurag S. Maskey  * CDDL HEADER START
36ba597c5SAnurag S. Maskey  *
46ba597c5SAnurag S. Maskey  * The contents of this file are subject to the terms of the
56ba597c5SAnurag S. Maskey  * Common Development and Distribution License (the "License").
66ba597c5SAnurag S. Maskey  * You may not use this file except in compliance with the License.
76ba597c5SAnurag S. Maskey  *
86ba597c5SAnurag S. Maskey  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
96ba597c5SAnurag S. Maskey  * or http://www.opensolaris.org/os/licensing.
106ba597c5SAnurag S. Maskey  * See the License for the specific language governing permissions
116ba597c5SAnurag S. Maskey  * and limitations under the License.
126ba597c5SAnurag S. Maskey  *
136ba597c5SAnurag S. Maskey  * When distributing Covered Code, include this CDDL HEADER in each
146ba597c5SAnurag S. Maskey  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
156ba597c5SAnurag S. Maskey  * If applicable, add the following below this CDDL HEADER, with the
166ba597c5SAnurag S. Maskey  * fields enclosed by brackets "[]" replaced with your own identifying
176ba597c5SAnurag S. Maskey  * information: Portions Copyright [yyyy] [name of copyright owner]
186ba597c5SAnurag S. Maskey  *
196ba597c5SAnurag S. Maskey  * CDDL HEADER END
206ba597c5SAnurag S. Maskey  */
216ba597c5SAnurag S. Maskey 
226ba597c5SAnurag S. Maskey /*
23ea408ca7SAnurag S. Maskey  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
246ba597c5SAnurag S. Maskey  */
256ba597c5SAnurag S. Maskey 
266ba597c5SAnurag S. Maskey #include <assert.h>
276ba597c5SAnurag S. Maskey #include <ctype.h>
286ba597c5SAnurag S. Maskey #include <sys/param.h>
296ba597c5SAnurag S. Maskey #include <sys/types.h>
306ba597c5SAnurag S. Maskey #include <sys/stat.h>
316ba597c5SAnurag S. Maskey #include <stdio.h>
326ba597c5SAnurag S. Maskey #include <stdlib.h>
336ba597c5SAnurag S. Maskey #include <strings.h>
346ba597c5SAnurag S. Maskey #include <unistd.h>
356ba597c5SAnurag S. Maskey #include <libscf.h>
366ba597c5SAnurag S. Maskey 
376ba597c5SAnurag S. Maskey #include "libnwam_impl.h"
386ba597c5SAnurag S. Maskey #include <libnwam_priv.h>
396ba597c5SAnurag S. Maskey #include <libnwam.h>
406ba597c5SAnurag S. Maskey 
416ba597c5SAnurag S. Maskey /*
426ba597c5SAnurag S. Maskey  * Functions to support creating, modifying, destroying, querying the
436ba597c5SAnurag S. Maskey  * state of and changing the state of location objects. Locations
446ba597c5SAnurag S. Maskey  * represent the configuration to be applied once basic network configuration
456ba597c5SAnurag S. Maskey  * has been established - name services, IPsec config, etc, and can be enabled
466ba597c5SAnurag S. Maskey  * either manually or conditionally for a combination of the set of
476ba597c5SAnurag S. Maskey  * available conditions (an IP address is present, an ENM is active etc).
486ba597c5SAnurag S. Maskey  */
496ba597c5SAnurag S. Maskey 
506ba597c5SAnurag S. Maskey #define	NSSWITCH_PREFIX		"/etc/nsswitch."
516ba597c5SAnurag S. Maskey 
526ba597c5SAnurag S. Maskey typedef nwam_error_t (*nwam_loc_prop_validate_func_t)(nwam_value_t);
536ba597c5SAnurag S. Maskey 
546ba597c5SAnurag S. Maskey static nwam_error_t valid_loc_activation_mode(nwam_value_t);
556ba597c5SAnurag S. Maskey static nwam_error_t valid_loc_condition(nwam_value_t);
566ba597c5SAnurag S. Maskey static nwam_error_t valid_nameservices(nwam_value_t);
576ba597c5SAnurag S. Maskey static nwam_error_t valid_configsrc(nwam_value_t);
586ba597c5SAnurag S. Maskey 
596ba597c5SAnurag S. Maskey struct nwam_prop_table_entry loc_prop_table_entries[] = {
606ba597c5SAnurag S. Maskey 	{NWAM_LOC_PROP_ACTIVATION_MODE, NWAM_VALUE_TYPE_UINT64, B_FALSE, 1, 1,
616ba597c5SAnurag S. Maskey 	    valid_loc_activation_mode,
626ba597c5SAnurag S. Maskey 	    "specifies the location activation mode - valid values are:\n"
636ba597c5SAnurag S. Maskey 	    "\'manual\', \'conditional-any\' and \'conditional-all\'",
646ba597c5SAnurag S. Maskey 	    NWAM_TYPE_ANY, NWAM_CLASS_ANY},
656ba597c5SAnurag S. Maskey 	{NWAM_LOC_PROP_CONDITIONS, NWAM_VALUE_TYPE_STRING, B_FALSE, 0,
666ba597c5SAnurag S. Maskey 	    NWAM_MAX_NUM_VALUES, valid_loc_condition,
676ba597c5SAnurag S. Maskey 	    "specifies the activation condition. Conditions are of the form:\n"
686ba597c5SAnurag S. Maskey 	    "ncp|ncu|enm name is|is-not active\n"
696ba597c5SAnurag S. Maskey 	    "ip-address is|is-not|is-in-range|is-not-in-range| 1.2.3.4[/24]\n"
706ba597c5SAnurag S. Maskey 	    "advertised-domain is|is-not|contains|does-not-contain string\n"
716ba597c5SAnurag S. Maskey 	    "system-domain is|is-not|contains|does-not-contain string\n"
726ba597c5SAnurag S. Maskey 	    "essid is|is-not|contains|does-not-contain string\n"
736ba597c5SAnurag S. Maskey 	    "bssid is|is-not string",
746ba597c5SAnurag S. Maskey 	    NWAM_TYPE_ANY, NWAM_CLASS_ANY},
756ba597c5SAnurag S. Maskey 	{NWAM_LOC_PROP_ENABLED, NWAM_VALUE_TYPE_BOOLEAN, B_TRUE, 1, 1,
766ba597c5SAnurag S. Maskey 	    nwam_valid_boolean,
776ba597c5SAnurag S. Maskey 	    "specifies if location is to be enabled",
786ba597c5SAnurag S. Maskey 	    NWAM_TYPE_ANY, NWAM_CLASS_ANY},
796ba597c5SAnurag S. Maskey 	{NWAM_LOC_PROP_NAMESERVICES, NWAM_VALUE_TYPE_UINT64, B_FALSE, 1,
806ba597c5SAnurag S. Maskey 	    NWAM_MAX_NUM_VALUES, valid_nameservices,
816ba597c5SAnurag S. Maskey 	    "specifies name service(s) to be used - valid values are:\n"
826ba597c5SAnurag S. Maskey 	    "\'files\', \'dns\', \'nis\', and \'ldap\'",
836ba597c5SAnurag S. Maskey 	    NWAM_TYPE_ANY, NWAM_CLASS_ANY},
846ba597c5SAnurag S. Maskey 	{NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE, NWAM_VALUE_TYPE_STRING,
856ba597c5SAnurag S. Maskey 	    B_FALSE, 0, 1, nwam_valid_file,
866ba597c5SAnurag S. Maskey 	    "specifies path to configuration file for name services switch "
87*bbf21555SRichard Lowe 	    "for this location - see nsswitch.conf(5)",
886ba597c5SAnurag S. Maskey 	    NWAM_TYPE_ANY, NWAM_CLASS_ANY},
896ba597c5SAnurag S. Maskey 	{NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC, NWAM_VALUE_TYPE_UINT64,
906ba597c5SAnurag S. Maskey 	    B_FALSE, 0, NWAM_MAX_NUM_VALUES, valid_configsrc,
916ba597c5SAnurag S. Maskey 	    "specifies sources of DNS configuration parameters - valid values "
926ba597c5SAnurag S. Maskey 	    "are:\n\'dhcp\', or \'manual\'",
936ba597c5SAnurag S. Maskey 	    NWAM_TYPE_ANY, NWAM_CLASS_ANY},
946ba597c5SAnurag S. Maskey 	{NWAM_LOC_PROP_DNS_NAMESERVICE_DOMAIN, NWAM_VALUE_TYPE_STRING, B_FALSE,
956ba597c5SAnurag S. Maskey 	    0, 1, nwam_valid_domain,
966ba597c5SAnurag S. Maskey 	    "specifies DNS domain name to be set for this location",
976ba597c5SAnurag S. Maskey 	    NWAM_TYPE_ANY, NWAM_CLASS_ANY},
986ba597c5SAnurag S. Maskey 	{NWAM_LOC_PROP_DNS_NAMESERVICE_SERVERS, NWAM_VALUE_TYPE_STRING, B_FALSE,
996ba597c5SAnurag S. Maskey 	    0, NWAM_MAX_NUM_VALUES, nwam_valid_host_any,
1006ba597c5SAnurag S. Maskey 	    "specifies DNS server host address(es)",
1016ba597c5SAnurag S. Maskey 	    NWAM_TYPE_ANY, NWAM_CLASS_ANY},
1026ba597c5SAnurag S. Maskey 	{NWAM_LOC_PROP_DNS_NAMESERVICE_SEARCH, NWAM_VALUE_TYPE_STRING, B_FALSE,
1036ba597c5SAnurag S. Maskey 	    0, NWAM_MAX_NUM_VALUES, nwam_valid_domain,
1046ba597c5SAnurag S. Maskey 	    "specifies DNS search list for host name lookup",
1056ba597c5SAnurag S. Maskey 	    NWAM_TYPE_ANY, NWAM_CLASS_ANY},
1066ba597c5SAnurag S. Maskey 	{NWAM_LOC_PROP_NIS_NAMESERVICE_CONFIGSRC, NWAM_VALUE_TYPE_UINT64,
1076ba597c5SAnurag S. Maskey 	    B_FALSE, 0, NWAM_MAX_NUM_VALUES, valid_configsrc,
1086ba597c5SAnurag S. Maskey 	    "specifies sources of NIS configuration parameters - valid values "
1096ba597c5SAnurag S. Maskey 	    "are:\n\'dhcp\', or \'manual\'",
1106ba597c5SAnurag S. Maskey 	    NWAM_TYPE_ANY, NWAM_CLASS_ANY},
1116ba597c5SAnurag S. Maskey 	{NWAM_LOC_PROP_NIS_NAMESERVICE_SERVERS, NWAM_VALUE_TYPE_STRING, B_FALSE,
1126ba597c5SAnurag S. Maskey 	    0, NWAM_MAX_NUM_VALUES, nwam_valid_host_any,
1136ba597c5SAnurag S. Maskey 	    "specifies NIS server host address(es)",
1146ba597c5SAnurag S. Maskey 	    NWAM_TYPE_ANY, NWAM_CLASS_ANY},
1156ba597c5SAnurag S. Maskey 	{NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC, NWAM_VALUE_TYPE_UINT64,
1166ba597c5SAnurag S. Maskey 	    B_FALSE, 0, NWAM_MAX_NUM_VALUES, valid_configsrc,
1176ba597c5SAnurag S. Maskey 	    "specifies sources of NIS configuration parameters - currently, "
1186ba597c5SAnurag S. Maskey 	    "the only valid value is \'manual\'",
1196ba597c5SAnurag S. Maskey 	    NWAM_TYPE_ANY, NWAM_CLASS_ANY},
1206ba597c5SAnurag S. Maskey 	{NWAM_LOC_PROP_LDAP_NAMESERVICE_SERVERS, NWAM_VALUE_TYPE_STRING,
1216ba597c5SAnurag S. Maskey 	    B_FALSE, 0, NWAM_MAX_NUM_VALUES, nwam_valid_host_or_domain,
1226ba597c5SAnurag S. Maskey 	    "specifies LDAP server host address(es)",
1236ba597c5SAnurag S. Maskey 	    NWAM_TYPE_ANY, NWAM_CLASS_ANY},
1246ba597c5SAnurag S. Maskey 	{NWAM_LOC_PROP_DEFAULT_DOMAIN, NWAM_VALUE_TYPE_STRING, B_FALSE, 0, 1,
1256ba597c5SAnurag S. Maskey 	    nwam_valid_domain,
126*bbf21555SRichard Lowe 	    "specifies the domainname(8) to be set for this location",
1276ba597c5SAnurag S. Maskey 	    NWAM_TYPE_ANY, NWAM_CLASS_ANY},
1286ba597c5SAnurag S. Maskey 	{NWAM_LOC_PROP_NFSV4_DOMAIN, NWAM_VALUE_TYPE_STRING, B_FALSE, 0, 1,
1296ba597c5SAnurag S. Maskey 	    nwam_valid_domain,
1306ba597c5SAnurag S. Maskey 	    "specifies an NFSv4 domain for this location",
1316ba597c5SAnurag S. Maskey 	    NWAM_TYPE_ANY, NWAM_CLASS_ANY},
1326ba597c5SAnurag S. Maskey 	{NWAM_LOC_PROP_IPFILTER_CONFIG_FILE, NWAM_VALUE_TYPE_STRING, B_FALSE,
1336ba597c5SAnurag S. Maskey 	    0, 1, nwam_valid_file,
134*bbf21555SRichard Lowe 	    "specifies an absolute path to an ipf.conf(5) file for this "
1356ba597c5SAnurag S. Maskey 	    "location",
1366ba597c5SAnurag S. Maskey 	    NWAM_TYPE_ANY, NWAM_CLASS_ANY},
1376ba597c5SAnurag S. Maskey 	{NWAM_LOC_PROP_IPFILTER_V6_CONFIG_FILE, NWAM_VALUE_TYPE_STRING,
1386ba597c5SAnurag S. Maskey 	    B_FALSE, 0, 1, nwam_valid_file,
1396ba597c5SAnurag S. Maskey 	    "specifies an absolute path to an ipf6.conf file for this "
1406ba597c5SAnurag S. Maskey 	    "location",
1416ba597c5SAnurag S. Maskey 	    NWAM_TYPE_ANY, NWAM_CLASS_ANY},
1426ba597c5SAnurag S. Maskey 	{NWAM_LOC_PROP_IPNAT_CONFIG_FILE, NWAM_VALUE_TYPE_STRING, B_FALSE, 0,
1436ba597c5SAnurag S. Maskey 	    1, nwam_valid_file,
144*bbf21555SRichard Lowe 	    "specifies an absolute path to an ipnat.conf(5) file for this "
1456ba597c5SAnurag S. Maskey 	    "location",
1466ba597c5SAnurag S. Maskey 	    NWAM_TYPE_ANY, NWAM_CLASS_ANY},
1476ba597c5SAnurag S. Maskey 	{NWAM_LOC_PROP_IPPOOL_CONFIG_FILE, NWAM_VALUE_TYPE_STRING, B_FALSE, 0,
1486ba597c5SAnurag S. Maskey 	    1, nwam_valid_file,
149*bbf21555SRichard Lowe 	    "specifies an absolute path to an ippool.conf(5) file for this "
1506ba597c5SAnurag S. Maskey 	    "location",
1516ba597c5SAnurag S. Maskey 	    NWAM_TYPE_ANY, NWAM_CLASS_ANY},
1526ba597c5SAnurag S. Maskey 	{NWAM_LOC_PROP_IKE_CONFIG_FILE, NWAM_VALUE_TYPE_STRING, B_FALSE, 0, 1,
1536ba597c5SAnurag S. Maskey 	    nwam_valid_file,
1546ba597c5SAnurag S. Maskey 	    "specifies an absolute path to an ike config file "
155*bbf21555SRichard Lowe 	    "(see ike.config(5))",
1566ba597c5SAnurag S. Maskey 	    NWAM_TYPE_ANY, NWAM_CLASS_ANY},
1576ba597c5SAnurag S. Maskey 	{NWAM_LOC_PROP_IPSECPOLICY_CONFIG_FILE, NWAM_VALUE_TYPE_STRING,
1586ba597c5SAnurag S. Maskey 	    B_FALSE, 0, 1, nwam_valid_file,
1596ba597c5SAnurag S. Maskey 	    "specifies an absolute path to an IPsec policy configuration file "
160*bbf21555SRichard Lowe 	    "(see ipsecconf(8)",
1616ba597c5SAnurag S. Maskey 	    NWAM_TYPE_ANY, NWAM_CLASS_ANY},
1626ba597c5SAnurag S. Maskey };
1636ba597c5SAnurag S. Maskey 
1646ba597c5SAnurag S. Maskey #define	NWAM_NUM_LOC_PROPS	(sizeof (loc_prop_table_entries) / \
1656ba597c5SAnurag S. Maskey 				sizeof (*loc_prop_table_entries))
1666ba597c5SAnurag S. Maskey 
1676ba597c5SAnurag S. Maskey struct nwam_prop_table loc_prop_table =
1686ba597c5SAnurag S. Maskey 	{ NWAM_NUM_LOC_PROPS, loc_prop_table_entries };
1696ba597c5SAnurag S. Maskey 
1706ba597c5SAnurag S. Maskey static uint64_t
nwam_loc_activation_to_flag(nwam_activation_mode_t activation)1716ba597c5SAnurag S. Maskey nwam_loc_activation_to_flag(nwam_activation_mode_t activation)
1726ba597c5SAnurag S. Maskey {
1736ba597c5SAnurag S. Maskey 	switch (activation) {
1746ba597c5SAnurag S. Maskey 	case NWAM_ACTIVATION_MODE_MANUAL:
1756ba597c5SAnurag S. Maskey 		return (NWAM_FLAG_ACTIVATION_MODE_MANUAL);
1766ba597c5SAnurag S. Maskey 	case NWAM_ACTIVATION_MODE_SYSTEM:
1776ba597c5SAnurag S. Maskey 		return (NWAM_FLAG_ACTIVATION_MODE_SYSTEM);
1786ba597c5SAnurag S. Maskey 	case NWAM_ACTIVATION_MODE_CONDITIONAL_ANY:
1796ba597c5SAnurag S. Maskey 		return (NWAM_FLAG_ACTIVATION_MODE_CONDITIONAL_ANY);
1806ba597c5SAnurag S. Maskey 	case NWAM_ACTIVATION_MODE_CONDITIONAL_ALL:
1816ba597c5SAnurag S. Maskey 		return (NWAM_FLAG_ACTIVATION_MODE_CONDITIONAL_ALL);
1826ba597c5SAnurag S. Maskey 	default:
1836ba597c5SAnurag S. Maskey 		return (0);
1846ba597c5SAnurag S. Maskey 	}
1856ba597c5SAnurag S. Maskey }
1866ba597c5SAnurag S. Maskey 
1876ba597c5SAnurag S. Maskey nwam_error_t
nwam_loc_read(const char * name,uint64_t flags,nwam_loc_handle_t * lochp)1886ba597c5SAnurag S. Maskey nwam_loc_read(const char *name, uint64_t flags, nwam_loc_handle_t *lochp)
1896ba597c5SAnurag S. Maskey {
1906ba597c5SAnurag S. Maskey 	return (nwam_read(NWAM_OBJECT_TYPE_LOC, NWAM_LOC_CONF_FILE, name,
1916ba597c5SAnurag S. Maskey 	    flags, lochp));
1926ba597c5SAnurag S. Maskey }
1936ba597c5SAnurag S. Maskey 
1946ba597c5SAnurag S. Maskey nwam_error_t
nwam_loc_create(const char * name,nwam_loc_handle_t * lochp)1956ba597c5SAnurag S. Maskey nwam_loc_create(const char *name, nwam_loc_handle_t *lochp)
1966ba597c5SAnurag S. Maskey {
1976ba597c5SAnurag S. Maskey 	nwam_error_t err;
1986ba597c5SAnurag S. Maskey 	nwam_value_t val = NULL;
1996ba597c5SAnurag S. Maskey 	char *nsswitch = NULL;
2006ba597c5SAnurag S. Maskey 
2016ba597c5SAnurag S. Maskey 	assert(lochp != NULL && name != NULL);
2026ba597c5SAnurag S. Maskey 
2036ba597c5SAnurag S. Maskey 	if ((err = nwam_create(NWAM_OBJECT_TYPE_LOC, NWAM_LOC_CONF_FILE, name,
2046ba597c5SAnurag S. Maskey 	    lochp)) != NWAM_SUCCESS)
2056ba597c5SAnurag S. Maskey 		return (err);
2066ba597c5SAnurag S. Maskey 
2076ba597c5SAnurag S. Maskey 	/* Create new object list for loc */
2086ba597c5SAnurag S. Maskey 	if ((err = nwam_alloc_object_list(&((*lochp)->nwh_data)))
2096ba597c5SAnurag S. Maskey 	    != NWAM_SUCCESS)
2106ba597c5SAnurag S. Maskey 		goto finish;
2116ba597c5SAnurag S. Maskey 
2126ba597c5SAnurag S. Maskey 	/* NWAM_LOC_PROP_ACTIVATION_MODE is mandatory */
2136ba597c5SAnurag S. Maskey 	if ((err = nwam_value_create_uint64(NWAM_ACTIVATION_MODE_MANUAL, &val))
2146ba597c5SAnurag S. Maskey 	    != NWAM_SUCCESS) {
2156ba597c5SAnurag S. Maskey 		goto finish;
2166ba597c5SAnurag S. Maskey 	}
2176ba597c5SAnurag S. Maskey 	if ((err = nwam_set_prop_value((*lochp)->nwh_data,
2186ba597c5SAnurag S. Maskey 	    NWAM_LOC_PROP_ACTIVATION_MODE, val)) != NWAM_SUCCESS) {
2196ba597c5SAnurag S. Maskey 		goto finish;
2206ba597c5SAnurag S. Maskey 	}
2216ba597c5SAnurag S. Maskey 	nwam_value_free(val);
2226ba597c5SAnurag S. Maskey 	val = NULL;
2236ba597c5SAnurag S. Maskey 
2246ba597c5SAnurag S. Maskey 	/*
2256ba597c5SAnurag S. Maskey 	 * NWAM_LOC_PROP_ENABLED defaults to false.
2266ba597c5SAnurag S. Maskey 	 */
2276ba597c5SAnurag S. Maskey 	if ((err = nwam_value_create_boolean(B_FALSE, &val)) != NWAM_SUCCESS)
2286ba597c5SAnurag S. Maskey 		goto finish;
2296ba597c5SAnurag S. Maskey 	if ((err = nwam_set_prop_value((*lochp)->nwh_data,
2306ba597c5SAnurag S. Maskey 	    NWAM_LOC_PROP_ENABLED, val)) != NWAM_SUCCESS)
2316ba597c5SAnurag S. Maskey 		goto finish;
2326ba597c5SAnurag S. Maskey 	nwam_value_free(val);
2336ba597c5SAnurag S. Maskey 	val = NULL;
2346ba597c5SAnurag S. Maskey 
2356ba597c5SAnurag S. Maskey 	/*
2366ba597c5SAnurag S. Maskey 	 * Initialize name service properties: use DNS, configured
2376ba597c5SAnurag S. Maskey 	 * via DHCP, with default nsswitch (/etc/nsswitch.dns).
2386ba597c5SAnurag S. Maskey 	 */
2396ba597c5SAnurag S. Maskey 	if ((err = nwam_value_create_uint64(NWAM_NAMESERVICES_DNS, &val)) !=
2406ba597c5SAnurag S. Maskey 	    NWAM_SUCCESS)
2416ba597c5SAnurag S. Maskey 		goto finish;
2426ba597c5SAnurag S. Maskey 	if ((err = nwam_set_prop_value((*lochp)->nwh_data,
2436ba597c5SAnurag S. Maskey 	    NWAM_LOC_PROP_NAMESERVICES, val)) != NWAM_SUCCESS)
2446ba597c5SAnurag S. Maskey 		goto finish;
2456ba597c5SAnurag S. Maskey 	nwam_value_free(val);
2466ba597c5SAnurag S. Maskey 	val = NULL;
2476ba597c5SAnurag S. Maskey 
2486ba597c5SAnurag S. Maskey 	if ((err = nwam_value_create_uint64(NWAM_CONFIGSRC_DHCP, &val)) !=
2496ba597c5SAnurag S. Maskey 	    NWAM_SUCCESS)
2506ba597c5SAnurag S. Maskey 		goto finish;
2516ba597c5SAnurag S. Maskey 	if ((err = nwam_set_prop_value((*lochp)->nwh_data,
2526ba597c5SAnurag S. Maskey 	    NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC, val)) != NWAM_SUCCESS)
2536ba597c5SAnurag S. Maskey 		goto finish;
2546ba597c5SAnurag S. Maskey 	nwam_value_free(val);
2556ba597c5SAnurag S. Maskey 	val = NULL;
2566ba597c5SAnurag S. Maskey 
2576ba597c5SAnurag S. Maskey 	/* concatenate these two strings */
2586ba597c5SAnurag S. Maskey 	nsswitch = strdup(NSSWITCH_PREFIX NWAM_NAMESERVICES_DNS_STRING);
2596ba597c5SAnurag S. Maskey 	if (nsswitch == NULL) {
2606ba597c5SAnurag S. Maskey 		err = NWAM_NO_MEMORY;
2616ba597c5SAnurag S. Maskey 		goto finish;
2626ba597c5SAnurag S. Maskey 	}
2636ba597c5SAnurag S. Maskey 	if ((err = nwam_value_create_string(nsswitch, &val)) != NWAM_SUCCESS)
2646ba597c5SAnurag S. Maskey 		goto finish;
2656ba597c5SAnurag S. Maskey 	err = nwam_set_prop_value((*lochp)->nwh_data,
2666ba597c5SAnurag S. Maskey 	    NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE, val);
2676ba597c5SAnurag S. Maskey 
2686ba597c5SAnurag S. Maskey finish:
2696ba597c5SAnurag S. Maskey 	if (nsswitch != NULL)
2706ba597c5SAnurag S. Maskey 		free(nsswitch);
2716ba597c5SAnurag S. Maskey 	if (val != NULL)
2726ba597c5SAnurag S. Maskey 		nwam_value_free(val);
2736ba597c5SAnurag S. Maskey 	if (err != NWAM_SUCCESS) {
2746ba597c5SAnurag S. Maskey 		nwam_loc_free(*lochp);
2756ba597c5SAnurag S. Maskey 		*lochp = NULL;
2766ba597c5SAnurag S. Maskey 	}
2776ba597c5SAnurag S. Maskey 	return (err);
2786ba597c5SAnurag S. Maskey }
2796ba597c5SAnurag S. Maskey 
2806ba597c5SAnurag S. Maskey nwam_error_t
nwam_loc_get_name(nwam_loc_handle_t loch,char ** namep)2816ba597c5SAnurag S. Maskey nwam_loc_get_name(nwam_loc_handle_t loch, char **namep)
2826ba597c5SAnurag S. Maskey {
2836ba597c5SAnurag S. Maskey 	return (nwam_get_name(loch, namep));
2846ba597c5SAnurag S. Maskey }
2856ba597c5SAnurag S. Maskey 
2866ba597c5SAnurag S. Maskey nwam_error_t
nwam_loc_set_name(nwam_loc_handle_t loch,const char * name)2876ba597c5SAnurag S. Maskey nwam_loc_set_name(nwam_loc_handle_t loch, const char *name)
2886ba597c5SAnurag S. Maskey {
2896ba597c5SAnurag S. Maskey 	return (nwam_set_name(loch, name));
2906ba597c5SAnurag S. Maskey }
2916ba597c5SAnurag S. Maskey 
2926ba597c5SAnurag S. Maskey boolean_t
nwam_loc_can_set_name(nwam_loc_handle_t loch)2936ba597c5SAnurag S. Maskey nwam_loc_can_set_name(nwam_loc_handle_t loch)
2946ba597c5SAnurag S. Maskey {
2956ba597c5SAnurag S. Maskey 	return (!loch->nwh_committed);
2966ba597c5SAnurag S. Maskey }
2976ba597c5SAnurag S. Maskey 
2986ba597c5SAnurag S. Maskey /* ARGSUSED2 */
2996ba597c5SAnurag S. Maskey static int
loc_selectcb(struct nwam_handle * hp,uint64_t flags,void * data)3006ba597c5SAnurag S. Maskey loc_selectcb(struct nwam_handle *hp, uint64_t flags, void *data)
3016ba597c5SAnurag S. Maskey {
3026ba597c5SAnurag S. Maskey 	nwam_loc_handle_t loch = hp;
3036ba597c5SAnurag S. Maskey 	char *locname;
3046ba597c5SAnurag S. Maskey 	uint64_t activation, actflag, walkfilter;
3056ba597c5SAnurag S. Maskey 	nwam_value_t activationval;
3066ba597c5SAnurag S. Maskey 
3076ba597c5SAnurag S. Maskey 	/* Skip the Legacy location in all cases */
3086ba597c5SAnurag S. Maskey 	if (nwam_loc_get_name(loch, &locname) != NWAM_SUCCESS)
3096ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
3106ba597c5SAnurag S. Maskey 	if (strcmp(locname, NWAM_LOC_NAME_LEGACY) == 0) {
3116ba597c5SAnurag S. Maskey 		free(locname);
3126ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
3136ba597c5SAnurag S. Maskey 	}
3146ba597c5SAnurag S. Maskey 	free(locname);
3156ba597c5SAnurag S. Maskey 
3166ba597c5SAnurag S. Maskey 	/*
3176ba597c5SAnurag S. Maskey 	 * Get a bitmapped flag value corresponding to this loc's
3186ba597c5SAnurag S. Maskey 	 * activation.
3196ba597c5SAnurag S. Maskey 	 */
3206ba597c5SAnurag S. Maskey 	if (nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_ACTIVATION_MODE,
3216ba597c5SAnurag S. Maskey 	    &activationval) != NWAM_SUCCESS) {
3226ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
3236ba597c5SAnurag S. Maskey 	}
3246ba597c5SAnurag S. Maskey 	if (nwam_value_get_uint64(activationval, &activation) != NWAM_SUCCESS) {
3256ba597c5SAnurag S. Maskey 		nwam_value_free(activationval);
3266ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
3276ba597c5SAnurag S. Maskey 	}
3286ba597c5SAnurag S. Maskey 
3296ba597c5SAnurag S. Maskey 	actflag = nwam_loc_activation_to_flag(activation);
3306ba597c5SAnurag S. Maskey 	nwam_value_free(activationval);
3316ba597c5SAnurag S. Maskey 	if ((walkfilter = (flags & NWAM_WALK_FILTER_MASK)) == 0)
3326ba597c5SAnurag S. Maskey 		walkfilter = NWAM_FLAG_ACTIVATION_MODE_ALL;
3336ba597c5SAnurag S. Maskey 	if (actflag & walkfilter)
3346ba597c5SAnurag S. Maskey 		return (NWAM_SUCCESS);
3356ba597c5SAnurag S. Maskey 	return (NWAM_INVALID_ARG);
3366ba597c5SAnurag S. Maskey }
3376ba597c5SAnurag S. Maskey 
3386ba597c5SAnurag S. Maskey nwam_error_t
nwam_walk_locs(int (* cb)(nwam_loc_handle_t,void *),void * data,uint64_t flags,int * retp)3396ba597c5SAnurag S. Maskey nwam_walk_locs(int(*cb)(nwam_loc_handle_t, void *), void *data, uint64_t flags,
3406ba597c5SAnurag S. Maskey     int *retp)
3416ba597c5SAnurag S. Maskey {
3426ba597c5SAnurag S. Maskey 	nwam_error_t err = nwam_valid_flags(flags,
3436ba597c5SAnurag S. Maskey 	    NWAM_FLAG_ACTIVATION_MODE_ALL | NWAM_FLAG_BLOCKING);
3446ba597c5SAnurag S. Maskey 
3456ba597c5SAnurag S. Maskey 	if (err != NWAM_SUCCESS)
3466ba597c5SAnurag S. Maskey 		return (err);
3476ba597c5SAnurag S. Maskey 
3486ba597c5SAnurag S. Maskey 	return (nwam_walk(NWAM_OBJECT_TYPE_LOC, NWAM_LOC_CONF_FILE,
3496ba597c5SAnurag S. Maskey 	    cb, data, flags, retp, loc_selectcb));
3506ba597c5SAnurag S. Maskey }
3516ba597c5SAnurag S. Maskey 
3526ba597c5SAnurag S. Maskey void
nwam_loc_free(nwam_loc_handle_t loch)3536ba597c5SAnurag S. Maskey nwam_loc_free(nwam_loc_handle_t loch)
3546ba597c5SAnurag S. Maskey {
3556ba597c5SAnurag S. Maskey 	nwam_free(loch);
3566ba597c5SAnurag S. Maskey }
3576ba597c5SAnurag S. Maskey 
3586ba597c5SAnurag S. Maskey nwam_error_t
nwam_loc_delete_prop(nwam_loc_handle_t loch,const char * propname)3596ba597c5SAnurag S. Maskey nwam_loc_delete_prop(nwam_loc_handle_t loch, const char *propname)
3606ba597c5SAnurag S. Maskey {
3616ba597c5SAnurag S. Maskey 	nwam_error_t err;
3626ba597c5SAnurag S. Maskey 	boolean_t ro;
3636ba597c5SAnurag S. Maskey 	void *olddata;
3646ba597c5SAnurag S. Maskey 
3656ba597c5SAnurag S. Maskey 	assert(loch != NULL && propname != NULL);
3666ba597c5SAnurag S. Maskey 
3676ba597c5SAnurag S. Maskey 	if ((err = nwam_loc_prop_read_only(propname, &ro)) != NWAM_SUCCESS)
3686ba597c5SAnurag S. Maskey 		return (err);
3696ba597c5SAnurag S. Maskey 	if (ro)
3706ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_READ_ONLY);
3716ba597c5SAnurag S. Maskey 
3726ba597c5SAnurag S. Maskey 	/*
3736ba597c5SAnurag S. Maskey 	 * Duplicate data, remove property and validate. If validation
3746ba597c5SAnurag S. Maskey 	 * fails, revert to data duplicated prior to remove.
3756ba597c5SAnurag S. Maskey 	 */
3766ba597c5SAnurag S. Maskey 	if ((err = nwam_dup_object_list(loch->nwh_data, &olddata))
3776ba597c5SAnurag S. Maskey 	    != NWAM_SUCCESS)
3786ba597c5SAnurag S. Maskey 		return (err);
3796ba597c5SAnurag S. Maskey 	if ((err = nwam_delete_prop(loch->nwh_data, propname))
3806ba597c5SAnurag S. Maskey 	    != NWAM_SUCCESS) {
3816ba597c5SAnurag S. Maskey 		nwam_free_object_list(loch->nwh_data);
3826ba597c5SAnurag S. Maskey 		loch->nwh_data = olddata;
3836ba597c5SAnurag S. Maskey 		return (err);
3846ba597c5SAnurag S. Maskey 	}
3856ba597c5SAnurag S. Maskey 	if ((err = nwam_loc_validate(loch, NULL)) != NWAM_SUCCESS) {
3866ba597c5SAnurag S. Maskey 		nwam_free_object_list(loch->nwh_data);
3876ba597c5SAnurag S. Maskey 		loch->nwh_data = olddata;
3886ba597c5SAnurag S. Maskey 		return (err);
3896ba597c5SAnurag S. Maskey 	}
3906ba597c5SAnurag S. Maskey 	nwam_free_object_list(olddata);
3916ba597c5SAnurag S. Maskey 
3926ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
3936ba597c5SAnurag S. Maskey }
3946ba597c5SAnurag S. Maskey 
3956ba597c5SAnurag S. Maskey nwam_error_t
nwam_loc_set_prop_value(nwam_loc_handle_t loch,const char * propname,nwam_value_t value)3966ba597c5SAnurag S. Maskey nwam_loc_set_prop_value(nwam_loc_handle_t loch, const char *propname,
3976ba597c5SAnurag S. Maskey     nwam_value_t value)
3986ba597c5SAnurag S. Maskey {
3996ba597c5SAnurag S. Maskey 	nwam_error_t err;
4006ba597c5SAnurag S. Maskey 	boolean_t ro;
4016ba597c5SAnurag S. Maskey 
4026ba597c5SAnurag S. Maskey 	assert(loch != NULL && propname != NULL && value  != NULL);
4036ba597c5SAnurag S. Maskey 
4046ba597c5SAnurag S. Maskey 	if ((err = nwam_loc_validate_prop(loch, propname, value))
4056ba597c5SAnurag S. Maskey 	    != NWAM_SUCCESS ||
4066ba597c5SAnurag S. Maskey 	    (err = nwam_loc_prop_read_only(propname, &ro)) != NWAM_SUCCESS)
4076ba597c5SAnurag S. Maskey 		return (err);
4086ba597c5SAnurag S. Maskey 	if (ro)
4096ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_READ_ONLY);
4106ba597c5SAnurag S. Maskey 
4116ba597c5SAnurag S. Maskey 	return (nwam_set_prop_value(loch->nwh_data, propname, value));
4126ba597c5SAnurag S. Maskey }
4136ba597c5SAnurag S. Maskey 
4146ba597c5SAnurag S. Maskey nwam_error_t
nwam_loc_get_prop_value(nwam_loc_handle_t loch,const char * propname,nwam_value_t * valuep)4156ba597c5SAnurag S. Maskey nwam_loc_get_prop_value(nwam_loc_handle_t loch, const char *propname,
4166ba597c5SAnurag S. Maskey     nwam_value_t *valuep)
4176ba597c5SAnurag S. Maskey {
4186ba597c5SAnurag S. Maskey 	return (nwam_get_prop_value(loch->nwh_data, propname, valuep));
4196ba597c5SAnurag S. Maskey }
4206ba597c5SAnurag S. Maskey 
4216ba597c5SAnurag S. Maskey nwam_error_t
nwam_loc_walk_props(nwam_loc_handle_t loch,int (* cb)(const char *,nwam_value_t,void *),void * data,uint64_t flags,int * retp)4226ba597c5SAnurag S. Maskey nwam_loc_walk_props(nwam_loc_handle_t loch,
4236ba597c5SAnurag S. Maskey     int (*cb)(const char *, nwam_value_t, void *),
4246ba597c5SAnurag S. Maskey     void *data, uint64_t flags, int *retp)
4256ba597c5SAnurag S. Maskey {
4266ba597c5SAnurag S. Maskey 	return (nwam_walk_props(loch, cb, data, flags, retp));
4276ba597c5SAnurag S. Maskey }
4286ba597c5SAnurag S. Maskey 
4296ba597c5SAnurag S. Maskey nwam_error_t
nwam_loc_commit(nwam_loc_handle_t loch,uint64_t flags)4306ba597c5SAnurag S. Maskey nwam_loc_commit(nwam_loc_handle_t loch, uint64_t flags)
4316ba597c5SAnurag S. Maskey {
4326ba597c5SAnurag S. Maskey 	nwam_error_t err;
4336ba597c5SAnurag S. Maskey 
4346ba597c5SAnurag S. Maskey 	assert(loch != NULL && loch->nwh_data != NULL);
4356ba597c5SAnurag S. Maskey 
4366ba597c5SAnurag S. Maskey 	if ((err = nwam_loc_validate(loch, NULL)) != NWAM_SUCCESS)
4376ba597c5SAnurag S. Maskey 		return (err);
4386ba597c5SAnurag S. Maskey 
4396ba597c5SAnurag S. Maskey 	return (nwam_commit(NWAM_LOC_CONF_FILE, loch, flags));
4406ba597c5SAnurag S. Maskey }
4416ba597c5SAnurag S. Maskey 
4426ba597c5SAnurag S. Maskey nwam_error_t
nwam_loc_destroy(nwam_loc_handle_t loch,uint64_t flags)4436ba597c5SAnurag S. Maskey nwam_loc_destroy(nwam_loc_handle_t loch, uint64_t flags)
4446ba597c5SAnurag S. Maskey {
4456ba597c5SAnurag S. Maskey 	nwam_error_t err;
4466ba597c5SAnurag S. Maskey 	nwam_value_t actval;
4476ba597c5SAnurag S. Maskey 	uint64_t activation;
4486ba597c5SAnurag S. Maskey 
4496ba597c5SAnurag S. Maskey 	/*
4506ba597c5SAnurag S. Maskey 	 * Automatic and NoNet are not destroyable and Legacy is
4516ba597c5SAnurag S. Maskey 	 * destroyable by netadm only.  These have system activation-mode.
4526ba597c5SAnurag S. Maskey 	 */
4536ba597c5SAnurag S. Maskey 	if ((err = nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_ACTIVATION_MODE,
4546ba597c5SAnurag S. Maskey 	    &actval)) != NWAM_SUCCESS)
4556ba597c5SAnurag S. Maskey 		return (err);
4566ba597c5SAnurag S. Maskey 	err = nwam_value_get_uint64(actval, &activation);
4576ba597c5SAnurag S. Maskey 	nwam_value_free(actval);
4586ba597c5SAnurag S. Maskey 	if (err != NWAM_SUCCESS)
4596ba597c5SAnurag S. Maskey 		return (err);
4606ba597c5SAnurag S. Maskey 
4616ba597c5SAnurag S. Maskey 	if (activation == NWAM_ACTIVATION_MODE_SYSTEM) {
4626ba597c5SAnurag S. Maskey 		if (strcmp(loch->nwh_name, NWAM_LOC_NAME_LEGACY) == 0) {
46369b43529SMichael Hunter 			if (!nwam_uid_is_special())
4646ba597c5SAnurag S. Maskey 				return (NWAM_ENTITY_NOT_DESTROYABLE);
4656ba597c5SAnurag S. Maskey 		} else {
4666ba597c5SAnurag S. Maskey 			return (NWAM_ENTITY_NOT_DESTROYABLE);
4676ba597c5SAnurag S. Maskey 		}
4686ba597c5SAnurag S. Maskey 	}
4696ba597c5SAnurag S. Maskey 
4706ba597c5SAnurag S. Maskey 	return (nwam_destroy(NWAM_LOC_CONF_FILE, loch, flags));
4716ba597c5SAnurag S. Maskey }
4726ba597c5SAnurag S. Maskey 
4736ba597c5SAnurag S. Maskey nwam_error_t
nwam_loc_get_prop_description(const char * propname,const char ** descriptionp)4746ba597c5SAnurag S. Maskey nwam_loc_get_prop_description(const char *propname, const char **descriptionp)
4756ba597c5SAnurag S. Maskey {
4766ba597c5SAnurag S. Maskey 	return (nwam_get_prop_description(loc_prop_table, propname,
4776ba597c5SAnurag S. Maskey 	    descriptionp));
4786ba597c5SAnurag S. Maskey }
4796ba597c5SAnurag S. Maskey 
4806ba597c5SAnurag S. Maskey nwam_error_t
nwam_loc_prop_read_only(const char * propname,boolean_t * readp)4816ba597c5SAnurag S. Maskey nwam_loc_prop_read_only(const char *propname, boolean_t *readp)
4826ba597c5SAnurag S. Maskey {
4836ba597c5SAnurag S. Maskey 	return (nwam_prop_read_only(loc_prop_table, propname, readp));
4846ba597c5SAnurag S. Maskey }
4856ba597c5SAnurag S. Maskey 
4866ba597c5SAnurag S. Maskey static nwam_error_t
valid_loc_activation_mode(nwam_value_t value)4876ba597c5SAnurag S. Maskey valid_loc_activation_mode(nwam_value_t value)
4886ba597c5SAnurag S. Maskey {
4896ba597c5SAnurag S. Maskey 	uint64_t activation_mode;
4906ba597c5SAnurag S. Maskey 
4916ba597c5SAnurag S. Maskey 	if (nwam_value_get_uint64(value, &activation_mode) != NWAM_SUCCESS)
4926ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_INVALID_VALUE);
4936ba597c5SAnurag S. Maskey 
4946ba597c5SAnurag S. Maskey 	switch (activation_mode) {
4956ba597c5SAnurag S. Maskey 	case NWAM_ACTIVATION_MODE_MANUAL:
4966ba597c5SAnurag S. Maskey 	case NWAM_ACTIVATION_MODE_SYSTEM:
4976ba597c5SAnurag S. Maskey 	case NWAM_ACTIVATION_MODE_CONDITIONAL_ANY:
4986ba597c5SAnurag S. Maskey 	case NWAM_ACTIVATION_MODE_CONDITIONAL_ALL:
4996ba597c5SAnurag S. Maskey 		return (NWAM_SUCCESS);
5006ba597c5SAnurag S. Maskey 	}
5016ba597c5SAnurag S. Maskey 	return (NWAM_ENTITY_INVALID_VALUE);
5026ba597c5SAnurag S. Maskey }
5036ba597c5SAnurag S. Maskey 
5046ba597c5SAnurag S. Maskey /*
5056ba597c5SAnurag S. Maskey  * Identical to nwam_valid_condition(), except locations cannot specify other
5066ba597c5SAnurag S. Maskey  * location's activation as a condition, e.g. loc2 cannot specify
5076ba597c5SAnurag S. Maskey  * "loc1 is active" since only one location is active at a time, and
5086ba597c5SAnurag S. Maskey  * as a consequence the condition is unsatisfiable.
5096ba597c5SAnurag S. Maskey  */
5106ba597c5SAnurag S. Maskey nwam_error_t
valid_loc_condition(nwam_value_t value)5116ba597c5SAnurag S. Maskey valid_loc_condition(nwam_value_t value)
5126ba597c5SAnurag S. Maskey {
5136ba597c5SAnurag S. Maskey 	char **conditions;
5146ba597c5SAnurag S. Maskey 	uint_t i, numvalues;
5156ba597c5SAnurag S. Maskey 	nwam_condition_object_type_t object_type;
5166ba597c5SAnurag S. Maskey 	nwam_condition_t condition;
5176ba597c5SAnurag S. Maskey 
5186ba597c5SAnurag S. Maskey 	if (nwam_value_get_string_array(value, &conditions, &numvalues)
5196ba597c5SAnurag S. Maskey 	    != NWAM_SUCCESS)
5206ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_INVALID_VALUE);
5216ba597c5SAnurag S. Maskey 
5226ba597c5SAnurag S. Maskey 	for (i = 0; i < numvalues; i++) {
5236ba597c5SAnurag S. Maskey 		char *object_name = NULL;
5246ba597c5SAnurag S. Maskey 
5256ba597c5SAnurag S. Maskey 		if (nwam_condition_string_to_condition(conditions[i],
5266ba597c5SAnurag S. Maskey 		    &object_type, &condition, &object_name) != NWAM_SUCCESS)
5276ba597c5SAnurag S. Maskey 			return (NWAM_ENTITY_INVALID_VALUE);
5286ba597c5SAnurag S. Maskey 		if (object_type == NWAM_CONDITION_OBJECT_TYPE_LOC &&
5296ba597c5SAnurag S. Maskey 		    condition == NWAM_CONDITION_IS) {
5306ba597c5SAnurag S. Maskey 			free(object_name);
5316ba597c5SAnurag S. Maskey 			return (NWAM_ENTITY_INVALID_VALUE);
5326ba597c5SAnurag S. Maskey 		}
5336ba597c5SAnurag S. Maskey 		if (object_name != NULL)
5346ba597c5SAnurag S. Maskey 			free(object_name);
5356ba597c5SAnurag S. Maskey 	}
5366ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
5376ba597c5SAnurag S. Maskey }
5386ba597c5SAnurag S. Maskey 
5396ba597c5SAnurag S. Maskey static nwam_error_t
valid_nameservices(nwam_value_t value)5406ba597c5SAnurag S. Maskey valid_nameservices(nwam_value_t value)
5416ba597c5SAnurag S. Maskey {
5426ba597c5SAnurag S. Maskey 	uint64_t *nameservices;
5436ba597c5SAnurag S. Maskey 	uint_t i, numvalues;
5446ba597c5SAnurag S. Maskey 
5456ba597c5SAnurag S. Maskey 	if (nwam_value_get_uint64_array(value, &nameservices, &numvalues)
5466ba597c5SAnurag S. Maskey 	    != NWAM_SUCCESS)
5476ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_INVALID_VALUE);
5486ba597c5SAnurag S. Maskey 
5496ba597c5SAnurag S. Maskey 	for (i = 0; i < numvalues; i++) {
5506ba597c5SAnurag S. Maskey 		if (nameservices[i] > NWAM_NAMESERVICES_LDAP)
5516ba597c5SAnurag S. Maskey 			return (NWAM_ENTITY_INVALID_VALUE);
5526ba597c5SAnurag S. Maskey 	}
5536ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
5546ba597c5SAnurag S. Maskey }
5556ba597c5SAnurag S. Maskey 
5566ba597c5SAnurag S. Maskey static nwam_error_t
valid_configsrc(nwam_value_t value)5576ba597c5SAnurag S. Maskey valid_configsrc(nwam_value_t value)
5586ba597c5SAnurag S. Maskey {
5596ba597c5SAnurag S. Maskey 	uint64_t *configsrcs;
5606ba597c5SAnurag S. Maskey 	uint_t i, numvalues;
5616ba597c5SAnurag S. Maskey 
5626ba597c5SAnurag S. Maskey 	if (nwam_value_get_uint64_array(value, &configsrcs, &numvalues)
5636ba597c5SAnurag S. Maskey 	    != NWAM_SUCCESS)
5646ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_INVALID_VALUE);
5656ba597c5SAnurag S. Maskey 
5666ba597c5SAnurag S. Maskey 	for (i = 0; i < numvalues; i++) {
5676ba597c5SAnurag S. Maskey 		if (configsrcs[i] > NWAM_CONFIGSRC_DHCP)
5686ba597c5SAnurag S. Maskey 			return (NWAM_ENTITY_INVALID_VALUE);
5696ba597c5SAnurag S. Maskey 	}
5706ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
5716ba597c5SAnurag S. Maskey }
5726ba597c5SAnurag S. Maskey 
5736ba597c5SAnurag S. Maskey /*
5746ba597c5SAnurag S. Maskey  * Validates that the activation-mode is system for Automatic and NoNet
5756ba597c5SAnurag S. Maskey  * locations, and not system for all other locations.
5766ba597c5SAnurag S. Maskey  */
5776ba597c5SAnurag S. Maskey static nwam_error_t
nwam_loc_validate_activation_mode(nwam_loc_handle_t loch,nwam_value_t actval)5786ba597c5SAnurag S. Maskey nwam_loc_validate_activation_mode(nwam_loc_handle_t loch, nwam_value_t actval)
5796ba597c5SAnurag S. Maskey {
5806ba597c5SAnurag S. Maskey 	nwam_error_t err;
5816ba597c5SAnurag S. Maskey 	uint64_t activation;
5826ba597c5SAnurag S. Maskey 
5836ba597c5SAnurag S. Maskey 	if ((err = nwam_value_get_uint64(actval, &activation)) != NWAM_SUCCESS)
5846ba597c5SAnurag S. Maskey 		return (err);
5856ba597c5SAnurag S. Maskey 
5866ba597c5SAnurag S. Maskey 	if (NWAM_LOC_NAME_PRE_DEFINED(loch->nwh_name)) {
5876ba597c5SAnurag S. Maskey 		if (activation != NWAM_ACTIVATION_MODE_SYSTEM)
5886ba597c5SAnurag S. Maskey 			return (NWAM_ENTITY_INVALID_VALUE);
5896ba597c5SAnurag S. Maskey 	} else {
5906ba597c5SAnurag S. Maskey 		if (activation == NWAM_ACTIVATION_MODE_SYSTEM)
5916ba597c5SAnurag S. Maskey 			return (NWAM_ENTITY_INVALID_VALUE);
5926ba597c5SAnurag S. Maskey 	}
5936ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
5946ba597c5SAnurag S. Maskey }
5956ba597c5SAnurag S. Maskey 
5966ba597c5SAnurag S. Maskey /*
5976ba597c5SAnurag S. Maskey  * Helper function to validate one nameservice, used by
5986ba597c5SAnurag S. Maskey  * nwam_loc_validate_all_nameservices().
5996ba597c5SAnurag S. Maskey  *
6006ba597c5SAnurag S. Maskey  * requiredprop denotes the property that is mandatory when the
6016ba597c5SAnurag S. Maskey  * configsrcprop is manual.  errpropp is used to return the invalid
6026ba597c5SAnurag S. Maskey  * property.
6036ba597c5SAnurag S. Maskey  */
6046ba597c5SAnurag S. Maskey static nwam_error_t
nwam_loc_validate_one_nameservice(nwam_loc_handle_t loch,const char * configsrcprop,const char * requiredprop,const char ** errpropp)6056ba597c5SAnurag S. Maskey nwam_loc_validate_one_nameservice(nwam_loc_handle_t loch,
6066ba597c5SAnurag S. Maskey     const char *configsrcprop, const char *requiredprop, const char **errpropp)
6076ba597c5SAnurag S. Maskey {
6086ba597c5SAnurag S. Maskey 	nwam_value_t configsrcval, requiredval;
6096ba597c5SAnurag S. Maskey 	uint64_t *configsrcs;
6106ba597c5SAnurag S. Maskey 	uint_t i, numvalues;
6116ba597c5SAnurag S. Maskey 
6126ba597c5SAnurag S. Maskey 	if (nwam_loc_get_prop_value(loch, configsrcprop, &configsrcval)
6136ba597c5SAnurag S. Maskey 	    != NWAM_SUCCESS) {
6146ba597c5SAnurag S. Maskey 		if (errpropp != NULL)
6156ba597c5SAnurag S. Maskey 			*errpropp = configsrcprop;
6166ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_MISSING_MEMBER);
6176ba597c5SAnurag S. Maskey 	}
6186ba597c5SAnurag S. Maskey 
6196ba597c5SAnurag S. Maskey 	if (nwam_value_get_uint64_array(configsrcval, &configsrcs, &numvalues)
6206ba597c5SAnurag S. Maskey 	    != NWAM_SUCCESS) {
6216ba597c5SAnurag S. Maskey 		if (errpropp != NULL)
6226ba597c5SAnurag S. Maskey 			*errpropp = configsrcprop;
6236ba597c5SAnurag S. Maskey 		nwam_value_free(configsrcval);
6246ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_NO_VALUE);
6256ba597c5SAnurag S. Maskey 	}
6266ba597c5SAnurag S. Maskey 
6276ba597c5SAnurag S. Maskey 	/* If -configsrc is manual, requiredprop is required */
6286ba597c5SAnurag S. Maskey 	for (i = 0; i < numvalues; i++) {
6296ba597c5SAnurag S. Maskey 		if (configsrcs[i] == NWAM_CONFIGSRC_MANUAL) {
6306ba597c5SAnurag S. Maskey 			if (nwam_loc_get_prop_value(loch, requiredprop,
6316ba597c5SAnurag S. Maskey 			    &requiredval) != NWAM_SUCCESS) {
6326ba597c5SAnurag S. Maskey 				if (errpropp != NULL)
6336ba597c5SAnurag S. Maskey 					*errpropp = requiredprop;
6346ba597c5SAnurag S. Maskey 				return (NWAM_ENTITY_MISSING_MEMBER);
6356ba597c5SAnurag S. Maskey 			}
6366ba597c5SAnurag S. Maskey 			nwam_value_free(requiredval);
6376ba597c5SAnurag S. Maskey 		}
6386ba597c5SAnurag S. Maskey 	}
6396ba597c5SAnurag S. Maskey 	nwam_value_free(configsrcval);
6406ba597c5SAnurag S. Maskey 
6416ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
6426ba597c5SAnurag S. Maskey }
6436ba597c5SAnurag S. Maskey 
6446ba597c5SAnurag S. Maskey /*
6456ba597c5SAnurag S. Maskey  * Helper function to validate LDAP nameservice, used by
6466ba597c5SAnurag S. Maskey  * nwam_loc_validate_all_nameservices().  Separated because LDAP must be
6476ba597c5SAnurag S. Maskey  * configured manually only and both default-domain and -servers are required.
6486ba597c5SAnurag S. Maskey  */
6496ba597c5SAnurag S. Maskey static nwam_error_t
nwam_loc_validate_ldap_nameservice(nwam_loc_handle_t loch,const char ** errpropp)6506ba597c5SAnurag S. Maskey nwam_loc_validate_ldap_nameservice(nwam_loc_handle_t loch,
6516ba597c5SAnurag S. Maskey     const char **errpropp)
6526ba597c5SAnurag S. Maskey {
6536ba597c5SAnurag S. Maskey 	nwam_value_t val;
6546ba597c5SAnurag S. Maskey 	uint64_t *configsrcs;
6556ba597c5SAnurag S. Maskey 	uint_t i, numvalues;
6566ba597c5SAnurag S. Maskey 
6576ba597c5SAnurag S. Maskey 	if (nwam_loc_get_prop_value(loch,
6586ba597c5SAnurag S. Maskey 	    NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC, &val) != NWAM_SUCCESS) {
6596ba597c5SAnurag S. Maskey 		if (errpropp != NULL)
6606ba597c5SAnurag S. Maskey 			*errpropp = NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC;
6616ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_MISSING_MEMBER);
6626ba597c5SAnurag S. Maskey 	}
6636ba597c5SAnurag S. Maskey 	/* -configsrc is defined as an array */
6646ba597c5SAnurag S. Maskey 	if (nwam_value_get_uint64_array(val, &configsrcs, &numvalues)
6656ba597c5SAnurag S. Maskey 	    != NWAM_SUCCESS) {
6666ba597c5SAnurag S. Maskey 		if (errpropp != NULL)
6676ba597c5SAnurag S. Maskey 			*errpropp = NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC;
6686ba597c5SAnurag S. Maskey 		nwam_value_free(val);
6696ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_NO_VALUE);
6706ba597c5SAnurag S. Maskey 	}
6716ba597c5SAnurag S. Maskey 
6726ba597c5SAnurag S. Maskey 	/* -configsrc must be manual */
6736ba597c5SAnurag S. Maskey 	for (i = 0; i < numvalues; i++) {
6746ba597c5SAnurag S. Maskey 		if (configsrcs[i] != NWAM_CONFIGSRC_MANUAL) {
6756ba597c5SAnurag S. Maskey 			if (errpropp != NULL)
6766ba597c5SAnurag S. Maskey 				*errpropp =
6776ba597c5SAnurag S. Maskey 				    NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC;
6786ba597c5SAnurag S. Maskey 			nwam_value_free(val);
6796ba597c5SAnurag S. Maskey 			return (NWAM_ENTITY_INVALID_VALUE);
6806ba597c5SAnurag S. Maskey 		}
6816ba597c5SAnurag S. Maskey 	}
6826ba597c5SAnurag S. Maskey 	nwam_value_free(val);
6836ba597c5SAnurag S. Maskey 
6846ba597c5SAnurag S. Maskey 	/* both default-domain and -servers are required */
6856ba597c5SAnurag S. Maskey 	if (nwam_loc_get_prop_value(loch,
6866ba597c5SAnurag S. Maskey 	    NWAM_LOC_PROP_DEFAULT_DOMAIN, &val) != NWAM_SUCCESS) {
6876ba597c5SAnurag S. Maskey 		if (errpropp != NULL)
6886ba597c5SAnurag S. Maskey 			*errpropp = NWAM_LOC_PROP_DEFAULT_DOMAIN;
6896ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_MISSING_MEMBER);
6906ba597c5SAnurag S. Maskey 	}
6916ba597c5SAnurag S. Maskey 	nwam_value_free(val);
6926ba597c5SAnurag S. Maskey 
6936ba597c5SAnurag S. Maskey 	if (nwam_loc_get_prop_value(loch,
6946ba597c5SAnurag S. Maskey 	    NWAM_LOC_PROP_LDAP_NAMESERVICE_SERVERS, &val) != NWAM_SUCCESS) {
6956ba597c5SAnurag S. Maskey 		if (errpropp != NULL)
6966ba597c5SAnurag S. Maskey 			*errpropp = NWAM_LOC_PROP_LDAP_NAMESERVICE_SERVERS;
6976ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_MISSING_MEMBER);
6986ba597c5SAnurag S. Maskey 	}
6996ba597c5SAnurag S. Maskey 	nwam_value_free(val);
7006ba597c5SAnurag S. Maskey 
7016ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
7026ba597c5SAnurag S. Maskey }
7036ba597c5SAnurag S. Maskey 
7046ba597c5SAnurag S. Maskey /*
7056ba597c5SAnurag S. Maskey  * Validates the different nameservices properties.
7066ba597c5SAnurag S. Maskey  *
7076ba597c5SAnurag S. Maskey  * If "nameservices" property has more than one nameservice to configure,
7086ba597c5SAnurag S. Maskey  * "nameservices-config-file" must be specified.  If only one nameservice
7096ba597c5SAnurag S. Maskey  * is configured and "nameservices-config-file" is missing, set the
7106ba597c5SAnurag S. Maskey  * property with the appropriately suffixed nsswitch file.
7116ba597c5SAnurag S. Maskey  *
7126ba597c5SAnurag S. Maskey  * For any nameservice being configured, the respective -configsrc property
7136ba597c5SAnurag S. Maskey  * must be specified.  For DNS, -servers is required if -configsrc is
7146ba597c5SAnurag S. Maskey  * manual.  For NIS and LDAP, default-domain is required if -configsrc is
7156ba597c5SAnurag S. Maskey  * manual.  For LDAP, -configsrc must be manual and -servers is required.
7166ba597c5SAnurag S. Maskey  */
7176ba597c5SAnurag S. Maskey static nwam_error_t
nwam_loc_validate_all_nameservices(nwam_loc_handle_t loch,nwam_value_t nameservicesval,const char ** errpropp)7186ba597c5SAnurag S. Maskey nwam_loc_validate_all_nameservices(nwam_loc_handle_t loch,
7196ba597c5SAnurag S. Maskey     nwam_value_t nameservicesval, const char **errpropp)
7206ba597c5SAnurag S. Maskey {
7216ba597c5SAnurag S. Maskey 	nwam_error_t err;
7226ba597c5SAnurag S. Maskey 	nwam_value_t val;
7236ba597c5SAnurag S. Maskey 	uint64_t *nameservices;
7246ba597c5SAnurag S. Maskey 	uint_t i, numvalues;
7256ba597c5SAnurag S. Maskey 
7266ba597c5SAnurag S. Maskey 	if ((err = nwam_value_get_uint64_array(nameservicesval, &nameservices,
7276ba597c5SAnurag S. Maskey 	    &numvalues)) != NWAM_SUCCESS)
7286ba597c5SAnurag S. Maskey 		return (err);
7296ba597c5SAnurag S. Maskey 
7306ba597c5SAnurag S. Maskey 	/*
7316ba597c5SAnurag S. Maskey 	 * nameservices-config-file is required if nameservices has more
7326ba597c5SAnurag S. Maskey 	 * than one value.
7336ba597c5SAnurag S. Maskey 	 */
7346ba597c5SAnurag S. Maskey 	if (numvalues > 1) {
7356ba597c5SAnurag S. Maskey 		if (nwam_loc_get_prop_value(loch,
7366ba597c5SAnurag S. Maskey 		    NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE, &val)
7376ba597c5SAnurag S. Maskey 		    != NWAM_SUCCESS) {
7386ba597c5SAnurag S. Maskey 			if (errpropp != NULL)
7396ba597c5SAnurag S. Maskey 				*errpropp =
7406ba597c5SAnurag S. Maskey 				    NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE;
7416ba597c5SAnurag S. Maskey 			return (NWAM_ENTITY_MISSING_MEMBER);
7426ba597c5SAnurag S. Maskey 		}
7436ba597c5SAnurag S. Maskey 		nwam_value_free(val);
7446ba597c5SAnurag S. Maskey 	} else if (numvalues == 1) {
7456ba597c5SAnurag S. Maskey 		/*
7466ba597c5SAnurag S. Maskey 		 * If only one nameservice is being configured and
7476ba597c5SAnurag S. Maskey 		 * nameservices-config-file doesn't exist, create it to
7486ba597c5SAnurag S. Maskey 		 * point to the respective nsswitch file.
7496ba597c5SAnurag S. Maskey 		 */
7506ba597c5SAnurag S. Maskey 		err = nwam_loc_get_prop_value(loch,
7516ba597c5SAnurag S. Maskey 		    NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE, &val);
7526ba597c5SAnurag S. Maskey 		if (err == NWAM_INVALID_ARG || err == NWAM_ENTITY_NOT_FOUND) {
7536ba597c5SAnurag S. Maskey 			char *nsswitch;
7546ba597c5SAnurag S. Maskey 			const char *nsswitch_suffix;
7556ba597c5SAnurag S. Maskey 
7566ba597c5SAnurag S. Maskey 			/* get the single nameservice being configured */
7576ba597c5SAnurag S. Maskey 			if ((err = nwam_uint64_get_value_string(
7586ba597c5SAnurag S. Maskey 			    NWAM_LOC_PROP_NAMESERVICES, nameservices[0],
7596ba597c5SAnurag S. Maskey 			    &nsswitch_suffix)) != NWAM_SUCCESS)
7606ba597c5SAnurag S. Maskey 				goto config_file_fail;
7616ba597c5SAnurag S. Maskey 			if ((nsswitch = malloc(MAXPATHLEN)) == NULL) {
7626ba597c5SAnurag S. Maskey 				err = NWAM_NO_MEMORY;
7636ba597c5SAnurag S. Maskey 				goto config_file_fail;
7646ba597c5SAnurag S. Maskey 			}
7656ba597c5SAnurag S. Maskey 
7666ba597c5SAnurag S. Maskey 			/* create appropriately suffixed nsswitch name */
7676ba597c5SAnurag S. Maskey 			(void) snprintf(nsswitch, MAXPATHLEN, "%s%s",
7686ba597c5SAnurag S. Maskey 			    NSSWITCH_PREFIX, nsswitch_suffix);
7696ba597c5SAnurag S. Maskey 			if ((err = nwam_value_create_string(nsswitch, &val))
7706ba597c5SAnurag S. Maskey 			    != NWAM_SUCCESS) {
7716ba597c5SAnurag S. Maskey 				free(nsswitch);
7726ba597c5SAnurag S. Maskey 				goto config_file_fail;
7736ba597c5SAnurag S. Maskey 			}
7746ba597c5SAnurag S. Maskey 
7756ba597c5SAnurag S. Maskey 			err = nwam_set_prop_value(loch->nwh_data,
7766ba597c5SAnurag S. Maskey 			    NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE, val);
7776ba597c5SAnurag S. Maskey 			free(nsswitch);
7786ba597c5SAnurag S. Maskey 			nwam_value_free(val);
7796ba597c5SAnurag S. Maskey 			if (err != NWAM_SUCCESS) {
7806ba597c5SAnurag S. Maskey 				nwam_value_free(val);
7816ba597c5SAnurag S. Maskey 				goto config_file_fail;
7826ba597c5SAnurag S. Maskey 			}
7836ba597c5SAnurag S. Maskey 		} else if (err != NWAM_SUCCESS) {
7846ba597c5SAnurag S. Maskey 			goto config_file_fail;
7856ba597c5SAnurag S. Maskey 		} else {
7866ba597c5SAnurag S. Maskey 			nwam_value_free(val);
7876ba597c5SAnurag S. Maskey 		}
7886ba597c5SAnurag S. Maskey 	}
7896ba597c5SAnurag S. Maskey 
7906ba597c5SAnurag S. Maskey 	/*
7916ba597c5SAnurag S. Maskey 	 * validate the -configsrc property and the required default-domain
7926ba597c5SAnurag S. Maskey 	 * and/or -servers property for each nameservice being configured.
7936ba597c5SAnurag S. Maskey 	 */
7946ba597c5SAnurag S. Maskey 	for (i = 0; i < numvalues; i++) {
7956ba597c5SAnurag S. Maskey 		switch (nameservices[i]) {
7966ba597c5SAnurag S. Maskey 		case NWAM_NAMESERVICES_DNS:
7976ba597c5SAnurag S. Maskey 			if ((err = nwam_loc_validate_one_nameservice(loch,
7986ba597c5SAnurag S. Maskey 			    NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC,
7996ba597c5SAnurag S. Maskey 			    NWAM_LOC_PROP_DNS_NAMESERVICE_SERVERS, errpropp))
8006ba597c5SAnurag S. Maskey 			    != NWAM_SUCCESS)
8016ba597c5SAnurag S. Maskey 				return (err);
8026ba597c5SAnurag S. Maskey 			break;
8036ba597c5SAnurag S. Maskey 		case NWAM_NAMESERVICES_NIS:
8046ba597c5SAnurag S. Maskey 			if ((err = nwam_loc_validate_one_nameservice(loch,
8056ba597c5SAnurag S. Maskey 			    NWAM_LOC_PROP_NIS_NAMESERVICE_CONFIGSRC,
8066ba597c5SAnurag S. Maskey 			    NWAM_LOC_PROP_DEFAULT_DOMAIN, errpropp))
8076ba597c5SAnurag S. Maskey 			    != NWAM_SUCCESS)
8086ba597c5SAnurag S. Maskey 				return (err);
8096ba597c5SAnurag S. Maskey 			break;
8106ba597c5SAnurag S. Maskey 		case NWAM_NAMESERVICES_LDAP:
8116ba597c5SAnurag S. Maskey 			if ((err = nwam_loc_validate_ldap_nameservice(loch,
8126ba597c5SAnurag S. Maskey 			    errpropp)) != NWAM_SUCCESS)
8136ba597c5SAnurag S. Maskey 				return (err);
8146ba597c5SAnurag S. Maskey 			break;
8156ba597c5SAnurag S. Maskey 		case NWAM_NAMESERVICES_FILES:
8166ba597c5SAnurag S. Maskey 			break;
8176ba597c5SAnurag S. Maskey 		default:
8186ba597c5SAnurag S. Maskey 			return (NWAM_ENTITY_INVALID_VALUE);
8196ba597c5SAnurag S. Maskey 		}
8206ba597c5SAnurag S. Maskey 	}
8216ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
8226ba597c5SAnurag S. Maskey 
8236ba597c5SAnurag S. Maskey config_file_fail:
8246ba597c5SAnurag S. Maskey 	if (errpropp != NULL)
8256ba597c5SAnurag S. Maskey 		*errpropp =  NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE;
8266ba597c5SAnurag S. Maskey 	return (err);
8276ba597c5SAnurag S. Maskey }
8286ba597c5SAnurag S. Maskey 
8296ba597c5SAnurag S. Maskey nwam_error_t
nwam_loc_validate(nwam_loc_handle_t loch,const char ** errpropp)8306ba597c5SAnurag S. Maskey nwam_loc_validate(nwam_loc_handle_t loch, const char **errpropp)
8316ba597c5SAnurag S. Maskey {
8326ba597c5SAnurag S. Maskey 	nwam_error_t err;
8336ba597c5SAnurag S. Maskey 	nwam_value_t activationval, conditionval, nameservicesval;
8346ba597c5SAnurag S. Maskey 	uint64_t activation;
8356ba597c5SAnurag S. Maskey 	char **conditions, *name;
8366ba597c5SAnurag S. Maskey 	uint_t i, numvalues;
8376ba597c5SAnurag S. Maskey 	nwam_condition_object_type_t object_type;
8386ba597c5SAnurag S. Maskey 	nwam_condition_t condition;
8396ba597c5SAnurag S. Maskey 
8406ba597c5SAnurag S. Maskey 	assert(loch != NULL);
8416ba597c5SAnurag S. Maskey 
8426ba597c5SAnurag S. Maskey 	/*
8436ba597c5SAnurag S. Maskey 	 * Make sure loc is internally consistent: if activation type is
8446ba597c5SAnurag S. Maskey 	 * conditional, the condition string must be specified.
8456ba597c5SAnurag S. Maskey 	 */
8466ba597c5SAnurag S. Maskey 	if (nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_ACTIVATION_MODE,
8476ba597c5SAnurag S. Maskey 	    &activationval) != NWAM_SUCCESS) {
8486ba597c5SAnurag S. Maskey 		if (errpropp != NULL)
8496ba597c5SAnurag S. Maskey 			*errpropp = NWAM_LOC_PROP_ACTIVATION_MODE;
8506ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_MISSING_MEMBER);
8516ba597c5SAnurag S. Maskey 	}
8526ba597c5SAnurag S. Maskey 
8536ba597c5SAnurag S. Maskey 	if (nwam_value_get_uint64(activationval, &activation)
8546ba597c5SAnurag S. Maskey 	    != NWAM_SUCCESS) {
8556ba597c5SAnurag S. Maskey 		if (errpropp != NULL)
8566ba597c5SAnurag S. Maskey 			*errpropp = NWAM_LOC_PROP_ACTIVATION_MODE;
8576ba597c5SAnurag S. Maskey 		nwam_value_free(activationval);
8586ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_NO_VALUE);
8596ba597c5SAnurag S. Maskey 	}
8606ba597c5SAnurag S. Maskey 
8616ba597c5SAnurag S. Maskey 	/* validate activation against the location first */
8626ba597c5SAnurag S. Maskey 	if ((err = nwam_loc_validate_activation_mode(loch, activationval))
8636ba597c5SAnurag S. Maskey 	    != NWAM_SUCCESS) {
8646ba597c5SAnurag S. Maskey 		if (errpropp != NULL)
8656ba597c5SAnurag S. Maskey 			*errpropp = NWAM_LOC_PROP_ACTIVATION_MODE;
8666ba597c5SAnurag S. Maskey 		nwam_value_free(activationval);
8676ba597c5SAnurag S. Maskey 		return (err);
8686ba597c5SAnurag S. Maskey 	}
8696ba597c5SAnurag S. Maskey 	nwam_value_free(activationval);
8706ba597c5SAnurag S. Maskey 
8716ba597c5SAnurag S. Maskey 	if (activation == NWAM_ACTIVATION_MODE_CONDITIONAL_ANY ||
8726ba597c5SAnurag S. Maskey 	    activation == NWAM_ACTIVATION_MODE_CONDITIONAL_ALL) {
8736ba597c5SAnurag S. Maskey 		if (nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_CONDITIONS,
8746ba597c5SAnurag S. Maskey 		    &conditionval) != NWAM_SUCCESS) {
8756ba597c5SAnurag S. Maskey 			if (errpropp != NULL)
8766ba597c5SAnurag S. Maskey 				*errpropp = NWAM_LOC_PROP_CONDITIONS;
8776ba597c5SAnurag S. Maskey 			return (NWAM_ENTITY_MISSING_MEMBER);
8786ba597c5SAnurag S. Maskey 		}
8796ba597c5SAnurag S. Maskey 		/*
8806ba597c5SAnurag S. Maskey 		 * Are conditions self-referential? In other words, do any
8816ba597c5SAnurag S. Maskey 		 * of the activation conditions refer to this location?
8826ba597c5SAnurag S. Maskey 		 */
8836ba597c5SAnurag S. Maskey 		if (nwam_value_get_string_array(conditionval, &conditions,
8846ba597c5SAnurag S. Maskey 		    &numvalues) != NWAM_SUCCESS) {
8856ba597c5SAnurag S. Maskey 			nwam_value_free(conditionval);
8866ba597c5SAnurag S. Maskey 			if (errpropp != NULL)
8876ba597c5SAnurag S. Maskey 				*errpropp = NWAM_LOC_PROP_CONDITIONS;
8886ba597c5SAnurag S. Maskey 			return (NWAM_ENTITY_INVALID_VALUE);
8896ba597c5SAnurag S. Maskey 		}
8906ba597c5SAnurag S. Maskey 		if (nwam_loc_get_name(loch, &name) != NWAM_SUCCESS) {
8916ba597c5SAnurag S. Maskey 			nwam_value_free(conditionval);
8926ba597c5SAnurag S. Maskey 			return (NWAM_INVALID_ARG);
8936ba597c5SAnurag S. Maskey 		}
8946ba597c5SAnurag S. Maskey 		for (i = 0; i < numvalues; i++) {
8956ba597c5SAnurag S. Maskey 			char *object_name = NULL;
8966ba597c5SAnurag S. Maskey 
8976ba597c5SAnurag S. Maskey 			if (nwam_condition_string_to_condition(conditions[i],
8986ba597c5SAnurag S. Maskey 			    &object_type, &condition, &object_name)
8996ba597c5SAnurag S. Maskey 			    != NWAM_SUCCESS) {
9006ba597c5SAnurag S. Maskey 				if (errpropp != NULL)
9016ba597c5SAnurag S. Maskey 					*errpropp = NWAM_LOC_PROP_CONDITIONS;
9026ba597c5SAnurag S. Maskey 				free(name);
9036ba597c5SAnurag S. Maskey 				nwam_value_free(conditionval);
9046ba597c5SAnurag S. Maskey 				return (NWAM_ENTITY_INVALID_VALUE);
9056ba597c5SAnurag S. Maskey 			}
9066ba597c5SAnurag S. Maskey 			if (object_name != NULL &&
9076ba597c5SAnurag S. Maskey 			    object_type == NWAM_CONDITION_OBJECT_TYPE_LOC &&
9086ba597c5SAnurag S. Maskey 			    strcmp(object_name, name) == 0) {
9096ba597c5SAnurag S. Maskey 				if (errpropp != NULL)
9106ba597c5SAnurag S. Maskey 					*errpropp = NWAM_LOC_PROP_CONDITIONS;
9116ba597c5SAnurag S. Maskey 				free(name);
9126ba597c5SAnurag S. Maskey 				free(object_name);
9136ba597c5SAnurag S. Maskey 				nwam_value_free(conditionval);
9146ba597c5SAnurag S. Maskey 				return (NWAM_ENTITY_INVALID_VALUE);
9156ba597c5SAnurag S. Maskey 			}
9166ba597c5SAnurag S. Maskey 			free(object_name);
9176ba597c5SAnurag S. Maskey 		}
9186ba597c5SAnurag S. Maskey 		free(name);
9196ba597c5SAnurag S. Maskey 		nwam_value_free(conditionval);
9206ba597c5SAnurag S. Maskey 	}
9216ba597c5SAnurag S. Maskey 
9226ba597c5SAnurag S. Maskey 	/* validate namerservices */
9236ba597c5SAnurag S. Maskey 	if (nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_NAMESERVICES,
9246ba597c5SAnurag S. Maskey 	    &nameservicesval) != NWAM_SUCCESS) {
9256ba597c5SAnurag S. Maskey 		if (errpropp != NULL)
9266ba597c5SAnurag S. Maskey 			*errpropp = NWAM_LOC_PROP_NAMESERVICES;
9276ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_MISSING_MEMBER);
9286ba597c5SAnurag S. Maskey 	}
9296ba597c5SAnurag S. Maskey 	err = nwam_loc_validate_all_nameservices(loch, nameservicesval,
9306ba597c5SAnurag S. Maskey 	    errpropp);
9316ba597c5SAnurag S. Maskey 	nwam_value_free(nameservicesval);
9326ba597c5SAnurag S. Maskey 	if (err != NWAM_SUCCESS)
9336ba597c5SAnurag S. Maskey 		return (err);
9346ba597c5SAnurag S. Maskey 
9356ba597c5SAnurag S. Maskey 	return (nwam_validate(loc_prop_table, loch, errpropp));
9366ba597c5SAnurag S. Maskey }
9376ba597c5SAnurag S. Maskey 
9386ba597c5SAnurag S. Maskey nwam_error_t
nwam_loc_validate_prop(nwam_loc_handle_t loch,const char * propname,nwam_value_t value)9396ba597c5SAnurag S. Maskey nwam_loc_validate_prop(nwam_loc_handle_t loch, const char *propname,
9406ba597c5SAnurag S. Maskey     nwam_value_t value)
9416ba597c5SAnurag S. Maskey {
9426ba597c5SAnurag S. Maskey 	nwam_error_t err;
9436ba597c5SAnurag S. Maskey 
9446ba597c5SAnurag S. Maskey 	assert(loch != NULL);
9456ba597c5SAnurag S. Maskey 
9466ba597c5SAnurag S. Maskey 	if (strcmp(propname, NWAM_LOC_PROP_ACTIVATION_MODE) == 0) {
9476ba597c5SAnurag S. Maskey 		if ((err = nwam_loc_validate_activation_mode(loch, value))
9486ba597c5SAnurag S. Maskey 		    != NWAM_SUCCESS)
9496ba597c5SAnurag S. Maskey 			return (err);
9506ba597c5SAnurag S. Maskey 	}
9516ba597c5SAnurag S. Maskey 
9526ba597c5SAnurag S. Maskey 	return (nwam_validate_prop(loc_prop_table, loch, propname, value));
9536ba597c5SAnurag S. Maskey }
9546ba597c5SAnurag S. Maskey 
9556ba597c5SAnurag S. Maskey nwam_error_t
nwam_loc_copy(nwam_loc_handle_t oldloch,const char * newname,nwam_loc_handle_t * newlochp)9566ba597c5SAnurag S. Maskey nwam_loc_copy(nwam_loc_handle_t oldloch, const char *newname,
9576ba597c5SAnurag S. Maskey     nwam_loc_handle_t *newlochp)
9586ba597c5SAnurag S. Maskey {
9596ba597c5SAnurag S. Maskey 	nwam_error_t err;
9606ba597c5SAnurag S. Maskey 	nwam_value_t val;
9616ba597c5SAnurag S. Maskey 
9626ba597c5SAnurag S. Maskey 	if ((err = nwam_copy(NWAM_LOC_CONF_FILE, oldloch, newname, newlochp))
9636ba597c5SAnurag S. Maskey 	    != NWAM_SUCCESS)
9646ba597c5SAnurag S. Maskey 		return (err);
9656ba597c5SAnurag S. Maskey 
9666ba597c5SAnurag S. Maskey 	/* If the activation-mode is system, change it to manual */
9676ba597c5SAnurag S. Maskey 	if ((err = nwam_loc_get_prop_value(*newlochp,
9686ba597c5SAnurag S. Maskey 	    NWAM_LOC_PROP_ACTIVATION_MODE, &val)) != NWAM_SUCCESS)
9696ba597c5SAnurag S. Maskey 		goto finish;
9706ba597c5SAnurag S. Maskey 	err = nwam_loc_validate_activation_mode(*newlochp, val);
9716ba597c5SAnurag S. Maskey 	nwam_value_free(val);
9726ba597c5SAnurag S. Maskey 	if (err != NWAM_SUCCESS) {
9736ba597c5SAnurag S. Maskey 		if ((err = nwam_value_create_uint64(NWAM_ACTIVATION_MODE_MANUAL,
9746ba597c5SAnurag S. Maskey 		    &val)) != NWAM_SUCCESS)
9756ba597c5SAnurag S. Maskey 			goto finish;
9766ba597c5SAnurag S. Maskey 		err = nwam_set_prop_value((*newlochp)->nwh_data,
9776ba597c5SAnurag S. Maskey 		    NWAM_LOC_PROP_ACTIVATION_MODE, val);
9786ba597c5SAnurag S. Maskey 		nwam_value_free(val);
9796ba597c5SAnurag S. Maskey 		if (err != NWAM_SUCCESS)
9806ba597c5SAnurag S. Maskey 			goto finish;
9816ba597c5SAnurag S. Maskey 
9826ba597c5SAnurag S. Maskey 		if ((err = nwam_value_create_boolean(B_FALSE, &val))
9836ba597c5SAnurag S. Maskey 		    != NWAM_SUCCESS)
9846ba597c5SAnurag S. Maskey 			goto finish;
9856ba597c5SAnurag S. Maskey 		err = nwam_set_prop_value((*newlochp)->nwh_data,
9866ba597c5SAnurag S. Maskey 		    NWAM_LOC_PROP_ENABLED, val);
9876ba597c5SAnurag S. Maskey 		nwam_value_free(val);
9886ba597c5SAnurag S. Maskey 		if (err != NWAM_SUCCESS)
9896ba597c5SAnurag S. Maskey 			goto finish;
9906ba597c5SAnurag S. Maskey 	}
9916ba597c5SAnurag S. Maskey 
9926ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
9936ba597c5SAnurag S. Maskey 
9946ba597c5SAnurag S. Maskey finish:
9956ba597c5SAnurag S. Maskey 	nwam_loc_free(*newlochp);
9966ba597c5SAnurag S. Maskey 	*newlochp = NULL;
9976ba597c5SAnurag S. Maskey 	return (err);
9986ba597c5SAnurag S. Maskey }
9996ba597c5SAnurag S. Maskey 
10006ba597c5SAnurag S. Maskey /*
10016ba597c5SAnurag S. Maskey  * Given a property, return expected property data type
10026ba597c5SAnurag S. Maskey  */
10036ba597c5SAnurag S. Maskey nwam_error_t
nwam_loc_get_prop_type(const char * propname,nwam_value_type_t * typep)10046ba597c5SAnurag S. Maskey nwam_loc_get_prop_type(const char *propname, nwam_value_type_t *typep)
10056ba597c5SAnurag S. Maskey {
10066ba597c5SAnurag S. Maskey 	return (nwam_get_prop_type(loc_prop_table, propname, typep));
10076ba597c5SAnurag S. Maskey }
10086ba597c5SAnurag S. Maskey 
10096ba597c5SAnurag S. Maskey nwam_error_t
nwam_loc_prop_multivalued(const char * propname,boolean_t * multip)10106ba597c5SAnurag S. Maskey nwam_loc_prop_multivalued(const char *propname, boolean_t *multip)
10116ba597c5SAnurag S. Maskey {
10126ba597c5SAnurag S. Maskey 	return (nwam_prop_multivalued(loc_prop_table, propname, multip));
10136ba597c5SAnurag S. Maskey }
10146ba597c5SAnurag S. Maskey 
10156ba597c5SAnurag S. Maskey /*
10166ba597c5SAnurag S. Maskey  * Determine if the location has manual activation-mode or not.
10176ba597c5SAnurag S. Maskey  */
10186ba597c5SAnurag S. Maskey nwam_error_t
nwam_loc_is_manual(nwam_loc_handle_t loch,boolean_t * manualp)10196ba597c5SAnurag S. Maskey nwam_loc_is_manual(nwam_loc_handle_t loch, boolean_t *manualp)
10206ba597c5SAnurag S. Maskey {
10216ba597c5SAnurag S. Maskey 	nwam_error_t err;
10226ba597c5SAnurag S. Maskey 	nwam_value_t actval;
10236ba597c5SAnurag S. Maskey 	uint64_t activation;
10246ba597c5SAnurag S. Maskey 
10256ba597c5SAnurag S. Maskey 	assert(loch != NULL);
10266ba597c5SAnurag S. Maskey 
10276ba597c5SAnurag S. Maskey 	if ((err = nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_ACTIVATION_MODE,
10286ba597c5SAnurag S. Maskey 	    &actval)) != NWAM_SUCCESS)
10296ba597c5SAnurag S. Maskey 		return (err);
10306ba597c5SAnurag S. Maskey 	err = nwam_value_get_uint64(actval, &activation);
10316ba597c5SAnurag S. Maskey 	nwam_value_free(actval);
10326ba597c5SAnurag S. Maskey 	if (err != NWAM_SUCCESS)
10336ba597c5SAnurag S. Maskey 		return (err);
10346ba597c5SAnurag S. Maskey 
10356ba597c5SAnurag S. Maskey 	if (activation == NWAM_ACTIVATION_MODE_MANUAL)
10366ba597c5SAnurag S. Maskey 		*manualp = B_TRUE;
10376ba597c5SAnurag S. Maskey 	else
10386ba597c5SAnurag S. Maskey 		*manualp = B_FALSE;
10396ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
10406ba597c5SAnurag S. Maskey }
10416ba597c5SAnurag S. Maskey 
10426ba597c5SAnurag S. Maskey /* Determine if location is enabled or not */
10436ba597c5SAnurag S. Maskey static nwam_error_t
nwam_loc_is_enabled(nwam_loc_handle_t loch,boolean_t * enabledp)10446ba597c5SAnurag S. Maskey nwam_loc_is_enabled(nwam_loc_handle_t loch, boolean_t *enabledp)
10456ba597c5SAnurag S. Maskey {
10466ba597c5SAnurag S. Maskey 	nwam_error_t err;
10476ba597c5SAnurag S. Maskey 	nwam_value_t enabledval;
10486ba597c5SAnurag S. Maskey 
10496ba597c5SAnurag S. Maskey 	assert(loch != NULL);
10506ba597c5SAnurag S. Maskey 
10516ba597c5SAnurag S. Maskey 	if ((err = nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_ENABLED,
10526ba597c5SAnurag S. Maskey 	    &enabledval)) != NWAM_SUCCESS)
10536ba597c5SAnurag S. Maskey 		return (err);
10546ba597c5SAnurag S. Maskey 	err = nwam_value_get_boolean(enabledval, enabledp);
10556ba597c5SAnurag S. Maskey 	nwam_value_free(enabledval);
10566ba597c5SAnurag S. Maskey 	return (err);
10576ba597c5SAnurag S. Maskey }
10586ba597c5SAnurag S. Maskey 
10596ba597c5SAnurag S. Maskey /*
10606ba597c5SAnurag S. Maskey  * Callback to disable all locations other than one to enable, the handle
10616ba597c5SAnurag S. Maskey  * of which we pass in as an argument. If the argument is NULL, we disable
10626ba597c5SAnurag S. Maskey  * all locations.
10636ba597c5SAnurag S. Maskey  */
10646ba597c5SAnurag S. Maskey static int
loc_set_enabled(nwam_loc_handle_t loch,void * data)10656ba597c5SAnurag S. Maskey loc_set_enabled(nwam_loc_handle_t loch, void *data)
10666ba597c5SAnurag S. Maskey {
10676ba597c5SAnurag S. Maskey 	nwam_value_t enabledval;
1068ea408ca7SAnurag S. Maskey 	boolean_t curr_state, enabled = B_FALSE;
10696ba597c5SAnurag S. Maskey 	nwam_loc_handle_t testloch = data;
10706ba597c5SAnurag S. Maskey 	nwam_error_t err = NWAM_SUCCESS;
10716ba597c5SAnurag S. Maskey 
10726ba597c5SAnurag S. Maskey 	if (testloch != NULL) {
10736ba597c5SAnurag S. Maskey 		char *name, *testname;
10746ba597c5SAnurag S. Maskey 
10756ba597c5SAnurag S. Maskey 		if (nwam_loc_get_name(loch, &name) == NWAM_SUCCESS &&
10766ba597c5SAnurag S. Maskey 		    nwam_loc_get_name(testloch, &testname) == NWAM_SUCCESS &&
10776ba597c5SAnurag S. Maskey 		    strcmp(name, testname) == 0) {
10786ba597c5SAnurag S. Maskey 			/* We enable this location. */
10796ba597c5SAnurag S. Maskey 			enabled = B_TRUE;
10806ba597c5SAnurag S. Maskey 		}
10816ba597c5SAnurag S. Maskey 	}
1082ea408ca7SAnurag S. Maskey 
1083ea408ca7SAnurag S. Maskey 	/* If the enabled property is not changing, don't do anything. */
1084ea408ca7SAnurag S. Maskey 	if (nwam_loc_is_enabled(loch, &curr_state) == NWAM_SUCCESS &&
1085ea408ca7SAnurag S. Maskey 	    curr_state == enabled)
1086ea408ca7SAnurag S. Maskey 		return (0);
1087ea408ca7SAnurag S. Maskey 
10886ba597c5SAnurag S. Maskey 	if (nwam_value_create_boolean(enabled, &enabledval) != NWAM_SUCCESS)
10896ba597c5SAnurag S. Maskey 		return (0);
10906ba597c5SAnurag S. Maskey 	if (nwam_set_prop_value(loch->nwh_data, NWAM_LOC_PROP_ENABLED,
10916ba597c5SAnurag S. Maskey 	    enabledval) == NWAM_SUCCESS)
10926ba597c5SAnurag S. Maskey 		err = nwam_loc_commit(loch, NWAM_FLAG_ENTITY_ENABLE);
10936ba597c5SAnurag S. Maskey 
10946ba597c5SAnurag S. Maskey 	nwam_value_free(enabledval);
10956ba597c5SAnurag S. Maskey 	return (err);
10966ba597c5SAnurag S. Maskey }
10976ba597c5SAnurag S. Maskey 
10986ba597c5SAnurag S. Maskey /*
10996ba597c5SAnurag S. Maskey  * Update the enabled property for this location (and for all others
11006ba597c5SAnurag S. Maskey  * if necessary.
11016ba597c5SAnurag S. Maskey  */
11026ba597c5SAnurag S. Maskey static int
nwam_loc_update_enabled(nwam_loc_handle_t loch,boolean_t enabled)11036ba597c5SAnurag S. Maskey nwam_loc_update_enabled(nwam_loc_handle_t loch, boolean_t enabled)
11046ba597c5SAnurag S. Maskey {
11056ba597c5SAnurag S. Maskey 	nwam_error_t err;
11066ba597c5SAnurag S. Maskey 	int cb_ret;
11076ba597c5SAnurag S. Maskey 
11086ba597c5SAnurag S. Maskey 	if (enabled) {
11096ba597c5SAnurag S. Maskey 		/*
11106ba597c5SAnurag S. Maskey 		 * Disable all other locations that are manually enabled
11116ba597c5SAnurag S. Maskey 		 * and enable this one - a maximum of 1 location can be
11126ba597c5SAnurag S. Maskey 		 * enabled at once.
11136ba597c5SAnurag S. Maskey 		 */
11146ba597c5SAnurag S. Maskey 		err = nwam_walk_locs(loc_set_enabled, loch, 0, &cb_ret);
11156ba597c5SAnurag S. Maskey 		if (err != NWAM_SUCCESS && err != NWAM_WALK_HALTED)
11166ba597c5SAnurag S. Maskey 			cb_ret = err;
11176ba597c5SAnurag S. Maskey 	} else {
11186ba597c5SAnurag S. Maskey 		cb_ret = loc_set_enabled(loch, NULL);
11196ba597c5SAnurag S. Maskey 	}
11206ba597c5SAnurag S. Maskey 	return (cb_ret);
11216ba597c5SAnurag S. Maskey }
11226ba597c5SAnurag S. Maskey 
11236ba597c5SAnurag S. Maskey nwam_error_t
nwam_loc_enable(nwam_loc_handle_t loch)11246ba597c5SAnurag S. Maskey nwam_loc_enable(nwam_loc_handle_t loch)
11256ba597c5SAnurag S. Maskey {
11266ba597c5SAnurag S. Maskey 	nwam_error_t err;
11276ba597c5SAnurag S. Maskey 	boolean_t enabled;
11286ba597c5SAnurag S. Maskey 
11296ba597c5SAnurag S. Maskey 	assert(loch != NULL);
11306ba597c5SAnurag S. Maskey 
11316ba597c5SAnurag S. Maskey 	/* Make sure location is not enabled */
11326ba597c5SAnurag S. Maskey 	if ((err = nwam_loc_is_enabled(loch, &enabled)) != NWAM_SUCCESS)
11336ba597c5SAnurag S. Maskey 		return (err);
11346ba597c5SAnurag S. Maskey 	if (enabled)
11356ba597c5SAnurag S. Maskey 		return (NWAM_SUCCESS);
11366ba597c5SAnurag S. Maskey 
11376ba597c5SAnurag S. Maskey 	if ((err = nwam_loc_update_enabled(loch, B_TRUE)) != NWAM_SUCCESS)
11386ba597c5SAnurag S. Maskey 		return (err);
11396ba597c5SAnurag S. Maskey 
11406ba597c5SAnurag S. Maskey 	err = nwam_enable(NULL, loch);
11416ba597c5SAnurag S. Maskey 
11426ba597c5SAnurag S. Maskey 	/* nwamd may not be running, that's okay. */
11436ba597c5SAnurag S. Maskey 	if (err == NWAM_ERROR_BIND)
11446ba597c5SAnurag S. Maskey 		return (NWAM_SUCCESS);
11456ba597c5SAnurag S. Maskey 	else
11466ba597c5SAnurag S. Maskey 		return (err);
11476ba597c5SAnurag S. Maskey }
11486ba597c5SAnurag S. Maskey 
11496ba597c5SAnurag S. Maskey nwam_error_t
nwam_loc_disable(nwam_loc_handle_t loch)11506ba597c5SAnurag S. Maskey nwam_loc_disable(nwam_loc_handle_t loch)
11516ba597c5SAnurag S. Maskey {
11526ba597c5SAnurag S. Maskey 	nwam_error_t err;
11536ba597c5SAnurag S. Maskey 	boolean_t enabled;
11546ba597c5SAnurag S. Maskey 
11556ba597c5SAnurag S. Maskey 	assert(loch != NULL);
11566ba597c5SAnurag S. Maskey 
11576ba597c5SAnurag S. Maskey 	/* Make sure location is enabled */
11586ba597c5SAnurag S. Maskey 	if ((err = nwam_loc_is_enabled(loch, &enabled)) != NWAM_SUCCESS)
11596ba597c5SAnurag S. Maskey 		return (err);
11606ba597c5SAnurag S. Maskey 	if (!enabled)
11616ba597c5SAnurag S. Maskey 		return (NWAM_SUCCESS);
11626ba597c5SAnurag S. Maskey 
11636ba597c5SAnurag S. Maskey 	if ((err = nwam_loc_update_enabled(loch, B_FALSE)) != NWAM_SUCCESS)
11646ba597c5SAnurag S. Maskey 		return (err);
11656ba597c5SAnurag S. Maskey 
11666ba597c5SAnurag S. Maskey 	err = nwam_disable(NULL, loch);
11676ba597c5SAnurag S. Maskey 
11686ba597c5SAnurag S. Maskey 	/* nwamd may not be running, that's okay. */
11696ba597c5SAnurag S. Maskey 	if (err == NWAM_ERROR_BIND)
11706ba597c5SAnurag S. Maskey 		return (NWAM_SUCCESS);
11716ba597c5SAnurag S. Maskey 	else
11726ba597c5SAnurag S. Maskey 		return (err);
11736ba597c5SAnurag S. Maskey }
11746ba597c5SAnurag S. Maskey 
11756ba597c5SAnurag S. Maskey nwam_error_t
nwam_loc_get_default_proplist(const char *** prop_list,uint_t * numvaluesp)11766ba597c5SAnurag S. Maskey nwam_loc_get_default_proplist(const char ***prop_list, uint_t *numvaluesp)
11776ba597c5SAnurag S. Maskey {
11786ba597c5SAnurag S. Maskey 	return (nwam_get_default_proplist(loc_prop_table,
11796ba597c5SAnurag S. Maskey 	    NWAM_TYPE_ANY, NWAM_CLASS_ANY, prop_list, numvaluesp));
11806ba597c5SAnurag S. Maskey }
11816ba597c5SAnurag S. Maskey 
11826ba597c5SAnurag S. Maskey nwam_error_t
nwam_loc_get_state(nwam_loc_handle_t loch,nwam_state_t * statep,nwam_aux_state_t * auxp)11836ba597c5SAnurag S. Maskey nwam_loc_get_state(nwam_loc_handle_t loch, nwam_state_t *statep,
11846ba597c5SAnurag S. Maskey     nwam_aux_state_t *auxp)
11856ba597c5SAnurag S. Maskey {
11866ba597c5SAnurag S. Maskey 	return (nwam_get_state(NULL, loch, statep, auxp));
11876ba597c5SAnurag S. Maskey }
1188