r11681: filled in a few more smb2_create() fields
authorAndrew Tridgell <tridge@samba.org>
Fri, 11 Nov 2005 14:04:46 +0000 (14:04 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:46:13 +0000 (13:46 -0500)
(This used to be commit a95413568f1e45691524dfd8e9159a3bafe358ea)

source4/libcli/smb2/create.c
source4/libcli/smb2/smb2_calls.h
source4/torture/smb2/connect.c

index dc602ca71c1a2298cc5e6e8881312d41e351dc2b..53476ad0563b2787644123697fd9a2c84c24cfae 100644 (file)
@@ -51,9 +51,9 @@ struct smb2_request *smb2_create_send(struct smb2_tree *tree, struct smb2_create
        SIVAL(req->out.body, 0x14, io->in.unknown3[3]);
        SIVAL(req->out.body, 0x18, io->in.access_mask);
        SIVAL(req->out.body, 0x1C, io->in.file_attr);
-       SIVAL(req->out.body, 0x20, io->in.unknown4);
+       SIVAL(req->out.body, 0x20, io->in.share_access);
        SIVAL(req->out.body, 0x24, io->in.open_disposition);
-       SIVAL(req->out.body, 0x28, io->in.unknown5);
+       SIVAL(req->out.body, 0x28, io->in.create_options);
 
        SSVAL(req->out.body, 0x2C, 0x40+0x38); /* offset to fname */
        SSVAL(req->out.body, 0x2E, path.length);
@@ -99,13 +99,10 @@ NTSTATUS smb2_create_recv(struct smb2_request *req, struct smb2_create *io)
        io->out.access_time = smbcli_pull_nttime(req->in.body, 0x10);
        io->out.write_time  = smbcli_pull_nttime(req->in.body, 0x18);
        io->out.change_time = smbcli_pull_nttime(req->in.body, 0x20);
-       io->out.unknown3 = IVAL(req->in.body, 0x24);
-       io->out.unknown4 = IVAL(req->in.body, 0x28);
-       io->out.unknown5 = IVAL(req->in.body, 0x2C);
-       io->out.unknown6 = IVAL(req->in.body, 0x30);
-       io->out.unknown7 = IVAL(req->in.body, 0x34);
-       io->out.unknown8 = IVAL(req->in.body, 0x38);
-       io->out.unknown9 = IVAL(req->in.body, 0x3C);
+       io->out.alloc_size  = BVAL(req->in.body, 0x28);
+       io->out.size        = BVAL(req->in.body, 0x30);
+       io->out.file_attr   = IVAL(req->in.body, 0x38);
+       io->out.unknown8    = IVAL(req->in.body, 0x3C);
        io->out.handle.data[0] = BVAL(req->in.body, 0x40);
        io->out.handle.data[1] = BVAL(req->in.body, 0x48);
        io->out.unknown10 = IVAL(req->in.body, 0x50);
index 7d41a0615314a94e76da778a62d719adc698e156..639a9c47c325ac8e10ac086b49ff98b7eaa46d88 100644 (file)
@@ -89,9 +89,9 @@ struct smb2_create {
                uint32_t unknown3[4];
                uint32_t access_mask;
                uint32_t file_attr;
-               uint32_t unknown4;
+               uint32_t share_access;
                uint32_t open_disposition;
-               uint32_t unknown5;
+               uint32_t create_options;
                /* ofs/len of name here, 16 bits */
                uint32_t unknown6;
                const char *fname;
@@ -109,15 +109,12 @@ struct smb2_create {
                NTTIME   access_time;
                NTTIME   write_time;
                NTTIME   change_time;
+               uint64_t alloc_size;
+               uint64_t size;
+               uint32_t file_attr;
                uint32_t unknown3;
-               uint32_t unknown4;
-               uint32_t unknown5;
-               uint32_t unknown6;
-               uint32_t unknown7;
-               uint32_t unknown8;
-               uint32_t unknown9;
                struct smb2_handle handle;
-               uint32_t unknown10;
+               uint32_t unknown4;
        } out;
 };
 
index ee323a8b3a0778f843311a12d2ed280283790c31..53236d3b27389d98ea29ca2478fef5fc24404061 100644 (file)
@@ -196,68 +196,79 @@ static struct smb2_tree *torture_smb2_tree(struct smb2_session *session,
 }
 
 /*
-  send a create
+  send a close
 */
-static struct smb2_handle torture_smb2_create(struct smb2_tree *tree, 
-                                             const char *fname)
+static NTSTATUS torture_smb2_close(struct smb2_tree *tree, struct smb2_handle handle)
 {
-       struct smb2_create io;
+       struct smb2_close io;
        NTSTATUS status;
        TALLOC_CTX *tmp_ctx = talloc_new(tree);
 
        ZERO_STRUCT(io);
-       io.in.unknown1 = 0x09000039;
-       io.in.access_mask = SEC_RIGHTS_FILE_ALL;
-       io.in.file_attr   = FILE_ATTRIBUTE_NORMAL;
-       io.in.open_disposition = NTCREATEX_DISP_OVERWRITE_IF;
-       io.in.fname = fname;
-       status = smb2_create(tree, &io);
+       io.in.unknown1 = 0x10018;
+       io.in.handle   = handle;
+       status = smb2_close(tree, &io);
        if (!NT_STATUS_IS_OK(status)) {
-               printf("create failed - %s\n", nt_errstr(status));
-               return io.out.handle;
+               printf("close failed - %s\n", nt_errstr(status));
+               return status;
        }
 
-       printf("Open gave:\n");
+       printf("Close gave:\n");
        printf("create_time     = %s\n", nt_time_string(tmp_ctx, io.out.create_time));
        printf("access_time     = %s\n", nt_time_string(tmp_ctx, io.out.access_time));
        printf("write_time      = %s\n", nt_time_string(tmp_ctx, io.out.write_time));
        printf("change_time     = %s\n", nt_time_string(tmp_ctx, io.out.change_time));
-       printf("handle          = %016llx%016llx\n", 
-              io.out.handle.data[0], 
-              io.out.handle.data[1]);
 
        talloc_free(tmp_ctx);
        
-       return io.out.handle;
+       return status;
 }
 
+
 /*
-  send a close
+  send a create
 */
-static NTSTATUS torture_smb2_close(struct smb2_tree *tree, struct smb2_handle handle)
+static struct smb2_handle torture_smb2_create(struct smb2_tree *tree, 
+                                             const char *fname)
 {
-       struct smb2_close io;
+       struct smb2_create io;
        NTSTATUS status;
        TALLOC_CTX *tmp_ctx = talloc_new(tree);
 
        ZERO_STRUCT(io);
-       io.in.unknown1 = 0x10018;
-       io.in.handle   = handle;
-       status = smb2_close(tree, &io);
+       io.in.unknown1 = 0x09000039; /* gets an oplock */
+       io.in.unknown1 = 0x00000039; /* no oplock */
+       io.in.access_mask = SEC_RIGHTS_FILE_ALL;
+       io.in.file_attr   = FILE_ATTRIBUTE_NORMAL;
+       io.in.open_disposition = NTCREATEX_DISP_OPEN;
+       io.in.share_access = 
+               NTCREATEX_SHARE_ACCESS_DELETE|
+               NTCREATEX_SHARE_ACCESS_READ|
+               NTCREATEX_SHARE_ACCESS_WRITE;
+       io.in.create_options = NTCREATEX_OPTIONS_WRITE_THROUGH;
+       io.in.fname = fname;
+
+       status = smb2_create(tree, &io);
        if (!NT_STATUS_IS_OK(status)) {
-               printf("close failed - %s\n", nt_errstr(status));
-               return status;
+               printf("create1 failed - %s\n", nt_errstr(status));
+               return io.out.handle;
        }
 
-       printf("Close gave:\n");
+       printf("Open gave:\n");
        printf("create_time     = %s\n", nt_time_string(tmp_ctx, io.out.create_time));
        printf("access_time     = %s\n", nt_time_string(tmp_ctx, io.out.access_time));
        printf("write_time      = %s\n", nt_time_string(tmp_ctx, io.out.write_time));
        printf("change_time     = %s\n", nt_time_string(tmp_ctx, io.out.change_time));
+       printf("alloc_size      = %lld\n", io.out.alloc_size);
+       printf("size            = %lld\n", io.out.size);
+       printf("file_attr       = 0x%x\n", io.out.file_attr);
+       printf("handle          = %016llx%016llx\n", 
+              io.out.handle.data[0], 
+              io.out.handle.data[1]);
 
        talloc_free(tmp_ctx);
        
-       return status;
+       return io.out.handle;
 }
 
 /* 
@@ -277,8 +288,8 @@ BOOL torture_smb2_connect(void)
        transport = torture_smb2_negprot(mem_ctx, host);
        session   = torture_smb2_session(transport, credentials);
        tree      = torture_smb2_tree(session, share);
-       h1        = torture_smb2_create(tree, "test1.dat");
-       h2        = torture_smb2_create(tree, "test2.dat");
+       h1        = torture_smb2_create(tree, "test.dat");
+       h2        = torture_smb2_create(tree, "test1.dat");
        torture_smb2_close(tree, h1);
        torture_smb2_close(tree, h2);