s4:torture: cleanup after smb2 getinfo scan
[ira/wip.git] / source4 / torture / smb2 / scan.c
index 75f62ffa748bedc71741b2d7e5d9d54626b54a47..d0e95dbf8773bd0669fbf222379871a999857d3c 100644 (file)
@@ -7,7 +7,7 @@
    
    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
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
 #include "libcli/smb2/smb2.h"
 #include "libcli/smb2/smb2_calls.h"
 #include "lib/cmdline/popt_common.h"
-#include "lib/events/events.h"
 #include "torture/torture.h"
+#include "param/param.h"
+#include "libcli/resolve/resolve.h"
 
 #include "torture/smb2/proto.h"
 
 /* 
    scan for valid SMB2 getinfo levels
 */
-BOOL torture_smb2_getinfo_scan(struct torture_context *torture)
+bool torture_smb2_getinfo_scan(struct torture_context *torture)
 {
-       TALLOC_CTX *mem_ctx = talloc_new(NULL);
        struct smb2_tree *tree;
        NTSTATUS status;
        struct smb2_getinfo io;
        struct smb2_handle fhandle, dhandle;
        int c, i;
 
-       if (!torture_smb2_connection(mem_ctx, &tree)) {
-               return False;
+       if (!torture_smb2_connection(torture, &tree)) {
+               return false;
        }
 
        status = torture_setup_complex_file(tree, FNAME);
        if (!NT_STATUS_IS_OK(status)) {
                printf("Failed to setup complex file '%s'\n", FNAME);
-               return False;
+               return false;
        }
        torture_setup_complex_file(tree, FNAME ":2ndstream");
 
        status = torture_setup_complex_dir(tree, DNAME);
        if (!NT_STATUS_IS_OK(status)) {
                printf("Failed to setup complex dir  '%s'\n", DNAME);
-               return False;
+               smb2_util_unlink(tree, FNAME);
+               return false;
        }
        torture_setup_complex_file(tree, DNAME ":2ndstream");
 
@@ -68,106 +68,102 @@ BOOL torture_smb2_getinfo_scan(struct torture_context *torture)
 
 
        ZERO_STRUCT(io);
-       io.in.max_response_size = 0xFFFF;
+       io.in.output_buffer_length = 0xFFFF;
 
        for (c=1;c<5;c++) {
                for (i=0;i<0x100;i++) {
-                       io.in.level = (i<<8) | c;
+                       io.in.info_type = c;
+                       io.in.info_class = i;
 
                        io.in.file.handle = fhandle;
-                       status = smb2_getinfo(tree, mem_ctx, &io);
-                       if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_INFO_CLASS) &&
-                           !NT_STATUS_EQUAL(status, NT_STATUS_INVALID_PARAMETER) &&
-                           !NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED)) {
-                               printf("file level 0x%04x is %ld bytes - %s\n"
-                                      io.in.level, (long)io.out.blob.length, nt_errstr(status));
+                       status = smb2_getinfo(tree, torture, &io);
+                       if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_INFO_CLASS)) {
+                               printf("file level 0x%02x:%02x %u is %ld bytes - %s\n", 
+                                      io.in.info_type, io.in.info_class, 
+                                      (unsigned)io.in.info_class
+                                      (long)io.out.blob.length, nt_errstr(status));
                                dump_data(1, io.out.blob.data, io.out.blob.length);
                        }
 
                        io.in.file.handle = dhandle;
-                       status = smb2_getinfo(tree, mem_ctx, &io);
-                       if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_INFO_CLASS) &&
-                           !NT_STATUS_EQUAL(status, NT_STATUS_INVALID_PARAMETER) &&
-                           !NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED)) {
-                               printf("dir  level 0x%04x is %ld bytes - %s\n"
-                                      io.in.level, (long)io.out.blob.length, nt_errstr(status));
+                       status = smb2_getinfo(tree, torture, &io);
+                       if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_INFO_CLASS)) {
+                               printf("dir  level 0x%02x:%02x %u is %ld bytes - %s\n", 
+                                      io.in.info_type, io.in.info_class,
+                                      (unsigned)io.in.info_class
+                                      (long)io.out.blob.length, nt_errstr(status));
                                dump_data(1, io.out.blob.data, io.out.blob.length);
                        }
                }
        }
 
-       talloc_free(mem_ctx);
-
-       return True;
+       smb2_util_unlink(tree, FNAME);
+       smb2_util_rmdir(tree, DNAME);
+       return true;
 }
 
 /* 
    scan for valid SMB2 setinfo levels
 */
-BOOL torture_smb2_setinfo_scan(struct torture_context *torture)
+bool torture_smb2_setinfo_scan(struct torture_context *torture)
 {
-       TALLOC_CTX *mem_ctx = talloc_new(NULL);
        struct smb2_tree *tree;
        NTSTATUS status;
        struct smb2_setinfo io;
        struct smb2_handle handle;
        int c, i;
 
-       if (!torture_smb2_connection(mem_ctx, &tree)) {
-               return False;
+       if (!torture_smb2_connection(torture, &tree)) {
+               return false;
        }
 
        status = torture_setup_complex_file(tree, FNAME);
        if (!NT_STATUS_IS_OK(status)) {
                printf("Failed to setup complex file '%s'\n", FNAME);
-               return False;
+               return false;
        }
        torture_setup_complex_file(tree, FNAME ":2ndstream");
 
        torture_smb2_testfile(tree, FNAME, &handle);
 
        ZERO_STRUCT(io);
-       io.in.blob = data_blob_talloc(mem_ctx, NULL, 1024);
+       io.in.blob = data_blob_talloc_zero(torture, 1024);
 
        for (c=1;c<5;c++) {
                for (i=0;i<0x100;i++) {
                        io.in.level = (i<<8) | c;
                        io.in.file.handle = handle;
                        status = smb2_setinfo(tree, &io);
-                       if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_INFO_CLASS) &&
-                           !NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED)) {
+                       if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_INFO_CLASS)) {
                                printf("file level 0x%04x - %s\n", 
                                       io.in.level, nt_errstr(status));
                        }
                }
        }
 
