From 47dfe299c8a5a64ade88d15ecf71f99800ea40cd Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 26 Mar 2004 02:39:48 +0000 Subject: - moved some of the base tests into torture/basic/ - added a CHARSET set of tests, which determines how the server deals with some specific charset issues related to UTF-16 support. Interestingly, Samba3 already passes all but one of these tests, because our incorrect UCS-2 and UTF-8 implementations where we don't check the validity of characters actually matches what Windows does! This means that adding UTF-16 support to Samba is going to be _much_ easier than we expected. (This used to be commit c8497a42364d186f08102224d5062d176ee81f5b) --- source4/Makefile.in | 5 +- source4/torture/aliases.c | 403 --------- source4/torture/basic/aliases.c | 403 +++++++++ source4/torture/basic/charset.c | 269 ++++++ source4/torture/basic/denytest.c | 1578 +++++++++++++++++++++++++++++++++++ source4/torture/basic/dfstest.c | 459 ++++++++++ source4/torture/basic/mangle_test.c | 205 +++++ source4/torture/basic/scanner.c | 563 +++++++++++++ source4/torture/basic/utable.c | 199 +++++ source4/torture/config.m4 | 13 +- source4/torture/denytest.c | 1578 ----------------------------------- source4/torture/dfstest.c | 459 ---------- source4/torture/mangle_test.c | 205 ----- source4/torture/nbench/nbio.c | 2 +- source4/torture/scanner.c | 563 ------------- source4/torture/torture.c | 1 + source4/torture/utable.c | 199 ----- 17 files changed, 3691 insertions(+), 3413 deletions(-) delete mode 100644 source4/torture/aliases.c create mode 100644 source4/torture/basic/aliases.c create mode 100644 source4/torture/basic/charset.c create mode 100644 source4/torture/basic/denytest.c create mode 100644 source4/torture/basic/dfstest.c create mode 100644 source4/torture/basic/mangle_test.c create mode 100644 source4/torture/basic/scanner.c create mode 100644 source4/torture/basic/utable.c delete mode 100644 source4/torture/denytest.c delete mode 100644 source4/torture/dfstest.c delete mode 100644 source4/torture/mangle_test.c delete mode 100644 source4/torture/scanner.c delete mode 100644 source4/torture/utable.c diff --git a/source4/Makefile.in b/source4/Makefile.in index e240afb766..f095007c99 100644 --- a/source4/Makefile.in +++ b/source4/Makefile.in @@ -143,6 +143,8 @@ TORTURE_RPC_OBJS = @TORTURE_RPC_OBJS@ TORTURE_NBENCH_OBJS = @TORTURE_NBENCH_OBJS@ +TORTURE_BASIC_OBJS = @TORTURE_BASIC_OBJS@ + TORTURE_OBJS = @TORTURE_OBJS@ TORTURE_LIBS = @TORTURE_LIBS@ @@ -188,6 +190,7 @@ PROTO_OBJ = $(SERVER_OBJS) $(PROCESS_MODEL_OBJS) $(CLIENT_OBJS) $(TORTURE_OBJS) $(DCERPC_OBJS) $(SMB_OBJS) $(AUTH_OBJS) $(PASSDB_OBJS) $(NTVFS_OBJS) \ $(LIBBASIC_OBJS) $(CONFIG_OBJS) $(LIBCMDLINE_OBJS) $(LIBSMB_OBJS) + ###################################################################### # now the rules... ###################################################################### @@ -453,5 +456,5 @@ $(srcdir)/configure: $(srcdir)/configure.in config.status: $(srcdir)/configure @echo "WARNING: you need to run configure" -Makefile: $(srcdir)/Makefile.in config.status +Makefile: $(srcdir)/Makefile.in config.status smb_server/config.m4 @echo "WARNING: you need to run ./config.status" diff --git a/source4/torture/aliases.c b/source4/torture/aliases.c deleted file mode 100644 index c4d6f94700..0000000000 --- a/source4/torture/aliases.c +++ /dev/null @@ -1,403 +0,0 @@ -/* - Unix SMB/CIFS implementation. - SMB trans2 alias scanner - Copyright (C) Andrew Tridgell 2003 - - 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 - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - 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. -*/ - -#include "includes.h" - -int create_complex_file(struct cli_state *cli, TALLOC_CTX *mem_ctx, const char *fname); - -struct trans2_blobs { - struct trans2_blobs *next, *prev; - uint16 level; - DATA_BLOB params, data; -}; - -/* look for aliases for a query */ -static void gen_aliases(struct cli_state *cli, struct smb_trans2 *t2, int level_offset) -{ - TALLOC_CTX *mem_ctx; - uint16 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); - if (!NT_STATUS_IS_OK(status)) continue; - - t2b = talloc(mem_ctx, sizeof(*t2b)); - 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", - level, level, - t2b->data.length, t2b->data.length); - count++; - } - - d_printf("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", - t2b->level, t2b->level, t2b2->level, t2b2->level); - alias_count++; - } - } - } - - d_printf("Found %d aliased levels\n", alias_count); - - talloc_destroy(mem_ctx); -} - -/* look for qfsinfo aliases */ -static void qfsinfo_aliases(struct cli_state *cli) -{ - struct smb_trans2 t2; - uint16 setup = TRANSACT2_QFSINFO; - - d_printf("\nChecking for QFSINFO aliases\n"); - - t2.in.max_param = 0; - t2.in.max_data = 0x8000; - t2.in.max_setup = 0; - t2.in.flags = 0; - t2.in.timeout = 0; - t2.in.setup_count = 1; - t2.in.setup = &setup; - t2.in.params = data_blob(NULL, 2); - t2.in.data = data_blob(NULL, 0); - - gen_aliases(cli, &t2, 0); -} - -/* look for qfileinfo aliases */ -static void qfileinfo_aliases(struct cli_state *cli) -{ - struct smb_trans2 t2; - uint16 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 = 0x8000; - t2.in.max_setup = 0; - t2.in.flags = 0; - t2.in.timeout = 0; - t2.in.setup_count = 1; - t2.in.setup = &setup; - t2.in.params = data_blob(NULL, 4); - t2.in.data = data_blob(NULL, 0); - - cli_unlink(cli->tree, fname); - fnum = create_complex_file(cli, cli->mem_ctx, fname); - if (fnum == -1) { - printf("ERROR: open of %s failed (%s)\n", fname, cli_errstr(cli->tree)); - } - - cli_write(cli->tree, fnum, 0, (char *)&t2, 0, sizeof(t2)); - - SSVAL(t2.in.params.data, 0, fnum); - - gen_aliases(cli, &t2, 2); - - cli_close(cli->tree, fnum); - cli_unlink(cli->tree, fname); -} - - -/* look for qpathinfo aliases */ -static void qpathinfo_aliases(struct cli_state *cli) -{ - struct smb_trans2 t2; - uint16 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 = 0x8000; - t2.in.max_setup = 0; - t2.in.flags = 0; - 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.data = data_blob(NULL, 0); - - cli_unlink(cli->tree, fname); - fnum = create_complex_file(cli, cli->mem_ctx, fname); - if (fnum == -1) { - printf("ERROR: open of %s failed (%s)\n", fname, cli_errstr(cli->tree)); - } - - cli_write(cli->tree, fnum, 0, (char *)&t2, 0, sizeof(t2)); - cli_close(cli->tree, fnum); - - SIVAL(t2.in.params.data, 2, 0); - - cli_blob_append_string(cli->session, mem_ctx, &t2.in.params, - fname, STR_TERMINATE); - - gen_aliases(cli, &t2, 0); - - cli_unlink(cli->tree, fname); - talloc_destroy(mem_ctx); -} - - -/* look for trans2 findfirst aliases */ -static void findfirst_aliases(struct cli_state *cli) -{ - struct smb_trans2 t2; - uint16 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 = 0x8000; - t2.in.max_setup = 0; - t2.in.flags = 0; - 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.data = data_blob(NULL, 0); - - cli_unlink(cli->tree, fname); - fnum = create_complex_file(cli, cli->mem_ctx, fname); - if (fnum == -1) { - printf("ERROR: open of %s failed (%s)\n", fname, cli_errstr(cli->tree)); - } - - cli_write(cli->tree, fnum, 0, (char *)&t2, 0, sizeof(t2)); - cli_close(cli->tree, fnum); - - SSVAL(t2.in.params.data, 0, 0); - SSVAL(t2.in.params.data, 2, 1); - SSVAL(t2.in.params.data, 4, FLAG_TRANS2_FIND_CLOSE); - SSVAL(t2.in.params.data, 6, 0); - SIVAL(t2.in.params.data, 8, 0); - - cli_blob_append_string(cli->session, mem_ctx, &t2.in.params, - fname, STR_TERMINATE); - - gen_aliases(cli, &t2, 6); - - cli_unlink(cli->tree, fname); - talloc_destroy(mem_ctx); -} - - - -/* look for aliases for a set function */ -static void gen_set_aliases(struct cli_state *cli, struct smb_trans2 *t2, int level_offset) -{ - TALLOC_CTX *mem_ctx; - uint16 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); - - status1 = NT_STATUS_OK; - - for (dsize=2; dsize<1024; dsize += 2) { - 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); - /* 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) || - NT_STATUS_EQUAL(NT_STATUS_NOT_SUPPORTED, status)) { - break; - } - if (NT_STATUS_IS_OK(status)) break; - - /* invalid parameter means that the level exists at this - size, but the contents are wrong (not surprising with - all zeros!) */ - if (NT_STATUS_EQUAL(status, NT_STATUS_INVALID_PARAMETER)) break; - - /* this is the usual code for 'wrong size' */ - if (NT_STATUS_EQUAL(status, NT_STATUS_INFO_LENGTH_MISMATCH)) { - continue; - } - - if (!NT_STATUS_EQUAL(status, status1)) { - printf("level=%d size=%d %s\n", level, dsize, nt_errstr(status)); - } - status1 = status; - } - - if (!NT_STATUS_IS_OK(status) && - !NT_STATUS_EQUAL(status, NT_STATUS_INVALID_PARAMETER)) continue; - - t2b = talloc(mem_ctx, sizeof(*t2b)); - 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", - level, level, - t2->in.data.length, t2->in.data.length); - count++; - } - - d_printf("Found %d valid levels\n", count); - talloc_destroy(mem_ctx); -} - - - -/* look for setfileinfo aliases */ -static void setfileinfo_aliases(struct cli_state *cli) -{ - struct smb_trans2 t2; - uint16 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; - t2.in.flags = 0; - t2.in.timeout = 0; - t2.in.setup_count = 1; - t2.in.setup = &setup; - t2.in.params = data_blob(NULL, 6); - t2.in.data = data_blob(NULL, 0); - - cli_unlink(cli->tree, fname); - fnum = create_complex_file(cli, cli->mem_ctx, fname); - if (fnum == -1) { - printf("ERROR: open of %s failed (%s)\n", fname, cli_errstr(cli->tree)); - } - - cli_write(cli->tree, fnum, 0, (char *)&t2, 0, sizeof(t2)); - - SSVAL(t2.in.params.data, 0, fnum); - SSVAL(t2.in.params.data, 4, 0); - - gen_set_aliases(cli, &t2, 2); - - cli_close(cli->tree, fnum); - cli_unlink(cli->tree, fname); -} - -/* look for setpathinfo aliases */ -static void setpathinfo_aliases(struct cli_state *cli) -{ - struct smb_trans2 t2; - uint16 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 = 0x8000; - t2.in.max_setup = 0; - t2.in.flags = 0; - 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.data = data_blob(NULL, 0); - - cli_unlink(cli->tree, fname); - - fnum = create_complex_file(cli, cli->mem_ctx, fname); - if (fnum == -1) { - printf("ERROR: open of %s failed (%s)\n", fname, cli_errstr(cli->tree)); - } - - cli_write(cli->tree, fnum, 0, (char *)&t2, 0, sizeof(t2)); - cli_close(cli->tree, fnum); - - SSVAL(t2.in.params.data, 2, 0); - - cli_blob_append_string(cli->session, mem_ctx, &t2.in.params, - fname, STR_TERMINATE); - - gen_set_aliases(cli, &t2, 0); - - if (NT_STATUS_IS_ERR(cli_unlink(cli->tree, fname))) { - printf("unlink: %s\n", cli_errstr(cli->tree)); - } - talloc_destroy(mem_ctx); -} - - -/* look for aliased info levels in trans2 calls */ -BOOL torture_trans2_aliases(int dummy) -{ - struct cli_state *cli; - - if (!torture_open_connection(&cli)) { - return False; - } - - - 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; -} diff --git a/source4/torture/basic/aliases.c b/source4/torture/basic/aliases.c new file mode 100644 index 0000000000..c4d6f94700 --- /dev/null +++ b/source4/torture/basic/aliases.c @@ -0,0 +1,403 @@ +/* + Unix SMB/CIFS implementation. + SMB trans2 alias scanner + Copyright (C) Andrew Tridgell 2003 + + 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 + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 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. +*/ + +#include "includes.h" + +int create_complex_file(struct cli_state *cli, TALLOC_CTX *mem_ctx, const char *fname); + +struct trans2_blobs { + struct trans2_blobs *next, *prev; + uint16 level; + DATA_BLOB params, data; +}; + +/* look for aliases for a query */ +static void gen_aliases(struct cli_state *cli, struct smb_trans2 *t2, int level_offset) +{ + TALLOC_CTX *mem_ctx; + uint16 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); + if (!NT_STATUS_IS_OK(status)) continue; + + t2b = talloc(mem_ctx, sizeof(*t2b)); + 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", + level, level, + t2b->data.length, t2b->data.length); + count++; + } + + d_printf("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", + t2b->level, t2b->level, t2b2->level, t2b2->level); + alias_count++; + } + } + } + + d_printf("Found %d aliased levels\n", alias_count); + + talloc_destroy(mem_ctx); +} + +/* look for qfsinfo aliases */ +static void qfsinfo_aliases(struct cli_state *cli) +{ + struct smb_trans2 t2; + uint16 setup = TRANSACT2_QFSINFO; + + d_printf("\nChecking for QFSINFO aliases\n"); + + t2.in.max_param = 0; + t2.in.max_data = 0x8000; + t2.in.max_setup = 0; + t2.in.flags = 0; + t2.in.timeout = 0; + t2.in.setup_count = 1; + t2.in.setup = &setup; + t2.in.params = data_blob(NULL, 2); + t2.in.data = data_blob(NULL, 0); + + gen_aliases(cli, &t2, 0); +} + +/* look for qfileinfo aliases */ +static void qfileinfo_aliases(struct cli_state *cli) +{ + struct smb_trans2 t2; + uint16 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 = 0x8000; + t2.in.max_setup = 0; + t2.in.flags = 0; + t2.in.timeout = 0; + t2.in.setup_count = 1; + t2.in.setup = &setup; + t2.in.params = data_blob(NULL, 4); + t2.in.data = data_blob(NULL, 0); + + cli_unlink(cli->tree, fname); + fnum = create_complex_file(cli, cli->mem_ctx, fname); + if (fnum == -1) { + printf("ERROR: open of %s failed (%s)\n", fname, cli_errstr(cli->tree)); + } + + cli_write(cli->tree, fnum, 0, (char *)&t2, 0, sizeof(t2)); + + SSVAL(t2.in.params.data, 0, fnum); + + gen_aliases(cli, &t2, 2); + + cli_close(cli->tree, fnum); + cli_unlink(cli->tree, fname); +} + + +/* look for qpathinfo aliases */ +static void qpathinfo_aliases(struct cli_state *cli) +{ + struct smb_trans2 t2; + uint16 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 = 0x8000; + t2.in.max_setup = 0; + t2.in.flags = 0; + 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.data = data_blob(NULL, 0); + + cli_unlink(cli->tree, fname); + fnum = create_complex_file(cli, cli->mem_ctx, fname); + if (fnum == -1) { + printf("ERROR: open of %s failed (%s)\n", fname, cli_errstr(cli->tree)); + } + + cli_write(cli->tree, fnum, 0, (char *)&t2, 0, sizeof(t2)); + cli_close(cli->tree, fnum); + + SIVAL(t2.in.params.data, 2, 0); + + cli_blob_append_string(cli->session, mem_ctx, &t2.in.params, + fname, STR_TERMINATE); + + gen_aliases(cli, &t2, 0); + + cli_unlink(cli->tree, fname); + talloc_destroy(mem_ctx); +} + + +/* look for trans2 findfirst aliases */ +static void findfirst_aliases(struct cli_state *cli) +{ + struct smb_trans2 t2; + uint16 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 = 0x8000; + t2.in.max_setup = 0; + t2.in.flags = 0; + 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.data = data_blob(NULL, 0); + + cli_unlink(cli->tree, fname); + fnum = create_complex_file(cli, cli->mem_ctx, fname); + if (fnum == -1) { + printf("ERROR: open of %s failed (%s)\n", fname, cli_errstr(cli->tree)); + } + + cli_write(cli->tree, fnum, 0, (char *)&t2, 0, sizeof(t2)); + cli_close(cli->tree, fnum); + + SSVAL(t2.in.params.data, 0, 0); + SSVAL(t2.in.params.data, 2, 1); + SSVAL(t2.in.params.data, 4, FLAG_TRANS2_FIND_CLOSE); + SSVAL(t2.in.params.data, 6, 0); + SIVAL(t2.in.params.data, 8, 0); + + cli_blob_append_string(cli->session, mem_ctx, &t2.in.params, + fname, STR_TERMINATE); + + gen_aliases(cli, &t2, 6); + + cli_unlink(cli->tree, fname); + talloc_destroy(mem_ctx); +} + + + +/* look for aliases for a set function */ +static void gen_set_aliases(struct cli_state *cli, struct smb_trans2 *t2, int level_offset) +{ + TALLOC_CTX *mem_ctx; + uint16 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); + + status1 = NT_STATUS_OK; + + for (dsize=2; dsize<1024; dsize += 2) { + 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); + /* 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) || + NT_STATUS_EQUAL(NT_STATUS_NOT_SUPPORTED, status)) { + break; + } + if (NT_STATUS_IS_OK(status)) break; + + /* invalid parameter means that the level exists at this + size, but the contents are wrong (not surprising with + all zeros!) */ + if (NT_STATUS_EQUAL(status, NT_STATUS_INVALID_PARAMETER)) break; + + /* this is the usual code for 'wrong size' */ + if (NT_STATUS_EQUAL(status, NT_STATUS_INFO_LENGTH_MISMATCH)) { + continue; + } + + if (!NT_STATUS_EQUAL(status, status1)) { + printf("level=%d size=%d %s\n", level, dsize, nt_errstr(status)); + } + status1 = status; + } + + if (!NT_STATUS_IS_OK(status) && + !NT_STATUS_EQUAL(status, NT_STATUS_INVALID_PARAMETER)) continue; + + t2b = talloc(mem_ctx, sizeof(*t2b)); + 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", + level, level, + t2->in.data.length, t2->in.data.length); + count++; + } + + d_printf("Found %d valid levels\n", count); + talloc_destroy(mem_ctx); +} + + + +/* look for setfileinfo aliases */ +static void setfileinfo_aliases(struct cli_state *cli) +{ + struct smb_trans2 t2; + uint16 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; + t2.in.flags = 0; + t2.in.timeout = 0; + t2.in.setup_count = 1; + t2.in.setup = &setup; + t2.in.params = data_blob(NULL, 6); + t2.in.data = data_blob(NULL, 0); + + cli_unlink(cli->tree, fname); + fnum = create_complex_file(cli, cli->mem_ctx, fname); + if (fnum == -1) { + printf("ERROR: open of %s failed (%s)\n", fname, cli_errstr(cli->tree)); + } + + cli_write(cli->tree, fnum, 0, (char *)&t2, 0, sizeof(t2)); + + SSVAL(t2.in.params.data, 0, fnum); + SSVAL(t2.in.params.data, 4, 0); + + gen_set_aliases(cli, &t2, 2); + + cli_close(cli->tree, fnum); + cli_unlink(cli->tree, fname); +} + +/* look for setpathinfo aliases */ +static void setpathinfo_aliases(struct cli_state *cli) +{ + struct smb_trans2 t2; + uint16 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 = 0x8000; + t2.in.max_setup = 0; + t2.in.flags = 0; + 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.data = data_blob(NULL, 0); + + cli_unlink(cli->tree, fname); + + fnum = create_complex_file(cli, cli->mem_ctx, fname); + if (fnum == -1) { + printf("ERROR: open of %s failed (%s)\n", fname, cli_errstr(cli->tree)); + } + + cli_write(cli->tree, fnum, 0, (char *)&t2, 0, sizeof(t2)); + cli_close(cli->tree, fnum); + + SSVAL(t2.in.params.data, 2, 0); + + cli_blob_append_string(cli->session, mem_ctx, &t2.in.params, + fname, STR_TERMINATE); + + gen_set_aliases(cli, &t2, 0); + + if (NT_STATUS_IS_ERR(cli_unlink(cli->tree, fname))) { + printf("unlink: %s\n", cli_errstr(cli->tree)); + } + talloc_destroy(mem_ctx); +} + + +/* look for aliased info levels in trans2 calls */ +BOOL torture_trans2_aliases(int dummy) +{ + struct cli_state *cli; + + if (!torture_open_connection(&cli)) { + return False; + } + + + 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; +} diff --git a/source4/torture/basic/charset.c b/source4/torture/basic/charset.c new file mode 100644 index 0000000000..1a708ac055 --- /dev/null +++ b/source4/torture/basic/charset.c @@ -0,0 +1,269 @@ +/* + Unix SMB/CIFS implementation. + + SMB torture tester - charset test routines + + Copyright (C) Andrew Tridgell 2001 + + 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 + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 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. +*/ + +#include "includes.h" + +#define BASEDIR "\\chartest\\" + +/* + open a file using a set of unicode code points for the name + + the prefix BASEDIR is added before the name +*/ +static NTSTATUS unicode_open(struct cli_tree *tree, + TALLOC_CTX *mem_ctx, + uint32 open_disposition, + const uint32 *u_name, + size_t u_name_len) +{ + union smb_open io; + char *fname, *fname2=NULL, *ucs_name; + int i; + NTSTATUS status; + + ucs_name = malloc((1+u_name_len)*2); + if (!ucs_name) { + return NT_STATUS_NO_MEMORY; + } + + for (i=0;itree, mem_ctx, NTCREATEX_DISP_CREATE, name1, 2); + if (!NT_STATUS_IS_OK(status1)) { + printf("Failed to create composed name - %s\n", + nt_errstr(status1)); + return False; + } + + status2 = unicode_open(cli->tree, mem_ctx, NTCREATEX_DISP_CREATE, name2, 1); + + if (!NT_STATUS_IS_OK(status2)) { + printf("Failed to create accented character - %s\n", + nt_errstr(status2)); + return False; + } + + return True; +} + +/* + see if the server recognises a naked diacritical +*/ +static BOOL test_diacritical(struct cli_state *cli, TALLOC_CTX *mem_ctx) +{ + const uint32 name1[] = {0x308}; + const uint32 name2[] = {0x308, 0x308}; + NTSTATUS status1, status2; + + printf("Testing naked diacritical (umlaut)\n"); + + status1 = unicode_open(cli->tree, mem_ctx, NTCREATEX_DISP_CREATE, name1, 1); + + if (!NT_STATUS_IS_OK(status1)) { + printf("Failed to create naked diacritical - %s\n", + nt_errstr(status1)); + return False; + } + + /* try a double diacritical */ + status2 = unicode_open(cli->tree, mem_ctx, NTCREATEX_DISP_CREATE, name2, 2); + + if (!NT_STATUS_IS_OK(status2)) { + printf("Failed to create double naked diacritical - %s\n", + nt_errstr(status2)); + return False; + } + + return True; +} + +/* + see if the server recognises a partial surrogate pair +*/ +static BOOL test_surrogate(struct cli_state *cli, TALLOC_CTX *mem_ctx) +{ + const uint32 name1[] = {0xd800}; + const uint32 name2[] = {0xdc00}; + const uint32 name3[] = {0xd800, 0xdc00}; + NTSTATUS status; + + printf("Testing partial surrogate\n"); + + status = unicode_open(cli->tree, mem_ctx, NTCREATEX_DISP_CREATE, name1, 1); + + if (!NT_STATUS_IS_OK(status)) { + printf("Failed to create partial surrogate 1 - %s\n", + nt_errstr(status)); + return False; + } + + status = unicode_open(cli->tree, mem_ctx, NTCREATEX_DISP_CREATE, name2, 1); + + if (!NT_STATUS_IS_OK(status)) { + printf("Failed to create partial surrogate 2 - %s\n", + nt_errstr(status)); + return False; + } + + status = unicode_open(cli->tree, mem_ctx, NTCREATEX_DISP_CREATE, name3, 2); + + if (!NT_STATUS_IS_OK(status)) { + printf("Failed to create full surrogate - %s\n", + nt_errstr(status)); + return False; + } + + return True; +} + +/* + see if the server recognises wide-a characters +*/ +static BOOL test_widea(struct cli_state *cli, TALLOC_CTX *mem_ctx) +{ + const uint32 name1[] = {'a'}; + const uint32 name2[] = {0xff41}; + const uint32 name3[] = {0xff21}; + NTSTATUS status; + + printf("Testing wide-a\n"); + + status = unicode_open(cli->tree, mem_ctx, NTCREATEX_DISP_CREATE, name1, 1); + + if (!NT_STATUS_IS_OK(status)) { + printf("Failed to create 'a' - %s\n", + nt_errstr(status)); + return False; + } + + status = unicode_open(cli->tree, mem_ctx, NTCREATEX_DISP_CREATE, name2, 1); + + if (!NT_STATUS_IS_OK(status)) { + printf("Failed to create wide-a - %s\n", + nt_errstr(status)); + return False; + } + + status = unicode_open(cli->tree, mem_ctx, NTCREATEX_DISP_CREATE, name3, 1); + + if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_COLLISION)) { + printf("Expected %s creating wide-A - %s\n", + nt_errstr(NT_STATUS_OBJECT_NAME_COLLISION), + nt_errstr(status)); + return False; + } + + return True; +} + +BOOL torture_charset(int dummy) +{ + static struct cli_state *cli; + BOOL ret = True; + TALLOC_CTX *mem_ctx; + + mem_ctx = talloc_init("torture_charset"); + + if (!torture_open_connection(&cli)) { + return False; + } + + printf("Starting charset tests\n"); + + if (cli_deltree(cli->tree, BASEDIR) == -1) { + printf("Failed to clean " BASEDIR "\n"); + return False; + } + if (NT_STATUS_IS_ERR(cli_mkdir(cli->tree, BASEDIR))) { + printf("Failed to create " BASEDIR " - %s\n", cli_errstr(cli->tree)); + return False; + } + + if (!test_composed(cli, mem_ctx)) { + ret = False; + } + + if (!test_diacritical(cli, mem_ctx)) { + ret = False; + } + + if (!test_surrogate(cli, mem_ctx)) { + ret = False; + } + + if (!test_widea(cli, mem_ctx)) { + ret = False; + } + + return ret; +} diff --git a/source4/torture/basic/denytest.c b/source4/torture/basic/denytest.c new file mode 100644 index 0000000000..0e4f5251da --- /dev/null +++ b/source4/torture/basic/denytest.c @@ -0,0 +1,1578 @@ +/* + Unix SMB/CIFS implementation. + SMB torture tester - deny mode scanning functions + Copyright (C) Andrew Tridgell 2001 + + 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 + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 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. +*/ + +#include "includes.h" + +extern BOOL torture_showall; + +enum deny_result {A_0=0, A_X=1, A_R=2, A_W=3, A_RW=5}; + +static const char *denystr(int denymode) +{ + struct { + int v; + const char *name; + } deny_modes[] = { + {DENY_DOS, "DENY_DOS"}, + {DENY_ALL, "DENY_ALL"}, + {DENY_WRITE, "DENY_WRITE"}, + {DENY_READ, "DENY_READ"}, + {DENY_NONE, "DENY_NONE"}, + {DENY_FCB, "DENY_FCB"}, + {-1, NULL}}; + int i; + for (i=0;deny_modes[i].name;i++) { + if (deny_modes[i].v == denymode) return deny_modes[i].name; + } + return "DENY_XXX"; +} + +static const char *openstr(int mode) +{ + struct { + int v; + const char *name; + } open_modes[] = { + {O_RDWR, "O_RDWR"}, + {O_RDONLY, "O_RDONLY"}, + {O_WRONLY, "O_WRONLY"}, + {-1, NULL}}; + int i; + for (i=0;open_modes[i].name;i++) { + if (open_modes[i].v == mode) return open_modes[i].name; + } + return "O_XXX"; +} + +static const char *resultstr(enum deny_result res) +{ + struct { + enum deny_result res; + const char *name; + } results[] = { + {A_X, "X"}, + {A_0, "-"}, + {A_R, "R"}, + {A_W, "W"}, + {A_RW,"RW"}}; + int i; + for (i=0;ARRAY_SIZE(results);i++) { + if (results[i].res == res) return results[i].name; + } + return "*"; +} + +static struct { + int isexe; + int mode1, deny1; + int mode2, deny2; + enum deny_result result; +} denytable2[] = { +{1, O_RDWR, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, +{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, +{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, +{1, O_RDWR, DENY_DOS, O_RDWR, DENY_ALL, A_0}, +{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_DOS, O_RDWR, DENY_READ, A_0}, +{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_DOS, O_RDWR, DENY_NONE, A_RW}, +{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, +{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_NONE, A_W}, +{1, O_RDWR, DENY_DOS, O_RDWR, DENY_FCB, A_0}, +{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, +{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, +{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, +{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, +{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_RW}, +{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_R}, +{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_W}, +{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_READ, A_0}, +{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_NONE, A_RW}, +{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, +{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_W}, +{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, +{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, +{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, +{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_READ, A_RW}, +{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_READ, A_R}, +{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_READ, A_W}, +{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_NONE, A_RW}, +{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, +{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_W}, +{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, +{1, O_RDWR, DENY_ALL, O_RDWR, DENY_DOS, A_0}, +{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, +{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, +{1, O_RDWR, DENY_ALL, O_RDWR, DENY_ALL, A_0}, +{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_ALL, O_RDWR, DENY_READ, A_0}, +{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_ALL, O_RDWR, DENY_NONE, A_0}, +{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, +{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, +{1, O_RDWR, DENY_ALL, O_RDWR, DENY_FCB, A_0}, +{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, +{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, +{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, +{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, +{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, +{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, +{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, +{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, +{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_READ, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, +{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, +{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, +{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_R}, +{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, +{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, +{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_R}, +{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, +{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, +{1, O_RDWR, DENY_READ, O_RDWR, DENY_DOS, A_0}, +{1, O_RDWR, DENY_READ, O_RDONLY, DENY_DOS, A_0}, +{1, O_RDWR, DENY_READ, O_WRONLY, DENY_DOS, A_W}, +{1, O_RDWR, DENY_READ, O_RDWR, DENY_ALL, A_0}, +{1, O_RDWR, DENY_READ, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_READ, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_READ, O_RDWR, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_READ, O_RDWR, DENY_READ, A_0}, +{1, O_RDWR, DENY_READ, O_RDONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_READ, O_WRONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_READ, O_RDWR, DENY_NONE, A_0}, +{1, O_RDWR, DENY_READ, O_RDONLY, DENY_NONE, A_0}, +{1, O_RDWR, DENY_READ, O_WRONLY, DENY_NONE, A_W}, +{1, O_RDWR, DENY_READ, O_RDWR, DENY_FCB, A_0}, +{1, O_RDWR, DENY_READ, O_RDONLY, DENY_FCB, A_0}, +{1, O_RDWR, DENY_READ, O_WRONLY, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, +{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, +{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_DOS, A_W}, +{1, O_RDONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, +{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, +{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_W}, +{1, O_RDONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, +{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, +{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, +{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, +{1, O_RDONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, +{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, +{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_DOS, A_W}, +{1, O_WRONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, +{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, +{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_READ, A_W}, +{1, O_WRONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, +{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, +{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, +{1, O_WRONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, +{1, O_RDWR, DENY_NONE, O_RDWR, DENY_DOS, A_RW}, +{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, +{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_DOS, A_W}, +{1, O_RDWR, DENY_NONE, O_RDWR, DENY_ALL, A_0}, +{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_NONE, O_RDWR, DENY_READ, A_0}, +{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, +{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, +{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, +{1, O_RDWR, DENY_NONE, O_RDWR, DENY_FCB, A_0}, +{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, +{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_DOS, A_RW}, +{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, +{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_W}, +{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_RW}, +{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_R}, +{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_W}, +{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_READ, A_0}, +{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, +{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, +{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, +{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_DOS, A_RW}, +{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, +{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_W}, +{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_READ, A_RW}, +{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_READ, A_R}, +{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_READ, A_W}, +{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, +{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, +{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, +{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, +{1, O_RDWR, DENY_FCB, O_RDWR, DENY_DOS, A_0}, +{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_DOS, A_0}, +{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_DOS, A_0}, +{1, O_RDWR, DENY_FCB, O_RDWR, DENY_ALL, A_0}, +{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_FCB, O_RDWR, DENY_READ, A_0}, +{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_FCB, O_RDWR, DENY_NONE, A_0}, +{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, +{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, +{1, O_RDWR, DENY_FCB, O_RDWR, DENY_FCB, A_0}, +{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_FCB, A_0}, +{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_DOS, A_0}, +{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_0}, +{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_0}, +{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, +{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, +{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, +{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, +{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, +{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, +{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, +{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_DOS, A_0}, +{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_0}, +{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_0}, +{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, +{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, +{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, +{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, +{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, +{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, +{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_0}, +{0, O_RDWR, DENY_DOS, O_RDWR, DENY_DOS, A_0}, +{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_DOS, A_0}, +{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_DOS, A_0}, +{0, O_RDWR, DENY_DOS, O_RDWR, DENY_ALL, A_0}, +{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_DOS, O_RDWR, DENY_READ, A_0}, +{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_DOS, O_RDWR, DENY_NONE, A_0}, +{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_NONE, A_0}, +{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_NONE, A_0}, +{0, O_RDWR, DENY_DOS, O_RDWR, DENY_FCB, A_0}, +{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, +{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, +{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_R}, +{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_READ, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, +{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_READ, A_0}, +{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0}, +{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0}, +{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, +{0, O_RDWR, DENY_ALL, O_RDWR, DENY_DOS, A_0}, +{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, +{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, +{0, O_RDWR, DENY_ALL, O_RDWR, DENY_ALL, A_0}, +{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_ALL, O_RDWR, DENY_READ, A_0}, +{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_ALL, O_RDWR, DENY_NONE, A_0}, +{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, +{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, +{0, O_RDWR, DENY_ALL, O_RDWR, DENY_FCB, A_0}, +{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, +{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, +{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_DOS, A_0}, +{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_READ, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, +{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, +{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, +{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_R}, +{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, +{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_R}, +{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, +{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, +{0, O_RDWR, DENY_READ, O_RDWR, DENY_DOS, A_0}, +{0, O_RDWR, DENY_READ, O_RDONLY, DENY_DOS, A_0}, +{0, O_RDWR, DENY_READ, O_WRONLY, DENY_DOS, A_0}, +{0, O_RDWR, DENY_READ, O_RDWR, DENY_ALL, A_0}, +{0, O_RDWR, DENY_READ, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_READ, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_READ, O_RDWR, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_READ, O_RDWR, DENY_READ, A_0}, +{0, O_RDWR, DENY_READ, O_RDONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_READ, O_WRONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_READ, O_RDWR, DENY_NONE, A_0}, +{0, O_RDWR, DENY_READ, O_RDONLY, DENY_NONE, A_0}, +{0, O_RDWR, DENY_READ, O_WRONLY, DENY_NONE, A_W}, +{0, O_RDWR, DENY_READ, O_RDWR, DENY_FCB, A_0}, +{0, O_RDWR, DENY_READ, O_RDONLY, DENY_FCB, A_0}, +{0, O_RDWR, DENY_READ, O_WRONLY, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_W}, +{0, O_RDONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, +{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, +{0, O_RDONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, +{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, +{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_READ, A_W}, +{0, O_WRONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, +{0, O_WRONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, +{0, O_RDWR, DENY_NONE, O_RDWR, DENY_DOS, A_0}, +{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_DOS, A_0}, +{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_DOS, A_0}, +{0, O_RDWR, DENY_NONE, O_RDWR, DENY_ALL, A_0}, +{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_NONE, O_RDWR, DENY_READ, A_0}, +{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, +{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, +{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, +{0, O_RDWR, DENY_NONE, O_RDWR, DENY_FCB, A_0}, +{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, +{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, +{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_RW}, +{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_R}, +{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_W}, +{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_READ, A_0}, +{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, +{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, +{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, +{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_READ, A_RW}, +{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_READ, A_R}, +{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_READ, A_W}, +{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, +{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, +{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, +{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, +{0, O_RDWR, DENY_FCB, O_RDWR, DENY_DOS, A_0}, +{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_DOS, A_0}, +{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_DOS, A_0}, +{0, O_RDWR, DENY_FCB, O_RDWR, DENY_ALL, A_0}, +{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_FCB, O_RDWR, DENY_READ, A_0}, +{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_FCB, O_RDWR, DENY_NONE, A_0}, +{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, +{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, +{0, O_RDWR, DENY_FCB, O_RDWR, DENY_FCB, A_0}, +{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_FCB, A_0}, +{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, +{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, +{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, +{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, +{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_0} +}; + + +static struct { + int isexe; + int mode1, deny1; + int mode2, deny2; + enum deny_result result; +} denytable1[] = { +{1, O_RDWR, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, +{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, +{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, +{1, O_RDWR, DENY_DOS, O_RDWR, DENY_ALL, A_0}, +{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_DOS, O_RDWR, DENY_READ, A_0}, +{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_DOS, O_RDWR, DENY_NONE, A_RW}, +{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, +{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_NONE, A_W}, +{1, O_RDWR, DENY_DOS, O_RDWR, DENY_FCB, A_0}, +{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, +{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, +{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, +{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, +{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_RW}, +{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_R}, +{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_W}, +{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_READ, A_0}, +{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_NONE, A_RW}, +{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, +{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_W}, +{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, +{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, +{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, +{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_READ, A_RW}, +{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_READ, A_R}, +{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_READ, A_W}, +{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_NONE, A_RW}, +{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, +{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_W}, +{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, +{1, O_RDWR, DENY_ALL, O_RDWR, DENY_DOS, A_0}, +{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, +{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, +{1, O_RDWR, DENY_ALL, O_RDWR, DENY_ALL, A_0}, +{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_ALL, O_RDWR, DENY_READ, A_0}, +{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_ALL, O_RDWR, DENY_NONE, A_0}, +{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, +{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, +{1, O_RDWR, DENY_ALL, O_RDWR, DENY_FCB, A_0}, +{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, +{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, +{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, +{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, +{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, +{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, +{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, +{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, +{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_READ, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, +{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, +{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, +{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, +{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_R}, +{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, +{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, +{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_R}, +{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, +{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, +{1, O_RDWR, DENY_READ, O_RDWR, DENY_DOS, A_0}, +{1, O_RDWR, DENY_READ, O_RDONLY, DENY_DOS, A_0}, +{1, O_RDWR, DENY_READ, O_WRONLY, DENY_DOS, A_W}, +{1, O_RDWR, DENY_READ, O_RDWR, DENY_ALL, A_0}, +{1, O_RDWR, DENY_READ, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_READ, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_READ, O_RDWR, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_READ, O_RDWR, DENY_READ, A_0}, +{1, O_RDWR, DENY_READ, O_RDONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_READ, O_WRONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_READ, O_RDWR, DENY_NONE, A_0}, +{1, O_RDWR, DENY_READ, O_RDONLY, DENY_NONE, A_0}, +{1, O_RDWR, DENY_READ, O_WRONLY, DENY_NONE, A_W}, +{1, O_RDWR, DENY_READ, O_RDWR, DENY_FCB, A_0}, +{1, O_RDWR, DENY_READ, O_RDONLY, DENY_FCB, A_0}, +{1, O_RDWR, DENY_READ, O_WRONLY, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, +{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, +{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_DOS, A_W}, +{1, O_RDONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, +{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, +{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_W}, +{1, O_RDONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, +{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, +{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, +{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, +{1, O_RDONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, +{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, +{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_DOS, A_W}, +{1, O_WRONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, +{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, +{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_READ, A_W}, +{1, O_WRONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, +{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, +{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, +{1, O_WRONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, +{1, O_RDWR, DENY_NONE, O_RDWR, DENY_DOS, A_RW}, +{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, +{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_DOS, A_W}, +{1, O_RDWR, DENY_NONE, O_RDWR, DENY_ALL, A_0}, +{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_NONE, O_RDWR, DENY_READ, A_0}, +{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, +{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, +{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, +{1, O_RDWR, DENY_NONE, O_RDWR, DENY_FCB, A_0}, +{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, +{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_DOS, A_RW}, +{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, +{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_W}, +{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_RW}, +{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_R}, +{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_W}, +{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_READ, A_0}, +{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, +{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, +{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, +{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, +{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_DOS, A_RW}, +{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, +{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_W}, +{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_READ, A_RW}, +{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_READ, A_R}, +{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_READ, A_W}, +{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, +{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, +{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, +{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, +{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, +{1, O_RDWR, DENY_FCB, O_RDWR, DENY_DOS, A_RW}, +{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_DOS, A_R}, +{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_DOS, A_W}, +{1, O_RDWR, DENY_FCB, O_RDWR, DENY_ALL, A_0}, +{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDWR, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, +{1, O_RDWR, DENY_FCB, O_RDWR, DENY_READ, A_0}, +{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_READ, A_0}, +{1, O_RDWR, DENY_FCB, O_RDWR, DENY_NONE, A_0}, +{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, +{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, +{1, O_RDWR, DENY_FCB, O_RDWR, DENY_FCB, A_RW}, +{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_FCB, A_RW}, +{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_FCB, A_RW}, +{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_DOS, A_RW}, +{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_R}, +{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_W}, +{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, +{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, +{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, +{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, +{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, +{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, +{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, +{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, +{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, +{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_FCB, A_RW}, +{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_RW}, +{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_RW}, +{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_DOS, A_RW}, +{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_R}, +{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_W}, +{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, +{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, +{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, +{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, +{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, +{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, +{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, +{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, +{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_FCB, A_RW}, +{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_RW}, +{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_RW}, +{0, O_RDWR, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, +{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, +{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, +{0, O_RDWR, DENY_DOS, O_RDWR, DENY_ALL, A_0}, +{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_DOS, O_RDWR, DENY_READ, A_0}, +{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_DOS, O_RDWR, DENY_NONE, A_0}, +{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_NONE, A_0}, +{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_NONE, A_0}, +{0, O_RDWR, DENY_DOS, O_RDWR, DENY_FCB, A_RW}, +{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_FCB, A_RW}, +{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_FCB, A_RW}, +{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, +{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_R}, +{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_READ, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, +{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, +{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, +{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, +{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_READ, A_0}, +{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0}, +{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0}, +{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_FCB, A_RW}, +{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_RW}, +{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_RW}, +{0, O_RDWR, DENY_ALL, O_RDWR, DENY_DOS, A_0}, +{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, +{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, +{0, O_RDWR, DENY_ALL, O_RDWR, DENY_ALL, A_0}, +{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_ALL, O_RDWR, DENY_READ, A_0}, +{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_ALL, O_RDWR, DENY_NONE, A_0}, +{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, +{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, +{0, O_RDWR, DENY_ALL, O_RDWR, DENY_FCB, A_0}, +{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, +{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, +{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_DOS, A_0}, +{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_READ, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, +{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, +{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, +{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, +{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_R}, +{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, +{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_R}, +{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, +{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, +{0, O_RDWR, DENY_READ, O_RDWR, DENY_DOS, A_0}, +{0, O_RDWR, DENY_READ, O_RDONLY, DENY_DOS, A_0}, +{0, O_RDWR, DENY_READ, O_WRONLY, DENY_DOS, A_0}, +{0, O_RDWR, DENY_READ, O_RDWR, DENY_ALL, A_0}, +{0, O_RDWR, DENY_READ, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_READ, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_READ, O_RDWR, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_READ, O_RDWR, DENY_READ, A_0}, +{0, O_RDWR, DENY_READ, O_RDONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_READ, O_WRONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_READ, O_RDWR, DENY_NONE, A_0}, +{0, O_RDWR, DENY_READ, O_RDONLY, DENY_NONE, A_0}, +{0, O_RDWR, DENY_READ, O_WRONLY, DENY_NONE, A_W}, +{0, O_RDWR, DENY_READ, O_RDWR, DENY_FCB, A_0}, +{0, O_RDWR, DENY_READ, O_RDONLY, DENY_FCB, A_0}, +{0, O_RDWR, DENY_READ, O_WRONLY, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_W}, +{0, O_RDONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, +{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, +{0, O_RDONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, +{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, +{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_READ, A_W}, +{0, O_WRONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, +{0, O_WRONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, +{0, O_RDWR, DENY_NONE, O_RDWR, DENY_DOS, A_0}, +{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_DOS, A_0}, +{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_DOS, A_0}, +{0, O_RDWR, DENY_NONE, O_RDWR, DENY_ALL, A_0}, +{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_NONE, O_RDWR, DENY_READ, A_0}, +{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, +{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, +{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, +{0, O_RDWR, DENY_NONE, O_RDWR, DENY_FCB, A_0}, +{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, +{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, +{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_0}, +{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_RW}, +{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_R}, +{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_W}, +{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_READ, A_0}, +{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, +{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, +{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, +{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, +{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_0}, +{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_READ, A_RW}, +{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_READ, A_R}, +{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_READ, A_W}, +{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, +{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, +{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, +{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, +{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, +{0, O_RDWR, DENY_FCB, O_RDWR, DENY_DOS, A_RW}, +{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_DOS, A_R}, +{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_DOS, A_W}, +{0, O_RDWR, DENY_FCB, O_RDWR, DENY_ALL, A_0}, +{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDWR, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, +{0, O_RDWR, DENY_FCB, O_RDWR, DENY_READ, A_0}, +{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_READ, A_0}, +{0, O_RDWR, DENY_FCB, O_RDWR, DENY_NONE, A_0}, +{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, +{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, +{0, O_RDWR, DENY_FCB, O_RDWR, DENY_FCB, A_RW}, +{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_FCB, A_RW}, +{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_FCB, A_RW}, +{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_DOS, A_RW}, +{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_R}, +{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_W}, +{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, +{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, +{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, +{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, +{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, +{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_FCB, A_RW}, +{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_RW}, +{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_RW}, +{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_DOS, A_RW}, +{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_R}, +{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_W}, +{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, +{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, +{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, +{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, +{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, +{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, +{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_FCB, A_RW}, +{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_RW}, +{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_RW} +}; + + +static void progress_bar(unsigned i, unsigned total) +{ + if (i % 10 != 0) return; + printf("%5d/%5d\r", i, total); + fflush(stdout); +} + +/* + this produces a matrix of deny mode behaviour for 1 connection + */ +BOOL torture_denytest1(int dummy) +{ + static struct cli_state *cli1; + int fnum1, fnum2; + int i; + BOOL correct = True; + const char *fnames[2] = {"\\denytest1.dat", "\\denytest1.exe"}; + + if (!torture_open_connection(&cli1)) { + return False; + } + + printf("starting denytest1\n"); + + printf("Testing deny modes with 1 connection\n"); + + for (i=0;i<2;i++) { + cli_unlink(cli1->tree, fnames[i]); + fnum1 = cli_open(cli1->tree, fnames[i], O_RDWR|O_CREAT, DENY_NONE); + cli_write(cli1->tree, fnum1, 0, fnames[i], 0, strlen(fnames[i])); + cli_close(cli1->tree, fnum1); + } + + printf("testing %d entries\n", ARRAY_SIZE(denytable1)); + + for (i=0; itree, fname, + denytable1[i].mode1, + denytable1[i].deny1); + fnum2 = cli_open(cli1->tree, fname, + denytable1[i].mode2, + denytable1[i].deny2); + + if (fnum1 == -1) { + res = A_X; + } else if (fnum2 == -1) { + res = A_0; + } else { + char x = 1; + res = A_0; + if (cli_read(cli1->tree, fnum2, (void *)&x, 0, 1) == 1) { + res += A_R; + } + if (cli_write(cli1->tree, fnum2, 0, (void *)&x, 0, 1) == 1) { + res += A_W; + } + } + + if (res != denytable1[i].result) { + correct = False; + } + + if (torture_showall || res != denytable1[i].result) { + printf("%s %8s %10s %8s %10s %s (correct=%s)\n", + fname, + denystr(denytable1[i].deny1), + openstr(denytable1[i].mode1), + denystr(denytable1[i].deny2), + openstr(denytable1[i].mode2), + resultstr(res), + resultstr(denytable1[i].result)); + } + + cli_close(cli1->tree, fnum1); + cli_close(cli1->tree, fnum2); + } + + for (i=0;i<2;i++) { + cli_unlink(cli1->tree, fnames[i]); + } + + if (!torture_close_connection(cli1)) { + correct = False; + } + + printf("finshed denytest1\n"); + return correct; +} + + +/* + this produces a matrix of deny mode behaviour with 2 connections + */ +BOOL torture_denytest2(int dummy) +{ + static struct cli_state *cli1, *cli2; + int fnum1, fnum2; + int i; + BOOL correct = True; + const char *fnames[2] = {"\\denytest2.dat", "\\denytest2.exe"}; + + if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) { + return False; + } + + printf("starting denytest2\n"); + + printf("Testing deny modes with 2 connections\n"); + + for (i=0;i<2;i++) { + cli_unlink(cli1->tree, fnames[i]); + fnum1 = cli_open(cli1->tree, fnames[i], O_RDWR|O_CREAT, DENY_NONE); + cli_write(cli1->tree, fnum1, 0, fnames[i], 0, strlen(fnames[i])); + cli_close(cli1->tree, fnum1); + } + + for (i=0; itree, fname, + denytable2[i].mode1, + denytable2[i].deny1); + fnum2 = cli_open(cli2->tree, fname, + denytable2[i].mode2, + denytable2[i].deny2); + + if (fnum1 == -1) { + res = A_X; + } else if (fnum2 == -1) { + res = A_0; + } else { + char x = 1; + res = A_0; + if (cli_read(cli2->tree, fnum2, (void *)&x, 0, 1) == 1) { + res += A_R; + } + if (cli_write(cli2->tree, fnum2, 0, (void *)&x, 0, 1) == 1) { + res += A_W; + } + } + + if (res != denytable2[i].result) { + correct = False; + } + + if (torture_showall || res != denytable2[i].result) { + printf("%s %8s %10s %8s %10s %s (correct=%s)\n", + fname, + denystr(denytable2[i].deny1), + openstr(denytable2[i].mode1), + denystr(denytable2[i].deny2), + openstr(denytable2[i].mode2), + resultstr(res), + resultstr(denytable2[i].result)); + } + + cli_close(cli1->tree, fnum1); + cli_close(cli2->tree, fnum2); + } + + for (i=0;i<2;i++) { + cli_unlink(cli1->tree, fnames[i]); + } + + if (!torture_close_connection(cli1)) { + correct = False; + } + if (!torture_close_connection(cli2)) { + correct = False; + } + + printf("finshed denytest2\n"); + return correct; +} + diff --git a/source4/torture/basic/dfstest.c b/source4/torture/basic/dfstest.c new file mode 100644 index 0000000000..79d49aded3 --- /dev/null +++ b/source4/torture/basic/dfstest.c @@ -0,0 +1,459 @@ +/* + Unix SMB/CIFS implementation. + SMB torture tester - DFS tests + Copyright (C) James J Myers 2003 + + 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 + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 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. +*/ + +#include "includes.h" + +#define DFS_SERVER_COUNT 6 +#define DFS_FILE_COUNT 8 +extern char *host, *share, *password, *username; +static struct cli_client context; +static const char *sockops="TCP_NODELAY"; + +/* + checks for correct DFS cluster support + */ +BOOL torture_dfs_basic(int dummy) +{ + int current_server = 0; + char *fname[DFS_FILE_COUNT]; + int file_server[DFS_FILE_COUNT]; + int fnum[DFS_FILE_COUNT]; + int i; + const char *template = "\\\\%s\\%s\\dfstest%d.tmp"; + char *filedata; + int server_count = 0; + int connection_flags = CLI_FULL_CONNECTION_USE_KERBEROS + | CLI_FULL_CONNECTION_USE_DFS + ; + + printf("starting dfs_basic_test\n"); + cli_client_initialize(&context, sockops, username, password, lp_workgroup(), connection_flags); + + if ((current_server = cli_dfs_open_connection(&context, host, share, connection_flags) < 0)) + return False; + + for (i=0; i < DFS_FILE_COUNT ; i++) { + file_server[i] = 0; + DEBUG(4,("host=%s share=%s cli host=%s cli share=%s\n", + host, share, cli_state_get_host(context.cli[file_server[i]]), + cli_state_get_share(context.cli[file_server[i]]))); + host = cli_state_get_host(context.cli[file_server[i]]); + share = cli_state_get_share(context.cli[file_server[i]]); + asprintf(&fname[i], template, host, share, i); + DEBUG(3,("unlinking %s\n", fname[i])); + cli_nt_unlink(&context, &file_server[i], fname[i], 0); + } + + for (i=0; i < DFS_FILE_COUNT ; i++) { + host = cli_state_get_host(context.cli[file_server[i]]); + share = cli_state_get_share(context.cli[file_server[i]]); + asprintf(&fname[i], template, host, share, i); + DEBUG(3,("open %s on server %s(%d)\n", + fname[i], host, file_server[i])); + fnum[i] = cli_dfs_open(&context, &file_server[i], fname[i], O_RDWR|O_CREAT|O_EXCL, DENY_NONE); + if (fnum[i] == -1) + { + printf("open of %s failed (%s)\n", fname[i], cli_errstr(context.cli[file_server[i]])); + return False; + } + asprintf(&filedata, "%s %d", fname[i], fnum[i]); + DEBUG(3,("write %d bytes (%s) to %s (fid %d) on server %s(%d)\n", + strlen(filedata), filedata, fname[i], fnum[i], + host, file_server[i])); + if (cli_write(context.cli[file_server[i]], fnum[i], 0, filedata, 0, strlen(filedata)) != strlen(filedata)) + { + printf("write failed (%s)\n", cli_errstr(context.cli[file_server[i]])); + return False; + } + + if (!cli_close(context.cli[file_server[i]], fnum[i])) { + printf("close of %s failed (%s)\n", fname[i], cli_errstr(context.cli[file_server[i]])); + return False; + } + } + DEBUG(3,("used Dfs servers:")); + for (i=0; i < DFS_SERVER_COUNT ; i++) { + server_count++; + DEBUG(3,(" %s(%d)", cli_state_get_host(context.cli[file_server[i]]), i)); + if (!torture_close_connection(context.cli[i])) + return False; + } + DEBUG(3,("\n")); + + printf("Passed dfstest, found and used %d Dfs servers\n", server_count); + return True; +} + +/* + Check for correct DFS rename support. + First test is simple rename, a la command line, explorer. + Second test is simulation of MS Word edit/save file. + */ +BOOL torture_dfs_rename(int dummy) +{ + int current_server = -1; + char *fname[DFS_FILE_COUNT]; + int file_server[DFS_FILE_COUNT]; + int fnum[DFS_FILE_COUNT]; + int i; + const char *template = "\\\\%s\\%s\\dfstest%d.tmp"; + const char *template2orig = "\\\\%s\\%s\\dfstestorig.txt"; + const char *template2old = "\\\\%s\\%s\\~dfstestold.txt"; + const char *template2new = "\\\\%s\\%s\\~dfstestnew.txt"; + char *filedata, *newdata; + int server_count = 0; + int connection_flags = CLI_FULL_CONNECTION_USE_KERBEROS + | CLI_FULL_CONNECTION_USE_DFS + ; + + printf("starting dfs_rename_test\n"); + cli_client_initialize(&context, sockops, username, password, + lp_workgroup(), connection_flags); + + if ((current_server = cli_dfs_open_connection(&context, host, share, connection_flags)) < 0) + return False; + + for (i=0; i < DFS_FILE_COUNT ; i++) { + file_server[i] = 0; + slprintf(fname[i],sizeof(fstring)-1,template, host, share, i); + DEBUG(3,("unlinking %s\n", fname[i])); + cli_nt_unlink(&context, &file_server[i], fname[i], 0); + } + /* Simple rename test */ + for (i=0; i < 1 ; i++) { + slprintf(fname[i],sizeof(fstring)-1,template, + cli_state_get_host(context.cli[file_server[i]]), + cli_state_get_share(context.cli[file_server[i]]), i); + DEBUG(3,("open %s on server %s(%d)\n", + fname[i], cli_state_get_host(context.cli[file_server[i]]), file_server[i])); + + fnum[i] = cli_dfs_open(&context, &file_server[i], fname[i], O_RDWR|O_CREAT|O_EXCL, DENY_NONE); + if (fnum[i] == -1) { + printf("open of %s failed (%s)\n", fname[i], cli_errstr(context.cli[file_server[i]])); + return False; + } + asprintf(&filedata, "%s %d", fname[i], (int)getpid()); + DEBUG(3,("write %d bytes (%s) to %s (fid %d) on server %s(%d)\n", + strlen(filedata), filedata, fname[i], fnum[i], + cli_state_get_host(context.cli[file_server[i]]), file_server[i])); + if (cli_write(context.cli[file_server[i]], fnum[i], 0, filedata, 0, strlen(filedata)) != strlen(filedata)) + { + printf("write failed (%s)\n", cli_errstr(context.cli[file_server[i]])); + return False; + } + + if (!cli_close(context.cli[file_server[i]], fnum[i])) { + printf("close of %s failed (%s)\n", fname[i], cli_errstr(context.cli[file_server[i]])); + return False; + } + } + // now attempt to rename the file + DEBUG(3,("rename %s to %s on server %s(%d)\n", + fname[0], fname[1], cli_state_get_host(context.cli[file_server[i]]), file_server[0])); + if (!cli_dfs_rename(&context, &file_server[0], fname[0], fname[1])) { + printf("rename of %s to %s failed (%s)\n", fname[0], fname[1], cli_errstr(context.cli[file_server[0]])); + return False; + } + // clean up + DEBUG(3,("used Dfs servers:")); + for (i=0; i < DFS_SERVER_COUNT ; i++) { + server_count++; + DEBUG(3,(" %s(%d)", cli_state_get_host(context.cli[file_server[i]]), i)); + if (!torture_close_connection(context.cli[i])) + return False; + } + DEBUG(3,("\n")); + printf("Dfstest: passed simple rename test\n"); + + /* Now try more complicated test, a la MS Word. + * Open existing file (x) and read file and close. + * Then open, write to new temp name file (~x.new), close. + * Then rename old file name to old temp name file (~x.old). + * Then rename new temp name file to oroginal name (x). */ + cli_client_initialize(&context, sockops, username, password, + lp_workgroup(), connection_flags); + + if ((current_server = cli_dfs_open_connection(&context, host, share, connection_flags)) < 0) + return False; + slprintf(fname[0],sizeof(fname[0])-1,template2orig, host, share); + slprintf(fname[1],sizeof(fname[1])-1,template2old, host, share); + slprintf(fname[2],sizeof(fname[2])-1,template2new, host, share); + for (i=0; i < DFS_FILE_COUNT ; i++) { + file_server[i] = 0; + fnum[i] = 0; + DEBUG(3,("unlinking %s\n", fname[i])); + cli_nt_unlink(&context, &file_server[i], fname[i], 0); + } + asprintf(&fname[0],template2orig, + cli_state_get_host(context.cli[0]), + cli_state_get_share(context.cli[0]), 0); + asprintf(&fname[1],template2old, + cli_state_get_host(context.cli[1]), + cli_state_get_share(context.cli[1]), 1); + asprintf(&fname[2],template2new, + cli_state_get_host(context.cli[2]), + cli_state_get_share(context.cli[2]), 2); + DEBUG(3,("edit(MS Word) %s on server %s(%d)\n", + fname[0], cli_state_get_host(context.cli[0]), file_server[0])); + DEBUG(3,("open %s on server %s(%d)\n", + fname[0], cli_state_get_host(context.cli[0]), file_server[0])); + + fnum[0] = cli_dfs_open(&context, &file_server[0], fname[0], O_RDWR|O_CREAT|O_EXCL, DENY_NONE); + if (fnum[0] == -1) + { + printf("open of %s failed (%s)\n", fname[0], cli_errstr(context.cli[file_server[0]])); + return False; + } + slprintf(filedata, sizeof(fstring)-1, "%s %d", fname[0], (int)getpid()); + DEBUG(3,("write %d bytes (%s) to %s (fid %d) on server %s(%d)\n", + strlen(filedata), filedata, fname[0], fnum[0], + cli_state_get_host(context.cli[0]), file_server[0])); + if (cli_write(context.cli[file_server[0]], fnum[0], 0, filedata, 0, strlen(filedata)) != strlen(filedata)) + { + printf("write failed (%s)\n", cli_errstr(context.cli[file_server[0]])); + return False; + } + // read data from original file + DEBUG(3,("read %s (fid %d) on server %s(%d)\n", + fname[0], fnum[0], cli_state_get_host(context.cli[0]), file_server[0])); + if (cli_read(context.cli[file_server[0]], fnum[0], filedata, 0, strlen(filedata)) != strlen(filedata)) + { + printf("read failed (%s)", cli_errstr(context.cli[file_server[0]])); + return False; + } + DEBUG(3,("close %s on server %s(%d)\n", + fname[0], cli_state_get_host(context.cli[0]), file_server[0])); + if (!cli_close(context.cli[file_server[0]], fnum[0])) { + printf("close of %s failed (%s)\n", fname[0], cli_errstr(context.cli[file_server[0]])); + return False; + } + // open new temp file, write data + DEBUG(3,("open %s on server %s(%d)\n", + fname[2], cli_state_get_host(context.cli[2]), file_server[2])); + fnum[2] = cli_dfs_open(&context, &file_server[2], fname[2], O_RDWR|O_CREAT|O_EXCL, DENY_NONE); + if (fnum[2] == -1) + { + printf("open of %s failed (%s)\n", fname[2], cli_errstr(context.cli[file_server[2]])); + return False; + } + DEBUG(3,("write %d bytes (%s) to %s (fid %d) on server %s(%d)\n", + strlen(filedata), filedata, fname[2], fnum[2], + cli_state_get_host(context.cli[2]), file_server[2])); + if (cli_write(context.cli[file_server[2]], fnum[2], 0, filedata, 0, strlen(filedata)) != strlen(filedata)) + { + printf("write failed (%s)\n", cli_errstr(context.cli[file_server[2]])); + return False; + } + slprintf(newdata, sizeof(fstring)-1, "new data: %s %d", fname[0], (int)getpid()); + DEBUG(3,("write new data %d bytes (%s) to %s (fid %d) on server %s(%d)\n", + strlen(newdata), newdata, fname[2], fnum[2], + cli_state_get_host(context.cli[2]), file_server[2])); + if (cli_write(context.cli[file_server[2]], fnum[2], 0, newdata, strlen(filedata), strlen(newdata)) != strlen(newdata)) + { + printf("write failed (%s)\n", cli_errstr(context.cli[file_server[2]])); + return False; + } + DEBUG(3,("close %s on server %s(%d)\n", + fname[2], cli_state_get_host(context.cli[2]), file_server[2])); + if (!cli_close(context.cli[file_server[2]], fnum[2])) { + printf("close of %s failed (%s)\n", fname[2], cli_errstr(context.cli[file_server[2]])); + return False; + } + DEBUG(3,("close successful %s on server %s(%d)\n", + fname[2], cli_state_get_host(context.cli[2]), file_server[2])); + // rename original file to temp + DEBUG(4,("file_server[0]=%d\n", file_server[0])); + DEBUG(4,("context.cli[file_server[0]].desthost=%s\n", cli_state_get_host(context.cli[0]))); + DEBUG(3,("rename %s to %s on server %s(%d)\n", + fname[0], fname[1], cli_state_get_host(context.cli[0]), file_server[0])); + if (!cli_dfs_rename(&context, &file_server[0], fname[0], fname[1])) { + printf("rename of %s to %s failed (%s)\n", fname[0], fname[1], cli_errstr(context.cli[file_server[0]])); + return False; + } + // name new temp file to original + DEBUG(3,("rename %s to %s on server %s(%d)\n", + fname[2], fname[0], cli_state_get_host(context.cli[2]), file_server[2])); + if (!cli_dfs_rename(&context, &file_server[2], fname[2], fname[0])) { + printf("rename of %s to %s failed (%s)\n", fname[2], fname[0], cli_errstr(context.cli[file_server[2]])); + return False; + } + printf("Dfstest: passed MS Word rename test\n"); + // clean up + DEBUG(3,("used Dfs servers:")); + for (i=0; i < DFS_SERVER_COUNT ; i++) { + server_count++; + DEBUG(3,(" %s(%d)", cli_state_get_host(context.cli[i]), i)); + if (!torture_close_connection(context.cli[i])) + return False; + } + DEBUG(3,("\n")); + + printf("Passed dfs_rename_test\n"); + return True; +} +struct list_fn_parms { + struct cli_client *context; + char* rname; +} list_fn_parms; + +void dfs_list_fn(file_info *finfo, const char *rname, void* parmsp); +void delete_file(file_info *finfo, const char *rname) +{ + int server = 0; + char *fname; + + DEBUG(3,("deleting file %s in %s\n", finfo->name, rname)); + asprintf(&fname, "%s\\%s", rname, finfo->name); + cli_nt_unlink(&context, &server, fname, 0); +} +void delete_directory(file_info *finfo, const char *rname) +{ + int server = 0; + char *dname, *rname2; + + DEBUG(3,("deleting directory %s in %s\n", finfo->name, rname)); + asprintf(&dname, "%s%s\\*", rname, finfo->name); + cli_nt_unlink(&context, &server, dname, 0); + asprintf(&dname, "%s%s\\*", rname, finfo->name); + asprintf(&rname2, "%s%s", rname, finfo->name); + cli_search(context.cli[0], dname, FILE_ATTRIBUTE_DIRECTORY, + dfs_list_fn, (void*)rname2); + cli_dfs_rmdir(&context, &server, rname2); +} + +void dfs_list_fn(file_info *finfo, const char *name, void* parmsp) +{ + struct list_fn_parms *parms = (struct list_fn_parms*)parmsp; + + DEBUG(4,("processing %s in %s\n", finfo->name, parms->rname)); + if (finfo->mode & FILE_ATTRIBUTE_DIRECTORY) { + delete_directory(finfo, parms->rname); + } + else { + delete_file(finfo, parms->rname); + } +} + +/* + checks for correct DFS cluster support creating random dirs/files. + */ +#define DFS_RANDOM_FILE_COUNT 10 +#define DFS_RANDOM_DIR_COUNT 3 +#define DFS_RANDOM_DIR_LEVELS 2 +BOOL torture_dfs_random(int dummy) +{ + char *fname[DFS_RANDOM_FILE_COUNT]; + int file_server[DFS_RANDOM_FILE_COUNT]; + char *dname[DFS_RANDOM_DIR_COUNT]; + int dir_server[DFS_RANDOM_DIR_COUNT]; + char *rname; + int fnum[DFS_FILE_COUNT]; + int i; + const char *ftemplate = "%s\\dfsfile%d.tmp"; + const char *alltemplate = "\\\\%s\\%s\\dfs*.tmp"; + char *filedata; + int server_count = 0; + int file_count; + int connection_flags = CLI_FULL_CONNECTION_USE_KERBEROS + | CLI_FULL_CONNECTION_USE_DFS + ; + + printf("starting dfs_random_test\n"); + cli_client_initialize(&context, sockops, username, password, + lp_workgroup(), connection_flags); + + if ((dir_server[0] = cli_dfs_open_connection(&context, host, share, connection_flags)) < 0) + return False; + + // get list of directories named dfsdir*. + // delete all files in these directories using wild card, + // then delete directory. + asprintf(&rname, "\\\\%s\\%s\\", + cli_state_get_host(context.cli[0]), + cli_state_get_share(context.cli[0])); + asprintf(&fname[0], alltemplate, + cli_state_get_host(context.cli[0]), + cli_state_get_share(context.cli[0])); + DEBUG(3,("deleting files %s in %s on server %s(%d)\n", + fname[0], rname, cli_state_get_host(context.cli[0]), dir_server[0])); + file_count = cli_search(context.cli[0], fname[0], FILE_ATTRIBUTE_DIRECTORY, dfs_list_fn, (void*)rname); + + // create random directory names with 0-n levels + asprintf(&dname[0], "\\\\%s\\%s\\", + cli_state_get_host(context.cli[0]), + cli_state_get_share(context.cli[0])); + DEBUG(3,("creating directories in %s on server %s(%d)\n", + rname, cli_state_get_host(context.cli[0]), dir_server[0])); + for (i=1; i < DFS_RANDOM_DIR_COUNT; i++) { + dir_server[i] = 0; + asprintf(&dname[i], + "\\\\%s\\%s\\dfsdir%d.tmp", + cli_state_get_host(context.cli[dir_server[i]]), + cli_state_get_share(context.cli[dir_server[i]]), + (int)sys_random()%10000); + DEBUG(3,("mkdir %s on server %s(%d)\n", + dname[i], cli_state_get_host(context.cli[dir_server[i]]), dir_server[i])); + if (!cli_dfs_mkdir(&context, &dir_server[i], dname[i])) { + printf("mkdir of %s failed (%s)\n", dname[i], cli_errstr(context.cli[dir_server[i]])); + return False; + } + } + + for (i=0; i < DFS_RANDOM_FILE_COUNT ; i++) { + // select a directory randomly, create a file in it. + int dn = (int)sys_random()%DFS_RANDOM_DIR_COUNT; + file_server[i] = dir_server[dn]; + asprintf(&fname[i], ftemplate, dname[dn], i); + DEBUG(3,("open %s on server %s(%d)\n", + fname[i], cli_state_get_host(context.cli[dir_server[i]]), file_server[i])); + fnum[i] = cli_dfs_open(&context, &file_server[i], fname[i], O_RDWR|O_CREAT|O_EXCL, DENY_NONE); + if (fnum[i] == -1) + { + printf("open of %s failed (%s)\n", fname[i], cli_errstr(context.cli[file_server[i]])); + return False; + } + + asprintf(&filedata, "%s %d", fname[i], fnum[i]); + DEBUG(3,("write %d bytes (%s) to %s (fid %d) on server %s(%d)\n", + strlen(filedata), filedata, fname[i], fnum[i], + cli_state_get_host(context.cli[dir_server[i]]), file_server[i])); + if (cli_write(context.cli[file_server[i]], fnum[i], 0, filedata, 0, strlen(filedata)) != strlen(filedata)) + { + printf("write failed (%s)\n", cli_errstr(context.cli[file_server[i]])); + return False; + } + + if (!cli_close(context.cli[file_server[i]], fnum[i])) { + printf("close of %s failed (%s)\n", fname[i], cli_errstr(context.cli[file_server[i]])); + return False; + } + } + DEBUG(3,("used Dfs servers:")); + for (i=0; i < DFS_SERVER_COUNT ; i++) { + server_count++; + DEBUG(3,(" %s(%d)", cli_state_get_host(context.cli[i]), i)); + if (!torture_close_connection(context.cli[i])) + return False; + } + DEBUG(3,("\n")); + + printf("Passed dfs_random_test\n"); + return True; +} diff --git a/source4/torture/basic/mangle_test.c b/source4/torture/basic/mangle_test.c new file mode 100644 index 0000000000..94dac45b9d --- /dev/null +++ b/source4/torture/basic/mangle_test.c @@ -0,0 +1,205 @@ +/* + Unix SMB/CIFS implementation. + SMB torture tester - mangling test + Copyright (C) Andrew Tridgell 2002 + + 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 + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 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. +*/ + +#include "includes.h" + +static TDB_CONTEXT *tdb; + +#define NAME_LENGTH 20 + +static unsigned total, collisions, failures; + +static BOOL test_one(struct cli_state *cli, const char *name) +{ + int fnum; + const char *shortname; + fstring name2; + NTSTATUS status; + TDB_DATA data; + + total++; + + fnum = cli_open(cli->tree, name, O_RDWR|O_CREAT|O_EXCL, DENY_NONE); + if (fnum == -1) { + printf("open of %s failed (%s)\n", name, cli_errstr(cli->tree)); + return False; + } + + if (NT_STATUS_IS_ERR(cli_close(cli->tree, fnum))) { + printf("close of %s failed (%s)\n", name, cli_errstr(cli->tree)); + return False; + } + + /* get the short name */ + status = cli_qpathinfo_alt_name(cli->tree, name, &shortname); + if (!NT_STATUS_IS_OK(status)) { + printf("query altname of %s failed (%s)\n", name, cli_errstr(cli->tree)); + return False; + } + + snprintf(name2, sizeof(name2), "\\mangle_test\\%s", shortname); + if (NT_STATUS_IS_ERR(cli_unlink(cli->tree, name2))) { + printf("unlink of %s (%s) failed (%s)\n", + name2, name, cli_errstr(cli->tree)); + return False; + } + + /* recreate by short name */ + fnum = cli_open(cli->tree, name2, O_RDWR|O_CREAT|O_EXCL, DENY_NONE); + if (fnum == -1) { + printf("open2 of %s failed (%s)\n", name2, cli_errstr(cli->tree)); + return False; + } + if (NT_STATUS_IS_ERR(cli_close(cli->tree, fnum))) { + printf("close of %s failed (%s)\n", name, cli_errstr(cli->tree)); + return False; + } + + /* and unlink by long name */ + if (NT_STATUS_IS_ERR(cli_unlink(cli->tree, name))) { + printf("unlink2 of %s (%s) failed (%s)\n", + name, name2, cli_errstr(cli->tree)); + failures++; + cli_unlink(cli->tree, name2); + return True; + } + + /* see if the short name is already in the tdb */ + data = tdb_fetch_bystring(tdb, shortname); + if (data.dptr) { + /* maybe its a duplicate long name? */ + if (strcasecmp(name, data.dptr) != 0) { + /* we have a collision */ + collisions++; + printf("Collision between %s and %s -> %s " + " (coll/tot: %u/%u)\n", + name, data.dptr, shortname, collisions, total); + } + free(data.dptr); + } else { + TDB_DATA namedata; + /* store it for later */ + namedata.dptr = name; + namedata.dsize = strlen(name)+1; + tdb_store_bystring(tdb, shortname, namedata, TDB_REPLACE); + } + + return True; +} + + +static void gen_name(char *name) +{ + const char *chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz._-$~..."; + unsigned max_idx = strlen(chars); + unsigned len; + int i; + char *p; + + fstrcpy(name, "\\mangle_test\\"); + p = name + strlen(name); + + len = 1 + random() % NAME_LENGTH; + + for (i=0;itree, "\\mangle_test\\*"); + cli_rmdir(cli->tree, "\\mangle_test"); + + if (NT_STATUS_IS_ERR(cli_mkdir(cli->tree, "\\mangle_test"))) { + printf("ERROR: Failed to make directory\n"); + return False; + } + + for (i=0;itree, "\\mangle_test\\*"); + if (NT_STATUS_IS_ERR(cli_rmdir(cli->tree, "\\mangle_test"))) { + printf("ERROR: Failed to remove directory\n"); + return False; + } + + printf("\nTotal collisions %u/%u - %.2f%% (%u failures)\n", + collisions, total, (100.0*collisions) / total, failures); + + torture_close_connection(cli); + + printf("mangle test finished\n"); + return (failures == 0); +} diff --git a/source4/torture/basic/scanner.c b/source4/torture/basic/scanner.c new file mode 100644 index 0000000000..7368528200 --- /dev/null +++ b/source4/torture/basic/scanner.c @@ -0,0 +1,563 @@ +/* + Unix SMB/CIFS implementation. + SMB torture tester - scanning functions + Copyright (C) Andrew Tridgell 2001 + + 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 + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 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. +*/ + +#include "includes.h" + +#define VERBOSE 0 +#define OP_MIN 0 +#define OP_MAX 100 + +/**************************************************************************** +look for a partial hit +****************************************************************************/ +static void trans2_check_hit(const char *format, int op, int level, NTSTATUS status) +{ + if (NT_STATUS_V(status) == NT_STATUS_V(NT_STATUS_INVALID_LEVEL) || + NT_STATUS_V(status) == NT_STATUS_V(NT_STATUS_NOT_IMPLEMENTED) || + NT_STATUS_V(status) == NT_STATUS_V(NT_STATUS_NOT_SUPPORTED) || + NT_STATUS_V(status) == NT_STATUS_V(NT_STATUS_UNSUCCESSFUL) || + NT_STATUS_V(status) == NT_STATUS_V(NT_STATUS_INVALID_INFO_CLASS)) { + return; + } +#if VERBOSE + printf("possible %s hit op=%3d level=%5d status=%s\n", + format, op, level, nt_errstr(status)); +#endif +} + +/**************************************************************************** +check for existance of a trans2 call +****************************************************************************/ +static NTSTATUS try_trans2(struct cli_state *cli, + int op, + char *param, char *data, + int param_len, int data_len, + int *rparam_len, int *rdata_len) +{ + NTSTATUS status; + struct smb_trans2 t2; + uint16 setup = op; + TALLOC_CTX *mem_ctx; + + mem_ctx = talloc_init("try_trans2"); + + t2.in.max_param = 1024; + t2.in.max_data = 0x8000; + t2.in.max_setup = 10; + t2.in.flags = 0; + t2.in.timeout = 0; + t2.in.setup_count = 1; + t2.in.setup = &setup; + t2.in.params.data = param; + t2.in.params.length = param_len; + t2.in.data.data = data; + t2.in.data.length = data_len; + + status = smb_raw_trans2(cli->tree, mem_ctx, &t2); + + *rparam_len = t2.out.params.length; + *rdata_len = t2.out.data.length; + + talloc_destroy(mem_ctx); + + return status; +} + + +static NTSTATUS try_trans2_len(struct cli_state *cli, + const char *format, + int op, int level, + char *param, char *data, + int param_len, int *data_len, + int *rparam_len, int *rdata_len) +{ + NTSTATUS ret=NT_STATUS_OK; + + ret = try_trans2(cli, op, param, data, param_len, + sizeof(pstring), rparam_len, rdata_len); +#if VERBOSE + printf("op=%d level=%d ret=%s\n", op, level, nt_errstr(ret)); +#endif + if (!NT_STATUS_IS_OK(ret)) return ret; + + *data_len = 0; + while (*data_len < sizeof(pstring)) { + ret = try_trans2(cli, op, param, data, param_len, + *data_len, rparam_len, rdata_len); + if (NT_STATUS_IS_OK(ret)) break; + *data_len += 2; + } + if (NT_STATUS_IS_OK(ret)) { + printf("found %s level=%d data_len=%d rparam_len=%d rdata_len=%d\n", + format, level, *data_len, *rparam_len, *rdata_len); + } else { + trans2_check_hit(format, op, level, ret); + } + return ret; +} + + +/**************************************************************************** +check whether a trans2 opnum exists at all +****************************************************************************/ +static BOOL trans2_op_exists(struct cli_state *cli, int op) +{ + int data_len = 0; + int param_len = 0; + int rparam_len, rdata_len; + pstring param, data; + NTSTATUS status1, status2; + + memset(data, 0, sizeof(data)); + data_len = 4; + + /* try with a info level only */ + param_len = sizeof(param); + data_len = sizeof(data); + + memset(param, 0xFF, sizeof(param)); + memset(data, 0xFF, sizeof(data)); + + status1 = try_trans2(cli, 0xFFFF, param, data, param_len, data_len, + &rparam_len, &rdata_len); + + status2 = try_trans2(cli, op, param, data, param_len, data_len, + &rparam_len, &rdata_len); + + if (NT_STATUS_EQUAL(status1, status2)) return False; + + printf("Found op %d (status=%s)\n", op, nt_errstr(status2)); + + return True; +} + +/**************************************************************************** +check for existance of a trans2 call +****************************************************************************/ +static BOOL scan_trans2(struct cli_state *cli, int op, int level, + int fnum, int dnum, int qfnum, const char *fname) +{ + int data_len = 0; + int param_len = 0; + int rparam_len, rdata_len; + pstring param, data; + NTSTATUS status; + + memset(data, 0, sizeof(data)); + data_len = 4; + + /* try with a info level only */ + param_len = 2; + SSVAL(param, 0, level); + status = try_trans2_len(cli, "void", op, level, param, data, param_len, &data_len, + &rparam_len, &rdata_len); + if (NT_STATUS_IS_OK(status)) return True; + + /* try with a file descriptor */ + param_len = 6; + SSVAL(param, 0, fnum); + SSVAL(param, 2, level); + SSVAL(param, 4, 0); + status = try_trans2_len(cli, "fnum", op, level, param, data, param_len, &data_len, + &rparam_len, &rdata_len); + if (NT_STATUS_IS_OK(status)) return True; + + /* try with a quota file descriptor */ + param_len = 6; + SSVAL(param, 0, qfnum); + SSVAL(param, 2, level); + SSVAL(param, 4, 0); + status = try_trans2_len(cli, "qfnum", op, level, param, data, param_len, &data_len, + &rparam_len, &rdata_len); + if (NT_STATUS_IS_OK(status)) return True; + + /* try with a notify style */ + param_len = 6; + SSVAL(param, 0, dnum); + SSVAL(param, 2, dnum); + SSVAL(param, 4, level); + status = try_trans2_len(cli, "notify", op, level, param, data, param_len, &data_len, + &rparam_len, &rdata_len); + if (NT_STATUS_IS_OK(status)) return True; + + /* try with a file name */ + param_len = 6; + SSVAL(param, 0, level); + SSVAL(param, 2, 0); + SSVAL(param, 4, 0); + param_len += push_string(NULL, ¶m[6], fname, sizeof(pstring)-7, STR_TERMINATE|STR_UNICODE); + + status = try_trans2_len(cli, "fname", op, level, param, data, param_len, &data_len, + &rparam_len, &rdata_len); + if (NT_STATUS_IS_OK(status)) return True; + + /* try with a new file name */ + param_len = 6; + SSVAL(param, 0, level); + SSVAL(param, 2, 0); + SSVAL(param, 4, 0); + param_len += push_string(NULL, ¶m[6], "\\newfile.dat", sizeof(pstring)-7, STR_TERMINATE|STR_UNICODE); + + status = try_trans2_len(cli, "newfile", op, level, param, data, param_len, &data_len, + &rparam_len, &rdata_len); + cli_unlink(cli->tree, "\\newfile.dat"); + cli_rmdir(cli->tree, "\\newfile.dat"); + if (NT_STATUS_IS_OK(status)) return True; + + /* try dfs style */ + cli_mkdir(cli->tree, "\\testdir"); + param_len = 2; + SSVAL(param, 0, level); + param_len += push_string(NULL, ¶m[2], "\\testdir", sizeof(pstring)-3, STR_TERMINATE|STR_UNICODE); + + status = try_trans2_len(cli, "dfs", op, level, param, data, param_len, &data_len, + &rparam_len, &rdata_len); + cli_rmdir(cli->tree, "\\testdir"); + if (NT_STATUS_IS_OK(status)) return True; + + return False; +} + + +BOOL torture_trans2_scan(int dummy) +{ + static struct cli_state *cli; + int op, level; + const char *fname = "\\scanner.dat"; + int fnum, dnum, qfnum; + + printf("starting trans2 scan test\n"); + + if (!torture_open_connection(&cli)) { + return False; + } + + fnum = cli_open(cli->tree, fname, O_RDWR | O_CREAT | O_TRUNC, DENY_NONE); + if (fnum == -1) { + printf("file open failed - %s\n", cli_errstr(cli->tree)); + } + dnum = cli_nt_create_full(cli->tree, "\\", + 0, GENERIC_RIGHTS_FILE_READ, FILE_ATTRIBUTE_NORMAL, + NTCREATEX_SHARE_ACCESS_READ | NTCREATEX_SHARE_ACCESS_WRITE, + NTCREATEX_DISP_OPEN, + NTCREATEX_OPTIONS_DIRECTORY, 0); + if (dnum == -1) { + printf("directory open failed - %s\n", cli_errstr(cli->tree)); + } + qfnum = cli_nt_create_full(cli->tree, "\\$Extend\\$Quota:$Q:$INDEX_ALLOCATION", + NTCREATEX_FLAGS_EXTENDED, + SEC_RIGHTS_MAXIMUM_ALLOWED, + 0, + NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_WRITE, + NTCREATEX_DISP_OPEN, + 0, 0); + if (qfnum == -1) { + printf("quota open failed - %s\n", cli_errstr(cli->tree)); + } + + for (op=OP_MIN; op<=OP_MAX; op++) { + + if (!trans2_op_exists(cli, op)) { + continue; + } + + for (level = 0; level <= 50; level++) { + scan_trans2(cli, op, level, fnum, dnum, qfnum, fname); + } + + for (level = 0x100; level <= 0x130; level++) { + scan_trans2(cli, op, level, fnum, dnum, qfnum, fname); + } + + for (level = 1000; level < 1050; level++) { + scan_trans2(cli, op, level, fnum, dnum, qfnum, fname); + } + } + + torture_close_connection(cli); + + printf("trans2 scan finished\n"); + return True; +} + + + + +/**************************************************************************** +look for a partial hit +****************************************************************************/ +static void nttrans_check_hit(const char *format, int op, int level, NTSTATUS status) +{ + if (NT_STATUS_V(status) == NT_STATUS_V(NT_STATUS_INVALID_LEVEL) || + NT_STATUS_V(status) == NT_STATUS_V(NT_STATUS_NOT_IMPLEMENTED) || + NT_STATUS_V(status) == NT_STATUS_V(NT_STATUS_NOT_SUPPORTED) || + NT_STATUS_V(status) == NT_STATUS_V(NT_STATUS_UNSUCCESSFUL) || + NT_STATUS_V(status) == NT_STATUS_V(NT_STATUS_INVALID_INFO_CLASS)) { + return; + } +#if VERBOSE + printf("possible %s hit op=%3d level=%5d status=%s\n", + format, op, level, nt_errstr(status)); +#endif +} + +/**************************************************************************** +check for existence of a nttrans call +****************************************************************************/ +static NTSTATUS try_nttrans(struct cli_state *cli, + int op, + char *param, char *data, + int param_len, int data_len, + int *rparam_len, int *rdata_len) +{ + struct smb_nttrans parms; + DATA_BLOB ntparam_blob, ntdata_blob; + TALLOC_CTX *mem_ctx; + NTSTATUS status; + + mem_ctx = talloc_init("try_nttrans"); + + ntparam_blob.length = param_len; + ntparam_blob.data = param; + ntdata_blob.length = data_len; + ntdata_blob.data = data; + + parms.in.max_param = 1024; + parms.in.max_data = 1024; + parms.in.max_setup = 0; + parms.in.setup_count = 0; + parms.in.function = op; + parms.in.params = ntparam_blob; + parms.in.data = ntdata_blob; + + status = smb_raw_nttrans(cli->tree, mem_ctx, &parms); + + if (NT_STATUS_IS_ERR(status)) { + DEBUG(1,("Failed to send NT_TRANS\n")); + talloc_destroy(mem_ctx); + return status; + } + *rparam_len = parms.out.params.length; + *rdata_len = parms.out.data.length; + + talloc_destroy(mem_ctx); + + return status; +} + + +static NTSTATUS try_nttrans_len(struct cli_state *cli, + const char *format, + int op, int level, + char *param, char *data, + int param_len, int *data_len, + int *rparam_len, int *rdata_len) +{ + NTSTATUS ret=NT_STATUS_OK; + + ret = try_nttrans(cli, op, param, data, param_len, + sizeof(pstring), rparam_len, rdata_len); +#if VERBOSE + printf("op=%d level=%d ret=%s\n", op, level, nt_errstr(ret)); +#endif + if (!NT_STATUS_IS_OK(ret)) return ret; + + *data_len = 0; + while (*data_len < sizeof(pstring)) { + ret = try_nttrans(cli, op, param, data, param_len, + *data_len, rparam_len, rdata_len); + if (NT_STATUS_IS_OK(ret)) break; + *data_len += 2; + } + if (NT_STATUS_IS_OK(ret)) { + printf("found %s level=%d data_len=%d rparam_len=%d rdata_len=%d\n", + format, level, *data_len, *rparam_len, *rdata_len); + } else { + nttrans_check_hit(format, op, level, ret); + } + return ret; +} + +/**************************************************************************** +check for existance of a nttrans call +****************************************************************************/ +static BOOL scan_nttrans(struct cli_state *cli, int op, int level, + int fnum, int dnum, const char *fname) +{ + int data_len = 0; + int param_len = 0; + int rparam_len, rdata_len; + pstring param, data; + NTSTATUS status; + + memset(data, 0, sizeof(data)); + data_len = 4; + + /* try with a info level only */ + param_len = 2; + SSVAL(param, 0, level); + status = try_nttrans_len(cli, "void", op, level, param, data, param_len, &data_len, + &rparam_len, &rdata_len); + if (NT_STATUS_IS_OK(status)) return True; + + /* try with a file descriptor */ + param_len = 6; + SSVAL(param, 0, fnum); + SSVAL(param, 2, level); + SSVAL(param, 4, 0); + status = try_nttrans_len(cli, "fnum", op, level, param, data, param_len, &data_len, + &rparam_len, &rdata_len); + if (NT_STATUS_IS_OK(status)) return True; + + + /* try with a notify style */ + param_len = 6; + SSVAL(param, 0, dnum); + SSVAL(param, 2, dnum); + SSVAL(param, 4, level); + status = try_nttrans_len(cli, "notify", op, level, param, data, param_len, &data_len, + &rparam_len, &rdata_len); + if (NT_STATUS_IS_OK(status)) return True; + + /* try with a file name */ + param_len = 6; + SSVAL(param, 0, level); + SSVAL(param, 2, 0); + SSVAL(param, 4, 0); + param_len += push_string(NULL, ¶m[6], fname, -1, STR_TERMINATE | STR_UNICODE); + + status = try_nttrans_len(cli, "fname", op, level, param, data, param_len, &data_len, + &rparam_len, &rdata_len); + if (NT_STATUS_IS_OK(status)) return True; + + /* try with a new file name */ + param_len = 6; + SSVAL(param, 0, level); + SSVAL(param, 2, 0); + SSVAL(param, 4, 0); + param_len += push_string(NULL, ¶m[6], "\\newfile.dat", -1, STR_TERMINATE | STR_UNICODE); + + status = try_nttrans_len(cli, "newfile", op, level, param, data, param_len, &data_len, + &rparam_len, &rdata_len); + cli_unlink(cli->tree, "\\newfile.dat"); + cli_rmdir(cli->tree, "\\newfile.dat"); + if (NT_STATUS_IS_OK(status)) return True; + + /* try dfs style */ + cli_mkdir(cli->tree, "\\testdir"); + param_len = 2; + SSVAL(param, 0, level); + param_len += push_string(NULL, ¶m[2], "\\testdir", -1, STR_TERMINATE | STR_UNICODE); + + status = try_nttrans_len(cli, "dfs", op, level, param, data, param_len, &data_len, + &rparam_len, &rdata_len); + cli_rmdir(cli->tree, "\\testdir"); + if (NT_STATUS_IS_OK(status)) return True; + + return False; +} + + +BOOL torture_nttrans_scan(int dummy) +{ + static struct cli_state *cli; + int op, level; + const char *fname = "\\scanner.dat"; + int fnum, dnum; + + printf("starting nttrans scan test\n"); + + if (!torture_open_connection(&cli)) { + return False; + } + + fnum = cli_open(cli->tree, fname, O_RDWR | O_CREAT | O_TRUNC, + DENY_NONE); + dnum = cli_open(cli->tree, "\\", O_RDONLY, DENY_NONE); + + for (op=OP_MIN; op<=OP_MAX; op++) { + printf("Scanning op=%d\n", op); + for (level = 0; level <= 50; level++) { + scan_nttrans(cli, op, level, fnum, dnum, fname); + } + + for (level = 0x100; level <= 0x130; level++) { + scan_nttrans(cli, op, level, fnum, dnum, fname); + } + + for (level = 1000; level < 1050; level++) { + scan_nttrans(cli, op, level, fnum, dnum, fname); + } + } + + torture_close_connection(cli); + + printf("nttrans scan finished\n"); + return True; +} + + +/* scan for valid base SMB requests */ +BOOL torture_smb_scan(int dummy) +{ + static struct cli_state *cli; + int op; + struct cli_request *req; + NTSTATUS status; + + for (op=0x0;op<=0xFF;op++) { + if (op == SMBreadbraw) continue; + + if (!torture_open_connection(&cli)) { + return False; + } + + req = cli_request_setup(cli->tree, op, 0, 0); + + if (!cli_request_send(req)) { + cli_request_destroy(req); + break; + } + + usleep(10000); + if (cli_transport_pending(cli->transport)) { + status = cli_request_simple_recv(req); + printf("op=0x%x status=%s\n", op, nt_errstr(status)); + torture_close_connection(cli); + continue; + } + + sleep(1); + if (cli_transport_pending(cli->transport)) { + status = cli_request_simple_recv(req); + printf("op=0x%x status=%s\n", op, nt_errstr(status)); + } else { + printf("op=0x%x no reply\n", op); + cli_request_destroy(req); + continue; /* don't attempt close! */ + } + + torture_close_connection(cli); + } + + + printf("smb scan finished\n"); + return True; +} diff --git a/source4/torture/basic/utable.c b/source4/torture/basic/utable.c new file mode 100644 index 0000000000..ec37edab82 --- /dev/null +++ b/source4/torture/basic/utable.c @@ -0,0 +1,199 @@ +/* + Unix SMB/CIFS implementation. + SMB torture tester - unicode table dumper + Copyright (C) Andrew Tridgell 2001 + + 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 + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 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. +*/ + +#include "includes.h" + +BOOL torture_utable(int dummy) +{ + struct cli_state *cli; + fstring fname; + const char *alt_name; + int fnum; + smb_ucs2_t c2; + int c, len, fd; + int chars_allowed=0, alt_allowed=0; + uint8 valid[0x10000]; + + printf("starting utable\n"); + + printf("Generating valid character table\n"); + + if (!torture_open_connection(&cli)) { + return False; + } + + memset(valid, 0, sizeof(valid)); + + cli_mkdir(cli->tree, "\\utable"); + cli_unlink(cli->tree, "\\utable\\*"); + + for (c=1; c < 0x10000; c++) { + char *p; + + SSVAL(&c2, 0, c); + fstrcpy(fname, "\\utable\\x"); + p = fname+strlen(fname); + len = convert_string(CH_UCS2, CH_UNIX, + &c2, 2, + p, sizeof(fname)-strlen(fname)); + p[len] = 0; + fstrcat(fname,"_a_long_extension"); + + fnum = cli_open(cli->tree, fname, O_RDWR | O_CREAT | O_TRUNC, + DENY_NONE); + if (fnum == -1) continue; + + chars_allowed++; + + cli_qpathinfo_alt_name(cli->tree, fname, &alt_name); + + if (strncmp(alt_name, "X_A_L", 5) != 0) { + alt_allowed++; + valid[c] = 1; + d_printf("fname=[%s] alt_name=[%s]\n", fname, alt_name); + } + + cli_close(cli->tree, fnum); + cli_unlink(cli->tree, fname); + + if (c % 100 == 0) { + printf("%d (%d/%d)\r", c, chars_allowed, alt_allowed); + } + } + printf("%d (%d/%d)\n", c, chars_allowed, alt_allowed); + + cli_rmdir(cli->tree, "\\utable"); + + d_printf("%d chars allowed %d alt chars allowed\n", chars_allowed, alt_allowed); + + fd = open("valid.dat", O_WRONLY|O_CREAT|O_TRUNC, 0644); + if (fd == -1) { + d_printf("Failed to create valid.dat - %s", strerror(errno)); + return False; + } + write(fd, valid, 0x10000); + close(fd); + d_printf("wrote valid.dat\n"); + + return True; +} + + +static char *form_name(int c) +{ + static fstring fname; + smb_ucs2_t c2; + char *p; + int len; + + fstrcpy(fname, "\\utable\\"); + p = fname+strlen(fname); + SSVAL(&c2, 0, c); + + len = convert_string(CH_UCS2, CH_UNIX, + &c2, 2, + p, sizeof(fname)-strlen(fname)); + p[len] = 0; + return fname; +} + +BOOL torture_casetable(int dummy) +{ + static struct cli_state *cli; + char *fname; + int fnum; + int c, i; +#define MAX_EQUIVALENCE 8 + smb_ucs2_t equiv[0x10000][MAX_EQUIVALENCE]; + printf("starting casetable\n"); + + if (!torture_open_connection(&cli)) { + return False; + } + + printf("Determining upper/lower case table\n"); + + memset(equiv, 0, sizeof(equiv)); + + cli_deltree(cli->tree, "\\utable"); + if (NT_STATUS_IS_ERR(cli_mkdir(cli->tree, "\\utable"))) { + printf("Failed to create utable directory!\n"); + return False; + } + + for (c=1; c < 0x10000; c++) { + size_t size; + + if (c == '.' || c == '\\') continue; + + d_printf("%04x (%c)\n", c, isprint(c)?c:'.'); + + fname = form_name(c); + fnum = cli_nt_create_full(cli->tree, fname, 0, +#if 0 + SEC_RIGHT_MAXIMUM_ALLOWED, +#else + GENERIC_RIGHTS_FILE_ALL_ACCESS, +#endif + FILE_ATTRIBUTE_NORMAL, + NTCREATEX_SHARE_ACCESS_NONE, + NTCREATEX_DISP_OPEN_IF, 0, 0); + + if (fnum == -1) { + printf("Failed to create file with char %04x\n", c); + continue; + } + + size = 0; + + if (NT_STATUS_IS_ERR(cli_qfileinfo(cli->tree, fnum, NULL, &size, + NULL, NULL, NULL, NULL, NULL))) continue; + + if (size > 0) { + /* found a character equivalence! */ + int c2[MAX_EQUIVALENCE]; + + if (size/sizeof(int) >= MAX_EQUIVALENCE) { + printf("too many chars match?? size=%d c=0x%04x\n", + size, c); + cli_close(cli->tree, fnum); + return False; + } + + cli_read(cli->tree, fnum, (char *)c2, 0, size); + printf("%04x: ", c); + equiv[c][0] = c; + for (i=0; itree, fnum, 0, (char *)&c, size, sizeof(c)); + cli_close(cli->tree, fnum); + } + + cli_unlink(cli->tree, "\\utable\\*"); + cli_rmdir(cli->tree, "\\utable"); + + return True; +} diff --git a/source4/torture/config.m4 b/source4/torture/config.m4 index f7ad78611c..f2fb4cbac2 100755 --- a/source4/torture/config.m4 +++ b/source4/torture/config.m4 @@ -19,9 +19,14 @@ SMB_SUBSYSTEM(TORTURE_RPC,[], SMB_SUBSYSTEM(TORTURE_NBENCH,[], [torture/nbench/nbio.o torture/nbench/nbench.o]) +SMB_SUBSYSTEM(TORTURE_BASIC,[], + [torture/basic/scanner.o torture/basic/utable.o \ + torture/basic/charset.o torture/basic/mangle_test.o \ + torture/basic/denytest.o \ + torture/basic/aliases.o]) + SMB_SUBSYSTEM(TORTURE,[], - [torture/torture.o torture/torture_util.o torture/scanner.o \ - torture/utable.o torture/denytest.o torture/mangle_test.o \ - torture/aliases.o libcli/raw/clirewrite.o \$(TORTURE_RAW_OBJS) \ - \$(TORTURE_RPC_OBJS) \$(TORTURE_NBENCH_OBJS)], + [torture/torture.o torture/torture_util.o \ + libcli/raw/clirewrite.o \$(TORTURE_RAW_OBJS) \ + \$(TORTURE_RPC_OBJS) \$(TORTURE_NBENCH_OBJS) \$(TORTURE_BASIC_OBJS)], torture/torture_public_proto.h) diff --git a/source4/torture/denytest.c b/source4/torture/denytest.c deleted file mode 100644 index 0e4f5251da..0000000000 --- a/source4/torture/denytest.c +++ /dev/null @@ -1,1578 +0,0 @@ -/* - Unix SMB/CIFS implementation. - SMB torture tester - deny mode scanning functions - Copyright (C) Andrew Tridgell 2001 - - 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 - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - 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. -*/ - -#include "includes.h" - -extern BOOL torture_showall; - -enum deny_result {A_0=0, A_X=1, A_R=2, A_W=3, A_RW=5}; - -static const char *denystr(int denymode) -{ - struct { - int v; - const char *name; - } deny_modes[] = { - {DENY_DOS, "DENY_DOS"}, - {DENY_ALL, "DENY_ALL"}, - {DENY_WRITE, "DENY_WRITE"}, - {DENY_READ, "DENY_READ"}, - {DENY_NONE, "DENY_NONE"}, - {DENY_FCB, "DENY_FCB"}, - {-1, NULL}}; - int i; - for (i=0;deny_modes[i].name;i++) { - if (deny_modes[i].v == denymode) return deny_modes[i].name; - } - return "DENY_XXX"; -} - -static const char *openstr(int mode) -{ - struct { - int v; - const char *name; - } open_modes[] = { - {O_RDWR, "O_RDWR"}, - {O_RDONLY, "O_RDONLY"}, - {O_WRONLY, "O_WRONLY"}, - {-1, NULL}}; - int i; - for (i=0;open_modes[i].name;i++) { - if (open_modes[i].v == mode) return open_modes[i].name; - } - return "O_XXX"; -} - -static const char *resultstr(enum deny_result res) -{ - struct { - enum deny_result res; - const char *name; - } results[] = { - {A_X, "X"}, - {A_0, "-"}, - {A_R, "R"}, - {A_W, "W"}, - {A_RW,"RW"}}; - int i; - for (i=0;ARRAY_SIZE(results);i++) { - if (results[i].res == res) return results[i].name; - } - return "*"; -} - -static struct { - int isexe; - int mode1, deny1; - int mode2, deny2; - enum deny_result result; -} denytable2[] = { -{1, O_RDWR, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, -{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, -{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, -{1, O_RDWR, DENY_DOS, O_RDWR, DENY_ALL, A_0}, -{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_DOS, O_RDWR, DENY_READ, A_0}, -{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_DOS, O_RDWR, DENY_NONE, A_RW}, -{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, -{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_NONE, A_W}, -{1, O_RDWR, DENY_DOS, O_RDWR, DENY_FCB, A_0}, -{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, -{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, -{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, -{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, -{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_RW}, -{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_R}, -{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_W}, -{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_READ, A_0}, -{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_NONE, A_RW}, -{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, -{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_W}, -{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, -{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, -{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, -{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_READ, A_RW}, -{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_READ, A_R}, -{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_READ, A_W}, -{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_NONE, A_RW}, -{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, -{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_W}, -{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, -{1, O_RDWR, DENY_ALL, O_RDWR, DENY_DOS, A_0}, -{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, -{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, -{1, O_RDWR, DENY_ALL, O_RDWR, DENY_ALL, A_0}, -{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_ALL, O_RDWR, DENY_READ, A_0}, -{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_ALL, O_RDWR, DENY_NONE, A_0}, -{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, -{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, -{1, O_RDWR, DENY_ALL, O_RDWR, DENY_FCB, A_0}, -{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, -{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, -{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, -{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, -{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, -{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, -{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, -{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, -{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_READ, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, -{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, -{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, -{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_R}, -{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, -{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, -{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_R}, -{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, -{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, -{1, O_RDWR, DENY_READ, O_RDWR, DENY_DOS, A_0}, -{1, O_RDWR, DENY_READ, O_RDONLY, DENY_DOS, A_0}, -{1, O_RDWR, DENY_READ, O_WRONLY, DENY_DOS, A_W}, -{1, O_RDWR, DENY_READ, O_RDWR, DENY_ALL, A_0}, -{1, O_RDWR, DENY_READ, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_READ, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_READ, O_RDWR, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_READ, O_RDWR, DENY_READ, A_0}, -{1, O_RDWR, DENY_READ, O_RDONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_READ, O_WRONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_READ, O_RDWR, DENY_NONE, A_0}, -{1, O_RDWR, DENY_READ, O_RDONLY, DENY_NONE, A_0}, -{1, O_RDWR, DENY_READ, O_WRONLY, DENY_NONE, A_W}, -{1, O_RDWR, DENY_READ, O_RDWR, DENY_FCB, A_0}, -{1, O_RDWR, DENY_READ, O_RDONLY, DENY_FCB, A_0}, -{1, O_RDWR, DENY_READ, O_WRONLY, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, -{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, -{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_DOS, A_W}, -{1, O_RDONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, -{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, -{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_W}, -{1, O_RDONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, -{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, -{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, -{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, -{1, O_RDONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, -{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, -{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_DOS, A_W}, -{1, O_WRONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, -{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, -{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_READ, A_W}, -{1, O_WRONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, -{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, -{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, -{1, O_WRONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, -{1, O_RDWR, DENY_NONE, O_RDWR, DENY_DOS, A_RW}, -{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, -{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_DOS, A_W}, -{1, O_RDWR, DENY_NONE, O_RDWR, DENY_ALL, A_0}, -{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_NONE, O_RDWR, DENY_READ, A_0}, -{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, -{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, -{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, -{1, O_RDWR, DENY_NONE, O_RDWR, DENY_FCB, A_0}, -{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, -{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_DOS, A_RW}, -{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, -{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_W}, -{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_RW}, -{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_R}, -{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_W}, -{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_READ, A_0}, -{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, -{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, -{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, -{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_DOS, A_RW}, -{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, -{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_W}, -{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_READ, A_RW}, -{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_READ, A_R}, -{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_READ, A_W}, -{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, -{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, -{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, -{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, -{1, O_RDWR, DENY_FCB, O_RDWR, DENY_DOS, A_0}, -{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_DOS, A_0}, -{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_DOS, A_0}, -{1, O_RDWR, DENY_FCB, O_RDWR, DENY_ALL, A_0}, -{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_FCB, O_RDWR, DENY_READ, A_0}, -{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_FCB, O_RDWR, DENY_NONE, A_0}, -{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, -{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, -{1, O_RDWR, DENY_FCB, O_RDWR, DENY_FCB, A_0}, -{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_FCB, A_0}, -{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_DOS, A_0}, -{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_0}, -{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_0}, -{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, -{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, -{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, -{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, -{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, -{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, -{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, -{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_DOS, A_0}, -{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_0}, -{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_0}, -{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, -{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, -{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, -{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, -{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, -{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, -{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_0}, -{0, O_RDWR, DENY_DOS, O_RDWR, DENY_DOS, A_0}, -{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_DOS, A_0}, -{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_DOS, A_0}, -{0, O_RDWR, DENY_DOS, O_RDWR, DENY_ALL, A_0}, -{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_DOS, O_RDWR, DENY_READ, A_0}, -{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_DOS, O_RDWR, DENY_NONE, A_0}, -{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_NONE, A_0}, -{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_NONE, A_0}, -{0, O_RDWR, DENY_DOS, O_RDWR, DENY_FCB, A_0}, -{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, -{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, -{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_R}, -{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_READ, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, -{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_READ, A_0}, -{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0}, -{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0}, -{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, -{0, O_RDWR, DENY_ALL, O_RDWR, DENY_DOS, A_0}, -{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, -{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, -{0, O_RDWR, DENY_ALL, O_RDWR, DENY_ALL, A_0}, -{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_ALL, O_RDWR, DENY_READ, A_0}, -{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_ALL, O_RDWR, DENY_NONE, A_0}, -{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, -{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, -{0, O_RDWR, DENY_ALL, O_RDWR, DENY_FCB, A_0}, -{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, -{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, -{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_DOS, A_0}, -{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_READ, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, -{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, -{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, -{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_R}, -{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, -{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_R}, -{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, -{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, -{0, O_RDWR, DENY_READ, O_RDWR, DENY_DOS, A_0}, -{0, O_RDWR, DENY_READ, O_RDONLY, DENY_DOS, A_0}, -{0, O_RDWR, DENY_READ, O_WRONLY, DENY_DOS, A_0}, -{0, O_RDWR, DENY_READ, O_RDWR, DENY_ALL, A_0}, -{0, O_RDWR, DENY_READ, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_READ, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_READ, O_RDWR, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_READ, O_RDWR, DENY_READ, A_0}, -{0, O_RDWR, DENY_READ, O_RDONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_READ, O_WRONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_READ, O_RDWR, DENY_NONE, A_0}, -{0, O_RDWR, DENY_READ, O_RDONLY, DENY_NONE, A_0}, -{0, O_RDWR, DENY_READ, O_WRONLY, DENY_NONE, A_W}, -{0, O_RDWR, DENY_READ, O_RDWR, DENY_FCB, A_0}, -{0, O_RDWR, DENY_READ, O_RDONLY, DENY_FCB, A_0}, -{0, O_RDWR, DENY_READ, O_WRONLY, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_W}, -{0, O_RDONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, -{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, -{0, O_RDONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, -{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, -{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_READ, A_W}, -{0, O_WRONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, -{0, O_WRONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, -{0, O_RDWR, DENY_NONE, O_RDWR, DENY_DOS, A_0}, -{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_DOS, A_0}, -{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_DOS, A_0}, -{0, O_RDWR, DENY_NONE, O_RDWR, DENY_ALL, A_0}, -{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_NONE, O_RDWR, DENY_READ, A_0}, -{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, -{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, -{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, -{0, O_RDWR, DENY_NONE, O_RDWR, DENY_FCB, A_0}, -{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, -{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, -{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_RW}, -{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_R}, -{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_W}, -{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_READ, A_0}, -{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, -{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, -{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, -{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_READ, A_RW}, -{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_READ, A_R}, -{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_READ, A_W}, -{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, -{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, -{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, -{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, -{0, O_RDWR, DENY_FCB, O_RDWR, DENY_DOS, A_0}, -{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_DOS, A_0}, -{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_DOS, A_0}, -{0, O_RDWR, DENY_FCB, O_RDWR, DENY_ALL, A_0}, -{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_FCB, O_RDWR, DENY_READ, A_0}, -{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_FCB, O_RDWR, DENY_NONE, A_0}, -{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, -{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, -{0, O_RDWR, DENY_FCB, O_RDWR, DENY_FCB, A_0}, -{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_FCB, A_0}, -{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, -{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, -{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, -{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, -{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_0} -}; - - -static struct { - int isexe; - int mode1, deny1; - int mode2, deny2; - enum deny_result result; -} denytable1[] = { -{1, O_RDWR, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, -{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, -{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, -{1, O_RDWR, DENY_DOS, O_RDWR, DENY_ALL, A_0}, -{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_DOS, O_RDWR, DENY_READ, A_0}, -{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_DOS, O_RDWR, DENY_NONE, A_RW}, -{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, -{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_NONE, A_W}, -{1, O_RDWR, DENY_DOS, O_RDWR, DENY_FCB, A_0}, -{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, -{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, -{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, -{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, -{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_RW}, -{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_R}, -{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_W}, -{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_READ, A_0}, -{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_NONE, A_RW}, -{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, -{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_W}, -{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, -{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, -{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, -{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_READ, A_RW}, -{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_READ, A_R}, -{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_READ, A_W}, -{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_NONE, A_RW}, -{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, -{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_W}, -{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, -{1, O_RDWR, DENY_ALL, O_RDWR, DENY_DOS, A_0}, -{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, -{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, -{1, O_RDWR, DENY_ALL, O_RDWR, DENY_ALL, A_0}, -{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_ALL, O_RDWR, DENY_READ, A_0}, -{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_ALL, O_RDWR, DENY_NONE, A_0}, -{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, -{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, -{1, O_RDWR, DENY_ALL, O_RDWR, DENY_FCB, A_0}, -{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, -{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, -{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, -{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, -{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, -{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, -{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, -{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, -{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_READ, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, -{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, -{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, -{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, -{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_R}, -{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, -{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, -{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_R}, -{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, -{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, -{1, O_RDWR, DENY_READ, O_RDWR, DENY_DOS, A_0}, -{1, O_RDWR, DENY_READ, O_RDONLY, DENY_DOS, A_0}, -{1, O_RDWR, DENY_READ, O_WRONLY, DENY_DOS, A_W}, -{1, O_RDWR, DENY_READ, O_RDWR, DENY_ALL, A_0}, -{1, O_RDWR, DENY_READ, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_READ, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_READ, O_RDWR, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_READ, O_RDWR, DENY_READ, A_0}, -{1, O_RDWR, DENY_READ, O_RDONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_READ, O_WRONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_READ, O_RDWR, DENY_NONE, A_0}, -{1, O_RDWR, DENY_READ, O_RDONLY, DENY_NONE, A_0}, -{1, O_RDWR, DENY_READ, O_WRONLY, DENY_NONE, A_W}, -{1, O_RDWR, DENY_READ, O_RDWR, DENY_FCB, A_0}, -{1, O_RDWR, DENY_READ, O_RDONLY, DENY_FCB, A_0}, -{1, O_RDWR, DENY_READ, O_WRONLY, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, -{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, -{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_DOS, A_W}, -{1, O_RDONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, -{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, -{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_W}, -{1, O_RDONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, -{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, -{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, -{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, -{1, O_RDONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, -{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, -{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_DOS, A_W}, -{1, O_WRONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, -{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, -{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_READ, A_W}, -{1, O_WRONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, -{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, -{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, -{1, O_WRONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, -{1, O_RDWR, DENY_NONE, O_RDWR, DENY_DOS, A_RW}, -{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, -{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_DOS, A_W}, -{1, O_RDWR, DENY_NONE, O_RDWR, DENY_ALL, A_0}, -{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_NONE, O_RDWR, DENY_READ, A_0}, -{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, -{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, -{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, -{1, O_RDWR, DENY_NONE, O_RDWR, DENY_FCB, A_0}, -{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, -{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_DOS, A_RW}, -{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, -{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_W}, -{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_RW}, -{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_R}, -{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_W}, -{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_READ, A_0}, -{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, -{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, -{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, -{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, -{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_DOS, A_RW}, -{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, -{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_W}, -{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_READ, A_RW}, -{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_READ, A_R}, -{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_READ, A_W}, -{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, -{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, -{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, -{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, -{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, -{1, O_RDWR, DENY_FCB, O_RDWR, DENY_DOS, A_RW}, -{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_DOS, A_R}, -{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_DOS, A_W}, -{1, O_RDWR, DENY_FCB, O_RDWR, DENY_ALL, A_0}, -{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDWR, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, -{1, O_RDWR, DENY_FCB, O_RDWR, DENY_READ, A_0}, -{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_READ, A_0}, -{1, O_RDWR, DENY_FCB, O_RDWR, DENY_NONE, A_0}, -{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, -{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, -{1, O_RDWR, DENY_FCB, O_RDWR, DENY_FCB, A_RW}, -{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_FCB, A_RW}, -{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_FCB, A_RW}, -{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_DOS, A_RW}, -{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_R}, -{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_W}, -{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, -{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, -{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, -{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, -{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, -{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, -{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, -{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, -{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, -{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_FCB, A_RW}, -{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_RW}, -{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_RW}, -{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_DOS, A_RW}, -{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_R}, -{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_W}, -{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, -{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, -{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, -{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, -{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, -{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, -{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, -{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, -{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_FCB, A_RW}, -{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_RW}, -{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_RW}, -{0, O_RDWR, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, -{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, -{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, -{0, O_RDWR, DENY_DOS, O_RDWR, DENY_ALL, A_0}, -{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_DOS, O_RDWR, DENY_READ, A_0}, -{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_DOS, O_RDWR, DENY_NONE, A_0}, -{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_NONE, A_0}, -{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_NONE, A_0}, -{0, O_RDWR, DENY_DOS, O_RDWR, DENY_FCB, A_RW}, -{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_FCB, A_RW}, -{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_FCB, A_RW}, -{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, -{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_R}, -{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_READ, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, -{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, -{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, -{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, -{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_READ, A_0}, -{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0}, -{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0}, -{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_FCB, A_RW}, -{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_RW}, -{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_RW}, -{0, O_RDWR, DENY_ALL, O_RDWR, DENY_DOS, A_0}, -{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, -{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, -{0, O_RDWR, DENY_ALL, O_RDWR, DENY_ALL, A_0}, -{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_ALL, O_RDWR, DENY_READ, A_0}, -{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_ALL, O_RDWR, DENY_NONE, A_0}, -{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, -{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, -{0, O_RDWR, DENY_ALL, O_RDWR, DENY_FCB, A_0}, -{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, -{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, -{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_DOS, A_0}, -{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_READ, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, -{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, -{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, -{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, -{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_R}, -{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, -{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_R}, -{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, -{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, -{0, O_RDWR, DENY_READ, O_RDWR, DENY_DOS, A_0}, -{0, O_RDWR, DENY_READ, O_RDONLY, DENY_DOS, A_0}, -{0, O_RDWR, DENY_READ, O_WRONLY, DENY_DOS, A_0}, -{0, O_RDWR, DENY_READ, O_RDWR, DENY_ALL, A_0}, -{0, O_RDWR, DENY_READ, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_READ, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_READ, O_RDWR, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_READ, O_RDWR, DENY_READ, A_0}, -{0, O_RDWR, DENY_READ, O_RDONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_READ, O_WRONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_READ, O_RDWR, DENY_NONE, A_0}, -{0, O_RDWR, DENY_READ, O_RDONLY, DENY_NONE, A_0}, -{0, O_RDWR, DENY_READ, O_WRONLY, DENY_NONE, A_W}, -{0, O_RDWR, DENY_READ, O_RDWR, DENY_FCB, A_0}, -{0, O_RDWR, DENY_READ, O_RDONLY, DENY_FCB, A_0}, -{0, O_RDWR, DENY_READ, O_WRONLY, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_W}, -{0, O_RDONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, -{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, -{0, O_RDONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, -{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, -{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_READ, A_W}, -{0, O_WRONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, -{0, O_WRONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, -{0, O_RDWR, DENY_NONE, O_RDWR, DENY_DOS, A_0}, -{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_DOS, A_0}, -{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_DOS, A_0}, -{0, O_RDWR, DENY_NONE, O_RDWR, DENY_ALL, A_0}, -{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_NONE, O_RDWR, DENY_READ, A_0}, -{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, -{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, -{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, -{0, O_RDWR, DENY_NONE, O_RDWR, DENY_FCB, A_0}, -{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, -{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, -{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_0}, -{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_RW}, -{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_R}, -{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_W}, -{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_READ, A_0}, -{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, -{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, -{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, -{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, -{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_0}, -{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_READ, A_RW}, -{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_READ, A_R}, -{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_READ, A_W}, -{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, -{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, -{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, -{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, -{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, -{0, O_RDWR, DENY_FCB, O_RDWR, DENY_DOS, A_RW}, -{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_DOS, A_R}, -{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_DOS, A_W}, -{0, O_RDWR, DENY_FCB, O_RDWR, DENY_ALL, A_0}, -{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDWR, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, -{0, O_RDWR, DENY_FCB, O_RDWR, DENY_READ, A_0}, -{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_READ, A_0}, -{0, O_RDWR, DENY_FCB, O_RDWR, DENY_NONE, A_0}, -{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, -{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, -{0, O_RDWR, DENY_FCB, O_RDWR, DENY_FCB, A_RW}, -{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_FCB, A_RW}, -{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_FCB, A_RW}, -{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_DOS, A_RW}, -{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_R}, -{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_W}, -{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, -{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, -{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, -{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, -{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, -{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_FCB, A_RW}, -{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_RW}, -{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_RW}, -{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_DOS, A_RW}, -{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_R}, -{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_W}, -{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, -{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, -{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, -{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, -{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, -{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, -{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_FCB, A_RW}, -{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_RW}, -{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_RW} -}; - - -static void progress_bar(unsigned i, unsigned total) -{ - if (i % 10 != 0) return; - printf("%5d/%5d\r", i, total); - fflush(stdout); -} - -/* - this produces a matrix of deny mode behaviour for 1 connection - */ -BOOL torture_denytest1(int dummy) -{ - static struct cli_state *cli1; - int fnum1, fnum2; - int i; - BOOL correct = True; - const char *fnames[2] = {"\\denytest1.dat", "\\denytest1.exe"}; - - if (!torture_open_connection(&cli1)) { - return False; - } - - printf("starting denytest1\n"); - - printf("Testing deny modes with 1 connection\n"); - - for (i=0;i<2;i++) { - cli_unlink(cli1->tree, fnames[i]); - fnum1 = cli_open(cli1->tree, fnames[i], O_RDWR|O_CREAT, DENY_NONE); - cli_write(cli1->tree, fnum1, 0, fnames[i], 0, strlen(fnames[i])); - cli_close(cli1->tree, fnum1); - } - - printf("testing %d entries\n", ARRAY_SIZE(denytable1)); - - for (i=0; itree, fname, - denytable1[i].mode1, - denytable1[i].deny1); - fnum2 = cli_open(cli1->tree, fname, - denytable1[i].mode2, - denytable1[i].deny2); - - if (fnum1 == -1) { - res = A_X; - } else if (fnum2 == -1) { - res = A_0; - } else { - char x = 1; - res = A_0; - if (cli_read(cli1->tree, fnum2, (void *)&x, 0, 1) == 1) { - res += A_R; - } - if (cli_write(cli1->tree, fnum2, 0, (void *)&x, 0, 1) == 1) { - res += A_W; - } - } - - if (res != denytable1[i].result) { - correct = False; - } - - if (torture_showall || res != denytable1[i].result) { - printf("%s %8s %10s %8s %10s %s (correct=%s)\n", - fname, - denystr(denytable1[i].deny1), - openstr(denytable1[i].mode1), - denystr(denytable1[i].deny2), - openstr(denytable1[i].mode2), - resultstr(res), - resultstr(denytable1[i].result)); - } - - cli_close(cli1->tree, fnum1); - cli_close(cli1->tree, fnum2); - } - - for (i=0;i<2;i++) { - cli_unlink(cli1->tree, fnames[i]); - } - - if (!torture_close_connection(cli1)) { - correct = False; - } - - printf("finshed denytest1\n"); - return correct; -} - - -/* - this produces a matrix of deny mode behaviour with 2 connections - */ -BOOL torture_denytest2(int dummy) -{ - static struct cli_state *cli1, *cli2; - int fnum1, fnum2; - int i; - BOOL correct = True; - const char *fnames[2] = {"\\denytest2.dat", "\\denytest2.exe"}; - - if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) { - return False; - } - - printf("starting denytest2\n"); - - printf("Testing deny modes with 2 connections\n"); - - for (i=0;i<2;i++) { - cli_unlink(cli1->tree, fnames[i]); - fnum1 = cli_open(cli1->tree, fnames[i], O_RDWR|O_CREAT, DENY_NONE); - cli_write(cli1->tree, fnum1, 0, fnames[i], 0, strlen(fnames[i])); - cli_close(cli1->tree, fnum1); - } - - for (i=0; itree, fname, - denytable2[i].mode1, - denytable2[i].deny1); - fnum2 = cli_open(cli2->tree, fname, - denytable2[i].mode2, - denytable2[i].deny2); - - if (fnum1 == -1) { - res = A_X; - } else if (fnum2 == -1) { - res = A_0; - } else { - char x = 1; - res = A_0; - if (cli_read(cli2->tree, fnum2, (void *)&x, 0, 1) == 1) { - res += A_R; - } - if (cli_write(cli2->tree, fnum2, 0, (void *)&x, 0, 1) == 1) { - res += A_W; - } - } - - if (res != denytable2[i].result) { - correct = False; - } - - if (torture_showall || res != denytable2[i].result) { - printf("%s %8s %10s %8s %10s %s (correct=%s)\n", - fname, - denystr(denytable2[i].deny1), - openstr(denytable2[i].mode1), - denystr(denytable2[i].deny2), - openstr(denytable2[i].mode2), - resultstr(res), - resultstr(denytable2[i].result)); - } - - cli_close(cli1->tree, fnum1); - cli_close(cli2->tree, fnum2); - } - - for (i=0;i<2;i++) { - cli_unlink(cli1->tree, fnames[i]); - } - - if (!torture_close_connection(cli1)) { - correct = False; - } - if (!torture_close_connection(cli2)) { - correct = False; - } - - printf("finshed denytest2\n"); - return correct; -} - diff --git a/source4/torture/dfstest.c b/source4/torture/dfstest.c deleted file mode 100644 index 79d49aded3..0000000000 --- a/source4/torture/dfstest.c +++ /dev/null @@ -1,459 +0,0 @@ -/* - Unix SMB/CIFS implementation. - SMB torture tester - DFS tests - Copyright (C) James J Myers 2003 - - 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 - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - 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. -*/ - -#include "includes.h" - -#define DFS_SERVER_COUNT 6 -#define DFS_FILE_COUNT 8 -extern char *host, *share, *password, *username; -static struct cli_client context; -static const char *sockops="TCP_NODELAY"; - -/* - checks for correct DFS cluster support - */ -BOOL torture_dfs_basic(int dummy) -{ - int current_server = 0; - char *fname[DFS_FILE_COUNT]; - int file_server[DFS_FILE_COUNT]; - int fnum[DFS_FILE_COUNT]; - int i; - const char *template = "\\\\%s\\%s\\dfstest%d.tmp"; - char *filedata; - int server_count = 0; - int connection_flags = CLI_FULL_CONNECTION_USE_KERBEROS - | CLI_FULL_CONNECTION_USE_DFS - ; - - printf("starting dfs_basic_test\n"); - cli_client_initialize(&context, sockops, username, password, lp_workgroup(), connection_flags); - - if ((current_server = cli_dfs_open_connection(&context, host, share, connection_flags) < 0)) - return False; - - for (i=0; i < DFS_FILE_COUNT ; i++) { - file_server[i] = 0; - DEBUG(4,("host=%s share=%s cli host=%s cli share=%s\n", - host, share, cli_state_get_host(context.cli[file_server[i]]), - cli_state_get_share(context.cli[file_server[i]]))); - host = cli_state_get_host(context.cli[file_server[i]]); - share = cli_state_get_share(context.cli[file_server[i]]); - asprintf(&fname[i], template, host, share, i); - DEBUG(3,("unlinking %s\n", fname[i])); - cli_nt_unlink(&context, &file_server[i], fname[i], 0); - } - - for (i=0; i < DFS_FILE_COUNT ; i++) { - host = cli_state_get_host(context.cli[file_server[i]]); - share = cli_state_get_share(context.cli[file_server[i]]); - asprintf(&fname[i], template, host, share, i); - DEBUG(3,("open %s on server %s(%d)\n", - fname[i], host, file_server[i])); - fnum[i] = cli_dfs_open(&context, &file_server[i], fname[i], O_RDWR|O_CREAT|O_EXCL, DENY_NONE); - if (fnum[i] == -1) - { - printf("open of %s failed (%s)\n", fname[i], cli_errstr(context.cli[file_server[i]])); - return False; - } - asprintf(&filedata, "%s %d", fname[i], fnum[i]); - DEBUG(3,("write %d bytes (%s) to %s (fid %d) on server %s(%d)\n", - strlen(filedata), filedata, fname[i], fnum[i], - host, file_server[i])); - if (cli_write(context.cli[file_server[i]], fnum[i], 0, filedata, 0, strlen(filedata)) != strlen(filedata)) - { - printf("write failed (%s)\n", cli_errstr(context.cli[file_server[i]])); - return False; - } - - if (!cli_close(context.cli[file_server[i]], fnum[i])) { - printf("close of %s failed (%s)\n", fname[i], cli_errstr(context.cli[file_server[i]])); - return False; - } - } - DEBUG(3,("used Dfs servers:")); - for (i=0; i < DFS_SERVER_COUNT ; i++) { - server_count++; - DEBUG(3,(" %s(%d)", cli_state_get_host(context.cli[file_server[i]]), i)); - if (!torture_close_connection(context.cli[i])) - return False; - } - DEBUG(3,("\n")); - - printf("Passed dfstest, found and used %d Dfs servers\n", server_count); - return True; -} - -/* - Check for correct DFS rename support. - First test is simple rename, a la command line, explorer. - Second test is simulation of MS Word edit/save file. - */ -BOOL torture_dfs_rename(int dummy) -{ - int current_server = -1; - char *fname[DFS_FILE_COUNT]; - int file_server[DFS_FILE_COUNT]; - int fnum[DFS_FILE_COUNT]; - int i; - const char *template = "\\\\%s\\%s\\dfstest%d.tmp"; - const char *template2orig = "\\\\%s\\%s\\dfstestorig.txt"; - const char *template2old = "\\\\%s\\%s\\~dfstestold.txt"; - const char *template2new = "\\\\%s\\%s\\~dfstestnew.txt"; - char *filedata, *newdata; - int server_count = 0; - int connection_flags = CLI_FULL_CONNECTION_USE_KERBEROS - | CLI_FULL_CONNECTION_USE_DFS - ; - - printf("starting dfs_rename_test\n"); - cli_client_initialize(&context, sockops, username, password, - lp_workgroup(), connection_flags); - - if ((current_server = cli_dfs_open_connection(&context, host, share, connection_flags)) < 0) - return False; - - for (i=0; i < DFS_FILE_COUNT ; i++) { - file_server[i] = 0; - slprintf(fname[i],sizeof(fstring)-1,template, host, share, i); - DEBUG(3,("unlinking %s\n", fname[i])); - cli_nt_unlink(&context, &file_server[i], fname[i], 0); - } - /* Simple rename test */ - for (i=0; i < 1 ; i++) { - slprintf(fname[i],sizeof(fstring)-1,template, - cli_state_get_host(context.cli[file_server[i]]), - cli_state_get_share(context.cli[file_server[i]]), i); - DEBUG(3,("open %s on server %s(%d)\n", - fname[i], cli_state_get_host(context.cli[file_server[i]]), file_server[i])); - - fnum[i] = cli_dfs_open(&context, &file_server[i], fname[i], O_RDWR|O_CREAT|O_EXCL, DENY_NONE); - if (fnum[i] == -1) { - printf("open of %s failed (%s)\n", fname[i], cli_errstr(context.cli[file_server[i]])); - return False; - } - asprintf(&filedata, "%s %d", fname[i], (int)getpid()); - DEBUG(3,("write %d bytes (%s) to %s (fid %d) on server %s(%d)\n", - strlen(filedata), filedata, fname[i], fnum[i], - cli_state_get_host(context.cli[file_server[i]]), file_server[i])); - if (cli_write(context.cli[file_server[i]], fnum[i], 0, filedata, 0, strlen(filedata)) != strlen(filedata)) - { - printf("write failed (%s)\n", cli_errstr(context.cli[file_server[i]])); - return False; - } - - if (!cli_close(context.cli[file_server[i]], fnum[i])) { - printf("close of %s failed (%s)\n", fname[i], cli_errstr(context.cli[file_server[i]])); - return False; - } - } - // now attempt to rename the file - DEBUG(3,("rename %s to %s on server %s(%d)\n", - fname[0], fname[1], cli_state_get_host(context.cli[file_server[i]]), file_server[0])); - if (!cli_dfs_rename(&context, &file_server[0], fname[0], fname[1])) { - printf("rename of %s to %s failed (%s)\n", fname[0], fname[1], cli_errstr(context.cli[file_server[0]])); - return False; - } - // clean up - DEBUG(3,("used Dfs servers:")); - for (i=0; i < DFS_SERVER_COUNT ; i++) { - server_count++; - DEBUG(3,(" %s(%d)", cli_state_get_host(context.cli[file_server[i]]), i)); - if (!torture_close_connection(context.cli[i])) - return False; - } - DEBUG(3,("\n")); - printf("Dfstest: passed simple rename test\n"); - - /* Now try more complicated test, a la MS Word. - * Open existing file (x) and read file and close. - * Then open, write to new temp name file (~x.new), close. - * Then rename old file name to old temp name file (~x.old). - * Then rename new temp name file to oroginal name (x). */ - cli_client_initialize(&context, sockops, username, password, - lp_workgroup(), connection_flags); - - if ((current_server = cli_dfs_open_connection(&context, host, share, connection_flags)) < 0) - return False; - slprintf(fname[0],sizeof(fname[0])-1,template2orig, host, share); - slprintf(fname[1],sizeof(fname[1])-1,template2old, host, share); - slprintf(fname[2],sizeof(fname[2])-1,template2new, host, share); - for (i=0; i < DFS_FILE_COUNT ; i++) { - file_server[i] = 0; - fnum[i] = 0; - DEBUG(3,("unlinking %s\n", fname[i])); - cli_nt_unlink(&context, &file_server[i], fname[i], 0); - } - asprintf(&fname[0],template2orig, - cli_state_get_host(context.cli[0]), - cli_state_get_share(context.cli[0]), 0); - asprintf(&fname[1],template2old, - cli_state_get_host(context.cli[1]), - cli_state_get_share(context.cli[1]), 1); - asprintf(&fname[2],template2new, - cli_state_get_host(context.cli[2]), - cli_state_get_share(context.cli[2]), 2); - DEBUG(3,("edit(MS Word) %s on server %s(%d)\n", - fname[0], cli_state_get_host(context.cli[0]), file_server[0])); - DEBUG(3,("open %s on server %s(%d)\n", - fname[0], cli_state_get_host(context.cli[0]), file_server[0])); - - fnum[0] = cli_dfs_open(&context, &file_server[0], fname[0], O_RDWR|O_CREAT|O_EXCL, DENY_NONE); - if (fnum[0] == -1) - { - printf("open of %s failed (%s)\n", fname[0], cli_errstr(context.cli[file_server[0]])); - return False; - } - slprintf(filedata, sizeof(fstring)-1, "%s %d", fname[0], (int)getpid()); - DEBUG(3,("write %d bytes (%s) to %s (fid %d) on server %s(%d)\n", - strlen(filedata), filedata, fname[0], fnum[0], - cli_state_get_host(context.cli[0]), file_server[0])); - if (cli_write(context.cli[file_server[0]], fnum[0], 0, filedata, 0, strlen(filedata)) != strlen(filedata)) - { - printf("write failed (%s)\n", cli_errstr(context.cli[file_server[0]])); - return False; - } - // read data from original file - DEBUG(3,("read %s (fid %d) on server %s(%d)\n", - fname[0], fnum[0], cli_state_get_host(context.cli[0]), file_server[0])); - if (cli_read(context.cli[file_server[0]], fnum[0], filedata, 0, strlen(filedata)) != strlen(filedata)) - { - printf("read failed (%s)", cli_errstr(context.cli[file_server[0]])); - return False; - } - DEBUG(3,("close %s on server %s(%d)\n", - fname[0], cli_state_get_host(context.cli[0]), file_server[0])); - if (!cli_close(context.cli[file_server[0]], fnum[0])) { - printf("close of %s failed (%s)\n", fname[0], cli_errstr(context.cli[file_server[0]])); - return False; - } - // open new temp file, write data - DEBUG(3,("open %s on server %s(%d)\n", - fname[2], cli_state_get_host(context.cli[2]), file_server[2])); - fnum[2] = cli_dfs_open(&context, &file_server[2], fname[2], O_RDWR|O_CREAT|O_EXCL, DENY_NONE); - if (fnum[2] == -1) - { - printf("open of %s failed (%s)\n", fname[2], cli_errstr(context.cli[file_server[2]])); - return False; - } - DEBUG(3,("write %d bytes (%s) to %s (fid %d) on server %s(%d)\n", - strlen(filedata), filedata, fname[2], fnum[2], - cli_state_get_host(context.cli[2]), file_server[2])); - if (cli_write(context.cli[file_server[2]], fnum[2], 0, filedata, 0, strlen(filedata)) != strlen(filedata)) - { - printf("write failed (%s)\n", cli_errstr(context.cli[file_server[2]])); - return False; - } - slprintf(newdata, sizeof(fstring)-1, "new data: %s %d", fname[0], (int)getpid()); - DEBUG(3,("write new data %d bytes (%s) to %s (fid %d) on server %s(%d)\n", - strlen(newdata), newdata, fname[2], fnum[2], - cli_state_get_host(context.cli[2]), file_server[2])); - if (cli_write(context.cli[file_server[2]], fnum[2], 0, newdata, strlen(filedata), strlen(newdata)) != strlen(newdata)) - { - printf("write failed (%s)\n", cli_errstr(context.cli[file_server[2]])); - return False; - } - DEBUG(3,("close %s on server %s(%d)\n", - fname[2], cli_state_get_host(context.cli[2]), file_server[2])); - if (!cli_close(context.cli[file_server[2]], fnum[2])) { - printf("close of %s failed (%s)\n", fname[2], cli_errstr(context.cli[file_server[2]])); - return False; - } - DEBUG(3,("close successful %s on server %s(%d)\n", - fname[2], cli_state_get_host(context.cli[2]), file_server[2])); - // rename original file to temp - DEBUG(4,("file_server[0]=%d\n", file_server[0])); - DEBUG(4,("context.cli[file_server[0]].desthost=%s\n", cli_state_get_host(context.cli[0]))); - DEBUG(3,("rename %s to %s on server %s(%d)\n", - fname[0], fname[1], cli_state_get_host(context.cli[0]), file_server[0])); - if (!cli_dfs_rename(&context, &file_server[0], fname[0], fname[1])) { - printf("rename of %s to %s failed (%s)\n", fname[0], fname[1], cli_errstr(context.cli[file_server[0]])); - return False; - } - // name new temp file to original - DEBUG(3,("rename %s to %s on server %s(%d)\n", - fname[2], fname[0], cli_state_get_host(context.cli[2]), file_server[2])); - if (!cli_dfs_rename(&context, &file_server[2], fname[2], fname[0])) { - printf("rename of %s to %s failed (%s)\n", fname[2], fname[0], cli_errstr(context.cli[file_server[2]])); - return False; - } - printf("Dfstest: passed MS Word rename test\n"); - // clean up - DEBUG(3,("used Dfs servers:")); - for (i=0; i < DFS_SERVER_COUNT ; i++) { - server_count++; - DEBUG(3,(" %s(%d)", cli_state_get_host(context.cli[i]), i)); - if (!torture_close_connection(context.cli[i])) - return False; - } - DEBUG(3,("\n")); - - printf("Passed dfs_rename_test\n"); - return True; -} -struct list_fn_parms { - struct cli_client *context; - char* rname; -} list_fn_parms; - -void dfs_list_fn(file_info *finfo, const char *rname, void* parmsp); -void delete_file(file_info *finfo, const char *rname) -{ - int server = 0; - char *fname; - - DEBUG(3,("deleting file %s in %s\n", finfo->name, rname)); - asprintf(&fname, "%s\\%s", rname, finfo->name); - cli_nt_unlink(&context, &server, fname, 0); -} -void delete_directory(file_info *finfo, const char *rname) -{ - int server = 0; - char *dname, *rname2; - - DEBUG(3,("deleting directory %s in %s\n", finfo->name, rname)); - asprintf(&dname, "%s%s\\*", rname, finfo->name); - cli_nt_unlink(&context, &server, dname, 0); - asprintf(&dname, "%s%s\\*", rname, finfo->name); - asprintf(&rname2, "%s%s", rname, finfo->name); - cli_search(context.cli[0], dname, FILE_ATTRIBUTE_DIRECTORY, - dfs_list_fn, (void*)rname2); - cli_dfs_rmdir(&context, &server, rname2); -} - -void dfs_list_fn(file_info *finfo, const char *name, void* parmsp) -{ - struct list_fn_parms *parms = (struct list_fn_parms*)parmsp; - - DEBUG(4,("processing %s in %s\n", finfo->name, parms->rname)); - if (finfo->mode & FILE_ATTRIBUTE_DIRECTORY) { - delete_directory(finfo, parms->rname); - } - else { - delete_file(finfo, parms->rname); - } -} - -/* - checks for correct DFS cluster support creating random dirs/files. - */ -#define DFS_RANDOM_FILE_COUNT 10 -#define DFS_RANDOM_DIR_COUNT 3 -#define DFS_RANDOM_DIR_LEVELS 2 -BOOL torture_dfs_random(int dummy) -{ - char *fname[DFS_RANDOM_FILE_COUNT]; - int file_server[DFS_RANDOM_FILE_COUNT]; - char *dname[DFS_RANDOM_DIR_COUNT]; - int dir_server[DFS_RANDOM_DIR_COUNT]; - char *rname; - int fnum[DFS_FILE_COUNT]; - int i; - const char *ftemplate = "%s\\dfsfile%d.tmp"; - const char *alltemplate = "\\\\%s\\%s\\dfs*.tmp"; - char *filedata; - int server_count = 0; - int file_count; - int connection_flags = CLI_FULL_CONNECTION_USE_KERBEROS - | CLI_FULL_CONNECTION_USE_DFS - ; - - printf("starting dfs_random_test\n"); - cli_client_initialize(&context, sockops, username, password, - lp_workgroup(), connection_flags); - - if ((dir_server[0] = cli_dfs_open_connection(&context, host, share, connection_flags)) < 0) - return False; - - // get list of directories named dfsdir*. - // delete all files in these directories using wild card, - // then delete directory. - asprintf(&rname, "\\\\%s\\%s\\", - cli_state_get_host(context.cli[0]), - cli_state_get_share(context.cli[0])); - asprintf(&fname[0], alltemplate, - cli_state_get_host(context.cli[0]), - cli_state_get_share(context.cli[0])); - DEBUG(3,("deleting files %s in %s on server %s(%d)\n", - fname[0], rname, cli_state_get_host(context.cli[0]), dir_server[0])); - file_count = cli_search(context.cli[0], fname[0], FILE_ATTRIBUTE_DIRECTORY, dfs_list_fn, (void*)rname); - - // create random directory names with 0-n levels - asprintf(&dname[0], "\\\\%s\\%s\\", - cli_state_get_host(context.cli[0]), - cli_state_get_share(context.cli[0])); - DEBUG(3,("creating directories in %s on server %s(%d)\n", - rname, cli_state_get_host(context.cli[0]), dir_server[0])); - for (i=1; i < DFS_RANDOM_DIR_COUNT; i++) { - dir_server[i] = 0; - asprintf(&dname[i], - "\\\\%s\\%s\\dfsdir%d.tmp", - cli_state_get_host(context.cli[dir_server[i]]), - cli_state_get_share(context.cli[dir_server[i]]), - (int)sys_random()%10000); - DEBUG(3,("mkdir %s on server %s(%d)\n", - dname[i], cli_state_get_host(context.cli[dir_server[i]]), dir_server[i])); - if (!cli_dfs_mkdir(&context, &dir_server[i], dname[i])) { - printf("mkdir of %s failed (%s)\n", dname[i], cli_errstr(context.cli[dir_server[i]])); - return False; - } - } - - for (i=0; i < DFS_RANDOM_FILE_COUNT ; i++) { - // select a directory randomly, create a file in it. - int dn = (int)sys_random()%DFS_RANDOM_DIR_COUNT; - file_server[i] = dir_server[dn]; - asprintf(&fname[i], ftemplate, dname[dn], i); - DEBUG(3,("open %s on server %s(%d)\n", - fname[i], cli_state_get_host(context.cli[dir_server[i]]), file_server[i])); - fnum[i] = cli_dfs_open(&context, &file_server[i], fname[i], O_RDWR|O_CREAT|O_EXCL, DENY_NONE); - if (fnum[i] == -1) - { - printf("open of %s failed (%s)\n", fname[i], cli_errstr(context.cli[file_server[i]])); - return False; - } - - asprintf(&filedata, "%s %d", fname[i], fnum[i]); - DEBUG(3,("write %d bytes (%s) to %s (fid %d) on server %s(%d)\n", - strlen(filedata), filedata, fname[i], fnum[i], - cli_state_get_host(context.cli[dir_server[i]]), file_server[i])); - if (cli_write(context.cli[file_server[i]], fnum[i], 0, filedata, 0, strlen(filedata)) != strlen(filedata)) - { - printf("write failed (%s)\n", cli_errstr(context.cli[file_server[i]])); - return False; - } - - if (!cli_close(context.cli[file_server[i]], fnum[i])) { - printf("close of %s failed (%s)\n", fname[i], cli_errstr(context.cli[file_server[i]])); - return False; - } - } - DEBUG(3,("used Dfs servers:")); - for (i=0; i < DFS_SERVER_COUNT ; i++) { - server_count++; - DEBUG(3,(" %s(%d)", cli_state_get_host(context.cli[i]), i)); - if (!torture_close_connection(context.cli[i])) - return False; - } - DEBUG(3,("\n")); - - printf("Passed dfs_random_test\n"); - return True; -} diff --git a/source4/torture/mangle_test.c b/source4/torture/mangle_test.c deleted file mode 100644 index 94dac45b9d..0000000000 --- a/source4/torture/mangle_test.c +++ /dev/null @@ -1,205 +0,0 @@ -/* - Unix SMB/CIFS implementation. - SMB torture tester - mangling test - Copyright (C) Andrew Tridgell 2002 - - 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 - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - 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. -*/ - -#include "includes.h" - -static TDB_CONTEXT *tdb; - -#define NAME_LENGTH 20 - -static unsigned total, collisions, failures; - -static BOOL test_one(struct cli_state *cli, const char *name) -{ - int fnum; - const char *shortname; - fstring name2; - NTSTATUS status; - TDB_DATA data; - - total++; - - fnum = cli_open(cli->tree, name, O_RDWR|O_CREAT|O_EXCL, DENY_NONE); - if (fnum == -1) { - printf("open of %s failed (%s)\n", name, cli_errstr(cli->tree)); - return False; - } - - if (NT_STATUS_IS_ERR(cli_close(cli->tree, fnum))) { - printf("close of %s failed (%s)\n", name, cli_errstr(cli->tree)); - return False; - } - - /* get the short name */ - status = cli_qpathinfo_alt_name(cli->tree, name, &shortname); - if (!NT_STATUS_IS_OK(status)) { - printf("query altname of %s failed (%s)\n", name, cli_errstr(cli->tree)); - return False; - } - - snprintf(name2, sizeof(name2), "\\mangle_test\\%s", shortname); - if (NT_STATUS_IS_ERR(cli_unlink(cli->tree, name2))) { - printf("unlink of %s (%s) failed (%s)\n", - name2, name, cli_errstr(cli->tree)); - return False; - } - - /* recreate by short name */ - fnum = cli_open(cli->tree, name2, O_RDWR|O_CREAT|O_EXCL, DENY_NONE); - if (fnum == -1) { - printf("open2 of %s failed (%s)\n", name2, cli_errstr(cli->tree)); - return False; - } - if (NT_STATUS_IS_ERR(cli_close(cli->tree, fnum))) { - printf("close of %s failed (%s)\n", name, cli_errstr(cli->tree)); - return False; - } - - /* and unlink by long name */ - if (NT_STATUS_IS_ERR(cli_unlink(cli->tree, name))) { - printf("unlink2 of %s (%s) failed (%s)\n", - name, name2, cli_errstr(cli->tree)); - failures++; - cli_unlink(cli->tree, name2); - return True; - } - - /* see if the short name is already in the tdb */ - data = tdb_fetch_bystring(tdb, shortname); - if (data.dptr) { - /* maybe its a duplicate long name? */ - if (strcasecmp(name, data.dptr) != 0) { - /* we have a collision */ - collisions++; - printf("Collision between %s and %s -> %s " - " (coll/tot: %u/%u)\n", - name, data.dptr, shortname, collisions, total); - } - free(data.dptr); - } else { - TDB_DATA namedata; - /* store it for later */ - namedata.dptr = name; - namedata.dsize = strlen(name)+1; - tdb_store_bystring(tdb, shortname, namedata, TDB_REPLACE); - } - - return True; -} - - -static void gen_name(char *name) -{ - const char *chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz._-$~..."; - unsigned max_idx = strlen(chars); - unsigned len; - int i; - char *p; - - fstrcpy(name, "\\mangle_test\\"); - p = name + strlen(name); - - len = 1 + random() % NAME_LENGTH; - - for (i=0;itree, "\\mangle_test\\*"); - cli_rmdir(cli->tree, "\\mangle_test"); - - if (NT_STATUS_IS_ERR(cli_mkdir(cli->tree, "\\mangle_test"))) { - printf("ERROR: Failed to make directory\n"); - return False; - } - - for (i=0;itree, "\\mangle_test\\*"); - if (NT_STATUS_IS_ERR(cli_rmdir(cli->tree, "\\mangle_test"))) { - printf("ERROR: Failed to remove directory\n"); - return False; - } - - printf("\nTotal collisions %u/%u - %.2f%% (%u failures)\n", - collisions, total, (100.0*collisions) / total, failures); - - torture_close_connection(cli); - - printf("mangle test finished\n"); - return (failures == 0); -} diff --git a/source4/torture/nbench/nbio.c b/source4/torture/nbench/nbio.c index 608e87e681..99393df7df 100644 --- a/source4/torture/nbench/nbio.c +++ b/source4/torture/nbench/nbio.c @@ -227,7 +227,7 @@ void nb_createx(const char *fname, SA_RIGHT_FILE_WRITE_DATA | SA_RIGHT_FILE_READ_ATTRIBUTES | SA_RIGHT_FILE_WRITE_ATTRIBUTES; - flags = NTCREATEX_FLAGS_EXTENDED \ + flags = NTCREATEX_FLAGS_EXTENDED | NTCREATEX_FLAGS_REQUEST_OPLOCK | NTCREATEX_FLAGS_REQUEST_BATCH_OPLOCK; } diff --git a/source4/torture/scanner.c b/source4/torture/scanner.c deleted file mode 100644 index 7368528200..0000000000 --- a/source4/torture/scanner.c +++ /dev/null @@ -1,563 +0,0 @@ -/* - Unix SMB/CIFS implementation. - SMB torture tester - scanning functions - Copyright (C) Andrew Tridgell 2001 - - 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 - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - 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. -*/ - -#include "includes.h" - -#define VERBOSE 0 -#define OP_MIN 0 -#define OP_MAX 100 - -/**************************************************************************** -look for a partial hit -****************************************************************************/ -static void trans2_check_hit(const char *format, int op, int level, NTSTATUS status) -{ - if (NT_STATUS_V(status) == NT_STATUS_V(NT_STATUS_INVALID_LEVEL) || - NT_STATUS_V(status) == NT_STATUS_V(NT_STATUS_NOT_IMPLEMENTED) || - NT_STATUS_V(status) == NT_STATUS_V(NT_STATUS_NOT_SUPPORTED) || - NT_STATUS_V(status) == NT_STATUS_V(NT_STATUS_UNSUCCESSFUL) || - NT_STATUS_V(status) == NT_STATUS_V(NT_STATUS_INVALID_INFO_CLASS)) { - return; - } -#if VERBOSE - printf("possible %s hit op=%3d level=%5d status=%s\n", - format, op, level, nt_errstr(status)); -#endif -} - -/**************************************************************************** -check for existance of a trans2 call -****************************************************************************/ -static NTSTATUS try_trans2(struct cli_state *cli, - int op, - char *param, char *data, - int param_len, int data_len, - int *rparam_len, int *rdata_len) -{ - NTSTATUS status; - struct smb_trans2 t2; - uint16 setup = op; - TALLOC_CTX *mem_ctx; - - mem_ctx = talloc_init("try_trans2"); - - t2.in.max_param = 1024; - t2.in.max_data = 0x8000; - t2.in.max_setup = 10; - t2.in.flags = 0; - t2.in.timeout = 0; - t2.in.setup_count = 1; - t2.in.setup = &setup; - t2.in.params.data = param; - t2.in.params.length = param_len; - t2.in.data.data = data; - t2.in.data.length = data_len; - - status = smb_raw_trans2(cli->tree, mem_ctx, &t2); - - *rparam_len = t2.out.params.length; - *rdata_len = t2.out.data.length; - - talloc_destroy(mem_ctx); - - return status; -} - - -static NTSTATUS try_trans2_len(struct cli_state *cli, - const char *format, - int op, int level, - char *param, char *data, - int param_len, int *data_len, - int *rparam_len, int *rdata_len) -{ - NTSTATUS ret=NT_STATUS_OK; - - ret = try_trans2(cli, op, param, data, param_len, - sizeof(pstring), rparam_len, rdata_len); -#if VERBOSE - printf("op=%d level=%d ret=%s\n", op, level, nt_errstr(ret)); -#endif - if (!NT_STATUS_IS_OK(ret)) return ret; - - *data_len = 0; - while (*data_len < sizeof(pstring)) { - ret = try_trans2(cli, op, param, data, param_len, - *data_len, rparam_len, rdata_len); - if (NT_STATUS_IS_OK(ret)) break; - *data_len += 2; - } - if (NT_STATUS_IS_OK(ret)) { - printf("found %s level=%d data_len=%d rparam_len=%d rdata_len=%d\n", - format, level, *data_len, *rparam_len, *rdata_len); - } else { - trans2_check_hit(format, op, level, ret); - } - return ret; -} - - -/**************************************************************************** -check whether a trans2 opnum exists at all -****************************************************************************/ -static BOOL trans2_op_exists(struct cli_state *cli, int op) -{ - int data_len = 0; - int param_len = 0; - int rparam_len, rdata_len; - pstring param, data; - NTSTATUS status1, status2; - - memset(data, 0, sizeof(data)); - data_len = 4; - - /* try with a info level only */ - param_len = sizeof(param); - data_len = sizeof(data); - - memset(param, 0xFF, sizeof(param)); - memset(data, 0xFF, sizeof(data)); - - status1 = try_trans2(cli, 0xFFFF, param, data, param_len, data_len, - &rparam_len, &rdata_len); - - status2 = try_trans2(cli, op, param, data, param_len, data_len, - &rparam_len, &rdata_len); - - if (NT_STATUS_EQUAL(status1, status2)) return False; - - printf("Found op %d (status=%s)\n", op, nt_errstr(status2)); - - return True; -} - -/**************************************************************************** -check for existance of a trans2 call -****************************************************************************/ -static BOOL scan_trans2(struct cli_state *cli, int op, int level, - int fnum, int dnum, int qfnum, const char *fname) -{ - int data_len = 0; - int param_len = 0; - int rparam_len, rdata_len; - pstring param, data; - NTSTATUS status; - - memset(data, 0, sizeof(data)); - data_len = 4; - - /* try with a info level only */ - param_len = 2; - SSVAL(param, 0, level); - status = try_trans2_len(cli, "void", op, level, param, data, param_len, &data_len, - &rparam_len, &rdata_len); - if (NT_STATUS_IS_OK(status)) return True; - - /* try with a file descriptor */ - param_len = 6; - SSVAL(param, 0, fnum); - SSVAL(param, 2, level); - SSVAL(param, 4, 0); - status = try_trans2_len(cli, "fnum", op, level, param, data, param_len, &data_len, - &rparam_len, &rdata_len); - if (NT_STATUS_IS_OK(status)) return True; - - /* try with a quota file descriptor */ - param_len = 6; - SSVAL(param, 0, qfnum); - SSVAL(param, 2, level); - SSVAL(param, 4, 0); - status = try_trans2_len(cli, "qfnum", op, level, param, data, param_len, &data_len, - &rparam_len, &rdata_len); - if (NT_STATUS_IS_OK(status)) return True; - - /* try with a notify style */ - param_len = 6; - SSVAL(param, 0, dnum); - SSVAL(param, 2, dnum); - SSVAL(param, 4, level); - status = try_trans2_len(cli, "notify", op, level, param, data, param_len, &data_len, - &rparam_len, &rdata_len); - if (NT_STATUS_IS_OK(status)) return True; - - /* try with a file name */ - param_len = 6; - SSVAL(param, 0, level); - SSVAL(param, 2, 0); - SSVAL(param, 4, 0); - param_len += push_string(NULL, ¶m[6], fname, sizeof(pstring)-7, STR_TERMINATE|STR_UNICODE); - - status = try_trans2_len(cli, "fname", op, level, param, data, param_len, &data_len, - &rparam_len, &rdata_len); - if (NT_STATUS_IS_OK(status)) return True; - - /* try with a new file name */ - param_len = 6; - SSVAL(param, 0, level); - SSVAL(param, 2, 0); - SSVAL(param, 4, 0); - param_len += push_string(NULL, ¶m[6], "\\newfile.dat", sizeof(pstring)-7, STR_TERMINATE|STR_UNICODE); - - status = try_trans2_len(cli, "newfile", op, level, param, data, param_len, &data_len, - &rparam_len, &rdata_len); - cli_unlink(cli->tree, "\\newfile.dat"); - cli_rmdir(cli->tree, "\\newfile.dat"); - if (NT_STATUS_IS_OK(status)) return True; - - /* try dfs style */ - cli_mkdir(cli->tree, "\\testdir"); - param_len = 2; - SSVAL(param, 0, level); - param_len += push_string(NULL, ¶m[2], "\\testdir", sizeof(pstring)-3, STR_TERMINATE|STR_UNICODE); - - status = try_trans2_len(cli, "dfs", op, level, param, data, param_len, &data_len, - &rparam_len, &rdata_len); - cli_rmdir(cli->tree, "\\testdir"); - if (NT_STATUS_IS_OK(status)) return True; - - return False; -} - - -BOOL torture_trans2_scan(int dummy) -{ - static struct cli_state *cli; - int op, level; - const char *fname = "\\scanner.dat"; - int fnum, dnum, qfnum; - - printf("starting trans2 scan test\n"); - - if (!torture_open_connection(&cli)) { - return False; - } - - fnum = cli_open(cli->tree, fname, O_RDWR | O_CREAT | O_TRUNC, DENY_NONE); - if (fnum == -1) { - printf("file open failed - %s\n", cli_errstr(cli->tree)); - } - dnum = cli_nt_create_full(cli->tree, "\\", - 0, GENERIC_RIGHTS_FILE_READ, FILE_ATTRIBUTE_NORMAL, - NTCREATEX_SHARE_ACCESS_READ | NTCREATEX_SHARE_ACCESS_WRITE, - NTCREATEX_DISP_OPEN, - NTCREATEX_OPTIONS_DIRECTORY, 0); - if (dnum == -1) { - printf("directory open failed - %s\n", cli_errstr(cli->tree)); - } - qfnum = cli_nt_create_full(cli->tree, "\\$Extend\\$Quota:$Q:$INDEX_ALLOCATION", - NTCREATEX_FLAGS_EXTENDED, - SEC_RIGHTS_MAXIMUM_ALLOWED, - 0, - NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_WRITE, - NTCREATEX_DISP_OPEN, - 0, 0); - if (qfnum == -1) { - printf("quota open failed - %s\n", cli_errstr(cli->tree)); - } - - for (op=OP_MIN; op<=OP_MAX; op++) { - - if (!trans2_op_exists(cli, op)) { - continue; - } - - for (level = 0; level <= 50; level++) { - scan_trans2(cli, op, level, fnum, dnum, qfnum, fname); - } - - for (level = 0x100; level <= 0x130; level++) { - scan_trans2(cli, op, level, fnum, dnum, qfnum, fname); - } - - for (level = 1000; level < 1050; level++) { - scan_trans2(cli, op, level, fnum, dnum, qfnum, fname); - } - } - - torture_close_connection(cli); - - printf("trans2 scan finished\n"); - return True; -} - - - - -/**************************************************************************** -look for a partial hit -****************************************************************************/ -static void nttrans_check_hit(const char *format, int op, int level, NTSTATUS status) -{ - if (NT_STATUS_V(status) == NT_STATUS_V(NT_STATUS_INVALID_LEVEL) || - NT_STATUS_V(status) == NT_STATUS_V(NT_STATUS_NOT_IMPLEMENTED) || - NT_STATUS_V(status) == NT_STATUS_V(NT_STATUS_NOT_SUPPORTED) || - NT_STATUS_V(status) == NT_STATUS_V(NT_STATUS_UNSUCCESSFUL) || - NT_STATUS_V(status) == NT_STATUS_V(NT_STATUS_INVALID_INFO_CLASS)) { - return; - } -#if VERBOSE - printf("possible %s hit op=%3d level=%5d status=%s\n", - format, op, level, nt_errstr(status)); -#endif -} - -/**************************************************************************** -check for existence of a nttrans call -****************************************************************************/ -static NTSTATUS try_nttrans(struct cli_state *cli, - int op, - char *param, char *data, - int param_len, int data_len, - int *rparam_len, int *rdata_len) -{ - struct smb_nttrans parms; - DATA_BLOB ntparam_blob, ntdata_blob; - TALLOC_CTX *mem_ctx; - NTSTATUS status; - - mem_ctx = talloc_init("try_nttrans"); - - ntparam_blob.length = param_len; - ntparam_blob.data = param; - ntdata_blob.length = data_len; - ntdata_blob.data = data; - - parms.in.max_param = 1024; - parms.in.max_data = 1024; - parms.in.max_setup = 0; - parms.in.setup_count = 0; - parms.in.function = op; - parms.in.params = ntparam_blob; - parms.in.data = ntdata_blob; - - status = smb_raw_nttrans(cli->tree, mem_ctx, &parms); - - if (NT_STATUS_IS_ERR(status)) { - DEBUG(1,("Failed to send NT_TRANS\n")); - talloc_destroy(mem_ctx); - return status; - } - *rparam_len = parms.out.params.length; - *rdata_len = parms.out.data.length; - - talloc_destroy(mem_ctx); - - return status; -} - - -static NTSTATUS try_nttrans_len(struct cli_state *cli, - const char *format, - int op, int level, - char *param, char *data, - int param_len, int *data_len, - int *rparam_len, int *rdata_len) -{ - NTSTATUS ret=NT_STATUS_OK; - - ret = try_nttrans(cli, op, param, data, param_len, - sizeof(pstring), rparam_len, rdata_len); -#if VERBOSE - printf("op=%d level=%d ret=%s\n", op, level, nt_errstr(ret)); -#endif - if (!NT_STATUS_IS_OK(ret)) return ret; - - *data_len = 0; - while (*data_len < sizeof(pstring)) { - ret = try_nttrans(cli, op, param, data, param_len, - *data_len, rparam_len, rdata_len); - if (NT_STATUS_IS_OK(ret)) break; - *data_len += 2; - } - if (NT_STATUS_IS_OK(ret)) { - printf("found %s level=%d data_len=%d rparam_len=%d rdata_len=%d\n", - format, level, *data_len, *rparam_len, *rdata_len); - } else { - nttrans_check_hit(format, op, level, ret); - } - return ret; -} - -/**************************************************************************** -check for existance of a nttrans call -****************************************************************************/ -static BOOL scan_nttrans(struct cli_state *cli, int op, int level, - int fnum, int dnum, const char *fname) -{ - int data_len = 0; - int param_len = 0; - int rparam_len, rdata_len; - pstring param, data; - NTSTATUS status; - - memset(data, 0, sizeof(data)); - data_len = 4; - - /* try with a info level only */ - param_len = 2; - SSVAL(param, 0, level); - status = try_nttrans_len(cli, "void", op, level, param, data, param_len, &data_len, - &rparam_len, &rdata_len); - if (NT_STATUS_IS_OK(status)) return True; - - /* try with a file descriptor */ - param_len = 6; - SSVAL(param, 0, fnum); - SSVAL(param, 2, level); - SSVAL(param, 4, 0); - status = try_nttrans_len(cli, "fnum", op, level, param, data, param_len, &data_len, - &rparam_len, &rdata_len); - if (NT_STATUS_IS_OK(status)) return True; - - - /* try with a notify style */ - param_len = 6; - SSVAL(param, 0, dnum); - SSVAL(param, 2, dnum); - SSVAL(param, 4, level); - status = try_nttrans_len(cli, "notify", op, level, param, data, param_len, &data_len, - &rparam_len, &rdata_len); - if (NT_STATUS_IS_OK(status)) return True; - - /* try with a file name */ - param_len = 6; - SSVAL(param, 0, level); - SSVAL(param, 2, 0); - SSVAL(param, 4, 0); - param_len += push_string(NULL, ¶m[6], fname, -1, STR_TERMINATE | STR_UNICODE); - - status = try_nttrans_len(cli, "fname", op, level, param, data, param_len, &data_len, - &rparam_len, &rdata_len); - if (NT_STATUS_IS_OK(status)) return True; - - /* try with a new file name */ - param_len = 6; - SSVAL(param, 0, level); - SSVAL(param, 2, 0); - SSVAL(param, 4, 0); - param_len += push_string(NULL, ¶m[6], "\\newfile.dat", -1, STR_TERMINATE | STR_UNICODE); - - status = try_nttrans_len(cli, "newfile", op, level, param, data, param_len, &data_len, - &rparam_len, &rdata_len); - cli_unlink(cli->tree, "\\newfile.dat"); - cli_rmdir(cli->tree, "\\newfile.dat"); - if (NT_STATUS_IS_OK(status)) return True; - - /* try dfs style */ - cli_mkdir(cli->tree, "\\testdir"); - param_len = 2; - SSVAL(param, 0, level); - param_len += push_string(NULL, ¶m[2], "\\testdir", -1, STR_TERMINATE | STR_UNICODE); - - status = try_nttrans_len(cli, "dfs", op, level, param, data, param_len, &data_len, - &rparam_len, &rdata_len); - cli_rmdir(cli->tree, "\\testdir"); - if (NT_STATUS_IS_OK(status)) return True; - - return False; -} - - -BOOL torture_nttrans_scan(int dummy) -{ - static struct cli_state *cli; - int op, level; - const char *fname = "\\scanner.dat"; - int fnum, dnum; - - printf("starting nttrans scan test\n"); - - if (!torture_open_connection(&cli)) { - return False; - } - - fnum = cli_open(cli->tree, fname, O_RDWR | O_CREAT | O_TRUNC, - DENY_NONE); - dnum = cli_open(cli->tree, "\\", O_RDONLY, DENY_NONE); - - for (op=OP_MIN; op<=OP_MAX; op++) { - printf("Scanning op=%d\n", op); - for (level = 0; level <= 50; level++) { - scan_nttrans(cli, op, level, fnum, dnum, fname); - } - - for (level = 0x100; level <= 0x130; level++) { - scan_nttrans(cli, op, level, fnum, dnum, fname); - } - - for (level = 1000; level < 1050; level++) { - scan_nttrans(cli, op, level, fnum, dnum, fname); - } - } - - torture_close_connection(cli); - - printf("nttrans scan finished\n"); - return True; -} - - -/* scan for valid base SMB requests */ -BOOL torture_smb_scan(int dummy) -{ - static struct cli_state *cli; - int op; - struct cli_request *req; - NTSTATUS status; - - for (op=0x0;op<=0xFF;op++) { - if (op == SMBreadbraw) continue; - - if (!torture_open_connection(&cli)) { - return False; - } - - req = cli_request_setup(cli->tree, op, 0, 0); - - if (!cli_request_send(req)) { - cli_request_destroy(req); - break; - } - - usleep(10000); - if (cli_transport_pending(cli->transport)) { - status = cli_request_simple_recv(req); - printf("op=0x%x status=%s\n", op, nt_errstr(status)); - torture_close_connection(cli); - continue; - } - - sleep(1); - if (cli_transport_pending(cli->transport)) { - status = cli_request_simple_recv(req); - printf("op=0x%x status=%s\n", op, nt_errstr(status)); - } else { - printf("op=0x%x no reply\n", op); - cli_request_destroy(req); - continue; /* don't attempt close! */ - } - - torture_close_connection(cli); - } - - - printf("smb scan finished\n"); - return True; -} diff --git a/source4/torture/torture.c b/source4/torture/torture.c index 5caabc87ed..5c1ede6919 100644 --- a/source4/torture/torture.c +++ b/source4/torture/torture.c @@ -3927,6 +3927,7 @@ static struct { {"MANGLE", torture_mangle, 0}, {"UTABLE", torture_utable, 0}, {"CASETABLE", torture_casetable, 0}, + {"CHARSET", torture_charset, 0}, {"PIPE_NUMBER", run_pipe_number, 0}, {"IOCTL", torture_ioctl_test, 0}, {"CHKPATH", torture_chkpath_test, 0}, diff --git a/source4/torture/utable.c b/source4/torture/utable.c deleted file mode 100644 index ec37edab82..0000000000 --- a/source4/torture/utable.c +++ /dev/null @@ -1,199 +0,0 @@ -/* - Unix SMB/CIFS implementation. - SMB torture tester - unicode table dumper - Copyright (C) Andrew Tridgell 2001 - - 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 - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - 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. -*/ - -#include "includes.h" - -BOOL torture_utable(int dummy) -{ - struct cli_state *cli; - fstring fname; - const char *alt_name; - int fnum; - smb_ucs2_t c2; - int c, len, fd; - int chars_allowed=0, alt_allowed=0; - uint8 valid[0x10000]; - - printf("starting utable\n"); - - printf("Generating valid character table\n"); - - if (!torture_open_connection(&cli)) { - return False; - } - - memset(valid, 0, sizeof(valid)); - - cli_mkdir(cli->tree, "\\utable"); - cli_unlink(cli->tree, "\\utable\\*"); - - for (c=1; c < 0x10000; c++) { - char *p; - - SSVAL(&c2, 0, c); - fstrcpy(fname, "\\utable\\x"); - p = fname+strlen(fname); - len = convert_string(CH_UCS2, CH_UNIX, - &c2, 2, - p, sizeof(fname)-strlen(fname)); - p[len] = 0; - fstrcat(fname,"_a_long_extension"); - - fnum = cli_open(cli->tree, fname, O_RDWR | O_CREAT | O_TRUNC, - DENY_NONE); - if (fnum == -1) continue; - - chars_allowed++; - - cli_qpathinfo_alt_name(cli->tree, fname, &alt_name); - - if (strncmp(alt_name, "X_A_L", 5) != 0) { - alt_allowed++; - valid[c] = 1; - d_printf("fname=[%s] alt_name=[%s]\n", fname, alt_name); - } - - cli_close(cli->tree, fnum); - cli_unlink(cli->tree, fname); - - if (c % 100 == 0) { - printf("%d (%d/%d)\r", c, chars_allowed, alt_allowed); - } - } - printf("%d (%d/%d)\n", c, chars_allowed, alt_allowed); - - cli_rmdir(cli->tree, "\\utable"); - - d_printf("%d chars allowed %d alt chars allowed\n", chars_allowed, alt_allowed); - - fd = open("valid.dat", O_WRONLY|O_CREAT|O_TRUNC, 0644); - if (fd == -1) { - d_printf("Failed to create valid.dat - %s", strerror(errno)); - return False; - } - write(fd, valid, 0x10000); - close(fd); - d_printf("wrote valid.dat\n"); - - return True; -} - - -static char *form_name(int c) -{ - static fstring fname; - smb_ucs2_t c2; - char *p; - int len; - - fstrcpy(fname, "\\utable\\"); - p = fname+strlen(fname); - SSVAL(&c2, 0, c); - - len = convert_string(CH_UCS2, CH_UNIX, - &c2, 2, - p, sizeof(fname)-strlen(fname)); - p[len] = 0; - return fname; -} - -BOOL torture_casetable(int dummy) -{ - static struct cli_state *cli; - char *fname; - int fnum; - int c, i; -#define MAX_EQUIVALENCE 8 - smb_ucs2_t equiv[0x10000][MAX_EQUIVALENCE]; - printf("starting casetable\n"); - - if (!torture_open_connection(&cli)) { - return False; - } - - printf("Determining upper/lower case table\n"); - - memset(equiv, 0, sizeof(equiv)); - - cli_deltree(cli->tree, "\\utable"); - if (NT_STATUS_IS_ERR(cli_mkdir(cli->tree, "\\utable"))) { - printf("Failed to create utable directory!\n"); - return False; - } - - for (c=1; c < 0x10000; c++) { - size_t size; - - if (c == '.' || c == '\\') continue; - - d_printf("%04x (%c)\n", c, isprint(c)?c:'.'); - - fname = form_name(c); - fnum = cli_nt_create_full(cli->tree, fname, 0, -#if 0 - SEC_RIGHT_MAXIMUM_ALLOWED, -#else - GENERIC_RIGHTS_FILE_ALL_ACCESS, -#endif - FILE_ATTRIBUTE_NORMAL, - NTCREATEX_SHARE_ACCESS_NONE, - NTCREATEX_DISP_OPEN_IF, 0, 0); - - if (fnum == -1) { - printf("Failed to create file with char %04x\n", c); - continue; - } - - size = 0; - - if (NT_STATUS_IS_ERR(cli_qfileinfo(cli->tree, fnum, NULL, &size, - NULL, NULL, NULL, NULL, NULL))) continue; - - if (size > 0) { - /* found a character equivalence! */ - int c2[MAX_EQUIVALENCE]; - - if (size/sizeof(int) >= MAX_EQUIVALENCE) { - printf("too many chars match?? size=%d c=0x%04x\n", - size, c); - cli_close(cli->tree, fnum); - return False; - } - - cli_read(cli->tree, fnum, (char *)c2, 0, size); - printf("%04x: ", c); - equiv[c][0] = c; - for (i=0; itree, fnum, 0, (char *)&c, size, sizeof(c)); - cli_close(cli->tree, fnum); - } - - cli_unlink(cli->tree, "\\utable\\*"); - cli_rmdir(cli->tree, "\\utable"); - - return True; -} -- cgit