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.
23da6c28aaSamw  */
24da6c28aaSamw 
259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <sys/list.h>
269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <assert.h>
27da6c28aaSamw #include <alloca.h>
28da6c28aaSamw #include <door.h>
29da6c28aaSamw #include <errno.h>
30da6c28aaSamw #include <syslog.h>
31da6c28aaSamw #include <unistd.h>
32da6c28aaSamw #include <stdio.h>
33da6c28aaSamw #include <synch.h>
34da6c28aaSamw #include <string.h>
35da6c28aaSamw #include <stdlib.h>
36da6c28aaSamw #include <sys/stat.h>
37da6c28aaSamw #include <fcntl.h>
38da6c28aaSamw #include <pthread.h>
39da6c28aaSamw #include <strings.h>
409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_door.h>
419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_xdr.h>
429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_token.h>
439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/libmlsvc.h>
449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/libsmbns.h>
459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include "smbd.h"
46da6c28aaSamw 
47c5866007SKeyur Desai #define	SMBD_ARG_MAGIC		0x53415247	/* 'SARG' */
48c5866007SKeyur Desai 
49da6c28aaSamw /*
509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Parameter for door operations.
519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States typedef struct smbd_arg {
53c5866007SKeyur Desai 	uint32_t	magic;
549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_node_t	lnd;
559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_doorhdr_t	hdr;
569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	const char	*opname;
579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char		*data;
589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	size_t		datalen;
599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char		*rbuf;
609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	size_t		rsize;
61c5866007SKeyur Desai 	boolean_t	response_ready;
62c5866007SKeyur Desai 	boolean_t	response_abort;
639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	status;
649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } smbd_arg_t;
659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The list contains asynchronous requests that have been initiated
689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * but have not yet been collected (via smbd_dop_async_response).
699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States typedef struct smbd_doorsvc {
719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_t		sd_mutex;
729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	cond_t		sd_cv;
739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_t		sd_async_list;
749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	sd_async_count;
759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } smbd_doorsvc_t;
769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_null(smbd_arg_t *);
789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_async_response(smbd_arg_t *);
799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_user_auth_logon(smbd_arg_t *);
809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_user_nonauth_logon(smbd_arg_t *);
819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_user_auth_logoff(smbd_arg_t *);
829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_lookup_sid(smbd_arg_t *);
839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_lookup_name(smbd_arg_t *);
849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_join(smbd_arg_t *);
859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_get_dcinfo(smbd_arg_t *);
869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_vss_get_count(smbd_arg_t *);
879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_vss_get_snapshots(smbd_arg_t *);
889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_vss_map_gmttoken(smbd_arg_t *);
899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_ads_find_host(smbd_arg_t *);
909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_quota_query(smbd_arg_t *);
919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_quota_set(smbd_arg_t *);
929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_dfs_get_referrals(smbd_arg_t *);
93*148c5f43SAlan Wright static int smbd_dop_shr_hostaccess(smbd_arg_t *);
94*148c5f43SAlan Wright static int smbd_dop_shr_exec(smbd_arg_t *);
959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States typedef int (*smbd_dop_t)(smbd_arg_t *);
979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States typedef struct smbd_doorop {
999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_dopcode_t	opcode;
1009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_dop_t	op;
1019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } smbd_doorop_t;
1029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_doorop_t smbd_doorops[] = {
1049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	{ SMB_DR_NULL,			smbd_dop_null },
1059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	{ SMB_DR_ASYNC_RESPONSE,	smbd_dop_async_response },
1069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	{ SMB_DR_USER_AUTH_LOGON,	smbd_dop_user_auth_logon },
1079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	{ SMB_DR_USER_NONAUTH_LOGON,	smbd_dop_user_nonauth_logon },
1089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	{ SMB_DR_USER_AUTH_LOGOFF,	smbd_dop_user_auth_logoff },
1099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	{ SMB_DR_LOOKUP_SID,		smbd_dop_lookup_sid },
1109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	{ SMB_DR_LOOKUP_NAME,		smbd_dop_lookup_name },
1119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	{ SMB_DR_JOIN,			smbd_dop_join },
1129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	{ SMB_DR_GET_DCINFO,		smbd_dop_get_dcinfo },
1139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	{ SMB_DR_VSS_GET_COUNT,		smbd_dop_vss_get_count },
1149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	{ SMB_DR_VSS_GET_SNAPSHOTS,	smbd_dop_vss_get_snapshots },
1159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	{ SMB_DR_VSS_MAP_GMTTOKEN,	smbd_dop_vss_map_gmttoken },
1169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	{ SMB_DR_ADS_FIND_HOST,		smbd_dop_ads_find_host },
1179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	{ SMB_DR_QUOTA_QUERY,		smbd_dop_quota_query },
1189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	{ SMB_DR_QUOTA_SET,		smbd_dop_quota_set },
119*148c5f43SAlan Wright 	{ SMB_DR_DFS_GET_REFERRALS,	smbd_dop_dfs_get_referrals },
120*148c5f43SAlan Wright 	{ SMB_DR_SHR_HOSTACCESS,	smbd_dop_shr_hostaccess },
121*148c5f43SAlan Wright 	{ SMB_DR_SHR_EXEC,		smbd_dop_shr_exec }
1229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States };
1239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_ndoorop = (sizeof (smbd_doorops) / sizeof (smbd_doorops[0]));
1259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static smbd_doorsvc_t smbd_doorsvc;
1279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_door_fd = -1;
1289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_door_cookie = 0x534D4244;	/* SMBD */
1299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static smbd_door_t smbd_door_sdh;
1309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void smbd_door_dispatch(void *, char *, size_t, door_desc_t *, uint_t);
1329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_door_dispatch_async(smbd_arg_t *);
1339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void smbd_door_release_async(smbd_arg_t *);
1349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void *smbd_door_dispatch_op(void *);
1359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
137da6c28aaSamw  * Start the smbd door service.  Create and bind to a door.
138da6c28aaSamw  * Returns 0 on success. Otherwise, -1.
139da6c28aaSamw  */
140da6c28aaSamw int
1419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_start(void)
142da6c28aaSamw {
143da6c28aaSamw 	int	newfd;
144da6c28aaSamw 
1459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_lock(&smbd_doorsvc.sd_mutex);
146da6c28aaSamw 
1479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smbd_door_fd != -1) {
148da6c28aaSamw 		(void) fprintf(stderr, "smb_doorsrv_start: already started");
1499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) mutex_unlock(&smbd_doorsvc.sd_mutex);
150da6c28aaSamw 		return (-1);
151da6c28aaSamw 	}
152da6c28aaSamw 
1539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_door_init(&smbd_door_sdh, "doorsrv");
1549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_create(&smbd_doorsvc.sd_async_list, sizeof (smbd_arg_t),
1569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    offsetof(smbd_arg_t, lnd));
1579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_doorsvc.sd_async_count = 0;
1589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((smbd_door_fd = door_create(smbd_door_dispatch,
1609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    &smbd_door_cookie, DOOR_UNREF)) < 0) {
161da6c28aaSamw 		(void) fprintf(stderr, "smb_doorsrv_start: door_create: %s",
162da6c28aaSamw 		    strerror(errno));
1639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbd_door_fd = -1;
1649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) mutex_unlock(&smbd_doorsvc.sd_mutex);
165da6c28aaSamw 		return (-1);
166da6c28aaSamw 	}
167da6c28aaSamw 
1689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) unlink(SMBD_DOOR_NAME);
169da6c28aaSamw 
1709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((newfd = creat(SMBD_DOOR_NAME, 0644)) < 0) {
171da6c28aaSamw 		(void) fprintf(stderr, "smb_doorsrv_start: open: %s",
172da6c28aaSamw 		    strerror(errno));
1739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) door_revoke(smbd_door_fd);
1749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbd_door_fd = -1;
1759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) mutex_unlock(&smbd_doorsvc.sd_mutex);
176da6c28aaSamw 		return (-1);
177da6c28aaSamw 	}
178da6c28aaSamw 
179da6c28aaSamw 	(void) close(newfd);
1809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) fdetach(SMBD_DOOR_NAME);
181da6c28aaSamw 
1829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (fattach(smbd_door_fd, SMBD_DOOR_NAME) < 0) {
183da6c28aaSamw 		(void) fprintf(stderr, "smb_doorsrv_start: fattach: %s",
184da6c28aaSamw 		    strerror(errno));
1859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) door_revoke(smbd_door_fd);
1869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbd_door_fd = -1;
1879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) mutex_unlock(&smbd_doorsvc.sd_mutex);
188da6c28aaSamw 		return (-1);
189da6c28aaSamw 	}
190da6c28aaSamw 
1919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_unlock(&smbd_doorsvc.sd_mutex);
1929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (smbd_door_fd);
193da6c28aaSamw }
194da6c28aaSamw 
195da6c28aaSamw /*
196da6c28aaSamw  * Stop the smbd door service.
197da6c28aaSamw  */
198da6c28aaSamw void
1999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_stop(void)
200da6c28aaSamw {
2019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_lock(&smbd_doorsvc.sd_mutex);
202da6c28aaSamw 
2039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_door_fini(&smbd_door_sdh);
2049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smbd_door_fd != -1) {
2069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) fdetach(SMBD_DOOR_NAME);
2079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) door_revoke(smbd_door_fd);
2089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbd_door_fd = -1;
209da6c28aaSamw 	}
210da6c28aaSamw 
2119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_unlock(&smbd_doorsvc.sd_mutex);
2129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*ARGSUSED*/
2159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void
2169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_dispatch(void *cookie, char *argp, size_t arg_size, door_desc_t *dp,
2179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     uint_t n_desc)
2189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
2199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_arg_t	dop_arg;
2209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_doorhdr_t	*hdr;
2219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	size_t		hdr_size;
2229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char		*rbuf = NULL;
2239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_door_enter(&smbd_door_sdh);
2259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (!smbd_online())
2279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbd_door_return(&smbd_door_sdh, NULL, 0, NULL, 0);
2289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&dop_arg, sizeof (smbd_arg_t));
2309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	hdr = &dop_arg.hdr;
2319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	hdr_size = xdr_sizeof(smb_doorhdr_xdr, hdr);
2329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((cookie != &smbd_door_cookie) || (argp == NULL) ||
2349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    (arg_size < hdr_size)) {
2359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbd_door_return(&smbd_door_sdh, NULL, 0, NULL, 0);
2369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_doorhdr_decode(hdr, (uint8_t *)argp, hdr_size) == -1) {
2399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		syslog(LOG_DEBUG, "smbd_door_dispatch: header decode failed");
2409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbd_door_return(&smbd_door_sdh, NULL, 0, NULL, 0);
2419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((hdr->dh_magic != SMB_DOOR_HDR_MAGIC) || (hdr->dh_txid == 0)) {
2449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		syslog(LOG_DEBUG, "smbd_door_dispatch: invalid header");
2459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbd_door_return(&smbd_door_sdh, NULL, 0, NULL, 0);
2469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	dop_arg.opname = smb_doorhdr_opname(hdr->dh_op);
2499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	dop_arg.data = argp + hdr_size;
2509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	dop_arg.datalen = hdr->dh_datalen;
2519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (hdr->dh_op == SMB_DR_ASYNC_RESPONSE) {
2539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		/*
2549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		 * ASYNC_RESPONSE is used to collect the response
2559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		 * to an async call; it cannot be an async call.
2569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		 */
2579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		hdr->dh_flags &= ~SMB_DF_ASYNC;
2589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (hdr->dh_flags & SMB_DF_ASYNC) {
2619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (smbd_door_dispatch_async(&dop_arg) == 0)
2629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			hdr->dh_door_rc = SMB_DOP_SUCCESS;
2639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		else
2649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			hdr->dh_door_rc = SMB_DOP_NOT_CALLED;
2659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	} else {
2669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) smbd_door_dispatch_op(&dop_arg);
2679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((rbuf = (char *)alloca(dop_arg.rsize + hdr_size)) == NULL) {
2709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		errno = ENOMEM;
2719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		syslog(LOG_DEBUG, "smbd_door_dispatch[%s]: alloca %m",
2729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    dop_arg.opname);
2739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbd_door_return(&smbd_door_sdh, NULL, 0, NULL, 0);
2749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (dop_arg.rbuf != NULL) {
2779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) memcpy(rbuf + hdr_size, dop_arg.rbuf, dop_arg.rsize);
2789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		free(dop_arg.rbuf);
2799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	hdr->dh_datalen = dop_arg.rsize;
2829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) smb_doorhdr_encode(hdr, (uint8_t *)rbuf, hdr_size);
2839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	dop_arg.rsize += hdr_size;
2849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_door_return(&smbd_door_sdh, rbuf, dop_arg.rsize, NULL, 0);
2869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	/*NOTREACHED*/
287da6c28aaSamw }
288da6c28aaSamw 
289da6c28aaSamw /*
2909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Launch a thread to process an asynchronous door call.
291da6c28aaSamw  */
2929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
2939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_dispatch_async(smbd_arg_t *req_arg)
294da6c28aaSamw {
2959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_arg_t	*arg = NULL;
2969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char		*data = NULL;
2979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	pthread_attr_t	attr;
2989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	pthread_t	tid;
2999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int		rc;
300da6c28aaSamw 
3019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((req_arg->hdr.dh_flags & SMB_DF_ASYNC) == 0) {
3029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		errno = EINVAL;
3039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (-1);
3049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
3059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((arg = malloc(sizeof (smbd_arg_t))) == NULL) {
3079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		syslog(LOG_DEBUG, "smbd_door_dispatch_async[%s]: %m",
3089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    req_arg->opname);
3099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (-1);
3109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
3119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) memcpy(arg, req_arg, sizeof (smbd_arg_t));
3139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->data = NULL;
3149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (req_arg->datalen != 0) {
3169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if ((data = malloc(req_arg->datalen)) == NULL) {
3179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			free(arg);
3189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			syslog(LOG_DEBUG, "smbd_door_dispatch_async[%s]: %m",
3199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			    req_arg->opname);
3209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			return (-1);
3219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
3229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) memcpy(data, req_arg->data, req_arg->datalen);
3249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		arg->data = data;
3259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
3269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_lock(&smbd_doorsvc.sd_mutex);
328c5866007SKeyur Desai 	arg->magic = SMBD_ARG_MAGIC;
3299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_insert_tail(&smbd_doorsvc.sd_async_list, arg);
3309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	++smbd_doorsvc.sd_async_count;
3319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_unlock(&smbd_doorsvc.sd_mutex);
3329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) pthread_attr_init(&attr);
3349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
3359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rc = pthread_create(&tid, &attr, smbd_door_dispatch_op, arg);
3369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) pthread_attr_destroy(&attr);
3379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (rc != 0) {
3399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) mutex_lock(&smbd_doorsvc.sd_mutex);
3409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbd_door_release_async(arg);
3419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) mutex_unlock(&smbd_doorsvc.sd_mutex);
3429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
3439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (rc);
3459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
3489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Remove an entry from the async response pending list and free
3499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * the arg and associated data.
3509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
3519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Must only be called while holding the smbd_doorsvc mutex.
3529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
3539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void
3549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_release_async(smbd_arg_t *arg)
3559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
3569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg != NULL) {
357c5866007SKeyur Desai 		assert(arg->magic == SMBD_ARG_MAGIC);
358c5866007SKeyur Desai 		arg->magic = (uint32_t)~SMBD_ARG_MAGIC;
359c5866007SKeyur Desai 
3609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		list_remove(&smbd_doorsvc.sd_async_list, arg);
3619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		--smbd_doorsvc.sd_async_count;
3629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		free(arg->data);
363c5866007SKeyur Desai 		arg->data = NULL;
3649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		free(arg);
3659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
3669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
3699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * All door calls are processed here: synchronous or asynchronous:
3709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * - synchronous calls are invoked by direct function call
3719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * - asynchronous calls are invoked from a launched thread
3729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
373c5866007SKeyur Desai  * If the kernel has attempted to collect a response before the op
374c5866007SKeyur Desai  * has completed, the arg will have been marked as response_abort
375c5866007SKeyur Desai  * and we can discard the response data and release the arg.
376c5866007SKeyur Desai  *
3779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * We send a notification when asynchronous (ASYNC) door calls
3789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * from the kernel (SYSSPACE) have completed.
3799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
3809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void *
3819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_dispatch_op(void *thread_arg)
3829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
3839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_arg_t	*arg = (smbd_arg_t *)thread_arg;
3849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_doorop_t	*doorop;
3859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_doorhdr_t	*hdr;
3869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int		i;
3879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((!smbd_online()) || arg == NULL)
3899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (NULL);
3909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	hdr = &arg->hdr;
3929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->opname = smb_doorhdr_opname(hdr->dh_op);
3939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	for (i = 0; i < smbd_ndoorop; ++i) {
3959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		doorop = &smbd_doorops[i];
3969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (hdr->dh_op == doorop->opcode) {
3989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			hdr->dh_door_rc = doorop->op(arg);
3999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			hdr->dh_status = arg->status;
4009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			if ((hdr->dh_flags & SMB_DF_SYSSPACE) &&
4029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			    (hdr->dh_flags & SMB_DF_ASYNC)) {
4039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				assert(hdr->dh_op != SMB_DR_ASYNC_RESPONSE);
404c5866007SKeyur Desai 
405c5866007SKeyur Desai 				(void) mutex_lock(&smbd_doorsvc.sd_mutex);
406c5866007SKeyur Desai 				if (arg->response_abort) {
407c5866007SKeyur Desai 					free(arg->rbuf);
408c5866007SKeyur Desai 					arg->rbuf = NULL;
409c5866007SKeyur Desai 					smbd_door_release_async(arg);
410c5866007SKeyur Desai 				} else {
411c5866007SKeyur Desai 					arg->response_ready = B_TRUE;
412c5866007SKeyur Desai 				}
413c5866007SKeyur Desai 				(void) mutex_unlock(&smbd_doorsvc.sd_mutex);
414c5866007SKeyur Desai 
4159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				(void) smb_kmod_event_notify(hdr->dh_txid);
4169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			}
4179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			return (NULL);
4199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
4209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
4219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	syslog(LOG_ERR, "smbd_door_dispatch_op[%s]: invalid op %u",
4239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    arg->opname, hdr->dh_op);
424da6c28aaSamw 	return (NULL);
425da6c28aaSamw }
426da6c28aaSamw 
4279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
4289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Wrapper for door_return.  smbd_door_enter() increments a reference count
4299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * when a door call is dispatched and smbd_door_return() decrements the
4309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * reference count when it completes.
4319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
4329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The reference counting is used in smbd_door_fini() to wait for active
4339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * calls to complete before closing the door.
4349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
4359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
4369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_init(smbd_door_t *sdh, const char *name)
4379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) strlcpy(sdh->sd_name, name, SMBD_DOOR_NAMESZ);
4399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
4429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_enter(smbd_door_t *sdh)
4439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_lock(&sdh->sd_mutex);
4459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	++sdh->sd_ncalls;
4469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_unlock(&sdh->sd_mutex);
447da6c28aaSamw }
448da6c28aaSamw 
449da6c28aaSamw /*
4509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * We have two calls to door_return because the first call (with data)
4519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * can fail, which can leave the door call blocked here.  The second
4529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * call (with NULL) is guaranteed to unblock and return to the caller.
4539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
4549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
4559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_return(smbd_door_t *sdh, char *data_ptr, size_t data_size,
4569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     door_desc_t *desc_ptr, uint_t num_desc)
4579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_lock(&sdh->sd_mutex);
4599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (sdh->sd_ncalls == 0)
4619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		syslog(LOG_ERR, "smbd_door_return[%s]: unexpected count=0",
4629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    sdh->sd_name);
4639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	else
4649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		--sdh->sd_ncalls;
4659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) cond_broadcast(&sdh->sd_cv);
4679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_unlock(&sdh->sd_mutex);
4689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) door_return(data_ptr, data_size, desc_ptr, num_desc);
4709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) door_return(NULL, 0, NULL, 0);
4719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	/* NOTREACHED */
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  * A door service is about to terminate.
4769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Give active requests a small grace period to complete.
4779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
4789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
4799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_fini(smbd_door_t *sdh)
4809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	timestruc_t	delay;
4829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int		rc = 0;
4839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_lock(&sdh->sd_mutex);
4859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	while (rc != ETIME && sdh->sd_ncalls != 0) {
4879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		delay.tv_sec = 1;
4889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		delay.tv_nsec = 0;
4899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		rc = cond_reltimedwait(&sdh->sd_cv, &sdh->sd_mutex, &delay);
4909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
4919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (sdh->sd_ncalls != 0)
4939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		syslog(LOG_NOTICE, "smbd_door_fini[%s]: %d remaining",
4949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    sdh->sd_name, sdh->sd_ncalls);
4959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_unlock(&sdh->sd_mutex);
4979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
5009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Null door operation: always returns success.
5019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Assumes no request or response data.
502da6c28aaSamw  */
503da6c28aaSamw /*ARGSUSED*/
5049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
5059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_null(smbd_arg_t *arg)
506da6c28aaSamw {
5079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
5083ad684d6Sjb150015 }
5093ad684d6Sjb150015 
5109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
5119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Async response handler: setup the rbuf and rsize for the specified
5129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * transaction.  This function is used by the kernel to collect the
5139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * response half of an asynchronous door call.
514c5866007SKeyur Desai  *
515c5866007SKeyur Desai  * If a door client attempts to collect a response before the op has
516c5866007SKeyur Desai  * completed (!response_ready), mark the arg as response_abort and
517c5866007SKeyur Desai  * set an error.  The response will be discarded when the op completes.
5189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
5199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
5209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_async_response(smbd_arg_t *rsp_arg)
5219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
5229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_t		*arg_list = &smbd_doorsvc.sd_async_list;
5239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_arg_t	*arg;
5249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_lock(&smbd_doorsvc.sd_mutex);
5269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg = list_head(arg_list);
5279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	while (arg != NULL) {
529c5866007SKeyur Desai 		assert(arg->magic == SMBD_ARG_MAGIC);
530c5866007SKeyur Desai 
5319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (arg->hdr.dh_txid == rsp_arg->hdr.dh_txid) {
532c5866007SKeyur Desai 			if (!arg->response_ready) {
533c5866007SKeyur Desai 				arg->response_abort = B_TRUE;
534c5866007SKeyur Desai 				rsp_arg->hdr.dh_door_rc = SMB_DOP_NOT_CALLED;
535c5866007SKeyur Desai 				syslog(LOG_NOTICE, "doorsvc[%s]: %u not ready",
536c5866007SKeyur Desai 				    arg->opname, arg->hdr.dh_txid);
537c5866007SKeyur Desai 				break;
538c5866007SKeyur Desai 			}
539c5866007SKeyur Desai 
5409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			rsp_arg->rbuf = arg->rbuf;
5419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			rsp_arg->rsize = arg->rsize;
5429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			arg->rbuf = NULL;
5439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			arg->rsize = 0;
5449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			smbd_door_release_async(arg);
5459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			break;
546da6c28aaSamw 		}
547da6c28aaSamw 
5489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		arg = list_next(arg_list, arg);
549da6c28aaSamw 	}
550da6c28aaSamw 
5519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) mutex_unlock(&smbd_doorsvc.sd_mutex);
5529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
5539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
5569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_user_nonauth_logon(smbd_arg_t *arg)
5579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
558c5866007SKeyur Desai 	uint32_t	sid = 0;
5599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_common_decode(arg->data, arg->datalen,
5619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    xdr_uint32_t, &sid) != 0)
5629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
5639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_user_nonauth_logon(sid);
5659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
5669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
5699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_user_auth_logoff(smbd_arg_t *arg)
5709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
571c5866007SKeyur Desai 	uint32_t	sid = 0;
5729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_common_decode(arg->data, arg->datalen,
5749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    xdr_uint32_t, &sid) != 0)
5759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
5769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_user_auth_logoff(sid);
5789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
5799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
5829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Obtains an access token on successful user authentication.
5839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
5849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
5859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_user_auth_logon(smbd_arg_t *arg)
5869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
5879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_logon_t	*user_info;
5889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_token_t	*token;
5899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	user_info = smb_logon_decode((uint8_t *)arg->data,
5919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    arg->datalen);
5929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (user_info == NULL)
5939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
5949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	token = smbd_user_auth_logon(user_info);
5969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_logon_free(user_info);
5989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (token == NULL)
6009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_EMPTYBUF);
6019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->rbuf = (char *)smb_token_encode(token, &arg->rsize);
6039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_token_destroy(token);
6049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg->rbuf == NULL)
6069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_ENCODE_ERROR);
6079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
6089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
6119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_lookup_name(smbd_arg_t *arg)
6129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
6139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_domain_t	dinfo;
6149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_account_t	ainfo;
6159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	lsa_account_t	acct;
6169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char		buf[MAXNAMELEN];
6179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
618c5866007SKeyur Desai 	bzero(&acct, sizeof (lsa_account_t));
619c5866007SKeyur Desai 
6209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_common_decode(arg->data, arg->datalen,
6219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    lsa_account_xdr, &acct) != 0)
6229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
6239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (*acct.a_domain == '\0')
6259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) snprintf(buf, MAXNAMELEN, "%s", acct.a_name);
6269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	else if (strchr(acct.a_domain, '.') != NULL)
6279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) snprintf(buf, MAXNAMELEN, "%s@%s", acct.a_name,
6289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    acct.a_domain);
629da6c28aaSamw 	else
6309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) snprintf(buf, MAXNAMELEN, "%s\\%s", acct.a_domain,
6319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    acct.a_name);
6329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	acct.a_status = lsa_lookup_name(buf, acct.a_sidtype, &ainfo);
6349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (acct.a_status == NT_STATUS_SUCCESS) {
6359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		acct.a_sidtype = ainfo.a_type;
6369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_sid_tostr(ainfo.a_sid, acct.a_sid);
6379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) strlcpy(acct.a_name, ainfo.a_name, MAXNAMELEN);
6389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (smb_domain_lookup_name(ainfo.a_domain, &dinfo))
6409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			(void) strlcpy(acct.a_domain, dinfo.di_fqname,
6419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			    MAXNAMELEN);
6429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		else
6439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			(void) strlcpy(acct.a_domain, ainfo.a_domain,
6449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			    MAXNAMELEN);
6459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_account_free(&ainfo);
646da6c28aaSamw 	}
647da6c28aaSamw 
6489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->rbuf = smb_common_encode(&acct, lsa_account_xdr, &arg->rsize);
6499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg->rbuf == NULL)
6519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_ENCODE_ERROR);
6529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
6539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
6569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_lookup_sid(smbd_arg_t *arg)
6579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
6589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_domain_t	dinfo;
6599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_account_t	ainfo;
6609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	lsa_account_t	acct;
6619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_sid_t	*sid;
6629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
663c5866007SKeyur Desai 	bzero(&acct, sizeof (lsa_account_t));
664c5866007SKeyur Desai 
6659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_common_decode(arg->data, arg->datalen,
6669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    lsa_account_xdr, &acct) != 0)
6679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
6689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	sid = smb_sid_fromstr(acct.a_sid);
6709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	acct.a_status = lsa_lookup_sid(sid, &ainfo);
6719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_sid_free(sid);
6729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (acct.a_status == NT_STATUS_SUCCESS) {
6749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		acct.a_sidtype = ainfo.a_type;
6759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_sid_tostr(ainfo.a_sid, acct.a_sid);
6769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) strlcpy(acct.a_name, ainfo.a_name, MAXNAMELEN);
6779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (smb_domain_lookup_name(ainfo.a_domain, &dinfo))
6799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			(void) strlcpy(acct.a_domain, dinfo.di_fqname,
6809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			    MAXNAMELEN);
6819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		else
6829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			(void) strlcpy(acct.a_domain, ainfo.a_domain,
6839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			    MAXNAMELEN);
6849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_account_free(&ainfo);
6869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
6879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->rbuf = smb_common_encode(&acct, lsa_account_xdr, &arg->rsize);
6899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg->rbuf == NULL)
6919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_ENCODE_ERROR);
6929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
6939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
6969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_join(smbd_arg_t *arg)
6979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
6989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_joininfo_t	jdi;
6999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	status;
7009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
701c5866007SKeyur Desai 	bzero(&jdi, sizeof (smb_joininfo_t));
702c5866007SKeyur Desai 
7039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_common_decode(arg->data, arg->datalen,
7049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    smb_joininfo_xdr, &jdi) != 0)
7059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
7069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	status = smbd_join(&jdi);
7089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->rbuf = smb_common_encode(&status, xdr_uint32_t, &arg->rsize);
7109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg->rbuf == NULL)
7129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_ENCODE_ERROR);
7139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
7149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
7179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_get_dcinfo(smbd_arg_t *arg)
7189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
7199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_domainex_t	dxi;
7209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (!smb_domain_getinfo(&dxi))
7229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_EMPTYBUF);
7239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->rbuf = smb_string_encode(dxi.d_dc, &arg->rsize);
7259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg->rbuf == NULL)
7279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_ENCODE_ERROR);
7289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
7299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
7329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Return the number of snapshots for a dataset
7339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
7349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
7359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_vss_get_count(smbd_arg_t *arg)
7369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
7379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_string_t	path;
7389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	count;
7399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&path, sizeof (smb_string_t));
7419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->rbuf = NULL;
7429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_string_decode(&path, arg->data, arg->datalen) != 0)
7449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
7459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smbd_vss_get_count(path.buf, &count) == 0)
7479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		arg->rbuf = smb_common_encode(&count, xdr_uint32_t,
7489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    &arg->rsize);
7499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	xdr_free(smb_string_xdr, (char *)&path);
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 
7579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
7589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Return the count and list of snapshots.
7599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The list is in @GMT token format.
7609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
7619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
7629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_vss_get_snapshots(smbd_arg_t *arg)
7639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
7649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char				**gmtp;
7659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_gmttoken_query_t		request;
7669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_gmttoken_response_t		reply;
7679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint_t				i;
7689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&request, sizeof (smb_gmttoken_query_t));
7709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&reply, sizeof (smb_gmttoken_response_t));
7719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_common_decode(arg->data, arg->datalen,
7739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    smb_gmttoken_query_xdr, &request) != 0)
7749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
7759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	reply.gtr_gmttokens.gtr_gmttokens_val = malloc(request.gtq_count *
7779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    sizeof (char *));
7789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(reply.gtr_gmttokens.gtr_gmttokens_val, request.gtq_count *
7799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    sizeof (char *));
7809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (reply.gtr_gmttokens.gtr_gmttokens_val == NULL) {
7829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		xdr_free(smb_gmttoken_query_xdr, (char *)&request);
7839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_EMPTYBUF);
7849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
7859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbd_vss_get_snapshots(request.gtq_path, request.gtq_count,
7879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    &reply.gtr_count,
7889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    &reply.gtr_gmttokens.gtr_gmttokens_len,
7899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    reply.gtr_gmttokens.gtr_gmttokens_val);
7909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->rbuf = smb_common_encode(&reply, smb_gmttoken_response_xdr,
7929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    &arg->rsize);
7939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg->rbuf == NULL) {
7949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		xdr_free(smb_gmttoken_query_xdr, (char *)&request);
7959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_ENCODE_ERROR);
7969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
7979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	for (i = 0, gmtp = reply.gtr_gmttokens.gtr_gmttokens_val;
7999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    (i < request.gtq_count); i++) {
8009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (*gmtp)
8019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			free(*gmtp);
8029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		gmtp++;
8039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
8049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	free(reply.gtr_gmttokens.gtr_gmttokens_val);
8069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	xdr_free(smb_gmttoken_query_xdr, (char *)&request);
8079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
8089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
8119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Return the name of the snapshot that matches the dataset path
8129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * and @GMT token.
8139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
8149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
8159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_vss_map_gmttoken(smbd_arg_t *arg)
8169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
8179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char			*snapname;
8189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_gmttoken_snapname_t	request;
8199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&request, sizeof (smb_gmttoken_snapname_t));
8219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_common_decode(arg->data, arg->datalen,
8239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    smb_gmttoken_snapname_xdr, &request) != 0) {
8249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		xdr_free(smb_gmttoken_snapname_xdr, (char *)&request);
8259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
8269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
8279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((snapname = malloc(MAXPATHLEN)) == NULL) {
8299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		xdr_free(smb_gmttoken_snapname_xdr, (char *)&request);
8309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (NULL);
8319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
8329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((smbd_vss_map_gmttoken(request.gts_path, request.gts_gmttoken,
8349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    snapname) != 0)) {
8359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		*snapname = '\0';
8369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
8379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->rbuf = smb_string_encode(snapname, &arg->rsize);
8399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	xdr_free(smb_gmttoken_snapname_xdr, (char *)&request);
8409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	free(snapname);
8419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg->rbuf == NULL)
8439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_ENCODE_ERROR);
8449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
8459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
8489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_ads_find_host(smbd_arg_t *arg)
8499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
8509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_ads_host_info_t	*hinfo = NULL;
8519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char			*hostname = "";
8529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_string_t		fqdn;
8539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&fqdn, sizeof (smb_string_t));
8559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_string_decode(&fqdn, arg->data, arg->datalen) != 0)
8579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
8589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((hinfo = smb_ads_find_host(fqdn.buf, NULL)) != NULL)
8609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		hostname = hinfo->name;
8619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	xdr_free(smb_string_xdr, (char *)&fqdn);
8639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->rbuf = smb_string_encode(hostname, &arg->rsize);
8659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	free(hinfo);
8669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg->rbuf == NULL)
8689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_ENCODE_ERROR);
8699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
8709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
8739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Query the list of user/group quota entries for a given filesystem.
8749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
8759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
8769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_quota_query(smbd_arg_t *arg)
8779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
8789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_query_t	request;
8799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_response_t	reply;
8809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t		status;
8819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&request, sizeof (smb_quota_query_t));
8839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&reply, sizeof (smb_quota_response_t));
8849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_common_decode(arg->data, arg->datalen,
8869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    smb_quota_query_xdr, &request) != 0)
8879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
8889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	status = smb_quota_query(&request, &reply);
8909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	reply.qr_status = status;
8919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->rbuf = smb_common_encode(&reply, smb_quota_response_xdr,
8939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    &arg->rsize);
8949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	xdr_free(smb_quota_query_xdr, (char *)&request);
8969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_free(&reply);
8979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg->rbuf == NULL)
8999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_ENCODE_ERROR);
9009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
9019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
9029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
9049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Set a list of user/group quota entries for a given filesystem.
9059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
9069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
9079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_quota_set(smbd_arg_t *arg)
9089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
9099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_set_t	request;
9109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	status = 0;
9119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&request, sizeof (smb_quota_set_t));
9139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_common_decode(arg->data, arg->datalen,
9159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    smb_quota_set_xdr, &request) != 0)
9169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
9179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	status = smb_quota_set(&request);
9199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->rbuf = smb_common_encode(&status, xdr_uint32_t, &arg->rsize);
9219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	xdr_free(smb_quota_set_xdr, (char *)&request);
9229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg->rbuf == NULL)
9249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_ENCODE_ERROR);
9259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
9269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
9279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
9299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_dfs_get_referrals(smbd_arg_t *arg)
9309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
9319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	dfs_referral_query_t	request;
9329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	dfs_referral_response_t	reply;
9339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&request, sizeof (request));
9359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&reply, sizeof (reply));
9369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_common_decode(arg->data, arg->datalen,
9389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    dfs_referral_query_xdr, &request) != 0)
9399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_DECODE_ERROR);
9409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	reply.rp_status = dfs_get_referrals((const char *)request.rq_path,
9429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    request.rq_type, &reply.rp_referrals);
9439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (reply.rp_status != ERROR_SUCCESS)
9459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		bzero(&reply.rp_referrals, sizeof (dfs_info_t));
9469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	arg->rbuf = smb_common_encode(&reply, dfs_referral_response_xdr,
9489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    &arg->rsize);
9499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (reply.rp_status == ERROR_SUCCESS)
9519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		dfs_info_free(&reply.rp_referrals);
9529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	xdr_free(dfs_referral_query_xdr, (char *)&request);
9549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (arg->rbuf == NULL)
9569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SMB_DOP_ENCODE_ERROR);
9579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SMB_DOP_SUCCESS);
958da6c28aaSamw }
959*148c5f43SAlan Wright 
960*148c5f43SAlan Wright static int
961*148c5f43SAlan Wright smbd_dop_shr_hostaccess(smbd_arg_t *arg)
962*148c5f43SAlan Wright {
963*148c5f43SAlan Wright 	smb_shr_hostaccess_query_t request;
964*148c5f43SAlan Wright 	uint32_t reply;
965*148c5f43SAlan Wright 
966*148c5f43SAlan Wright 	bzero(&request, sizeof (request));
967*148c5f43SAlan Wright 	bzero(&reply, sizeof (reply));
968*148c5f43SAlan Wright 
969*148c5f43SAlan Wright 	if (smb_common_decode(arg->data, arg->datalen,
970*148c5f43SAlan Wright 	    smb_shr_hostaccess_query_xdr, &request) != 0)
971*148c5f43SAlan Wright 		return (SMB_DOP_DECODE_ERROR);
972*148c5f43SAlan Wright 
973*148c5f43SAlan Wright 	reply = smb_shr_hostaccess(&request.shq_ipaddr, request.shq_none,
974*148c5f43SAlan Wright 	    request.shq_ro, request.shq_rw, request.shq_flag);
975*148c5f43SAlan Wright 
976*148c5f43SAlan Wright 	arg->rbuf = smb_common_encode(&reply, xdr_uint32_t, &arg->rsize);
977*148c5f43SAlan Wright 
978*148c5f43SAlan Wright 	xdr_free(smb_shr_hostaccess_query_xdr, (char *)&request);
979*148c5f43SAlan Wright 
980*148c5f43SAlan Wright 	if (arg->rbuf == NULL)
981*148c5f43SAlan Wright 		return (SMB_DOP_ENCODE_ERROR);
982*148c5f43SAlan Wright 	return (SMB_DOP_SUCCESS);
983*148c5f43SAlan Wright }
984*148c5f43SAlan Wright 
985*148c5f43SAlan Wright static int
986*148c5f43SAlan Wright smbd_dop_shr_exec(smbd_arg_t *arg)
987*148c5f43SAlan Wright {
988*148c5f43SAlan Wright 	smb_shr_execinfo_t request;
989*148c5f43SAlan Wright 	int reply;
990*148c5f43SAlan Wright 
991*148c5f43SAlan Wright 	bzero(&request, sizeof (request));
992*148c5f43SAlan Wright 	bzero(&reply, sizeof (reply));
993*148c5f43SAlan Wright 
994*148c5f43SAlan Wright 	if (smb_common_decode(arg->data, arg->datalen,
995*148c5f43SAlan Wright 	    smb_shr_execinfo_xdr, &request) != 0)
996*148c5f43SAlan Wright 		return (SMB_DOP_DECODE_ERROR);
997*148c5f43SAlan Wright 
998*148c5f43SAlan Wright 	reply = smb_shr_exec(&request);
999*148c5f43SAlan Wright 
1000*148c5f43SAlan Wright 	if (reply != 0)
1001*148c5f43SAlan Wright 		syslog(LOG_NOTICE, "Failed to execute %s command",
1002*148c5f43SAlan Wright 		    (request.e_type == SMB_EXEC_MAP) ? "map" : "unmap");
1003*148c5f43SAlan Wright 
1004*148c5f43SAlan Wright 	arg->rbuf = smb_common_encode(&reply, xdr_int, &arg->rsize);
1005*148c5f43SAlan Wright 
1006*148c5f43SAlan Wright 	xdr_free(smb_shr_execinfo_xdr, (char *)&request);
1007*148c5f43SAlan Wright 
1008*148c5f43SAlan Wright 	if (arg->rbuf == NULL)
1009*148c5f43SAlan Wright 		return (SMB_DOP_ENCODE_ERROR);
1010*148c5f43SAlan Wright 	return (SMB_DOP_SUCCESS);
1011*148c5f43SAlan Wright }
1012