Fix a debug msg typo
[ira/wip.git] / source3 / torture / torture.c
index 85233bc0ae6b95c4cba30c1f003436a78e2115bb..1b9e394a681249c564b3ed175e0c6ebaeb74a577 100644 (file)
@@ -18,6 +18,7 @@
 */
 
 #include "includes.h"
+#include "wbc_async.h"
 
 extern char *optarg;
 extern int optind;
@@ -332,6 +333,7 @@ bool torture_cli_session_setup2(struct cli_state *cli, uint16 *new_vuid)
        uint16 old_vuid = cli->vuid;
        fstring old_user_name;
        size_t passlen = strlen(password);
+       NTSTATUS status;
        bool ret;
 
        fstrcpy(old_user_name, cli->user_name);
@@ -342,7 +344,10 @@ bool torture_cli_session_setup2(struct cli_state *cli, uint16 *new_vuid)
                                                workgroup));
        *new_vuid = cli->vuid;
        cli->vuid = old_vuid;
-       fstrcpy(cli->user_name, old_user_name);
+       status = cli_set_username(cli, old_user_name);
+       if (!NT_STATUS_IS_OK(status)) {
+               return false;
+       }
        return ret;
 }
 
@@ -1101,6 +1106,7 @@ static bool run_tcon_test(int dummy)
        uint16 vuid1, vuid2;
        char buf[4];
        bool ret = True;
+       NTSTATUS status;
 
        memset(buf, '\0', sizeof(buf));
 
@@ -1127,10 +1133,11 @@ static bool run_tcon_test(int dummy)
                return False;
        }
 
-       if (!cli_send_tconX(cli, share, "?????",
-                           password, strlen(password)+1)) {
+       status = cli_tcon_andx(cli, share, "?????",
+                              password, strlen(password)+1);
+       if (!NT_STATUS_IS_OK(status)) {
                printf("%s refused 2nd tree connect (%s)\n", host,
-                          cli_errstr(cli));
+                      nt_errstr(status));
                cli_shutdown(cli);
                return False;
        }
