summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Lendecke <vlendec@samba.org>2007-06-14 15:50:47 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:23:22 -0500
commit59c872103dc82a1a9dcb743b39e4ca0f0205dad2 (patch)
tree82c28ed88fa40d440fc596f24b88238429b9bd8d
parent9c4d185ef0740ea31da8718b9cb16dac7cddcc15 (diff)
downloadsamba-59c872103dc82a1a9dcb743b39e4ca0f0205dad2.tar.gz
samba-59c872103dc82a1a9dcb743b39e4ca0f0205dad2.tar.bz2
samba-59c872103dc82a1a9dcb743b39e4ca0f0205dad2.zip
r23501: Move notify_rename before rename_internals_fsp and call it from there.
(This used to be commit 8d3828871c561cd05e6461e157db4c0ccddd5f22)
-rw-r--r--source3/smbd/reply.c86
1 files changed, 44 insertions, 42 deletions
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.