diff options
-rw-r--r-- | source3/include/smb.h | 1 | ||||
-rw-r--r-- | source3/smbd/reply.c | 11 | ||||
-rw-r--r-- | source3/smbd/trans2.c | 17 |
3 files changed, 27 insertions, 2 deletions
diff --git a/source3/include/smb.h b/source3/include/smb.h index 63aa7c098d..47dde8c31f 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -623,6 +623,7 @@ typedef struct files_struct write_bmpx_struct *wbmpx_ptr; struct timeval open_time; int share_mode; + time_t pending_modtime; BOOL open; BOOL can_lock; BOOL can_read; diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 78a09e46e7..12bf098a94 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -2492,6 +2492,17 @@ int reply_close(connection_struct *conn, /* * Close ordinary file. */ + + /* + * If there was a modify time outstanding, + * try and set it here. + */ + if(fsp->pending_modtime) + set_filetime(conn, fsp->fsp_name, fsp->pending_modtime); + + /* + * Now take care of any time sent in the close. + */ mtime = make_unix_date3(inbuf+smb_vwv1); /* try and set the date */ diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index f1d415e290..81ba511c77 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -1496,14 +1496,16 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *fname; int fd = -1; BOOL bad_path = False; + files_struct *fsp = NULL; if (!CAN_WRITE(conn)) return(ERROR(ERRSRV,ERRaccess)); if (tran_call == TRANSACT2_SETFILEINFO) { - files_struct *fsp = file_fsp(params,0); info_level = SVAL(params,2); + fsp = file_fsp(params,0); + if(fsp && fsp->open && fsp->is_directory) { /* * This is actually a SETFILEINFO on a directory @@ -1802,7 +1804,18 @@ dev = %x, inode = %.0f\n", iterate_fsp->fnum, (unsigned int)dev, (double)inode)) */ if (st.st_mtime != tvs.modtime || st.st_atime != tvs.actime) { - if(file_utime(conn, fname, &tvs)!=0) + if(fsp != NULL) + { + /* + * This was a setfileinfo on an open file. + * NT does this a lot. It's actually pointless + * setting the time here, as it will be overwritten + * on the next write, so we save the request + * away and will set it on file code. JRA. + */ + fsp->pending_modtime = tvs.modtime; + } + else if(file_utime(conn, fname, &tvs)!=0) { return(UNIXERROR(ERRDOS,ERRnoaccess)); } |