mirror of
https://github.com/samba-team/samba.git
synced 2025-08-04 08:22:08 +03:00
Note when we're setting change time, not write time, and send
message accordingly. Apart from not supporting create time we
now pass the S4 RAW-NOTIFY torture.
Jeremy.
(This used to be commit 8a77f520fa
)
This commit is contained in:
@ -591,7 +591,7 @@ int file_ntimes(connection_struct *conn, const char *fname, const struct timespe
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
Change a filetime - possibly allowing DOS semantics.
|
Change a filetime - possibly allowing DOS semantics.
|
||||||
*******************************************************************/
|
*******************************************************************/
|
||||||
@ -609,12 +609,13 @@ bool set_filetime(connection_struct *conn, const char *fname,
|
|||||||
ts[0] = ts[1]; /* atime. */
|
ts[0] = ts[1]; /* atime. */
|
||||||
|
|
||||||
if (file_ntimes(conn, fname, ts)) {
|
if (file_ntimes(conn, fname, ts)) {
|
||||||
DEBUG(4,("set_filetime(%s) failed: %s\n",fname,strerror(errno)));
|
DEBUG(4,("set_filetime(%s) failed: %s\n",
|
||||||
|
fname,strerror(errno)));
|
||||||
return False;
|
return False;
|
||||||
}
|
}
|
||||||
|
|
||||||
notify_fname(conn, NOTIFY_ACTION_MODIFIED,
|
notify_fname(conn, NOTIFY_ACTION_MODIFIED,
|
||||||
FILE_NOTIFY_CHANGE_LAST_WRITE, fname);
|
FILE_NOTIFY_CHANGE_LAST_WRITE, fname);
|
||||||
|
|
||||||
return True;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -153,7 +153,8 @@ static ssize_t real_write_file(struct smb_request *req,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if (!null_timespec(fsp->pending_modtime)) {
|
if (!null_timespec(fsp->pending_modtime)) {
|
||||||
set_filetime(fsp->conn, fsp->fsp_name, fsp->pending_modtime);
|
set_filetime(fsp->conn, fsp->fsp_name,
|
||||||
|
fsp->pending_modtime);
|
||||||
|
|
||||||
/* If we didn't get the "set modtime" call ourselves, we must
|
/* If we didn't get the "set modtime" call ourselves, we must
|
||||||
store the last write time to restore on close. JRA. */
|
store the last write time to restore on close. JRA. */
|
||||||
|
@ -4467,13 +4467,13 @@ static NTSTATUS smb_set_file_time(connection_struct *conn,
|
|||||||
files_struct *fsp,
|
files_struct *fsp,
|
||||||
const char *fname,
|
const char *fname,
|
||||||
const SMB_STRUCT_STAT *psbuf,
|
const SMB_STRUCT_STAT *psbuf,
|
||||||
struct timespec ts[2])
|
struct timespec ts[2],
|
||||||
|
bool setting_write_time)
|
||||||
{
|
{
|
||||||
uint32 action =
|
uint32 action =
|
||||||
FILE_NOTIFY_CHANGE_LAST_ACCESS
|
FILE_NOTIFY_CHANGE_LAST_ACCESS
|
||||||
|FILE_NOTIFY_CHANGE_LAST_WRITE;
|
|FILE_NOTIFY_CHANGE_LAST_WRITE;
|
||||||
|
|
||||||
|
|
||||||
if (!VALID_STAT(*psbuf)) {
|
if (!VALID_STAT(*psbuf)) {
|
||||||
return NT_STATUS_OBJECT_NAME_NOT_FOUND;
|
return NT_STATUS_OBJECT_NAME_NOT_FOUND;
|
||||||
}
|
}
|
||||||
@ -4489,6 +4489,11 @@ static NTSTATUS smb_set_file_time(connection_struct *conn,
|
|||||||
action &= ~FILE_NOTIFY_CHANGE_LAST_WRITE;
|
action &= ~FILE_NOTIFY_CHANGE_LAST_WRITE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!setting_write_time) {
|
||||||
|
/* ts[1] comes from change time, not write time. */
|
||||||
|
action &= ~FILE_NOTIFY_CHANGE_LAST_WRITE;
|
||||||
|
}
|
||||||
|
|
||||||
DEBUG(6,("smb_set_file_time: actime: %s " , time_to_asc(convert_timespec_to_time_t(ts[0])) ));
|
DEBUG(6,("smb_set_file_time: actime: %s " , time_to_asc(convert_timespec_to_time_t(ts[0])) ));
|
||||||
DEBUG(6,("smb_set_file_time: modtime: %s ", time_to_asc(convert_timespec_to_time_t(ts[1])) ));
|
DEBUG(6,("smb_set_file_time: modtime: %s ", time_to_asc(convert_timespec_to_time_t(ts[1])) ));
|
||||||
|
|
||||||
@ -4528,9 +4533,8 @@ static NTSTATUS smb_set_file_time(connection_struct *conn,
|
|||||||
if(file_ntimes(conn, fname, ts)!=0) {
|
if(file_ntimes(conn, fname, ts)!=0) {
|
||||||
return map_nt_error_from_unix(errno);
|
return map_nt_error_from_unix(errno);
|
||||||
}
|
}
|
||||||
if (action != 0) {
|
notify_fname(conn, NOTIFY_ACTION_MODIFIED, action, fname);
|
||||||
notify_fname(conn, NOTIFY_ACTION_MODIFIED, action, fname);
|
|
||||||
}
|
|
||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5226,7 +5230,8 @@ static NTSTATUS smb_set_info_standard(connection_struct *conn,
|
|||||||
fsp,
|
fsp,
|
||||||
fname,
|
fname,
|
||||||
psbuf,
|
psbuf,
|
||||||
ts);
|
ts,
|
||||||
|
true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -5246,6 +5251,7 @@ static NTSTATUS smb_set_file_basic_info(connection_struct *conn,
|
|||||||
uint32 dosmode = 0;
|
uint32 dosmode = 0;
|
||||||
struct timespec ts[2];
|
struct timespec ts[2];
|
||||||
NTSTATUS status = NT_STATUS_OK;
|
NTSTATUS status = NT_STATUS_OK;
|
||||||
|
bool setting_write_time = true;
|
||||||
|
|
||||||
if (total_data < 36) {
|
if (total_data < 36) {
|
||||||
return NT_STATUS_INVALID_PARAMETER;
|
return NT_STATUS_INVALID_PARAMETER;
|
||||||
@ -5278,7 +5284,12 @@ static NTSTATUS smb_set_file_basic_info(connection_struct *conn,
|
|||||||
|
|
||||||
/* Prefer a defined time to an undefined one. */
|
/* Prefer a defined time to an undefined one. */
|
||||||
if (null_timespec(ts[1])) {
|
if (null_timespec(ts[1])) {
|
||||||
ts[1] = null_timespec(write_time) ? changed_time : write_time;
|
if (null_timespec(write_time)) {
|
||||||
|
ts[1] = changed_time;
|
||||||
|
setting_write_time = false;
|
||||||
|
} else {
|
||||||
|
ts[1] = write_time;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG(10,("smb_set_file_basic_info: file %s\n",
|
DEBUG(10,("smb_set_file_basic_info: file %s\n",
|
||||||
@ -5288,7 +5299,8 @@ static NTSTATUS smb_set_file_basic_info(connection_struct *conn,
|
|||||||
fsp,
|
fsp,
|
||||||
fname,
|
fname,
|
||||||
psbuf,
|
psbuf,
|
||||||
ts);
|
ts,
|
||||||
|
setting_write_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -5349,7 +5361,8 @@ static NTSTATUS smb_set_file_allocation_info(connection_struct *conn,
|
|||||||
* This is equivalent to a write. Ensure it's seen immediately
|
* This is equivalent to a write. Ensure it's seen immediately
|
||||||
* if there are no pending writes.
|
* if there are no pending writes.
|
||||||
*/
|
*/
|
||||||
set_filetime(fsp->conn, fsp->fsp_name, timespec_current());
|
set_filetime(fsp->conn, fsp->fsp_name,
|
||||||
|
timespec_current());
|
||||||
}
|
}
|
||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
}
|
}
|
||||||
@ -5682,7 +5695,8 @@ size = %.0f, uid = %u, gid = %u, raw perms = 0%o\n",
|
|||||||
fsp,
|
fsp,
|
||||||
fname,
|
fname,
|
||||||
psbuf,
|
psbuf,
|
||||||
ts);
|
ts,
|
||||||
|
true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
Reference in New Issue
Block a user