@@ -1239,14 +1246,14 @@ static bool tcon_devtest(struct cli_state *cli,
                         const char *return_devtype,
                         NTSTATUS expected_error)
 {
-       bool status;
+       NTSTATUS status;
        bool ret;
 
-       status = cli_send_tconX(cli, myshare, devtype,
-                               password, strlen(password)+1);
+       status = cli_tcon_andx(cli, myshare, devtype,
+                              password, strlen(password)+1);
 
        if (NT_STATUS_IS_OK(expected_error)) {
-               if (status) {
+               if (NT_STATUS_IS_OK(status)) {
                        if (strcmp(cli->dev, return_devtype) == 0) {
                                ret = True;
                        } else { 
@@ -1264,7 +1271,7 @@ static bool tcon_devtest(struct cli_state *cli,
                }
                cli_tdis(cli);
        } else {
-               if (status) {
+               if (NT_STATUS_IS_OK(status)) {
                        printf("tconx to share %s with type %s "
                               "should have failed but succeeded\n",
                               myshare, devtype);
@@ -2157,7 +2164,7 @@ static bool run_fdsesstest(int dummy)
                return False;
 
        saved_cnum = cli->cnum;
-       if (!cli_send_tconX(cli, share, "?????", "", 1))
+       if (!NT_STATUS_IS_OK(cli_tcon_andx(cli, share, "?????", "", 1)))
                return False;
        new_cnum = cli->cnum;
        cli->cnum = saved_cnum;
@@ -4147,6 +4154,119 @@ static bool run_opentest(int dummy)
        return correct;
 }
 
+/*
+  Test POSIX open /mkdir calls.
+ */
+static bool run_simple_posix_open_test(int dummy)
+{
+       static struct cli_state *cli1;
+       const char *fname = "\\posix:file";
+       const char *dname = "\\posix:dir";
+       uint16 major, minor;
+       uint32 caplow, caphigh;
+       int fnum1 = -1;
+       bool correct = false;
+
+       printf("Starting simple POSIX open test\n");
+
+       if (!torture_open_connection(&cli1, 0)) {
+               return false;
+       }
+
+       cli_sockopt(cli1, sockops);
+
+       if (!SERVER_HAS_UNIX_CIFS(cli1)) {
+               printf("Server doesn't support UNIX CIFS extensions.\n");
+               return false;
+       }
+
+       if (!cli_unix_extensions_version(cli1, &major,
+                       &minor, &caplow, &caphigh)) {
+               printf("Server didn't return UNIX CIFS extensions.\n");
+               return false;
+       }
+
+       if (!cli_set_unix_extensions_capabilities(cli1,
+                       major, minor, caplow, caphigh)) {
+               printf("Server doesn't support setting UNIX CIFS extensions.\n");
+               return false;
+        }
+
+       cli_setatr(cli1, fname, 0, 0);
+       cli_posix_unlink(cli1, fname);
+       cli_setatr(cli1, dname, 0, 0);
+       cli_posix_rmdir(cli1, dname);
+
+       /* Create a directory. */
+       if (cli_posix_mkdir(cli1, dname, 0777) == -1) {
+               printf("Server doesn't support setting UNIX CIFS extensions.\n");
+               goto out;
+       }
+
+       fnum1 = cli_posix_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, 0600);
+       if (fnum1 == -1) {
+               printf("POSIX create of %s failed (%s)\n", fname, cli_errstr(cli1));
+               goto out;
+       }
+
+       if (!cli_close(cli1, fnum1)) {
+               printf("close failed (%s)\n", cli_errstr(cli1));
+               goto out;
+       }
+
+       /* Now open the file again for read only. */
+       fnum1 = cli_posix_open(cli1, fname, O_RDONLY, 0);
+       if (fnum1 == -1) {
+               printf("POSIX open of %s failed (%s)\n", fname, cli_errstr(cli1));
+               goto out;
+       }
+
+       /* Now unlink while open. */
+       if (!cli_posix_unlink(cli1, fname)) {
+               printf("POSIX unlink of %s failed (%s)\n", fname, cli_errstr(cli1));
+               goto out;
+       }
+
+       if (!cli_close(cli1, fnum1)) {
+               printf("close(2) failed (%s)\n", cli_errstr(cli1));
+               goto out;
+       }
+
+       /* Ensure the file has gone. */
+       fnum1 = cli_posix_open(cli1, fname, O_RDONLY, 0);
+       if (fnum1 != -1) {
+               printf("POSIX open of %s succeeded, should have been deleted.\n", fname);
+               goto out;
+       }
+
+       if (!cli_posix_rmdir(cli1, dname)) {
+               printf("POSIX rmdir failed (%s)\n", cli_errstr(cli1));
+               goto out;
+       }
+
+       printf("Simple POSIX open test passed\n");
+       correct = true;
+
+  out:
+
+       if (fnum1 != -1) {
+               cli_close(cli1, fnum1);
+               fnum1 = -1;
+       }
+
+       cli_setatr(cli1, fname, 0, 0);
+       cli_posix_unlink(cli1, fname);
+       cli_setatr(cli1, dname, 0, 0);
+       cli_posix_rmdir(cli1, dname);
+
+       if (!torture_close_connection(cli1)) {
+               correct = false;
+       }
+
+       return correct;
+}
+
+
 static uint32 open_attrs_table[] = {
                FILE_ATTRIBUTE_NORMAL,
                FILE_ATTRIBUTE_ARCHIVE,
@@ -5083,7 +5203,7 @@ static bool run_cli_echo(int dummy)
        struct async_req *req;
        NTSTATUS status;
 
-       printf("starting chain1 test\n");
+       printf("starting cli_echo test\n");
        if (!torture_open_connection(&cli, 0)) {
                return false;
        }
@@ -5493,16 +5613,16 @@ static bool run_local_memcache(int dummy)
        return ret;
 }
 
-static void wbclient_done(struct async_req *req)
+static void wbclient_done(struct tevent_req *req)
 {
-       NTSTATUS status;
+       wbcErr wbc_err;
        struct winbindd_response *wb_resp;
-       int *i = (int *)req->async.priv;
+       int *i = (int *)tevent_req_callback_data_void(req);
 
-       status = wb_trans_recv(req, req, &wb_resp);
+       wbc_err = wb_trans_recv(req, req, &wb_resp);
        TALLOC_FREE(req);
        *i += 1;
-       d_printf("wb_trans_recv %d returned %s\n", *i, nt_errstr(status));
+       d_printf("wb_trans_recv %d returned %s\n", *i, wbcErrorString(wbc_err));
 }
 
 static bool run_local_wbclient(int dummy)
@@ -5534,14 +5654,13 @@ static bool run_local_wbclient(int dummy)
                        goto fail;
                }
                for (j=0; j<5; j++) {
-                       struct async_req *req;
+                       struct tevent_req *req;
                        req = wb_trans_send(ev, ev, wb_ctx[i],
                                            (j % 2) == 0, &wb_req);
                        if (req == NULL) {
                                goto fail;
                        }
-                       req->async.fn = wbclient_done;
-                       req->async.priv = &i;
+                       tevent_req_set_callback(req, wbclient_done, &i);
                }
        }
 
@@ -5687,6 +5806,7 @@ static struct {
        {"RW2",  run_readwritemulti, FLAG_MULTIPROC},
        {"RW3",  run_readwritelarge, 0},
        {"OPEN", run_opentest, 0},
+       {"POSIX", run_simple_posix_open_test, 0},
 #if 1
        {"OPENATTR", run_openattrtest, 0},
 #endif
@@ -5859,7 +5979,7 @@ static void usage(void)
        *p = 0;
        fstrcpy(share, p+1);
 
-       fstrcpy(myname, talloc_get_myname(talloc_tos()));
+       fstrcpy(myname, get_myname(talloc_tos()));
        if (!*myname) {
                fprintf(stderr, "Failed to get my hostname.\n");
                return 1;