From: Jeremy Allison Date: Fri, 20 Feb 2015 02:46:55 +0000 (-0800) Subject: s3: smbd: SMB2 close. Add utility function setup_close_full_information() X-Git-Tag: samba-4.2.0rc5~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=66acf5bc704033070ba2074d0c6519ea9e44a70e;p=thirdparty%2Fsamba.git s3: smbd: SMB2 close. Add utility function setup_close_full_information() Not yet used. Bug 11104 - SMB2/SMB3 close response does not include attributes when requested. https://bugzilla.samba.org/show_bug.cgi?id=11104 Signed-off-by: Jeremy Allison Reviewed-by: Steve French (cherry picked from commit 2ccfdf760e4adcf25d59c629c9d6d6b31a10a9f1) --- diff --git a/source3/smbd/smb2_close.c b/source3/smbd/smb2_close.c index 0e1475df900..40c2d30d570 100644 --- a/source3/smbd/smb2_close.c +++ b/source3/smbd/smb2_close.c @@ -149,6 +149,48 @@ static void smbd_smb2_request_close_done(struct tevent_req *subreq) } } +static void setup_close_full_information(connection_struct *conn, + struct smb_filename *smb_fname, + bool posix_open, + struct timespec *out_creation_ts, + struct timespec *out_last_access_ts, + struct timespec *out_last_write_ts, + struct timespec *out_change_ts, + uint16_t *out_flags, + uint64_t *out_allocation_size, + uint64_t *out_end_of_file, + uint32_t *out_file_attributes) +{ + int ret; + if (posix_open) { + ret = SMB_VFS_LSTAT(conn, smb_fname); + } else { + ret = SMB_VFS_STAT(conn, smb_fname); + } + if (ret != 0) { + return; + } + + *out_flags = SMB2_CLOSE_FLAGS_FULL_INFORMATION; + *out_file_attributes = dos_mode(conn, smb_fname); + *out_last_write_ts = smb_fname->st.st_ex_mtime; + *out_last_access_ts = smb_fname->st.st_ex_atime; + *out_creation_ts = get_create_timespec(conn, NULL, smb_fname); + *out_change_ts = get_change_timespec(conn, NULL, smb_fname); + + if (lp_dos_filetime_resolution(SNUM(conn))) { + dos_filetime_timespec(out_creation_ts); + dos_filetime_timespec(out_last_write_ts); + dos_filetime_timespec(out_last_access_ts); + dos_filetime_timespec(out_change_ts); + } + if (!(*out_file_attributes & FILE_ATTRIBUTE_DIRECTORY)) { + *out_end_of_file = get_file_size_stat(&smb_fname->st); + } + + *out_allocation_size = SMB_VFS_GET_ALLOC_SIZE(conn, NULL, &smb_fname->st); +} + static NTSTATUS smbd_smb2_close(struct smbd_smb2_request *req, struct files_struct *fsp, uint16_t in_flags,