e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai/*
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * CDDL HEADER START
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai *
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 *
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * or http://www.opensolaris.org/os/licensing.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * See the License for the specific language governing permissions
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * and limitations under the License.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai *
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 *
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * CDDL HEADER END
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai */
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai/*
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
5496c1178a1a48006226450b13c2df195831794cAlek Pinchuk * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai */
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai/*
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Trans2 Set File/Path Information Levels:
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai *
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 *
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown * Handled Passthrough levels:
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * SMB_FILE_BASIC_INFORMATION
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown * SMB_FILE_RENAME_INFORMATION
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown * 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 *
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Internal levels representing non trans2 requests
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * SMB_SET_INFORMATION
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * SMB_SET_INFORMATION2
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai */
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai/*
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 *
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 Desai */
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown#include <smbsrv/smb_kproto.h>
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai#include <smbsrv/smb_fsops.h>
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic int smb_set_by_fid(smb_request_t *, smb_xa_t *, uint16_t);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic int smb_set_by_path(smb_request_t *, smb_xa_t *, uint16_t);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * These functions all return and NT status code.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb_set_fileinfo(smb_request_t *, smb_setinfo_t *, int);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb_set_information(smb_request_t *, smb_setinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb_set_information2(smb_request_t *, smb_setinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb_set_standard_info(smb_request_t *, smb_setinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb_set_rename_info(smb_request_t *sr, smb_setinfo_t *);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai/*
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_com_trans2_set_file_information
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai */
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_sdrc_t
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_com_trans2_set_file_information(smb_request_t *sr, smb_xa_t *xa)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai{
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai uint16_t infolev;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (smb_mbc_decodef(&xa->req_param_mb, "ww",
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai &sr->smb_fid, &infolev) != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (SDRC_ERROR);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (smb_set_by_fid(sr, xa, infolev) != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (SDRC_ERROR);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (SDRC_SUCCESS);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai}
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai/*
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_com_trans2_set_path_information
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai */
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_sdrc_t
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_com_trans2_set_path_information(smb_request_t *sr, smb_xa_t *xa)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai{
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States uint16_t infolev;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_fqi_t *fqi = &sr->arg.dirop.fqi;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
f96bd5c800e73e351b0b6e4bd7f00b578dad29bbAlan Wright if (STYPE_ISIPC(sr->tid_tree->t_res_type)) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smbsr_error(sr, NT_STATUS_INVALID_DEVICE_REQUEST,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai ERRDOS, ERROR_INVALID_FUNCTION);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (SDRC_ERROR);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (smb_mbc_decodef(&xa->req_param_mb, "%w4.u",
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States sr, &infolev, &fqi->fq_path.pn_path) != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (SDRC_ERROR);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (smb_set_by_path(sr, xa, infolev) != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (SDRC_ERROR);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (SDRC_SUCCESS);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai}
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai/*
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_com_set_information (aka setattr)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai */
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_sdrc_t
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_pre_set_information(smb_request_t *sr)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai{
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai DTRACE_SMB_1(op__SetInformation__start, smb_request_t *, sr);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (SDRC_SUCCESS);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai}
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaivoid
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_post_set_information(smb_request_t *sr)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai{
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai DTRACE_SMB_1(op__SetInformation__done, smb_request_t *, sr);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai}
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_sdrc_t
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_com_set_information(smb_request_t *sr)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai{
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States uint16_t infolev = SMB_SET_INFORMATION;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_fqi_t *fqi = &sr->arg.dirop.fqi;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
f96bd5c800e73e351b0b6e4bd7f00b578dad29bbAlan Wright if (STYPE_ISIPC(sr->tid_tree->t_res_type)) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smbsr_error(sr, NT_STATUS_ACCESS_DENIED,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai ERRDOS, ERROR_ACCESS_DENIED);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (SDRC_ERROR);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (smbsr_decode_data(sr, "%S", sr, &fqi->fq_path.pn_path) != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (SDRC_ERROR);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (smb_set_by_path(sr, NULL, infolev) != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (SDRC_ERROR);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (smbsr_encode_empty_result(sr) != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (SDRC_ERROR);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (SDRC_SUCCESS);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai}
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai/*
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_com_set_information2 (aka setattre)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai */
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_sdrc_t
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_pre_set_information2(smb_request_t *sr)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai{
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai DTRACE_SMB_1(op__SetInformation2__start, smb_request_t *, sr);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (SDRC_SUCCESS);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai}
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaivoid
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_post_set_information2(smb_request_t *sr)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai{
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai DTRACE_SMB_1(op__SetInformation2__done, smb_request_t *, sr);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai}
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_sdrc_t
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_com_set_information2(smb_request_t *sr)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai{
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai uint16_t infolev = SMB_SET_INFORMATION2;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (smbsr_decode_vwv(sr, "w", &sr->smb_fid) != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (SDRC_ERROR);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (smb_set_by_fid(sr, NULL, infolev) != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (SDRC_ERROR);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (smbsr_encode_empty_result(sr) != 0)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (SDRC_ERROR);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (SDRC_SUCCESS);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai}
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai/*
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_set_by_fid
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai *
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 *
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Setting attributes on a named pipe by id is handled by simply
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * returning success.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai */
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaistatic int
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_set_by_fid(smb_request_t *sr, smb_xa_t *xa, uint16_t infolev)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai{
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_setinfo_t sinfo;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t status;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross int rc = 0;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (SMB_TREE_IS_READONLY(sr)) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smbsr_error(sr, NT_STATUS_ACCESS_DENIED,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai ERRDOS, ERROR_ACCESS_DENIED);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
f96bd5c800e73e351b0b6e4bd7f00b578dad29bbAlan Wright if (STYPE_ISIPC(sr->tid_tree->t_res_type))
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (0);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smbsr_lookup_file(sr);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (sr->fid_ofile == NULL) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smbsr_error(sr, NT_STATUS_INVALID_HANDLE, ERRDOS, ERRbadfid);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (!SMB_FTYPE_IS_DISK(sr->fid_ofile->f_ftype)) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smbsr_release_file(sr);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (0);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai sr->user_cr = smb_ofile_getcred(sr->fid_ofile);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross bzero(&sinfo, sizeof (sinfo));
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai sinfo.si_node = sr->fid_ofile->f_node;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (xa != NULL)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross sinfo.si_data = xa->req_data_mb;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb_set_fileinfo(sr, &sinfo, infolev);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (status != 0) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smbsr_error(sr, status, 0, 0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross rc = -1;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smbsr_release_file(sr);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (rc);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai}
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai/*
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_set_by_path
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai *
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.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai *
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * Path should be set in sr->arg.dirop.fqi.fq_path prior to
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * calling smb_set_by_path.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States *
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Setting attributes on a named pipe by name is an error and
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * is handled in the calling functions so that they can return
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * the appropriate error status code (which differs by caller).
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai */
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaistatic int
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statessmb_set_by_path(smb_request_t *sr, smb_xa_t *xa, uint16_t infolev)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai{
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai int rc;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t status;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_setinfo_t sinfo;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_t *node, *dnode;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai char *name;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_pathname_t *pn;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (SMB_TREE_IS_READONLY(sr)) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smbsr_error(sr, NT_STATUS_ACCESS_DENIED,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai ERRDOS, ERROR_ACCESS_DENIED);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States pn = &sr->arg.dirop.fqi.fq_path;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_pathname_init(sr, pn, pn->pn_path);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (!smb_pathname_validate(sr, pn))
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (-1);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai name = kmem_alloc(MAXNAMELEN, KM_SLEEP);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_pathname_reduce(sr, sr->user_cr, pn->pn_path,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai sr->tid_tree->t_snode, sr->tid_tree->t_snode, &dnode, name);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (rc == 0) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = smb_fsop_lookup_name(sr, sr->user_cr, SMB_FOLLOW_LINKS,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai sr->tid_tree->t_snode, dnode, name, &node);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_release(dnode);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai kmem_free(name, MAXNAMELEN);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (rc != 0) {
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown if (rc == ENOENT) {
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown smbsr_error(sr, NT_STATUS_OBJECT_NAME_NOT_FOUND,
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown ERRDOS, ERROR_FILE_NOT_FOUND);
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown } else {
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown smbsr_errno(sr, rc);
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (-1);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross bzero(&sinfo, sizeof (sinfo));
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai sinfo.si_node = node;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (xa != NULL)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross sinfo.si_data = xa->req_data_mb;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb_set_fileinfo(sr, &sinfo, infolev);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (status != 0) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smbsr_error(sr, status, 0, 0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross rc = -1;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_release(node);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (rc);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai}
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai/*
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_set_fileinfo
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown *
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown * For compatibility with windows servers, SMB_FILE_LINK_INFORMATION
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown * is handled by returning NT_STATUS_NOT_SUPPORTED.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb_set_fileinfo(smb_request_t *sr, smb_setinfo_t *sinfo, int infolev)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t status;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross switch (infolev) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai case SMB_SET_INFORMATION:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb_set_information(sr, sinfo);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai case SMB_SET_INFORMATION2:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb_set_information2(sr, sinfo);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai case SMB_INFO_STANDARD:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb_set_standard_info(sr, sinfo);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai case SMB_INFO_SET_EAS:
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai /* EAs not supported */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = 0;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai case SMB_SET_FILE_BASIC_INFO:
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai case SMB_FILE_BASIC_INFORMATION:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb_set_basic_info(sr, sinfo);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai case SMB_SET_FILE_DISPOSITION_INFO:
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai case SMB_FILE_DISPOSITION_INFORMATION:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb_set_disposition_info(sr, sinfo);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai case SMB_SET_FILE_END_OF_FILE_INFO:
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai case SMB_FILE_END_OF_FILE_INFORMATION:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb_set_eof_info(sr, sinfo);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai case SMB_SET_FILE_ALLOCATION_INFO:
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai case SMB_FILE_ALLOCATION_INFORMATION:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb_set_alloc_info(sr, sinfo);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown case SMB_FILE_RENAME_INFORMATION:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb_set_rename_info(sr, sinfo);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown case SMB_FILE_LINK_INFORMATION:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = NT_STATUS_NOT_SUPPORTED;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai default:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = NT_STATUS_INVALID_INFO_CLASS;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai break;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (status);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai}
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai/*
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_set_information
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai *
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * It is not valid to set FILE_ATTRIBUTE_DIRECTORY if the
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * target is not a directory.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai *
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 Desai */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_set_information(smb_request_t *sr, smb_setinfo_t *sinfo)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai{
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_attr_t attr;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_node_t *node = sinfo->si_node;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t status = 0;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai uint32_t mtime;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint16_t attributes;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross int rc;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (smbsr_decode_vwv(sr, "wl10.", &attributes, &mtime) != 0)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_INFO_LENGTH_MISMATCH);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if ((attributes & FILE_ATTRIBUTE_DIRECTORY) &&
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai (!smb_node_is_dir(node))) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_INVALID_PARAMETER);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai bzero(&attr, sizeof (smb_attr_t));
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (attributes != FILE_ATTRIBUTE_NORMAL) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai attr.sa_dosattr = attributes;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai attr.sa_mask |= SMB_AT_DOSATTR;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (mtime != 0 && mtime != UINT_MAX) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai attr.sa_vattr.va_mtime.tv_sec =
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_time_local_to_gmt(sr, mtime);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai attr.sa_mask |= SMB_AT_MTIME;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = smb_node_setattr(sr, node, sr->user_cr, NULL, &attr);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (rc != 0)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb_errno2status(rc);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (status);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai}
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai/*
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_set_information2
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_set_information2(smb_request_t *sr, smb_setinfo_t *sinfo)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai{
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_attr_t attr;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t crtime, atime, mtime;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t status = 0;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross int rc;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (smbsr_decode_vwv(sr, "yyy", &crtime, &atime, &mtime) != 0)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_INFO_LENGTH_MISMATCH);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai bzero(&attr, sizeof (smb_attr_t));
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (mtime != 0 && mtime != UINT_MAX) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai attr.sa_vattr.va_mtime.tv_sec =
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_time_local_to_gmt(sr, mtime);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai attr.sa_mask |= SMB_AT_MTIME;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (crtime != 0 && crtime != UINT_MAX) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai attr.sa_crtime.tv_sec = smb_time_local_to_gmt(sr, crtime);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai attr.sa_mask |= SMB_AT_CRTIME;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (atime != 0 && atime != UINT_MAX) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai attr.sa_vattr.va_atime.tv_sec =
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_time_local_to_gmt(sr, atime);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai attr.sa_mask |= SMB_AT_ATIME;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = smb_node_setattr(sr, sinfo->si_node, sr->user_cr,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai sr->fid_ofile, &attr);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (rc != 0)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb_errno2status(rc);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (status);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai}
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai/*
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * smb_set_standard_info
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai *
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Sets standard file/path information.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaismb_set_standard_info(smb_request_t *sr, smb_setinfo_t *sinfo)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai{
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_attr_t attr;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_node_t *node = sinfo->si_node;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t crtime, atime, mtime;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t status = 0;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai int rc;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (smb_mbc_decodef(&sinfo->si_data, "yyy",
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &crtime, &atime, &mtime) != 0)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_INFO_LENGTH_MISMATCH);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai bzero(&attr, sizeof (smb_attr_t));
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (mtime != 0 && mtime != (uint32_t)-1) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai attr.sa_vattr.va_mtime.tv_sec =
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_time_local_to_gmt(sr, mtime);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai attr.sa_mask |= SMB_AT_MTIME;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (crtime != 0 && crtime != (uint32_t)-1) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai attr.sa_crtime.tv_sec = smb_time_local_to_gmt(sr, crtime);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai attr.sa_mask |= SMB_AT_CRTIME;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (atime != 0 && atime != (uint32_t)-1) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai attr.sa_vattr.va_atime.tv_sec =
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai smb_time_local_to_gmt(sr, atime);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai attr.sa_mask |= SMB_AT_ATIME;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai rc = smb_node_setattr(sr, node, sr->user_cr, sr->fid_ofile, &attr);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (rc != 0)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb_errno2status(rc);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (status);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai}
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown/*
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown * smb_set_rename_info
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown *
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * This call only allows a rename in the same directory, and the
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * directory name is not part of the new name provided.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross *
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * Explicitly specified parameter validation rules:
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown * - If rootdir is not NULL respond with NT_STATUS_INVALID_PARAMETER.
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown * - If the filename contains a separator character respond with
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown * NT_STATUS_INVALID_PARAMETER.
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh *
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * Oplock break:
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * Some Windows servers break BATCH oplocks prior to the rename.
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * W2K3 does not. We behave as W2K3; we do not send an oplock break.
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brownsmb_set_rename_info(smb_request_t *sr, smb_setinfo_t *sinfo)
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_fqi_t *src_fqi = &sr->arg.dirop.fqi;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_fqi_t *dst_fqi = &sr->arg.dirop.dst_fqi;
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown char *fname;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross char *path;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint8_t flags;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t rootdir, namelen;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t status = 0;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross int rc;
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross rc = smb_mbc_decodef(&sinfo->si_data, "b...ll",
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown &flags, &rootdir, &namelen);
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown if (rc == 0) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross rc = smb_mbc_decodef(&sinfo->si_data, "%#U",
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown sr, namelen, &fname);
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown }
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown if (rc != 0)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_INFO_LENGTH_MISMATCH);
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown if ((rootdir != 0) || (namelen == 0) || (namelen >= MAXNAMELEN)) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_INVALID_PARAMETER);
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown }
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown if (strchr(fname, '\\') != NULL) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_NOT_SUPPORTED);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross /*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * Construct the full dst. path relative to the share root.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * Allocated path is free'd in smb_request_free.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross path = smb_srm_zalloc(sr, SMB_MAXPATHLEN);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (src_fqi->fq_path.pn_pname) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross /* Got here via: smb_set_by_path */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) snprintf(path, SMB_MAXPATHLEN, "%s\\%s",
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross src_fqi->fq_path.pn_pname, fname);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross } else {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross /* Got here via: smb_set_by_fid */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross rc = smb_node_getshrpath(sinfo->si_node->n_dnode,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross sr->tid_tree, path, SMB_MAXPATHLEN);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (rc != 0) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb_errno2status(rc);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (status);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) strlcat(path, "\\", SMB_MAXPATHLEN);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) strlcat(path, fname, SMB_MAXPATHLEN);
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown }
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross /*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * The common rename code can slightly optimize a
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * rename in the same directory when we set the
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * dst_fqi->fq_dnode, dst_fqi->fq_last_comp
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross dst_fqi->fq_dnode = sinfo->si_node->n_dnode;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) strlcpy(dst_fqi->fq_last_comp, fname, MAXNAMELEN);
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb_setinfo_rename(sr, sinfo->si_node, path, flags);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (status);
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown}