X-Git-Url: http://git.samba.org/samba.git/?p=ira%2Fwip.git;a=blobdiff_plain;f=source3%2Ftorture%2Ftorture.c;h=1b9e394a681249c564b3ed175e0c6ebaeb74a577;hp=85233bc0ae6b95c4cba30c1f003436a78e2115bb;hb=4b8e4ea7286f045effb6feb4c7bf8c5ef4ed2f9b;hpb=c2a2006f8a8fdb8941158fc121ce551604cd1bae;ds=sidebyside diff --git a/source3/torture/torture.c b/source3/torture/torture.c index 85233bc0ae6..1b9e394a681 100644 --- a/source3/torture/torture.c +++ b/source3/torture/torture.c @@ -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;