-       talloc_free(mem_ctx);
-
-       return True;
+       return true;
 }
 
 
 /* 
    scan for valid SMB2 scan levels
 */
-BOOL torture_smb2_find_scan(struct torture_context *torture)
+bool torture_smb2_find_scan(struct torture_context *torture)
 {
-       TALLOC_CTX *mem_ctx = talloc_new(NULL);
        struct smb2_tree *tree;
        NTSTATUS status;
        struct smb2_find io;
        struct smb2_handle handle;
        int i;
 
-       if (!torture_smb2_connection(mem_ctx, &tree)) {
-               return False;
+       if (!torture_smb2_connection(torture, &tree)) {
+               return false;
        }
 
        status = smb2_util_roothandle(tree, &handle);
        if (!NT_STATUS_IS_OK(status)) {
                printf("Failed to open roothandle - %s\n", nt_errstr(status));
-               return False;
+               return false;
        }
 
        ZERO_STRUCT(io);
@@ -180,7 +176,7 @@ BOOL torture_smb2_find_scan(struct torture_context *torture)
                io.in.level = i;
 
                io.in.file.handle = handle;
-               status = smb2_find(tree, mem_ctx, &io);
+               status = smb2_find(tree, torture, &io);
                if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_INFO_CLASS) &&
                    !NT_STATUS_EQUAL(status, NT_STATUS_INVALID_PARAMETER) &&
                    !NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED)) {
@@ -190,15 +186,13 @@ BOOL torture_smb2_find_scan(struct torture_context *torture)
                }
        }
 
-       talloc_free(mem_ctx);
-
-       return True;
+       return true;
 }
 
 /* 
    scan for valid SMB2 opcodes
 */
-BOOL torture_smb2_scan(struct torture_context *torture)
+bool torture_smb2_scan(struct torture_context *torture)
 {
        TALLOC_CTX *mem_ctx = talloc_new(NULL);
        struct smb2_tree *tree;
@@ -208,29 +202,42 @@ BOOL torture_smb2_scan(struct torture_context *torture)
        NTSTATUS status;
        int opcode;
        struct smb2_request *req;
+       struct smbcli_options options;
+
+       lpcfg_smbcli_options(torture->lp_ctx, &options);
 
-       status = smb2_connect(mem_ctx, host, share, credentials, &tree, 
-                             event_context_find(mem_ctx));
+       status = smb2_connect(mem_ctx, host, 
+                                                 lpcfg_smb_ports(torture->lp_ctx),
+                                                 share, 
+                                                 lpcfg_resolve_context(torture->lp_ctx),
+                                                 credentials, &tree, torture->ev, &options,
+                                                 lpcfg_socket_options(torture->lp_ctx),
+                                                 lpcfg_gensec_settings(torture, torture->lp_ctx));
        if (!NT_STATUS_IS_OK(status)) {
                printf("Connection failed - %s\n", nt_errstr(status));
-               return False;
+               return false;
        }
 
-       tree->session->transport->options.timeout = 3;
+       tree->session->transport->options.request_timeout = 3;
 
        for (opcode=0;opcode<1000;opcode++) {
-               req = smb2_request_init_tree(tree, opcode, 2, False, 0);
+               req = smb2_request_init_tree(tree, opcode, 2, false, 0);
                SSVAL(req->out.body, 0, 0);
                smb2_transport_send(req);
                if (!smb2_request_receive(req)) {
                        talloc_free(tree);
-                       status = smb2_connect(mem_ctx, host, share, credentials, &tree, 
-                                             event_context_find(mem_ctx));
+                       status = smb2_connect(mem_ctx, host, 
+                                                                 lpcfg_smb_ports(torture->lp_ctx),
+                                                                 share, 
+                                                                 lpcfg_resolve_context(torture->lp_ctx),
+                                                                 credentials, &tree, torture->ev, &options,
+                                                                 lpcfg_socket_options(torture->lp_ctx),
+                                                                 lpcfg_gensec_settings(mem_ctx, torture->lp_ctx));
                        if (!NT_STATUS_IS_OK(status)) {
                                printf("Connection failed - %s\n", nt_errstr(status));
-                               return False;
+                               return false;
                        }
-                       tree->session->transport->options.timeout = 3;
+                       tree->session->transport->options.request_timeout = 3;
                } else {
                        status = smb2_request_destroy(req);
                        printf("active opcode %4d gave status %s\n", opcode, nt_errstr(status));
@@ -239,5 +246,5 @@ BOOL torture_smb2_scan(struct torture_context *torture)
 
        talloc_free(mem_ctx);
 
-       return True;
+       return true;
 }