2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego/*
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * CDDL HEADER START
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego *
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * The contents of this file are subject to the terms of the
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * Common Development and Distribution License (the "License").
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * You may not use this file except in compliance with the License.
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego *
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * or http://www.opensolaris.org/os/licensing.
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * See the License for the specific language governing permissions
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * and limitations under the License.
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego *
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * When distributing Covered Code, include this CDDL HEADER in each
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * If applicable, add the following below this CDDL HEADER, with the
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * fields enclosed by brackets "[]" replaced with your own identifying
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * information: Portions Copyright [yyyy] [name of copyright owner]
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego *
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * CDDL HEADER END
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego */
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego/*
f96bd5c800e73e351b0b6e4bd7f00b578dad29bbAlan Wright * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * Use is subject to license terms.
5fd03bc0f2e00e7ba02316c2e08f45d52aab15dbGordon Ross *
5fd03bc0f2e00e7ba02316c2e08f45d52aab15dbGordon Ross * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego */
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown#include <smbsrv/smb_kproto.h>
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego#include <smbsrv/smbinfo.h>
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego#include <smbsrv/smb_fsops.h>
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego/*
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * The create directory message is sent to create a new directory. The
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * appropriate Tid and additional pathname are passed. The directory must
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * not exist for it to be created.
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego *
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * Client Request Description
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * ================================== =================================
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * UCHAR WordCount; Count of parameter words = 0
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * USHORT ByteCount; Count of data bytes; min = 2
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * UCHAR BufferFormat; 0x04
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * STRING DirectoryName[]; Directory name
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego *
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * Servers require clients to have at least create permission for the
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * subtree containing the directory in order to create a new directory.
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * The creator's access rights to the new directory are be determined by
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * local policy on the server.
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego *
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * Server Response Description
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * ================================== =================================
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * UCHAR WordCount; Count of parameter words = 0
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * USHORT ByteCount; Count of data bytes = 0
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego */
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borregosmb_sdrc_t
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borregosmb_pre_create_directory(smb_request_t *sr)
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego{
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego int rc;
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
eb1d736b1c19f6abeee90c921a9320b67fedd016afshin salek ardakani - Sun Microsystems - Irvine United States rc = smbsr_decode_data(sr, "%S", sr,
eb1d736b1c19f6abeee90c921a9320b67fedd016afshin salek ardakani - Sun Microsystems - Irvine United States &sr->arg.dirop.fqi.fq_path.pn_path);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego DTRACE_SMB_2(op__CreateDirectory__start, smb_request_t *, sr,
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego struct dirop *, &sr->arg.dirop);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego}
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borregovoid
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borregosmb_post_create_directory(smb_request_t *sr)
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego{
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego DTRACE_SMB_1(op__CreateDirectory__done, smb_request_t *, sr);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego}
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borregosmb_sdrc_t
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borregosmb_com_create_directory(smb_request_t *sr)
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego{
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego int rc = 0;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier smb_pathname_t *pn = &sr->arg.dirop.fqi.fq_path;
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego if (!STYPE_ISDSK(sr->tid_tree->t_res_type)) {
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego smbsr_error(sr, NT_STATUS_ACCESS_DENIED,
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego ERRDOS, ERROR_ACCESS_DENIED);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return (SDRC_ERROR);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego }
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier smb_pathname_init(sr, pn, pn->pn_path);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier if (!smb_pathname_validate(sr, pn) ||
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier !smb_validate_dirname(sr, pn)) {
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return (SDRC_ERROR);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego }
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier if ((rc = smb_common_create_directory(sr)) != 0) {
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier smbsr_errno(sr, rc);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return (SDRC_ERROR);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego }
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego rc = smbsr_encode_empty_result(sr);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego}
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego/*
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * smb_common_create_directory
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego *
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * Currently called from:
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * smb_com_create_directory
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * smb_com_trans2_create_directory
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego *
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * Returns errno values.
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego */
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borregoint
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borregosmb_common_create_directory(smb_request_t *sr)
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego{
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego int rc;
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego smb_attr_t new_attr;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_fqi_t *fqi;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_t *tnode;
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai fqi = &sr->arg.dirop.fqi;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai tnode = sr->tid_tree->t_snode;
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = smb_pathname_reduce(sr, sr->user_cr, fqi->fq_path.pn_path,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai tnode, tnode, &fqi->fq_dnode, fqi->fq_last_comp);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (rc != 0)
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return (rc);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier if (smb_is_invalid_filename(fqi->fq_last_comp)) {
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier smb_node_release(fqi->fq_dnode);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier return (EILSEQ); /* NT_STATUS_OBJECT_NAME_INVALID */
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier }
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai /* lookup node - to ensure that it does NOT exist */
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = smb_fsop_lookup(sr, sr->user_cr, SMB_FOLLOW_LINKS,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai tnode, fqi->fq_dnode, fqi->fq_last_comp, &fqi->fq_fnode);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (rc == 0) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_release(fqi->fq_dnode);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_release(fqi->fq_fnode);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (EEXIST);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (rc != ENOENT) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_release(fqi->fq_dnode);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (rc);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = smb_fsop_access(sr, sr->user_cr, fqi->fq_dnode,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai FILE_ADD_SUBDIRECTORY);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (rc != NT_STATUS_SUCCESS) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_release(fqi->fq_dnode);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return (EACCES);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego /*
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * Explicitly set sa_dosattr, otherwise the file system may
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * automatically apply FILE_ATTRIBUTE_ARCHIVE which, for
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * compatibility with windows servers, should not be set.
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego */
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego bzero(&new_attr, sizeof (new_attr));
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego new_attr.sa_dosattr = FILE_ATTRIBUTE_DIRECTORY;
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego new_attr.sa_vattr.va_type = VDIR;
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego new_attr.sa_vattr.va_mode = 0777;
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego new_attr.sa_mask = SMB_AT_TYPE | SMB_AT_MODE | SMB_AT_DOSATTR;
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = smb_fsop_mkdir(sr, sr->user_cr, fqi->fq_dnode, fqi->fq_last_comp,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai &new_attr, &fqi->fq_fnode);
037cac007b685e7ea79f6ef7e8e62bfd342a4d56joyce mcintosh if (rc != 0) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_release(fqi->fq_dnode);
037cac007b685e7ea79f6ef7e8e62bfd342a4d56joyce mcintosh return (rc);
037cac007b685e7ea79f6ef7e8e62bfd342a4d56joyce mcintosh }
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego sr->arg.open.create_options = FILE_DIRECTORY_FILE;
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_release(fqi->fq_dnode);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_release(fqi->fq_fnode);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return (0);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego}
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego/*
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * The delete directory message is sent to delete an empty directory. The
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * appropriate Tid and additional pathname are passed. The directory must
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * be empty for it to be deleted.
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego *
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * NT supports a hidden permission known as File Delete Child (FDC). If
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * the user has FullControl access to a directory, the user is permitted
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * to delete any object in the directory regardless of the permissions
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * on the object.
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego *
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * Client Request Description
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * ================================== =================================
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * UCHAR WordCount; Count of parameter words = 0
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * USHORT ByteCount; Count of data bytes; min = 2
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * UCHAR BufferFormat; 0x04
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * STRING DirectoryName[]; Directory name
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego *
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * The directory to be deleted cannot be the root of the share specified
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * by Tid.
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego *
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * Server Response Description
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * ================================== =================================
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * UCHAR WordCount; Count of parameter words = 0
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * USHORT ByteCount; Count of data bytes = 0
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego */
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borregosmb_sdrc_t
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borregosmb_pre_delete_directory(smb_request_t *sr)
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego{
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego int rc;
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
eb1d736b1c19f6abeee90c921a9320b67fedd016afshin salek ardakani - Sun Microsystems - Irvine United States rc = smbsr_decode_data(sr, "%S", sr,
eb1d736b1c19f6abeee90c921a9320b67fedd016afshin salek ardakani - Sun Microsystems - Irvine United States &sr->arg.dirop.fqi.fq_path.pn_path);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego DTRACE_SMB_2(op__DeleteDirectory__start, smb_request_t *, sr,
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego struct dirop *, &sr->arg.dirop);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego}
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borregovoid
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borregosmb_post_delete_directory(smb_request_t *sr)
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego{
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego DTRACE_SMB_1(op__DeleteDirectory__done, smb_request_t *, sr);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego}
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borregosmb_sdrc_t
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borregosmb_com_delete_directory(smb_request_t *sr)
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego{
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego int rc;
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States uint32_t flags = 0;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_fqi_t *fqi;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_t *tnode;
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego if (!STYPE_ISDSK(sr->tid_tree->t_res_type)) {
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego smbsr_error(sr, NT_STATUS_ACCESS_DENIED,
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego ERRDOS, ERROR_ACCESS_DENIED);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return (SDRC_ERROR);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego }
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai fqi = &sr->arg.dirop.fqi;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai tnode = sr->tid_tree->t_snode;
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier smb_pathname_init(sr, &fqi->fq_path, fqi->fq_path.pn_path);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier if (!smb_pathname_validate(sr, &fqi->fq_path) ||
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier !smb_validate_dirname(sr, &fqi->fq_path)) {
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier return (SDRC_ERROR);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier }
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = smb_pathname_reduce(sr, sr->user_cr, fqi->fq_path.pn_path,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai tnode, tnode, &fqi->fq_dnode, fqi->fq_last_comp);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (rc != 0) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smbsr_errno(sr, rc);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (SDRC_ERROR);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = smb_fsop_lookup(sr, sr->user_cr, SMB_FOLLOW_LINKS,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai tnode, fqi->fq_dnode, fqi->fq_last_comp, &fqi->fq_fnode);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (rc != 0) {
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego if (rc == ENOENT)
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego smbsr_error(sr, NT_STATUS_OBJECT_NAME_NOT_FOUND,
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego ERRDOS, ERROR_FILE_NOT_FOUND);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego else
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego smbsr_errno(sr, rc);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_release(fqi->fq_dnode);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return (SDRC_ERROR);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego }
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States /*
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * Delete should fail if this is the root of a share
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * or a DFS link
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if ((fqi->fq_fnode == tnode) || smb_node_is_dfslink(fqi->fq_fnode)) {
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier smbsr_error(sr, NT_STATUS_ACCESS_DENIED,
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier ERRDOS, ERROR_ACCESS_DENIED);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier smb_node_release(fqi->fq_dnode);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier smb_node_release(fqi->fq_fnode);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier return (SDRC_ERROR);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier }
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (!smb_node_is_dir(fqi->fq_fnode)) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_NOT_A_DIRECTORY,
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States ERRDOS, ERROR_PATH_NOT_FOUND);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_release(fqi->fq_dnode);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_release(fqi->fq_fnode);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (SDRC_ERROR);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
5fd03bc0f2e00e7ba02316c2e08f45d52aab15dbGordon Ross /*
5fd03bc0f2e00e7ba02316c2e08f45d52aab15dbGordon Ross * Using kcred because we just want the DOS attrs
5fd03bc0f2e00e7ba02316c2e08f45d52aab15dbGordon Ross * and don't want access errors for this.
5fd03bc0f2e00e7ba02316c2e08f45d52aab15dbGordon Ross */
5fd03bc0f2e00e7ba02316c2e08f45d52aab15dbGordon Ross fqi->fq_fattr.sa_mask = SMB_AT_DOSATTR;
8622ec4569457733001d4982ef7f5b44427069beGordon Ross rc = smb_node_getattr(sr, fqi->fq_fnode, zone_kcred(), NULL,
5fd03bc0f2e00e7ba02316c2e08f45d52aab15dbGordon Ross &fqi->fq_fattr);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (rc != 0) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smbsr_errno(sr, rc);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_release(fqi->fq_dnode);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_release(fqi->fq_fnode);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return (SDRC_ERROR);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego }
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if ((fqi->fq_fattr.sa_dosattr & FILE_ATTRIBUTE_READONLY) ||
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai (smb_fsop_access(sr, sr->user_cr, fqi->fq_fnode, DELETE)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai != NT_STATUS_SUCCESS)) {
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego smbsr_error(sr, NT_STATUS_CANNOT_DELETE,
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego ERRDOS, ERROR_ACCESS_DENIED);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_release(fqi->fq_dnode);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_release(fqi->fq_fnode);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return (SDRC_ERROR);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego }
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States if (SMB_TREE_SUPPORTS_CATIA(sr))
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States flags |= SMB_CATIA;
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = smb_fsop_rmdir(sr, sr->user_cr, fqi->fq_dnode,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai fqi->fq_fnode->od_name, flags);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_release(fqi->fq_fnode);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_release(fqi->fq_dnode);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego if (rc != 0) {
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego if (rc == EEXIST)
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego smbsr_error(sr, NT_STATUS_DIRECTORY_NOT_EMPTY,
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego ERRDOS, ERROR_DIR_NOT_EMPTY);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego else
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego smbsr_errno(sr, rc);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return (SDRC_ERROR);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego }
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego rc = smbsr_encode_empty_result(sr);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego}
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego/*
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * This SMB is used to verify that a path exists and is a directory. No
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * error is returned if the given path exists and the client has read
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * access to it. Client machines which maintain a concept of a "working
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * directory" will find this useful to verify the validity of a "change
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * working directory" command. Note that the servers do NOT have a concept
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * of working directory for a particular client. The client must always
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * supply full pathnames relative to the Tid in the SMB header.
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego *
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * Client Request Description
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * ================================== =================================
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego *
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * UCHAR WordCount; Count of parameter words = 0
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * USHORT ByteCount; Count of data bytes; min = 2
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * UCHAR BufferFormat; 0x04
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * STRING DirectoryPath[]; Directory path
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego *
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * Server Response Description
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * ================================== =================================
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego *
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * UCHAR WordCount; Count of parameter words = 0
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * USHORT ByteCount; Count of data bytes = 0
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego *
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * DOS clients, in particular, depend on ERRbadpath if the directory is
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego * not found.
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego */
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borregosmb_sdrc_t
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borregosmb_pre_check_directory(smb_request_t *sr)
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego{
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego int rc;
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
eb1d736b1c19f6abeee90c921a9320b67fedd016afshin salek ardakani - Sun Microsystems - Irvine United States rc = smbsr_decode_data(sr, "%S", sr,
eb1d736b1c19f6abeee90c921a9320b67fedd016afshin salek ardakani - Sun Microsystems - Irvine United States &sr->arg.dirop.fqi.fq_path.pn_path);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego DTRACE_SMB_2(op__CheckDirectory__start, smb_request_t *, sr,
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego struct dirop *, &sr->arg.dirop);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego}
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borregovoid
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borregosmb_post_check_directory(smb_request_t *sr)
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego{
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego DTRACE_SMB_1(op__CheckDirectory__done, smb_request_t *, sr);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego}
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borregosmb_sdrc_t
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borregosmb_com_check_directory(smb_request_t *sr)
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego{
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego int rc;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_fqi_t *fqi;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_t *tnode;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_node_t *node;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai char *path;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier smb_pathname_t *pn;
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
f96bd5c800e73e351b0b6e4bd7f00b578dad29bbAlan Wright if (STYPE_ISIPC(sr->tid_tree->t_res_type)) {
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego smbsr_error(sr, NT_STATUS_ACCESS_DENIED, ERRDOS,
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego ERROR_ACCESS_DENIED);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return (SDRC_ERROR);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego }
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai fqi = &sr->arg.dirop.fqi;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier pn = &fqi->fq_path;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier if (pn->pn_path[0] == '\0') {
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego rc = smbsr_encode_empty_result(sr);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego }
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier smb_pathname_init(sr, pn, pn->pn_path);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier if (!smb_pathname_validate(sr, pn) ||
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier !smb_validate_dirname(sr, pn)) {
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return (SDRC_ERROR);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego }
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier path = pn->pn_path;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai tnode = sr->tid_tree->t_snode;
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = smb_pathname_reduce(sr, sr->user_cr, path, tnode, tnode,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai &fqi->fq_dnode, fqi->fq_last_comp);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (rc != 0) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smbsr_errno(sr, rc);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (SDRC_ERROR);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = smb_fsop_lookup(sr, sr->user_cr, SMB_FOLLOW_LINKS,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai tnode, fqi->fq_dnode, fqi->fq_last_comp, &fqi->fq_fnode);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_release(fqi->fq_dnode);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (rc != 0) {
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego if (rc == ENOENT)
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego smbsr_error(sr, NT_STATUS_OBJECT_NAME_NOT_FOUND,
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego ERRDOS, ERROR_PATH_NOT_FOUND);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego else
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego smbsr_errno(sr, rc);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return (SDRC_ERROR);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego }
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States node = fqi->fq_fnode;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (!smb_node_is_dir(node)) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_NOT_A_DIRECTORY,
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States ERRDOS, ERROR_PATH_NOT_FOUND);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_node_release(node);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (SDRC_ERROR);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if ((sr->smb_flg2 & SMB_FLAGS2_DFS) && smb_node_is_dfslink(node)) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_node_release(node);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return (SDRC_ERROR);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego }
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_fsop_access(sr, sr->user_cr, node, FILE_TRAVERSE);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_node_release(node);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego if (rc != 0) {
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego smbsr_error(sr, NT_STATUS_ACCESS_DENIED,
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego ERRDOS, ERROR_ACCESS_DENIED);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return (SDRC_ERROR);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego }
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego rc = smbsr_encode_empty_result(sr);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego}