mirror of
https://github.com/samba-team/samba.git
synced 2025-01-14 19:24:43 +03:00
Fixed NT modify timestamp issue.
If a client does a modify timestamp on an open file (which will do no good at all on UNIX :-) then keep the modify request pending in the files_struct and apply it at close instead. Jeremy. (This used to be commit 92a7a86f0e0255e3812dd35bebfcd653091514ae)
This commit is contained in:
parent
157fe90d2e
commit
490439d77a
@ -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;
|
||||
|
@ -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 */
|
||||
|
@ -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));
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user