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 /*
22c5866007SKeyur Desai  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
23dafb549fSGordon Ross  * Copyright 2019 Nexenta Systems, Inc.  All rights reserved.
24*b6b7639aSGordon Ross  * Copyright 2022 RackTop Systems, Inc.
25da6c28aaSamw  */
26da6c28aaSamw 
279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <sys/list.h>
289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <assert.h>
29da6c28aaSamw #include <alloca.h>
30da6c28aaSamw #include <door.h>
31da6c28aaSamw #include <errno.h>
32da6c28aaSamw #include <syslog.h>
33da6c28aaSamw #include <unistd.h>
34da6c28aaSamw #include <stdio.h>
35da6c28aaSamw #include <synch.h>
36da6c28aaSamw #include <string.h>
37*b6b7639aSGordon Ross #include <strings.h>
38da6c28aaSamw #include <stdlib.h>
39da6c28aaSamw #include <sys/stat.h>
40da6c28aaSamw #include <fcntl.h>
41da6c28aaSamw #include <pthread.h>
42*b6b7639aSGordon Ross #include <priv.h>
43*b6b7639aSGordon Ross #include <rpcsvc/daemon_utils.h> /* DAEMON_UID */
44*b6b7639aSGordon Ross 
459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_door.h>
469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_xdr.h>
479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_token.h>
489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/libmlsvc.h>
499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/libsmbns.h>
509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include "smbd.h"
519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The list contains asynchronous requests that have been initiated
549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * but have not yet been collected (via smbd_dop_async_response).
559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States typedef struct smbd_doorsvc {
579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_t		sd_mutex;
589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	cond_t		sd_cv;
599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_t		sd_async_list;
609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	sd_async_count;
619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } smbd_doorsvc_t;
629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_null(smbd_arg_t *);
649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_async_response(smbd_arg_t *);
659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_user_auth_logon(smbd_arg_t *);
669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_user_nonauth_logon(smbd_arg_t *);
679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_user_auth_logoff(smbd_arg_t *);
689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_lookup_sid(smbd_arg_t *);
699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_lookup_name(smbd_arg_t *);
709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_join(smbd_arg_t *);
719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_get_dcinfo(smbd_arg_t *);
729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_vss_get_count(smbd_arg_t *);
739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_vss_get_snapshots(smbd_arg_t *);
749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_vss_map_gmttoken(smbd_arg_t *);
759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_ads_find_host(smbd_arg_t *);
769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_quota_query(smbd_arg_t *);
779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_quota_set(smbd_arg_t *);
789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_dfs_get_referrals(smbd_arg_t *);
79148c5f43SAlan Wright static int smbd_dop_shr_hostaccess(smbd_arg_t *);
80148c5f43SAlan Wright static int smbd_dop_shr_exec(smbd_arg_t *);
81b3700b07SGordon Ross static int smbd_dop_notify_dc_changed(smbd_arg_t *);
829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States typedef int (*smbd_dop_t)(smbd_arg_t *);
849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States typedef struct smbd_doorop {
869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_dopcode_t	opcode;
87*b6b7639aSGordon Ross 	int		opflags;
889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_dop_t	op;
899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } smbd_doorop_t;
90da6c28aaSamw 
91*b6b7639aSGordon Ross /* doorop opflags */
92*b6b7639aSGordon Ross #define	DOF_R	1	/* read */
93*b6b7639aSGordon Ross #define	DOF_W	2	/* write */
94*b6b7639aSGordon Ross #define	DOF_K	4	/* kernel caller */
95*b6b7639aSGordon Ross #define	DOF_D	8	/* daemon caller */
96*b6b7639aSGordon Ross 
979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_doorop_t smbd_doorops[] = {
98*b6b7639aSGordon Ross 	{ SMB_DR_NULL,			DOF_R,	smbd_dop_null },
99*b6b7639aSGordon Ross 	{ SMB_DR_ASYNC_RESPONSE,	DOF_K,	smbd_dop_async_response },
100*b6b7639aSGordon Ross 	{ SMB_DR_USER_AUTH_LOGON,	DOF_W,	smbd_dop_user_auth_logon },
101*b6b7639aSGordon Ross 	{ SMB_DR_USER_NONAUTH_LOGON,	DOF_W,	smbd_dop_user_nonauth_logon },
102*b6b7639aSGordon Ross 	{ SMB_DR_USER_AUTH_LOGOFF,	DOF_K,	smbd_dop_user_auth_logoff },
103*b6b7639aSGordon Ross 	{ SMB_DR_LOOKUP_SID,		DOF_R,	smbd_dop_lookup_sid },
104*b6b7639aSGordon Ross 	{ SMB_DR_LOOKUP_NAME,		DOF_R,	smbd_dop_lookup_name },
105*b6b7639aSGordon Ross 	{ SMB_DR_JOIN,			DOF_W,	smbd_dop_join },
106*b6b7639aSGordon Ross 	{ SMB_DR_GET_DCINFO,		DOF_R,	smbd_dop_get_dcinfo },
107*b6b7639aSGordon Ross 	{ SMB_DR_VSS_GET_COUNT,		DOF_K,	smbd_dop_vss_get_count },
108*b6b7639aSGordon Ross 	{ SMB_DR_VSS_GET_SNAPSHOTS,	DOF_K,	smbd_dop_vss_get_snapshots },
109*b6b7639aSGordon Ross 	{ SMB_DR_VSS_MAP_GMTTOKEN,	DOF_K,	smbd_dop_vss_map_gmttoken },
110*b6b7639aSGordon Ross 	{ SMB_DR_ADS_FIND_HOST,		DOF_R,	smbd_dop_ads_find_host },
111*b6b7639aSGordon Ross 	{ SMB_DR_QUOTA_QUERY,		DOF_K,	smbd_dop_quota_query },
112*b6b7639aSGordon Ross 	{ SMB_DR_QUOTA_SET,		DOF_K,	smbd_dop_quota_set },
113*b6b7639aSGordon Ross 	{ SMB_DR_DFS_GET_REFERRALS,	DOF_K,	smbd_dop_dfs_get_referrals },
114*b6b7639aSGordon Ross 	{ SMB_DR_SHR_HOSTACCESS,	DOF_K,	smbd_dop_shr_hostaccess },
115*b6b7639aSGordon Ross 	{ SMB_DR_SHR_EXEC,		DOF_K,	smbd_dop_shr_exec },
116*b6b7639aSGordon Ross 	{ SMB_DR_NOTIFY_DC_CHANGED,	DOF_W|DOF_D,
117*b6b7639aSGordon Ross 						smbd_dop_notify_dc_changed },
118*b6b7639aSGordon Ross 	{ SMB_DR_LOOKUP_LSID,		DOF_R,	smbd_dop_lookup_sid },
119*b6b7639aSGordon Ross 	{ SMB_DR_LOOKUP_LNAME,		DOF_R,	smbd_dop_lookup_name }
1209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States };
121da6c28aaSamw 
1229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_ndoorop = (sizeof (smbd_doorops) / sizeof (smbd_doorops[0]));
123da6c28aaSamw 
1249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static smbd_doorsvc_t smbd_doorsvc;
1259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_door_fd = -1;
1269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_door_cookie = 0x534D4244;	/* SMBD */
1279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static smbd_door_t smbd_door_sdh;
128b819cea2SGordon Ross static char *smbd_door_name = NULL;
1299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void smbd_door_dispatch(void *, char *, size_t, door_desc_t *, uint_t);
1319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_door_dispatch_async(smbd_arg_t *);
1329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void smbd_door_release_async(smbd_arg_t *);
133da6c28aaSamw 
134da6c28aaSamw /*
135da6c28aaSamw  * Start the smbd door service.  Create and bind to a door.
136da6c28aaSamw  * Returns 0 on success. Otherwise, -1.
137da6c28aaSamw  */
138da6c28aaSamw int
smbd_door_start(void)1399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_start(void)
140da6c28aaSamw {
141faa1795aSjb 	int	newfd;
142da6c28aaSamw 
1439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_lock(&smbd_doorsvc.sd_mutex);
144da6c28aaSamw 
1459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smbd_door_fd != -1) {
146da6c28aaSamw 		(void) fprintf(stderr, "smb_doorsrv_start: already started");
1479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) mutex_unlock(&smbd_doorsvc.sd_mutex);
148da6c28aaSamw 		return (-1);
149da6c28aaSamw 	}
150da6c28aaSamw 
151b819cea2SGordon Ross 	smbd_door_name = getenv("SMBD_DOOR_NAME");
152b819cea2SGordon Ross 	if (smbd_door_name == NULL)
153b819cea2SGordon Ross 		smbd_door_name = SMBD_DOOR_NAME;
154b819cea2SGordon Ross 
1559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_door_init(&smbd_door_sdh, "doorsrv");
1569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_create(&smbd_doorsvc.sd_async_list, sizeof (smbd_arg_t),
1589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    offsetof(smbd_arg_t, lnd));
1599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_doorsvc.sd_async_count = 0;
1609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((smbd_door_fd = door_create(smbd_door_dispatch,
1629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    &smbd_door_cookie, DOOR_UNREF)) < 0) {
163da6c28aaSamw 		(void) fprintf(stderr, "smb_doorsrv_start: door_create: %s",
164da6c28aaSamw 		    strerror(errno));
1659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbd_door_fd = -1;
1669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) mutex_unlock(&smbd_doorsvc.sd_mutex);
167da6c28aaSamw 		return (-1);
168da6c28aaSamw 	}
169da6c28aaSamw 
170b819cea2SGordon Ross 	(void) unlink(smbd_door_name);
171da6c28aaSamw 
172b819cea2SGordon Ross 	if ((newfd = creat(smbd_door_name, 0644)) < 0) {
173da6c28aaSamw 		(void) fprintf(stderr, "smb_doorsrv_start: open: %s",
174da6c28aaSamw 		    strerror(errno));
1759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) door_revoke(smbd_door_fd);
1769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbd_door_fd = -1;
1779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) mutex_unlock(&smbd_doorsvc.sd_mutex);
178da6c28aaSamw 		return (-1);
179da6c28aaSamw 	}
180da6c28aaSamw 
181da6c28aaSamw 	(void) close(newfd);
182b819cea2SGordon Ross 	(void) fdetach(smbd_door_name);
183da6c28aaSamw 
184b819cea2SGordon Ross 	if (fattach(smbd_door_fd, smbd_door_name) < 0) {
185da6c28aaSamw 		(void) fprintf(stderr, "smb_doorsrv_start: fattach: %s",
186da6c28aaSamw 		    strerror(errno));
1879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) door_revoke(smbd_door_fd);
1889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbd_door_fd = -1;
1899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) mutex_unlock(&smbd_doorsvc.sd_mutex);
190da6c28aaSamw 		return (-1);
191da6c28aaSamw 	}
192da6c28aaSamw 
1939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_unlock(&smbd_doorsvc.sd_mutex);
1949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (smbd_door_fd);
195da6c28aaSamw }
196da6c28aaSamw 
197da6c28aaSamw /*
198da6c28aaSamw  * Stop the smbd door service.
199da6c28aaSamw  */
200da6c28aaSamw void
smbd_door_stop(void)2019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_stop(void)
2029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
2039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_lock(&smbd_doorsvc.sd_mutex);
2049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_door_fini(&smbd_door_sdh);
2069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
207b819cea2SGordon Ross 	if (smbd_door_name)
208b819cea2SGordon Ross 		(void) fdetach(smbd_door_name);
209b819cea2SGordon Ross 
2109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smbd_door_fd != -1) {
2119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) door_revoke(smbd_door_fd);
2129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbd_door_fd = -1;
2139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_unlock(&smbd_doorsvc.sd_mutex);
2169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
218*b6b7639aSGordon Ross static boolean_t
have_req_privs(uint32_t opcode,int opflags)219*b6b7639aSGordon Ross have_req_privs(uint32_t opcode, int opflags)
220*b6b7639aSGordon Ross {
221*b6b7639aSGordon Ross 	ucred_t *uc = NULL;
222*b6b7639aSGordon Ross 	const priv_set_t *ps = NULL;
223*b6b7639aSGordon Ross 	boolean_t ret = B_FALSE;
224*b6b7639aSGordon Ross 	pid_t pid;
225*b6b7639aSGordon Ross 	uid_t uid;
226*b6b7639aSGordon Ross 
227*b6b7639aSGordon Ross 	/* If only DOF_R (read), let 'em through */
228*b6b7639aSGordon Ross 	if ((opflags & ~DOF_R) == 0)
229*b6b7639aSGordon Ross 		return (B_TRUE);
230*b6b7639aSGordon Ross 
231*b6b7639aSGordon Ross 	if (door_ucred(&uc) != 0) {
232*b6b7639aSGordon Ross 		syslog(LOG_DEBUG, "%s: door_ucred failed", __func__);
233*b6b7639aSGordon Ross 		goto out;
234*b6b7639aSGordon Ross 	}
235*b6b7639aSGordon Ross 
236*b6b7639aSGordon Ross 	/*
237*b6b7639aSGordon Ross 	 * in-kernel callers have pid==0
238*b6b7639aSGordon Ross 	 * If we have pid zero, that's sufficient.
239*b6b7639aSGordon Ross 	 * If not, allow with sys_smb priv (below)
240*b6b7639aSGordon Ross 	 */
241*b6b7639aSGordon Ross 	pid = ucred_getpid(uc);
242*b6b7639aSGordon Ross 	if ((opflags & DOF_K) != 0) {
243*b6b7639aSGordon Ross 		if (pid == 0) {
244*b6b7639aSGordon Ross 			ret = B_TRUE;
245*b6b7639aSGordon Ross 			goto out;
246*b6b7639aSGordon Ross 		}
247*b6b7639aSGordon Ross 	}
248*b6b7639aSGordon Ross 	uid = ucred_geteuid(uc);
249*b6b7639aSGordon Ross 	if ((opflags & DOF_D) != 0) {
250*b6b7639aSGordon Ross 		if (uid == DAEMON_UID) {
251*b6b7639aSGordon Ross 			ret = B_TRUE;
252*b6b7639aSGordon Ross 			goto out;
253*b6b7639aSGordon Ross 		}
254*b6b7639aSGordon Ross 	}
255*b6b7639aSGordon Ross 
256*b6b7639aSGordon Ross 	ps = ucred_getprivset(uc, PRIV_EFFECTIVE);
257*b6b7639aSGordon Ross 	if (ps == NULL) {
258*b6b7639aSGordon Ross 		syslog(LOG_DEBUG, "%s: ucred_getprivset failed", __func__);
259*b6b7639aSGordon Ross 		goto out;
260*b6b7639aSGordon Ross 	}
261*b6b7639aSGordon Ross 
262*b6b7639aSGordon Ross 	if ((opflags & (DOF_W | DOF_K)) != 0) {
263*b6b7639aSGordon Ross 		/*
264*b6b7639aSGordon Ross 		 * Modifying operation.  Require sys_smb priv.
265*b6b7639aSGordon Ross 		 */
266*b6b7639aSGordon Ross 		if (priv_ismember(ps, PRIV_SYS_SMB)) {
267*b6b7639aSGordon Ross 			ret = B_TRUE;
268*b6b7639aSGordon Ross 			goto out;
269*b6b7639aSGordon Ross 		}
270*b6b7639aSGordon Ross 	}
271*b6b7639aSGordon Ross 
272*b6b7639aSGordon Ross 	syslog(LOG_DEBUG, "smbd_door_dispatch: missing privilege, "
273*b6b7639aSGordon Ross 	    "OpCode = %d PID = %d UID = %d",
274*b6b7639aSGordon Ross 	    (int)opcode, (int)pid, (int)uid);
275*b6b7639aSGordon Ross 
276*b6b7639aSGordon Ross out:
277*b6b7639aSGordon Ross 	/* ps is free'd with the ucred */
278*b6b7639aSGordon Ross 	if (uc != NULL)
279*b6b7639aSGordon Ross 		ucred_free(uc);
280*b6b7639aSGordon Ross 
281*b6b7639aSGordon Ross 	return (ret);
282*b6b7639aSGordon Ross }
283*b6b7639aSGordon Ross 
284*b6b7639aSGordon Ross static smbd_doorop_t *
smbd_door_get_opvec(smb_dopcode_t opcode)285*b6b7639aSGordon Ross smbd_door_get_opvec(smb_dopcode_t opcode)
286*b6b7639aSGordon Ross {
287*b6b7639aSGordon Ross 	smbd_doorop_t	*doorop;
288*b6b7639aSGordon Ross 	int i;
289*b6b7639aSGordon Ross 
290*b6b7639aSGordon Ross 	for (i = 0, doorop = smbd_doorops;
291*b6b7639aSGordon Ross 	    i < smbd_ndoorop;
292*b6b7639aSGordon Ross 	    i++, doorop++) {
293*b6b7639aSGordon Ross 		if (doorop->opcode == opcode)
294*b6b7639aSGordon Ross 			return (doorop);
295*b6b7639aSGordon Ross 	}
296*b6b7639aSGordon Ross 	return (NULL);
297*b6b7639aSGordon Ross }
298*b6b7639aSGordon Ross 
2999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*ARGSUSED*/
3009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void
smbd_door_dispatch(void * cookie,char * argp,size_t arg_size,door_desc_t * dp,uint_t n_desc)3019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_dispatch(void *cookie, char *argp, size_t arg_size, door_desc_t *dp,
3029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     uint_t n_desc)
303da6c28aaSamw {
3049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_arg_t	dop_arg;
3059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_doorhdr_t	*hdr;
3069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	size_t		hdr_size;
3079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char		*rbuf = NULL;
308*b6b7639aSGordon Ross 	smbd_doorop_t	*doorop;
309*b6b7639aSGordon Ross 	int		opflags;
3109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_door_enter(&smbd_door_sdh);
3129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (!smbd_online())
3149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbd_door_return(&smbd_door_sdh, NULL, 0, NULL, 0);
3159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&dop_arg, sizeof (smbd_arg_t));
3179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	hdr = &dop_arg.hdr;
3189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	hdr_size = xdr_sizeof(smb_doorhdr_xdr, hdr);
3199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((cookie != &smbd_door_cookie) || (argp == NULL) ||
3219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    (arg_size < hdr_size)) {
3229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbd_door_return(&smbd_door_sdh, NULL, 0, NULL, 0);
3239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
324da6c28aaSamw 
3259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_doorhdr_decode(hdr, (uint8_t *)argp, hdr_size) == -1) {
3269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		syslog(LOG_DEBUG, "smbd_door_dispatch: header decode failed");
3279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbd_door_return(&smbd_door_sdh, NULL, 0, NULL, 0);
328da6c28aaSamw 	}
329da6c28aaSamw 
3309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((hdr->dh_magic != SMB_DOOR_HDR_MAGIC) || (hdr->dh_txid == 0)) {
3319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		syslog(LOG_DEBUG, "smbd_door_dispatch: invalid header");
3329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbd_door_return(&smbd_door_sdh, NULL, 0, NULL, 0);
3339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
3349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
335*b6b7639aSGordon Ross 	if ((doorop = smbd_door_get_opvec(hdr->dh_op)) == NULL) {
336*b6b7639aSGordon Ross 		/* invalid door op code */
337*b6b7639aSGordon Ross 		syslog(LOG_DEBUG, "smbd_door_dispatch: invalid op %u",
338*b6b7639aSGordon Ross 		    hdr->dh_op);
339*b6b7639aSGordon Ross 		smbd_door_return(&smbd_door_sdh, NULL, 0, NULL, 0);
340*b6b7639aSGordon Ross 	}
341*b6b7639aSGordon Ross 
3429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	dop_arg.opname = smb_doorhdr_opname(hdr->dh_op);
3439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	dop_arg.data = argp + hdr_size;
3449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	dop_arg.datalen = hdr->dh_datalen;
3459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
346*b6b7639aSGordon Ross 	/*
347*b6b7639aSGordon Ross 	 * Opflags tell us the privileges requried for this op.
348*b6b7639aSGordon Ross 	 * Override them for async operations, which are only
349*b6b7639aSGordon Ross 	 * requested by the in-kernel door client.
350*b6b7639aSGordon Ross 	 */
351*b6b7639aSGordon Ross 	opflags = doorop->opflags;
352*b6b7639aSGordon Ross 	if ((hdr->dh_flags & SMB_DF_ASYNC) != 0)
353*b6b7639aSGordon Ross 		opflags |= DOF_K;
354*b6b7639aSGordon Ross 	if (!have_req_privs(hdr->dh_op, opflags)) {
355*b6b7639aSGordon Ross 		smbd_door_return(&smbd_door_sdh, NULL, 0, NULL, 0);
356*b6b7639aSGordon Ross 	}
357*b6b7639aSGordon Ross 
3589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (hdr->dh_op == SMB_DR_ASYNC_RESPONSE) {
3599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		/*
3609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		 * ASYNC_RESPONSE is used to collect the response
3619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		 * to an async call; it cannot be an async call.
3629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		 */
3639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		hdr->dh_flags &= ~SMB_DF_ASYNC;
3649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
3659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (hdr->dh_flags & SMB_DF_ASYNC) {
3679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (smbd_door_dispatch_async(&dop_arg) == 0)
3689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			hdr->dh_door_rc = SMB_DOP_SUCCESS;
3699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		else
3709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			hdr->dh_door_rc = SMB_DOP_NOT_CALLED;
3719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	} else {
3729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) smbd_door_dispatch_op(&dop_arg);
3739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
3749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((rbuf = (char *)alloca(dop_arg.rsize + hdr_size)) == NULL) {
3769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		errno = ENOMEM;
3779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		syslog(LOG_DEBUG, "smbd_door_dispatch[%s]: alloca %m",
3789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    dop_arg.opname);
3799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbd_door_return(&smbd_door_sdh, NULL, 0, NULL, 0);
3809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
3819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (dop_arg.rbuf != NULL) {
3839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) memcpy(rbuf + hdr_size, dop_arg.rbuf, dop_arg.rsize);
3849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		free(dop_arg.rbuf);
3859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
3869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	hdr->dh_datalen = dop_arg.rsize;
3889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) smb_doorhdr_encode(hdr, (uint8_t *)rbuf, hdr_size);
3899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	dop_arg.rsize += hdr_size;
3909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_door_return(&smbd_door_sdh, rbuf, dop_arg.rsize, NULL, 0);
3929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	/*NOTREACHED*/
393da6c28aaSamw }
394da6c28aaSamw 
395da6c28aaSamw /*
3969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Launch a thread to process an asynchronous door call.
3979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
3989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_door_dispatch_async(smbd_arg_t * req_arg)3999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_dispatch_async(smbd_arg_t *req_arg)
4009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_arg_t	*arg = NULL;
4029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char		*data = NULL;
4039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	pthread_attr_t	attr;
4049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	pthread_t	tid;
4059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int		rc;
4069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((req_arg->hdr.dh_flags & SMB_DF_ASYNC) == 0) {
4089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		errno = EINVAL;
4099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (-1);
4109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
4119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((arg = malloc(sizeof (smbd_arg_t))) == NULL) {
4139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		syslog(LOG_DEBUG, "smbd_door_dispatch_async[%s]: %m",
4149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    req_arg->opname);
4159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (-1);
4169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
4179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) memcpy(arg, req_arg, sizeof (smbd_arg_t));
4199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->data = NULL;
4209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (req_arg->datalen != 0) {
4229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if ((data = malloc(req_arg->datalen)) == NULL) {
4239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			free(arg);
4249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			syslog(LOG_DEBUG, "smbd_door_dispatch_async[%s]: %m",
4259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			    req_arg->opname);
4269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			return (-1);
4279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
4289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) memcpy(data, req_arg->data, req_arg->datalen);
4309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		arg->data = data;
4319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
4329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_lock(&smbd_doorsvc.sd_mutex);
434c5866007SKeyur Desai 	arg->magic = SMBD_ARG_MAGIC;
4359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_insert_tail(&smbd_doorsvc.sd_async_list, arg);
4369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	++smbd_doorsvc.sd_async_count;
4379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_unlock(&smbd_doorsvc.sd_mutex);
4389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) pthread_attr_init(&attr);
4409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
4419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rc = pthread_create(&tid, &attr, smbd_door_dispatch_op, arg);
4429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) pthread_attr_destroy(&attr);
4439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (rc != 0) {
4459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) mutex_lock(&smbd_doorsvc.sd_mutex);
4469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbd_door_release_async(arg);
4479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) mutex_unlock(&smbd_doorsvc.sd_mutex);
4489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
4499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (rc);
4519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
4549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Remove an entry from the async response pending list and free
4559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * the arg and associated data.
4569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
4579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Must only be called while holding the smbd_doorsvc mutex.
4589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
4599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void
smbd_door_release_async(smbd_arg_t * arg)4609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_release_async(smbd_arg_t *arg)
4619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg != NULL) {
463c5866007SKeyur Desai 		assert(arg->magic == SMBD_ARG_MAGIC);
464c5866007SKeyur Desai 		arg->magic = (uint32_t)~SMBD_ARG_MAGIC;
465c5866007SKeyur Desai 
4669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		list_remove(&smbd_doorsvc.sd_async_list, arg);
4679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		--smbd_doorsvc.sd_async_count;
4689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		free(arg->data);
469c5866007SKeyur Desai 		arg->data = NULL;
4709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		free(arg);
4719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
4729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
4759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * All door calls are processed here: synchronous or asynchronous:
4769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * - synchronous calls are invoked by direct function call
4779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * - asynchronous calls are invoked from a launched thread
478da6c28aaSamw  *
479c5866007SKeyur Desai  * If the kernel has attempted to collect a response before the op
480c5866007SKeyur Desai  * has completed, the arg will have been marked as response_abort
481c5866007SKeyur Desai  * and we can discard the response data and release the arg.
482c5866007SKeyur Desai  *
4839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * We send a notification when asynchronous (ASYNC) door calls
4849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * from the kernel (SYSSPACE) have completed.
485da6c28aaSamw  */
486b819cea2SGordon Ross void *
smbd_door_dispatch_op(void * thread_arg)4879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_dispatch_op(void *thread_arg)
488da6c28aaSamw {
4899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_arg_t	*arg = (smbd_arg_t *)thread_arg;
4909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_doorop_t	*doorop;
4919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_doorhdr_t	*hdr;
492da6c28aaSamw 
4939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((!smbd_online()) || arg == NULL)
494da6c28aaSamw 		return (NULL);
4959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	hdr = &arg->hdr;
4979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->opname = smb_doorhdr_opname(hdr->dh_op);
4989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
499*b6b7639aSGordon Ross 	doorop = smbd_door_get_opvec(hdr->dh_op);
500*b6b7639aSGordon Ross 	if (doorop == NULL)
501*b6b7639aSGordon Ross 		return (NULL);
502c5866007SKeyur Desai 
503*b6b7639aSGordon Ross 	hdr->dh_door_rc = doorop->op(arg);
504*b6b7639aSGordon Ross 	hdr->dh_status = arg->status;
505c5866007SKeyur Desai 
506*b6b7639aSGordon Ross 	if ((hdr->dh_flags & SMB_DF_SYSSPACE) &&
507*b6b7639aSGordon Ross 	    (hdr->dh_flags & SMB_DF_ASYNC)) {
508*b6b7639aSGordon Ross 		assert(hdr->dh_op != SMB_DR_ASYNC_RESPONSE);
5099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
510*b6b7639aSGordon Ross 		(void) mutex_lock(&smbd_doorsvc.sd_mutex);
511*b6b7639aSGordon Ross 		if (arg->response_abort) {
512*b6b7639aSGordon Ross 			free(arg->rbuf);
513*b6b7639aSGordon Ross 			arg->rbuf = NULL;
514*b6b7639aSGordon Ross 			smbd_door_release_async(arg);
515*b6b7639aSGordon Ross 		} else {
516*b6b7639aSGordon Ross 			arg->response_ready = B_TRUE;
5179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
518*b6b7639aSGordon Ross 		(void) mutex_unlock(&smbd_doorsvc.sd_mutex);
519*b6b7639aSGordon Ross 
520*b6b7639aSGordon Ross 		(void) smb_kmod_event_notify(hdr->dh_txid);
521da6c28aaSamw 	}
522da6c28aaSamw 
5239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (NULL);
524da6c28aaSamw }
525da6c28aaSamw 
526da6c28aaSamw /*
5279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Wrapper for door_return.  smbd_door_enter() increments a reference count
5289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * when a door call is dispatched and smbd_door_return() decrements the
5299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * reference count when it completes.
530da6c28aaSamw  *
5319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The reference counting is used in smbd_door_fini() to wait for active
5329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * calls to complete before closing the door.
533da6c28aaSamw  */
534da6c28aaSamw void
smbd_door_init(smbd_door_t * sdh,const char * name)5359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_init(smbd_door_t *sdh, const char *name)
5369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
537b819cea2SGordon Ross 	(void) strlcpy(sdh->sd_name, name, sizeof (sdh->sd_name));
5389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smbd_door_enter(smbd_door_t * sdh)5419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_enter(smbd_door_t *sdh)
5429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
5439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_lock(&sdh->sd_mutex);
5449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	++sdh->sd_ncalls;
5459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_unlock(&sdh->sd_mutex);
5469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
5499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * We have two calls to door_return because the first call (with data)
5509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * can fail, which can leave the door call blocked here.  The second
5519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * call (with NULL) is guaranteed to unblock and return to the caller.
5529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
5539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smbd_door_return(smbd_door_t * sdh,char * data_ptr,size_t data_size,door_desc_t * desc_ptr,uint_t num_desc)5549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_return(smbd_door_t *sdh, char *data_ptr, size_t data_size,
5559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     door_desc_t *desc_ptr, uint_t num_desc)
556da6c28aaSamw {
5579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_lock(&sdh->sd_mutex);
5589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (sdh->sd_ncalls == 0)
5609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		syslog(LOG_ERR, "smbd_door_return[%s]: unexpected count=0",
5619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    sdh->sd_name);
5629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	else
5639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		--sdh->sd_ncalls;
5649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) cond_broadcast(&sdh->sd_cv);
5669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_unlock(&sdh->sd_mutex);
5679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) door_return(data_ptr, data_size, desc_ptr, num_desc);
5699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) door_return(NULL, 0, NULL, 0);
5709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	/* NOTREACHED */
5719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
572da6c28aaSamw 
5739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
5749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * A door service is about to terminate.
5759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Give active requests a small grace period to complete.
5769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
5779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smbd_door_fini(smbd_door_t * sdh)5789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_fini(smbd_door_t *sdh)
5799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
5809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	timestruc_t	delay;
5819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int		rc = 0;
5829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_lock(&sdh->sd_mutex);
5849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	while (rc != ETIME && sdh->sd_ncalls != 0) {
5869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		delay.tv_sec = 1;
5879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		delay.tv_nsec = 0;
5889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		rc = cond_reltimedwait(&sdh->sd_cv, &sdh->sd_mutex, &delay);
5893ad684d6Sjb 	}
5903ad684d6Sjb 
5919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (sdh->sd_ncalls != 0)
5929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		syslog(LOG_NOTICE, "smbd_door_fini[%s]: %d remaining",
5939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    sdh->sd_name, sdh->sd_ncalls);
5949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_unlock(&sdh->sd_mutex);
5969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
5999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Null door operation: always returns success.
6009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Assumes no request or response data.
6019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
6029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*ARGSUSED*/
6039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_null(smbd_arg_t * arg)6049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_null(smbd_arg_t *arg)
6059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
6069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
6079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
6109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Async response handler: setup the rbuf and rsize for the specified
6119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * transaction.  This function is used by the kernel to collect the
6129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * response half of an asynchronous door call.
613c5866007SKeyur Desai  *
614c5866007SKeyur Desai  * If a door client attempts to collect a response before the op has
615c5866007SKeyur Desai  * completed (!response_ready), mark the arg as response_abort and
616c5866007SKeyur Desai  * set an error.  The response will be discarded when the op completes.
6179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
6189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_async_response(smbd_arg_t * rsp_arg)6199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_async_response(smbd_arg_t *rsp_arg)
6209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
6219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_t		*arg_list = &smbd_doorsvc.sd_async_list;
6229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_arg_t	*arg;
6239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_lock(&smbd_doorsvc.sd_mutex);
6259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg = list_head(arg_list);
6269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	while (arg != NULL) {
628c5866007SKeyur Desai 		assert(arg->magic == SMBD_ARG_MAGIC);
629c5866007SKeyur Desai 
6309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (arg->hdr.dh_txid == rsp_arg->hdr.dh_txid) {
631c5866007SKeyur Desai 			if (!arg->response_ready) {
632c5866007SKeyur Desai 				arg->response_abort = B_TRUE;
633c5866007SKeyur Desai 				rsp_arg->hdr.dh_door_rc = SMB_DOP_NOT_CALLED;
634c5866007SKeyur Desai 				syslog(LOG_NOTICE, "doorsvc[%s]: %u not ready",
635c5866007SKeyur Desai 				    arg->opname, arg->hdr.dh_txid);
636c5866007SKeyur Desai 				break;
637c5866007SKeyur Desai 			}
638c5866007SKeyur Desai 
6399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			rsp_arg->rbuf = arg->rbuf;
6409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			rsp_arg->rsize = arg->rsize;
6419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			arg->rbuf = NULL;
6429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			arg->rsize = 0;
6439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			smbd_door_release_async(arg);
6449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			break;
6459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
6469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		arg = list_next(arg_list, arg);
648da6c28aaSamw 	}
649da6c28aaSamw 
6509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_unlock(&smbd_doorsvc.sd_mutex);
6519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
6529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_user_nonauth_logon(smbd_arg_t * arg)6559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_user_nonauth_logon(smbd_arg_t *arg)
6569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
657c5866007SKeyur Desai 	uint32_t	sid = 0;
6589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_common_decode(arg->data, arg->datalen,
6609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    xdr_uint32_t, &sid) != 0)
6619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
6629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_user_nonauth_logon(sid);
6649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
6659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_user_auth_logoff(smbd_arg_t * arg)6689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_user_auth_logoff(smbd_arg_t *arg)
6699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
670c5866007SKeyur Desai 	uint32_t	sid = 0;
6719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_common_decode(arg->data, arg->datalen,
6739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    xdr_uint32_t, &sid) != 0)
6749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
6759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_user_auth_logoff(sid);
6779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
6789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
6819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Obtains an access token on successful user authentication.
6829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
6839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_user_auth_logon(smbd_arg_t * arg __unused)684*b6b7639aSGordon Ross smbd_dop_user_auth_logon(smbd_arg_t *arg __unused)
6859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
6869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
68712b65585SGordon Ross 	/* No longer used */
68812b65585SGordon Ross 	return (SMB_DOP_EMPTYBUF);
6899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
691dafb549fSGordon Ross /*
692dafb549fSGordon Ross  * SMB_DR_LOOKUP_NAME,
693dafb549fSGordon Ross  * SMB_DR_LOOKUP_LNAME (local-only, for idmap)
694dafb549fSGordon Ross  */
6959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_lookup_name(smbd_arg_t * arg)6969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_lookup_name(smbd_arg_t *arg)
6979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
6989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_domain_t	dinfo;
6999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_account_t	ainfo;
7009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	lsa_account_t	acct;
7019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char		buf[MAXNAMELEN];
7029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
703c5866007SKeyur Desai 	bzero(&acct, sizeof (lsa_account_t));
704c5866007SKeyur Desai 
7059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_common_decode(arg->data, arg->datalen,
7069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    lsa_account_xdr, &acct) != 0)
7079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
7089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (*acct.a_domain == '\0')
7109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) snprintf(buf, MAXNAMELEN, "%s", acct.a_name);
7119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	else if (strchr(acct.a_domain, '.') != NULL)
7129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) snprintf(buf, MAXNAMELEN, "%s@%s", acct.a_name,
7139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    acct.a_domain);
7149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	else
7159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) snprintf(buf, MAXNAMELEN, "%s\\%s", acct.a_domain,
7169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    acct.a_name);
7179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
718dafb549fSGordon Ross 	switch (arg->hdr.dh_op) {
719dafb549fSGordon Ross 	case SMB_DR_LOOKUP_NAME:
720dafb549fSGordon Ross 		acct.a_status = lsa_lookup_name(buf, acct.a_sidtype, &ainfo);
721dafb549fSGordon Ross 		break;
722dafb549fSGordon Ross 
723dafb549fSGordon Ross 	case SMB_DR_LOOKUP_LNAME:
724dafb549fSGordon Ross 		/*
725dafb549fSGordon Ross 		 * Basically for idmap.  Don't call out to AD.
726dafb549fSGordon Ross 		 */
727dafb549fSGordon Ross 		acct.a_status = lsa_lookup_lname(buf, acct.a_sidtype, &ainfo);
728dafb549fSGordon Ross 		break;
729dafb549fSGordon Ross 
730dafb549fSGordon Ross 	default:
731dafb549fSGordon Ross 		assert(!"arg->hdr.dh_op");
732dafb549fSGordon Ross 		acct.a_status = NT_STATUS_INTERNAL_ERROR;
733dafb549fSGordon Ross 		break;
734dafb549fSGordon Ross 	}
735dafb549fSGordon Ross 
7369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (acct.a_status == NT_STATUS_SUCCESS) {
7379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		acct.a_sidtype = ainfo.a_type;
7389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_sid_tostr(ainfo.a_sid, acct.a_sid);
7399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) strlcpy(acct.a_name, ainfo.a_name, MAXNAMELEN);
7409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (smb_domain_lookup_name(ainfo.a_domain, &dinfo))
7429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			(void) strlcpy(acct.a_domain, dinfo.di_fqname,
7439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			    MAXNAMELEN);
7449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		else
7459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			(void) strlcpy(acct.a_domain, ainfo.a_domain,
7469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			    MAXNAMELEN);
7479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_account_free(&ainfo);
748da6c28aaSamw 	}
749da6c28aaSamw 
7509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->rbuf = smb_common_encode(&acct, lsa_account_xdr, &arg->rsize);
7519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg->rbuf == NULL)
7539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_ENCODE_ERROR);
7549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
7559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
757dafb549fSGordon Ross /*
758dafb549fSGordon Ross  * SMB_DR_LOOKUP_SID,
759dafb549fSGordon Ross  * SMB_DR_LOOKUP_LSID (local-only, for idmap)
760dafb549fSGordon Ross  */
7619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_lookup_sid(smbd_arg_t * arg)7629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_lookup_sid(smbd_arg_t *arg)
7639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
7649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_domain_t	dinfo;
7659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_account_t	ainfo;
7669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	lsa_account_t	acct;
7679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_sid_t	*sid;
7689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
769c5866007SKeyur Desai 	bzero(&acct, sizeof (lsa_account_t));
770c5866007SKeyur Desai 
7719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_common_decode(arg->data, arg->datalen,
7729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    lsa_account_xdr, &acct) != 0)
7739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
7749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	sid = smb_sid_fromstr(acct.a_sid);
776dafb549fSGordon Ross 
777dafb549fSGordon Ross 	switch (arg->hdr.dh_op) {
778dafb549fSGordon Ross 	case SMB_DR_LOOKUP_SID:
779dafb549fSGordon Ross 		acct.a_status = lsa_lookup_sid(sid, &ainfo);
780dafb549fSGordon Ross 		break;
781dafb549fSGordon Ross 
782dafb549fSGordon Ross 	case SMB_DR_LOOKUP_LSID:
783dafb549fSGordon Ross 		/*
784dafb549fSGordon Ross 		 * Basically for idmap.  Don't call out to AD.
785dafb549fSGordon Ross 		 */
786dafb549fSGordon Ross 		acct.a_status = lsa_lookup_lsid(sid, &ainfo);
787dafb549fSGordon Ross 		break;
788dafb549fSGordon Ross 
789dafb549fSGordon Ross 	default:
790dafb549fSGordon Ross 		assert(!"arg->hdr.dh_op");
791dafb549fSGordon Ross 		acct.a_status = NT_STATUS_INTERNAL_ERROR;
792dafb549fSGordon Ross 		break;
793dafb549fSGordon Ross 	}
794dafb549fSGordon Ross 
7959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_sid_free(sid);
7969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (acct.a_status == NT_STATUS_SUCCESS) {
7989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		acct.a_sidtype = ainfo.a_type;
7999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_sid_tostr(ainfo.a_sid, acct.a_sid);
8009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) strlcpy(acct.a_name, ainfo.a_name, MAXNAMELEN);
8019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (smb_domain_lookup_name(ainfo.a_domain, &dinfo))
8039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			(void) strlcpy(acct.a_domain, dinfo.di_fqname,
8049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			    MAXNAMELEN);
805da6c28aaSamw 		else
8069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			(void) strlcpy(acct.a_domain, ainfo.a_domain,
8079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			    MAXNAMELEN);
8089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_account_free(&ainfo);
810da6c28aaSamw 	}
811da6c28aaSamw 
8129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->rbuf = smb_common_encode(&acct, lsa_account_xdr, &arg->rsize);
8139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg->rbuf == NULL)
8159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_ENCODE_ERROR);
8169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
8179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_join(smbd_arg_t * arg)8209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_join(smbd_arg_t *arg)
8219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
8229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_joininfo_t	jdi;
823b3700b07SGordon Ross 	smb_joinres_t	jdres;
8249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
825c5866007SKeyur Desai 	bzero(&jdi, sizeof (smb_joininfo_t));
826b3700b07SGordon Ross 	bzero(&jdres, sizeof (smb_joinres_t));
827c5866007SKeyur Desai 
8289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_common_decode(arg->data, arg->datalen,
8299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    smb_joininfo_xdr, &jdi) != 0)
8309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
8319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
832b3700b07SGordon Ross 	smbd_join(&jdi, &jdres);
8339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
834b3700b07SGordon Ross 	arg->rbuf = smb_common_encode(&jdres, smb_joinres_xdr, &arg->rsize);
8359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg->rbuf == NULL)
8379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_ENCODE_ERROR);
8389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
8399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_get_dcinfo(smbd_arg_t * arg)8429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_get_dcinfo(smbd_arg_t *arg)
8439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
8449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_domainex_t	dxi;
8459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (!smb_domain_getinfo(&dxi))
8479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_EMPTYBUF);
8489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
849b3700b07SGordon Ross 	arg->rbuf = smb_string_encode(dxi.d_dci.dc_name, &arg->rsize);
8509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg->rbuf == NULL)
8529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_ENCODE_ERROR);
8539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
8549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
8579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Return the number of snapshots for a dataset
8589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
8599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_vss_get_count(smbd_arg_t * arg)8609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_vss_get_count(smbd_arg_t *arg)
8619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
8629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_string_t	path;
8639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	count;
8649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&path, sizeof (smb_string_t));
8669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->rbuf = NULL;
8679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_string_decode(&path, arg->data, arg->datalen) != 0)
8699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
8709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smbd_vss_get_count(path.buf, &count) == 0)
8729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		arg->rbuf = smb_common_encode(&count, xdr_uint32_t,
8739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    &arg->rsize);
8749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	xdr_free(smb_string_xdr, (char *)&path);
8769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg->rbuf == NULL)
8789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_ENCODE_ERROR);
8799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
8809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
8839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Return the count and list of snapshots.
8849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The list is in @GMT token format.
8859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
8869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_vss_get_snapshots(smbd_arg_t * arg)8879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_vss_get_snapshots(smbd_arg_t *arg)
8889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
8899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char				**gmtp;
8909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_gmttoken_query_t		request;
8919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_gmttoken_response_t		reply;
8929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint_t				i;
8939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&request, sizeof (smb_gmttoken_query_t));
8959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&reply, sizeof (smb_gmttoken_response_t));
8969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_common_decode(arg->data, arg->datalen,
8989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    smb_gmttoken_query_xdr, &request) != 0)
8999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
9009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	reply.gtr_gmttokens.gtr_gmttokens_val = malloc(request.gtq_count *
9029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    sizeof (char *));
9039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(reply.gtr_gmttokens.gtr_gmttokens_val, request.gtq_count *
9049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    sizeof (char *));
9059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (reply.gtr_gmttokens.gtr_gmttokens_val == NULL) {
9079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		xdr_free(smb_gmttoken_query_xdr, (char *)&request);
9089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_EMPTYBUF);
9099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
9109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_vss_get_snapshots(request.gtq_path, request.gtq_count,
9129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    &reply.gtr_count,
9139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    &reply.gtr_gmttokens.gtr_gmttokens_len,
9149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    reply.gtr_gmttokens.gtr_gmttokens_val);
9159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->rbuf = smb_common_encode(&reply, smb_gmttoken_response_xdr,
9179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    &arg->rsize);
9189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg->rbuf == NULL) {
9199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		xdr_free(smb_gmttoken_query_xdr, (char *)&request);
9209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_ENCODE_ERROR);
9219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
9229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	for (i = 0, gmtp = reply.gtr_gmttokens.gtr_gmttokens_val;
9249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    (i < request.gtq_count); i++) {
9259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (*gmtp)
9269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			free(*gmtp);
9279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		gmtp++;
9289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
9299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	free(reply.gtr_gmttokens.gtr_gmttokens_val);
9319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	xdr_free(smb_gmttoken_query_xdr, (char *)&request);
9329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
9339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
9349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
9369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Return the name of the snapshot that matches the dataset path
9379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * and @GMT token.
9389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
9399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_vss_map_gmttoken(smbd_arg_t * arg)9409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_vss_map_gmttoken(smbd_arg_t *arg)
9419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
9429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char			*snapname;
9439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_gmttoken_snapname_t	request;
9449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&request, sizeof (smb_gmttoken_snapname_t));
9469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_common_decode(arg->data, arg->datalen,
9489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    smb_gmttoken_snapname_xdr, &request) != 0) {
9499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		xdr_free(smb_gmttoken_snapname_xdr, (char *)&request);
9509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
9519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
9529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((snapname = malloc(MAXPATHLEN)) == NULL) {
9549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		xdr_free(smb_gmttoken_snapname_xdr, (char *)&request);
955f9350d11SToomas Soome 		return (SMB_DOP_ENCODE_ERROR);
9569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
9579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((smbd_vss_map_gmttoken(request.gts_path, request.gts_gmttoken,
959a90cf9f2SGordon Ross 	    request.gts_toktime, snapname) != 0)) {
9609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		*snapname = '\0';
9619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
9629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->rbuf = smb_string_encode(snapname, &arg->rsize);
9649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	xdr_free(smb_gmttoken_snapname_xdr, (char *)&request);
9659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	free(snapname);
9669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg->rbuf == NULL)
9689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_ENCODE_ERROR);
9699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
9709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
9719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_ads_find_host(smbd_arg_t * arg)9739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_ads_find_host(smbd_arg_t *arg)
9749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
9759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_ads_host_info_t	*hinfo = NULL;
9769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char			*hostname = "";
9779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_string_t		fqdn;
9789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&fqdn, sizeof (smb_string_t));
9809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_string_decode(&fqdn, arg->data, arg->datalen) != 0)
9829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
9839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
984b3700b07SGordon Ross 	if ((hinfo = smb_ads_find_host(fqdn.buf)) != NULL)
9859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		hostname = hinfo->name;
9869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	xdr_free(smb_string_xdr, (char *)&fqdn);
9889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->rbuf = smb_string_encode(hostname, &arg->rsize);
9909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	free(hinfo);
9919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg->rbuf == NULL)
9939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_ENCODE_ERROR);
9949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
9959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
9969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
9989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Query the list of user/group quota entries for a given filesystem.
9999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
10009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_quota_query(smbd_arg_t * arg)10019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_quota_query(smbd_arg_t *arg)
10029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
10039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_query_t	request;
10049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_response_t	reply;
10059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t		status;
10069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&request, sizeof (smb_quota_query_t));
10089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&reply, sizeof (smb_quota_response_t));
10099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_common_decode(arg->data, arg->datalen,
10119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    smb_quota_query_xdr, &request) != 0)
10129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
10139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	status = smb_quota_query(&request, &reply);
10159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	reply.qr_status = status;
10169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->rbuf = smb_common_encode(&reply, smb_quota_response_xdr,
10189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    &arg->rsize);
10199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	xdr_free(smb_quota_query_xdr, (char *)&request);
10219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_free(&reply);
10229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg->rbuf == NULL)
10249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_ENCODE_ERROR);
10259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
10269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
10279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
10299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Set a list of user/group quota entries for a given filesystem.
10309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
10319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_quota_set(smbd_arg_t * arg)10329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_quota_set(smbd_arg_t *arg)
10339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
10349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_set_t	request;
10359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	status = 0;
10369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&request, sizeof (smb_quota_set_t));
10389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_common_decode(arg->data, arg->datalen,
10409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    smb_quota_set_xdr, &request) != 0)
10419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
10429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	status = smb_quota_set(&request);
10449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->rbuf = smb_common_encode(&status, xdr_uint32_t, &arg->rsize);
10469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	xdr_free(smb_quota_set_xdr, (char *)&request);
10479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg->rbuf == NULL)
10499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_ENCODE_ERROR);
10509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
10519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
10529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_dfs_get_referrals(smbd_arg_t * arg)10549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_dfs_get_referrals(smbd_arg_t *arg)
10559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
10569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	dfs_referral_query_t	request;
10579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	dfs_referral_response_t	reply;
10589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&request, sizeof (request));
10609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&reply, sizeof (reply));
10619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_common_decode(arg->data, arg->datalen,
10639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    dfs_referral_query_xdr, &request) != 0)
10649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
10659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	reply.rp_status = dfs_get_referrals((const char *)request.rq_path,
10679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    request.rq_type, &reply.rp_referrals);
10689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (reply.rp_status != ERROR_SUCCESS)
10709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		bzero(&reply.rp_referrals, sizeof (dfs_info_t));
10719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->rbuf = smb_common_encode(&reply, dfs_referral_response_xdr,
10739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    &arg->rsize);
10749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (reply.rp_status == ERROR_SUCCESS)
10769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		dfs_info_free(&reply.rp_referrals);
10779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	xdr_free(dfs_referral_query_xdr, (char *)&request);
10799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg->rbuf == NULL)
10819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_ENCODE_ERROR);
10829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
1083da6c28aaSamw }
1084148c5f43SAlan Wright 
1085148c5f43SAlan Wright static int
smbd_dop_shr_hostaccess(smbd_arg_t * arg)1086148c5f43SAlan Wright smbd_dop_shr_hostaccess(smbd_arg_t *arg)
1087148c5f43SAlan Wright {
1088148c5f43SAlan Wright 	smb_shr_hostaccess_query_t request;
1089148c5f43SAlan Wright 	uint32_t reply;
1090148c5f43SAlan Wright 
1091148c5f43SAlan Wright 	bzero(&request, sizeof (request));
1092148c5f43SAlan Wright 	bzero(&reply, sizeof (reply));
1093148c5f43SAlan Wright 
1094148c5f43SAlan Wright 	if (smb_common_decode(arg->data, arg->datalen,
1095148c5f43SAlan Wright 	    smb_shr_hostaccess_query_xdr, &request) != 0)
1096148c5f43SAlan Wright 		return (SMB_DOP_DECODE_ERROR);
1097148c5f43SAlan Wright 
1098148c5f43SAlan Wright 	reply = smb_shr_hostaccess(&request.shq_ipaddr, request.shq_none,
1099148c5f43SAlan Wright 	    request.shq_ro, request.shq_rw, request.shq_flag);
1100148c5f43SAlan Wright 
1101148c5f43SAlan Wright 	arg->rbuf = smb_common_encode(&reply, xdr_uint32_t, &arg->rsize);
1102148c5f43SAlan Wright 
1103148c5f43SAlan Wright 	xdr_free(smb_shr_hostaccess_query_xdr, (char *)&request);
1104148c5f43SAlan Wright 
1105148c5f43SAlan Wright 	if (arg->rbuf == NULL)
1106148c5f43SAlan Wright 		return (SMB_DOP_ENCODE_ERROR);
1107148c5f43SAlan Wright 	return (SMB_DOP_SUCCESS);
1108148c5f43SAlan Wright }
1109148c5f43SAlan Wright 
1110148c5f43SAlan Wright static int
smbd_dop_shr_exec(smbd_arg_t * arg)1111148c5f43SAlan Wright smbd_dop_shr_exec(smbd_arg_t *arg)
1112148c5f43SAlan Wright {
1113148c5f43SAlan Wright 	smb_shr_execinfo_t request;
1114148c5f43SAlan Wright 	int reply;
1115148c5f43SAlan Wright 
1116148c5f43SAlan Wright 	bzero(&request, sizeof (request));
1117148c5f43SAlan Wright 	bzero(&reply, sizeof (reply));
1118148c5f43SAlan Wright 
1119148c5f43SAlan Wright 	if (smb_common_decode(arg->data, arg->datalen,
1120148c5f43SAlan Wright 	    smb_shr_execinfo_xdr, &request) != 0)
1121148c5f43SAlan Wright 		return (SMB_DOP_DECODE_ERROR);
1122148c5f43SAlan Wright 
1123148c5f43SAlan Wright 	reply = smb_shr_exec(&request);
1124148c5f43SAlan Wright 
1125148c5f43SAlan Wright 	if (reply != 0)
1126148c5f43SAlan Wright 		syslog(LOG_NOTICE, "Failed to execute %s command",
1127148c5f43SAlan Wright 		    (request.e_type == SMB_EXEC_MAP) ? "map" : "unmap");
1128148c5f43SAlan Wright 
1129148c5f43SAlan Wright 	arg->rbuf = smb_common_encode(&reply, xdr_int, &arg->rsize);
1130148c5f43SAlan Wright 
1131148c5f43SAlan Wright 	xdr_free(smb_shr_execinfo_xdr, (char *)&request);
1132148c5f43SAlan Wright 
1133148c5f43SAlan Wright 	if (arg->rbuf == NULL)
1134148c5f43SAlan Wright 		return (SMB_DOP_ENCODE_ERROR);
1135148c5f43SAlan Wright 	return (SMB_DOP_SUCCESS);
1136148c5f43SAlan Wright }
1137b3700b07SGordon Ross 
1138b3700b07SGordon Ross /* ARGSUSED */
1139b3700b07SGordon Ross static int
smbd_dop_notify_dc_changed(smbd_arg_t * arg)1140b3700b07SGordon Ross smbd_dop_notify_dc_changed(smbd_arg_t *arg)
1141b3700b07SGordon Ross {
1142b3700b07SGordon Ross 
1143b3700b07SGordon Ross 	smbd_dc_monitor_refresh();
1144b3700b07SGordon Ross 
1145b3700b07SGordon Ross 	return (SMB_DOP_SUCCESS);
1146b3700b07SGordon Ross }
1147