xref: /onnv-gate/usr/src/lib/libnwam/common/libnwam_loc.c (revision 12036:aa269fb9cf77)
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