r3177: check for open files on rename
[gd/samba-autobuild/.git] / source4 / ntvfs / posix / pvfs_rename.c
index 40b84f7628a39b27fc66ea882ac09089fbe7a2cd..89d6a0da14cecf3843d720128d1d7fc6e8426b25 100644 (file)
 /*
   rename a set of files
 */
-NTSTATUS pvfs_rename(struct smbsrv_request *req, union smb_rename *ren)
+NTSTATUS pvfs_rename(struct ntvfs_module_context *ntvfs,
+                    struct smbsrv_request *req, union smb_rename *ren)
 {
-       struct pvfs_state *pvfs = req->tcon->ntvfs_private;
+       struct pvfs_state *pvfs = ntvfs->private_data;
        NTSTATUS status;
        struct pvfs_filename *name1, *name2;
 
@@ -47,6 +48,11 @@ NTSTATUS pvfs_rename(struct smbsrv_request *req, union smb_rename *ren)
                return status;
        }
 
+       if (pvfs_is_open(pvfs, name1) ||
+           pvfs_is_open(pvfs, name2)) {
+               return NT_STATUS_SHARING_VIOLATION;
+       }
+
        if (name1->has_wildcard || name2->has_wildcard) {
                DEBUG(3,("Rejecting wildcard rename '%s' -> '%s'\n", 
                         ren->rename.in.pattern1, ren->rename.in.pattern2));
@@ -61,7 +67,7 @@ NTSTATUS pvfs_rename(struct smbsrv_request *req, union smb_rename *ren)
                return NT_STATUS_OBJECT_NAME_COLLISION;
        }
 
-       if (rename(name1->full_name, name2->full_name) != 0) {
+       if (rename(name1->full_name, name2->full_name) == -1) {
                return pvfs_map_errno(pvfs, errno);
        }