smbd_join.c revision b3700b074e637f8c6991b70754c88a2cfffb246b
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER START
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The contents of this file are subject to the terms of the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Common Development and Distribution License (the "License").
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You may not use this file except in compliance with the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * See the License for the specific language governing permissions
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * and limitations under the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * When distributing Covered Code, include this CDDL HEADER in each
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If applicable, add the following below this CDDL HEADER, with the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * fields enclosed by brackets "[]" replaced with your own identifying
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * information: Portions Copyright [yyyy] [name of copyright owner]
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER END
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh#define SMBD_DC_MONITOR_RETRY_INTERVAL 3 /* seconds */
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh#define SMBD_DC_MONITOR_INTERVAL 60 /* seconds */
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshstatic void *smbd_dc_monitor(void *);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshstatic void smbd_dc_update(void);
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross/* Todo: static boolean_t smbd_set_netlogon_cred(void); */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rossstatic void smbd_join_workgroup(smb_joininfo_t *, smb_joinres_t *);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rossstatic void smbd_join_domain(smb_joininfo_t *, smb_joinres_t *);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh * Launch the DC discovery and monitor thread.
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh (void) smb_config_getstr(SMB_CI_ADS_SITE, smbd.s_site,
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh (void) smb_config_getip(SMB_CI_DOMAIN_SRV, &smbd.s_pdc);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh (void) pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh rc = pthread_create(&smbd.s_dc_monitor_tid, &attr, smbd_dc_monitor,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Refresh the DC monitor. Called from SMF refresh and when idmap
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * finds a different DC from what we were using previously.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Update our domain (and current DC) information.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross /* Wait for smb_dclocator_init() to complete. */
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh (void) cond_reltimedwait(&smbd_dc_cv, &smbd_dc_mutex, &delay);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross /* NB: smb_ddiscover_refresh was called. */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross syslog(LOG_DEBUG, "smbd_dc_monitor: config changed");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross syslog(LOG_DEBUG, "smbd_dc_monitor: no domain info");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross syslog(LOG_DEBUG, "smbd_dc_monitor: no DC name");
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh for (i = 0; i < SMBD_DC_MONITOR_ATTEMPTS; ++i) {
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh (void) sleep(SMBD_DC_MONITOR_RETRY_INTERVAL);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross "smbd_dc_monitor: DC not responding: %s",
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * An smb_ads_refresh will be done by the
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * smb_ddiscover_service when necessary.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Note: smbd_dc_monitor_refresh was already
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * called if appropriate.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Simply attempt a connection to the DC.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross sin->sin_addr.s_addr = di->d_dci.dc_addr.a_ipv4;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross return (-1);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross sock = socket(di->d_dci.dc_addr.a_family, SOCK_STREAM, 0);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh * Locate a domain controller in the current resource domain and Update
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh * the Netlogon credential chain.
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh * The domain configuration will be updated upon successful DC discovery.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Don't want this active until we're a domain member.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (smb_config_get_secmode() != SMB_SECMODE_DOMAIN)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (smb_getfqdomainname(domain, MAXHOSTNAMELEN) != 0)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross "smbd_dc_update: no domain name set");
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh "smbd_dc_update: %s: locate failed", domain);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross "smbd_dc_update: %s: located %s", domain, info.d_dci.dc_name);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross status = mlsvc_netlogon(info.d_dci.dc_name, di->di_nbname);
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross "failed to establish NETLOGON credential chain");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross syslog(LOG_NOTICE, " with server %s for domain %s (%s)",
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smbd_join
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Joins the specified domain/workgroup.
8d7e41661dc4633488e93b13363137523ce59977jose borrego * If the security mode or domain name is being changed,
8d7e41661dc4633488e93b13363137523ce59977jose borrego * the caller must restart the service.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rosssmbd_join(smb_joininfo_t *info, smb_joinres_t *res)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rosssmbd_join_workgroup(smb_joininfo_t *info, smb_joinres_t *res)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross syslog(LOG_DEBUG, "smbd: join workgroup: %s", info->domain_name);
8d7e41661dc4633488e93b13363137523ce59977jose borrego (void) smb_config_getstr(SMB_CI_DOMAIN_NAME, nb_domain,
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright smb_config_setdomaininfo(info->domain_name, "", "", "", "");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rosssmbd_join_domain(smb_joininfo_t *info, smb_joinres_t *res)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross syslog(LOG_DEBUG, "smbd: join domain: %s", info->domain_name);
8d7e41661dc4633488e93b13363137523ce59977jose borrego /* info->domain_name could either be NetBIOS domain name or FQDN */
8d7e41661dc4633488e93b13363137523ce59977jose borrego syslog(LOG_ERR, "smbd: failed joining %s (%s)",