summaryrefslogtreecommitdiffstats
path: root/source/ntvfs
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2006-04-06 01:56:04 +0000
committerAndrew Tridgell <tridge@samba.org>2006-04-06 01:56:04 +0000
commitcab6ccf5079f6aa513256f7715042c9e6e3c2f7c (patch)
tree0a5f07e941d823f9c5c0d88797683e50174e9d3d /source/ntvfs
parentfbd5ef7a49af4fec89442b24fdd2a6c7b537d627 (diff)
downloadsamba-cab6ccf5079f6aa513256f7715042c9e6e3c2f7c.tar.gz
samba-cab6ccf5079f6aa513256f7715042c9e6e3c2f7c.tar.xz
samba-cab6ccf5079f6aa513256f7715042c9e6e3c2f7c.zip
r14933: fix the handling of notify filters to be much closer to the behaviour
of w2k3. The behaviour is particularly tricky for rename.
Diffstat (limited to 'source/ntvfs')
-rw-r--r--source/ntvfs/posix/pvfs_mkdir.c6
-rw-r--r--source/ntvfs/posix/pvfs_open.c4
-rw-r--r--source/ntvfs/posix/pvfs_read.c5
-rw-r--r--source/ntvfs/posix/pvfs_rename.c35
-rw-r--r--source/ntvfs/posix/pvfs_setfileinfo.c15
-rw-r--r--source/ntvfs/posix/pvfs_write.c5
-rw-r--r--source/ntvfs/posix/vfs_posix.c2
7 files changed, 37 insertions, 35 deletions
diff --git a/source/ntvfs/posix/pvfs_mkdir.c b/source/ntvfs/posix/pvfs_mkdir.c
index cd83c9de43f..338fc7df0ba 100644
--- a/source/ntvfs/posix/pvfs_mkdir.c
+++ b/source/ntvfs/posix/pvfs_mkdir.c
@@ -85,7 +85,7 @@ static NTSTATUS pvfs_t2mkdir(struct pvfs_state *pvfs,
notify_trigger(pvfs->notify_context,
NOTIFY_ACTION_ADDED,
- FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME,
+ FILE_NOTIFY_CHANGE_DIR_NAME,
name->full_name);
return NT_STATUS_OK;
@@ -142,7 +142,7 @@ NTSTATUS pvfs_mkdir(struct ntvfs_module_context *ntvfs,
notify_trigger(pvfs->notify_context,
NOTIFY_ACTION_ADDED,
- FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME,
+ FILE_NOTIFY_CHANGE_DIR_NAME,
name->full_name);
return NT_STATUS_OK;
@@ -184,7 +184,7 @@ NTSTATUS pvfs_rmdir(struct ntvfs_module_context *ntvfs,
notify_trigger(pvfs->notify_context,
NOTIFY_ACTION_REMOVED,
- FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME,
+ FILE_NOTIFY_CHANGE_DIR_NAME,
name->full_name);
return NT_STATUS_OK;
diff --git a/source/ntvfs/posix/pvfs_open.c b/source/ntvfs/posix/pvfs_open.c
index 264234a09bd..5afb538db76 100644
--- a/source/ntvfs/posix/pvfs_open.c
+++ b/source/ntvfs/posix/pvfs_open.c
@@ -380,8 +380,8 @@ static NTSTATUS pvfs_open_directory(struct pvfs_state *pvfs,
create_action = NTCREATEX_ACTION_CREATED;
notify_trigger(pvfs->notify_context,
- NOTIFY_ACTION_REMOVED,
- FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME,
+ NOTIFY_ACTION_ADDED,
+ FILE_NOTIFY_CHANGE_DIR_NAME,
name->full_name);
} else {
create_action = NTCREATEX_ACTION_EXISTED;
diff --git a/source/ntvfs/posix/pvfs_read.c b/source/ntvfs/posix/pvfs_read.c
index f30c4d6e38b..411fbd9c27c 100644
--- a/source/ntvfs/posix/pvfs_read.c
+++ b/source/ntvfs/posix/pvfs_read.c
@@ -90,10 +90,5 @@ NTSTATUS pvfs_read(struct ntvfs_module_context *ntvfs,
rd->readx.out.remaining = 0xFFFF;
rd->readx.out.compaction_mode = 0;
- notify_trigger(pvfs->notify_context,
- NOTIFY_ACTION_MODIFIED,
- FILE_NOTIFY_CHANGE_LAST_ACCESS,
- f->handle->name->full_name);
-
return NT_STATUS_OK;
}
diff --git a/source/ntvfs/posix/pvfs_rename.c b/source/ntvfs/posix/pvfs_rename.c
index 824581cdafa..c3442884cff 100644
--- a/source/ntvfs/posix/pvfs_rename.c
+++ b/source/ntvfs/posix/pvfs_rename.c
@@ -28,39 +28,46 @@
/*
do a file rename, and send any notify triggers
*/
-NTSTATUS pvfs_do_rename(struct pvfs_state *pvfs, const char *name1, const char *name2)
+NTSTATUS pvfs_do_rename(struct pvfs_state *pvfs, const struct pvfs_filename *name1,
+ const char *name2)
{
const char *r1, *r2;
+ uint32_t mask;
- if (rename(name1, name2) == -1) {
+ if (rename(name1->full_name, name2) == -1) {
return pvfs_map_errno(pvfs, errno);
}
+ if (name1->dos.attrib & FILE_ATTRIBUTE_DIRECTORY) {
+ mask = FILE_NOTIFY_CHANGE_DIR_NAME;
+ } else {
+ mask = FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_ATTRIBUTES|FILE_NOTIFY_CHANGE_CREATION;
+ }
/*
renames to the same directory cause a OLD_NAME->NEW_NAME notify.
renames to a different directory are considered a remove/add
*/
- r1 = strrchr_m(name1, '/');
+ r1 = strrchr_m(name1->full_name, '/');
r2 = strrchr_m(name2, '/');
- if ((r1-name1) != (r2-name2) ||
- strncmp(name1, name2, r1-name1) != 0) {
+ if ((r1-name1->full_name) != (r2-name2) ||
+ strncmp(name1->full_name, name2, r1-name1->full_name) != 0) {
notify_trigger(pvfs->notify_context,
NOTIFY_ACTION_REMOVED,
- FILE_NOTIFY_CHANGE_FILE_NAME,
- name1);
+ mask,
+ name1->full_name);
notify_trigger(pvfs->notify_context,
NOTIFY_ACTION_ADDED,
- FILE_NOTIFY_CHANGE_FILE_NAME,
+ mask,
name2);
} else {
notify_trigger(pvfs->notify_context,
NOTIFY_ACTION_OLD_NAME,
- FILE_NOTIFY_CHANGE_FILE_NAME,
- name1);
+ mask,
+ name1->full_name);
notify_trigger(pvfs->notify_context,
NOTIFY_ACTION_NEW_NAME,
- FILE_NOTIFY_CHANGE_FILE_NAME,
+ mask,
name2);
}
@@ -217,7 +224,7 @@ static NTSTATUS pvfs_rename_one(struct pvfs_state *pvfs,
return NT_STATUS_NO_MEMORY;
}
- status = pvfs_do_rename(pvfs, name1->full_name, fname2);
+ status = pvfs_do_rename(pvfs, name1, fname2);
if (NT_STATUS_IS_OK(status)) {
status = odb_rename(lck, fname2);
@@ -338,7 +345,7 @@ static NTSTATUS pvfs_rename_mv(struct ntvfs_module_context *ntvfs,
return status;
}
- status = pvfs_do_rename(pvfs, name1->full_name, name2->full_name);
+ status = pvfs_do_rename(pvfs, name1, name2->full_name);
if (NT_STATUS_IS_OK(status)) {
status = odb_rename(lck, name2->full_name);
}
@@ -411,7 +418,7 @@ static NTSTATUS pvfs_rename_nt(struct ntvfs_module_context *ntvfs,
case RENAME_FLAG_RENAME:
status = pvfs_access_check_parent(pvfs, req, name2, SEC_DIR_ADD_FILE);
NT_STATUS_NOT_OK_RETURN(status);
- status = pvfs_do_rename(pvfs, name1->full_name, name2->full_name);
+ status = pvfs_do_rename(pvfs, name1, name2->full_name);
NT_STATUS_NOT_OK_RETURN(status);
break;
diff --git a/source/ntvfs/posix/pvfs_setfileinfo.c b/source/ntvfs/posix/pvfs_setfileinfo.c
index 9f5153eb4bd..b00624c0e95 100644
--- a/source/ntvfs/posix/pvfs_setfileinfo.c
+++ b/source/ntvfs/posix/pvfs_setfileinfo.c
@@ -147,7 +147,7 @@ static NTSTATUS pvfs_setfileinfo_rename(struct pvfs_state *pvfs,
return status;
}
- status = pvfs_do_rename(pvfs, name->full_name, name2->full_name);
+ status = pvfs_do_rename(pvfs, name, name2->full_name);
if (NT_STATUS_IS_OK(status)) {
name->full_name = talloc_steal(name, name2->full_name);
name->original_name = talloc_steal(name, name2->original_name);
@@ -292,7 +292,6 @@ NTSTATUS pvfs_setfileinfo(struct ntvfs_module_context *ntvfs,
case RAW_SFILEINFO_STANDARD:
if (!null_time(info->setattre.in.create_time)) {
unix_to_nt_time(&newstats.dos.create_time, info->setattre.in.create_time);
- change_mask |= FILE_NOTIFY_CHANGE_CREATION;
}
if (!null_time(info->setattre.in.access_time)) {
unix_to_nt_time(&newstats.dos.access_time, info->setattre.in.access_time);
@@ -311,7 +310,6 @@ NTSTATUS pvfs_setfileinfo(struct ntvfs_module_context *ntvfs,
case RAW_SFILEINFO_BASIC_INFORMATION:
if (!null_nttime(info->basic_info.in.create_time)) {
newstats.dos.create_time = info->basic_info.in.create_time;
- change_mask |= FILE_NOTIFY_CHANGE_CREATION;
}
if (!null_nttime(info->basic_info.in.access_time)) {
newstats.dos.access_time = info->basic_info.in.access_time;
@@ -408,6 +406,9 @@ NTSTATUS pvfs_setfileinfo(struct ntvfs_module_context *ntvfs,
/* possibly change the file timestamps */
ZERO_STRUCT(unix_times);
+ if (newstats.dos.create_time != h->name->dos.create_time) {
+ change_mask |= FILE_NOTIFY_CHANGE_CREATION;
+ }
if (newstats.dos.access_time != h->name->dos.access_time) {
unix_times.actime = nt_time_to_unix(newstats.dos.access_time);
change_mask |= FILE_NOTIFY_CHANGE_LAST_ACCESS;
@@ -494,7 +495,6 @@ NTSTATUS pvfs_setpathinfo(struct ntvfs_module_context *ntvfs,
case RAW_SFILEINFO_STANDARD:
if (!null_time(info->setattre.in.create_time)) {
unix_to_nt_time(&newstats.dos.create_time, info->setattre.in.create_time);
- change_mask |= FILE_NOTIFY_CHANGE_CREATION;
}
if (!null_time(info->setattre.in.access_time)) {
unix_to_nt_time(&newstats.dos.access_time, info->setattre.in.access_time);
@@ -513,7 +513,6 @@ NTSTATUS pvfs_setpathinfo(struct ntvfs_module_context *ntvfs,
case RAW_SFILEINFO_BASIC_INFORMATION:
if (!null_nttime(info->basic_info.in.create_time)) {
newstats.dos.create_time = info->basic_info.in.create_time;
- change_mask |= FILE_NOTIFY_CHANGE_CREATION;
}
if (!null_nttime(info->basic_info.in.access_time)) {
newstats.dos.access_time = info->basic_info.in.access_time;
@@ -585,11 +584,16 @@ NTSTATUS pvfs_setpathinfo(struct ntvfs_module_context *ntvfs,
/* possibly change the file timestamps */
ZERO_STRUCT(unix_times);
+ if (newstats.dos.create_time != name->dos.create_time) {
+ change_mask |= FILE_NOTIFY_CHANGE_CREATION;
+ }
if (newstats.dos.access_time != name->dos.access_time) {
unix_times.actime = nt_time_to_unix(newstats.dos.access_time);
+ change_mask |= FILE_NOTIFY_CHANGE_LAST_ACCESS;
}
if (newstats.dos.write_time != name->dos.write_time) {
unix_times.modtime = nt_time_to_unix(newstats.dos.write_time);
+ change_mask |= FILE_NOTIFY_CHANGE_LAST_WRITE;
}
if (unix_times.actime != 0 || unix_times.modtime != 0) {
if (utime(name->full_name, &unix_times) == -1) {
@@ -604,6 +608,7 @@ NTSTATUS pvfs_setpathinfo(struct ntvfs_module_context *ntvfs,
if (chmod(name->full_name, mode) == -1) {
return pvfs_map_errno(pvfs, errno);
}
+ change_mask |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
}
*name = newstats;
diff --git a/source/ntvfs/posix/pvfs_write.c b/source/ntvfs/posix/pvfs_write.c
index 15e35261761..298c95e90b0 100644
--- a/source/ntvfs/posix/pvfs_write.c
+++ b/source/ntvfs/posix/pvfs_write.c
@@ -85,10 +85,5 @@ NTSTATUS pvfs_write(struct ntvfs_module_context *ntvfs,
wr->writex.out.nwritten = ret;
wr->writex.out.remaining = 0; /* should fill this in? */
- notify_trigger(pvfs->notify_context,
- NOTIFY_ACTION_MODIFIED,
- FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE,
- f->handle->name->full_name);
-
return NT_STATUS_OK;
}
diff --git a/source/ntvfs/posix/vfs_posix.c b/source/ntvfs/posix/vfs_posix.c
index c279350e2f0..c0c1d6501c7 100644
--- a/source/ntvfs/posix/vfs_posix.c
+++ b/source/ntvfs/posix/vfs_posix.c
@@ -111,7 +111,7 @@ static int pvfs_state_destructor(void *ptr)
struct pvfs_search_state *s, *sn;
/*
- * make sure we cleanup files and searches before anythingelse
+ * make sure we cleanup files and searches before anything else
* because there destructors need to acess the pvfs_state struct
*/
for (f=pvfs->files.list; f; f=fn) {