From 59c872103dc82a1a9dcb743b39e4ca0f0205dad2 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 14 Jun 2007 15:50:47 +0000 Subject: r23501: Move notify_rename before rename_internals_fsp and call it from there. (This used to be commit 8d3828871c561cd05e6461e157db4c0ccddd5f22) --- source3/smbd/reply.c | 86 +++++++++++++++++++++++++++------------------------- 1 file changed, 44 insertions(+), 42 deletions(-) (limited to 'source3/smbd') diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index c20daae21b..205374cff7 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -4230,6 +4230,48 @@ static BOOL rename_path_prefix_equal(const char *src, const char *dest) return ((memcmp(psrc, pdst, slen) == 0) && pdst[slen] == '/'); } +/* + * Do the notify calls from a rename + */ + +static void notify_rename(connection_struct *conn, BOOL is_dir, + const char *oldpath, const char *newpath) +{ + char *olddir, *newdir; + const char *oldname, *newname; + uint32 mask; + + mask = is_dir ? FILE_NOTIFY_CHANGE_DIR_NAME + : FILE_NOTIFY_CHANGE_FILE_NAME; + + if (!parent_dirname_talloc(NULL, oldpath, &olddir, &oldname) + || !parent_dirname_talloc(NULL, newpath, &newdir, &newname)) { + TALLOC_FREE(olddir); + return; + } + + if (strcmp(olddir, newdir) == 0) { + notify_fname(conn, NOTIFY_ACTION_OLD_NAME, mask, oldpath); + notify_fname(conn, NOTIFY_ACTION_NEW_NAME, mask, newpath); + } + else { + notify_fname(conn, NOTIFY_ACTION_REMOVED, mask, oldpath); + notify_fname(conn, NOTIFY_ACTION_ADDED, mask, newpath); + } + TALLOC_FREE(olddir); + TALLOC_FREE(newdir); + + /* this is a strange one. w2k3 gives an additional event for + CHANGE_ATTRIBUTES and CHANGE_CREATION on the new file when renaming + files, but not directories */ + if (!is_dir) { + notify_fname(conn, NOTIFY_ACTION_MODIFIED, + FILE_NOTIFY_CHANGE_ATTRIBUTES + |FILE_NOTIFY_CHANGE_CREATION, + newpath); + } +} + /**************************************************************************** Rename an open file - given an fsp. ****************************************************************************/ @@ -4366,6 +4408,8 @@ NTSTATUS rename_internals_fsp(connection_struct *conn, files_struct *fsp, pstrin rename_open_files(conn, lck, newname); + notify_rename(conn, fsp->is_directory, fsp->fsp_name, newname); + /* * A rename acts as a new file create w.r.t. allowing an initial delete * on close, probably because in Windows there is a new handle to the @@ -4404,48 +4448,6 @@ NTSTATUS rename_internals_fsp(connection_struct *conn, files_struct *fsp, pstrin return status; } -/* - * Do the notify calls from a rename - */ - -static void notify_rename(connection_struct *conn, BOOL is_dir, - const char *oldpath, const char *newpath) -{ - char *olddir, *newdir; - const char *oldname, *newname; - uint32 mask; - - mask = is_dir ? FILE_NOTIFY_CHANGE_DIR_NAME - : FILE_NOTIFY_CHANGE_FILE_NAME; - - if (!parent_dirname_talloc(NULL, oldpath, &olddir, &oldname) - || !parent_dirname_talloc(NULL, newpath, &newdir, &newname)) { - TALLOC_FREE(olddir); - return; - } - - if (strcmp(olddir, newdir) == 0) { - notify_fname(conn, NOTIFY_ACTION_OLD_NAME, mask, oldpath); - notify_fname(conn, NOTIFY_ACTION_NEW_NAME, mask, newpath); - } - else { - notify_fname(conn, NOTIFY_ACTION_REMOVED, mask, oldpath); - notify_fname(conn, NOTIFY_ACTION_ADDED, mask, newpath); - } - TALLOC_FREE(olddir); - TALLOC_FREE(newdir); - - /* this is a strange one. w2k3 gives an additional event for - CHANGE_ATTRIBUTES and CHANGE_CREATION on the new file when renaming - files, but not directories */ - if (!is_dir) { - notify_fname(conn, NOTIFY_ACTION_MODIFIED, - FILE_NOTIFY_CHANGE_ATTRIBUTES - |FILE_NOTIFY_CHANGE_CREATION, - newpath); - } -} - /**************************************************************************** The guts of the rename command, split out so it may be called by the NT SMB code. -- cgit