6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * CDDL HEADER START
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * The contents of this file are subject to the terms of the
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Common Development and Distribution License (the "License").
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * You may not use this file except in compliance with the License.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * or http://www.opensolaris.org/os/licensing.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * See the License for the specific language governing permissions
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * and limitations under the License.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * When distributing Covered Code, include this CDDL HEADER in each
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * If applicable, add the following below this CDDL HEADER, with the
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * fields enclosed by brackets "[]" replaced with your own identifying
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * information: Portions Copyright [yyyy] [name of copyright owner]
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * CDDL HEADER END
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
ea408ca7befa82c08eb7affd8f29f1692188f34aAnurag S. Maskey * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <assert.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <ctype.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <sys/param.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <sys/types.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <sys/stat.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <stdio.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <stdlib.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <strings.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <unistd.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <libscf.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include "libnwam_impl.h"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <libnwam_priv.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <libnwam.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Functions to support creating, modifying, destroying, querying the
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * state of and changing the state of location objects. Locations
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * represent the configuration to be applied once basic network configuration
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * has been established - name services, IPsec config, etc, and can be enabled
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * either manually or conditionally for a combination of the set of
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * available conditions (an IP address is present, an ENM is active etc).
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#define NSSWITCH_PREFIX "/etc/nsswitch."
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeytypedef nwam_error_t (*nwam_loc_prop_validate_func_t)(nwam_value_t);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic nwam_error_t valid_loc_activation_mode(nwam_value_t);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic nwam_error_t valid_loc_condition(nwam_value_t);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic nwam_error_t valid_nameservices(nwam_value_t);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic nwam_error_t valid_configsrc(nwam_value_t);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystruct nwam_prop_table_entry loc_prop_table_entries[] = {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_LOC_PROP_ACTIVATION_MODE, NWAM_VALUE_TYPE_UINT64, B_FALSE, 1, 1,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey valid_loc_activation_mode,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies the location activation mode - valid values are:\n"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "\'manual\', \'conditional-any\' and \'conditional-all\'",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_LOC_PROP_CONDITIONS, NWAM_VALUE_TYPE_STRING, B_FALSE, 0,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_MAX_NUM_VALUES, valid_loc_condition,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies the activation condition. Conditions are of the form:\n"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "ncp|ncu|enm name is|is-not active\n"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "ip-address is|is-not|is-in-range|is-not-in-range| 1.2.3.4[/24]\n"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "advertised-domain is|is-not|contains|does-not-contain string\n"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "system-domain is|is-not|contains|does-not-contain string\n"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "essid is|is-not|contains|does-not-contain string\n"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "bssid is|is-not string",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_LOC_PROP_ENABLED, NWAM_VALUE_TYPE_BOOLEAN, B_TRUE, 1, 1,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_valid_boolean,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies if location is to be enabled",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_LOC_PROP_NAMESERVICES, NWAM_VALUE_TYPE_UINT64, B_FALSE, 1,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_MAX_NUM_VALUES, valid_nameservices,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies name service(s) to be used - valid values are:\n"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "\'files\', \'dns\', \'nis\', and \'ldap\'",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE, NWAM_VALUE_TYPE_STRING,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey B_FALSE, 0, 1, nwam_valid_file,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies path to configuration file for name services switch "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "for this location - see nsswitch.conf(4)",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC, NWAM_VALUE_TYPE_UINT64,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey B_FALSE, 0, NWAM_MAX_NUM_VALUES, valid_configsrc,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies sources of DNS configuration parameters - valid values "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "are:\n\'dhcp\', or \'manual\'",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_LOC_PROP_DNS_NAMESERVICE_DOMAIN, NWAM_VALUE_TYPE_STRING, B_FALSE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey 0, 1, nwam_valid_domain,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies DNS domain name to be set for this location",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_LOC_PROP_DNS_NAMESERVICE_SERVERS, NWAM_VALUE_TYPE_STRING, B_FALSE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey 0, NWAM_MAX_NUM_VALUES, nwam_valid_host_any,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies DNS server host address(es)",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_LOC_PROP_DNS_NAMESERVICE_SEARCH, NWAM_VALUE_TYPE_STRING, B_FALSE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey 0, NWAM_MAX_NUM_VALUES, nwam_valid_domain,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies DNS search list for host name lookup",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_LOC_PROP_NIS_NAMESERVICE_CONFIGSRC, NWAM_VALUE_TYPE_UINT64,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey B_FALSE, 0, NWAM_MAX_NUM_VALUES, valid_configsrc,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies sources of NIS configuration parameters - valid values "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "are:\n\'dhcp\', or \'manual\'",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_LOC_PROP_NIS_NAMESERVICE_SERVERS, NWAM_VALUE_TYPE_STRING, B_FALSE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey 0, NWAM_MAX_NUM_VALUES, nwam_valid_host_any,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies NIS server host address(es)",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC, NWAM_VALUE_TYPE_UINT64,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey B_FALSE, 0, NWAM_MAX_NUM_VALUES, valid_configsrc,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies sources of NIS configuration parameters - currently, "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "the only valid value is \'manual\'",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_LOC_PROP_LDAP_NAMESERVICE_SERVERS, NWAM_VALUE_TYPE_STRING,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey B_FALSE, 0, NWAM_MAX_NUM_VALUES, nwam_valid_host_or_domain,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies LDAP server host address(es)",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_LOC_PROP_DEFAULT_DOMAIN, NWAM_VALUE_TYPE_STRING, B_FALSE, 0, 1,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_valid_domain,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies the domainname(1M) to be set for this location",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_LOC_PROP_NFSV4_DOMAIN, NWAM_VALUE_TYPE_STRING, B_FALSE, 0, 1,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_valid_domain,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies an NFSv4 domain for this location",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_LOC_PROP_IPFILTER_CONFIG_FILE, NWAM_VALUE_TYPE_STRING, B_FALSE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey 0, 1, nwam_valid_file,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies an absolute path to an ipf.conf(4) file for this "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "location",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_LOC_PROP_IPFILTER_V6_CONFIG_FILE, NWAM_VALUE_TYPE_STRING,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey B_FALSE, 0, 1, nwam_valid_file,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies an absolute path to an ipf6.conf file for this "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "location",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_LOC_PROP_IPNAT_CONFIG_FILE, NWAM_VALUE_TYPE_STRING, B_FALSE, 0,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey 1, nwam_valid_file,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies an absolute path to an ipnat.conf(4) file for this "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "location",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_LOC_PROP_IPPOOL_CONFIG_FILE, NWAM_VALUE_TYPE_STRING, B_FALSE, 0,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey 1, nwam_valid_file,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies an absolute path to an ippool.conf(4) file for this "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "location",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_LOC_PROP_IKE_CONFIG_FILE, NWAM_VALUE_TYPE_STRING, B_FALSE, 0, 1,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_valid_file,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies an absolute path to an ike config file "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "(see ike.config(4))",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_LOC_PROP_IPSECPOLICY_CONFIG_FILE, NWAM_VALUE_TYPE_STRING,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey B_FALSE, 0, 1, nwam_valid_file,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies an absolute path to an IPsec policy configuration file "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "(see ipsecconf(1M)",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey};
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#define NWAM_NUM_LOC_PROPS (sizeof (loc_prop_table_entries) / \
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey sizeof (*loc_prop_table_entries))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystruct nwam_prop_table loc_prop_table =
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey { NWAM_NUM_LOC_PROPS, loc_prop_table_entries };
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic uint64_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_activation_to_flag(nwam_activation_mode_t activation)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey switch (activation) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_ACTIVATION_MODE_MANUAL:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_FLAG_ACTIVATION_MODE_MANUAL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_ACTIVATION_MODE_SYSTEM:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_FLAG_ACTIVATION_MODE_SYSTEM);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_ACTIVATION_MODE_CONDITIONAL_ANY:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_FLAG_ACTIVATION_MODE_CONDITIONAL_ANY);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_ACTIVATION_MODE_CONDITIONAL_ALL:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_FLAG_ACTIVATION_MODE_CONDITIONAL_ALL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey default:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (0);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_read(const char *name, uint64_t flags, nwam_loc_handle_t *lochp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_read(NWAM_OBJECT_TYPE_LOC, NWAM_LOC_CONF_FILE, name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey flags, lochp));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_create(const char *name, nwam_loc_handle_t *lochp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t val = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *nsswitch = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey assert(lochp != NULL && name != NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_create(NWAM_OBJECT_TYPE_LOC, NWAM_LOC_CONF_FILE, name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey lochp)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Create new object list for loc */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_alloc_object_list(&((*lochp)->nwh_data)))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto finish;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* NWAM_LOC_PROP_ACTIVATION_MODE is mandatory */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_value_create_uint64(NWAM_ACTIVATION_MODE_MANUAL, &val))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto finish;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_set_prop_value((*lochp)->nwh_data,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_LOC_PROP_ACTIVATION_MODE, val)) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto finish;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey val = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * NWAM_LOC_PROP_ENABLED defaults to false.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_value_create_boolean(B_FALSE, &val)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto finish;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_set_prop_value((*lochp)->nwh_data,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_LOC_PROP_ENABLED, val)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto finish;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey val = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Initialize name service properties: use DNS, configured
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * via DHCP, with default nsswitch (/etc/nsswitch.dns).
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_value_create_uint64(NWAM_NAMESERVICES_DNS, &val)) !=
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto finish;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_set_prop_value((*lochp)->nwh_data,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_LOC_PROP_NAMESERVICES, val)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto finish;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey val = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_value_create_uint64(NWAM_CONFIGSRC_DHCP, &val)) !=
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto finish;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_set_prop_value((*lochp)->nwh_data,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC, val)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto finish;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey val = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* concatenate these two strings */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nsswitch = strdup(NSSWITCH_PREFIX NWAM_NAMESERVICES_DNS_STRING);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nsswitch == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = NWAM_NO_MEMORY;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto finish;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_value_create_string(nsswitch, &val)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto finish;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_set_prop_value((*lochp)->nwh_data,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE, val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyfinish:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nsswitch != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(nsswitch);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (val != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_loc_free(*lochp);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *lochp = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_get_name(nwam_loc_handle_t loch, char **namep)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_get_name(loch, namep));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_set_name(nwam_loc_handle_t loch, const char *name)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_set_name(loch, name));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyboolean_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_can_set_name(nwam_loc_handle_t loch)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (!loch->nwh_committed);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* ARGSUSED2 */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic int
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyloc_selectcb(struct nwam_handle *hp, uint64_t flags, void *data)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_loc_handle_t loch = hp;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *locname;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t activation, actflag, walkfilter;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t activationval;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Skip the Legacy location in all cases */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_loc_get_name(loch, &locname) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_INVALID_ARG);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (strcmp(locname, NWAM_LOC_NAME_LEGACY) == 0) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(locname);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_INVALID_ARG);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(locname);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Get a bitmapped flag value corresponding to this loc's
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * activation.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_ACTIVATION_MODE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &activationval) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_INVALID_ARG);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_value_get_uint64(activationval, &activation) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(activationval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_INVALID_ARG);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey actflag = nwam_loc_activation_to_flag(activation);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(activationval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((walkfilter = (flags & NWAM_WALK_FILTER_MASK)) == 0)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey walkfilter = NWAM_FLAG_ACTIVATION_MODE_ALL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (actflag & walkfilter)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_INVALID_ARG);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_walk_locs(int(*cb)(nwam_loc_handle_t, void *), void *data, uint64_t flags,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int *retp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err = nwam_valid_flags(flags,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_FLAG_ACTIVATION_MODE_ALL | NWAM_FLAG_BLOCKING);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_walk(NWAM_OBJECT_TYPE_LOC, NWAM_LOC_CONF_FILE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey cb, data, flags, retp, loc_selectcb));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvoid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_free(nwam_loc_handle_t loch)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_free(loch);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_delete_prop(nwam_loc_handle_t loch, const char *propname)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey boolean_t ro;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey void *olddata;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey assert(loch != NULL && propname != NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_loc_prop_read_only(propname, &ro)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (ro)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_READ_ONLY);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Duplicate data, remove property and validate. If validation
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * fails, revert to data duplicated prior to remove.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_dup_object_list(loch->nwh_data, &olddata))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_delete_prop(loch->nwh_data, propname))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_free_object_list(loch->nwh_data);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey loch->nwh_data = olddata;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_loc_validate(loch, NULL)) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_free_object_list(loch->nwh_data);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey loch->nwh_data = olddata;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_free_object_list(olddata);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_set_prop_value(nwam_loc_handle_t loch, const char *propname,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t value)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey boolean_t ro;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey assert(loch != NULL && propname != NULL && value != NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_loc_validate_prop(loch, propname, value))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS ||
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (err = nwam_loc_prop_read_only(propname, &ro)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (ro)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_READ_ONLY);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_set_prop_value(loch->nwh_data, propname, value));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_get_prop_value(nwam_loc_handle_t loch, const char *propname,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t *valuep)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_get_prop_value(loch->nwh_data, propname, valuep));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_walk_props(nwam_loc_handle_t loch,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int (*cb)(const char *, nwam_value_t, void *),
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey void *data, uint64_t flags, int *retp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_walk_props(loch, cb, data, flags, retp));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_commit(nwam_loc_handle_t loch, uint64_t flags)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey assert(loch != NULL && loch->nwh_data != NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_loc_validate(loch, NULL)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_commit(NWAM_LOC_CONF_FILE, loch, flags));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_destroy(nwam_loc_handle_t loch, uint64_t flags)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t actval;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t activation;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Automatic and NoNet are not destroyable and Legacy is
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * destroyable by netadm only. These have system activation-mode.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_ACTIVATION_MODE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &actval)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_value_get_uint64(actval, &activation);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(actval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (activation == NWAM_ACTIVATION_MODE_SYSTEM) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (strcmp(loch->nwh_name, NWAM_LOC_NAME_LEGACY) == 0) {
69b43529e65fb6eb0c88e6b7b42025e9bf025b8aMichael Hunter if (!nwam_uid_is_special())
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_NOT_DESTROYABLE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_NOT_DESTROYABLE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_destroy(NWAM_LOC_CONF_FILE, loch, flags));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_get_prop_description(const char *propname, const char **descriptionp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_get_prop_description(loc_prop_table, propname,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey descriptionp));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_prop_read_only(const char *propname, boolean_t *readp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_prop_read_only(loc_prop_table, propname, readp));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic nwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvalid_loc_activation_mode(nwam_value_t value)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t activation_mode;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_value_get_uint64(value, &activation_mode) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey switch (activation_mode) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_ACTIVATION_MODE_MANUAL:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_ACTIVATION_MODE_SYSTEM:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_ACTIVATION_MODE_CONDITIONAL_ANY:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_ACTIVATION_MODE_CONDITIONAL_ALL:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Identical to nwam_valid_condition(), except locations cannot specify other
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * location's activation as a condition, e.g. loc2 cannot specify
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * "loc1 is active" since only one location is active at a time, and
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * as a consequence the condition is unsatisfiable.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvalid_loc_condition(nwam_value_t value)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char **conditions;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint_t i, numvalues;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_condition_object_type_t object_type;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_condition_t condition;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_value_get_string_array(value, &conditions, &numvalues)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (i = 0; i < numvalues; i++) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *object_name = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_condition_string_to_condition(conditions[i],
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &object_type, &condition, &object_name) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (object_type == NWAM_CONDITION_OBJECT_TYPE_LOC &&
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey condition == NWAM_CONDITION_IS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (object_name != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic nwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvalid_nameservices(nwam_value_t value)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t *nameservices;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint_t i, numvalues;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_value_get_uint64_array(value, &nameservices, &numvalues)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (i = 0; i < numvalues; i++) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nameservices[i] > NWAM_NAMESERVICES_LDAP)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic nwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvalid_configsrc(nwam_value_t value)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t *configsrcs;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint_t i, numvalues;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_value_get_uint64_array(value, &configsrcs, &numvalues)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (i = 0; i < numvalues; i++) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (configsrcs[i] > NWAM_CONFIGSRC_DHCP)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Validates that the activation-mode is system for Automatic and NoNet
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * locations, and not system for all other locations.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic nwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_validate_activation_mode(nwam_loc_handle_t loch, nwam_value_t actval)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t activation;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_value_get_uint64(actval, &activation)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (NWAM_LOC_NAME_PRE_DEFINED(loch->nwh_name)) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (activation != NWAM_ACTIVATION_MODE_SYSTEM)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (activation == NWAM_ACTIVATION_MODE_SYSTEM)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Helper function to validate one nameservice, used by
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * nwam_loc_validate_all_nameservices().
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * requiredprop denotes the property that is mandatory when the
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * configsrcprop is manual. errpropp is used to return the invalid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * property.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic nwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_validate_one_nameservice(nwam_loc_handle_t loch,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey const char *configsrcprop, const char *requiredprop, const char **errpropp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t configsrcval, requiredval;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t *configsrcs;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint_t i, numvalues;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_loc_get_prop_value(loch, configsrcprop, &configsrcval)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (errpropp != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *errpropp = configsrcprop;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_MISSING_MEMBER);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_value_get_uint64_array(configsrcval, &configsrcs, &numvalues)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (errpropp != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *errpropp = configsrcprop;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(configsrcval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_NO_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* If -configsrc is manual, requiredprop is required */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (i = 0; i < numvalues; i++) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (configsrcs[i] == NWAM_CONFIGSRC_MANUAL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_loc_get_prop_value(loch, requiredprop,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &requiredval) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (errpropp != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *errpropp = requiredprop;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_MISSING_MEMBER);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(requiredval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(configsrcval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Helper function to validate LDAP nameservice, used by
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * nwam_loc_validate_all_nameservices(). Separated because LDAP must be
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * configured manually only and both default-domain and -servers are required.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic nwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_validate_ldap_nameservice(nwam_loc_handle_t loch,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey const char **errpropp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t val;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t *configsrcs;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint_t i, numvalues;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_loc_get_prop_value(loch,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC, &val) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (errpropp != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *errpropp = NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_MISSING_MEMBER);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* -configsrc is defined as an array */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_value_get_uint64_array(val, &configsrcs, &numvalues)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (errpropp != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *errpropp = NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_NO_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* -configsrc must be manual */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (i = 0; i < numvalues; i++) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (configsrcs[i] != NWAM_CONFIGSRC_MANUAL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (errpropp != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *errpropp =
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* both default-domain and -servers are required */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_loc_get_prop_value(loch,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_LOC_PROP_DEFAULT_DOMAIN, &val) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (errpropp != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *errpropp = NWAM_LOC_PROP_DEFAULT_DOMAIN;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_MISSING_MEMBER);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_loc_get_prop_value(loch,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_LOC_PROP_LDAP_NAMESERVICE_SERVERS, &val) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (errpropp != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *errpropp = NWAM_LOC_PROP_LDAP_NAMESERVICE_SERVERS;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_MISSING_MEMBER);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Validates the different nameservices properties.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * If "nameservices" property has more than one nameservice to configure,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * "nameservices-config-file" must be specified. If only one nameservice
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * is configured and "nameservices-config-file" is missing, set the
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * property with the appropriately suffixed nsswitch file.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * For any nameservice being configured, the respective -configsrc property
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * must be specified. For DNS, -servers is required if -configsrc is
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * manual. For NIS and LDAP, default-domain is required if -configsrc is
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * manual. For LDAP, -configsrc must be manual and -servers is required.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic nwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_validate_all_nameservices(nwam_loc_handle_t loch,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t nameservicesval, const char **errpropp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t val;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t *nameservices;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint_t i, numvalues;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_value_get_uint64_array(nameservicesval, &nameservices,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &numvalues)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * nameservices-config-file is required if nameservices has more
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * than one value.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (numvalues > 1) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_loc_get_prop_value(loch,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE, &val)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (errpropp != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *errpropp =
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_MISSING_MEMBER);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else if (numvalues == 1) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * If only one nameservice is being configured and
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * nameservices-config-file doesn't exist, create it to
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * point to the respective nsswitch file.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_loc_get_prop_value(loch,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE, &val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err == NWAM_INVALID_ARG || err == NWAM_ENTITY_NOT_FOUND) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *nsswitch;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey const char *nsswitch_suffix;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* get the single nameservice being configured */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_uint64_get_value_string(
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_LOC_PROP_NAMESERVICES, nameservices[0],
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &nsswitch_suffix)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto config_file_fail;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((nsswitch = malloc(MAXPATHLEN)) == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = NWAM_NO_MEMORY;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto config_file_fail;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* create appropriately suffixed nsswitch name */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) snprintf(nsswitch, MAXPATHLEN, "%s%s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NSSWITCH_PREFIX, nsswitch_suffix);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_value_create_string(nsswitch, &val))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(nsswitch);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto config_file_fail;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_set_prop_value(loch->nwh_data,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE, val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(nsswitch);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto config_file_fail;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else if (err != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto config_file_fail;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * validate the -configsrc property and the required default-domain
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * and/or -servers property for each nameservice being configured.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (i = 0; i < numvalues; i++) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey switch (nameservices[i]) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_NAMESERVICES_DNS:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_loc_validate_one_nameservice(loch,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_LOC_PROP_DNS_NAMESERVICE_SERVERS, errpropp))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_NAMESERVICES_NIS:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_loc_validate_one_nameservice(loch,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_LOC_PROP_NIS_NAMESERVICE_CONFIGSRC,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_LOC_PROP_DEFAULT_DOMAIN, errpropp))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_NAMESERVICES_LDAP:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_loc_validate_ldap_nameservice(loch,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey errpropp)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_NAMESERVICES_FILES:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey default:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyconfig_file_fail:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (errpropp != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *errpropp = NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_validate(nwam_loc_handle_t loch, const char **errpropp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t activationval, conditionval, nameservicesval;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t activation;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char **conditions, *name;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint_t i, numvalues;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_condition_object_type_t object_type;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_condition_t condition;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey assert(loch != NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Make sure loc is internally consistent: if activation type is
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * conditional, the condition string must be specified.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_ACTIVATION_MODE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &activationval) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (errpropp != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *errpropp = NWAM_LOC_PROP_ACTIVATION_MODE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_MISSING_MEMBER);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_value_get_uint64(activationval, &activation)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (errpropp != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *errpropp = NWAM_LOC_PROP_ACTIVATION_MODE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(activationval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_NO_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* validate activation against the location first */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_loc_validate_activation_mode(loch, activationval))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (errpropp != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *errpropp = NWAM_LOC_PROP_ACTIVATION_MODE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(activationval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(activationval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (activation == NWAM_ACTIVATION_MODE_CONDITIONAL_ANY ||
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey activation == NWAM_ACTIVATION_MODE_CONDITIONAL_ALL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_CONDITIONS,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &conditionval) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (errpropp != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *errpropp = NWAM_LOC_PROP_CONDITIONS;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_MISSING_MEMBER);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Are conditions self-referential? In other words, do any
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * of the activation conditions refer to this location?
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_value_get_string_array(conditionval, &conditions,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &numvalues) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(conditionval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (errpropp != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *errpropp = NWAM_LOC_PROP_CONDITIONS;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_loc_get_name(loch, &name) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(conditionval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_INVALID_ARG);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (i = 0; i < numvalues; i++) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *object_name = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_condition_string_to_condition(conditions[i],
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &object_type, &condition, &object_name)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (errpropp != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *errpropp = NWAM_LOC_PROP_CONDITIONS;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(conditionval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (object_name != NULL &&
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object_type == NWAM_CONDITION_OBJECT_TYPE_LOC &&
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey strcmp(object_name, name) == 0) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (errpropp != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *errpropp = NWAM_LOC_PROP_CONDITIONS;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(conditionval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(conditionval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* validate namerservices */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_NAMESERVICES,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &nameservicesval) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (errpropp != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *errpropp = NWAM_LOC_PROP_NAMESERVICES;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_MISSING_MEMBER);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_loc_validate_all_nameservices(loch, nameservicesval,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey errpropp);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(nameservicesval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_validate(loc_prop_table, loch, errpropp));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_validate_prop(nwam_loc_handle_t loch, const char *propname,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t value)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey assert(loch != NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (strcmp(propname, NWAM_LOC_PROP_ACTIVATION_MODE) == 0) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_loc_validate_activation_mode(loch, value))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_validate_prop(loc_prop_table, loch, propname, value));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_copy(nwam_loc_handle_t oldloch, const char *newname,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_loc_handle_t *newlochp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t val;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_copy(NWAM_LOC_CONF_FILE, oldloch, newname, newlochp))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* If the activation-mode is system, change it to manual */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_loc_get_prop_value(*newlochp,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_LOC_PROP_ACTIVATION_MODE, &val)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto finish;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_loc_validate_activation_mode(*newlochp, val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_value_create_uint64(NWAM_ACTIVATION_MODE_MANUAL,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &val)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto finish;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_set_prop_value((*newlochp)->nwh_data,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_LOC_PROP_ACTIVATION_MODE, val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto finish;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_value_create_boolean(B_FALSE, &val))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto finish;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_set_prop_value((*newlochp)->nwh_data,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_LOC_PROP_ENABLED, val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(val);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto finish;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyfinish:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_loc_free(*newlochp);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *newlochp = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Given a property, return expected property data type
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_get_prop_type(const char *propname, nwam_value_type_t *typep)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_get_prop_type(loc_prop_table, propname, typep));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_prop_multivalued(const char *propname, boolean_t *multip)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_prop_multivalued(loc_prop_table, propname, multip));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Determine if the location has manual activation-mode or not.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_is_manual(nwam_loc_handle_t loch, boolean_t *manualp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t actval;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t activation;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey assert(loch != NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_ACTIVATION_MODE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &actval)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_value_get_uint64(actval, &activation);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(actval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (activation == NWAM_ACTIVATION_MODE_MANUAL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *manualp = B_TRUE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey else
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *manualp = B_FALSE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* Determine if location is enabled or not */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic nwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_is_enabled(nwam_loc_handle_t loch, boolean_t *enabledp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t enabledval;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey assert(loch != NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_loc_get_prop_value(loch, NWAM_LOC_PROP_ENABLED,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &enabledval)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_value_get_boolean(enabledval, enabledp);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(enabledval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Callback to disable all locations other than one to enable, the handle
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * of which we pass in as an argument. If the argument is NULL, we disable
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * all locations.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic int
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyloc_set_enabled(nwam_loc_handle_t loch, void *data)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t enabledval;
ea408ca7befa82c08eb7affd8f29f1692188f34aAnurag S. Maskey boolean_t curr_state, enabled = B_FALSE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_loc_handle_t testloch = data;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err = NWAM_SUCCESS;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (testloch != NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *name, *testname;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_loc_get_name(loch, &name) == NWAM_SUCCESS &&
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_loc_get_name(testloch, &testname) == NWAM_SUCCESS &&
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey strcmp(name, testname) == 0) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* We enable this location. */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey enabled = B_TRUE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
ea408ca7befa82c08eb7affd8f29f1692188f34aAnurag S. Maskey
ea408ca7befa82c08eb7affd8f29f1692188f34aAnurag S. Maskey /* If the enabled property is not changing, don't do anything. */
ea408ca7befa82c08eb7affd8f29f1692188f34aAnurag S. Maskey if (nwam_loc_is_enabled(loch, &curr_state) == NWAM_SUCCESS &&
ea408ca7befa82c08eb7affd8f29f1692188f34aAnurag S. Maskey curr_state == enabled)
ea408ca7befa82c08eb7affd8f29f1692188f34aAnurag S. Maskey return (0);
ea408ca7befa82c08eb7affd8f29f1692188f34aAnurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_value_create_boolean(enabled, &enabledval) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (0);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_set_prop_value(loch->nwh_data, NWAM_LOC_PROP_ENABLED,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey enabledval) == NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_loc_commit(loch, NWAM_FLAG_ENTITY_ENABLE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(enabledval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Update the enabled property for this location (and for all others
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * if necessary.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic int
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_update_enabled(nwam_loc_handle_t loch, boolean_t enabled)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int cb_ret;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (enabled) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Disable all other locations that are manually enabled
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * and enable this one - a maximum of 1 location can be
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * enabled at once.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_walk_locs(loc_set_enabled, loch, 0, &cb_ret);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS && err != NWAM_WALK_HALTED)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey cb_ret = err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey cb_ret = loc_set_enabled(loch, NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (cb_ret);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_enable(nwam_loc_handle_t loch)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey boolean_t enabled;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey assert(loch != NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Make sure location is not enabled */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_loc_is_enabled(loch, &enabled)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (enabled)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_loc_update_enabled(loch, B_TRUE)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_enable(NULL, loch);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* nwamd may not be running, that's okay. */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err == NWAM_ERROR_BIND)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey else
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_disable(nwam_loc_handle_t loch)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey boolean_t enabled;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey assert(loch != NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Make sure location is enabled */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_loc_is_enabled(loch, &enabled)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (!enabled)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_loc_update_enabled(loch, B_FALSE)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_disable(NULL, loch);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* nwamd may not be running, that's okay. */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err == NWAM_ERROR_BIND)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey else
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_get_default_proplist(const char ***prop_list, uint_t *numvaluesp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_get_default_proplist(loc_prop_table,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY, prop_list, numvaluesp));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_loc_get_state(nwam_loc_handle_t loch, nwam_state_t *statep,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_aux_state_t *auxp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_get_state(NULL, loch, statep, auxp));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}