1da6c28aaSamw /*
2da6c28aaSamw  * CDDL HEADER START
3da6c28aaSamw  *
4da6c28aaSamw  * The contents of this file are subject to the terms of the
5da6c28aaSamw  * Common Development and Distribution License (the "License").
6da6c28aaSamw  * You may not use this file except in compliance with the License.
7da6c28aaSamw  *
8da6c28aaSamw  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9da6c28aaSamw  * or http://www.opensolaris.org/os/licensing.
10da6c28aaSamw  * See the License for the specific language governing permissions
11da6c28aaSamw  * and limitations under the License.
12da6c28aaSamw  *
13da6c28aaSamw  * When distributing Covered Code, include this CDDL HEADER in each
14da6c28aaSamw  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15da6c28aaSamw  * If applicable, add the following below this CDDL HEADER, with the
16da6c28aaSamw  * fields enclosed by brackets "[]" replaced with your own identifying
17da6c28aaSamw  * information: Portions Copyright [yyyy] [name of copyright owner]
18da6c28aaSamw  *
19da6c28aaSamw  * CDDL HEADER END
20da6c28aaSamw  */
21da6c28aaSamw /*
22148c5f43SAlan Wright  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
23ce8560eeSMatt Barden  * Copyright 2020 Tintri by DDN, Inc. All rights reserved.
24814e0daaSGordon Ross  * Copyright 2022 RackTop Systems, Inc.
25da6c28aaSamw  */
26da6c28aaSamw 
27da6c28aaSamw #include <sys/types.h>
2812b65585SGordon Ross #include <sys/sockio.h>
2912b65585SGordon Ross #include <sys/socket.h>
3012b65585SGordon Ross #include <sys/utsname.h>
3112b65585SGordon Ross 
32da6c28aaSamw #include <stdarg.h>
33da6c28aaSamw #include <unistd.h>
34da6c28aaSamw #include <stdlib.h>
35da6c28aaSamw #include <time.h>
36da6c28aaSamw #include <synch.h>
37da6c28aaSamw #include <syslog.h>
38da6c28aaSamw #include <string.h>
39da6c28aaSamw #include <strings.h>
40da6c28aaSamw #include <errno.h>
41da6c28aaSamw #include <net/if.h>
42da6c28aaSamw #include <netdb.h>
43dc20a302Sas #include <netinet/in.h>
44dc20a302Sas #include <arpa/nameser.h>
45dc20a302Sas #include <resolv.h>
4612b65585SGordon Ross 
47da6c28aaSamw #include <smbsrv/smbinfo.h>
48da6c28aaSamw #include <smbsrv/netbios.h>
49da6c28aaSamw #include <smbsrv/libsmb.h>
5012b65585SGordon Ross #include <assert.h>
51da6c28aaSamw 
52faa1795aSjb static mutex_t seqnum_mtx;
53da6c28aaSamw 
54a0aa776eSAlan Wright /*
55a0aa776eSAlan Wright  * IPC connection information that may be passed to the SMB Redirector.
56a0aa776eSAlan Wright  */
57a0aa776eSAlan Wright typedef struct {
58a0aa776eSAlan Wright 	char	user[SMB_USERNAME_MAXLEN];
59a0aa776eSAlan Wright 	uint8_t	passwd[SMBAUTH_HASH_SZ];
60a0aa776eSAlan Wright } smb_ipc_t;
61a0aa776eSAlan Wright 
62a0aa776eSAlan Wright static smb_ipc_t	ipc_info;
63a0aa776eSAlan Wright static smb_ipc_t	ipc_orig_info;
64a0aa776eSAlan Wright static rwlock_t		smb_ipc_lock;
65a0aa776eSAlan Wright 
66eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States /*
67a90cf9f2SGordon Ross  * These three parameters are all related:
68a90cf9f2SGordon Ross  *	skc_initial_credits
69a90cf9f2SGordon Ross  *	skc_maximum_credits
70a90cf9f2SGordon Ross  *	skc_maxworkers	(max worker threads)
71a90cf9f2SGordon Ross  * They must be in non-decreasing order.  Get the values in order:
72a90cf9f2SGordon Ross  *	maxworkers, maximum_credits, initial_credits
73a90cf9f2SGordon Ross  * enforcing maximum values and relations as we go.  Then in the
74a90cf9f2SGordon Ross  * opposite order check minimum values and relations.
75a90cf9f2SGordon Ross  *
76a90cf9f2SGordon Ross  * smb_config_getnum puts a zero in the &citem if it fails getting
77a90cf9f2SGordon Ross  * the parameter value.  When fetch parameters for which zero is OK,
78a90cf9f2SGordon Ross  * the return code is intentionally ignored.
79eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States  */
80da6c28aaSamw void
smb_load_kconfig(smb_kmod_cfg_t * kcfg)81da6c28aaSamw smb_load_kconfig(smb_kmod_cfg_t *kcfg)
82da6c28aaSamw {
8312b65585SGordon Ross 	struct utsname uts;
84dc20a302Sas 	int64_t citem;
85a90cf9f2SGordon Ross 	int rc;
86dc20a302Sas 
87da6c28aaSamw 	bzero(kcfg, sizeof (smb_kmod_cfg_t));
88da6c28aaSamw 
89a90cf9f2SGordon Ross 	/*
90a90cf9f2SGordon Ross 	 * skc_maxworkers (max. no. of taskq worker threads)
91a90cf9f2SGordon Ross 	 */
92a90cf9f2SGordon Ross 	rc = smb_config_getnum(SMB_CI_MAX_WORKERS, &citem);
93a90cf9f2SGordon Ross 	if (rc != SMBD_SMF_OK)
94a90cf9f2SGordon Ross 		citem = SMB_PI_MAX_WORKERS_DEF;
95a90cf9f2SGordon Ross 	if (citem > SMB_PI_MAX_WORKERS_MAX)
96a90cf9f2SGordon Ross 		citem = SMB_PI_MAX_WORKERS_MAX;
97dc20a302Sas 	kcfg->skc_maxworkers = (uint32_t)citem;
98a90cf9f2SGordon Ross 
99a90cf9f2SGordon Ross 	/*
100a90cf9f2SGordon Ross 	 * The largest number of credits we let a single client have.
101a90cf9f2SGordon Ross 	 * It never makes sense for this to be > max_workers
102a90cf9f2SGordon Ross 	 */
103a90cf9f2SGordon Ross 	rc = smb_config_getnum(SMB_CI_MAXIMUM_CREDITS, &citem);
104a90cf9f2SGordon Ross 	if (rc != SMBD_SMF_OK)
105a90cf9f2SGordon Ross 		citem = SMB_PI_MAXIMUM_CREDITS_DEF;
106a90cf9f2SGordon Ross 	if (citem > SMB_PI_MAXIMUM_CREDITS_MAX)
107a90cf9f2SGordon Ross 		citem = SMB_PI_MAXIMUM_CREDITS_MAX;
108a90cf9f2SGordon Ross 	kcfg->skc_maximum_credits = (uint16_t)citem;
109a90cf9f2SGordon Ross 	if (kcfg->skc_maximum_credits > kcfg->skc_maxworkers)
110a90cf9f2SGordon Ross 		kcfg->skc_maximum_credits = (uint16_t)kcfg->skc_maxworkers;
111a90cf9f2SGordon Ross 
112a90cf9f2SGordon Ross 	/*
113a90cf9f2SGordon Ross 	 * The number of credits we give a client initially.
114a90cf9f2SGordon Ross 	 * Should be enough for a "light" workload, as the
115a90cf9f2SGordon Ross 	 * client will request additional credits when the
116a90cf9f2SGordon Ross 	 * workload increases.  Must be <= maximum_credits.
117a90cf9f2SGordon Ross 	 */
118a90cf9f2SGordon Ross 	rc = smb_config_getnum(SMB_CI_INITIAL_CREDITS, &citem);
119a90cf9f2SGordon Ross 	if (rc != SMBD_SMF_OK)
120a90cf9f2SGordon Ross 		citem = SMB_PI_INITIAL_CREDITS_DEF;
121a90cf9f2SGordon Ross 	if (citem > SMB_PI_INITIAL_CREDITS_MAX)
122a90cf9f2SGordon Ross 		citem = SMB_PI_INITIAL_CREDITS_MAX;
123a90cf9f2SGordon Ross 	kcfg->skc_initial_credits = (uint16_t)citem;
124a90cf9f2SGordon Ross 	if (kcfg->skc_initial_credits > kcfg->skc_maximum_credits)
125a90cf9f2SGordon Ross 		kcfg->skc_initial_credits = kcfg->skc_maximum_credits;
126a90cf9f2SGordon Ross 
127a90cf9f2SGordon Ross 	/*
128a90cf9f2SGordon Ross 	 * Now enforce minimums, smaller to larger.
129a90cf9f2SGordon Ross 	 */
130a90cf9f2SGordon Ross 	if (kcfg->skc_initial_credits < SMB_PI_INITIAL_CREDITS_MIN)
131a90cf9f2SGordon Ross 		kcfg->skc_initial_credits = SMB_PI_INITIAL_CREDITS_MIN;
132a90cf9f2SGordon Ross 
133a90cf9f2SGordon Ross 	if (kcfg->skc_maximum_credits < SMB_PI_MAXIMUM_CREDITS_MIN)
134a90cf9f2SGordon Ross 		kcfg->skc_maximum_credits = SMB_PI_MAXIMUM_CREDITS_MIN;
135a90cf9f2SGordon Ross 	if (kcfg->skc_maximum_credits < kcfg->skc_initial_credits)
136a90cf9f2SGordon Ross 		kcfg->skc_maximum_credits = kcfg->skc_initial_credits;
137a90cf9f2SGordon Ross 
138a90cf9f2SGordon Ross 	if (kcfg->skc_maxworkers < SMB_PI_MAX_WORKERS_MIN)
139a90cf9f2SGordon Ross 		kcfg->skc_maxworkers = SMB_PI_MAX_WORKERS_MIN;
140a90cf9f2SGordon Ross 	if (kcfg->skc_maxworkers < kcfg->skc_maximum_credits)
141a90cf9f2SGordon Ross 		kcfg->skc_maxworkers = kcfg->skc_maximum_credits;
142eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States 
143dc20a302Sas 	(void) smb_config_getnum(SMB_CI_KEEPALIVE, &citem);
144dc20a302Sas 	kcfg->skc_keepalive = (uint32_t)citem;
145da6c28aaSamw 	if ((kcfg->skc_keepalive != 0) &&
146da6c28aaSamw 	    (kcfg->skc_keepalive < SMB_PI_KEEP_ALIVE_MIN))
147da6c28aaSamw 		kcfg->skc_keepalive = SMB_PI_KEEP_ALIVE_MIN;
148da6c28aaSamw 
149dc20a302Sas 	(void) smb_config_getnum(SMB_CI_MAX_CONNECTIONS, &citem);
150dc20a302Sas 	kcfg->skc_maxconnections = (uint32_t)citem;
151*2cf6b79fSGordon Ross 	(void) smb_config_getnum(SMB_CI_MAX_OPENS, &citem);
152*2cf6b79fSGordon Ross 	kcfg->skc_max_opens = (uint32_t)citem;
153dc20a302Sas 	kcfg->skc_restrict_anon = smb_config_getbool(SMB_CI_RESTRICT_ANON);
154dc20a302Sas 	kcfg->skc_signing_enable = smb_config_getbool(SMB_CI_SIGNING_ENABLE);
155dc20a302Sas 	kcfg->skc_signing_required = smb_config_getbool(SMB_CI_SIGNING_REQD);
15683d2dfe6SGordon Ross 	kcfg->skc_netbios_enable = smb_config_getbool(SMB_CI_NETBIOS_ENABLE);
1577f667e74Sjose borrego 	kcfg->skc_ipv6_enable = smb_config_getbool(SMB_CI_IPV6_ENABLE);
158cb174861Sjoyce mcintosh 	kcfg->skc_print_enable = smb_config_getbool(SMB_CI_PRINT_ENABLE);
159dc20a302Sas 	kcfg->skc_oplock_enable = smb_config_getbool(SMB_CI_OPLOCK_ENABLE);
160dc20a302Sas 	kcfg->skc_sync_enable = smb_config_getbool(SMB_CI_SYNC_ENABLE);
1615f1ef25cSAram Hăvărneanu 	kcfg->skc_traverse_mounts = smb_config_getbool(SMB_CI_TRAVERSE_MOUNTS);
162814e0daaSGordon Ross 	kcfg->skc_short_names = smb_config_getbool(SMB_CI_SHORT_NAMES);
163814e0daaSGordon Ross 
164a90cf9f2SGordon Ross 	kcfg->skc_max_protocol = smb_config_get_max_protocol();
1653e2c0c09SMatt Barden 	kcfg->skc_min_protocol = smb_config_get_min_protocol();
166da6c28aaSamw 	kcfg->skc_secmode = smb_config_get_secmode();
1671160dcf7SMatt Barden 	kcfg->skc_encrypt = smb_config_get_require(SMB_CI_ENCRYPT);
168b0bb0d63SGordon Ross 	kcfg->skc_encrypt_ciphers = smb_config_get_encrypt_ciphers();
169a90cf9f2SGordon Ross 
170b89a8333Snatalie li - Sun Microsystems - Irvine United States 	(void) smb_getdomainname(kcfg->skc_nbdomain,
171b89a8333Snatalie li - Sun Microsystems - Irvine United States 	    sizeof (kcfg->skc_nbdomain));
172b89a8333Snatalie li - Sun Microsystems - Irvine United States 	(void) smb_getfqdomainname(kcfg->skc_fqdn,
173b89a8333Snatalie li - Sun Microsystems - Irvine United States 	    sizeof (kcfg->skc_fqdn));
174b89a8333Snatalie li - Sun Microsystems - Irvine United States 	(void) smb_getnetbiosname(kcfg->skc_hostname,
175b89a8333Snatalie li - Sun Microsystems - Irvine United States 	    sizeof (kcfg->skc_hostname));
176dc20a302Sas 	(void) smb_config_getstr(SMB_CI_SYS_CMNT, kcfg->skc_system_comment,
177da6c28aaSamw 	    sizeof (kcfg->skc_system_comment));
1789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_config_get_version(&kcfg->skc_version);
179148c5f43SAlan Wright 	kcfg->skc_execflags = smb_config_get_execinfo(NULL, NULL, 0);
18012b65585SGordon Ross 	if (smb_config_get_localuuid(kcfg->skc_machine_uuid) < 0) {
18112b65585SGordon Ross 		syslog(LOG_ERR, "smb_load_kconfig: no machine_uuid");
18212b65585SGordon Ross 		uuid_generate_time(kcfg->skc_machine_uuid);
18312b65585SGordon Ross 	}
18412b65585SGordon Ross 	/* skc_negtok, skc_negtok_len: see smbd_authsvc.c */
18512b65585SGordon Ross 
18612b65585SGordon Ross 	(void) uname(&uts);
18712b65585SGordon Ross 	(void) snprintf(kcfg->skc_native_os, sizeof (kcfg->skc_native_os),
18812b65585SGordon Ross 	    "%s %s %s", uts.sysname, uts.release, uts.version);
18912b65585SGordon Ross 
19012b65585SGordon Ross 	(void) strlcpy(kcfg->skc_native_lm, "Native SMB service",
19112b65585SGordon Ross 	    sizeof (kcfg->skc_native_lm));
192da6c28aaSamw }
193da6c28aaSamw 
194da6c28aaSamw /*
195da6c28aaSamw  * Get the current system NetBIOS name.  The hostname is truncated at
196da6c28aaSamw  * the first `.` or 15 bytes, whichever occurs first, and converted
197da6c28aaSamw  * to uppercase (by smb_gethostname).  Text that appears after the
198da6c28aaSamw  * first '.' is considered to be part of the NetBIOS scope.
199da6c28aaSamw  *
200da6c28aaSamw  * Returns 0 on success, otherwise -1 to indicate an error.
201da6c28aaSamw  */
202da6c28aaSamw int
smb_getnetbiosname(char * buf,size_t buflen)203da6c28aaSamw smb_getnetbiosname(char *buf, size_t buflen)
204da6c28aaSamw {
2059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_gethostname(buf, buflen, SMB_CASE_UPPER) != 0)
206da6c28aaSamw 		return (-1);
207da6c28aaSamw 
208da6c28aaSamw 	if (buflen >= NETBIOS_NAME_SZ)
209da6c28aaSamw 		buf[NETBIOS_NAME_SZ - 1] = '\0';
210da6c28aaSamw 
211da6c28aaSamw 	return (0);
212da6c28aaSamw }
213da6c28aaSamw 
214b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
215b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Get the SAM account of the current system.
216b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Returns 0 on success, otherwise, -1 to indicate an error.
217b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
218b89a8333Snatalie li - Sun Microsystems - Irvine United States int
smb_getsamaccount(char * buf,size_t buflen)219b89a8333Snatalie li - Sun Microsystems - Irvine United States smb_getsamaccount(char *buf, size_t buflen)
220b89a8333Snatalie li - Sun Microsystems - Irvine United States {
221b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (smb_getnetbiosname(buf, buflen - 1) != 0)
222b89a8333Snatalie li - Sun Microsystems - Irvine United States 		return (-1);
223b89a8333Snatalie li - Sun Microsystems - Irvine United States 
224b89a8333Snatalie li - Sun Microsystems - Irvine United States 	(void) strlcat(buf, "$", buflen);
225b89a8333Snatalie li - Sun Microsystems - Irvine United States 	return (0);
226b89a8333Snatalie li - Sun Microsystems - Irvine United States }
227b89a8333Snatalie li - Sun Microsystems - Irvine United States 
228da6c28aaSamw /*
229da6c28aaSamw  * Get the current system node name.  The returned name is guaranteed
230da6c28aaSamw  * to be null-terminated (gethostname may not null terminate the name).
231da6c28aaSamw  * If the hostname has been fully-qualified for some reason, the domain
2329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * part will be removed.  The returned hostname is converted to the
2339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * specified case (lower, upper, or preserved).
234da6c28aaSamw  *
235da6c28aaSamw  * If gethostname fails, the returned buffer will contain an empty
236da6c28aaSamw  * string.
237da6c28aaSamw  */
238da6c28aaSamw int
smb_gethostname(char * buf,size_t buflen,smb_caseconv_t which)2399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_gethostname(char *buf, size_t buflen, smb_caseconv_t which)
240da6c28aaSamw {
241da6c28aaSamw 	char *p;
242da6c28aaSamw 
243da6c28aaSamw 	if (buf == NULL || buflen == 0)
244da6c28aaSamw 		return (-1);
245da6c28aaSamw 
246da6c28aaSamw 	if (gethostname(buf, buflen) != 0) {
247da6c28aaSamw 		*buf = '\0';
248da6c28aaSamw 		return (-1);
249da6c28aaSamw 	}
250da6c28aaSamw 
251da6c28aaSamw 	buf[buflen - 1] = '\0';
252da6c28aaSamw 
253da6c28aaSamw 	if ((p = strchr(buf, '.')) != NULL)
254da6c28aaSamw 		*p = '\0';
255da6c28aaSamw 
2569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	switch (which) {
2579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_CASE_LOWER:
2589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) smb_strlwr(buf);
2599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
2609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_CASE_UPPER:
262bbf6f00cSJordan Brown 		(void) smb_strupr(buf);
2639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
2649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_CASE_PRESERVE:
2669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	default:
2679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
2689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
269da6c28aaSamw 
270da6c28aaSamw 	return (0);
271da6c28aaSamw }
272da6c28aaSamw 
273da6c28aaSamw /*
2749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Obtain the fully-qualified name for this machine in lower case.  If
2759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * the hostname is fully-qualified, accept it.  Otherwise, try to find an
2769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * appropriate domain name to append to the hostname.
277da6c28aaSamw  */
278da6c28aaSamw int
smb_getfqhostname(char * buf,size_t buflen)279dc20a302Sas smb_getfqhostname(char *buf, size_t buflen)
280da6c28aaSamw {
281dc20a302Sas 	char hostname[MAXHOSTNAMELEN];
282dc20a302Sas 	char domain[MAXHOSTNAMELEN];
283da6c28aaSamw 
284dc20a302Sas 	hostname[0] = '\0';
285dc20a302Sas 	domain[0] = '\0';
286dc20a302Sas 
2879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_gethostname(hostname, MAXHOSTNAMELEN,
2889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    SMB_CASE_LOWER) != 0)
289da6c28aaSamw 		return (-1);
290da6c28aaSamw 
291dc20a302Sas 	if (smb_getfqdomainname(domain, MAXHOSTNAMELEN) != 0)
292dc20a302Sas 		return (-1);
293dc20a302Sas 
294dc20a302Sas 	if (hostname[0] == '\0')
295dc20a302Sas 		return (-1);
296da6c28aaSamw 
297dc20a302Sas 	if (domain[0] == '\0') {
298dc20a302Sas 		(void) strlcpy(buf, hostname, buflen);
299da6c28aaSamw 		return (0);
300da6c28aaSamw 	}
301da6c28aaSamw 
302dc20a302Sas 	(void) snprintf(buf, buflen, "%s.%s", hostname, domain);
303dc20a302Sas 	return (0);
304dc20a302Sas }
305da6c28aaSamw 
306da6c28aaSamw /*
307dc20a302Sas  * smb_getdomainname
308dc20a302Sas  *
309dc20a302Sas  * Returns NETBIOS name of the domain if the system is in domain
310dc20a302Sas  * mode. Or returns workgroup name if the system is in workgroup
311dc20a302Sas  * mode.
312da6c28aaSamw  */
313da6c28aaSamw int
smb_getdomainname(char * buf,size_t buflen)314dc20a302Sas smb_getdomainname(char *buf, size_t buflen)
315da6c28aaSamw {
316dc20a302Sas 	int rc;
317da6c28aaSamw 
318dc20a302Sas 	if (buf == NULL || buflen == 0)
319dc20a302Sas 		return (-1);
320da6c28aaSamw 
321dc20a302Sas 	*buf = '\0';
3228d7e4166Sjose borrego 	rc = smb_config_getstr(SMB_CI_DOMAIN_NAME, buf, buflen);
323dc20a302Sas 
3248d7e4166Sjose borrego 	if ((rc != SMBD_SMF_OK) || (*buf == '\0'))
325da6c28aaSamw 		return (-1);
326da6c28aaSamw 
327dc20a302Sas 	return (0);
328dc20a302Sas }
329dc20a302Sas 
330dc20a302Sas /*
331dc20a302Sas  * smb_getfqdomainname
332dc20a302Sas  *
3338d7e4166Sjose borrego  * In the system is in domain mode, the dns_domain property value
3348d7e4166Sjose borrego  * is returned. Otherwise, it returns the local domain obtained via
3358d7e4166Sjose borrego  * resolver.
336dc20a302Sas  *
337dc20a302Sas  * Returns 0 upon success.  Otherwise, returns -1.
338dc20a302Sas  */
339dc20a302Sas int
smb_getfqdomainname(char * buf,size_t buflen)340dc20a302Sas smb_getfqdomainname(char *buf, size_t buflen)
341dc20a302Sas {
3428d7e4166Sjose borrego 	struct __res_state res_state;
3438d7e4166Sjose borrego 	int rc;
344dc20a302Sas 
345dc20a302Sas 	if (buf == NULL || buflen == 0)
346dc20a302Sas 		return (-1);
347dc20a302Sas 
348dc20a302Sas 	*buf = '\0';
349dc20a302Sas 	if (smb_config_get_secmode() == SMB_SECMODE_DOMAIN) {
3508d7e4166Sjose borrego 		rc = smb_config_getstr(SMB_CI_DOMAIN_FQDN, buf, buflen);
351dc20a302Sas 
3528d7e4166Sjose borrego 		if ((rc != SMBD_SMF_OK) || (*buf == '\0'))
3538d7e4166Sjose borrego 			return (-1);
3548d7e4166Sjose borrego 	} else {
3558d7e4166Sjose borrego 		bzero(&res_state, sizeof (struct __res_state));
3568d7e4166Sjose borrego 		if (res_ninit(&res_state))
357dc20a302Sas 			return (-1);
358dc20a302Sas 
3598d7e4166Sjose borrego 		if (*res_state.defdname == '\0') {
3608d7e4166Sjose borrego 			res_ndestroy(&res_state);
3618d7e4166Sjose borrego 			return (-1);
362dc20a302Sas 		}
3638d7e4166Sjose borrego 
3648d7e4166Sjose borrego 		(void) strlcpy(buf, res_state.defdname, buflen);
3658d7e4166Sjose borrego 		res_ndestroy(&res_state);
3668d7e4166Sjose borrego 		rc = 0;
367dc20a302Sas 	}
368dc20a302Sas 
369dc20a302Sas 	return (rc);
370da6c28aaSamw }
371da6c28aaSamw 
372dc20a302Sas 
373faa1795aSjb /*
374faa1795aSjb  * smb_set_machine_passwd
375faa1795aSjb  *
376faa1795aSjb  * This function should be used when setting the machine password property.
377faa1795aSjb  * The associated sequence number is incremented.
378faa1795aSjb  */
379faa1795aSjb static int
smb_set_machine_passwd(char * passwd)380faa1795aSjb smb_set_machine_passwd(char *passwd)
381faa1795aSjb {
382faa1795aSjb 	int64_t num;
383faa1795aSjb 	int rc = -1;
384faa1795aSjb 
385faa1795aSjb 	if (smb_config_set(SMB_CI_MACHINE_PASSWD, passwd) != SMBD_SMF_OK)
386faa1795aSjb 		return (-1);
387faa1795aSjb 
388faa1795aSjb 	(void) mutex_lock(&seqnum_mtx);
389faa1795aSjb 	(void) smb_config_getnum(SMB_CI_KPASSWD_SEQNUM, &num);
390faa1795aSjb 	if (smb_config_setnum(SMB_CI_KPASSWD_SEQNUM, ++num)
391faa1795aSjb 	    == SMBD_SMF_OK)
392faa1795aSjb 		rc = 0;
393faa1795aSjb 	(void) mutex_unlock(&seqnum_mtx);
394faa1795aSjb 	return (rc);
395faa1795aSjb }
396faa1795aSjb 
397a0aa776eSAlan Wright static int
smb_get_machine_passwd(uint8_t * buf,size_t buflen)398a0aa776eSAlan Wright smb_get_machine_passwd(uint8_t *buf, size_t buflen)
399a0aa776eSAlan Wright {
400a0aa776eSAlan Wright 	char pwd[SMB_PASSWD_MAXLEN + 1];
401a0aa776eSAlan Wright 	int rc;
402a0aa776eSAlan Wright 
403a0aa776eSAlan Wright 	if (buflen < SMBAUTH_HASH_SZ)
404a0aa776eSAlan Wright 		return (-1);
405a0aa776eSAlan Wright 
406a0aa776eSAlan Wright 	rc = smb_config_getstr(SMB_CI_MACHINE_PASSWD, pwd, sizeof (pwd));
407a0aa776eSAlan Wright 	if ((rc != SMBD_SMF_OK) || *pwd == '\0')
408a0aa776eSAlan Wright 		return (-1);
409a0aa776eSAlan Wright 
410a0aa776eSAlan Wright 	if (smb_auth_ntlm_hash(pwd, buf) != 0)
411a0aa776eSAlan Wright 		return (-1);
412a0aa776eSAlan Wright 
413a0aa776eSAlan Wright 	return (rc);
414a0aa776eSAlan Wright }
415a0aa776eSAlan Wright 
416a0aa776eSAlan Wright /*
417a0aa776eSAlan Wright  * Set up IPC connection credentials.
418a0aa776eSAlan Wright  */
419a0aa776eSAlan Wright void
smb_ipc_init(void)420a0aa776eSAlan Wright smb_ipc_init(void)
421a0aa776eSAlan Wright {
422a0aa776eSAlan Wright 	int rc;
423a0aa776eSAlan Wright 
424a0aa776eSAlan Wright 	(void) rw_wrlock(&smb_ipc_lock);
425a0aa776eSAlan Wright 	bzero(&ipc_info, sizeof (smb_ipc_t));
426a0aa776eSAlan Wright 	bzero(&ipc_orig_info, sizeof (smb_ipc_t));
427a0aa776eSAlan Wright 
428a0aa776eSAlan Wright 	(void) smb_getsamaccount(ipc_info.user, SMB_USERNAME_MAXLEN);
429a0aa776eSAlan Wright 	rc = smb_get_machine_passwd(ipc_info.passwd, SMBAUTH_HASH_SZ);
430a0aa776eSAlan Wright 	if (rc != 0)
431a0aa776eSAlan Wright 		*ipc_info.passwd = 0;
432a0aa776eSAlan Wright 	(void) rw_unlock(&smb_ipc_lock);
433a0aa776eSAlan Wright 
434a0aa776eSAlan Wright }
435a0aa776eSAlan Wright 
436a0aa776eSAlan Wright /*
437a0aa776eSAlan Wright  * Set the IPC username and password hash in memory.  If the domain
438a0aa776eSAlan Wright  * join succeeds, the credentials will be committed for use with
439a0aa776eSAlan Wright  * authenticated IPC.  Otherwise, they should be rolled back.
440a0aa776eSAlan Wright  */
441a0aa776eSAlan Wright void
smb_ipc_set(char * plain_user,uint8_t * passwd_hash)442a0aa776eSAlan Wright smb_ipc_set(char *plain_user, uint8_t *passwd_hash)
443a0aa776eSAlan Wright {
444a0aa776eSAlan Wright 	(void) rw_wrlock(&smb_ipc_lock);
445a0aa776eSAlan Wright 	(void) strlcpy(ipc_info.user, plain_user, sizeof (ipc_info.user));
446a0aa776eSAlan Wright 	(void) memcpy(ipc_info.passwd, passwd_hash, SMBAUTH_HASH_SZ);
447a0aa776eSAlan Wright 	(void) rw_unlock(&smb_ipc_lock);
448a0aa776eSAlan Wright 
449a0aa776eSAlan Wright }
450a0aa776eSAlan Wright 
451a0aa776eSAlan Wright /*
452a0aa776eSAlan Wright  * Save the host credentials to be used for authenticated IPC.
453a0aa776eSAlan Wright  * The credentials are also saved to the original IPC info as
454a0aa776eSAlan Wright  * rollback data in case the join domain process fails later.
455a0aa776eSAlan Wright  */
456a0aa776eSAlan Wright void
smb_ipc_commit(void)457a0aa776eSAlan Wright smb_ipc_commit(void)
458a0aa776eSAlan Wright {
459a0aa776eSAlan Wright 	(void) rw_wrlock(&smb_ipc_lock);
460a0aa776eSAlan Wright 	(void) smb_getsamaccount(ipc_info.user, SMB_USERNAME_MAXLEN);
461a0aa776eSAlan Wright 	(void) smb_get_machine_passwd(ipc_info.passwd, SMBAUTH_HASH_SZ);
462a0aa776eSAlan Wright 	(void) memcpy(&ipc_orig_info, &ipc_info, sizeof (smb_ipc_t));
463a0aa776eSAlan Wright 	(void) rw_unlock(&smb_ipc_lock);
464a0aa776eSAlan Wright }
465a0aa776eSAlan Wright 
466a0aa776eSAlan Wright /*
467a0aa776eSAlan Wright  * Restore the original credentials
468a0aa776eSAlan Wright  */
469a0aa776eSAlan Wright void
smb_ipc_rollback(void)470a0aa776eSAlan Wright smb_ipc_rollback(void)
471a0aa776eSAlan Wright {
472a0aa776eSAlan Wright 	(void) rw_wrlock(&smb_ipc_lock);
473a0aa776eSAlan Wright 	(void) strlcpy(ipc_info.user, ipc_orig_info.user,
474a0aa776eSAlan Wright 	    sizeof (ipc_info.user));
475a0aa776eSAlan Wright 	(void) memcpy(ipc_info.passwd, ipc_orig_info.passwd,
476a0aa776eSAlan Wright 	    sizeof (ipc_info.passwd));
477a0aa776eSAlan Wright 	(void) rw_unlock(&smb_ipc_lock);
478a0aa776eSAlan Wright }
479a0aa776eSAlan Wright 
480a0aa776eSAlan Wright void
smb_ipc_get_user(char * buf,size_t buflen)481a0aa776eSAlan Wright smb_ipc_get_user(char *buf, size_t buflen)
482a0aa776eSAlan Wright {
483a0aa776eSAlan Wright 	(void) rw_rdlock(&smb_ipc_lock);
484a0aa776eSAlan Wright 	(void) strlcpy(buf, ipc_info.user, buflen);
485a0aa776eSAlan Wright 	(void) rw_unlock(&smb_ipc_lock);
486a0aa776eSAlan Wright }
487a0aa776eSAlan Wright 
488a0aa776eSAlan Wright void
smb_ipc_get_passwd(uint8_t * buf,size_t buflen)489a0aa776eSAlan Wright smb_ipc_get_passwd(uint8_t *buf, size_t buflen)
490a0aa776eSAlan Wright {
491a0aa776eSAlan Wright 	if (buflen < SMBAUTH_HASH_SZ)
492a0aa776eSAlan Wright 		return;
493a0aa776eSAlan Wright 
494a0aa776eSAlan Wright 	(void) rw_rdlock(&smb_ipc_lock);
495a0aa776eSAlan Wright 	(void) memcpy(buf, ipc_info.passwd, SMBAUTH_HASH_SZ);
496a0aa776eSAlan Wright 	(void) rw_unlock(&smb_ipc_lock);
497a0aa776eSAlan Wright }
498a0aa776eSAlan Wright 
499faa1795aSjb /*
500faa1795aSjb  * smb_match_netlogon_seqnum
501faa1795aSjb  *
502faa1795aSjb  * A sequence number is associated with each machine password property
503faa1795aSjb  * update and the netlogon credential chain setup. If the
504faa1795aSjb  * sequence numbers don't match, a NETLOGON credential chain
505faa1795aSjb  * establishment is required.
506faa1795aSjb  *
507faa1795aSjb  * Returns 0 if kpasswd_seqnum equals to netlogon_seqnum. Otherwise,
508faa1795aSjb  * returns -1.
509faa1795aSjb  */
510faa1795aSjb boolean_t
smb_match_netlogon_seqnum(void)511faa1795aSjb smb_match_netlogon_seqnum(void)
512faa1795aSjb {
513faa1795aSjb 	int64_t setpasswd_seqnum;
514faa1795aSjb 	int64_t netlogon_seqnum;
515faa1795aSjb 
516faa1795aSjb 	(void) mutex_lock(&seqnum_mtx);
517faa1795aSjb 	(void) smb_config_getnum(SMB_CI_KPASSWD_SEQNUM, &setpasswd_seqnum);
518faa1795aSjb 	(void) smb_config_getnum(SMB_CI_NETLOGON_SEQNUM, &netlogon_seqnum);
519faa1795aSjb 	(void) mutex_unlock(&seqnum_mtx);
520faa1795aSjb 	return (setpasswd_seqnum == netlogon_seqnum);
521faa1795aSjb }
522faa1795aSjb 
523faa1795aSjb /*
524faa1795aSjb  * smb_setdomainprops
525faa1795aSjb  *
526faa1795aSjb  * This function should be called after joining an AD to
527faa1795aSjb  * set all the domain related SMF properties.
528faa1795aSjb  *
529faa1795aSjb  * The kpasswd_domain property is the AD domain to which the system
530faa1795aSjb  * is joined via kclient. If this function is invoked by the SMB
531faa1795aSjb  * daemon, fqdn should be set to NULL.
532faa1795aSjb  */
533faa1795aSjb int
smb_setdomainprops(char * fqdn,char * server,char * passwd)534faa1795aSjb smb_setdomainprops(char *fqdn, char *server, char *passwd)
535faa1795aSjb {
536faa1795aSjb 	if (server == NULL || passwd == NULL)
537faa1795aSjb 		return (-1);
538faa1795aSjb 
539faa1795aSjb 	if ((*server == '\0') || (*passwd == '\0'))
540faa1795aSjb 		return (-1);
541faa1795aSjb 
542faa1795aSjb 	if (fqdn && (smb_config_set(SMB_CI_KPASSWD_DOMAIN, fqdn) != 0))
543faa1795aSjb 		return (-1);
544faa1795aSjb 
545faa1795aSjb 	if (smb_config_set(SMB_CI_KPASSWD_SRV, server) != 0)
546faa1795aSjb 		return (-1);
547faa1795aSjb 
548faa1795aSjb 	if (smb_set_machine_passwd(passwd) != 0) {
549faa1795aSjb 		syslog(LOG_ERR, "smb_setdomainprops: failed to set"
550faa1795aSjb 		    " machine account password");
551faa1795aSjb 		return (-1);
552faa1795aSjb 	}
553faa1795aSjb 
554faa1795aSjb 	/*
555faa1795aSjb 	 * If we successfully create a trust account, we mark
556faa1795aSjb 	 * ourselves as a domain member in the environment so
557faa1795aSjb 	 * that we use the SAMLOGON version of the NETLOGON
558faa1795aSjb 	 * PDC location protocol.
559faa1795aSjb 	 */
560faa1795aSjb 	(void) smb_config_setbool(SMB_CI_DOMAIN_MEMB, B_TRUE);
561faa1795aSjb 
562faa1795aSjb 	return (0);
563faa1795aSjb }
564faa1795aSjb 
565faa1795aSjb /*
566faa1795aSjb  * smb_update_netlogon_seqnum
567faa1795aSjb  *
568faa1795aSjb  * This function should only be called upon a successful netlogon
569faa1795aSjb  * credential chain establishment to set the sequence number of the
570faa1795aSjb  * netlogon to match with that of the kpasswd.
571faa1795aSjb  */
572faa1795aSjb void
smb_update_netlogon_seqnum(void)573faa1795aSjb smb_update_netlogon_seqnum(void)
574faa1795aSjb {
575faa1795aSjb 	int64_t num;
576faa1795aSjb 
577faa1795aSjb 	(void) mutex_lock(&seqnum_mtx);
578faa1795aSjb 	(void) smb_config_getnum(SMB_CI_KPASSWD_SEQNUM, &num);
579faa1795aSjb 	(void) smb_config_setnum(SMB_CI_NETLOGON_SEQNUM, num);
580faa1795aSjb 	(void) mutex_unlock(&seqnum_mtx);
581faa1795aSjb }
582faa1795aSjb 
583dc20a302Sas 
584da6c28aaSamw /*
585da6c28aaSamw  * Temporary fbt for dtrace until user space sdt enabled.
586da6c28aaSamw  */
587da6c28aaSamw void
smb_tracef(const char * fmt,...)588da6c28aaSamw smb_tracef(const char *fmt, ...)
589da6c28aaSamw {
590da6c28aaSamw 	va_list ap;
591da6c28aaSamw 	char buf[128];
592da6c28aaSamw 
593da6c28aaSamw 	va_start(ap, fmt);
594da6c28aaSamw 	(void) vsnprintf(buf, 128, fmt, ap);
595da6c28aaSamw 	va_end(ap);
596da6c28aaSamw 
597da6c28aaSamw 	smb_trace(buf);
598da6c28aaSamw }
599da6c28aaSamw 
600da6c28aaSamw /*
601da6c28aaSamw  * Temporary fbt for dtrace until user space sdt enabled.
602b819cea2SGordon Ross  *
603b819cea2SGordon Ross  * This function is designed to be used with dtrace, i.e. see:
604b819cea2SGordon Ross  * usr/src/cmd/smbsrv/dtrace/smbd-all.d
605b819cea2SGordon Ross  *
606b819cea2SGordon Ross  * Outside of dtrace, the messages passed to this function usually
607b819cea2SGordon Ross  * lack sufficient context to be useful, so we don't log them.
608da6c28aaSamw  */
609da6c28aaSamw void
smb_trace(const char * s __unused)610a5651032SToomas Soome smb_trace(const char *s __unused)
611da6c28aaSamw {
612da6c28aaSamw }
6137b59d02dSjb 
6147b59d02dSjb /*
6157b59d02dSjb  * smb_tonetbiosname
6167b59d02dSjb  *
6177b59d02dSjb  * Creates a NetBIOS name based on the given name and suffix.
6187b59d02dSjb  * NetBIOS name is 15 capital characters, padded with space if needed
6197b59d02dSjb  * and the 16th byte is the suffix.
6207b59d02dSjb  */
6217b59d02dSjb void
smb_tonetbiosname(char * name,char * nb_name,char suffix)6227b59d02dSjb smb_tonetbiosname(char *name, char *nb_name, char suffix)
6237b59d02dSjb {
6247b59d02dSjb 	char tmp_name[NETBIOS_NAME_SZ];
625bbf6f00cSJordan Brown 	smb_wchar_t wtmp_name[NETBIOS_NAME_SZ];
6267b59d02dSjb 	int len;
6277b59d02dSjb 	size_t rc;
6287b59d02dSjb 
6297b59d02dSjb 	len = 0;
630bbf6f00cSJordan Brown 	rc = smb_mbstowcs(wtmp_name, (const char *)name, NETBIOS_NAME_SZ);
6317b59d02dSjb 
6327b59d02dSjb 	if (rc != (size_t)-1) {
6337b59d02dSjb 		wtmp_name[NETBIOS_NAME_SZ - 1] = 0;
634bbf6f00cSJordan Brown 		rc = ucstooem(tmp_name, wtmp_name, NETBIOS_NAME_SZ,
635bbf6f00cSJordan Brown 		    OEM_CPG_850);
6367b59d02dSjb 		if (rc > 0)
6377b59d02dSjb 			len = strlen(tmp_name);
6387b59d02dSjb 	}
6397b59d02dSjb 
6407b59d02dSjb 	(void) memset(nb_name, ' ', NETBIOS_NAME_SZ - 1);
6417b59d02dSjb 	if (len) {
642bbf6f00cSJordan Brown 		(void) smb_strupr(tmp_name);
6437b59d02dSjb 		(void) memcpy(nb_name, tmp_name, len);
6447b59d02dSjb 	}
6457b59d02dSjb 	nb_name[NETBIOS_NAME_SZ - 1] = suffix;
6467b59d02dSjb }
6477b59d02dSjb 
6487b59d02dSjb int
smb_get_nameservers(smb_inaddr_t * ips,int sz)6497f667e74Sjose borrego smb_get_nameservers(smb_inaddr_t *ips, int sz)
6507b59d02dSjb {
6517b59d02dSjb 	union res_sockaddr_union set[MAXNS];
6527b59d02dSjb 	int i, cnt;
6537b59d02dSjb 	struct __res_state res_state;
6547f667e74Sjose borrego 	char ipstr[INET6_ADDRSTRLEN];
6557b59d02dSjb 
6567b59d02dSjb 	if (ips == NULL)
6577b59d02dSjb 		return (0);
6587b59d02dSjb 
6597b59d02dSjb 	bzero(&res_state, sizeof (struct __res_state));
6607b59d02dSjb 	if (res_ninit(&res_state) < 0)
6617b59d02dSjb 		return (0);
6627b59d02dSjb 
6637b59d02dSjb 	cnt = res_getservers(&res_state, set, MAXNS);
6647b59d02dSjb 	for (i = 0; i < cnt; i++) {
6657b59d02dSjb 		if (i >= sz)
6667b59d02dSjb 			break;
6677f667e74Sjose borrego 		ips[i].a_family = AF_INET;
668b819cea2SGordon Ross 		bcopy(&set[i].sin.sin_addr, &ips[i].a_ipv4, NS_INADDRSZ);
6697f667e74Sjose borrego 		if (inet_ntop(AF_INET, &ips[i].a_ipv4, ipstr,
6707f667e74Sjose borrego 		    INET_ADDRSTRLEN)) {
6717f667e74Sjose borrego 			syslog(LOG_DEBUG, "Found %s name server\n", ipstr);
6727f667e74Sjose borrego 			continue;
6737f667e74Sjose borrego 		}
6747f667e74Sjose borrego 		ips[i].a_family = AF_INET6;
675b819cea2SGordon Ross 		bcopy(&set[i].sin.sin_addr, &ips[i].a_ipv6, NS_IN6ADDRSZ);
6767f667e74Sjose borrego 		if (inet_ntop(AF_INET6, &ips[i].a_ipv6, ipstr,
6777f667e74Sjose borrego 		    INET6_ADDRSTRLEN)) {
6787f667e74Sjose borrego 			syslog(LOG_DEBUG, "Found %s name server\n", ipstr);
6797f667e74Sjose borrego 		}
6807b59d02dSjb 	}
6817b59d02dSjb 	res_ndestroy(&res_state);
6827b59d02dSjb 	return (i);
6837b59d02dSjb }
68429bd2886SAlan Wright 
6858d7e4166Sjose borrego /*
6868d7e4166Sjose borrego  * smb_gethostbyname
6878d7e4166Sjose borrego  *
6888d7e4166Sjose borrego  * Looks up a host by the given name. The host entry can come
6898d7e4166Sjose borrego  * from any of the sources for hosts specified in the
6908d7e4166Sjose borrego  * /etc/nsswitch.conf and the NetBIOS cache.
6918d7e4166Sjose borrego  *
6928d7e4166Sjose borrego  * XXX Invokes nbt_name_resolve API once the NBTD is integrated
6938d7e4166Sjose borrego  * to look in the NetBIOS cache if getipnodebyname fails.
6948d7e4166Sjose borrego  *
6958d7e4166Sjose borrego  * Caller should invoke freehostent to free the returned hostent.
6968d7e4166Sjose borrego  */
6978d7e4166Sjose borrego struct hostent *
smb_gethostbyname(const char * name,int * err_num)6988d7e4166Sjose borrego smb_gethostbyname(const char *name, int *err_num)
6998d7e4166Sjose borrego {
7008d7e4166Sjose borrego 	struct hostent *h;
7018d7e4166Sjose borrego 
7028d7e4166Sjose borrego 	h = getipnodebyname(name, AF_INET, 0, err_num);
7037f667e74Sjose borrego 	if ((h == NULL) || h->h_length != INADDRSZ)
7047f667e74Sjose borrego 		h = getipnodebyname(name, AF_INET6, AI_DEFAULT, err_num);
7058d7e4166Sjose borrego 	return (h);
7068d7e4166Sjose borrego }
7078d7e4166Sjose borrego 
7088d7e4166Sjose borrego /*
7098d7e4166Sjose borrego  * smb_gethostbyaddr
7108d7e4166Sjose borrego  *
7118d7e4166Sjose borrego  * Looks up a host by the given IP address. The host entry can come
7128d7e4166Sjose borrego  * from any of the sources for hosts specified in the
7138d7e4166Sjose borrego  * /etc/nsswitch.conf and the NetBIOS cache.
7148d7e4166Sjose borrego  *
7158d7e4166Sjose borrego  * XXX Invokes nbt API to resolve name by IP once the NBTD is integrated
7168d7e4166Sjose borrego  * to look in the NetBIOS cache if getipnodebyaddr fails.
7178d7e4166Sjose borrego  *
7188d7e4166Sjose borrego  * Caller should invoke freehostent to free the returned hostent.
7198d7e4166Sjose borrego  */
7208d7e4166Sjose borrego struct hostent *
smb_gethostbyaddr(const char * addr,int len,int type,int * err_num)7218d7e4166Sjose borrego smb_gethostbyaddr(const char *addr, int len, int type, int *err_num)
7228d7e4166Sjose borrego {
7238d7e4166Sjose borrego 	struct hostent *h;
7248d7e4166Sjose borrego 
7258d7e4166Sjose borrego 	h = getipnodebyaddr(addr, len, type, err_num);
7268d7e4166Sjose borrego 
7278d7e4166Sjose borrego 	return (h);
7288d7e4166Sjose borrego }
729ce8560eeSMatt Barden 
730ce8560eeSMatt Barden uint32_t
smb_get_netlogon_flags(void)731ce8560eeSMatt Barden smb_get_netlogon_flags(void)
732ce8560eeSMatt Barden {
733ce8560eeSMatt Barden 	int64_t val;
734ce8560eeSMatt Barden 
735ce8560eeSMatt Barden 	if (smb_config_getnum(SMB_CI_NETLOGON_FLAGS, &val) != SMBD_SMF_OK)
736ce8560eeSMatt Barden 		return (SMB_PI_NETLOGON_FLAGS_DEFAULT);
737ce8560eeSMatt Barden 
738ce8560eeSMatt Barden 	/* These are flags, and we only use the lowest 32 bits */
739ce8560eeSMatt Barden 	return ((uint32_t)val);
740ce8560eeSMatt Barden }
741