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