da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER START
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
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 *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * or http://www.opensolaris.org/os/licensing.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * See the License for the specific language governing permissions
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * and limitations under the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
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 *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER END
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <syslog.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <synch.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <pthread.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <unistd.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <string.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <strings.h>
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross#include <errno.h>
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross#include <netinet/in.h>
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross#include <netinet/tcp.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <smbsrv/libsmb.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <smbsrv/libsmbns.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <smbsrv/libmlsvc.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <smbsrv/smbinfo.h>
8d7e41661dc4633488e93b13363137523ce59977jose borrego#include "smbd.h"
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh#define SMBD_DC_MONITOR_ATTEMPTS 3
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh#define SMBD_DC_MONITOR_RETRY_INTERVAL 3 /* seconds */
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh#define SMBD_DC_MONITOR_INTERVAL 60 /* seconds */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshextern smbd_t smbd;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintoshstatic mutex_t smbd_dc_mutex;
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintoshstatic cond_t smbd_dc_cv;
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshstatic void *smbd_dc_monitor(void *);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshstatic void smbd_dc_update(void);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rossstatic int smbd_dc_check(smb_domainex_t *);
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 *);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh/*
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh * Launch the DC discovery and monitor thread.
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh */
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshint
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshsmbd_dc_monitor_init(void)
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh{
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh pthread_attr_t attr;
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh int rc;
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh (void) smb_config_getstr(SMB_CI_ADS_SITE, smbd.s_site,
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh MAXHOSTNAMELEN);
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh (void) smb_config_getip(SMB_CI_DOMAIN_SRV, &smbd.s_pdc);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh smb_ads_init();
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh if (smbd.s_secmode != SMB_SECMODE_DOMAIN)
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh return (0);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh (void) pthread_attr_init(&attr);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh (void) pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh rc = pthread_create(&smbd.s_dc_monitor_tid, &attr, smbd_dc_monitor,
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh NULL);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh (void) pthread_attr_destroy(&attr);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh return (rc);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh}
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross/*
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 */
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintoshvoid
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintoshsmbd_dc_monitor_refresh(void)
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh{
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross syslog(LOG_INFO, "smbd_dc_monitor_refresh");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross smb_ddiscover_refresh();
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh (void) mutex_lock(&smbd_dc_mutex);
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross smbd.s_pdc_changed = B_TRUE;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) cond_signal(&smbd_dc_cv);
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh (void) mutex_unlock(&smbd_dc_mutex);
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh}
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh/*ARGSUSED*/
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshstatic void *
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshsmbd_dc_monitor(void *arg)
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh{
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross smb_domainex_t di;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross boolean_t ds_not_responding;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross boolean_t ds_cfg_changed;
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh timestruc_t delay;
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh int i;
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross /* Wait for smb_dclocator_init() to complete. */
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh smbd_online_wait("smbd_dc_monitor");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross smbd_dc_update();
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh while (smbd_online()) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross ds_not_responding = B_FALSE;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross ds_cfg_changed = B_FALSE;
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh delay.tv_sec = SMBD_DC_MONITOR_INTERVAL;
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh delay.tv_nsec = 0;
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh (void) mutex_lock(&smbd_dc_mutex);
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh (void) cond_reltimedwait(&smbd_dc_cv, &smbd_dc_mutex, &delay);
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh if (smbd.s_pdc_changed) {
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh smbd.s_pdc_changed = B_FALSE;
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh ds_cfg_changed = B_TRUE;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross /* NB: smb_ddiscover_refresh was called. */
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh }
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh (void) mutex_unlock(&smbd_dc_mutex);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (ds_cfg_changed) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross syslog(LOG_DEBUG, "smbd_dc_monitor: config changed");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross goto rediscover;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (!smb_domain_getinfo(&di)) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross syslog(LOG_DEBUG, "smbd_dc_monitor: no domain info");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross goto rediscover;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (di.d_dci.dc_name[0] == '\0') {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross syslog(LOG_DEBUG, "smbd_dc_monitor: no DC name");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross goto rediscover;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh for (i = 0; i < SMBD_DC_MONITOR_ATTEMPTS; ++i) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (smbd_dc_check(&di) == 0) {
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh ds_not_responding = B_FALSE;
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh break;
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh }
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh ds_not_responding = B_TRUE;
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh (void) sleep(SMBD_DC_MONITOR_RETRY_INTERVAL);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh }
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (ds_not_responding) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross syslog(LOG_NOTICE,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross "smbd_dc_monitor: DC not responding: %s",
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross di.d_dci.dc_name);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross smb_ddiscover_bad_dc(di.d_dci.dc_name);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh if (ds_not_responding || ds_cfg_changed) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross rediscover:
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross /*
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 */
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh smbd_dc_update();
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh }
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh }
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh smbd.s_dc_monitor_tid = 0;
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh return (NULL);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh}
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross/*
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Simply attempt a connection to the DC.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rossstatic int
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rosssmbd_dc_check(smb_domainex_t *di)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross{
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross struct sockaddr sa;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross int salen = 0;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross int sock = -1;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross int tmo = 5 * 1000; /* 5 sec. */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross int rc;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross bzero(&sa, sizeof (sa));
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross switch (di->d_dci.dc_addr.a_family) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross case AF_INET: {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross struct sockaddr_in *sin = (void *)&sa;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross sin->sin_family = AF_INET;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross sin->sin_port = htons(IPPORT_SMB);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross sin->sin_addr.s_addr = di->d_dci.dc_addr.a_ipv4;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross salen = sizeof (*sin);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross break;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross case AF_INET6: {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross struct sockaddr_in6 *sin6 = (void *)&sa;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross sin6->sin6_family = AF_INET6;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross sin6->sin6_port = htons(IPPORT_SMB);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) memcpy(&sin6->sin6_addr,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross &di->d_dci.dc_addr.a_ipv6,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross sizeof (in6_addr_t));
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross salen = sizeof (*sin6);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross break;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross default:
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross return (-1);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross }
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross sock = socket(di->d_dci.dc_addr.a_family, SOCK_STREAM, 0);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (sock < 0)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross return (errno);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) setsockopt(sock, IPPROTO_TCP,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross TCP_CONN_ABORT_THRESHOLD, &tmo, sizeof (tmo));
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross rc = connect(sock, &sa, salen);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (rc < 0)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross rc = errno;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) close(sock);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross return (rc);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross}
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh/*
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh * Locate a domain controller in the current resource domain and Update
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh * the Netlogon credential chain.
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh *
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh * The domain configuration will be updated upon successful DC discovery.
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh */
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshstatic void
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshsmbd_dc_update(void)
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh{
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh char domain[MAXHOSTNAMELEN];
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh smb_domainex_t info;
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross smb_domain_t *di;
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross DWORD status;
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross /*
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Don't want this active until we're a domain member.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (smb_config_get_secmode() != SMB_SECMODE_DOMAIN)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross return;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (smb_getfqdomainname(domain, MAXHOSTNAMELEN) != 0)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross return;
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (domain[0] == '\0') {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross syslog(LOG_NOTICE,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross "smbd_dc_update: no domain name set");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross return;
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh }
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (!smb_locate_dc(domain, &info)) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross syslog(LOG_NOTICE,
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh "smbd_dc_update: %s: locate failed", domain);
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross return;
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross }
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross di = &info.d_primary;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross syslog(LOG_INFO,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross "smbd_dc_update: %s: located %s", domain, info.d_dci.dc_name);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross status = mlsvc_netlogon(info.d_dci.dc_name, di->di_nbname);
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross if (status != NT_STATUS_SUCCESS) {
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross syslog(LOG_NOTICE,
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross "failed to establish NETLOGON credential chain");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross syslog(LOG_NOTICE, " with server %s for domain %s (%s)",
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross info.d_dci.dc_name, domain,
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross xlate_nt_status(status));
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh }
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh}
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smbd_join
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Joins the specified domain/workgroup.
8d7e41661dc4633488e93b13363137523ce59977jose borrego *
8d7e41661dc4633488e93b13363137523ce59977jose borrego * If the security mode or domain name is being changed,
8d7e41661dc4633488e93b13363137523ce59977jose borrego * the caller must restart the service.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rossvoid
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rosssmbd_join(smb_joininfo_t *info, smb_joinres_t *res)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
2c1b14e51525da2c09064641416fc4aed457c72fjose borrego dssetup_clear_domain_info();
8d7e41661dc4633488e93b13363137523ce59977jose borrego if (info->mode == SMB_SECMODE_WORKGRP)
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross smbd_join_workgroup(info, res);
8d7e41661dc4633488e93b13363137523ce59977jose borrego else
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross smbd_join_domain(info, res);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rossstatic void
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rosssmbd_join_workgroup(smb_joininfo_t *info, smb_joinres_t *res)
8d7e41661dc4633488e93b13363137523ce59977jose borrego{
8d7e41661dc4633488e93b13363137523ce59977jose borrego char nb_domain[SMB_PI_MAX_DOMAIN];
8d7e41661dc4633488e93b13363137523ce59977jose borrego
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross syslog(LOG_DEBUG, "smbd: join workgroup: %s", info->domain_name);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
8d7e41661dc4633488e93b13363137523ce59977jose borrego (void) smb_config_getstr(SMB_CI_DOMAIN_NAME, nb_domain,
8d7e41661dc4633488e93b13363137523ce59977jose borrego sizeof (nb_domain));
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego smbd_set_secmode(SMB_SECMODE_WORKGRP);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright smb_config_setdomaininfo(info->domain_name, "", "", "", "");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) smb_config_set_idmap_domain("");
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross (void) smb_config_refresh_idmap();
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego if (strcasecmp(nb_domain, info->domain_name))
8d7e41661dc4633488e93b13363137523ce59977jose borrego smb_browser_reconfig();
8d7e41661dc4633488e93b13363137523ce59977jose borrego
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross res->status = NT_STATUS_SUCCESS;
8d7e41661dc4633488e93b13363137523ce59977jose borrego}
8d7e41661dc4633488e93b13363137523ce59977jose borrego
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rossstatic void
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rosssmbd_join_domain(smb_joininfo_t *info, smb_joinres_t *res)
8d7e41661dc4633488e93b13363137523ce59977jose borrego{
8d7e41661dc4633488e93b13363137523ce59977jose borrego
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross syslog(LOG_DEBUG, "smbd: join domain: %s", info->domain_name);
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego /* info->domain_name could either be NetBIOS domain name or FQDN */
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross mlsvc_join(info, res);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (res->status == 0) {
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross smbd_set_secmode(SMB_SECMODE_DOMAIN);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross } else {
8d7e41661dc4633488e93b13363137523ce59977jose borrego syslog(LOG_ERR, "smbd: failed joining %s (%s)",
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross info->domain_name, xlate_nt_status(res->status));
8d7e41661dc4633488e93b13363137523ce59977jose borrego }
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego}