c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * CDDL HEADER START
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * The contents of this file are subject to the terms of the
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Common Development and Distribution License (the "License").
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * You may not use this file except in compliance with the License.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * or http://www.opensolaris.org/os/licensing.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * See the License for the specific language governing permissions
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * and limitations under the License.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * When distributing Covered Code, include this CDDL HEADER in each
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * If applicable, add the following below this CDDL HEADER, with the
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * fields enclosed by brackets "[]" replaced with your own identifying
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * information: Portions Copyright [yyyy] [name of copyright owner]
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * CDDL HEADER END
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Config routines common to idmap(1M) and idmapd(1M)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <stdlib.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <strings.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <libintl.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <ctype.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <errno.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <stdio.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <stdarg.h>
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban#include <uuid/uuid.h>
c8e261054d98729a8718903716b9b8a512d8b693jp#include <pthread.h>
c8e261054d98729a8718903716b9b8a512d8b693jp#include <port.h>
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross#include <sys/socket.h>
0dcc71495bad040a0c83830efc85acf8d897350dnw#include <net/route.h>
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen#include <sys/u8_textprep.h>
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross#include <netinet/in.h>
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross#include <arpa/inet.h>
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross#include <netdb.h>
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#include <note.h>
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross#include "idmapd.h"
c8e261054d98729a8718903716b9b8a512d8b693jp#include "addisc.h"
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw#define MACHINE_SID_LEN (9 + 3 * 11)
0dcc71495bad040a0c83830efc85acf8d897350dnw#define FMRI_BASE "svc:/system/idmap"
0dcc71495bad040a0c83830efc85acf8d897350dnw#define CONFIG_PG "config"
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#define DEBUG_PG "debug"
0dcc71495bad040a0c83830efc85acf8d897350dnw#define RECONFIGURE 1
0dcc71495bad040a0c83830efc85acf8d897350dnw#define POKE_AUTO_DISCOVERY 2
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross#define KICK_AUTO_DISCOVERY 3
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross/*
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross * Default cache timeouts. Can override via svccfg
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross * config/id_cache_timeout = count: seconds
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross * config/name_cache_timeout = count: seconds
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross */
3f1de28d23e9724b017260ef6b282b278b6e38f9Bayard Bell#define ID_CACHE_TMO_DEFAULT 86400
3f1de28d23e9724b017260ef6b282b278b6e38f9Bayard Bell#define NAME_CACHE_TMO_DEFAULT 604800
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross/*
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Default maximum time between rediscovery runs.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * config/rediscovery_interval = count: seconds
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross#define REDISCOVERY_INTERVAL_DEFAULT 3600
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross/*
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Mininum time between rediscovery runs, in case adutils gives us a
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * really short TTL (which it never should, but be defensive)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * (not configurable) seconds.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross#define MIN_REDISCOVERY_INTERVAL 60
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desaienum event_type {
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai EVENT_NOTHING, /* Woke up for no good reason */
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai EVENT_TIMEOUT, /* Timeout expired */
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai EVENT_ROUTING, /* An interesting routing event happened */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross EVENT_POKED, /* Requested from degrade_svc() */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross EVENT_KICKED, /* Force rediscovery, i.e. DC failed. */
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai EVENT_REFRESH, /* SMF refresh */
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai};
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai
c8e261054d98729a8718903716b9b8a512d8b693jp
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rossstatic void idmapd_set_krb5_realm(char *);
c8e261054d98729a8718903716b9b8a512d8b693jp
c8e261054d98729a8718903716b9b8a512d8b693jpstatic pthread_t update_thread_handle = 0;
c8e261054d98729a8718903716b9b8a512d8b693jp
0dcc71495bad040a0c83830efc85acf8d897350dnwstatic int idmapd_ev_port = -1;
0dcc71495bad040a0c83830efc85acf8d897350dnwstatic int rt_sock = -1;
c8e261054d98729a8718903716b9b8a512d8b693jp
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaistruct enum_lookup_map directory_mapping_map[] = {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai { DIRECTORY_MAPPING_NONE, "none" },
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai { DIRECTORY_MAPPING_NAME, "name" },
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai { DIRECTORY_MAPPING_IDMU, "idmu" },
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai { 0, NULL },
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai};
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstruct enum_lookup_map trust_dir_map[] = {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright { 1, "they trust us" },
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright { 2, "we trust them" },
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright { 3, "we trust each other" },
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright { 0, NULL },
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright};
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbabanstatic int
12b65585e720714b31036daaa2b30eb76014048eGordon Rossgenerate_machine_uuid(char **machine_uuid)
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjp{
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban uuid_t uu;
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban
12b65585e720714b31036daaa2b30eb76014048eGordon Ross *machine_uuid = calloc(1, UUID_PRINTABLE_STRING_LENGTH + 1);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (*machine_uuid == NULL) {
71590c90e239661c113497da3ca8b7301dfbe24cnw idmapdlog(LOG_ERR, "Out of memory");
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban return (-1);
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban }
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban uuid_clear(uu);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross uuid_generate_time(uu);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross uuid_unparse(uu, *machine_uuid);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross return (0);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross}
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Rossstatic int
12b65585e720714b31036daaa2b30eb76014048eGordon Rossgenerate_machine_sid(char **machine_sid, char *machine_uuid)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross{
12b65585e720714b31036daaa2b30eb76014048eGordon Ross union {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross uuid_t uu;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross uint32_t v[4];
12b65585e720714b31036daaa2b30eb76014048eGordon Ross } uv;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross int len;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross /*
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Split the 128-bit machine UUID into three 32-bit values
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * we'll use as the "sub-authorities" of the machine SID.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * The machine_sid will have the form S-1-5-21-J-K-L
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * (that's four sub-authorities altogether) where:
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * J = last 4 bytes of node_addr,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * K = time_mid, time_hi_and_version
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * L = time_low
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * (see struct uuid)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross (void) memset(&uv, 0, sizeof (uv));
12b65585e720714b31036daaa2b30eb76014048eGordon Ross (void) uuid_parse(machine_uuid, uv.uu);
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban
12b65585e720714b31036daaa2b30eb76014048eGordon Ross len = asprintf(machine_sid, "S-1-5-21-%u-%u-%u",
12b65585e720714b31036daaa2b30eb76014048eGordon Ross uv.v[3], uv.v[0], uv.v[1]);
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (len == -1 || *machine_sid == NULL) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross idmapdlog(LOG_ERR, "Out of memory");
12b65585e720714b31036daaa2b30eb76014048eGordon Ross return (-1);
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban }
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban return (0);
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban}
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm/* In the case of error, exists is set to FALSE anyway */
479ac37569625bae44ffb80071d4bc865fc710eddmstatic int
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaiprop_exists(idmap_cfg_handles_t *handles, const char *name, boolean_t *exists)
71590c90e239661c113497da3ca8b7301dfbe24cnw{
71590c90e239661c113497da3ca8b7301dfbe24cnw
479ac37569625bae44ffb80071d4bc865fc710eddm scf_property_t *scf_prop;
479ac37569625bae44ffb80071d4bc865fc710eddm
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen *exists = B_FALSE;
479ac37569625bae44ffb80071d4bc865fc710eddm
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_prop = scf_property_create(handles->main);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (scf_prop == NULL) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_ERR, "scf_property_create() failed: %s",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_strerror(scf_error()));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (-1);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (scf_pg_get_property(handles->config_pg, name, scf_prop) == 0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *exists = B_TRUE;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_property_destroy(scf_prop);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (0);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic int
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightget_debug(idmap_cfg_handles_t *handles, const char *name)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int64_t i64 = 0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_property_t *scf_prop;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_value_t *value;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_prop = scf_property_create(handles->main);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (scf_prop == NULL) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_ERR, "scf_property_create() failed: %s",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_strerror(scf_error()));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright abort();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright value = scf_value_create(handles->main);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (value == NULL) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_ERR, "scf_value_create() failed: %s",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_strerror(scf_error()));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright abort();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (scf_pg_get_property(handles->debug_pg, name, scf_prop) < 0) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /* this is OK: the property is just undefined */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright goto destruction;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (scf_property_get_value(scf_prop, value) < 0) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /* It is still OK when a property doesn't have any value */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright goto destruction;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (scf_value_get_integer(value, &i64) != 0) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_ERR, "Can not retrieve %s/%s: %s",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright DEBUG_PG, name, scf_strerror(scf_error()));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright abort();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightdestruction:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_value_destroy(value);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_property_destroy(scf_prop);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return ((int)i64);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic int
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightget_val_bool(idmap_cfg_handles_t *handles, const char *name,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright boolean_t *val, boolean_t default_val)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int rc = 0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_property_t *scf_prop;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_value_t *value;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *val = default_val;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
479ac37569625bae44ffb80071d4bc865fc710eddm scf_prop = scf_property_create(handles->main);
479ac37569625bae44ffb80071d4bc865fc710eddm if (scf_prop == NULL) {
479ac37569625bae44ffb80071d4bc865fc710eddm idmapdlog(LOG_ERR, "scf_property_create() failed: %s",
479ac37569625bae44ffb80071d4bc865fc710eddm scf_strerror(scf_error()));
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm value = scf_value_create(handles->main);
479ac37569625bae44ffb80071d4bc865fc710eddm if (value == NULL) {
479ac37569625bae44ffb80071d4bc865fc710eddm idmapdlog(LOG_ERR, "scf_value_create() failed: %s",
479ac37569625bae44ffb80071d4bc865fc710eddm scf_strerror(scf_error()));
479ac37569625bae44ffb80071d4bc865fc710eddm scf_property_destroy(scf_prop);
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm }
71590c90e239661c113497da3ca8b7301dfbe24cnw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /* It is OK if the property is undefined */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (scf_pg_get_property(handles->config_pg, name, scf_prop) < 0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright goto destruction;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /* It is still OK when a property doesn't have any value */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (scf_property_get_value(scf_prop, value) < 0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright goto destruction;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint8_t b;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = scf_value_get_boolean(value, &b);
71590c90e239661c113497da3ca8b7301dfbe24cnw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (rc == 0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *val = (boolean_t)b;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightdestruction:
71590c90e239661c113497da3ca8b7301dfbe24cnw scf_value_destroy(value);
71590c90e239661c113497da3ca8b7301dfbe24cnw scf_property_destroy(scf_prop);
71590c90e239661c113497da3ca8b7301dfbe24cnw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (rc);
71590c90e239661c113497da3ca8b7301dfbe24cnw}
71590c90e239661c113497da3ca8b7301dfbe24cnw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaiget_val_int(idmap_cfg_handles_t *handles, const char *name,
c8e261054d98729a8718903716b9b8a512d8b693jp void *val, scf_type_t type)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int rc = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
479ac37569625bae44ffb80071d4bc865fc710eddm scf_property_t *scf_prop;
479ac37569625bae44ffb80071d4bc865fc710eddm scf_value_t *value;
479ac37569625bae44ffb80071d4bc865fc710eddm
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw switch (type) {
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw case SCF_TYPE_COUNT:
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw *(uint64_t *)val = 0;
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw break;
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw case SCF_TYPE_INTEGER:
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw *(int64_t *)val = 0;
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw break;
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw default:
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw idmapdlog(LOG_ERR, "Invalid scf integer type (%d)",
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw type);
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw abort();
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw }
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw
479ac37569625bae44ffb80071d4bc865fc710eddm scf_prop = scf_property_create(handles->main);
479ac37569625bae44ffb80071d4bc865fc710eddm if (scf_prop == NULL) {
479ac37569625bae44ffb80071d4bc865fc710eddm idmapdlog(LOG_ERR, "scf_property_create() failed: %s",
479ac37569625bae44ffb80071d4bc865fc710eddm scf_strerror(scf_error()));
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm value = scf_value_create(handles->main);
479ac37569625bae44ffb80071d4bc865fc710eddm if (value == NULL) {
479ac37569625bae44ffb80071d4bc865fc710eddm idmapdlog(LOG_ERR, "scf_value_create() failed: %s",
479ac37569625bae44ffb80071d4bc865fc710eddm scf_strerror(scf_error()));
479ac37569625bae44ffb80071d4bc865fc710eddm scf_property_destroy(scf_prop);
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c8e261054d98729a8718903716b9b8a512d8b693jp if (scf_pg_get_property(handles->config_pg, name, scf_prop) < 0)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* this is OK: the property is just undefined */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto destruction;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c8e261054d98729a8718903716b9b8a512d8b693jp if (scf_property_get_value(scf_prop, value) < 0)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* It is still OK when a property doesn't have any value */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto destruction;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw switch (type) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case SCF_TYPE_COUNT:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rc = scf_value_get_count(value, val);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case SCF_TYPE_INTEGER:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rc = scf_value_get_integer(value, val);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai default:
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai abort(); /* tested above */
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai /* NOTREACHED */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (rc != 0) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai idmapdlog(LOG_ERR, "Can not retrieve config/%s: %s",
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai name, scf_strerror(scf_error()));
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwdestruction:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw scf_value_destroy(value);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw scf_property_destroy(scf_prop);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (rc);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic char *
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaiscf_value2string(const char *name, scf_value_t *value)
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjp{
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai static size_t max_val = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (max_val == 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai max_val = scf_limit(SCF_LIMIT_MAX_VALUE_LENGTH);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai char buf[max_val + 1];
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (scf_value_get_astring(value, buf, max_val + 1) < 0) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai idmapdlog(LOG_ERR, "Can not retrieve config/%s: %s",
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai name, scf_strerror(scf_error()));
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (NULL);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai char *s = strdup(buf);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (s == NULL)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai idmapdlog(LOG_ERR, "Out of memory");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (s);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c8e261054d98729a8718903716b9b8a512d8b693jpstatic int
c8e261054d98729a8718903716b9b8a512d8b693jpget_val_ds(idmap_cfg_handles_t *handles, const char *name, int defport,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross ad_disc_ds_t **val)
c8e261054d98729a8718903716b9b8a512d8b693jp{
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross char port_str[8];
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross struct addrinfo hints;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross struct addrinfo *ai;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross ad_disc_ds_t *servers = NULL;
c8e261054d98729a8718903716b9b8a512d8b693jp scf_property_t *scf_prop;
c8e261054d98729a8718903716b9b8a512d8b693jp scf_value_t *value;
c8e261054d98729a8718903716b9b8a512d8b693jp scf_iter_t *iter;
c8e261054d98729a8718903716b9b8a512d8b693jp char *host, *portstr;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross int err, len, i;
c8e261054d98729a8718903716b9b8a512d8b693jp int count = 0;
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw int rc = -1;
c8e261054d98729a8718903716b9b8a512d8b693jp
c8e261054d98729a8718903716b9b8a512d8b693jp *val = NULL;
c8e261054d98729a8718903716b9b8a512d8b693jp
c8e261054d98729a8718903716b9b8a512d8b693jprestart:
c8e261054d98729a8718903716b9b8a512d8b693jp scf_prop = scf_property_create(handles->main);
479ac37569625bae44ffb80071d4bc865fc710eddm if (scf_prop == NULL) {
479ac37569625bae44ffb80071d4bc865fc710eddm idmapdlog(LOG_ERR, "scf_property_create() failed: %s",
479ac37569625bae44ffb80071d4bc865fc710eddm scf_strerror(scf_error()));
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm
c8e261054d98729a8718903716b9b8a512d8b693jp value = scf_value_create(handles->main);
479ac37569625bae44ffb80071d4bc865fc710eddm if (value == NULL) {
479ac37569625bae44ffb80071d4bc865fc710eddm idmapdlog(LOG_ERR, "scf_value_create() failed: %s",
479ac37569625bae44ffb80071d4bc865fc710eddm scf_strerror(scf_error()));
479ac37569625bae44ffb80071d4bc865fc710eddm scf_property_destroy(scf_prop);
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm
c8e261054d98729a8718903716b9b8a512d8b693jp iter = scf_iter_create(handles->main);
479ac37569625bae44ffb80071d4bc865fc710eddm if (iter == NULL) {
479ac37569625bae44ffb80071d4bc865fc710eddm idmapdlog(LOG_ERR, "scf_iter_create() failed: %s",
479ac37569625bae44ffb80071d4bc865fc710eddm scf_strerror(scf_error()));
479ac37569625bae44ffb80071d4bc865fc710eddm scf_value_destroy(value);
479ac37569625bae44ffb80071d4bc865fc710eddm scf_property_destroy(scf_prop);
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm }
c8e261054d98729a8718903716b9b8a512d8b693jp
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw if (scf_pg_get_property(handles->config_pg, name, scf_prop) < 0) {
c8e261054d98729a8718903716b9b8a512d8b693jp /* this is OK: the property is just undefined */
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw rc = 0;
c8e261054d98729a8718903716b9b8a512d8b693jp goto destruction;
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw }
c8e261054d98729a8718903716b9b8a512d8b693jp
c8e261054d98729a8718903716b9b8a512d8b693jp if (scf_iter_property_values(iter, scf_prop) < 0) {
c8e261054d98729a8718903716b9b8a512d8b693jp idmapdlog(LOG_ERR,
71590c90e239661c113497da3ca8b7301dfbe24cnw "scf_iter_property_values(%s) failed: %s",
71590c90e239661c113497da3ca8b7301dfbe24cnw name, scf_strerror(scf_error()));
c8e261054d98729a8718903716b9b8a512d8b693jp goto destruction;
c8e261054d98729a8718903716b9b8a512d8b693jp }
c8e261054d98729a8718903716b9b8a512d8b693jp
c8e261054d98729a8718903716b9b8a512d8b693jp /* Workaround scf bugs -- can't reset an iteration */
c8e261054d98729a8718903716b9b8a512d8b693jp if (count == 0) {
c8e261054d98729a8718903716b9b8a512d8b693jp while (scf_iter_next_value(iter, value) > 0)
c8e261054d98729a8718903716b9b8a512d8b693jp count++;
c8e261054d98729a8718903716b9b8a512d8b693jp
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw if (count == 0) {
c8e261054d98729a8718903716b9b8a512d8b693jp /* no values */
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw rc = 0;
c8e261054d98729a8718903716b9b8a512d8b693jp goto destruction;
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw }
c8e261054d98729a8718903716b9b8a512d8b693jp
c8e261054d98729a8718903716b9b8a512d8b693jp scf_value_destroy(value);
c8e261054d98729a8718903716b9b8a512d8b693jp scf_iter_destroy(iter);
c8e261054d98729a8718903716b9b8a512d8b693jp scf_property_destroy(scf_prop);
c8e261054d98729a8718903716b9b8a512d8b693jp goto restart;
c8e261054d98729a8718903716b9b8a512d8b693jp }
c8e261054d98729a8718903716b9b8a512d8b693jp
c8e261054d98729a8718903716b9b8a512d8b693jp if ((servers = calloc(count + 1, sizeof (*servers))) == NULL) {
71590c90e239661c113497da3ca8b7301dfbe24cnw idmapdlog(LOG_ERR, "Out of memory");
c8e261054d98729a8718903716b9b8a512d8b693jp goto destruction;
c8e261054d98729a8718903716b9b8a512d8b693jp }
c8e261054d98729a8718903716b9b8a512d8b693jp
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) memset(&hints, 0, sizeof (hints));
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross hints.ai_protocol = IPPROTO_TCP;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross hints.ai_socktype = SOCK_STREAM;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross host = NULL;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw i = 0;
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw while (i < count && scf_iter_next_value(iter, value) > 0) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (host) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross free(host);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross host = NULL;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw servers[i].priority = 0;
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw servers[i].weight = 100;
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw servers[i].port = defport;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if ((host = scf_value2string(name, value)) == NULL)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross continue;
c8e261054d98729a8718903716b9b8a512d8b693jp if ((portstr = strchr(host, ':')) != NULL) {
c8e261054d98729a8718903716b9b8a512d8b693jp *portstr++ = '\0';
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw servers[i].port = strtol(portstr,
c8e261054d98729a8718903716b9b8a512d8b693jp (char **)NULL, 10);
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw if (servers[i].port == 0)
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw servers[i].port = defport;
c8e261054d98729a8718903716b9b8a512d8b693jp }
c8e261054d98729a8718903716b9b8a512d8b693jp
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross /*
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Ignore this server if the hostname is too long
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * or empty (continue without i++)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross len = strlen(host);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (len == 0) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (DBG(CONFIG, 1)) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_INFO, "%s host=\"\"", name);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross continue;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (len >= sizeof (servers->host)) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_ERR, "Host name too long: %s", host);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_ERR, "ignoring %s value", name);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross continue;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross /*
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Get the host address too. If we can't, then
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * log an error and skip this host.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) snprintf(port_str, sizeof (port_str),
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross "%d", servers[i].port);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross ai = NULL;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross err = getaddrinfo(host, port_str, &hints, &ai);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (err != 0) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_ERR, "No address for host: %s (%s)",
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross host, gai_strerror(err));
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_ERR, "ignoring %s value", name);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross continue;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) strlcpy(servers[i].host, host,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross sizeof (servers->host));
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) memcpy(&servers[i].addr, ai->ai_addr, ai->ai_addrlen);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross freeaddrinfo(ai);
c8e261054d98729a8718903716b9b8a512d8b693jp
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross /* Added a DS to the array. */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross i++;
c8e261054d98729a8718903716b9b8a512d8b693jp }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross free(host);
c8e261054d98729a8718903716b9b8a512d8b693jp
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (i == 0) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (DBG(CONFIG, 1)) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_INFO, "%s is empty", name);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross free(servers);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross servers = NULL;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
c8e261054d98729a8718903716b9b8a512d8b693jp *val = servers;
c8e261054d98729a8718903716b9b8a512d8b693jp
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw rc = 0;
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw
c8e261054d98729a8718903716b9b8a512d8b693jpdestruction:
c8e261054d98729a8718903716b9b8a512d8b693jp scf_value_destroy(value);
c8e261054d98729a8718903716b9b8a512d8b693jp scf_iter_destroy(iter);
c8e261054d98729a8718903716b9b8a512d8b693jp scf_property_destroy(scf_prop);
c8e261054d98729a8718903716b9b8a512d8b693jp
c8e261054d98729a8718903716b9b8a512d8b693jp if (rc < 0) {
c8e261054d98729a8718903716b9b8a512d8b693jp if (servers)
c8e261054d98729a8718903716b9b8a512d8b693jp free(servers);
c8e261054d98729a8718903716b9b8a512d8b693jp *val = NULL;
c8e261054d98729a8718903716b9b8a512d8b693jp }
c8e261054d98729a8718903716b9b8a512d8b693jp
c8e261054d98729a8718903716b9b8a512d8b693jp return (rc);
c8e261054d98729a8718903716b9b8a512d8b693jp}
c8e261054d98729a8718903716b9b8a512d8b693jp
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaiget_val_astring(idmap_cfg_handles_t *handles, const char *name, char **val)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int rc = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
479ac37569625bae44ffb80071d4bc865fc710eddm scf_property_t *scf_prop;
479ac37569625bae44ffb80071d4bc865fc710eddm scf_value_t *value;
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm scf_prop = scf_property_create(handles->main);
479ac37569625bae44ffb80071d4bc865fc710eddm if (scf_prop == NULL) {
479ac37569625bae44ffb80071d4bc865fc710eddm idmapdlog(LOG_ERR, "scf_property_create() failed: %s",
479ac37569625bae44ffb80071d4bc865fc710eddm scf_strerror(scf_error()));
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm value = scf_value_create(handles->main);
479ac37569625bae44ffb80071d4bc865fc710eddm if (value == NULL) {
479ac37569625bae44ffb80071d4bc865fc710eddm idmapdlog(LOG_ERR, "scf_value_create() failed: %s",
479ac37569625bae44ffb80071d4bc865fc710eddm scf_strerror(scf_error()));
479ac37569625bae44ffb80071d4bc865fc710eddm scf_property_destroy(scf_prop);
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c8e261054d98729a8718903716b9b8a512d8b693jp *val = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c8e261054d98729a8718903716b9b8a512d8b693jp if (scf_pg_get_property(handles->config_pg, name, scf_prop) < 0)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* this is OK: the property is just undefined */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto destruction;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c8e261054d98729a8718903716b9b8a512d8b693jp if (scf_property_get_value(scf_prop, value) < 0) {
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban idmapdlog(LOG_ERR,
71590c90e239661c113497da3ca8b7301dfbe24cnw "scf_property_get_value(%s) failed: %s",
71590c90e239661c113497da3ca8b7301dfbe24cnw name, scf_strerror(scf_error()));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rc = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto destruction;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai *val = scf_value2string(name, value);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (*val == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rc = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwdestruction:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw scf_value_destroy(value);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw scf_property_destroy(scf_prop);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (rc < 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (*val)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(*val);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *val = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (rc);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c8e261054d98729a8718903716b9b8a512d8b693jp
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbabanstatic int
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightdel_val(
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmap_cfg_handles_t *handles,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_propertygroup_t *pg,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright const char *name)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai{
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai int rc = -1;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai int ret;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai scf_transaction_t *tx = NULL;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai scf_transaction_entry_t *ent = NULL;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if ((tx = scf_transaction_create(handles->main)) == NULL) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai idmapdlog(LOG_ERR,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai "scf_transaction_create() failed: %s",
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai scf_strerror(scf_error()));
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai goto destruction;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if ((ent = scf_entry_create(handles->main)) == NULL) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai idmapdlog(LOG_ERR,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai "scf_entry_create() failed: %s",
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai scf_strerror(scf_error()));
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai goto destruction;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai do {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (scf_pg_update(pg) == -1) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai idmapdlog(LOG_ERR,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai "scf_pg_update(%s) failed: %s",
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai name, scf_strerror(scf_error()));
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai goto destruction;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (scf_transaction_start(tx, pg) != 0) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai idmapdlog(LOG_ERR,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai "scf_transaction_start(%s) failed: %s",
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai name, scf_strerror(scf_error()));
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai goto destruction;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (scf_transaction_property_delete(tx, ent, name) != 0) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai /* Don't complain if it already doesn't exist. */
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (scf_error() != SCF_ERROR_NOT_FOUND) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai idmapdlog(LOG_ERR,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai "scf_transaction_property_delete() failed:"
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai " %s",
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai scf_strerror(scf_error()));
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai goto destruction;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai ret = scf_transaction_commit(tx);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (ret == 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai scf_transaction_reset(tx);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai } while (ret == 0);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (ret == -1) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai idmapdlog(LOG_ERR,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai "scf_transaction_commit(%s) failed: %s",
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai name, scf_strerror(scf_error()));
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai goto destruction;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = 0;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaidestruction:
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (ent != NULL)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai scf_entry_destroy(ent);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (tx != NULL)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai scf_transaction_destroy(tx);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (rc);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai}
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaistatic int
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightset_val(
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmap_cfg_handles_t *handles,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_propertygroup_t *pg,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright const char *name,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_value_t *value)
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban{
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw int rc = -1;
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw int i;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_property_t *prop = NULL;
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban scf_transaction_t *tx = NULL;
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban scf_transaction_entry_t *ent = NULL;
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if ((prop = scf_property_create(handles->main)) == NULL ||
c8e261054d98729a8718903716b9b8a512d8b693jp (tx = scf_transaction_create(handles->main)) == NULL ||
c8e261054d98729a8718903716b9b8a512d8b693jp (ent = scf_entry_create(handles->main)) == NULL) {
71590c90e239661c113497da3ca8b7301dfbe24cnw idmapdlog(LOG_ERR, "Unable to set property %s",
71590c90e239661c113497da3ca8b7301dfbe24cnw name, scf_strerror(scf_error()));
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban goto destruction;
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban }
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright for (i = 0; i < MAX_TRIES; i++) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int ret;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (scf_pg_update(pg) == -1) {
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban idmapdlog(LOG_ERR,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "scf_pg_update() failed: %s",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_strerror(scf_error()));
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban goto destruction;
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban }
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (scf_transaction_start(tx, pg) == -1) {
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban idmapdlog(LOG_ERR,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "scf_transaction_start(%s) failed: %s",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright name, scf_strerror(scf_error()));
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban goto destruction;
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban }
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ret = scf_pg_get_property(pg, name, prop);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (ret == SCF_SUCCESS) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (scf_transaction_property_change_type(tx, ent, name,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_value_type(value)) < 0) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_ERR,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "scf_transaction_property_change_type(%s)"
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright " failed: %s",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright name, scf_strerror(scf_error()));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright goto destruction;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright } else if (scf_error() == SCF_ERROR_NOT_FOUND) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (scf_transaction_property_new(tx, ent, name,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_value_type(value)) < 0) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_ERR,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "scf_transaction_property_new() failed: %s",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_strerror(scf_error()));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright goto destruction;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright } else {
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban idmapdlog(LOG_ERR,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "scf_pg_get_property(%s) failed: %s",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright name, scf_strerror(scf_error()));
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban goto destruction;
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban }
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban if (scf_entry_add_value(ent, value) == -1) {
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban idmapdlog(LOG_ERR,
71590c90e239661c113497da3ca8b7301dfbe24cnw "scf_entry_add_value() failed: %s",
71590c90e239661c113497da3ca8b7301dfbe24cnw scf_strerror(scf_error()));
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban goto destruction;
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban }
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ret = scf_transaction_commit(tx);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (ret == 0) {
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban /*
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban * Property group set in scf_transaction_start()
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban * is not the most recent. Update pg, reset tx and
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban * retry tx.
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban */
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban idmapdlog(LOG_WARNING,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "scf_transaction_commit(%s) failed: %s",
71590c90e239661c113497da3ca8b7301dfbe24cnw name, scf_strerror(scf_error()));
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban scf_transaction_reset(tx);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright continue;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (ret != 1) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_ERR,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "scf_transaction_commit(%s) failed: %s",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright name, scf_strerror(scf_error()));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright goto destruction;
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /* Success! */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = 0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright break;
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban }
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightdestruction:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_entry_destroy(ent);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_transaction_destroy(tx);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_property_destroy(prop);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (rc);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic int
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightset_val_integer(
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmap_cfg_handles_t *handles,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_propertygroup_t *pg,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright const char *name,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int64_t val)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_value_t *value = NULL;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int rc;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if ((value = scf_value_create(handles->main)) == NULL) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_ERR, "Unable to set property %s",
71590c90e239661c113497da3ca8b7301dfbe24cnw name, scf_strerror(scf_error()));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (-1);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_value_set_integer(value, val);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = set_val(handles, pg, name, value);
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban scf_value_destroy(value);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (rc);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic int
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightset_val_astring(
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmap_cfg_handles_t *handles,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_propertygroup_t *pg,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright const char *name,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright const char *val)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_value_t *value = NULL;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int rc = -1;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if ((value = scf_value_create(handles->main)) == NULL) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_ERR, "Unable to set property %s",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright name, scf_strerror(scf_error()));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright goto out;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (scf_value_set_astring(value, val) == -1) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_ERR,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "scf_value_set_astring() failed: %s",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_strerror(scf_error()));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright goto out;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = set_val(handles, pg, name, value);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightout:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_value_destroy(value);
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban return (rc);
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban}
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen/*
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * This function updates a boolean value.
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * If nothing has changed it returns 0 else 1
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen */
c8e261054d98729a8718903716b9b8a512d8b693jpstatic int
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullenupdate_bool(boolean_t *value, boolean_t *new, char *name)
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw{
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw if (*value == *new)
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw return (0);
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 1)) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_INFO, "change %s=%s", name,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *new ? "true" : "false");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw *value = *new;
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw return (1);
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw}
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross/*
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross * This function updates a uint64_t value.
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross * If nothing has changed it returns 0 else 1
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross */
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Rossstatic int
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Rossupdate_uint64(uint64_t *value, uint64_t *new, char *name)
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross{
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross if (*value == *new)
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross return (0);
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross if (DBG(CONFIG, 1))
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross idmapdlog(LOG_INFO, "change %s=%llu", name, *new);
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross *value = *new;
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross return (1);
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross}
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen/*
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * This function updates a string value.
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * If nothing has changed it returns 0 else 1
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen */
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nwstatic int
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nwupdate_string(char **value, char **new, char *name)
c8e261054d98729a8718903716b9b8a512d8b693jp{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int changed;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (*new == NULL && *value != NULL)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright changed = 1;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright else if (*new != NULL && *value == NULL)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright changed = 1;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright else if (*new != NULL && *value != NULL && strcmp(*new, *value) != 0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright changed = 1;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright else
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright changed = 0;
c8e261054d98729a8718903716b9b8a512d8b693jp
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Note that even if unchanged we can't just return; we must free one
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * of the values.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
c8e261054d98729a8718903716b9b8a512d8b693jp
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 1) && changed)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_INFO, "change %s=%s", name, CHECK_NULL(*new));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright free(*value);
c8e261054d98729a8718903716b9b8a512d8b693jp *value = *new;
c8e261054d98729a8718903716b9b8a512d8b693jp *new = NULL;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (changed);
c8e261054d98729a8718903716b9b8a512d8b693jp}
c8e261054d98729a8718903716b9b8a512d8b693jp
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaistatic int
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaiupdate_enum(int *value, int *new, char *name, struct enum_lookup_map *map)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai{
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (*value == *new)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (0);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 1)) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_INFO, "change %s=%s", name,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright enum_lookup(*new, map));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai *value = *new;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai}
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen/*
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * This function updates a directory service structure.
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * If nothing has changed it returns 0 else 1
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen */
c8e261054d98729a8718903716b9b8a512d8b693jpstatic int
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rossupdate_dirs(ad_disc_ds_t **value, ad_disc_ds_t **new, char *name)
c8e261054d98729a8718903716b9b8a512d8b693jp{
c8e261054d98729a8718903716b9b8a512d8b693jp
0dcc71495bad040a0c83830efc85acf8d897350dnw if (*value == *new)
0dcc71495bad040a0c83830efc85acf8d897350dnw /* Nothing to do */
349d5d8f2e43f7f425bc3d025dda555187160ab7nw return (0);
c8e261054d98729a8718903716b9b8a512d8b693jp
0dcc71495bad040a0c83830efc85acf8d897350dnw if (*value != NULL && *new != NULL &&
0dcc71495bad040a0c83830efc85acf8d897350dnw ad_disc_compare_ds(*value, *new) == 0) {
c8e261054d98729a8718903716b9b8a512d8b693jp free(*new);
c8e261054d98729a8718903716b9b8a512d8b693jp *new = NULL;
349d5d8f2e43f7f425bc3d025dda555187160ab7nw return (0);
c8e261054d98729a8718903716b9b8a512d8b693jp }
c8e261054d98729a8718903716b9b8a512d8b693jp
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (*value != NULL)
c8e261054d98729a8718903716b9b8a512d8b693jp free(*value);
c8e261054d98729a8718903716b9b8a512d8b693jp
c8e261054d98729a8718903716b9b8a512d8b693jp *value = *new;
c8e261054d98729a8718903716b9b8a512d8b693jp *new = NULL;
0dcc71495bad040a0c83830efc85acf8d897350dnw
0dcc71495bad040a0c83830efc85acf8d897350dnw if (*value == NULL) {
0dcc71495bad040a0c83830efc85acf8d897350dnw /* We're unsetting this DS property */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 1))
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_INFO, "change %s=<none>", name);
349d5d8f2e43f7f425bc3d025dda555187160ab7nw return (1);
0dcc71495bad040a0c83830efc85acf8d897350dnw }
0dcc71495bad040a0c83830efc85acf8d897350dnw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 1)) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /* List all the new DSs */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross char buf[64];
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross ad_disc_ds_t *ds;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross for (ds = *value; ds->host[0] != '\0'; ds++) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (ad_disc_getnameinfo(buf, sizeof (buf), &ds->addr))
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) strlcpy(buf, "?", sizeof (buf));
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_INFO, "change %s=%s addr=%s port=%d",
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross name, ds->host, buf, ds->port);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
349d5d8f2e43f7f425bc3d025dda555187160ab7nw return (1);
c8e261054d98729a8718903716b9b8a512d8b693jp}
c8e261054d98729a8718903716b9b8a512d8b693jp
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen/*
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * This function updates a trusted domains structure.
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * If nothing has changed it returns 0 else 1
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen */
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullenstatic int
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullenupdate_trusted_domains(ad_disc_trusteddomains_t **value,
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad_disc_trusteddomains_t **new, char *name)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen{
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen int i;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (*value == *new)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen /* Nothing to do */
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return (0);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (*value != NULL && *new != NULL &&
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad_disc_compare_trusteddomains(*value, *new) == 0) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen free(*new);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen *new = NULL;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return (0);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (*value != NULL)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen free(*value);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen *value = *new;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen *new = NULL;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (*value == NULL) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen /* We're unsetting this DS property */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 1))
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_INFO, "change %s=<none>", name);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return (1);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 1)) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /* List all the new domains */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright for (i = 0; (*value)[i].domain[0] != '\0'; i++) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_INFO, "change %s=%s direction=%s", name,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (*value)[i].domain,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright enum_lookup((*value)[i].direction, trust_dir_map));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return (1);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen}
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen/*
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * This function updates a domains in a forest structure.
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * If nothing has changed it returns 0 else 1
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen */
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullenstatic int
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullenupdate_domains_in_forest(ad_disc_domainsinforest_t **value,
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad_disc_domainsinforest_t **new, char *name)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen{
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen int i;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (*value == *new)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen /* Nothing to do */
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return (0);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (*value != NULL && *new != NULL &&
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad_disc_compare_domainsinforest(*value, *new) == 0) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen free(*new);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen *new = NULL;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return (0);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (*value != NULL)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen free(*value);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen *value = *new;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen *new = NULL;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (*value == NULL) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen /* We're unsetting this DS property */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 1))
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_INFO, "change %s=<none>", name);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return (1);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 1)) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /* List all the new domains */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright for (i = 0; (*value)[i].domain[0] != '\0'; i++) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_INFO, "change %s=%s", name,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (*value)[i].domain);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return (1);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen}
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullenstatic void
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullenfree_trusted_forests(idmap_trustedforest_t **value, int *num_values)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen{
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen int i;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen for (i = 0; i < *num_values; i++) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen free((*value)[i].forest_name);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen free((*value)[i].global_catalog);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen free((*value)[i].domains_in_forest);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen free(*value);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen *value = NULL;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen *num_values = 0;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen}
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullenstatic int
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullencompare_trusteddomainsinforest(ad_disc_domainsinforest_t *df1,
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad_disc_domainsinforest_t *df2)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen{
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen int i, j;
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen int num_df1 = 0;
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen int num_df2 = 0;
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen boolean_t match;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen for (i = 0; df1[i].domain[0] != '\0'; i++)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (df1[i].trusted)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen num_df1++;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen for (j = 0; df2[j].domain[0] != '\0'; j++)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (df2[j].trusted)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen num_df2++;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (num_df1 != num_df2)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return (1);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen for (i = 0; df1[i].domain[0] != '\0'; i++) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (df1[i].trusted) {
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen match = B_FALSE;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen for (j = 0; df2[j].domain[0] != '\0'; j++) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (df2[j].trusted &&
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown domain_eq(df1[i].domain, df2[j].domain) &&
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown strcmp(df1[i].sid, df2[j].sid) == 0) {
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen match = B_TRUE;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen break;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (!match)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return (1);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return (0);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen}
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen/*
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * This function updates trusted forest structure.
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * If nothing has changed it returns 0 else 1
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen */
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullenstatic int
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullenupdate_trusted_forest(idmap_trustedforest_t **value, int *num_value,
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen idmap_trustedforest_t **new, int *num_new, char *name)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen{
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen int i, j;
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen boolean_t match;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (*value == *new)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen /* Nothing to do */
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return (0);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (*value != NULL && *new != NULL) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (*num_value != *num_new)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen goto not_equal;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen for (i = 0; i < *num_value; i++) {
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen match = B_FALSE;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen for (j = 0; j < *num_new; j++) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (strcmp((*value)[i].forest_name,
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen (*new)[j].forest_name) == 0 &&
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad_disc_compare_ds(
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen (*value)[i].global_catalog,
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown (*new)[j].global_catalog) == 0 &&
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen compare_trusteddomainsinforest(
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen (*value)[i].domains_in_forest,
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown (*new)[j].domains_in_forest) == 0) {
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen match = B_TRUE;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen break;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (!match)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen goto not_equal;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen free_trusted_forests(new, num_new);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return (0);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullennot_equal:
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (*value != NULL)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen free_trusted_forests(value, num_value);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen *value = *new;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen *num_value = *num_new;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen *new = NULL;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen *num_new = 0;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (*value == NULL) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen /* We're unsetting this DS property */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 1))
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_INFO, "change %s=<none>", name);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return (1);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 1)) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /* List all the trusted forests */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright for (i = 0; i < *num_value; i++) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmap_trustedforest_t *f = &(*value)[i];
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright for (j = 0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright f->domains_in_forest[j].domain[0] != '\0';
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright j++) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /* List trusted Domains in the forest. */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (f->domains_in_forest[j].trusted)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_INFO,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "change %s=%s domain=%s",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright name, f->forest_name,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright f->domains_in_forest[j].domain);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /* List the hosts */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright for (j = 0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright f->global_catalog[j].host[0] != '\0';
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright j++) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_INFO,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "change %s=%s host=%s port=%d",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright name, f->forest_name,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright f->global_catalog[j].host,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright f->global_catalog[j].port);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return (1);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen}
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaiconst char *
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaienum_lookup(int value, struct enum_lookup_map *map)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai{
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai for (; map->string != NULL; map++) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (value == map->value) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (map->string);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return ("(invalid)");
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai}
c8e261054d98729a8718903716b9b8a512d8b693jp
c8e261054d98729a8718903716b9b8a512d8b693jp/*
0dcc71495bad040a0c83830efc85acf8d897350dnw * Returns 1 if the PF_ROUTE socket event indicates that we should rescan the
0dcc71495bad040a0c83830efc85acf8d897350dnw * interfaces.
c8e261054d98729a8718903716b9b8a512d8b693jp *
0dcc71495bad040a0c83830efc85acf8d897350dnw * Shamelessly based on smb_nics_changed() and other PF_ROUTE uses in ON.
c8e261054d98729a8718903716b9b8a512d8b693jp */
c8e261054d98729a8718903716b9b8a512d8b693jpstatic
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desaiboolean_t
0dcc71495bad040a0c83830efc85acf8d897350dnwpfroute_event_is_interesting(int rt_sock)
c8e261054d98729a8718903716b9b8a512d8b693jp{
0dcc71495bad040a0c83830efc85acf8d897350dnw int nbytes;
0dcc71495bad040a0c83830efc85acf8d897350dnw int64_t msg[2048 / 8];
0dcc71495bad040a0c83830efc85acf8d897350dnw struct rt_msghdr *rtm;
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai boolean_t is_interesting = B_FALSE;
c8e261054d98729a8718903716b9b8a512d8b693jp
0dcc71495bad040a0c83830efc85acf8d897350dnw for (;;) {
0dcc71495bad040a0c83830efc85acf8d897350dnw if ((nbytes = read(rt_sock, msg, sizeof (msg))) <= 0)
0dcc71495bad040a0c83830efc85acf8d897350dnw break;
0dcc71495bad040a0c83830efc85acf8d897350dnw rtm = (struct rt_msghdr *)msg;
0dcc71495bad040a0c83830efc85acf8d897350dnw if (rtm->rtm_version != RTM_VERSION)
0dcc71495bad040a0c83830efc85acf8d897350dnw continue;
0dcc71495bad040a0c83830efc85acf8d897350dnw if (nbytes < rtm->rtm_msglen)
0dcc71495bad040a0c83830efc85acf8d897350dnw continue;
0dcc71495bad040a0c83830efc85acf8d897350dnw switch (rtm->rtm_type) {
0dcc71495bad040a0c83830efc85acf8d897350dnw case RTM_NEWADDR:
0dcc71495bad040a0c83830efc85acf8d897350dnw case RTM_DELADDR:
0dcc71495bad040a0c83830efc85acf8d897350dnw case RTM_IFINFO:
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai is_interesting = B_TRUE;
0dcc71495bad040a0c83830efc85acf8d897350dnw break;
0dcc71495bad040a0c83830efc85acf8d897350dnw default:
0dcc71495bad040a0c83830efc85acf8d897350dnw break;
0dcc71495bad040a0c83830efc85acf8d897350dnw }
c8e261054d98729a8718903716b9b8a512d8b693jp }
0dcc71495bad040a0c83830efc85acf8d897350dnw return (is_interesting);
0dcc71495bad040a0c83830efc85acf8d897350dnw}
0dcc71495bad040a0c83830efc85acf8d897350dnw
0dcc71495bad040a0c83830efc85acf8d897350dnw/*
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * Wait for an event, and report what kind of event occurred.
0dcc71495bad040a0c83830efc85acf8d897350dnw *
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * Note that there are cases where we are awoken but don't care about
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * the lower-level event. We can't just loop here because we can't
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * readily calculate how long to sleep the next time. We return
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * EVENT_NOTHING and let the caller loop.
0dcc71495bad040a0c83830efc85acf8d897350dnw */
0dcc71495bad040a0c83830efc85acf8d897350dnwstatic
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desaienum event_type
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desaiwait_for_event(struct timespec *timeoutp)
0dcc71495bad040a0c83830efc85acf8d897350dnw{
0dcc71495bad040a0c83830efc85acf8d897350dnw port_event_t pe;
c8e261054d98729a8718903716b9b8a512d8b693jp
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) memset(&pe, 0, sizeof (pe));
349d5d8f2e43f7f425bc3d025dda555187160ab7nw if (port_get(idmapd_ev_port, &pe, timeoutp) != 0) {
c8e261054d98729a8718903716b9b8a512d8b693jp switch (errno) {
c8e261054d98729a8718903716b9b8a512d8b693jp case EINTR:
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai return (EVENT_NOTHING);
c8e261054d98729a8718903716b9b8a512d8b693jp case ETIME:
c8e261054d98729a8718903716b9b8a512d8b693jp /* Timeout */
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai return (EVENT_TIMEOUT);
c8e261054d98729a8718903716b9b8a512d8b693jp default:
0dcc71495bad040a0c83830efc85acf8d897350dnw /* EBADF, EBADFD, EFAULT, EINVAL (end of time?)? */
0dcc71495bad040a0c83830efc85acf8d897350dnw idmapdlog(LOG_ERR, "Event port failed: %s",
0dcc71495bad040a0c83830efc85acf8d897350dnw strerror(errno));
0dcc71495bad040a0c83830efc85acf8d897350dnw exit(1);
0dcc71495bad040a0c83830efc85acf8d897350dnw /* NOTREACHED */
c8e261054d98729a8718903716b9b8a512d8b693jp }
c8e261054d98729a8718903716b9b8a512d8b693jp }
c8e261054d98729a8718903716b9b8a512d8b693jp
0dcc71495bad040a0c83830efc85acf8d897350dnw
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai switch (pe.portev_source) {
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai case 0:
0dcc71495bad040a0c83830efc85acf8d897350dnw /*
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * This isn't documented, but seems to be what you get if
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * the timeout is zero seconds and there are no events
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * pending.
0dcc71495bad040a0c83830efc85acf8d897350dnw */
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai return (EVENT_TIMEOUT);
c8e261054d98729a8718903716b9b8a512d8b693jp
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai case PORT_SOURCE_USER:
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross switch (pe.portev_events) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross case RECONFIGURE:
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai return (EVENT_REFRESH);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross case POKE_AUTO_DISCOVERY:
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross return (EVENT_POKED);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross case KICK_AUTO_DISCOVERY:
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross return (EVENT_KICKED);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross return (EVENT_NOTHING);
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai case PORT_SOURCE_FD:
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai if (pe.portev_object == rt_sock) {
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai /*
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * PF_ROUTE socket read event:
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * re-associate fd
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * handle event
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai */
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai if (port_associate(idmapd_ev_port, PORT_SOURCE_FD,
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai rt_sock, POLLIN, NULL) != 0) {
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai idmapdlog(LOG_ERR, "Failed to re-associate the "
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai "routing socket with the event port: %s",
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai strerror(errno));
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai abort();
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai }
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai /*
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * The network configuration may still be in flux.
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * No matter, the resolver will re-transmit and
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * timeout if need be.
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai */
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai if (pfroute_event_is_interesting(rt_sock)) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 1)) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_DEBUG,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "Interesting routing event");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai return (EVENT_ROUTING);
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai } else {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 2)) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_DEBUG,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "Boring routing event");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai return (EVENT_NOTHING);
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai }
349d5d8f2e43f7f425bc3d025dda555187160ab7nw }
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai /* Event on an FD other than the routing FD? Ignore it. */
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai break;
c8e261054d98729a8718903716b9b8a512d8b693jp }
c8e261054d98729a8718903716b9b8a512d8b693jp
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai return (EVENT_NOTHING);
c8e261054d98729a8718903716b9b8a512d8b693jp}
c8e261054d98729a8718903716b9b8a512d8b693jp
c8e261054d98729a8718903716b9b8a512d8b693jpvoid *
c8e261054d98729a8718903716b9b8a512d8b693jpidmap_cfg_update_thread(void *arg)
c8e261054d98729a8718903716b9b8a512d8b693jp{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright NOTE(ARGUNUSED(arg))
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmap_pg_config_t *pgcfg = &_idmapdstate.cfg->pgcfg;
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai const ad_disc_t ad_ctx = _idmapdstate.cfg->handles.ad_ctx;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross int flags = CFG_DISCOVER;
0dcc71495bad040a0c83830efc85acf8d897350dnw
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai for (;;) {
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai struct timespec timeout;
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai struct timespec *timeoutp;
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai int rc;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross int ttl, max_ttl;
0dcc71495bad040a0c83830efc85acf8d897350dnw
0dcc71495bad040a0c83830efc85acf8d897350dnw (void) ad_disc_SubnetChanged(ad_ctx);
c8e261054d98729a8718903716b9b8a512d8b693jp
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross rc = idmap_cfg_load(_idmapdstate.cfg, flags);
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai if (rc < -1) {
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen idmapdlog(LOG_ERR, "Fatal errors while reading "
349d5d8f2e43f7f425bc3d025dda555187160ab7nw "SMF properties");
349d5d8f2e43f7f425bc3d025dda555187160ab7nw exit(1);
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai } else if (rc == -1) {
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai idmapdlog(LOG_WARNING,
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai "Errors re-loading configuration may cause AD "
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai "lookups to fail");
349d5d8f2e43f7f425bc3d025dda555187160ab7nw }
c8e261054d98729a8718903716b9b8a512d8b693jp
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai /*
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * Wait for an interesting event. Note that we might get
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * boring events between interesting events. If so, we loop.
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross flags = CFG_DISCOVER;
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai for (;;) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross /*
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * If we don't know our domain name, don't bother
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * with rediscovery until the next config change.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Avoids hourly noise in workgroup mode.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (pgcfg->domain_name == NULL)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross ttl = -1;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross else
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross ttl = ad_disc_get_TTL(ad_ctx);
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai if (ttl < 0) {
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai timeoutp = NULL;
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai } else {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross max_ttl = (int)pgcfg->rediscovery_interval;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (ttl > max_ttl)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross ttl = max_ttl;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (ttl < MIN_REDISCOVERY_INTERVAL)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross ttl = MIN_REDISCOVERY_INTERVAL;
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai timeout.tv_sec = ttl;
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai timeout.tv_nsec = 0;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross timeoutp = &timeout;
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai }
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (DBG(CONFIG, 1))
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_DEBUG,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross "_cfg_update_thread waiting");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai switch (wait_for_event(timeoutp)) {
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai case EVENT_NOTHING:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 2))
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_DEBUG, "Boring event.");
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai continue;
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai case EVENT_REFRESH:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 1))
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_INFO, "SMF refresh");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross /*
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Forget any DC we had previously.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross flags |= CFG_FORGET_DC;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai /*
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * Blow away the ccache, we might have
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * re-joined the domain or joined a new one
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai */
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai (void) unlink(IDMAP_CACHEDIR "/ccache");
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai break;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross case EVENT_POKED:
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (DBG(CONFIG, 1))
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_DEBUG, "poked");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross break;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross case EVENT_KICKED:
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (DBG(CONFIG, 1))
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_DEBUG, "kicked");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross flags |= CFG_FORGET_DC;
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai break;
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai case EVENT_TIMEOUT:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 1))
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_DEBUG, "TTL expired");
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai break;
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai case EVENT_ROUTING:
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai /* Already logged to DEBUG */
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai break;
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai }
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai /* An interesting event! */
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai break;
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai }
c8e261054d98729a8718903716b9b8a512d8b693jp }
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai /*
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * Lint isn't happy with the concept of a function declared to
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * return something, that doesn't return. Of course, merely adding
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * the return isn't enough, because it's never reached...
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai */
c8e261054d98729a8718903716b9b8a512d8b693jp /*NOTREACHED*/
c8e261054d98729a8718903716b9b8a512d8b693jp return (NULL);
c8e261054d98729a8718903716b9b8a512d8b693jp}
c8e261054d98729a8718903716b9b8a512d8b693jp
c8e261054d98729a8718903716b9b8a512d8b693jpint
0dcc71495bad040a0c83830efc85acf8d897350dnwidmap_cfg_start_updates(void)
c8e261054d98729a8718903716b9b8a512d8b693jp{
0dcc71495bad040a0c83830efc85acf8d897350dnw if ((idmapd_ev_port = port_create()) < 0) {
71590c90e239661c113497da3ca8b7301dfbe24cnw idmapdlog(LOG_ERR, "Failed to create event port: %s",
71590c90e239661c113497da3ca8b7301dfbe24cnw strerror(errno));
c8e261054d98729a8718903716b9b8a512d8b693jp return (-1);
0dcc71495bad040a0c83830efc85acf8d897350dnw }
0dcc71495bad040a0c83830efc85acf8d897350dnw
0dcc71495bad040a0c83830efc85acf8d897350dnw if ((rt_sock = socket(PF_ROUTE, SOCK_RAW, 0)) < 0) {
71590c90e239661c113497da3ca8b7301dfbe24cnw idmapdlog(LOG_ERR, "Failed to open routing socket: %s",
71590c90e239661c113497da3ca8b7301dfbe24cnw strerror(errno));
0dcc71495bad040a0c83830efc85acf8d897350dnw (void) close(idmapd_ev_port);
0dcc71495bad040a0c83830efc85acf8d897350dnw return (-1);
0dcc71495bad040a0c83830efc85acf8d897350dnw }
0dcc71495bad040a0c83830efc85acf8d897350dnw
0dcc71495bad040a0c83830efc85acf8d897350dnw if (fcntl(rt_sock, F_SETFL, O_NDELAY|O_NONBLOCK) < 0) {
71590c90e239661c113497da3ca8b7301dfbe24cnw idmapdlog(LOG_ERR, "Failed to set routing socket flags: %s",
71590c90e239661c113497da3ca8b7301dfbe24cnw strerror(errno));
0dcc71495bad040a0c83830efc85acf8d897350dnw (void) close(rt_sock);
0dcc71495bad040a0c83830efc85acf8d897350dnw (void) close(idmapd_ev_port);
0dcc71495bad040a0c83830efc85acf8d897350dnw return (-1);
0dcc71495bad040a0c83830efc85acf8d897350dnw }
0dcc71495bad040a0c83830efc85acf8d897350dnw
0dcc71495bad040a0c83830efc85acf8d897350dnw if (port_associate(idmapd_ev_port, PORT_SOURCE_FD,
0dcc71495bad040a0c83830efc85acf8d897350dnw rt_sock, POLLIN, NULL) != 0) {
71590c90e239661c113497da3ca8b7301dfbe24cnw idmapdlog(LOG_ERR, "Failed to associate the routing "
71590c90e239661c113497da3ca8b7301dfbe24cnw "socket with the event port: %s", strerror(errno));
0dcc71495bad040a0c83830efc85acf8d897350dnw (void) close(rt_sock);
0dcc71495bad040a0c83830efc85acf8d897350dnw (void) close(idmapd_ev_port);
0dcc71495bad040a0c83830efc85acf8d897350dnw return (-1);
0dcc71495bad040a0c83830efc85acf8d897350dnw }
0dcc71495bad040a0c83830efc85acf8d897350dnw
0dcc71495bad040a0c83830efc85acf8d897350dnw if ((errno = pthread_create(&update_thread_handle, NULL,
0dcc71495bad040a0c83830efc85acf8d897350dnw idmap_cfg_update_thread, NULL)) != 0) {
71590c90e239661c113497da3ca8b7301dfbe24cnw idmapdlog(LOG_ERR, "Failed to start update thread: %s",
71590c90e239661c113497da3ca8b7301dfbe24cnw strerror(errno));
0dcc71495bad040a0c83830efc85acf8d897350dnw (void) port_dissociate(idmapd_ev_port, PORT_SOURCE_FD, rt_sock);
0dcc71495bad040a0c83830efc85acf8d897350dnw (void) close(rt_sock);
0dcc71495bad040a0c83830efc85acf8d897350dnw (void) close(idmapd_ev_port);
0dcc71495bad040a0c83830efc85acf8d897350dnw return (-1);
0dcc71495bad040a0c83830efc85acf8d897350dnw }
0dcc71495bad040a0c83830efc85acf8d897350dnw
0dcc71495bad040a0c83830efc85acf8d897350dnw return (0);
c8e261054d98729a8718903716b9b8a512d8b693jp}
c8e261054d98729a8718903716b9b8a512d8b693jp
479ac37569625bae44ffb80071d4bc865fc710eddm/*
479ac37569625bae44ffb80071d4bc865fc710eddm * Reject attribute names with invalid characters.
479ac37569625bae44ffb80071d4bc865fc710eddm */
479ac37569625bae44ffb80071d4bc865fc710eddmstatic
479ac37569625bae44ffb80071d4bc865fc710eddmint
479ac37569625bae44ffb80071d4bc865fc710eddmvalid_ldap_attr(const char *attr) {
479ac37569625bae44ffb80071d4bc865fc710eddm for (; *attr; attr++) {
479ac37569625bae44ffb80071d4bc865fc710eddm if (!isalnum(*attr) && *attr != '-' &&
479ac37569625bae44ffb80071d4bc865fc710eddm *attr != '_' && *attr != '.' && *attr != ';')
479ac37569625bae44ffb80071d4bc865fc710eddm return (0);
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm return (1);
479ac37569625bae44ffb80071d4bc865fc710eddm}
479ac37569625bae44ffb80071d4bc865fc710eddm
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaistatic
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightvoid
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightidmapd_set_debug(
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmap_cfg_handles_t *handles,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright enum idmapd_debug item,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright const char *name)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int val;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (item < 0 || item > IDMAPD_DEBUG_MAX)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright val = get_debug(handles, name);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (val != _idmapdstate.debug[item])
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_DEBUG, "%s/%s = %d", DEBUG_PG, name, val);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright _idmapdstate.debug[item] = val;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightvoid
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightcheck_smf_debug_mode(idmap_cfg_handles_t *handles)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapd_set_debug(handles, IDMAPD_DEBUG_ALL, "all");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapd_set_debug(handles, IDMAPD_DEBUG_CONFIG, "config");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapd_set_debug(handles, IDMAPD_DEBUG_MAPPING, "mapping");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapd_set_debug(handles, IDMAPD_DEBUG_DISC, "discovery");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapd_set_debug(handles, IDMAPD_DEBUG_DNS, "dns");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapd_set_debug(handles, IDMAPD_DEBUG_LDAP, "ldap");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright adutils_set_debug(AD_DEBUG_ALL, _idmapdstate.debug[IDMAPD_DEBUG_ALL]);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright adutils_set_debug(AD_DEBUG_DISC, _idmapdstate.debug[IDMAPD_DEBUG_DISC]);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright adutils_set_debug(AD_DEBUG_DNS, _idmapdstate.debug[IDMAPD_DEBUG_DNS]);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright adutils_set_debug(AD_DEBUG_LDAP, _idmapdstate.debug[IDMAPD_DEBUG_LDAP]);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai}
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
349d5d8f2e43f7f425bc3d025dda555187160ab7nw/*
349d5d8f2e43f7f425bc3d025dda555187160ab7nw * This is the half of idmap_cfg_load() that loads property values from
349d5d8f2e43f7f425bc3d025dda555187160ab7nw * SMF (using the config/ property group of the idmap FMRI).
349d5d8f2e43f7f425bc3d025dda555187160ab7nw *
349d5d8f2e43f7f425bc3d025dda555187160ab7nw * Return values: 0 -> success, -1 -> failure, -2 -> hard failures
479ac37569625bae44ffb80071d4bc865fc710eddm * -3 -> hard smf config failures
349d5d8f2e43f7f425bc3d025dda555187160ab7nw * reading from SMF.
349d5d8f2e43f7f425bc3d025dda555187160ab7nw */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rossstatic int
349d5d8f2e43f7f425bc3d025dda555187160ab7nwidmap_cfg_load_smf(idmap_cfg_handles_t *handles, idmap_pg_config_t *pgcfg,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai int * const errors)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw int rc;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai char *s;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai *errors = 0;
c8e261054d98729a8718903716b9b8a512d8b693jp
c8e261054d98729a8718903716b9b8a512d8b693jp if (scf_pg_update(handles->config_pg) < 0) {
71590c90e239661c113497da3ca8b7301dfbe24cnw idmapdlog(LOG_ERR, "scf_pg_update() failed: %s",
71590c90e239661c113497da3ca8b7301dfbe24cnw scf_strerror(scf_error()));
349d5d8f2e43f7f425bc3d025dda555187160ab7nw return (-2);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (scf_pg_update(handles->debug_pg) < 0) {
71590c90e239661c113497da3ca8b7301dfbe24cnw idmapdlog(LOG_ERR, "scf_pg_update() failed: %s",
71590c90e239661c113497da3ca8b7301dfbe24cnw scf_strerror(scf_error()));
349d5d8f2e43f7f425bc3d025dda555187160ab7nw return (-2);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright check_smf_debug_mode(handles);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = get_val_bool(handles, "unresolvable_sid_mapping",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright &pgcfg->eph_map_unres_sids, B_TRUE);
479ac37569625bae44ffb80071d4bc865fc710eddm if (rc != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai (*errors)++;
71590c90e239661c113497da3ca8b7301dfbe24cnw
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross rc = get_val_bool(handles, "use_ads",
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross &pgcfg->use_ads, B_TRUE);
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross if (rc != 0)
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross (*errors)++;
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = get_val_bool(handles, "use_lsa",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright &pgcfg->use_lsa, B_TRUE);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (rc != 0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (*errors)++;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = get_val_bool(handles, "disable_cross_forest_trusts",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright &pgcfg->disable_cross_forest_trusts, B_TRUE);
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw if (rc != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai (*errors)++;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = get_val_astring(handles, "directory_based_mapping", &s);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (rc != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai (*errors)++;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai else if (s == NULL || strcasecmp(s, "none") == 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai pgcfg->directory_based_mapping = DIRECTORY_MAPPING_NONE;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai else if (strcasecmp(s, "name") == 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai pgcfg->directory_based_mapping = DIRECTORY_MAPPING_NAME;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai else if (strcasecmp(s, "idmu") == 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai pgcfg->directory_based_mapping = DIRECTORY_MAPPING_IDMU;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai else {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai pgcfg->directory_based_mapping = DIRECTORY_MAPPING_NONE;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai idmapdlog(LOG_ERR,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai "config/directory_based_mapping: invalid value \"%s\" ignored",
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai s);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai (*errors)++;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai free(s);
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw
c8e261054d98729a8718903716b9b8a512d8b693jp rc = get_val_int(handles, "list_size_limit",
c8e261054d98729a8718903716b9b8a512d8b693jp &pgcfg->list_size_limit, SCF_TYPE_COUNT);
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw if (rc != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai (*errors)++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross rc = get_val_int(handles, "id_cache_timeout",
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross &pgcfg->id_cache_timeout, SCF_TYPE_COUNT);
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross if (rc != 0)
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross (*errors)++;
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross if (pgcfg->id_cache_timeout == 0)
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross pgcfg->id_cache_timeout = ID_CACHE_TMO_DEFAULT;
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross rc = get_val_int(handles, "name_cache_timeout",
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross &pgcfg->name_cache_timeout, SCF_TYPE_COUNT);
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross if (rc != 0)
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross (*errors)++;
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross if (pgcfg->name_cache_timeout == 0)
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross pgcfg->name_cache_timeout = NAME_CACHE_TMO_DEFAULT;
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross rc = get_val_int(handles, "rediscovery_interval",
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross &pgcfg->rediscovery_interval, SCF_TYPE_COUNT);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (rc != 0)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (*errors)++;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (pgcfg->rediscovery_interval == 0)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross pgcfg->rediscovery_interval = REDISCOVERY_INTERVAL_DEFAULT;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
c8e261054d98729a8718903716b9b8a512d8b693jp rc = get_val_astring(handles, "domain_name",
c8e261054d98729a8718903716b9b8a512d8b693jp &pgcfg->domain_name);
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw if (rc != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai (*errors)++;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen else {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (pgcfg->domain_name != NULL &&
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright pgcfg->domain_name[0] == '\0') {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright free(pgcfg->domain_name);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright pgcfg->domain_name = NULL;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
349d5d8f2e43f7f425bc3d025dda555187160ab7nw (void) ad_disc_set_DomainName(handles->ad_ctx,
349d5d8f2e43f7f425bc3d025dda555187160ab7nw pgcfg->domain_name);
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen pgcfg->domain_name_auto_disc = B_FALSE;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
c8e261054d98729a8718903716b9b8a512d8b693jp
c8e261054d98729a8718903716b9b8a512d8b693jp rc = get_val_astring(handles, "default_domain",
c8e261054d98729a8718903716b9b8a512d8b693jp &pgcfg->default_domain);
c8e261054d98729a8718903716b9b8a512d8b693jp if (rc != 0) {
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw /*
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw * SCF failures fetching config/default_domain we treat
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw * as fatal as they may leave ID mapping rules that
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw * match unqualified winnames flapping in the wind.
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw */
349d5d8f2e43f7f425bc3d025dda555187160ab7nw return (-2);
c8e261054d98729a8718903716b9b8a512d8b693jp }
c8e261054d98729a8718903716b9b8a512d8b693jp
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (pgcfg->default_domain == NULL && pgcfg->domain_name != NULL) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai pgcfg->default_domain = strdup(pgcfg->domain_name);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross rc = get_val_astring(handles, "domain_guid", &s);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (rc != 0) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (*errors)++;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross } else if (s == NULL || s[0] == '\0') {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross /* OK, not set. */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross free(s);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross } else {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross uuid_t u;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (uuid_parse(s, u) != 0) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_ERR,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross "config/domain_guid: invalid value \"%s\" ignored", s);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross free(s);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (*errors)++;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross } else {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross pgcfg->domain_guid = s;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross pgcfg->domain_guid_auto_disc = B_FALSE;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) ad_disc_set_DomainGUID(handles->ad_ctx, u);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross rc = get_val_astring(handles, "machine_uuid", &pgcfg->machine_uuid);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (rc != 0)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross (*errors)++;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (pgcfg->machine_uuid == NULL) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross /* If machine_uuid not configured, generate one */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (generate_machine_uuid(&pgcfg->machine_uuid) < 0)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross return (-2);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross rc = set_val_astring(handles, handles->config_pg,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross "machine_uuid", pgcfg->machine_uuid);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (rc != 0)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross (*errors)++;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross }
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
c8e261054d98729a8718903716b9b8a512d8b693jp rc = get_val_astring(handles, "machine_sid", &pgcfg->machine_sid);
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw if (rc != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai (*errors)++;
c8e261054d98729a8718903716b9b8a512d8b693jp if (pgcfg->machine_sid == NULL) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross /*
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * If machine_sid not configured, generate one
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * from the machine UUID.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (generate_machine_sid(&pgcfg->machine_sid,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross pgcfg->machine_uuid) < 0)
349d5d8f2e43f7f425bc3d025dda555187160ab7nw return (-2);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = set_val_astring(handles, handles->config_pg,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "machine_sid", pgcfg->machine_sid);
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw if (rc != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai (*errors)++;
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c8e261054d98729a8718903716b9b8a512d8b693jp rc = get_val_ds(handles, "domain_controller", 389,
c8e261054d98729a8718903716b9b8a512d8b693jp &pgcfg->domain_controller);
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw if (rc != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai (*errors)++;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen else {
349d5d8f2e43f7f425bc3d025dda555187160ab7nw (void) ad_disc_set_DomainController(handles->ad_ctx,
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw pgcfg->domain_controller);
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen pgcfg->domain_controller_auto_disc = B_FALSE;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross rc = get_val_ds(handles, "preferred_dc", 389,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross &pgcfg->preferred_dc);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (rc != 0)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (*errors)++;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross else {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) ad_disc_set_PreferredDC(handles->ad_ctx,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross pgcfg->preferred_dc);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross pgcfg->preferred_dc_auto_disc = B_FALSE;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
c8e261054d98729a8718903716b9b8a512d8b693jp rc = get_val_astring(handles, "forest_name", &pgcfg->forest_name);
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw if (rc != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai (*errors)++;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen else {
349d5d8f2e43f7f425bc3d025dda555187160ab7nw (void) ad_disc_set_ForestName(handles->ad_ctx,
349d5d8f2e43f7f425bc3d025dda555187160ab7nw pgcfg->forest_name);
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen pgcfg->forest_name_auto_disc = B_FALSE;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
c8e261054d98729a8718903716b9b8a512d8b693jp
c8e261054d98729a8718903716b9b8a512d8b693jp rc = get_val_astring(handles, "site_name", &pgcfg->site_name);
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw if (rc != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai (*errors)++;
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw else
349d5d8f2e43f7f425bc3d025dda555187160ab7nw (void) ad_disc_set_SiteName(handles->ad_ctx, pgcfg->site_name);
c8e261054d98729a8718903716b9b8a512d8b693jp
c8e261054d98729a8718903716b9b8a512d8b693jp rc = get_val_ds(handles, "global_catalog", 3268,
c8e261054d98729a8718903716b9b8a512d8b693jp &pgcfg->global_catalog);
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw if (rc != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai (*errors)++;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen else {
349d5d8f2e43f7f425bc3d025dda555187160ab7nw (void) ad_disc_set_GlobalCatalog(handles->ad_ctx,
349d5d8f2e43f7f425bc3d025dda555187160ab7nw pgcfg->global_catalog);
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen pgcfg->global_catalog_auto_disc = B_FALSE;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
c8e261054d98729a8718903716b9b8a512d8b693jp
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai /* Unless we're doing directory-based name mapping, we're done. */
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (pgcfg->directory_based_mapping != DIRECTORY_MAPPING_NAME)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (0);
e8c27ec857e6e2db8c4fe56938b70a89b5bed9f3baban
349d5d8f2e43f7f425bc3d025dda555187160ab7nw rc = get_val_astring(handles, "ad_unixuser_attr",
349d5d8f2e43f7f425bc3d025dda555187160ab7nw &pgcfg->ad_unixuser_attr);
349d5d8f2e43f7f425bc3d025dda555187160ab7nw if (rc != 0)
349d5d8f2e43f7f425bc3d025dda555187160ab7nw return (-2);
479ac37569625bae44ffb80071d4bc865fc710eddm if (pgcfg->ad_unixuser_attr != NULL &&
479ac37569625bae44ffb80071d4bc865fc710eddm !valid_ldap_attr(pgcfg->ad_unixuser_attr)) {
479ac37569625bae44ffb80071d4bc865fc710eddm idmapdlog(LOG_ERR, "config/ad_unixuser_attr=%s is not a "
479ac37569625bae44ffb80071d4bc865fc710eddm "valid LDAP attribute name", pgcfg->ad_unixuser_attr);
479ac37569625bae44ffb80071d4bc865fc710eddm return (-3);
479ac37569625bae44ffb80071d4bc865fc710eddm }
e8c27ec857e6e2db8c4fe56938b70a89b5bed9f3baban
349d5d8f2e43f7f425bc3d025dda555187160ab7nw rc = get_val_astring(handles, "ad_unixgroup_attr",
349d5d8f2e43f7f425bc3d025dda555187160ab7nw &pgcfg->ad_unixgroup_attr);
349d5d8f2e43f7f425bc3d025dda555187160ab7nw if (rc != 0)
349d5d8f2e43f7f425bc3d025dda555187160ab7nw return (-2);
479ac37569625bae44ffb80071d4bc865fc710eddm if (pgcfg->ad_unixgroup_attr != NULL &&
479ac37569625bae44ffb80071d4bc865fc710eddm !valid_ldap_attr(pgcfg->ad_unixgroup_attr)) {
479ac37569625bae44ffb80071d4bc865fc710eddm idmapdlog(LOG_ERR, "config/ad_unixgroup_attr=%s is not a "
479ac37569625bae44ffb80071d4bc865fc710eddm "valid LDAP attribute name", pgcfg->ad_unixgroup_attr);
479ac37569625bae44ffb80071d4bc865fc710eddm return (-3);
479ac37569625bae44ffb80071d4bc865fc710eddm }
e8c27ec857e6e2db8c4fe56938b70a89b5bed9f3baban
349d5d8f2e43f7f425bc3d025dda555187160ab7nw rc = get_val_astring(handles, "nldap_winname_attr",
349d5d8f2e43f7f425bc3d025dda555187160ab7nw &pgcfg->nldap_winname_attr);
349d5d8f2e43f7f425bc3d025dda555187160ab7nw if (rc != 0)
349d5d8f2e43f7f425bc3d025dda555187160ab7nw return (-2);
479ac37569625bae44ffb80071d4bc865fc710eddm if (pgcfg->nldap_winname_attr != NULL &&
479ac37569625bae44ffb80071d4bc865fc710eddm !valid_ldap_attr(pgcfg->nldap_winname_attr)) {
479ac37569625bae44ffb80071d4bc865fc710eddm idmapdlog(LOG_ERR, "config/nldap_winname_attr=%s is not a "
479ac37569625bae44ffb80071d4bc865fc710eddm "valid LDAP attribute name", pgcfg->nldap_winname_attr);
349d5d8f2e43f7f425bc3d025dda555187160ab7nw return (-3);
e8c27ec857e6e2db8c4fe56938b70a89b5bed9f3baban }
349d5d8f2e43f7f425bc3d025dda555187160ab7nw if (pgcfg->ad_unixuser_attr == NULL &&
479ac37569625bae44ffb80071d4bc865fc710eddm pgcfg->ad_unixgroup_attr == NULL &&
479ac37569625bae44ffb80071d4bc865fc710eddm pgcfg->nldap_winname_attr == NULL) {
349d5d8f2e43f7f425bc3d025dda555187160ab7nw idmapdlog(LOG_ERR,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai "If config/directory_based_mapping property is set to "
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai "\"name\" then at least one of the following name mapping "
349d5d8f2e43f7f425bc3d025dda555187160ab7nw "attributes must be specified. (config/ad_unixuser_attr OR "
479ac37569625bae44ffb80071d4bc865fc710eddm "config/ad_unixgroup_attr OR config/nldap_winname_attr)");
349d5d8f2e43f7f425bc3d025dda555187160ab7nw return (-3);
349d5d8f2e43f7f425bc3d025dda555187160ab7nw }
c8e261054d98729a8718903716b9b8a512d8b693jp
349d5d8f2e43f7f425bc3d025dda555187160ab7nw return (rc);
349d5d8f2e43f7f425bc3d025dda555187160ab7nw}
349d5d8f2e43f7f425bc3d025dda555187160ab7nw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightvoid
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightlog_if_unable(const void *val, const char *what)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (val == NULL) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_DEBUG, "unable to discover %s", what);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
349d5d8f2e43f7f425bc3d025dda555187160ab7nwstatic
349d5d8f2e43f7f425bc3d025dda555187160ab7nwvoid
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightdiscover_trusted_domains(idmap_pg_config_t *pgcfg, ad_disc_t ad_ctx)
349d5d8f2e43f7f425bc3d025dda555187160ab7nw{
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad_disc_t trusted_ctx;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen int i, j, k, l;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen char *forestname;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen int num_trusteddomains;
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen boolean_t new_forest;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen char *trusteddomain;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross ad_disc_ds_t *globalcatalog;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen idmap_trustedforest_t *trustedforests;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad_disc_domainsinforest_t *domainsinforest;
349d5d8f2e43f7f425bc3d025dda555187160ab7nw
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen pgcfg->trusted_domains =
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad_disc_get_TrustedDomains(ad_ctx, NULL);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (pgcfg->forest_name != NULL && pgcfg->trusted_domains != NULL &&
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen pgcfg->trusted_domains[0].domain[0] != '\0') {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen /*
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * We have trusted domains. We need to go through every
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * one and find its forest. If it is a new forest we then need
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * to find its Global Catalog and the domains in the forest
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen */
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen for (i = 0; pgcfg->trusted_domains[i].domain[0] != '\0'; i++)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen continue;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen num_trusteddomains = i;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen trustedforests = calloc(num_trusteddomains,
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen sizeof (idmap_trustedforest_t));
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen j = 0;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen for (i = 0; pgcfg->trusted_domains[i].domain[0] != '\0'; i++) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen trusteddomain = pgcfg->trusted_domains[i].domain;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen trusted_ctx = ad_disc_init();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) ad_disc_set_DomainName(trusted_ctx,
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen trusteddomain);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen forestname =
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad_disc_get_ForestName(trusted_ctx, NULL);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (forestname == NULL) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 1)) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_DEBUG,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "unable to discover Forest Name"
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright " for the trusted domain %s",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright trusteddomain);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad_disc_fini(trusted_ctx);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen continue;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (strcasecmp(forestname, pgcfg->forest_name) == 0) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen /*
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * Ignore the domain as it is part of
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * the primary forest
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen */
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen free(forestname);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad_disc_fini(trusted_ctx);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen continue;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen /* Is this a new forest? */
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen new_forest = B_TRUE;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen for (k = 0; k < j; k++) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (strcasecmp(forestname,
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen trustedforests[k].forest_name) == 0) {
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen new_forest = B_FALSE;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen domainsinforest =
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen trustedforests[k].domains_in_forest;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen break;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (!new_forest) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen /* Mark the domain as trusted */
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen for (l = 0;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen domainsinforest[l].domain[0] != '\0'; l++) {
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (domain_eq(trusteddomain,
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown domainsinforest[l].domain)) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen domainsinforest[l].trusted =
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen TRUE;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen break;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen free(forestname);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad_disc_fini(trusted_ctx);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen continue;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen /*
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * Get the Global Catalog and the domains in
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * this new forest.
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen */
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen globalcatalog =
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad_disc_get_GlobalCatalog(trusted_ctx,
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen AD_DISC_PREFER_SITE, NULL);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (globalcatalog == NULL) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 1)) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_DEBUG,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "unable to discover Global Catalog"
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright " for the trusted domain %s",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright trusteddomain);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen free(forestname);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad_disc_fini(trusted_ctx);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen continue;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen domainsinforest =
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross ad_disc_get_DomainsInForest(trusted_ctx, NULL);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (domainsinforest == NULL) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 1)) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_DEBUG,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "unable to discover Domains in the"
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright " Forest for the trusted domain %s",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright trusteddomain);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen free(globalcatalog);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen free(forestname);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad_disc_fini(trusted_ctx);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen continue;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen trustedforests[j].forest_name = forestname;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen trustedforests[j].global_catalog = globalcatalog;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen trustedforests[j].domains_in_forest = domainsinforest;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen j++;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen /* Mark the domain as trusted */
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen for (l = 0; domainsinforest[l].domain[0] != '\0';
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen l++) {
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (domain_eq(trusteddomain,
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown domainsinforest[l].domain)) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen domainsinforest[l].trusted = TRUE;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen break;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad_disc_fini(trusted_ctx);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (j > 0) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen pgcfg->num_trusted_forests = j;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen pgcfg->trusted_forests = trustedforests;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown } else {
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown free(trustedforests);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
349d5d8f2e43f7f425bc3d025dda555187160ab7nw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * This is the half of idmap_cfg_load() that auto-discovers values of
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * discoverable properties that weren't already set via SMF properties.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * idmap_cfg_discover() is called *after* idmap_cfg_load_smf(), so it
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * needs to be careful not to overwrite any properties set in SMF.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rossstatic void
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rossidmap_cfg_discover1(idmap_cfg_handles_t *handles, idmap_pg_config_t *pgcfg)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ad_disc_t ad_ctx = handles->ad_ctx;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross FILE *status_fp = NULL;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross time_t t0, t1;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross t0 = time(NULL);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 1))
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_DEBUG, "Running domain discovery.");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) unlink(IDMAP_CACHEDIR "/discovery.log");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross status_fp = fopen(IDMAP_CACHEDIR "/discovery.log", "w");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (status_fp) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) fchmod(fileno(status_fp), 0644);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross ad_disc_set_StatusFP(ad_ctx, status_fp);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (pgcfg->domain_name == NULL) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_DEBUG, "No domain name specified.");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (status_fp)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) fprintf(status_fp, "(no domain name)\n");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross goto out;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (pgcfg->domain_controller == NULL)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross pgcfg->domain_controller =
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross ad_disc_get_DomainController(ad_ctx,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross AD_DISC_PREFER_SITE,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross &pgcfg->domain_controller_auto_disc);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (pgcfg->domain_guid == NULL) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross char buf[UUID_PRINTABLE_STRING_LENGTH];
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross uchar_t *u = ad_disc_get_DomainGUID(ad_ctx,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross &pgcfg->domain_guid_auto_disc);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) memset(buf, 0, sizeof (buf));
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (u != NULL) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross uuid_unparse(u, buf);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross pgcfg->domain_guid = strdup(buf);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (pgcfg->forest_name == NULL)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross pgcfg->forest_name = ad_disc_get_ForestName(ad_ctx,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross &pgcfg->forest_name_auto_disc);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (pgcfg->site_name == NULL)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross pgcfg->site_name = ad_disc_get_SiteName(ad_ctx,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross &pgcfg->site_name_auto_disc);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (DBG(CONFIG, 1)) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross log_if_unable(pgcfg->domain_name, "Domain Name");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross log_if_unable(pgcfg->domain_controller,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross "Domain Controller");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross log_if_unable(pgcfg->domain_guid, "Domain GUID");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross log_if_unable(pgcfg->forest_name, "Forest Name");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross log_if_unable(pgcfg->site_name, "Site Name");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rossout:
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (status_fp) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross ad_disc_set_StatusFP(ad_ctx, NULL);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) fclose(status_fp);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross status_fp = NULL;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (DBG(CONFIG, 1))
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_DEBUG, "Domain discovery done.");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross /*
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Log when this took more than 15 sec.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross t1 = time(NULL);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (t1 > (t0 + 15)) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_NOTICE, "Domain discovery took %d sec.",
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (int)(t1 - t0));
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_NOTICE, "Check the DNS configuration.");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross}
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross/*
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * This is the second part of discovery, which can take a while.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * We don't want to hold up parties who just want to know what
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * domain controller we're using (like smbd), so this part runs
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * after we've updated that info in the "live" config and told
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * such consumers to go ahead.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross *
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * This is a lot like idmap_cfg_discover(), but used LDAP queries
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * get the forest information from the global catalog servers.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross *
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Note: the previous update_* calls have usually nuked any
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * useful information from pgcfg before we get here, so we
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * can only use it store discovery results, not to read.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rossstatic void
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rossidmap_cfg_discover2(idmap_cfg_handles_t *handles, idmap_pg_config_t *pgcfg)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross{
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross ad_disc_t ad_ctx = handles->ad_ctx;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross FILE *status_fp = NULL;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross time_t t0, t1;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross t0 = time(NULL);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (DBG(CONFIG, 1))
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_DEBUG, "Running forest discovery.");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross status_fp = fopen(IDMAP_CACHEDIR "/discovery.log", "a");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (status_fp)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross ad_disc_set_StatusFP(ad_ctx, status_fp);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (pgcfg->global_catalog == NULL)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross pgcfg->global_catalog =
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross ad_disc_get_GlobalCatalog(ad_ctx,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross AD_DISC_PREFER_SITE,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross &pgcfg->global_catalog_auto_disc);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (pgcfg->global_catalog != NULL) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright pgcfg->domains_in_forest =
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ad_disc_get_DomainsInForest(ad_ctx, NULL);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (!pgcfg->disable_cross_forest_trusts)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright discover_trusted_domains(pgcfg, ad_ctx);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (DBG(CONFIG, 1)) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross log_if_unable(pgcfg->global_catalog, "Global Catalog");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross log_if_unable(pgcfg->domains_in_forest,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross "Domains in the Forest");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross /* Empty trusted domains list is OK. */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (status_fp) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross ad_disc_set_StatusFP(ad_ctx, NULL);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) fclose(status_fp);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross status_fp = NULL;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 1))
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_DEBUG, "Forest discovery done.");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross /*
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Log when this took more than 30 sec.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross t1 = time(NULL);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (t1 > (t0 + 30)) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_NOTICE, "Forest discovery took %d sec.",
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (int)(t1 - t0));
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_NOTICE, "Check AD join status.");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
349d5d8f2e43f7f425bc3d025dda555187160ab7nw}
349d5d8f2e43f7f425bc3d025dda555187160ab7nw
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
349d5d8f2e43f7f425bc3d025dda555187160ab7nw/*
349d5d8f2e43f7f425bc3d025dda555187160ab7nw * idmap_cfg_load() is called at startup, and periodically via the
349d5d8f2e43f7f425bc3d025dda555187160ab7nw * update thread when the auto-discovery TTLs expire, as well as part of
349d5d8f2e43f7f425bc3d025dda555187160ab7nw * the refresh method, to update the current configuration. It always
349d5d8f2e43f7f425bc3d025dda555187160ab7nw * reads from SMF, but you still have to refresh the service after
349d5d8f2e43f7f425bc3d025dda555187160ab7nw * changing the config pg in order for the changes to take effect.
349d5d8f2e43f7f425bc3d025dda555187160ab7nw *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * There is one flag:
349d5d8f2e43f7f425bc3d025dda555187160ab7nw *
349d5d8f2e43f7f425bc3d025dda555187160ab7nw * - CFG_DISCOVER
349d5d8f2e43f7f425bc3d025dda555187160ab7nw *
349d5d8f2e43f7f425bc3d025dda555187160ab7nw * If CFG_DISCOVER is set then idmap_cfg_load() calls
349d5d8f2e43f7f425bc3d025dda555187160ab7nw * idmap_cfg_discover() to discover, via DNS and LDAP lookups, property
349d5d8f2e43f7f425bc3d025dda555187160ab7nw * values that weren't set in SMF.
349d5d8f2e43f7f425bc3d025dda555187160ab7nw *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * idmap_cfg_load() will log (to LOG_NOTICE) whether the configuration
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * changed.
349d5d8f2e43f7f425bc3d025dda555187160ab7nw *
349d5d8f2e43f7f425bc3d025dda555187160ab7nw * Return values: 0 -> success, -1 -> failure, -2 -> hard failures
349d5d8f2e43f7f425bc3d025dda555187160ab7nw * reading from SMF.
349d5d8f2e43f7f425bc3d025dda555187160ab7nw */
349d5d8f2e43f7f425bc3d025dda555187160ab7nwint
349d5d8f2e43f7f425bc3d025dda555187160ab7nwidmap_cfg_load(idmap_cfg_t *cfg, int flags)
349d5d8f2e43f7f425bc3d025dda555187160ab7nw{
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross const ad_disc_t ad_ctx = cfg->handles.ad_ctx;
349d5d8f2e43f7f425bc3d025dda555187160ab7nw int rc = 0;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai int errors;
349d5d8f2e43f7f425bc3d025dda555187160ab7nw int changed = 0;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross int dc_changed = 0;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen int ad_reload_required = 0;
349d5d8f2e43f7f425bc3d025dda555187160ab7nw idmap_pg_config_t new_pgcfg, *live_pgcfg;
349d5d8f2e43f7f425bc3d025dda555187160ab7nw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 1))
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_DEBUG, "Loading configuration.");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
349d5d8f2e43f7f425bc3d025dda555187160ab7nw live_pgcfg = &cfg->pgcfg;
349d5d8f2e43f7f425bc3d025dda555187160ab7nw (void) memset(&new_pgcfg, 0, sizeof (new_pgcfg));
349d5d8f2e43f7f425bc3d025dda555187160ab7nw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) pthread_mutex_lock(&cfg->handles.mutex);
349d5d8f2e43f7f425bc3d025dda555187160ab7nw
349d5d8f2e43f7f425bc3d025dda555187160ab7nw if ((rc = idmap_cfg_load_smf(&cfg->handles, &new_pgcfg, &errors)) < -1)
349d5d8f2e43f7f425bc3d025dda555187160ab7nw goto err;
349d5d8f2e43f7f425bc3d025dda555187160ab7nw
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (flags & CFG_DISCOVER) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross ad_disc_refresh(ad_ctx);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross /*
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Unless we've been asked to forget the current DC,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * give preference (in order) to the preferred DC if
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * configured, or the current DC. These preferences
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * reduce undesirable DC changes.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (flags & CFG_FORGET_DC) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) ad_disc_set_PreferredDC(ad_ctx, NULL);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross } else if (new_pgcfg.preferred_dc != NULL) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) ad_disc_set_PreferredDC(ad_ctx,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross new_pgcfg.preferred_dc);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross } else if (live_pgcfg->domain_controller != NULL) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) ad_disc_set_PreferredDC(ad_ctx,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross live_pgcfg->domain_controller);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross } else {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) ad_disc_set_PreferredDC(ad_ctx, NULL);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross /*
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * We want a way to tell adspriv_getdcname_1_svc()
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * (and others) that discovery is running and therefore
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * they may want to wait a bit or return an error...
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) mutex_lock(&_idmapdstate.addisc_lk);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross _idmapdstate.addisc_st |= ADDISC_ST_RUNNING;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) mutex_unlock(&_idmapdstate.addisc_lk);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmap_cfg_discover1(&cfg->handles, &new_pgcfg);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross WRLOCK_CONFIG();
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) mutex_lock(&_idmapdstate.addisc_lk);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross _idmapdstate.addisc_st = 0;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) cond_broadcast(&_idmapdstate.addisc_cv);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) mutex_unlock(&_idmapdstate.addisc_lk);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross } else {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross WRLOCK_CONFIG();
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
349d5d8f2e43f7f425bc3d025dda555187160ab7nw
349d5d8f2e43f7f425bc3d025dda555187160ab7nw /* Non-discoverable props updated here */
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross changed += update_uint64(&live_pgcfg->list_size_limit,
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross &new_pgcfg.list_size_limit, "list_size_limit");
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross changed += update_uint64(&live_pgcfg->id_cache_timeout,
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross &new_pgcfg.id_cache_timeout, "id_cache_timeout");
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross changed += update_uint64(&live_pgcfg->name_cache_timeout,
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross &new_pgcfg.name_cache_timeout, "name_cache_timeout");
48cd229b73530d4ff90bcaca099aec95e2126239Gordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross changed += update_uint64(&live_pgcfg->rediscovery_interval,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross &new_pgcfg.rediscovery_interval, "rediscovery_interval");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw changed += update_string(&live_pgcfg->machine_sid,
349d5d8f2e43f7f425bc3d025dda555187160ab7nw &new_pgcfg.machine_sid, "machine_sid");
349d5d8f2e43f7f425bc3d025dda555187160ab7nw
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw changed += update_bool(&live_pgcfg->eph_map_unres_sids,
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw &new_pgcfg.eph_map_unres_sids, "unresolvable_sid_mapping");
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross changed += update_bool(&live_pgcfg->use_ads,
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross &new_pgcfg.use_ads, "use_ads");
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright changed += update_bool(&live_pgcfg->use_lsa,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright &new_pgcfg.use_lsa, "use_lsa");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright changed += update_bool(&live_pgcfg->disable_cross_forest_trusts,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright &new_pgcfg.disable_cross_forest_trusts,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "disable_cross_forest_trusts");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai changed += update_enum(&live_pgcfg->directory_based_mapping,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai &new_pgcfg.directory_based_mapping, "directory_based_mapping",
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai directory_mapping_map);
349d5d8f2e43f7f425bc3d025dda555187160ab7nw
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw changed += update_string(&live_pgcfg->ad_unixuser_attr,
349d5d8f2e43f7f425bc3d025dda555187160ab7nw &new_pgcfg.ad_unixuser_attr, "ad_unixuser_attr");
349d5d8f2e43f7f425bc3d025dda555187160ab7nw
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw changed += update_string(&live_pgcfg->ad_unixgroup_attr,
349d5d8f2e43f7f425bc3d025dda555187160ab7nw &new_pgcfg.ad_unixgroup_attr, "ad_unixgroup_attr");
349d5d8f2e43f7f425bc3d025dda555187160ab7nw
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw changed += update_string(&live_pgcfg->nldap_winname_attr,
349d5d8f2e43f7f425bc3d025dda555187160ab7nw &new_pgcfg.nldap_winname_attr, "nldap_winname_attr");
349d5d8f2e43f7f425bc3d025dda555187160ab7nw
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai changed += update_string(&live_pgcfg->default_domain,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai &new_pgcfg.default_domain, "default_domain");
349d5d8f2e43f7f425bc3d025dda555187160ab7nw
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross changed += update_dirs(&live_pgcfg->preferred_dc,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross &new_pgcfg.preferred_dc, "preferred_dc");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross /* Props that can be discovered or set in SMF updated here */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (update_string(&live_pgcfg->domain_name,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross &new_pgcfg.domain_name, "domain_name")) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross changed++;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross ad_reload_required = TRUE;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapd_set_krb5_realm(live_pgcfg->domain_name);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen live_pgcfg->domain_name_auto_disc = new_pgcfg.domain_name_auto_disc;
349d5d8f2e43f7f425bc3d025dda555187160ab7nw
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross changed += update_string(&live_pgcfg->domain_guid,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross &new_pgcfg.domain_guid, "domain_guid");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross live_pgcfg->domain_guid_auto_disc = new_pgcfg.domain_guid_auto_disc;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross dc_changed = update_dirs(&live_pgcfg->domain_controller,
349d5d8f2e43f7f425bc3d025dda555187160ab7nw &new_pgcfg.domain_controller, "domain_controller");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross changed += dc_changed;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen live_pgcfg->domain_controller_auto_disc =
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen new_pgcfg.domain_controller_auto_disc;
349d5d8f2e43f7f425bc3d025dda555187160ab7nw
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw changed += update_string(&live_pgcfg->forest_name,
349d5d8f2e43f7f425bc3d025dda555187160ab7nw &new_pgcfg.forest_name, "forest_name");
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen live_pgcfg->forest_name_auto_disc = new_pgcfg.forest_name_auto_disc;
349d5d8f2e43f7f425bc3d025dda555187160ab7nw
4aa0a5e7deb6e3c2696f52132d8a07062ffd5814nw changed += update_string(&live_pgcfg->site_name,
349d5d8f2e43f7f425bc3d025dda555187160ab7nw &new_pgcfg.site_name, "site_name");
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen live_pgcfg->site_name_auto_disc = new_pgcfg.site_name_auto_disc;
349d5d8f2e43f7f425bc3d025dda555187160ab7nw
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (DBG(CONFIG, 1)) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (changed)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_NOTICE, "Configuration changed");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross else
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_NOTICE, "Configuration unchanged");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross UNLOCK_CONFIG();
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (dc_changed != 0) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross notify_dc_changed();
349d5d8f2e43f7f425bc3d025dda555187160ab7nw }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross /*
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Discovery2 can take a while.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (flags & CFG_DISCOVER) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (live_pgcfg->domain_name != NULL &&
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross live_pgcfg->forest_name != NULL)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmap_cfg_discover2(&cfg->handles, &new_pgcfg);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross ad_disc_done(ad_ctx);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross WRLOCK_CONFIG();
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross /* More props that can be discovered or set in SMF */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross changed += update_dirs(&live_pgcfg->global_catalog,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross &new_pgcfg.global_catalog, "global_catalog");
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen live_pgcfg->global_catalog_auto_disc =
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen new_pgcfg.global_catalog_auto_disc;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross /* Props that are only discovered (never in SMF) */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (update_domains_in_forest(&live_pgcfg->domains_in_forest,
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen &new_pgcfg.domains_in_forest, "domains_in_forest")) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen changed++;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad_reload_required = TRUE;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (update_trusted_domains(&live_pgcfg->trusted_domains,
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen &new_pgcfg.trusted_domains, "trusted_domains")) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen changed++;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (live_pgcfg->trusted_domains != NULL &&
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen live_pgcfg->trusted_domains[0].domain[0] != '\0')
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad_reload_required = TRUE;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (update_trusted_forest(&live_pgcfg->trusted_forests,
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen &live_pgcfg->num_trusted_forests, &new_pgcfg.trusted_forests,
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen &new_pgcfg.num_trusted_forests, "trusted_forest")) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen changed++;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (live_pgcfg->trusted_forests != NULL)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad_reload_required = TRUE;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (DBG(CONFIG, 1)) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (changed)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_NOTICE, "Configuration changed");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright else
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_NOTICE, "Configuration unchanged");
c8e261054d98729a8718903716b9b8a512d8b693jp }
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw
349d5d8f2e43f7f425bc3d025dda555187160ab7nw UNLOCK_CONFIG();
349d5d8f2e43f7f425bc3d025dda555187160ab7nw
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (ad_reload_required)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross reload_ad();
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmap_cfg_unload(&new_pgcfg);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
349d5d8f2e43f7f425bc3d025dda555187160ab7nwerr:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) pthread_mutex_unlock(&cfg->handles.mutex);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
e8c27ec857e6e2db8c4fe56938b70a89b5bed9f3baban if (rc < -1)
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw return (rc);
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw
e3c2d6aa3bc760b22fad3c83f876553f0d2c5b66nw return ((errors == 0) ? 0 : -1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban/*
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban * Initialize 'cfg'.
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_cfg_t *
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjpidmap_cfg_init()
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjp{
c8e261054d98729a8718903716b9b8a512d8b693jp idmap_cfg_handles_t *handles;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* First the smf repository handles: */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_cfg_t *cfg = calloc(1, sizeof (idmap_cfg_t));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (!cfg) {
71590c90e239661c113497da3ca8b7301dfbe24cnw idmapdlog(LOG_ERR, "Out of memory");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (NULL);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c8e261054d98729a8718903716b9b8a512d8b693jp handles = &cfg->handles;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c8e261054d98729a8718903716b9b8a512d8b693jp (void) pthread_mutex_init(&handles->mutex, NULL);
c8e261054d98729a8718903716b9b8a512d8b693jp
c8e261054d98729a8718903716b9b8a512d8b693jp if (!(handles->main = scf_handle_create(SCF_VERSION))) {
71590c90e239661c113497da3ca8b7301dfbe24cnw idmapdlog(LOG_ERR, "scf_handle_create() failed: %s",
71590c90e239661c113497da3ca8b7301dfbe24cnw scf_strerror(scf_error()));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto error;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c8e261054d98729a8718903716b9b8a512d8b693jp if (scf_handle_bind(handles->main) < 0) {
71590c90e239661c113497da3ca8b7301dfbe24cnw idmapdlog(LOG_ERR, "scf_handle_bind() failed: %s",
71590c90e239661c113497da3ca8b7301dfbe24cnw scf_strerror(scf_error()));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto error;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c8e261054d98729a8718903716b9b8a512d8b693jp if (!(handles->service = scf_service_create(handles->main)) ||
c8e261054d98729a8718903716b9b8a512d8b693jp !(handles->instance = scf_instance_create(handles->main)) ||
c8e261054d98729a8718903716b9b8a512d8b693jp !(handles->config_pg = scf_pg_create(handles->main)) ||
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright !(handles->debug_pg = scf_pg_create(handles->main))) {
71590c90e239661c113497da3ca8b7301dfbe24cnw idmapdlog(LOG_ERR, "scf handle creation failed: %s",
71590c90e239661c113497da3ca8b7301dfbe24cnw scf_strerror(scf_error()));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto error;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c8e261054d98729a8718903716b9b8a512d8b693jp if (scf_handle_decode_fmri(handles->main,
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjp FMRI_BASE "/:properties/" CONFIG_PG,
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjp NULL, /* scope */
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjp handles->service, /* service */
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjp handles->instance, /* instance */
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjp handles->config_pg, /* pg */
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjp NULL, /* prop */
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjp SCF_DECODE_FMRI_EXACT) < 0) {
71590c90e239661c113497da3ca8b7301dfbe24cnw idmapdlog(LOG_ERR, "scf_handle_decode_fmri() failed: %s",
71590c90e239661c113497da3ca8b7301dfbe24cnw scf_strerror(scf_error()));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto error;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c8e261054d98729a8718903716b9b8a512d8b693jp if (scf_service_get_pg(handles->service,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright DEBUG_PG, handles->debug_pg) < 0) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_ERR, "Property group \"%s\": %s",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright DEBUG_PG, scf_strerror(scf_error()));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto error;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright check_smf_debug_mode(handles);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
c8e261054d98729a8718903716b9b8a512d8b693jp /* Initialize AD Auto Discovery context */
c8e261054d98729a8718903716b9b8a512d8b693jp handles->ad_ctx = ad_disc_init();
c8e261054d98729a8718903716b9b8a512d8b693jp if (handles->ad_ctx == NULL)
c8e261054d98729a8718903716b9b8a512d8b693jp goto error;
c8e261054d98729a8718903716b9b8a512d8b693jp
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (cfg);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwerror:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) idmap_cfg_fini(cfg);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (NULL);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c8e261054d98729a8718903716b9b8a512d8b693jpvoid
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjpidmap_cfg_unload(idmap_pg_config_t *pgcfg)
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjp{
c8e261054d98729a8718903716b9b8a512d8b693jp
c8e261054d98729a8718903716b9b8a512d8b693jp if (pgcfg->default_domain) {
c8e261054d98729a8718903716b9b8a512d8b693jp free(pgcfg->default_domain);
c8e261054d98729a8718903716b9b8a512d8b693jp pgcfg->default_domain = NULL;
c8e261054d98729a8718903716b9b8a512d8b693jp }
c8e261054d98729a8718903716b9b8a512d8b693jp if (pgcfg->domain_name) {
c8e261054d98729a8718903716b9b8a512d8b693jp free(pgcfg->domain_name);
c8e261054d98729a8718903716b9b8a512d8b693jp pgcfg->domain_name = NULL;
c8e261054d98729a8718903716b9b8a512d8b693jp }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (pgcfg->domain_guid) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross free(pgcfg->domain_guid);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross pgcfg->domain_guid = NULL;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
c8e261054d98729a8718903716b9b8a512d8b693jp if (pgcfg->machine_sid) {
c8e261054d98729a8718903716b9b8a512d8b693jp free(pgcfg->machine_sid);
c8e261054d98729a8718903716b9b8a512d8b693jp pgcfg->machine_sid = NULL;
c8e261054d98729a8718903716b9b8a512d8b693jp }
c8e261054d98729a8718903716b9b8a512d8b693jp if (pgcfg->domain_controller) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(pgcfg->domain_controller);
c8e261054d98729a8718903716b9b8a512d8b693jp pgcfg->domain_controller = NULL;
c8e261054d98729a8718903716b9b8a512d8b693jp }
c8e261054d98729a8718903716b9b8a512d8b693jp if (pgcfg->forest_name) {
c8e261054d98729a8718903716b9b8a512d8b693jp free(pgcfg->forest_name);
c8e261054d98729a8718903716b9b8a512d8b693jp pgcfg->forest_name = NULL;
c8e261054d98729a8718903716b9b8a512d8b693jp }
c8e261054d98729a8718903716b9b8a512d8b693jp if (pgcfg->site_name) {
c8e261054d98729a8718903716b9b8a512d8b693jp free(pgcfg->site_name);
c8e261054d98729a8718903716b9b8a512d8b693jp pgcfg->site_name = NULL;
c8e261054d98729a8718903716b9b8a512d8b693jp }
c8e261054d98729a8718903716b9b8a512d8b693jp if (pgcfg->global_catalog) {
c8e261054d98729a8718903716b9b8a512d8b693jp free(pgcfg->global_catalog);
c8e261054d98729a8718903716b9b8a512d8b693jp pgcfg->global_catalog = NULL;
c8e261054d98729a8718903716b9b8a512d8b693jp }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (pgcfg->trusted_domains) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen free(pgcfg->trusted_domains);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen pgcfg->trusted_domains = NULL;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (pgcfg->trusted_forests)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen free_trusted_forests(&pgcfg->trusted_forests,
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen &pgcfg->num_trusted_forests);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
e8c27ec857e6e2db8c4fe56938b70a89b5bed9f3baban if (pgcfg->ad_unixuser_attr) {
e8c27ec857e6e2db8c4fe56938b70a89b5bed9f3baban free(pgcfg->ad_unixuser_attr);
e8c27ec857e6e2db8c4fe56938b70a89b5bed9f3baban pgcfg->ad_unixuser_attr = NULL;
e8c27ec857e6e2db8c4fe56938b70a89b5bed9f3baban }
e8c27ec857e6e2db8c4fe56938b70a89b5bed9f3baban if (pgcfg->ad_unixgroup_attr) {
e8c27ec857e6e2db8c4fe56938b70a89b5bed9f3baban free(pgcfg->ad_unixgroup_attr);
e8c27ec857e6e2db8c4fe56938b70a89b5bed9f3baban pgcfg->ad_unixgroup_attr = NULL;
e8c27ec857e6e2db8c4fe56938b70a89b5bed9f3baban }
e8c27ec857e6e2db8c4fe56938b70a89b5bed9f3baban if (pgcfg->nldap_winname_attr) {
e8c27ec857e6e2db8c4fe56938b70a89b5bed9f3baban free(pgcfg->nldap_winname_attr);
e8c27ec857e6e2db8c4fe56938b70a89b5bed9f3baban pgcfg->nldap_winname_attr = NULL;
e8c27ec857e6e2db8c4fe56938b70a89b5bed9f3baban }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwint
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_cfg_fini(idmap_cfg_t *cfg)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c8e261054d98729a8718903716b9b8a512d8b693jp idmap_cfg_handles_t *handles = &cfg->handles;
c8e261054d98729a8718903716b9b8a512d8b693jp idmap_cfg_unload(&cfg->pgcfg);
c8e261054d98729a8718903716b9b8a512d8b693jp
c8e261054d98729a8718903716b9b8a512d8b693jp (void) pthread_mutex_destroy(&handles->mutex);
c8e261054d98729a8718903716b9b8a512d8b693jp scf_pg_destroy(handles->config_pg);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (handles->debug_pg != NULL)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright scf_pg_destroy(handles->debug_pg);
c8e261054d98729a8718903716b9b8a512d8b693jp scf_instance_destroy(handles->instance);
c8e261054d98729a8718903716b9b8a512d8b693jp scf_service_destroy(handles->service);
c8e261054d98729a8718903716b9b8a512d8b693jp scf_handle_destroy(handles->main);
e8c27ec857e6e2db8c4fe56938b70a89b5bed9f3baban if (handles->ad_ctx != NULL)
e8c27ec857e6e2db8c4fe56938b70a89b5bed9f3baban ad_disc_fini(handles->ad_ctx);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(cfg);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
0dcc71495bad040a0c83830efc85acf8d897350dnw
0dcc71495bad040a0c83830efc85acf8d897350dnwvoid
0dcc71495bad040a0c83830efc85acf8d897350dnwidmap_cfg_poke_updates(void)
0dcc71495bad040a0c83830efc85acf8d897350dnw{
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross int prev_st;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (DBG(CONFIG, 1)) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_INFO, "idmap_cfg_poke_updates");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) mutex_lock(&_idmapdstate.addisc_lk);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross prev_st = _idmapdstate.addisc_st;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross _idmapdstate.addisc_st |= ADDISC_ST_REQUESTED;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) mutex_unlock(&_idmapdstate.addisc_lk);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (prev_st & ADDISC_ST_REQUESTED) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_DEBUG, "already poked");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross } else {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_DEBUG, "port send poke");
349d5d8f2e43f7f425bc3d025dda555187160ab7nw (void) port_send(idmapd_ev_port, POKE_AUTO_DISCOVERY, NULL);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross}
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rossvoid
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rossidmap_cfg_force_rediscovery(void)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross{
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross int prev_st;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (DBG(CONFIG, 1)) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_INFO, "idmap_cfg_force_rediscovery");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) mutex_lock(&_idmapdstate.addisc_lk);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross prev_st = _idmapdstate.addisc_st;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross _idmapdstate.addisc_st |= ADDISC_ST_REQUESTED;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) mutex_unlock(&_idmapdstate.addisc_lk);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (prev_st & ADDISC_ST_REQUESTED) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_DEBUG, "already kicked");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross } else {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross idmapdlog(LOG_DEBUG, "port send kick");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) port_send(idmapd_ev_port, KICK_AUTO_DISCOVERY, NULL);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
0dcc71495bad040a0c83830efc85acf8d897350dnw}
0dcc71495bad040a0c83830efc85acf8d897350dnw
0dcc71495bad040a0c83830efc85acf8d897350dnw/*ARGSUSED*/
0dcc71495bad040a0c83830efc85acf8d897350dnwvoid
349d5d8f2e43f7f425bc3d025dda555187160ab7nwidmap_cfg_hup_handler(int sig)
349d5d8f2e43f7f425bc3d025dda555187160ab7nw{
0dcc71495bad040a0c83830efc85acf8d897350dnw if (idmapd_ev_port >= 0)
0dcc71495bad040a0c83830efc85acf8d897350dnw (void) port_send(idmapd_ev_port, RECONFIGURE, NULL);
0dcc71495bad040a0c83830efc85acf8d897350dnw}
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Upgrade the debug flags.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * We're replacing a single debug flag with a fine-grained mechanism that
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * is also capable of considerably more verbosity. We'll take a stab at
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * producing roughly the same level of output.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightint
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightupgrade_debug(idmap_cfg_handles_t *handles)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright boolean_t debug_present;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright const char DEBUG_PROP[] = "debug";
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int rc;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = prop_exists(handles, DEBUG_PROP, &debug_present);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (rc != 0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (rc);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (!debug_present)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (0);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmapdlog(LOG_INFO,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "Upgrading old %s/%s setting to %s/* settings.",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright CONFIG_PG, DEBUG_PROP, DEBUG_PG);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = set_val_integer(handles, handles->debug_pg, "config", 1);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (rc != 0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (rc);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = set_val_integer(handles, handles->debug_pg, "discovery", 1);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (rc != 0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (rc);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = del_val(handles, handles->config_pg, DEBUG_PROP);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (rc != 0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (rc);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (0);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai/*
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Upgrade the DS mapping flags.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai *
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * If the old ds_name_mapping_enabled flag is present, then
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * if the new directory_based_mapping value is present, then
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * if the two are compatible, delete the old and note it
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * else delete the old and warn
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * else
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * set the new based on the old, and note it
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * delete the old
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai */
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaistatic
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaiint
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaiupgrade_directory_mapping(idmap_cfg_handles_t *handles)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai{
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai boolean_t legacy_ds_name_mapping_present;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai const char DS_NAME_MAPPING_ENABLED[] = "ds_name_mapping_enabled";
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai const char DIRECTORY_BASED_MAPPING[] = "directory_based_mapping";
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai int rc;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = prop_exists(handles, DS_NAME_MAPPING_ENABLED,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai &legacy_ds_name_mapping_present);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (rc != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (rc);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (!legacy_ds_name_mapping_present)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (0);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai boolean_t legacy_ds_name_mapping_enabled;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = get_val_bool(handles, DS_NAME_MAPPING_ENABLED,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright &legacy_ds_name_mapping_enabled, B_FALSE);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (rc != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (rc);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai char *legacy_mode;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai char *legacy_bool_string;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (legacy_ds_name_mapping_enabled) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai legacy_mode = "name";
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai legacy_bool_string = "true";
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai } else {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai legacy_mode = "none";
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai legacy_bool_string = "false";
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai char *directory_based_mapping;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = get_val_astring(handles, DIRECTORY_BASED_MAPPING,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai &directory_based_mapping);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (rc != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (rc);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (directory_based_mapping == NULL) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai idmapdlog(LOG_INFO,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai "Upgrading old %s=%s setting\n"
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai "to %s=%s.",
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai DS_NAME_MAPPING_ENABLED, legacy_bool_string,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai DIRECTORY_BASED_MAPPING, legacy_mode);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = set_val_astring(handles, handles->config_pg,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright DIRECTORY_BASED_MAPPING, legacy_mode);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (rc != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (rc);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai } else {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai boolean_t new_name_mapping;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (strcasecmp(directory_based_mapping, "name") == 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai new_name_mapping = B_TRUE;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai else
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai new_name_mapping = B_FALSE;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (legacy_ds_name_mapping_enabled == new_name_mapping) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai idmapdlog(LOG_INFO,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai "Automatically removing old %s=%s setting\n"
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai "in favor of %s=%s.",
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai DS_NAME_MAPPING_ENABLED, legacy_bool_string,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai DIRECTORY_BASED_MAPPING, directory_based_mapping);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai } else {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai idmapdlog(LOG_WARNING,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai "Removing conflicting %s=%s setting\n"
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai "in favor of %s=%s.",
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai DS_NAME_MAPPING_ENABLED, legacy_bool_string,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai DIRECTORY_BASED_MAPPING, directory_based_mapping);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai free(directory_based_mapping);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = del_val(handles, handles->config_pg, DS_NAME_MAPPING_ENABLED);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (rc != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (rc);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (0);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai}
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai/*
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Do whatever is necessary to upgrade idmap's configuration before
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * we load it.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai */
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaiint
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaiidmap_cfg_upgrade(idmap_cfg_t *cfg)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai{
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai int rc;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = upgrade_directory_mapping(&cfg->handles);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (rc != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (rc);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = upgrade_debug(&cfg->handles);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (rc != 0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (rc);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (0);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai}
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross/*
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * The LDAP code passes principal names lacking any
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * realm information, which causes mech_krb5 to do
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * awful things trying to figure out the realm.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Avoid that by making sure it has a default,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * even when krb5.conf is not configured.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rossstatic void
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rossidmapd_set_krb5_realm(char *domain)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross{
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross static char realm[MAXHOSTNAMELEN];
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross size_t ilen, olen;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross int err;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (domain == NULL) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) unsetenv("KRB5_DEFAULT_REALM");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross return;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross /* Convert to upper case, in place. */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) strlcpy(realm, domain, sizeof (realm));
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross olen = ilen = strlen(realm);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) u8_textprep_str(realm, &ilen, realm, &olen,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross U8_TEXTPREP_TOUPPER, U8_UNICODE_LATEST, &err);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) setenv("KRB5_DEFAULT_REALM", realm, 1);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross}