smb_set_fileinfo.c revision bbf6f00c25b6a2bed23c35eac6d62998ecdb338c
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * CDDL HEADER START
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * The contents of this file are subject to the terms of the
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Common Development and Distribution License (the "License").
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * You may not use this file except in compliance with the License.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * See the License for the specific language governing permissions
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * and limitations under the License.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * When distributing Covered Code, include this CDDL HEADER in each
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * If applicable, add the following below this CDDL HEADER, with the
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * fields enclosed by brackets "[]" replaced with your own identifying
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * information: Portions Copyright [yyyy] [name of copyright owner]
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * CDDL HEADER END
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Use is subject to license terms.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Trans2 Set File/Path Information Levels:
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * SMB_INFO_STANDARD
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * SMB_INFO_SET_EAS
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * SMB_SET_FILE_BASIC_INFO
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * SMB_SET_FILE_DISPOSITION_INFO
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * SMB_SET_FILE_END_OF_FILE_INFO
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * SMB_SET_FILE_ALLOCATION_INFO
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Handled Passthrough levels:
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown * SMB_FILE_BASIC_INFORMATION
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown * SMB_FILE_RENAME_INFORMATION
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * SMB_FILE_LINK_INFORMATION
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * SMB_FILE_DISPOSITION_INFORMATION
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * SMB_FILE_END_OF_FILE_INFORMATION
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * SMB_FILE_ALLOCATION_INFORMATION
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Internal levels representing non trans2 requests
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * SMB_SET_INFORMATION
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * SMB_SET_INFORMATION2
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Setting timestamps:
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * The behaviour when the time field is set to -1 is not documented
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * but is generally treated like 0, meaning that that server file
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * system assigned value need not be changed.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Setting attributes - FILE_ATTRIBUTE_NORMAL:
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * SMB_SET_INFORMATION -
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * - if the specified attributes have ONLY FILE_ATTRIBUTE_NORMAL set
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * do NOT change the file's attributes.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * SMB_SET_BASIC_INFO -
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * - if the specified attributes have ONLY FILE_ATTRIBUTE_NORMAL set
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * clear (0) the file's attributes.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * - if the specified attributes are 0 do NOT change the file's
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * attributes.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaitypedef struct smb_setinfo {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * These functions all return 0 (success) or -1 (error).
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * They set error details in the sr when appropriate.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesstatic int smb_set_by_fid(smb_request_t *, smb_xa_t *, uint16_t);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaistatic int smb_set_by_path(smb_request_t *, smb_xa_t *, uint16_t, char *);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaistatic int smb_set_fileinfo(smb_request_t *, smb_setinfo_t *);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaistatic int smb_set_information(smb_request_t *, smb_setinfo_t *);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaistatic int smb_set_information2(smb_request_t *, smb_setinfo_t *);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaistatic int smb_set_standard_info(smb_request_t *, smb_setinfo_t *);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaistatic int smb_set_basic_info(smb_request_t *, smb_setinfo_t *);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaistatic int smb_set_disposition_info(smb_request_t *, smb_setinfo_t *);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaistatic int smb_set_eof_info(smb_request_t *sr, smb_setinfo_t *);
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brownstatic int smb_set_alloc_info(smb_request_t *sr, smb_setinfo_t *);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaistatic int smb_set_rename_info(smb_request_t *sr, smb_setinfo_t *);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_com_trans2_set_file_information
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_com_trans2_set_file_information(smb_request_t *sr, smb_xa_t *xa)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_com_trans2_set_path_information
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_com_trans2_set_path_information(smb_request_t *sr, smb_xa_t *xa)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States{
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States uint16_t infolev;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smbsr_error(sr, NT_STATUS_INVALID_DEVICE_REQUEST,
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (smb_mbc_decodef(&xa->req_param_mb, "%w4.u",
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (smb_set_by_path(sr, xa, infolev, path) != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_com_set_information (aka setattr)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai DTRACE_SMB_1(op__SetInformation__start, smb_request_t *, sr);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai DTRACE_SMB_1(op__SetInformation__done, smb_request_t *, sr);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States{
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States uint16_t infolev = SMB_SET_INFORMATION;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (smbsr_decode_data(sr, "%S", sr, &path) != 0)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (smb_set_by_path(sr, NULL, infolev, path) != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_com_set_information2 (aka setattre)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai DTRACE_SMB_1(op__SetInformation2__start, smb_request_t *, sr);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai DTRACE_SMB_1(op__SetInformation2__done, smb_request_t *, sr);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (smbsr_decode_vwv(sr, "w", &sr->smb_fid) != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_set_by_fid
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Common code for setting file information by open file id.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Use the id to identify the node object and invoke smb_set_fileinfo
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * for that node.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Setting attributes on a named pipe by id is handled by simply
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * returning success.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_set_by_fid(smb_request_t *sr, smb_xa_t *xa, uint16_t infolev)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smbsr_error(sr, NT_STATUS_INVALID_HANDLE, ERRDOS, ERRbadfid);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (!SMB_FTYPE_IS_DISK(sr->fid_ofile->f_ftype)) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_set_by_path
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Common code for setting file information by file name.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Use the file name to identify the node object and invoke
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_set_fileinfo for that node.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States *
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * Setting attributes on a named pipe by name is an error and
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * is handled in the calling functions so that they can return
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * the appropriate error status code (which differs by caller).
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States{
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (SMB_TREE_IS_READONLY(sr)) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States sr->tid_tree->t_snode, sr->tid_tree->t_snode, &dnode, name);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (rc == 0) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_fsop_lookup_name(sr, sr->user_cr, SMB_FOLLOW_LINKS,
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States sr->tid_tree->t_snode, dnode, name, &node);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_node_release(dnode);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States kmem_free(name, MAXNAMELEN);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smbsr_error(sr, NT_STATUS_OBJECT_NAME_NOT_FOUND,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown /* Break any conflicting oplock for subsequent attribute setting */
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown if (smb_oplock_conflict(node, sr->session, NULL)) {
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown (void) smb_oplock_break(node, sr->session, B_FALSE);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_set_fileinfo
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * For compatibility with windows servers, SMB_FILE_LINK_INFORMATION
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown * is handled by returning NT_STATUS_NOT_SUPPORTED.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_set_fileinfo(smb_request_t *sr, smb_setinfo_t *sinfo)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai /* EAs not supported */
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_set_information
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * It is not valid to set FILE_ATTRIBUTE_DIRECTORY if the
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * target is not a directory.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * For compatibility with Windows Servers, if the specified
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * attributes have ONLY FILE_ATTRIBUTE_NORMAL set do NOT change
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * the file's attributes.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_set_information(smb_request_t *sr, smb_setinfo_t *sinfo)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (smbsr_decode_vwv(sr, "wl10.", &attributes, &mtime) != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = smb_node_setattr(sr, node, sr->user_cr, NULL, &attr);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_set_information2
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_set_information2(smb_request_t *sr, smb_setinfo_t *sinfo)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (smbsr_decode_vwv(sr, "yyy", &crtime, &atime, &mtime) != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai attr.sa_crtime.tv_sec = smb_time_local_to_gmt(sr, crtime);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = smb_node_setattr(sr, sinfo->si_node, sr->user_cr,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_set_standard_info
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Sets standard file/path information.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_set_standard_info(smb_request_t *sr, smb_setinfo_t *sinfo)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (smb_mbc_decodef(&sinfo->si_xa->req_data_mb, "yyy",
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai attr.sa_crtime.tv_sec = smb_time_local_to_gmt(sr, crtime);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = smb_node_setattr(sr, node, sr->user_cr, sr->fid_ofile, &attr);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_set_basic_info
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Sets basic file/path information.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * It is not valid to set FILE_ATTRIBUTE_DIRECTORY if the
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * target is not a directory.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * For compatibility with windows servers:
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * - if the specified attributes have ONLY FILE_ATTRIBUTE_NORMAL set
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * clear (0) the file's attributes.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * - if the specified attributes are 0 do NOT change the file's attributes.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_set_basic_info(smb_request_t *sr, smb_setinfo_t *sinfo)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (smb_mbc_decodef(&sinfo->si_xa->req_data_mb, "qqqqw",
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai &crtime, &atime, &mtime, &ctime, &attributes) != 0) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_time_nt_to_unix(ctime, &attr.sa_vattr.va_ctime);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_time_nt_to_unix(mtime, &attr.sa_vattr.va_mtime);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_time_nt_to_unix(atime, &attr.sa_vattr.va_atime);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = smb_node_setattr(sr, node, sr->user_cr, sr->fid_ofile, &attr);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_set_eof_info
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_set_eof_info(smb_request_t *sr, smb_setinfo_t *sinfo)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (smb_mbc_decodef(&sinfo->si_xa->req_data_mb, "q", &eof) != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh rc = smb_node_setattr(sr, node, sr->user_cr, sr->fid_ofile, &attr);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_set_alloc_info
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintoshsmb_set_alloc_info(smb_request_t *sr, smb_setinfo_t *sinfo)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (smb_mbc_decodef(&sinfo->si_xa->req_data_mb, "q", &allocsz) != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = smb_node_setattr(sr, node, sr->user_cr, sr->fid_ofile, &attr);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_set_disposition_info
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Set/Clear DELETE_ON_CLOSE flag for an open file.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * File should have been opened with DELETE access otherwise
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * the operation is not permitted.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * NOTE: The node should be marked delete-on-close upon the receipt
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * of the Trans2SetFileInfo(SetDispositionInfo) if mark_delete is set.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * It is different than both SmbNtCreateAndX and SmbNtTransact, which
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * set delete-on-close on the ofile and defer setting the flag on the
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * node until the file is closed.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Observation of Windows 2000 indicates the following:
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * 1) If a file is not opened with delete-on-close create options and
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * the delete-on-close is set via Trans2SetFileInfo(SetDispositionInfo)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * using that open file handle, any subsequent open requests will fail
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * with DELETE_PENDING.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * 2) If a file is opened with delete-on-close create options and the
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * client attempts to unset delete-on-close via Trans2SetFileInfo
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * (SetDispositionInfo) prior to the file close, any subsequent open
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * requests will still fail with DELETE_PENDING after the file is closed.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * 3) If a file is opened with delete-on-close create options and that
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * file handle (not the last open handle and the only file handle
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * with delete-on-close set) is closed. Any subsequent open requests
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * will fail with DELETE_PENDING. Unsetting delete-on-close via
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Trans2SetFileInfo(SetDispositionInfo) at this time will unset the
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * node delete-on-close flag, which will result in the file not being
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * removed even after the last file handle is closed.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_set_disposition_info(smb_request_t *sr, smb_setinfo_t *sinfo)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai unsigned char mark_delete;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (smb_mbc_decodef(&sinfo->si_xa->req_data_mb, "b", &mark_delete) != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai !(smb_ofile_granted_access(sr->fid_ofile) & DELETE)) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (smb_node_set_delete_on_close(sinfo->si_node,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_set_rename_info
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Explicity specified parameter validation rules:
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * - If rootdir is not NULL respond with NT_STATUS_INVALID_PARAMETER.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * - If the filename contains a separator character respond with
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * NT_STATUS_INVALID_PARAMETER.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_set_rename_info(smb_request_t *sr, smb_setinfo_t *sinfo)
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown rc = smb_mbc_decodef(&sinfo->si_xa->req_data_mb, "lll",
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown rc = smb_mbc_decodef(&sinfo->si_xa->req_data_mb, "%#U",
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh if ((rootdir != 0) || (namelen == 0) || (namelen >= MAXNAMELEN)) {
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown return (-1);
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown return (-1);