summaryrefslogtreecommitdiff
path: root/source3/smbd/trans2.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2007-10-31 16:32:48 -0700
committerJeremy Allison <jra@samba.org>2007-10-31 16:32:48 -0700
commit0bb1a6ec2d963c2001230142692de8335c540434 (patch)
tree4bc7eb5bb0e086ded41065a414a69f7d733ef412 /source3/smbd/trans2.c
parent8f1f2f04c796a8659d93bafadefca4a98fee00f0 (diff)
downloadsamba-0bb1a6ec2d963c2001230142692de8335c540434.tar.gz
samba-0bb1a6ec2d963c2001230142692de8335c540434.tar.bz2
samba-0bb1a6ec2d963c2001230142692de8335c540434.zip
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 8a77f520fa03afa60eac2aaeab4babe7dd8db4f0)
Diffstat (limited to 'source3/smbd/trans2.c')
-rw-r--r--source3/smbd/trans2.c34
1 files changed, 24 insertions, 10 deletions
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 58d44a856b..09a8fcc876 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -4467,13 +4467,13 @@ static NTSTATUS smb_set_file_time(connection_struct *conn,
files_struct *fsp,
const char *fname,
const SMB_STRUCT_STAT *psbuf,
- struct timespec ts[2])
+ struct timespec ts[2],
+ bool setting_write_time)
{
uint32 action =
FILE_NOTIFY_CHANGE_LAST_ACCESS
|FILE_NOTIFY_CHANGE_LAST_WRITE;
-
if (!VALID_STAT(*psbuf)) {
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;
}
+ 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])) ));
@@ -4528,9 +4533,8 @@ static NTSTATUS smb_set_file_time(connection_struct *conn,
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);
+
return NT_STATUS_OK;
}
@@ -5226,7 +5230,8 @@ static NTSTATUS smb_set_info_standard(connection_struct *conn,
fsp,
fname,
psbuf,
- ts);
+ ts,
+ true);
}
/****************************************************************************
@@ -5246,6 +5251,7 @@ static NTSTATUS smb_set_file_basic_info(connection_struct *conn,
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;
@@ -5278,7 +5284,12 @@ static NTSTATUS smb_set_file_basic_info(connection_struct *conn,
/* 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",
@@ -5288,7 +5299,8 @@ static NTSTATUS smb_set_file_basic_info(connection_struct *conn,
fsp,
fname,
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
* 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;
}
@@ -5682,7 +5695,8 @@ size = %.0f, uid = %u, gid = %u, raw perms = 0%o\n",
fsp,
fname,
psbuf,
- ts);
+ ts,
+ true);
}
/****************************************************************************