The branch, master has been updated
       via  0a42493 libctdb: Avoid an explicit memset
       via  e0bda35 torture: support Windows 2k8 response for 
compress_invalid_buf
       via  2c7c3fd torture: add more [no-]compress-on-open ioctl tests
       via  337a94f torture: add file_attribs arg to file create helper
       via  0ad2ca9 torture: add compressed file attribute ioctl test
       via  e1b4586 torture: check for filesystem compression capability
       via  f47ff9d torture: extend FSCTL_[GET/SET]_COMPRESSION tests
      from  b706ca6 s3:libsmb: call smb2cli_logoff() from cli_ulogoff()

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 0a42493763509880e0aa34fc59c78875e6f9af08
Author: Volker Lendecke <[email protected]>
Date:   Tue Aug 13 10:50:15 2013 +0000

    libctdb: Avoid an explicit memset
    
    Give the compiler a chance to use better code. Saves a few bytes of text.
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>
    
    Autobuild-User(master): Jeremy Allison <[email protected]>
    Autobuild-Date(master): Fri Aug 16 01:51:55 CEST 2013 on sn-devel-104

commit e0bda35cf5f3b4d0da9a1c1a6b84a49390d4e3e2
Author: David Disseldorp <[email protected]>
Date:   Tue Aug 13 18:07:28 2013 +0200

    torture: support Windows 2k8 response for compress_invalid_buf
    
    Windows Server 2012 returns NT_STATUS_INVALID_USER_BUFFER, Windows
    Server 2008r2 returns NT_STATUS_INVALID_PARAMETER. Don't fail the test
    if either status is returned.
    
    Signed-off-by: David Disseldorp <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 2c7c3fd2d68ca8ce82f46c32d6c97b02131af524
Author: David Disseldorp <[email protected]>
Date:   Tue Aug 13 18:07:27 2013 +0200

    torture: add more [no-]compress-on-open ioctl tests
    
    compress_create_with_attr: Specifies the FILE_ATTRIBUTE_COMPRESSED
    attribute at create time, then checks the created file.
    
    compress_inherit_disable: Creates under a compressed directory, a file
    with the NTCREATEX_OPTIONS_NO_COMPRESSION option. Then checks that the
    newly created file doesn't inherit the parent compression state.
    
    Signed-off-by: David Disseldorp <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 337a94f7568fb3f5e02dbee0e10659de99258c8e
Author: David Disseldorp <[email protected]>
Date:   Tue Aug 13 18:07:26 2013 +0200

    torture: add file_attribs arg to file create helper
    
    Allows for the testing of file creation with FILE_ATTRIBUTE_COMPRESSED.
    
    Signed-off-by: David Disseldorp <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 0ad2ca98ce3fd19872637098d9accba6191ec0ee
Author: David Disseldorp <[email protected]>
Date:   Tue Aug 13 18:07:25 2013 +0200

    torture: add compressed file attribute ioctl test
    
    After marking a file for compression via FSCTL_SET_COMPRESSION, the
    FILE_ATTRIBUTE_COMPRESSED flag should be present. Test for this.
    
    Signed-off-by: David Disseldorp <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit e1b45869de5b7b36b263cb034b9682401b726422
Author: David Disseldorp <[email protected]>
Date:   Tue Aug 13 18:07:24 2013 +0200

    torture: check for filesystem compression capability
    
    Only run the compression tests if the compression capability is returned
    by the server in response to an SMB2_QUERY_INFO(FS attribute info)
    request.
    
    Signed-off-by: David Disseldorp <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit f47ff9d2271990d43a1387ff39c0e75d01611b2a
Author: David Disseldorp <[email protected]>
Date:   Tue Aug 13 18:07:23 2013 +0200

    torture: extend FSCTL_[GET/SET]_COMPRESSION tests
    
    Check for inheritance of compression attributes from parent directories.
    Also, test error handling for invalid requests.
    
    Signed-off-by: David Disseldorp <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

-----------------------------------------------------------------------

Summary of changes:
 source3/lib/ctdbd_conn.c     |    3 +-
 source4/torture/smb2/ioctl.c |  511 ++++++++++++++++++++++++++++++++++++++----
 2 files changed, 473 insertions(+), 41 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/lib/ctdbd_conn.c b/source3/lib/ctdbd_conn.c
index 1481a9c..4f5dce0 100644
--- a/source3/lib/ctdbd_conn.c
+++ b/source3/lib/ctdbd_conn.c
@@ -201,7 +201,7 @@ static NTSTATUS ctdbd_connect(TALLOC_CTX *mem_ctx,
 {
        struct ctdb_packet_context *result;
        const char *sockname = lp_ctdbd_socket();
-       struct sockaddr_un addr;
+       struct sockaddr_un addr = { 0, };
        int fd;
        socklen_t salen;
 
@@ -211,7 +211,6 @@ static NTSTATUS ctdbd_connect(TALLOC_CTX *mem_ctx,
                return map_nt_error_from_unix(errno);
        }
 
-       ZERO_STRUCT(addr);
        addr.sun_family = AF_UNIX;
        snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", sockname);
 
diff --git a/source4/torture/smb2/ioctl.c b/source4/torture/smb2/ioctl.c
index 6b5895b..75379af 100644
--- a/source4/torture/smb2/ioctl.c
+++ b/source4/torture/smb2/ioctl.c
@@ -3,7 +3,7 @@
 
    test suite for SMB2 ioctl operations
 
-   Copyright (C) David Disseldorp 2011
+   Copyright (C) David Disseldorp 2011-2013
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -29,6 +29,7 @@
 
 #define FNAME  "testfsctl.dat"
 #define FNAME2 "testfsctl2.dat"
+#define DNAME  "testfsctl_dir"
 
 /*
    basic testing of SMB2 shadow copy calls
@@ -153,7 +154,8 @@ static bool test_setup_create_fill(struct torture_context 
*torture,
                                   const char *fname,
                                   struct smb2_handle *fh,
                                   uint64_t size,
-                                  uint32_t desired_access)
+                                  uint32_t desired_access,
+                                  uint32_t file_attributes)
 {
        struct smb2_create io;
        NTSTATUS status;
@@ -165,7 +167,7 @@ static bool test_setup_create_fill(struct torture_context 
*torture,
 
        ZERO_STRUCT(io);
        io.in.desired_access = desired_access;
-       io.in.file_attributes   = FILE_ATTRIBUTE_NORMAL;
+       io.in.file_attributes = file_attributes;
        io.in.create_disposition = NTCREATEX_DISP_OPEN_IF;
        io.in.share_access =
                NTCREATEX_SHARE_ACCESS_DELETE|
@@ -214,11 +216,13 @@ static bool test_setup_copy_chunk(struct torture_context 
*torture,
        enum ndr_err_code ndr_ret;
 
        ok = test_setup_create_fill(torture, tree, mem_ctx, FNAME,
-                                   src_h, src_size, src_desired_access);
+                                   src_h, src_size, src_desired_access,
+                                   FILE_ATTRIBUTE_NORMAL);
        torture_assert(torture, ok, "src file create fill");
 
        ok = test_setup_create_fill(torture, tree, mem_ctx, FNAME2,
-                                   dest_h, dest_size, dest_desired_access);
+                                   dest_h, dest_size, dest_desired_access,
+                                   FILE_ATTRIBUTE_NORMAL);
        torture_assert(torture, ok, "dest file create fill");
 
        ZERO_STRUCTPN(ioctl);
@@ -1530,20 +1534,41 @@ static bool test_ioctl_copy_chunk_max_output_sz(struct 
torture_context *torture,
        return true;
 }
 
-static bool test_ioctl_compress_file_flag(struct torture_context *torture,
-                                           struct smb2_tree *tree)
+static NTSTATUS test_ioctl_compress_fs_supported(struct torture_context 
*torture,
+                                                struct smb2_tree *tree,
+                                                TALLOC_CTX *mem_ctx,
+                                                struct smb2_handle *fh,
+                                                bool *compress_support)
 {
-       struct smb2_handle fh;
        NTSTATUS status;
+       union smb_fsinfo info;
+
+       ZERO_STRUCT(info);
+       info.generic.level = RAW_QFS_ATTRIBUTE_INFORMATION;
+       info.generic.handle = *fh;
+       status = smb2_getinfo_fs(tree, tree, &info);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       if (info.attribute_info.out.fs_attr & FILE_FILE_COMPRESSION) {
+               *compress_support = true;
+       } else {
+               *compress_support = false;
+       }
+       return NT_STATUS_OK;
+}
+
+static NTSTATUS test_ioctl_compress_get(struct torture_context *torture,
+                                       TALLOC_CTX *mem_ctx,
+                                       struct smb2_tree *tree,
+                                       struct smb2_handle fh,
+                                       uint16_t *_compression_fmt)
+{
        union smb_ioctl ioctl;
-       TALLOC_CTX *tmp_ctx = talloc_new(tree);
        struct compression_state cmpr_state;
        enum ndr_err_code ndr_ret;
-       bool ok;
-
-       ok = test_setup_create_fill(torture, tree, tmp_ctx,
-                                   FNAME, &fh, 0, SEC_RIGHTS_FILE_ALL);
-       torture_assert(torture, ok, "setup compression file");
+       NTSTATUS status;
 
        ZERO_STRUCT(ioctl);
        ioctl.smb2.level = RAW_IOCTL_SMB2;
@@ -1552,66 +1577,462 @@ static bool test_ioctl_compress_file_flag(struct 
torture_context *torture,
        ioctl.smb2.in.max_response_size = sizeof(struct compression_state);
        ioctl.smb2.in.flags = SMB2_IOCTL_FLAG_IS_FSCTL;
 
-       status = smb2_ioctl(tree, tmp_ctx, &ioctl.smb2);
-       if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED)
-        || NT_STATUS_EQUAL(status, NT_STATUS_INVALID_DEVICE_REQUEST)) {
-               smb2_util_close(tree, fh);
-               torture_skip(torture, "FSCTL_GET_COMPRESSION not supported\n");
+       status = smb2_ioctl(tree, mem_ctx, &ioctl.smb2);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
        }
-       torture_assert_ntstatus_ok(torture, status, "FSCTL_GET_COMPRESSION");
 
-       ndr_ret = ndr_pull_struct_blob(&ioctl.smb2.out.out, tmp_ctx,
+       ndr_ret = ndr_pull_struct_blob(&ioctl.smb2.out.out, mem_ctx,
                                       &cmpr_state,
                        (ndr_pull_flags_fn_t)ndr_pull_compression_state);
 
-       torture_assert_ndr_success(torture, ndr_ret,
-                                  "ndr_pull_compression_state");
+       if (ndr_ret != NDR_ERR_SUCCESS) {
+               return NT_STATUS_INTERNAL_ERROR;
+       }
 
-       torture_assert(torture, (cmpr_state.format == COMPRESSION_FORMAT_NONE),
-                      "initial compression state not NONE");
+       *_compression_fmt = cmpr_state.format;
+       return NT_STATUS_OK;
+}
+
+static NTSTATUS test_ioctl_compress_set(struct torture_context *torture,
+                                       TALLOC_CTX *mem_ctx,
+                                       struct smb2_tree *tree,
+                                       struct smb2_handle fh,
+                                       uint16_t compression_fmt)
+{
+       union smb_ioctl ioctl;
+       struct compression_state cmpr_state;
+       enum ndr_err_code ndr_ret;
+       NTSTATUS status;
 
        ZERO_STRUCT(ioctl);
        ioctl.smb2.level = RAW_IOCTL_SMB2;
        ioctl.smb2.in.file.handle = fh;
        ioctl.smb2.in.function = FSCTL_SET_COMPRESSION;
+       ioctl.smb2.in.max_response_size = 0;
        ioctl.smb2.in.flags = SMB2_IOCTL_FLAG_IS_FSCTL;
 
-       cmpr_state.format = COMPRESSION_FORMAT_DEFAULT;
-       ndr_ret = ndr_push_struct_blob(&ioctl.smb2.in.out, tmp_ctx,
+       cmpr_state.format = compression_fmt;
+       ndr_ret = ndr_push_struct_blob(&ioctl.smb2.in.out, mem_ctx,
                                       &cmpr_state,
                        (ndr_push_flags_fn_t)ndr_push_compression_state);
-       torture_assert_ndr_success(torture, ndr_ret,
-                                  "ndr_push_compression_state");
+       if (ndr_ret != NDR_ERR_SUCCESS) {
+               return NT_STATUS_INTERNAL_ERROR;
+       }
 
-       status = smb2_ioctl(tree, tmp_ctx, &ioctl.smb2);
+       status = smb2_ioctl(tree, mem_ctx, &ioctl.smb2);
+       return status;
+}
+
+static bool test_ioctl_compress_file_flag(struct torture_context *torture,
+                                           struct smb2_tree *tree)
+{
+       struct smb2_handle fh;
+       NTSTATUS status;
+       TALLOC_CTX *tmp_ctx = talloc_new(tree);
+       bool ok;
+       uint16_t compression_fmt;
+
+       ok = test_setup_create_fill(torture, tree, tmp_ctx,
+                                   FNAME, &fh, 0, SEC_RIGHTS_FILE_ALL,
+                                   FILE_ATTRIBUTE_NORMAL);
+       torture_assert(torture, ok, "setup compression file");
+
+       status = test_ioctl_compress_fs_supported(torture, tree, tmp_ctx, &fh,
+                                                 &ok);
+       torture_assert_ntstatus_ok(torture, status, "SMB2_GETINFO_FS");
+       if (!ok) {
+               smb2_util_close(tree, fh);
+               torture_skip(torture, "FS compression not supported\n");
+       }
+
+       status = test_ioctl_compress_get(torture, tmp_ctx, tree, fh,
+                                        &compression_fmt);
+       torture_assert_ntstatus_ok(torture, status, "FSCTL_GET_COMPRESSION");
+
+       torture_assert(torture, (compression_fmt == COMPRESSION_FORMAT_NONE),
+                      "initial compression state not NONE");
+
+       status = test_ioctl_compress_set(torture, tmp_ctx, tree, fh,
+                                        COMPRESSION_FORMAT_DEFAULT);
+       torture_assert_ntstatus_ok(torture, status, "FSCTL_SET_COMPRESSION");
+
+       status = test_ioctl_compress_get(torture, tmp_ctx, tree, fh,
+                                        &compression_fmt);
+       torture_assert_ntstatus_ok(torture, status, "FSCTL_GET_COMPRESSION");
+
+       torture_assert(torture, (compression_fmt == COMPRESSION_FORMAT_LZNT1),
+                      "invalid compression state after set");
+
+       smb2_util_close(tree, fh);
+       talloc_free(tmp_ctx);
+       return true;
+}
+
+static bool test_ioctl_compress_dir_inherit(struct torture_context *torture,
+                                           struct smb2_tree *tree)
+{
+       struct smb2_handle dirh;
+       struct smb2_handle fh;
+       NTSTATUS status;
+       TALLOC_CTX *tmp_ctx = talloc_new(tree);
+       uint16_t compression_fmt;
+       bool ok;
+       char path_buf[PATH_MAX];
+
+       smb2_deltree(tree, DNAME);
+       status = smb2_util_mkdir(tree, DNAME);
+       torture_assert_ntstatus_ok(torture, status, "mkdir");
+
+       ok = test_setup_create_fill(torture, tree, tmp_ctx,
+                                   DNAME, &dirh, 0, SEC_RIGHTS_FILE_ALL,
+                                   FILE_ATTRIBUTE_DIRECTORY);
+       torture_assert(torture, ok, "setup compression directory");
+
+       status = test_ioctl_compress_fs_supported(torture, tree, tmp_ctx, &dirh,
+                                                 &ok);
+       torture_assert_ntstatus_ok(torture, status, "SMB2_GETINFO_FS");
+       if (!ok) {
+               smb2_util_close(tree, dirh);
+               smb2_deltree(tree, DNAME);
+               torture_skip(torture, "FS compression not supported\n");
+       }
+
+       /* set compression on parent dir, then check for inheritance */
+       status = test_ioctl_compress_set(torture, tmp_ctx, tree, dirh,
+                                        COMPRESSION_FORMAT_LZNT1);
+       torture_assert_ntstatus_ok(torture, status, "FSCTL_SET_COMPRESSION");
+
+       status = test_ioctl_compress_get(torture, tmp_ctx, tree, dirh,
+                                        &compression_fmt);
+       torture_assert_ntstatus_ok(torture, status, "FSCTL_GET_COMPRESSION");
+
+       torture_assert(torture, (compression_fmt == COMPRESSION_FORMAT_LZNT1),
+                      "invalid compression state after set");
+
+       snprintf(path_buf, PATH_MAX, "%s\\%s", DNAME, FNAME);
+       ok = test_setup_create_fill(torture, tree, tmp_ctx,
+                                   path_buf, &fh, 4096, SEC_RIGHTS_FILE_ALL,
+                                   FILE_ATTRIBUTE_NORMAL);
+       torture_assert(torture, ok, "setup compression file");
+
+       status = test_ioctl_compress_get(torture, tmp_ctx, tree, fh,
+                                        &compression_fmt);
+       torture_assert_ntstatus_ok(torture, status, "FSCTL_GET_COMPRESSION");
+
+       torture_assert(torture, (compression_fmt == COMPRESSION_FORMAT_LZNT1),
+                      "compression attr not inherited by new file");
+
+       /* check compressed data is consistent */
+       ok = check_pattern(torture, tree, tmp_ctx, fh, 0, 4096, 0);
+
+       /* disable dir compression attr, file should remain compressed */
+       status = test_ioctl_compress_set(torture, tmp_ctx, tree, dirh,
+                                        COMPRESSION_FORMAT_NONE);
        torture_assert_ntstatus_ok(torture, status, "FSCTL_SET_COMPRESSION");
 
+       status = test_ioctl_compress_get(torture, tmp_ctx, tree, fh,
+                                        &compression_fmt);
+       torture_assert_ntstatus_ok(torture, status, "FSCTL_GET_COMPRESSION");
+
+       torture_assert(torture, (compression_fmt == COMPRESSION_FORMAT_LZNT1),
+                      "file compression attr removed after dir change");
+       smb2_util_close(tree, fh);
+
+       /* new files should no longer inherit compression attr */
+       snprintf(path_buf, PATH_MAX, "%s\\%s", DNAME, FNAME2);
+       ok = test_setup_create_fill(torture, tree, tmp_ctx,
+                                   path_buf, &fh, 0, SEC_RIGHTS_FILE_ALL,
+                                   FILE_ATTRIBUTE_NORMAL);
+       torture_assert(torture, ok, "setup file");
+
+       status = test_ioctl_compress_get(torture, tmp_ctx, tree, fh,
+                                        &compression_fmt);
+       torture_assert_ntstatus_ok(torture, status, "FSCTL_GET_COMPRESSION");
+
+       torture_assert(torture, (compression_fmt == COMPRESSION_FORMAT_NONE),
+                      "compression attr present on new file");
+
+       smb2_util_close(tree, fh);
+       smb2_util_close(tree, dirh);
+       smb2_deltree(tree, DNAME);
+       talloc_free(tmp_ctx);
+       return true;
+}
+
+static bool test_ioctl_compress_invalid_format(struct torture_context *torture,
+                                              struct smb2_tree *tree)
+{
+       struct smb2_handle fh;
+       NTSTATUS status;
+       TALLOC_CTX *tmp_ctx = talloc_new(tree);
+       bool ok;
+       uint16_t compression_fmt;
+
+       ok = test_setup_create_fill(torture, tree, tmp_ctx,
+                                   FNAME, &fh, 0, SEC_RIGHTS_FILE_ALL,
+                                   FILE_ATTRIBUTE_NORMAL);
+       torture_assert(torture, ok, "setup compression file");
+
+       status = test_ioctl_compress_fs_supported(torture, tree, tmp_ctx, &fh,
+                                                 &ok);
+       torture_assert_ntstatus_ok(torture, status, "SMB2_GETINFO_FS");
+       if (!ok) {
+               smb2_util_close(tree, fh);
+               torture_skip(torture, "FS compression not supported\n");
+       }
+
+       status = test_ioctl_compress_set(torture, tmp_ctx, tree, fh,
+                                        0x0042); /* bogus */
+       torture_assert_ntstatus_equal(torture, status,
+                                     NT_STATUS_INVALID_PARAMETER,
+                                     "invalid FSCTL_SET_COMPRESSION");
+
+       status = test_ioctl_compress_get(torture, tmp_ctx, tree, fh,
+                                        &compression_fmt);
+       torture_assert_ntstatus_ok(torture, status, "FSCTL_GET_COMPRESSION");
+
+       torture_assert(torture, (compression_fmt == COMPRESSION_FORMAT_NONE),
+                      "initial compression state not NONE");
+
+       smb2_util_close(tree, fh);
+       talloc_free(tmp_ctx);
+       return true;
+}
+
+static bool test_ioctl_compress_invalid_buf(struct torture_context *torture,
+                                           struct smb2_tree *tree)
+{
+       struct smb2_handle fh;
+       NTSTATUS status;
+       TALLOC_CTX *tmp_ctx = talloc_new(tree);
+       bool ok;
+       union smb_ioctl ioctl;
+
+       ok = test_setup_create_fill(torture, tree, tmp_ctx,
+                                   FNAME, &fh, 0, SEC_RIGHTS_FILE_ALL,
+                                   FILE_ATTRIBUTE_NORMAL);
+       torture_assert(torture, ok, "setup compression file");
+
+       status = test_ioctl_compress_fs_supported(torture, tree, tmp_ctx, &fh,
+                                                 &ok);
+       torture_assert_ntstatus_ok(torture, status, "SMB2_GETINFO_FS");
+       if (!ok) {
+               smb2_util_close(tree, fh);
+               torture_skip(torture, "FS compression not supported\n");
+       }
+
        ZERO_STRUCT(ioctl);
        ioctl.smb2.level = RAW_IOCTL_SMB2;
        ioctl.smb2.in.file.handle = fh;
        ioctl.smb2.in.function = FSCTL_GET_COMPRESSION;
-       ioctl.smb2.in.max_response_size = sizeof(struct compression_state);
+       ioctl.smb2.in.max_response_size = 0;    /* no room for rsp data */
        ioctl.smb2.in.flags = SMB2_IOCTL_FLAG_IS_FSCTL;
 
        status = smb2_ioctl(tree, tmp_ctx, &ioctl.smb2);
-       torture_assert_ntstatus_ok(torture, status,
-                                  "FSCTL_GET_COMPRESSION");
+       if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_USER_BUFFER)
+        && !NT_STATUS_EQUAL(status, NT_STATUS_INVALID_PARAMETER)) {
+               /* neither Server 2k12 nor 2k8r2 response status */
+               torture_assert(torture, true,
+                              "invalid FSCTL_SET_COMPRESSION");
+       }
 
