*/
#include "includes.h"
+#include "torture/torture.h"
+#include "system/filesys.h"
#include "libcli/raw/libcliraw.h"
+#include "libcli/libcli.h"
#define BASEDIR "\\test_mux"
#define CHECK_STATUS(status, correct) do { \
if (!NT_STATUS_EQUAL(status, correct)) { \
- printf("(%d) Incorrect status %s - should be %s\n", \
- __LINE__, nt_errstr(status), nt_errstr(correct)); \
+ printf("(%s) Incorrect status %s - should be %s\n", \
+ __location__, nt_errstr(status), nt_errstr(correct)); \
ret = False; \
goto done; \
}} while (0)
NTSTATUS status;
int fnum1, fnum2;
BOOL ret = True;
- struct smbcli_request *req;
+ struct smbcli_request *req1, *req2;
struct timeval tv;
double d;
printf("testing multiplexed open/open/close\n");
- /*
- file open with no share access
- */
+ printf("send first open\n");
io.generic.level = RAW_OPEN_NTCREATEX;
io.ntcreatex.in.root_fid = 0;
io.ntcreatex.in.flags = 0;
- io.ntcreatex.in.access_mask = SA_RIGHT_FILE_READ_DATA;
+ io.ntcreatex.in.access_mask = SEC_FILE_READ_DATA;
io.ntcreatex.in.create_options = 0;
io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ;
io.ntcreatex.in.fname = BASEDIR "\\open.dat";
status = smb_raw_open(cli->tree, mem_ctx, &io);
CHECK_STATUS(status, NT_STATUS_OK);
- fnum1 = io.ntcreatex.out.fnum;
+ fnum1 = io.ntcreatex.file.fnum;
- /* and a 2nd open, this will not conflict */
+ printf("send 2nd open, non-conflicting\n");
io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN;
status = smb_raw_open(cli->tree, mem_ctx, &io);
CHECK_STATUS(status, NT_STATUS_OK);
- fnum2 = io.ntcreatex.out.fnum;
+ fnum2 = io.ntcreatex.file.fnum;
tv = timeval_current();
- /* send an open that will conflict */
+ printf("send 3rd open, conflicting\n");
io.ntcreatex.in.share_access = 0;
status = smb_raw_open(cli->tree, mem_ctx, &io);
CHECK_STATUS(status, NT_STATUS_SHARING_VIOLATION);
d = timeval_elapsed(&tv);
if (d < 0.5 || d > 1.5) {
printf("bad timeout for conflict - %.2f should be 1.0\n", d);
- ret = False;
} else {
printf("open delay %.2f\n", d);
}
- /*
- same request, but async
- */
+ printf("send async open, conflicting\n");
+ tv = timeval_current();
+ req1 = smb_raw_open_send(cli->tree, &io);
+
+ printf("send 2nd async open, conflicting\n");
tv = timeval_current();
- req = smb_raw_open_send(cli->tree, &io);
+ req2 = smb_raw_open_send(cli->tree, &io);
- /* and close the first file */
+ printf("close first sync open\n");
smbcli_close(cli->tree, fnum1);
- /* then the 2nd file */
+ printf("cancel 2nd async open (should be ignored)\n");
+ smb_raw_ntcancel(req2);
+
+ d = timeval_elapsed(&tv);
+ if (d > 0.25) {
+ printf("bad timeout after cancel - %.2f should be <0.25\n", d);
+ ret = False;
+ }
+
+ printf("close the 2nd sync open\n");
smbcli_close(cli->tree, fnum2);
- /* see if the async open succeeded */
- status = smb_raw_open_recv(req, mem_ctx, &io);
+ printf("see if the 1st async open now succeeded\n");
+ status = smb_raw_open_recv(req1, mem_ctx, &io);
CHECK_STATUS(status, NT_STATUS_OK);
d = timeval_elapsed(&tv);
printf("async open delay %.2f\n", d);
}
- smbcli_close(cli->tree, io.ntcreatex.out.fnum);
+ printf("2nd async open should have timed out\n");
+ status = smb_raw_open_recv(req2, mem_ctx, &io);
+ CHECK_STATUS(status, NT_STATUS_SHARING_VIOLATION);
+ d = timeval_elapsed(&tv);
+ if (d < 0.8) {
+ printf("bad timeout for async conflict - %.2f should be 1.0\n", d);
+ }
+
+ printf("close the 1st async open\n");
+ smbcli_close(cli->tree, io.ntcreatex.file.fnum);
done:
return ret;
/* send an async write */
io.generic.level = RAW_WRITE_WRITEX;
- io.writex.in.fnum = fnum;
+ io.writex.file.fnum = fnum;
io.writex.in.offset = 0;
io.writex.in.wmode = 0;
io.writex.in.remaining = 0;
printf("establishing a lock\n");
io.lockx.level = RAW_LOCK_LOCKX;
- io.lockx.in.fnum = fnum;
+ io.lockx.file.fnum = fnum;
io.lockx.in.mode = 0;
io.lockx.in.timeout = 0;
io.lockx.in.lock_cnt = 1;
printf("Now trying with a cancel\n");
io.lockx.level = RAW_LOCK_LOCKX;
- io.lockx.in.fnum = fnum;
+ io.lockx.file.fnum = fnum;
io.lockx.in.mode = 0;
io.lockx.in.timeout = 0;
io.lockx.in.lock_cnt = 1;
mem_ctx = talloc_init("torture_raw_mux");
- /* cleanup */
- if (smbcli_deltree(cli->tree, BASEDIR) == -1) {
- printf("Failed to cleanup " BASEDIR "\n");
- ret = False;
- goto done;
- }
-
-
- if (NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Failed to create %s\n", BASEDIR);
- ret = False;
- goto done;
+ if (!torture_setup_dir(cli, BASEDIR)) {
+ return False;
}
if (!test_mux_open(cli, mem_ctx)) {
ret = False;
}
-done:
smb_raw_exit(cli->session);
smbcli_deltree(cli->tree, BASEDIR);
torture_close_connection(cli);
- talloc_destroy(mem_ctx);
+ talloc_free(mem_ctx);
return ret;
}