message accordingly. Apart from not supporting create time we
now pass the S4 RAW-NOTIFY torture.
Jeremy.
/*******************************************************************
Change a filetime - possibly allowing DOS semantics.
*******************************************************************/
/*******************************************************************
Change a filetime - possibly allowing DOS semantics.
*******************************************************************/
ts[0] = ts[1]; /* atime. */
if (file_ntimes(conn, fname, ts)) {
ts[0] = ts[1]; /* atime. */
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;
}
notify_fname(conn, NOTIFY_ACTION_MODIFIED,
return False;
}
notify_fname(conn, NOTIFY_ACTION_MODIFIED,
- FILE_NOTIFY_CHANGE_LAST_WRITE, fname);
-
- return True;
+ FILE_NOTIFY_CHANGE_LAST_WRITE, fname);
+
+ return true;
*/
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
store the last write time to restore on close. JRA. */
/* If we didn't get the "set modtime" call ourselves, we must
store the last write time to restore on close. JRA. */
files_struct *fsp,
const char *fname,
const SMB_STRUCT_STAT *psbuf,
files_struct *fsp,
const char *fname,
const SMB_STRUCT_STAT *psbuf,
+ struct timespec ts[2],
+ bool setting_write_time)
{
uint32 action =
FILE_NOTIFY_CHANGE_LAST_ACCESS
|FILE_NOTIFY_CHANGE_LAST_WRITE;
{
uint32 action =
FILE_NOTIFY_CHANGE_LAST_ACCESS
|FILE_NOTIFY_CHANGE_LAST_WRITE;
if (!VALID_STAT(*psbuf)) {
return NT_STATUS_OBJECT_NAME_NOT_FOUND;
}
if (!VALID_STAT(*psbuf)) {
return NT_STATUS_OBJECT_NAME_NOT_FOUND;
}
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: modtime: %s ", time_to_asc(convert_timespec_to_time_t(ts[1])) ));
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])) ));
if(file_ntimes(conn, fname, ts)!=0) {
return map_nt_error_from_unix(errno);
}
if(file_ntimes(conn, fname, ts)!=0) {
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);
+
}
/****************************************************************************
}
/****************************************************************************
uint32 dosmode = 0;
struct timespec ts[2];
NTSTATUS status = NT_STATUS_OK;
uint32 dosmode = 0;
struct timespec ts[2];
NTSTATUS status = NT_STATUS_OK;
+ bool setting_write_time = true;
if (total_data < 36) {
return NT_STATUS_INVALID_PARAMETER;
if (total_data < 36) {
return NT_STATUS_INVALID_PARAMETER;
/* Prefer a defined time to an undefined one. */
if (null_timespec(ts[1])) {
/* Prefer a defined time to an undefined one. */
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",
+ ts,
+ setting_write_time);
}
/****************************************************************************
}
/****************************************************************************
* This is equivalent to a write. Ensure it's seen immediately
* if there are no pending writes.
*/
* This is equivalent to a write. Ensure it's seen immediately
* if there are no pending writes.
*/
- set_filetime(fsp->conn, fsp->fsp_name, timespec_current());
+ set_filetime(fsp->conn, fsp->fsp_name,
+ timespec_current());
}
/****************************************************************************
}
/****************************************************************************