-       ndr_ret = ndr_pull_struct_blob(&ioctl.smb2.out.out, tmp_ctx,
-                                      &cmpr_state,
-                       (ndr_pull_flags_fn_t)ndr_pull_compression_state);
+       smb2_util_close(tree, fh);
+       talloc_free(tmp_ctx);
+       return true;
+}
 
-       torture_assert_ndr_success(torture, ndr_ret,
-                                  "ndr_pull_compression_state");
+static bool test_ioctl_compress_query_file_attr(struct torture_context 
*torture,
+                                               struct smb2_tree *tree)
+{
+       struct smb2_handle fh;
+       union smb_fileinfo io;
+       NTSTATUS status;
+       TALLOC_CTX *tmp_ctx = talloc_new(tree);
+       bool ok;
+
+       ok = test_setup_create_fill(torture, tree, tmp_ctx,
+                                   FNAME, &fh, 0, SEC_RIGHTS_FILE_ALL,
+                                   FILE_ATTRIBUTE_NORMAL);
+       torture_assert(torture, ok, "setup compression file");
+
+       status = test_ioctl_compress_fs_supported(torture, tree, tmp_ctx, &fh,
+                                                 &ok);
+       torture_assert_ntstatus_ok(torture, status, "SMB2_GETINFO_FS");
+       if (!ok) {
+               smb2_util_close(tree, fh);
+               torture_skip(torture, "FS compression not supported\n");
+       }
+
+       status = smb2_getinfo_file(tree, tmp_ctx, &io);
+       ZERO_STRUCT(io);
+       io.generic.level = RAW_FILEINFO_SMB2_ALL_INFORMATION;
+       io.generic.in.file.handle = fh;
+       status = smb2_getinfo_file(tree, tmp_ctx, &io);
+       torture_assert_ntstatus_ok(torture, status, "SMB2_GETINFO_FILE");
+
+       torture_assert(torture,
+               ((io.all_info2.out.attrib & FILE_ATTRIBUTE_COMPRESSED) == 0),
+                      "compression attr before set");
+
+       status = test_ioctl_compress_set(torture, tmp_ctx, tree, fh,
+                                        COMPRESSION_FORMAT_DEFAULT);
+       torture_assert_ntstatus_ok(torture, status, "FSCTL_SET_COMPRESSION");
+
+       ZERO_STRUCT(io);
+       io.generic.level = RAW_FILEINFO_BASIC_INFORMATION;
+       io.generic.in.file.handle = fh;
+       status = smb2_getinfo_file(tree, tmp_ctx, &io);
+       torture_assert_ntstatus_ok(torture, status, "SMB2_GETINFO_FILE");
+
+       torture_assert(torture,
+                      (io.basic_info.out.attrib & FILE_ATTRIBUTE_COMPRESSED),
+                      "no compression attr after set");
+
+       smb2_util_close(tree, fh);
+       talloc_free(tmp_ctx);
+       return true;
+}
+
+/*
+ * Specify FILE_ATTRIBUTE_COMPRESSED on creation, Windows does not retain this
+ * attribute.
+ */
+static bool test_ioctl_compress_create_with_attr(struct torture_context 
*torture,
+                                                struct smb2_tree *tree)
+{
+       struct smb2_handle fh2;
+       union smb_fileinfo io;
+       NTSTATUS status;
+       TALLOC_CTX *tmp_ctx = talloc_new(tree);
+       uint16_t compression_fmt;
+       bool ok;
+
+       ok = test_setup_create_fill(torture, tree, tmp_ctx,
+                                   FNAME2, &fh2, 0, SEC_RIGHTS_FILE_ALL,
+                       (FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_COMPRESSED));
+       torture_assert(torture, ok, "setup compression file");
+
+       status = test_ioctl_compress_fs_supported(torture, tree, tmp_ctx, &fh2,
+                                                 &ok);
+       torture_assert_ntstatus_ok(torture, status, "SMB2_GETINFO_FS");
+       if (!ok) {
+               smb2_util_close(tree, fh2);
+               torture_skip(torture, "FS compression not supported\n");
+       }
+


-- 
Samba Shared Repository

Reply via email to