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