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.
23*a90cf9f2SGordon Ross * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
24da6c28aaSamw */
25da6c28aaSamw
269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <sys/list.h>
279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <assert.h>
28da6c28aaSamw #include <alloca.h>
29da6c28aaSamw #include <door.h>
30da6c28aaSamw #include <errno.h>
31da6c28aaSamw #include <syslog.h>
32da6c28aaSamw #include <unistd.h>
33da6c28aaSamw #include <stdio.h>
34da6c28aaSamw #include <synch.h>
35da6c28aaSamw #include <string.h>
36da6c28aaSamw #include <stdlib.h>
37da6c28aaSamw #include <sys/stat.h>
38da6c28aaSamw #include <fcntl.h>
39da6c28aaSamw #include <pthread.h>
40da6c28aaSamw #include <strings.h>
4112b65585SGordon Ross #include <note.h>
429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_door.h>
439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_xdr.h>
449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_token.h>
459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/libmlsvc.h>
469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/libsmbns.h>
479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include "smbd.h"
48da6c28aaSamw
499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * The list contains asynchronous requests that have been initiated
519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * but have not yet been collected (via smbd_dop_async_response).
529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States typedef struct smbd_doorsvc {
549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_t sd_mutex;
559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States cond_t sd_cv;
569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_t sd_async_list;
579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t sd_async_count;
589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } smbd_doorsvc_t;
599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_null(smbd_arg_t *);
619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_async_response(smbd_arg_t *);
629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_user_auth_logon(smbd_arg_t *);
639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_user_nonauth_logon(smbd_arg_t *);
649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_user_auth_logoff(smbd_arg_t *);
659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_lookup_sid(smbd_arg_t *);
669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_lookup_name(smbd_arg_t *);
679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_join(smbd_arg_t *);
689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_get_dcinfo(smbd_arg_t *);
699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_vss_get_count(smbd_arg_t *);
709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_vss_get_snapshots(smbd_arg_t *);
719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_vss_map_gmttoken(smbd_arg_t *);
729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_ads_find_host(smbd_arg_t *);
739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_quota_query(smbd_arg_t *);
749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_quota_set(smbd_arg_t *);
759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_dop_dfs_get_referrals(smbd_arg_t *);
76148c5f43SAlan Wright static int smbd_dop_shr_hostaccess(smbd_arg_t *);
77148c5f43SAlan Wright static int smbd_dop_shr_exec(smbd_arg_t *);
78b3700b07SGordon Ross static int smbd_dop_notify_dc_changed(smbd_arg_t *);
799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States typedef int (*smbd_dop_t)(smbd_arg_t *);
819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States typedef struct smbd_doorop {
839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_dopcode_t opcode;
849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_t op;
859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } smbd_doorop_t;
869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_doorop_t smbd_doorops[] = {
889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { SMB_DR_NULL, smbd_dop_null },
899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { SMB_DR_ASYNC_RESPONSE, smbd_dop_async_response },
909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { SMB_DR_USER_AUTH_LOGON, smbd_dop_user_auth_logon },
919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { SMB_DR_USER_NONAUTH_LOGON, smbd_dop_user_nonauth_logon },
929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { SMB_DR_USER_AUTH_LOGOFF, smbd_dop_user_auth_logoff },
939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { SMB_DR_LOOKUP_SID, smbd_dop_lookup_sid },
949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { SMB_DR_LOOKUP_NAME, smbd_dop_lookup_name },
959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { SMB_DR_JOIN, smbd_dop_join },
969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { SMB_DR_GET_DCINFO, smbd_dop_get_dcinfo },
979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { SMB_DR_VSS_GET_COUNT, smbd_dop_vss_get_count },
989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { SMB_DR_VSS_GET_SNAPSHOTS, smbd_dop_vss_get_snapshots },
999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { SMB_DR_VSS_MAP_GMTTOKEN, smbd_dop_vss_map_gmttoken },
1009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { SMB_DR_ADS_FIND_HOST, smbd_dop_ads_find_host },
1019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { SMB_DR_QUOTA_QUERY, smbd_dop_quota_query },
1029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { SMB_DR_QUOTA_SET, smbd_dop_quota_set },
103148c5f43SAlan Wright { SMB_DR_DFS_GET_REFERRALS, smbd_dop_dfs_get_referrals },
104148c5f43SAlan Wright { SMB_DR_SHR_HOSTACCESS, smbd_dop_shr_hostaccess },
105b3700b07SGordon Ross { SMB_DR_SHR_EXEC, smbd_dop_shr_exec },
106b3700b07SGordon Ross { SMB_DR_NOTIFY_DC_CHANGED, smbd_dop_notify_dc_changed }
1079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States };
1089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
1099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_ndoorop = (sizeof (smbd_doorops) / sizeof (smbd_doorops[0]));
1109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
1119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static smbd_doorsvc_t smbd_doorsvc;
1129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_door_fd = -1;
1139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_door_cookie = 0x534D4244; /* SMBD */
1149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static smbd_door_t smbd_door_sdh;
115b819cea2SGordon Ross static char *smbd_door_name = NULL;
1169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
1179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void smbd_door_dispatch(void *, char *, size_t, door_desc_t *, uint_t);
1189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smbd_door_dispatch_async(smbd_arg_t *);
1199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void smbd_door_release_async(smbd_arg_t *);
1209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
1219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
122da6c28aaSamw * Start the smbd door service. Create and bind to a door.
123da6c28aaSamw * Returns 0 on success. Otherwise, -1.
124da6c28aaSamw */
125da6c28aaSamw int
smbd_door_start(void)1269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_start(void)
127da6c28aaSamw {
128da6c28aaSamw int newfd;
129da6c28aaSamw
1309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) mutex_lock(&smbd_doorsvc.sd_mutex);
131da6c28aaSamw
1329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smbd_door_fd != -1) {
133da6c28aaSamw (void) fprintf(stderr, "smb_doorsrv_start: already started");
1349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) mutex_unlock(&smbd_doorsvc.sd_mutex);
135da6c28aaSamw return (-1);
136da6c28aaSamw }
137da6c28aaSamw
138b819cea2SGordon Ross smbd_door_name = getenv("SMBD_DOOR_NAME");
139b819cea2SGordon Ross if (smbd_door_name == NULL)
140b819cea2SGordon Ross smbd_door_name = SMBD_DOOR_NAME;
141b819cea2SGordon Ross
1429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_init(&smbd_door_sdh, "doorsrv");
1439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
1449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_create(&smbd_doorsvc.sd_async_list, sizeof (smbd_arg_t),
1459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States offsetof(smbd_arg_t, lnd));
1469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_doorsvc.sd_async_count = 0;
1479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
1489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((smbd_door_fd = door_create(smbd_door_dispatch,
1499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States &smbd_door_cookie, DOOR_UNREF)) < 0) {
150da6c28aaSamw (void) fprintf(stderr, "smb_doorsrv_start: door_create: %s",
151da6c28aaSamw strerror(errno));
1529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_fd = -1;
1539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) mutex_unlock(&smbd_doorsvc.sd_mutex);
154da6c28aaSamw return (-1);
155da6c28aaSamw }
156da6c28aaSamw
157b819cea2SGordon Ross (void) unlink(smbd_door_name);
158da6c28aaSamw
159b819cea2SGordon Ross if ((newfd = creat(smbd_door_name, 0644)) < 0) {
160da6c28aaSamw (void) fprintf(stderr, "smb_doorsrv_start: open: %s",
161da6c28aaSamw strerror(errno));
1629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) door_revoke(smbd_door_fd);
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
168da6c28aaSamw (void) close(newfd);
169b819cea2SGordon Ross (void) fdetach(smbd_door_name);
170da6c28aaSamw
171b819cea2SGordon Ross if (fattach(smbd_door_fd, smbd_door_name) < 0) {
172da6c28aaSamw (void) fprintf(stderr, "smb_doorsrv_start: fattach: %s",
173da6c28aaSamw strerror(errno));
1749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) door_revoke(smbd_door_fd);
1759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_fd = -1;
1769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) mutex_unlock(&smbd_doorsvc.sd_mutex);
177da6c28aaSamw return (-1);
178da6c28aaSamw }
179da6c28aaSamw
1809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) mutex_unlock(&smbd_doorsvc.sd_mutex);
1819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (smbd_door_fd);
182da6c28aaSamw }
183da6c28aaSamw
184da6c28aaSamw /*
185da6c28aaSamw * Stop the smbd door service.
186da6c28aaSamw */
187da6c28aaSamw void
smbd_door_stop(void)1889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_stop(void)
189da6c28aaSamw {
1909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) mutex_lock(&smbd_doorsvc.sd_mutex);
191da6c28aaSamw
1929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_fini(&smbd_door_sdh);
1939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
194b819cea2SGordon Ross if (smbd_door_name)
195b819cea2SGordon Ross (void) fdetach(smbd_door_name);
196b819cea2SGordon Ross
1979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smbd_door_fd != -1) {
1989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) door_revoke(smbd_door_fd);
1999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_fd = -1;
200da6c28aaSamw }
201da6c28aaSamw
2029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) mutex_unlock(&smbd_doorsvc.sd_mutex);
2039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*ARGSUSED*/
2069fb67ea3Safshin 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)2079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_dispatch(void *cookie, char *argp, size_t arg_size, door_desc_t *dp,
2089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint_t n_desc)
2099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
2109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_arg_t dop_arg;
2119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_doorhdr_t *hdr;
2129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States size_t hdr_size;
2139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *rbuf = NULL;
2149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_enter(&smbd_door_sdh);
2169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!smbd_online())
2189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_return(&smbd_door_sdh, NULL, 0, NULL, 0);
2199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(&dop_arg, sizeof (smbd_arg_t));
2219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States hdr = &dop_arg.hdr;
2229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States hdr_size = xdr_sizeof(smb_doorhdr_xdr, hdr);
2239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((cookie != &smbd_door_cookie) || (argp == NULL) ||
2259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (arg_size < hdr_size)) {
2269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_return(&smbd_door_sdh, NULL, 0, NULL, 0);
2279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_doorhdr_decode(hdr, (uint8_t *)argp, hdr_size) == -1) {
2309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_DEBUG, "smbd_door_dispatch: header decode failed");
2319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_return(&smbd_door_sdh, NULL, 0, NULL, 0);
2329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((hdr->dh_magic != SMB_DOOR_HDR_MAGIC) || (hdr->dh_txid == 0)) {
2359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_DEBUG, "smbd_door_dispatch: invalid header");
2369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_return(&smbd_door_sdh, NULL, 0, NULL, 0);
2379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dop_arg.opname = smb_doorhdr_opname(hdr->dh_op);
2409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dop_arg.data = argp + hdr_size;
2419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dop_arg.datalen = hdr->dh_datalen;
2429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (hdr->dh_op == SMB_DR_ASYNC_RESPONSE) {
2449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
2459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ASYNC_RESPONSE is used to collect the response
2469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * to an async call; it cannot be an async call.
2479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
2489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States hdr->dh_flags &= ~SMB_DF_ASYNC;
2499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (hdr->dh_flags & SMB_DF_ASYNC) {
2529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smbd_door_dispatch_async(&dop_arg) == 0)
2539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States hdr->dh_door_rc = SMB_DOP_SUCCESS;
2549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else
2559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States hdr->dh_door_rc = SMB_DOP_NOT_CALLED;
2569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else {
2579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) smbd_door_dispatch_op(&dop_arg);
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 ((rbuf = (char *)alloca(dop_arg.rsize + hdr_size)) == NULL) {
2619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States errno = ENOMEM;
2629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_DEBUG, "smbd_door_dispatch[%s]: alloca %m",
2639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dop_arg.opname);
2649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_return(&smbd_door_sdh, NULL, 0, NULL, 0);
2659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (dop_arg.rbuf != NULL) {
2689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) memcpy(rbuf + hdr_size, dop_arg.rbuf, dop_arg.rsize);
2699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(dop_arg.rbuf);
2709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States hdr->dh_datalen = dop_arg.rsize;
2739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) smb_doorhdr_encode(hdr, (uint8_t *)rbuf, hdr_size);
2749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dop_arg.rsize += hdr_size;
2759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_return(&smbd_door_sdh, rbuf, dop_arg.rsize, NULL, 0);
2779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*NOTREACHED*/
278da6c28aaSamw }
279da6c28aaSamw
280da6c28aaSamw /*
2819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Launch a thread to process an asynchronous door call.
282da6c28aaSamw */
2839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_door_dispatch_async(smbd_arg_t * req_arg)2849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_dispatch_async(smbd_arg_t *req_arg)
285da6c28aaSamw {
2869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_arg_t *arg = NULL;
2879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *data = NULL;
2889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pthread_attr_t attr;
2899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pthread_t tid;
2909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc;
291da6c28aaSamw
2929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((req_arg->hdr.dh_flags & SMB_DF_ASYNC) == 0) {
2939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States errno = EINVAL;
2949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (-1);
2959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((arg = malloc(sizeof (smbd_arg_t))) == NULL) {
2989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_DEBUG, "smbd_door_dispatch_async[%s]: %m",
2999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States req_arg->opname);
3009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (-1);
3019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
3039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) memcpy(arg, req_arg, sizeof (smbd_arg_t));
3049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States arg->data = NULL;
3059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
3069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (req_arg->datalen != 0) {
3079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((data = malloc(req_arg->datalen)) == NULL) {
3089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(arg);
3099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_DEBUG, "smbd_door_dispatch_async[%s]: %m",
3109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States req_arg->opname);
3119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (-1);
3129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
3149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) memcpy(data, req_arg->data, req_arg->datalen);
3159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States arg->data = data;
3169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
3189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) mutex_lock(&smbd_doorsvc.sd_mutex);
319c5866007SKeyur Desai arg->magic = SMBD_ARG_MAGIC;
3209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_insert_tail(&smbd_doorsvc.sd_async_list, arg);
3219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ++smbd_doorsvc.sd_async_count;
3229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) mutex_unlock(&smbd_doorsvc.sd_mutex);
3239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
3249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) pthread_attr_init(&attr);
3259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
3269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = pthread_create(&tid, &attr, smbd_door_dispatch_op, arg);
3279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) pthread_attr_destroy(&attr);
3289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
3299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rc != 0) {
3309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) mutex_lock(&smbd_doorsvc.sd_mutex);
3319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_release_async(arg);
3329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) mutex_unlock(&smbd_doorsvc.sd_mutex);
3339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
3359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (rc);
3369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
3389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
3399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Remove an entry from the async response pending list and free
3409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * the arg and associated data.
3419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
3429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Must only be called while holding the smbd_doorsvc mutex.
3439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
3449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void
smbd_door_release_async(smbd_arg_t * arg)3459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_release_async(smbd_arg_t *arg)
3469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
3479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (arg != NULL) {
348c5866007SKeyur Desai assert(arg->magic == SMBD_ARG_MAGIC);
349c5866007SKeyur Desai arg->magic = (uint32_t)~SMBD_ARG_MAGIC;
350c5866007SKeyur Desai
3519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_remove(&smbd_doorsvc.sd_async_list, arg);
3529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States --smbd_doorsvc.sd_async_count;
3539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(arg->data);
354c5866007SKeyur Desai arg->data = NULL;
3559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(arg);
3569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
3599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
3609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * All door calls are processed here: synchronous or asynchronous:
3619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * - synchronous calls are invoked by direct function call
3629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * - asynchronous calls are invoked from a launched thread
3639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
364c5866007SKeyur Desai * If the kernel has attempted to collect a response before the op
365c5866007SKeyur Desai * has completed, the arg will have been marked as response_abort
366c5866007SKeyur Desai * and we can discard the response data and release the arg.
367c5866007SKeyur Desai *
3689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * We send a notification when asynchronous (ASYNC) door calls
3699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * from the kernel (SYSSPACE) have completed.
3709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
371b819cea2SGordon Ross void *
smbd_door_dispatch_op(void * thread_arg)3729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_dispatch_op(void *thread_arg)
3739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
3749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_arg_t *arg = (smbd_arg_t *)thread_arg;
3759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_doorop_t *doorop;
3769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_doorhdr_t *hdr;
3779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int i;
3789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
3799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((!smbd_online()) || arg == NULL)
3809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (NULL);
3819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
3829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States hdr = &arg->hdr;
3839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States arg->opname = smb_doorhdr_opname(hdr->dh_op);
3849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
3859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (i = 0; i < smbd_ndoorop; ++i) {
3869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States doorop = &smbd_doorops[i];
3879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
3889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (hdr->dh_op == doorop->opcode) {
3899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States hdr->dh_door_rc = doorop->op(arg);
3909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States hdr->dh_status = arg->status;
3919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
3929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((hdr->dh_flags & SMB_DF_SYSSPACE) &&
3939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (hdr->dh_flags & SMB_DF_ASYNC)) {
3949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States assert(hdr->dh_op != SMB_DR_ASYNC_RESPONSE);
395c5866007SKeyur Desai
396c5866007SKeyur Desai (void) mutex_lock(&smbd_doorsvc.sd_mutex);
397c5866007SKeyur Desai if (arg->response_abort) {
398c5866007SKeyur Desai free(arg->rbuf);
399c5866007SKeyur Desai arg->rbuf = NULL;
400c5866007SKeyur Desai smbd_door_release_async(arg);
401c5866007SKeyur Desai } else {
402c5866007SKeyur Desai arg->response_ready = B_TRUE;
403c5866007SKeyur Desai }
404c5866007SKeyur Desai (void) mutex_unlock(&smbd_doorsvc.sd_mutex);
405c5866007SKeyur Desai
4069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) smb_kmod_event_notify(hdr->dh_txid);
4079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (NULL);
4109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_ERR, "smbd_door_dispatch_op[%s]: invalid op %u",
4149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States arg->opname, hdr->dh_op);
415da6c28aaSamw return (NULL);
416da6c28aaSamw }
417da6c28aaSamw
4189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
4199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Wrapper for door_return. smbd_door_enter() increments a reference count
4209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * when a door call is dispatched and smbd_door_return() decrements the
4219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * reference count when it completes.
4229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
4239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * The reference counting is used in smbd_door_fini() to wait for active
4249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * calls to complete before closing the door.
4259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
4269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smbd_door_init(smbd_door_t * sdh,const char * name)4279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_init(smbd_door_t *sdh, const char *name)
4289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
429b819cea2SGordon Ross (void) strlcpy(sdh->sd_name, name, sizeof (sdh->sd_name));
4309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smbd_door_enter(smbd_door_t * sdh)4339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_enter(smbd_door_t *sdh)
4349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) mutex_lock(&sdh->sd_mutex);
4369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ++sdh->sd_ncalls;
4379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) mutex_unlock(&sdh->sd_mutex);
438da6c28aaSamw }
439da6c28aaSamw
440da6c28aaSamw /*
4419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * We have two calls to door_return because the first call (with data)
4429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * can fail, which can leave the door call blocked here. The second
4439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * call (with NULL) is guaranteed to unblock and return to the caller.
4449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
4459fb67ea3Safshin 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)4469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_return(smbd_door_t *sdh, char *data_ptr, size_t data_size,
4479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States door_desc_t *desc_ptr, uint_t num_desc)
4489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) mutex_lock(&sdh->sd_mutex);
4509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (sdh->sd_ncalls == 0)
4529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_ERR, "smbd_door_return[%s]: unexpected count=0",
4539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sdh->sd_name);
4549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else
4559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States --sdh->sd_ncalls;
4569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) cond_broadcast(&sdh->sd_cv);
4589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) mutex_unlock(&sdh->sd_mutex);
4599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) door_return(data_ptr, data_size, desc_ptr, num_desc);
4619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) door_return(NULL, 0, NULL, 0);
4629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* NOTREACHED */
4639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
4669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * A door service is about to terminate.
4679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Give active requests a small grace period to complete.
4689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
4699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smbd_door_fini(smbd_door_t * sdh)4709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_fini(smbd_door_t *sdh)
4719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States timestruc_t delay;
4739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc = 0;
4749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) mutex_lock(&sdh->sd_mutex);
4769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States while (rc != ETIME && sdh->sd_ncalls != 0) {
4789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States delay.tv_sec = 1;
4799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States delay.tv_nsec = 0;
4809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = cond_reltimedwait(&sdh->sd_cv, &sdh->sd_mutex, &delay);
4819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (sdh->sd_ncalls != 0)
4849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_NOTICE, "smbd_door_fini[%s]: %d remaining",
4859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sdh->sd_name, sdh->sd_ncalls);
4869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) mutex_unlock(&sdh->sd_mutex);
4889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
4919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Null door operation: always returns success.
4929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Assumes no request or response data.
493da6c28aaSamw */
494da6c28aaSamw /*ARGSUSED*/
4959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_null(smbd_arg_t * arg)4969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_null(smbd_arg_t *arg)
497da6c28aaSamw {
4989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_SUCCESS);
4993ad684d6Sjb150015 }
5003ad684d6Sjb150015
5019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
5029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Async response handler: setup the rbuf and rsize for the specified
5039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * transaction. This function is used by the kernel to collect the
5049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * response half of an asynchronous door call.
505c5866007SKeyur Desai *
506c5866007SKeyur Desai * If a door client attempts to collect a response before the op has
507c5866007SKeyur Desai * completed (!response_ready), mark the arg as response_abort and
508c5866007SKeyur Desai * set an error. The response will be discarded when the op completes.
5099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
5109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_async_response(smbd_arg_t * rsp_arg)5119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_async_response(smbd_arg_t *rsp_arg)
5129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
5139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_t *arg_list = &smbd_doorsvc.sd_async_list;
5149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_arg_t *arg;
5159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
5169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) mutex_lock(&smbd_doorsvc.sd_mutex);
5179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States arg = list_head(arg_list);
5189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
5199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States while (arg != NULL) {
520c5866007SKeyur Desai assert(arg->magic == SMBD_ARG_MAGIC);
521c5866007SKeyur Desai
5229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (arg->hdr.dh_txid == rsp_arg->hdr.dh_txid) {
523c5866007SKeyur Desai if (!arg->response_ready) {
524c5866007SKeyur Desai arg->response_abort = B_TRUE;
525c5866007SKeyur Desai rsp_arg->hdr.dh_door_rc = SMB_DOP_NOT_CALLED;
526c5866007SKeyur Desai syslog(LOG_NOTICE, "doorsvc[%s]: %u not ready",
527c5866007SKeyur Desai arg->opname, arg->hdr.dh_txid);
528c5866007SKeyur Desai break;
529c5866007SKeyur Desai }
530c5866007SKeyur Desai
5319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rsp_arg->rbuf = arg->rbuf;
5329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rsp_arg->rsize = arg->rsize;
5339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States arg->rbuf = NULL;
5349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States arg->rsize = 0;
5359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_door_release_async(arg);
5369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break;
537da6c28aaSamw }
538da6c28aaSamw
5399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States arg = list_next(arg_list, arg);
540da6c28aaSamw }
541da6c28aaSamw
5429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) mutex_unlock(&smbd_doorsvc.sd_mutex);
5439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_SUCCESS);
5449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
5469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_user_nonauth_logon(smbd_arg_t * arg)5479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_user_nonauth_logon(smbd_arg_t *arg)
5489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
549c5866007SKeyur Desai uint32_t sid = 0;
5509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
5519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_common_decode(arg->data, arg->datalen,
5529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States xdr_uint32_t, &sid) != 0)
5539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_DECODE_ERROR);
5549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
5559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_user_nonauth_logon(sid);
5569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_SUCCESS);
5579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
5599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_user_auth_logoff(smbd_arg_t * arg)5609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_user_auth_logoff(smbd_arg_t *arg)
5619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
562c5866007SKeyur Desai uint32_t sid = 0;
5639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
5649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_common_decode(arg->data, arg->datalen,
5659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States xdr_uint32_t, &sid) != 0)
5669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_DECODE_ERROR);
5679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
5689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_user_auth_logoff(sid);
5699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_SUCCESS);
5709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
5729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
5739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Obtains an access token on successful user authentication.
5749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
5759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_user_auth_logon(smbd_arg_t * arg)5769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_user_auth_logon(smbd_arg_t *arg)
5779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
57812b65585SGordon Ross _NOTE(ARGUNUSED(arg))
5799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
58012b65585SGordon Ross /* No longer used */
5819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_EMPTYBUF);
5829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
5849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_lookup_name(smbd_arg_t * arg)5859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_lookup_name(smbd_arg_t *arg)
5869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
5879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_domain_t dinfo;
5889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_account_t ainfo;
5899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States lsa_account_t acct;
5909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char buf[MAXNAMELEN];
5919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
592c5866007SKeyur Desai bzero(&acct, sizeof (lsa_account_t));
593c5866007SKeyur Desai
5949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_common_decode(arg->data, arg->datalen,
5959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States lsa_account_xdr, &acct) != 0)
5969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_DECODE_ERROR);
5979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
5989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (*acct.a_domain == '\0')
5999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(buf, MAXNAMELEN, "%s", acct.a_name);
6009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else if (strchr(acct.a_domain, '.') != NULL)
6019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(buf, MAXNAMELEN, "%s@%s", acct.a_name,
6029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States acct.a_domain);
603da6c28aaSamw else
6049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(buf, MAXNAMELEN, "%s\\%s", acct.a_domain,
6059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States acct.a_name);
6069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
6079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States acct.a_status = lsa_lookup_name(buf, acct.a_sidtype, &ainfo);
6089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (acct.a_status == NT_STATUS_SUCCESS) {
6099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States acct.a_sidtype = ainfo.a_type;
6109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sid_tostr(ainfo.a_sid, acct.a_sid);
6119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(acct.a_name, ainfo.a_name, MAXNAMELEN);
6129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
6139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_domain_lookup_name(ainfo.a_domain, &dinfo))
6149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(acct.a_domain, dinfo.di_fqname,
6159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States MAXNAMELEN);
6169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else
6179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(acct.a_domain, ainfo.a_domain,
6189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States MAXNAMELEN);
6199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_account_free(&ainfo);
620da6c28aaSamw }
621da6c28aaSamw
6229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States arg->rbuf = smb_common_encode(&acct, lsa_account_xdr, &arg->rsize);
6239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
6249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (arg->rbuf == NULL)
6259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_ENCODE_ERROR);
6269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_SUCCESS);
6279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
6299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_lookup_sid(smbd_arg_t * arg)6309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_lookup_sid(smbd_arg_t *arg)
6319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
6329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_domain_t dinfo;
6339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_account_t ainfo;
6349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States lsa_account_t acct;
6359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sid_t *sid;
6369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
637c5866007SKeyur Desai bzero(&acct, sizeof (lsa_account_t));
638c5866007SKeyur Desai
6399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_common_decode(arg->data, arg->datalen,
6409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States lsa_account_xdr, &acct) != 0)
6419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_DECODE_ERROR);
6429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
6439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sid = smb_sid_fromstr(acct.a_sid);
6449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States acct.a_status = lsa_lookup_sid(sid, &ainfo);
6459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sid_free(sid);
6469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
6479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (acct.a_status == NT_STATUS_SUCCESS) {
6489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States acct.a_sidtype = ainfo.a_type;
6499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sid_tostr(ainfo.a_sid, acct.a_sid);
6509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(acct.a_name, ainfo.a_name, MAXNAMELEN);
6519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
6529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_domain_lookup_name(ainfo.a_domain, &dinfo))
6539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(acct.a_domain, dinfo.di_fqname,
6549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States MAXNAMELEN);
6559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else
6569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(acct.a_domain, ainfo.a_domain,
6579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States MAXNAMELEN);
6589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
6599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_account_free(&ainfo);
6609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
6629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States arg->rbuf = smb_common_encode(&acct, lsa_account_xdr, &arg->rsize);
6639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
6649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (arg->rbuf == NULL)
6659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_ENCODE_ERROR);
6669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_SUCCESS);
6679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
6699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_join(smbd_arg_t * arg)6709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_join(smbd_arg_t *arg)
6719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
6729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_joininfo_t jdi;
673b3700b07SGordon Ross smb_joinres_t jdres;
6749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
675c5866007SKeyur Desai bzero(&jdi, sizeof (smb_joininfo_t));
676b3700b07SGordon Ross bzero(&jdres, sizeof (smb_joinres_t));
677c5866007SKeyur Desai
6789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_common_decode(arg->data, arg->datalen,
6799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_joininfo_xdr, &jdi) != 0)
6809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_DECODE_ERROR);
6819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
682b3700b07SGordon Ross smbd_join(&jdi, &jdres);
6839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
684b3700b07SGordon Ross arg->rbuf = smb_common_encode(&jdres, smb_joinres_xdr, &arg->rsize);
6859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
6869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (arg->rbuf == NULL)
6879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_ENCODE_ERROR);
6889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_SUCCESS);
6899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
6919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_get_dcinfo(smbd_arg_t * arg)6929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_get_dcinfo(smbd_arg_t *arg)
6939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
6949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_domainex_t dxi;
6959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
6969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!smb_domain_getinfo(&dxi))
6979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_EMPTYBUF);
6989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
699b3700b07SGordon Ross arg->rbuf = smb_string_encode(dxi.d_dci.dc_name, &arg->rsize);
7009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (arg->rbuf == NULL)
7029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_ENCODE_ERROR);
7039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_SUCCESS);
7049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
7079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Return the number of snapshots for a dataset
7089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
7099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_vss_get_count(smbd_arg_t * arg)7109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_vss_get_count(smbd_arg_t *arg)
7119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
7129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_string_t path;
7139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t count;
7149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(&path, sizeof (smb_string_t));
7169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States arg->rbuf = NULL;
7179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_string_decode(&path, arg->data, arg->datalen) != 0)
7199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_DECODE_ERROR);
7209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smbd_vss_get_count(path.buf, &count) == 0)
7229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States arg->rbuf = smb_common_encode(&count, xdr_uint32_t,
7239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States &arg->rsize);
7249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States xdr_free(smb_string_xdr, (char *)&path);
7269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (arg->rbuf == NULL)
7289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_ENCODE_ERROR);
7299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_SUCCESS);
7309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
7339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Return the count and list of snapshots.
7349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * The list is in @GMT token format.
7359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
7369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_vss_get_snapshots(smbd_arg_t * arg)7379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_vss_get_snapshots(smbd_arg_t *arg)
7389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
7399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char **gmtp;
7409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_gmttoken_query_t request;
7419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_gmttoken_response_t reply;
7429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint_t i;
7439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(&request, sizeof (smb_gmttoken_query_t));
7459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(&reply, sizeof (smb_gmttoken_response_t));
7469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_common_decode(arg->data, arg->datalen,
7489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_gmttoken_query_xdr, &request) != 0)
7499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_DECODE_ERROR);
7509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States reply.gtr_gmttokens.gtr_gmttokens_val = malloc(request.gtq_count *
7529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sizeof (char *));
7539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(reply.gtr_gmttokens.gtr_gmttokens_val, request.gtq_count *
7549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sizeof (char *));
7559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (reply.gtr_gmttokens.gtr_gmttokens_val == NULL) {
7579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States xdr_free(smb_gmttoken_query_xdr, (char *)&request);
7589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_EMPTYBUF);
7599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_vss_get_snapshots(request.gtq_path, request.gtq_count,
7629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States &reply.gtr_count,
7639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States &reply.gtr_gmttokens.gtr_gmttokens_len,
7649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States reply.gtr_gmttokens.gtr_gmttokens_val);
7659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States arg->rbuf = smb_common_encode(&reply, smb_gmttoken_response_xdr,
7679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States &arg->rsize);
7689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (arg->rbuf == NULL) {
7699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States xdr_free(smb_gmttoken_query_xdr, (char *)&request);
7709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_ENCODE_ERROR);
7719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (i = 0, gmtp = reply.gtr_gmttokens.gtr_gmttokens_val;
7749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (i < request.gtq_count); i++) {
7759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (*gmtp)
7769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(*gmtp);
7779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States gmtp++;
7789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(reply.gtr_gmttokens.gtr_gmttokens_val);
7819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States xdr_free(smb_gmttoken_query_xdr, (char *)&request);
7829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_SUCCESS);
7839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
7869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Return the name of the snapshot that matches the dataset path
7879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * and @GMT token.
7889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
7899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_vss_map_gmttoken(smbd_arg_t * arg)7909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_vss_map_gmttoken(smbd_arg_t *arg)
7919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
7929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *snapname;
7939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_gmttoken_snapname_t request;
7949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(&request, sizeof (smb_gmttoken_snapname_t));
7969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_common_decode(arg->data, arg->datalen,
7989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_gmttoken_snapname_xdr, &request) != 0) {
7999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States xdr_free(smb_gmttoken_snapname_xdr, (char *)&request);
8009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_DECODE_ERROR);
8019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((snapname = malloc(MAXPATHLEN)) == NULL) {
8049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States xdr_free(smb_gmttoken_snapname_xdr, (char *)&request);
8059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (NULL);
8069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((smbd_vss_map_gmttoken(request.gts_path, request.gts_gmttoken,
809*a90cf9f2SGordon Ross request.gts_toktime, snapname) != 0)) {
8109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *snapname = '\0';
8119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States arg->rbuf = smb_string_encode(snapname, &arg->rsize);
8149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States xdr_free(smb_gmttoken_snapname_xdr, (char *)&request);
8159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(snapname);
8169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (arg->rbuf == NULL)
8189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_ENCODE_ERROR);
8199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_SUCCESS);
8209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_ads_find_host(smbd_arg_t * arg)8239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_ads_find_host(smbd_arg_t *arg)
8249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
8259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_ads_host_info_t *hinfo = NULL;
8269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *hostname = "";
8279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_string_t fqdn;
8289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(&fqdn, sizeof (smb_string_t));
8309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_string_decode(&fqdn, arg->data, arg->datalen) != 0)
8329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_DECODE_ERROR);
8339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
834b3700b07SGordon Ross if ((hinfo = smb_ads_find_host(fqdn.buf)) != NULL)
8359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States hostname = hinfo->name;
8369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States xdr_free(smb_string_xdr, (char *)&fqdn);
8389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States arg->rbuf = smb_string_encode(hostname, &arg->rsize);
8409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(hinfo);
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 /*
8489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Query the list of user/group quota entries for a given filesystem.
8499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
8509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_quota_query(smbd_arg_t * arg)8519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_quota_query(smbd_arg_t *arg)
8529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
8539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_query_t request;
8549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_response_t reply;
8559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status;
8569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(&request, sizeof (smb_quota_query_t));
8589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(&reply, sizeof (smb_quota_response_t));
8599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_common_decode(arg->data, arg->datalen,
8619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_query_xdr, &request) != 0)
8629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_DECODE_ERROR);
8639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = smb_quota_query(&request, &reply);
8659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States reply.qr_status = status;
8669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States arg->rbuf = smb_common_encode(&reply, smb_quota_response_xdr,
8689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States &arg->rsize);
8699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States xdr_free(smb_quota_query_xdr, (char *)&request);
8719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_free(&reply);
8729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (arg->rbuf == NULL)
8749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_ENCODE_ERROR);
8759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_SUCCESS);
8769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
8799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Set a list of user/group quota entries for a given filesystem.
8809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
8819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smbd_dop_quota_set(smbd_arg_t * arg)8829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_quota_set(smbd_arg_t *arg)
8839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
8849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_set_t request;
8859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status = 0;
8869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(&request, sizeof (smb_quota_set_t));
8889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_common_decode(arg->data, arg->datalen,
8909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_set_xdr, &request) != 0)
8919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_DECODE_ERROR);
8929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = smb_quota_set(&request);
8949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States arg->rbuf = smb_common_encode(&status, xdr_uint32_t, &arg->rsize);
8969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States xdr_free(smb_quota_set_xdr, (char *)&request);
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 static int
smbd_dop_dfs_get_referrals(smbd_arg_t * arg)9049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbd_dop_dfs_get_referrals(smbd_arg_t *arg)
9059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
9069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_referral_query_t request;
9079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_referral_response_t reply;
9089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(&request, sizeof (request));
9109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(&reply, sizeof (reply));
9119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_common_decode(arg->data, arg->datalen,
9139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_referral_query_xdr, &request) != 0)
9149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_DECODE_ERROR);
9159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States reply.rp_status = dfs_get_referrals((const char *)request.rq_path,
9179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States request.rq_type, &reply.rp_referrals);
9189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (reply.rp_status != ERROR_SUCCESS)
9209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(&reply.rp_referrals, sizeof (dfs_info_t));
9219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States arg->rbuf = smb_common_encode(&reply, dfs_referral_response_xdr,
9239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States &arg->rsize);
9249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (reply.rp_status == ERROR_SUCCESS)
9269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_free(&reply.rp_referrals);
9279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States xdr_free(dfs_referral_query_xdr, (char *)&request);
9299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (arg->rbuf == NULL)
9319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_ENCODE_ERROR);
9329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_DOP_SUCCESS);
933da6c28aaSamw }
934148c5f43SAlan Wright
935148c5f43SAlan Wright static int
smbd_dop_shr_hostaccess(smbd_arg_t * arg)936148c5f43SAlan Wright smbd_dop_shr_hostaccess(smbd_arg_t *arg)
937148c5f43SAlan Wright {
938148c5f43SAlan Wright smb_shr_hostaccess_query_t request;
939148c5f43SAlan Wright uint32_t reply;
940148c5f43SAlan Wright
941148c5f43SAlan Wright bzero(&request, sizeof (request));
942148c5f43SAlan Wright bzero(&reply, sizeof (reply));
943148c5f43SAlan Wright
944148c5f43SAlan Wright if (smb_common_decode(arg->data, arg->datalen,
945148c5f43SAlan Wright smb_shr_hostaccess_query_xdr, &request) != 0)
946148c5f43SAlan Wright return (SMB_DOP_DECODE_ERROR);
947148c5f43SAlan Wright
948148c5f43SAlan Wright reply = smb_shr_hostaccess(&request.shq_ipaddr, request.shq_none,
949148c5f43SAlan Wright request.shq_ro, request.shq_rw, request.shq_flag);
950148c5f43SAlan Wright
951148c5f43SAlan Wright arg->rbuf = smb_common_encode(&reply, xdr_uint32_t, &arg->rsize);
952148c5f43SAlan Wright
953148c5f43SAlan Wright xdr_free(smb_shr_hostaccess_query_xdr, (char *)&request);
954148c5f43SAlan Wright
955148c5f43SAlan Wright if (arg->rbuf == NULL)
956148c5f43SAlan Wright return (SMB_DOP_ENCODE_ERROR);
957148c5f43SAlan Wright return (SMB_DOP_SUCCESS);
958148c5f43SAlan Wright }
959148c5f43SAlan Wright
960148c5f43SAlan Wright static int
smbd_dop_shr_exec(smbd_arg_t * arg)961148c5f43SAlan Wright smbd_dop_shr_exec(smbd_arg_t *arg)
962148c5f43SAlan Wright {
963148c5f43SAlan Wright smb_shr_execinfo_t request;
964148c5f43SAlan Wright int reply;
965148c5f43SAlan Wright
966148c5f43SAlan Wright bzero(&request, sizeof (request));
967148c5f43SAlan Wright bzero(&reply, sizeof (reply));
968148c5f43SAlan Wright
969148c5f43SAlan Wright if (smb_common_decode(arg->data, arg->datalen,
970148c5f43SAlan Wright smb_shr_execinfo_xdr, &request) != 0)
971148c5f43SAlan Wright return (SMB_DOP_DECODE_ERROR);
972148c5f43SAlan Wright
973148c5f43SAlan Wright reply = smb_shr_exec(&request);
974148c5f43SAlan Wright
975148c5f43SAlan Wright if (reply != 0)
976148c5f43SAlan Wright syslog(LOG_NOTICE, "Failed to execute %s command",
977148c5f43SAlan Wright (request.e_type == SMB_EXEC_MAP) ? "map" : "unmap");
978148c5f43SAlan Wright
979148c5f43SAlan Wright arg->rbuf = smb_common_encode(&reply, xdr_int, &arg->rsize);
980148c5f43SAlan Wright
981148c5f43SAlan Wright xdr_free(smb_shr_execinfo_xdr, (char *)&request);
982148c5f43SAlan Wright
983148c5f43SAlan Wright if (arg->rbuf == NULL)
984148c5f43SAlan Wright return (SMB_DOP_ENCODE_ERROR);
985148c5f43SAlan Wright return (SMB_DOP_SUCCESS);
986148c5f43SAlan Wright }
987b3700b07SGordon Ross
988b3700b07SGordon Ross /* ARGSUSED */
989b3700b07SGordon Ross static int
smbd_dop_notify_dc_changed(smbd_arg_t * arg)990b3700b07SGordon Ross smbd_dop_notify_dc_changed(smbd_arg_t *arg)
991b3700b07SGordon Ross {
992b3700b07SGordon Ross
993b3700b07SGordon Ross smbd_dc_monitor_refresh();
994b3700b07SGordon Ross
995b3700b07SGordon Ross return (SMB_DOP_SUCCESS);
996b3700b07SGordon Ross }
997