r23501: Move notify_rename before rename_internals_fsp and call it from there.
[sfrench/samba-autobuild/.git] / source / smbd / reply.c
index c20daae21b182447dba53fc1bd9c92ffb3e50222..205374cff74d957d9a00fcbbb3ca309fa1e1c7ee 100644 (file)
@@ -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.