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