r25000: Fix some more C++ compatibility warnings.
[jelmer/samba4-debian.git] / source / torture / basic / aliases.c
index a693d18ce3ec1aef47e6d06a905f632615a19cc4..660009704b9f44515a885847e8cd80f7f443422a 100644 (file)
@@ -5,7 +5,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 "torture/torture.h"
-#include "dlinklist.h"
+#include "lib/util/dlinklist.h"
 #include "libcli/raw/libcliraw.h"
+#include "torture/torture.h"
+#include "libcli/libcli.h"
+#include "torture/util.h"
 
 int create_complex_file(struct smbcli_state *cli, TALLOC_CTX *mem_ctx, const char *fname);
 
@@ -32,62 +33,61 @@ struct trans2_blobs {
 };
 
 /* look for aliases for a query */
-static void gen_aliases(struct smbcli_state *cli, struct smb_trans2 *t2, int level_offset)
+static bool gen_aliases(struct torture_context *tctx, 
+                                               struct smbcli_state *cli, struct smb_trans2 *t2, 
+                                               int level_offset)
 {
-       TALLOC_CTX *mem_ctx;
        uint16_t level;
        struct trans2_blobs *alias_blobs = NULL;
        struct trans2_blobs *t2b, *t2b2;
        int count=0, alias_count=0;
 
-       mem_ctx = talloc_init("aliases");
-
        for (level=0;level<2000;level++) {
                NTSTATUS status;
 
                SSVAL(t2->in.params.data, level_offset, level);
                
-               status = smb_raw_trans2(cli->tree, mem_ctx, t2);
+               status = smb_raw_trans2(cli->tree, tctx, t2);
                if (!NT_STATUS_IS_OK(status)) continue;
 
-               t2b = talloc(mem_ctx, struct trans2_blobs);
+               t2b = talloc(tctx, struct trans2_blobs);
                t2b->level = level;
                t2b->params = t2->out.params;
                t2b->data = t2->out.data;
                DLIST_ADD(alias_blobs, t2b);
-               d_printf("\tFound level %4u (0x%03x) of size %3d (0x%02x)\n", 
+               torture_comment(tctx, 
+                                               "\tFound level %4u (0x%03x) of size %3d (0x%02x)\n", 
                         level, level,
                         (int)t2b->data.length, (int)t2b->data.length);
                count++;
        }
 
-       d_printf("Found %d levels with success status\n", count);
+       torture_comment(tctx, "Found %d levels with success status\n", count);
 
        for (t2b=alias_blobs; t2b; t2b=t2b->next) {
                for (t2b2=alias_blobs; t2b2; t2b2=t2b2->next) {
                        if (t2b->level >= t2b2->level) continue;
-                       if (data_blob_equal(&t2b->params, &t2b2->params) &&
-                           data_blob_equal(&t2b->data, &t2b2->data)) {
-                               printf("\tLevel %u (0x%x) and level %u (0x%x) are possible aliases\n", 
+                       if (data_blob_cmp(&t2b->params, &t2b2->params) == 0 &&
+                           data_blob_cmp(&t2b->data, &t2b2->data) == 0) {
+                               torture_comment(tctx, 
+                               "\tLevel %u (0x%x) and level %u (0x%x) are possible aliases\n", 
                                       t2b->level, t2b->level, t2b2->level, t2b2->level);
                                alias_count++;
                        }
                }
        }
 
-       d_printf("Found %d aliased levels\n", alias_count);
-       
-       talloc_free(mem_ctx);
+       torture_comment(tctx, "Found %d aliased levels\n", alias_count);
+
+       return true;
 }
 
 /* look for qfsinfo aliases */
-static void qfsinfo_aliases(struct smbcli_state *cli)
+static bool qfsinfo_aliases(struct torture_context *tctx, struct smbcli_state *cli)
 {
        struct smb_trans2 t2;
        uint16_t setup = TRANSACT2_QFSINFO;
 
-       d_printf("\nChecking for QFSINFO aliases\n");
-
        t2.in.max_param = 0;
        t2.in.max_data = smb_raw_max_trans_data(cli->tree, 0);
        t2.in.max_setup = 0;
@@ -95,22 +95,21 @@ static void qfsinfo_aliases(struct smbcli_state *cli)
        t2.in.timeout = 0;
        t2.in.setup_count = 1;
        t2.in.setup = &setup;
-       t2.in.params = data_blob(NULL, 2);
+       t2.in.params = data_blob_talloc_zero(tctx, 2);
        t2.in.data = data_blob(NULL, 0);
+       ZERO_STRUCT(t2.out);
 
-       gen_aliases(cli, &t2, 0);
+       return gen_aliases(tctx, cli, &t2, 0);
 }
 
 /* look for qfileinfo aliases */
-static void qfileinfo_aliases(struct smbcli_state *cli)
+static bool qfileinfo_aliases(struct torture_context *tctx, struct smbcli_state *cli)
 {
        struct smb_trans2 t2;
        uint16_t setup = TRANSACT2_QFILEINFO;
        const char *fname = "\\qfileinfo_aliases.txt";
        int fnum;
 
-       d_printf("\nChecking for QFILEINFO aliases\n");
-
        t2.in.max_param = 2;
        t2.in.max_data = smb_raw_max_trans_data(cli->tree, 2);
        t2.in.max_setup = 0;
@@ -118,38 +117,37 @@ static void qfileinfo_aliases(struct smbcli_state *cli)
        t2.in.timeout = 0;
        t2.in.setup_count = 1;
        t2.in.setup = &setup;
-       t2.in.params = data_blob(NULL, 4);
+       t2.in.params = data_blob_talloc_zero(tctx, 4);
        t2.in.data = data_blob(NULL, 0);
+       ZERO_STRUCT(t2.out);
 
        smbcli_unlink(cli->tree, fname);
        fnum = create_complex_file(cli, cli, fname);
-       if (fnum == -1) {
-               printf("ERROR: open of %s failed (%s)\n", fname, smbcli_errstr(cli->tree));
-       }
+       torture_assert(tctx, fnum != -1, talloc_asprintf(tctx, 
+                                       "open of %s failed (%s)", fname, 
+                                  smbcli_errstr(cli->tree)));
 
        smbcli_write(cli->tree, fnum, 0, &t2, 0, sizeof(t2));
 
        SSVAL(t2.in.params.data, 0, fnum);
 
-       gen_aliases(cli, &t2, 2);
+       if (!gen_aliases(tctx, cli, &t2, 2))
+               return false;
 
        smbcli_close(cli->tree, fnum);
        smbcli_unlink(cli->tree, fname);
+
+       return true;
 }
 
 
 /* look for qpathinfo aliases */
-static void qpathinfo_aliases(struct smbcli_state *cli)
+static bool qpathinfo_aliases(struct torture_context *tctx, struct smbcli_state *cli)
 {
        struct smb_trans2 t2;
        uint16_t setup = TRANSACT2_QPATHINFO;
        const char *fname = "\\qpathinfo_aliases.txt";
        int fnum;
-       TALLOC_CTX *mem_ctx;
-
-       mem_ctx = talloc_init("qpathinfo");
-
-       d_printf("\nChecking for QPATHINFO aliases\n");
 
        t2.in.max_param = 2;
        t2.in.max_data = smb_raw_max_trans_data(cli->tree, 2);
@@ -158,42 +156,40 @@ static void qpathinfo_aliases(struct smbcli_state *cli)
        t2.in.timeout = 0;
        t2.in.setup_count = 1;
        t2.in.setup = &setup;
-       t2.in.params = data_blob_talloc(mem_ctx, NULL, 6);
+       t2.in.params = data_blob_talloc_zero(tctx, 6);
        t2.in.data = data_blob(NULL, 0);
+       ZERO_STRUCT(t2.out);
 
        smbcli_unlink(cli->tree, fname);
        fnum = create_complex_file(cli, cli, fname);
-       if (fnum == -1) {
-               printf("ERROR: open of %s failed (%s)\n", fname, smbcli_errstr(cli->tree));
-       }
+       torture_assert(tctx, fnum != -1, talloc_asprintf(tctx, 
+                                       "open of %s failed (%s)", fname, 
+                                  smbcli_errstr(cli->tree)));
 
        smbcli_write(cli->tree, fnum, 0, &t2, 0, sizeof(t2));
        smbcli_close(cli->tree, fnum);
 
        SIVAL(t2.in.params.data, 2, 0);
 
-       smbcli_blob_append_string(cli->session, mem_ctx, &t2.in.params, 
+       smbcli_blob_append_string(cli->session, tctx, &t2.in.params, 
                               fname, STR_TERMINATE);
 
-       gen_aliases(cli, &t2, 0);
+       if (!gen_aliases(tctx, cli, &t2, 0))
+               return false;
 
        smbcli_unlink(cli->tree, fname);
-       talloc_free(mem_ctx);
+
+       return true;
 }
 
 
 /* look for trans2 findfirst aliases */
-static void findfirst_aliases(struct smbcli_state *cli)
+static bool findfirst_aliases(struct torture_context *tctx, struct smbcli_state *cli)
 {
        struct smb_trans2 t2;
        uint16_t setup = TRANSACT2_FINDFIRST;
        const char *fname = "\\findfirst_aliases.txt";
        int fnum;
-       TALLOC_CTX *mem_ctx;
-
-       mem_ctx = talloc_init("findfirst");
-
-       d_printf("\nChecking for FINDFIRST aliases\n");
 
        t2.in.max_param = 16;
        t2.in.max_data = smb_raw_max_trans_data(cli->tree, 16);
@@ -202,14 +198,15 @@ static void findfirst_aliases(struct smbcli_state *cli)
        t2.in.timeout = 0;
        t2.in.setup_count = 1;
        t2.in.setup = &setup;
-       t2.in.params = data_blob_talloc(mem_ctx, NULL, 12);
+       t2.in.params = data_blob_talloc_zero(tctx, 12);
        t2.in.data = data_blob(NULL, 0);
+       ZERO_STRUCT(t2.out);
 
        smbcli_unlink(cli->tree, fname);
        fnum = create_complex_file(cli, cli, fname);
-       if (fnum == -1) {
-               printf("ERROR: open of %s failed (%s)\n", fname, smbcli_errstr(cli->tree));
-       }
+       torture_assert(tctx, fnum != -1, talloc_asprintf(tctx, 
+                                       "open of %s failed (%s)", fname, 
+                                  smbcli_errstr(cli->tree)));
 
        smbcli_write(cli->tree, fnum, 0, &t2, 0, sizeof(t2));
        smbcli_close(cli->tree, fnum);
@@ -220,28 +217,29 @@ static void findfirst_aliases(struct smbcli_state *cli)
        SSVAL(t2.in.params.data, 6, 0);
        SIVAL(t2.in.params.data, 8, 0);
 
-       smbcli_blob_append_string(cli->session, mem_ctx, &t2.in.params, 
+       smbcli_blob_append_string(cli->session, tctx, &t2.in.params, 
                               fname, STR_TERMINATE);
 
-       gen_aliases(cli, &t2, 6);
+       if (!gen_aliases(tctx, cli, &t2, 6))
+               return false;
 
        smbcli_unlink(cli->tree, fname);
-       talloc_free(mem_ctx);
+
+       return true;
 }
 
 
 
 /* look for aliases for a set function */
-static void gen_set_aliases(struct smbcli_state *cli, struct smb_trans2 *t2, int level_offset)
+static bool gen_set_aliases(struct torture_context *tctx, 
+                                                       struct smbcli_state *cli, 
+                                                       struct smb_trans2 *t2, int level_offset)
 {
-       TALLOC_CTX *mem_ctx;
        uint16_t level;
        struct trans2_blobs *alias_blobs = NULL;
        struct trans2_blobs *t2b;
        int count=0, dsize;
 
-       mem_ctx = talloc_init("aliases");
-
        for (level=1;level<1100;level++) {
                NTSTATUS status, status1;
                SSVAL(t2->in.params.data, level_offset, level);
@@ -252,7 +250,7 @@ static void gen_set_aliases(struct smbcli_state *cli, struct smb_trans2 *t2, int
                        data_blob_free(&t2->in.data);
                        t2->in.data = data_blob(NULL, dsize);
                        data_blob_clear(&t2->in.data);
-                       status = smb_raw_trans2(cli->tree, mem_ctx, t2);
+                       status = smb_raw_trans2(cli->tree, tctx, t2);
                        /* some error codes mean that this whole level doesn't exist */
                        if (NT_STATUS_EQUAL(NT_STATUS_INVALID_LEVEL, status) ||
                            NT_STATUS_EQUAL(NT_STATUS_INVALID_INFO_CLASS, status) ||
@@ -272,7 +270,7 @@ static void gen_set_aliases(struct smbcli_state *cli, struct smb_trans2 *t2, int
                        }
 
                        if (!NT_STATUS_EQUAL(status, status1)) {
-                               printf("level=%d size=%d %s\n", level, dsize, nt_errstr(status));
+                               torture_comment(tctx, "level=%d size=%d %s\n", level, dsize, nt_errstr(status));
                        }
                        status1 = status;
                }
@@ -280,33 +278,33 @@ static void gen_set_aliases(struct smbcli_state *cli, struct smb_trans2 *t2, int
                if (!NT_STATUS_IS_OK(status) &&
                    !NT_STATUS_EQUAL(status, NT_STATUS_INVALID_PARAMETER)) continue;
 
-               t2b = talloc(mem_ctx, struct trans2_blobs);
+               t2b = talloc(tctx, struct trans2_blobs);
                t2b->level = level;
                t2b->params = t2->out.params;
                t2b->data = t2->out.data;
                DLIST_ADD(alias_blobs, t2b);
-               d_printf("\tFound level %4u (0x%03x) of size %3d (0x%02x)\n", 
+               torture_comment(tctx, 
+                                       "\tFound level %4u (0x%03x) of size %3d (0x%02x)\n", 
                         level, level,
                         (int)t2->in.data.length, (int)t2->in.data.length);
                count++;
        }
 
-       d_printf("Found %d valid levels\n", count);
-       talloc_free(mem_ctx);
+       torture_comment(tctx, "Found %d valid levels\n", count);
+
+       return true;
 }
 
 
 
 /* look for setfileinfo aliases */
-static void setfileinfo_aliases(struct smbcli_state *cli)
+static bool setfileinfo_aliases(struct torture_context *tctx, struct smbcli_state *cli)
 {
        struct smb_trans2 t2;
        uint16_t setup = TRANSACT2_SETFILEINFO;
        const char *fname = "\\setfileinfo_aliases.txt";
        int fnum;
 
-       d_printf("\nChecking for SETFILEINFO aliases\n");
-
        t2.in.max_param = 2;
        t2.in.max_data = 0;
        t2.in.max_setup = 0;
@@ -314,38 +312,37 @@ static void setfileinfo_aliases(struct smbcli_state *cli)
        t2.in.timeout = 0;
        t2.in.setup_count = 1;
        t2.in.setup = &setup;
-       t2.in.params = data_blob(NULL, 6);
+       t2.in.params = data_blob_talloc_zero(tctx, 6);
        t2.in.data = data_blob(NULL, 0);
+       ZERO_STRUCT(t2.out);
 
        smbcli_unlink(cli->tree, fname);
        fnum = create_complex_file(cli, cli, fname);
-       if (fnum == -1) {
-               printf("ERROR: open of %s failed (%s)\n", fname, smbcli_errstr(cli->tree));
-       }
+       torture_assert(tctx, fnum != -1, talloc_asprintf(tctx, 
+                                  "open of %s failed (%s)", fname, 
+                                  smbcli_errstr(cli->tree)));
 
        smbcli_write(cli->tree, fnum, 0, &t2, 0, sizeof(t2));
 
        SSVAL(t2.in.params.data, 0, fnum);
        SSVAL(t2.in.params.data, 4, 0);
 
-       gen_set_aliases(cli, &t2, 2);
+       gen_set_aliases(tctx, cli, &t2, 2);
 
        smbcli_close(cli->tree, fnum);
        smbcli_unlink(cli->tree, fname);
+
+       return true;
 }
 
 /* look for setpathinfo aliases */
-static void setpathinfo_aliases(struct smbcli_state *cli)
+static bool setpathinfo_aliases(struct torture_context *tctx, 
+                                                               struct smbcli_state *cli)
 {
        struct smb_trans2 t2;
        uint16_t setup = TRANSACT2_SETPATHINFO;
        const char *fname = "\\setpathinfo_aliases.txt";
        int fnum;
-       TALLOC_CTX *mem_ctx;
-
-       mem_ctx = talloc_init("findfirst");
-
-       d_printf("\nChecking for SETPATHINFO aliases\n");
 
        t2.in.max_param = 32;
        t2.in.max_data = smb_raw_max_trans_data(cli->tree, 32);
@@ -354,53 +351,46 @@ static void setpathinfo_aliases(struct smbcli_state *cli)
        t2.in.timeout = 0;
        t2.in.setup_count = 1;
        t2.in.setup = &setup;
-       t2.in.params = data_blob_talloc(mem_ctx, NULL, 4);
+       t2.in.params = data_blob_talloc_zero(tctx, 4);
        t2.in.data = data_blob(NULL, 0);
+       ZERO_STRUCT(t2.out);
 
        smbcli_unlink(cli->tree, fname);
 
        fnum = create_complex_file(cli, cli, fname);
-       if (fnum == -1) {
-               printf("ERROR: open of %s failed (%s)\n", fname, smbcli_errstr(cli->tree));
-       }
+       torture_assert(tctx, fnum != -1, talloc_asprintf(tctx, 
+                                       "open of %s failed (%s)", fname, 
+                                  smbcli_errstr(cli->tree)));
 
        smbcli_write(cli->tree, fnum, 0, &t2, 0, sizeof(t2));
        smbcli_close(cli->tree, fnum);
 
        SSVAL(t2.in.params.data, 2, 0);
 
-       smbcli_blob_append_string(cli->session, mem_ctx, &t2.in.params, 
+       smbcli_blob_append_string(cli->session, tctx, &t2.in.params, 
                               fname, STR_TERMINATE);
 
-       gen_set_aliases(cli, &t2, 0);
+       if (!gen_set_aliases(tctx, cli, &t2, 0))
+               return false;
 
-       if (NT_STATUS_IS_ERR(smbcli_unlink(cli->tree, fname))) {
-               printf("unlink: %s\n", smbcli_errstr(cli->tree));
-       }
-       talloc_free(mem_ctx);
+       torture_assert_ntstatus_ok(tctx, smbcli_unlink(cli->tree, fname),
+               talloc_asprintf(tctx, "unlink: %s", smbcli_errstr(cli->tree)));
+
+       return true;
 }
 
 
 /* look for aliased info levels in trans2 calls */
-BOOL torture_trans2_aliases(void)
+struct torture_suite *torture_trans2_aliases(TALLOC_CTX *mem_ctx)
 {
-       struct smbcli_state *cli;
-
-       if (!torture_open_connection(&cli)) {
-               return False;
-       }
+       struct torture_suite *suite = torture_suite_create(mem_ctx, "ALIASES");
 
+       torture_suite_add_1smb_test(suite, "QFILEINFO aliases", qfsinfo_aliases);
+       torture_suite_add_1smb_test(suite, "QFSINFO aliases", qfileinfo_aliases);
+       torture_suite_add_1smb_test(suite, "QPATHINFO aliases", qpathinfo_aliases);
+       torture_suite_add_1smb_test(suite, "FINDFIRST aliases", findfirst_aliases);
+       torture_suite_add_1smb_test(suite, "setfileinfo_aliases", setfileinfo_aliases);
+       torture_suite_add_1smb_test(suite, "setpathinfo_aliases", setpathinfo_aliases);
 
-       qfsinfo_aliases(cli);
-       qfileinfo_aliases(cli);
-       qpathinfo_aliases(cli);
-       findfirst_aliases(cli);
-       setfileinfo_aliases(cli);
-       setpathinfo_aliases(cli);
-
-       if (!torture_close_connection(cli)) {
-               return False;
-       }
-
-       return True;
+       return suite;
 }