From e54abee4e19538760119e8e63eb23f78fd88da4f Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 6 Apr 2006 01:56:04 +0000 Subject: r14933: fix the handling of notify filters to be much closer to the behaviour of w2k3. The behaviour is particularly tricky for rename. (This used to be commit 4d3b8d95498a328ffc08ecb62d9531b6bfe4e2b5) --- source4/ntvfs/posix/pvfs_rename.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) (limited to 'source4/ntvfs/posix/pvfs_rename.c') diff --git a/source4/ntvfs/posix/pvfs_rename.c b/source4/ntvfs/posix/pvfs_rename.c index 824581cdaf..c3442884cf 100644 --- a/source4/ntvfs/posix/pvfs_rename.c +++ b/source4/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; -- cgit