r9007: fixed error code for setting delete on close on a non-empty directory
authorAndrew Tridgell <tridge@samba.org>
Wed, 3 Aug 2005 17:22:33 +0000 (17:22 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:31:06 +0000 (13:31 -0500)
(This used to be commit 320ab3c93b05a79b77dbbb85e9b038bb07848ba5)

source4/ntvfs/posix/pvfs_dirlist.c
source4/ntvfs/posix/pvfs_open.c

index a5d394d2aa659cc4ee544d4ecb0032643aa13169..a055773b511716a6008d4116b982e10d7d58c190 100644 (file)
@@ -310,3 +310,27 @@ NTSTATUS pvfs_list_seek(struct pvfs_dir *dir, const char *name, uint_t *ofs)
 
        return NT_STATUS_OBJECT_NAME_NOT_FOUND;
 }
+
+
+/*
+  see if a directory is empty
+*/
+BOOL pvfs_directory_empty(struct pvfs_state *pvfs, struct pvfs_filename *name)
+{
+       struct dirent *de;
+       DIR *dir = opendir(name->full_name);
+       if (dir == NULL) {
+               return True;
+       }
+
+       while ((de = readdir(dir))) {
+               if (strcmp(de->d_name, ".") != 0 &&
+                   strcmp(de->d_name, "..") != 0) {
+                       closedir(dir);
+                       return False;
+               }
+       }
+
+       closedir(dir);
+       return True;
+}
index d0e7d821171e42cb9fd47c575cf1792406e854b9..3ae8e2150f57422a2f823d9adbd83f20a7bea609 100644 (file)
@@ -1244,6 +1244,9 @@ NTSTATUS pvfs_change_create_options(struct pvfs_state *pvfs,
        }
 
        if (f->handle->name->dos.attrib & FILE_ATTRIBUTE_DIRECTORY) {
+               if (!pvfs_directory_empty(pvfs, f->handle->name)) {
+                       return NT_STATUS_DIRECTORY_NOT_EMPTY;
+               }
                f->handle->create_options = create_options;
                return NT_STATUS_OK;
        }