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