r3800: - fixed delete-on-close behaviour for streams
authorAndrew Tridgell <tridge@samba.org>
Wed, 17 Nov 2004 06:44:50 +0000 (06:44 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:05:55 +0000 (13:05 -0500)
- added a delete-on-close test to RAW-STREAMS

- don't allow rename of streams at the moment (I need to work out if
  its supposed to be allowed first)
(This used to be commit f4b2b1311da6e37ac0947a3419d89c77ebbd6b63)

source4/ntvfs/posix/pvfs_open.c
source4/ntvfs/posix/pvfs_setfileinfo.c
source4/torture/raw/streams.c

index a772feb623622bd3641138974bf6ebe556e7b633..d8f3342f0d19293ddc0ce283c317e967be6777d5 100644 (file)
@@ -225,6 +225,16 @@ static int pvfs_handle_destructor(void *p)
 {
        struct pvfs_file_handle *h = p;
 
+       if ((h->create_options & NTCREATEX_OPTIONS_DELETE_ON_CLOSE) &&
+           h->name->stream_name) {
+               NTSTATUS status;
+               status = pvfs_stream_delete(h->pvfs, h->name, h->fd);
+               if (!NT_STATUS_IS_OK(status)) {
+                       DEBUG(0,("Failed to delete stream '%s' on close of '%s'\n",
+                                h->name->stream_name, h->name->full_name));
+               }
+       }
+
        if (h->fd != -1) {
                if (close(h->fd) != 0) {
                        DEBUG(0,("pvfs_handle_destructor: close(%d) failed for %s - %s\n",
@@ -233,7 +243,8 @@ static int pvfs_handle_destructor(void *p)
                h->fd = -1;
        }
 
-       if (h->create_options & NTCREATEX_OPTIONS_DELETE_ON_CLOSE) {
+       if ((h->create_options & NTCREATEX_OPTIONS_DELETE_ON_CLOSE) &&
+           h->name->stream_name == NULL) {
                if (unlink(h->name->full_name) != 0) {
                        DEBUG(0,("pvfs_close: failed to delete '%s' - %s\n", 
                                 h->name->full_name, strerror(errno)));
index ede07983b3aa3fcf319d8c60edd1ce0ba8230bce..58a3372f820daf86a6fb09ae0ac5b51d3b9a20b2 100644 (file)
@@ -48,6 +48,11 @@ static NTSTATUS pvfs_setfileinfo_rename(struct pvfs_state *pvfs,
                return NT_STATUS_FILE_IS_A_DIRECTORY;
        }
 
+       /* don't allow stream renames for now */
+       if (name->stream_name) {
+               return NT_STATUS_INVALID_PARAMETER;
+       }
+
        /* w2k3 does not appear to allow relative rename */
        if (r->root_fid != 0) {
                return NT_STATUS_INVALID_PARAMETER;
@@ -366,7 +371,8 @@ NTSTATUS pvfs_setpathinfo(struct ntvfs_module_context *ntvfs,
        struct utimbuf unix_times;
 
        /* resolve the cifs name to a posix name */
-       status = pvfs_resolve_name(pvfs, req, info->generic.file.fname, 0, &name);
+       status = pvfs_resolve_name(pvfs, req, info->generic.file.fname, 
+                                  PVFS_RESOLVE_STREAMS, &name);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
index 7bc80b8502b73c4f4013bc5a2807fec4c143ae58..933a102989879045e574068e70def57c031d9716 100644 (file)
@@ -183,6 +183,21 @@ static BOOL test_stream_io(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        status = smbcli_unlink(cli->tree, sname1);
        CHECK_STATUS(status, NT_STATUS_OK);
 
+       printf("delete a stream via delete-on-close\n");
+       io.ntcreatex.in.fname = sname2;
+       io.ntcreatex.in.create_options = NTCREATEX_OPTIONS_DELETE_ON_CLOSE;
+       io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_DELETE;
+       io.ntcreatex.in.access_mask = GENERIC_RIGHTS_FILE_ALL_ACCESS;
+       io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN;
+       status = smb_raw_open(cli->tree, mem_ctx, &io);
+       CHECK_STATUS(status, NT_STATUS_OK);
+       fnum = io.ntcreatex.out.fnum;
+       
+       smbcli_close(cli->tree, fnum);
+       status = smbcli_unlink(cli->tree, sname2);
+       CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_NOT_FOUND);
+
+
        printf("deleting file\n");
        status = smbcli_unlink(cli->tree, fname);
        CHECK_STATUS(status, NT_STATUS_OK);