From c9c3d4312d7281904fc4a1cc9abd4831cdf4bfb9 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 8 Jul 2009 17:51:35 -0700 Subject: The migration to struct stat_ex broke the calculation of create time from the existing timestamps (for systems that need to do this). Once the write time is changed via a sticky write, the create time might need to be recalculated. To do this I needed to add a bool into struct stat_ex to remember if the st_ex_btime field was calculated, or read from the OS. Also fixed the returning of modified write timestamps in the return from NTCreateX, SMBattr and SMBattrE (which weren't taking into account the modified timestamp stored in the open file table). Attempting to fix an issue with Excel 2003 and offline files. Volker and Metze, please review. Jeremy --- source3/smbd/reply.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'source3/smbd/reply.c') diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index c07ac33679..e02482ea4a 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -1065,6 +1065,7 @@ void reply_getatr(struct smb_request *req) const char *p; NTSTATUS status; TALLOC_CTX *ctx = talloc_tos(); + bool ask_sharemode = lp_parm_bool(SNUM(conn), "smbd", "search ask sharemode", true); START_PROFILE(SMBgetatr); @@ -1111,6 +1112,19 @@ void reply_getatr(struct smb_request *req) mode = dos_mode(conn, fname, &smb_fname->st); size = smb_fname->st.st_ex_size; + + if (ask_sharemode) { + struct timespec write_time_ts; + struct file_id fileid; + + ZERO_STRUCT(write_time_ts); + fileid = vfs_file_id_from_sbuf(conn, &smb_fname->st); + get_file_infos(fileid, NULL, &write_time_ts); + if (!null_timespec(write_time_ts)) { + update_stat_ex_writetime(&smb_fname->st, write_time_ts); + } + } + mtime = convert_timespec_to_time_t(smb_fname->st.st_ex_mtime); if (mode & aDIR) { size = 0; @@ -1707,6 +1721,7 @@ void reply_open(struct smb_request *req) uint32 create_disposition; uint32 create_options = 0; NTSTATUS status; + bool ask_sharemode = lp_parm_bool(SNUM(conn), "smbd", "search ask sharemode", true); TALLOC_CTX *ctx = talloc_tos(); START_PROFILE(SMBopen); @@ -1779,6 +1794,19 @@ void reply_open(struct smb_request *req) size = smb_fname->st.st_ex_size; fattr = dos_mode(conn,fsp->fsp_name,&smb_fname->st); + + /* Deal with other possible opens having a modified + write time. JRA. */ + if (ask_sharemode) { + struct timespec write_time_ts; + + ZERO_STRUCT(write_time_ts); + get_file_infos(fsp->file_id, NULL, &write_time_ts); + if (!null_timespec(write_time_ts)) { + update_stat_ex_writetime(&smb_fname->st, write_time_ts); + } + } + mtime = convert_timespec_to_time_t(smb_fname->st.st_ex_mtime); if (fattr & aDIR) { -- cgit