summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/utils/torture.c100
1 files changed, 95 insertions, 5 deletions
diff --git a/source3/utils/torture.c b/source3/utils/torture.c
index fb4367283c..ad14461ff5 100644
--- a/source3/utils/torture.c
+++ b/source3/utils/torture.c
@@ -869,12 +869,12 @@ static void run_locktest4(int dummy)
/*
this produces a matrix of deny mode behaviour
*/
-static void run_denytest(int dummy)
+static void run_denytest1(int dummy)
{
static struct cli_state cli1, cli2;
int fnum1, fnum2;
int f, d1, d2, o1, o2, x=0;
- char *fnames[] = {"denytest.exe", "denytest.dat", NULL};
+ char *fnames[] = {"denytest1.exe", "denytest1.dat", NULL};
struct {
int v;
char *name;
@@ -901,7 +901,7 @@ static void run_denytest(int dummy)
cli_sockopt(&cli1, sockops);
cli_sockopt(&cli2, sockops);
- printf("starting denytest\n");
+ printf("starting denytest1\n");
for (f=0;fnames[f];f++) {
cli_unlink(&cli1, fnames[f]);
@@ -952,7 +952,96 @@ static void run_denytest(int dummy)
close_connection(&cli1);
close_connection(&cli2);
- printf("finshed denytest\n");
+ printf("finshed denytest1\n");
+}
+
+
+/*
+ this produces a matrix of deny mode behaviour for two opens on the
+ same connection
+ */
+static void run_denytest2(int dummy)
+{
+ static struct cli_state cli1;
+ int fnum1, fnum2;
+ int f, d1, d2, o1, o2, x=0;
+ char *fnames[] = {"denytest2.exe", "denytest2.dat", NULL};
+ struct {
+ int v;
+ 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}};
+ struct {
+ int v;
+ char *name;
+ } open_modes[] = {
+ {O_RDWR, "O_RDWR"},
+ {O_RDONLY, "O_RDONLY"},
+ {O_WRONLY, "O_WRONLY"},
+ {-1, NULL}};
+
+ if (!open_connection(&cli1)) {
+ return;
+ }
+ cli_sockopt(&cli1, sockops);
+
+ printf("starting denytest2\n");
+
+ for (f=0;fnames[f];f++) {
+ cli_unlink(&cli1, fnames[f]);
+
+ fnum1 = cli_open(&cli1, fnames[f], O_RDWR|O_CREAT, DENY_NONE);
+ cli_write(&cli1, fnum1, 0, fnames[f], 0, strlen(fnames[f]));
+ cli_close(&cli1, fnum1);
+
+ for (d1=0;deny_modes[d1].name;d1++)
+ for (o1=0;open_modes[o1].name;o1++)
+ for (d2=0;deny_modes[d2].name;d2++)
+ for (o2=0;open_modes[o2].name;o2++) {
+ fnum1 = cli_open(&cli1, fnames[f],
+ open_modes[o1].v,
+ deny_modes[d1].v);
+ fnum2 = cli_open(&cli1, fnames[f],
+ open_modes[o2].v,
+ deny_modes[d2].v);
+
+ printf("%s %8s %10s %8s %10s ",
+ fnames[f],
+ open_modes[o1].name,
+ deny_modes[d1].name,
+ open_modes[o2].name,
+ deny_modes[d2].name);
+
+ if (fnum1 == -1) {
+ printf("X");
+ } else if (fnum2 == -1) {
+ printf("-");
+ } else {
+ if (cli_read(&cli1, fnum2, (void *)&x, 0, 1) == 1) {
+ printf("R");
+ }
+ if (cli_write(&cli1, fnum2, 0, (void *)&x, 0, 1) == 1) {
+ printf("W");
+ }
+ }
+
+ printf("\n");
+ cli_close(&cli1, fnum1);
+ cli_close(&cli1, fnum2);
+ }
+
+ cli_unlink(&cli1, fnames[f]);
+ }
+
+ close_connection(&cli1);
+
+ printf("finshed denytest2\n");
}
/*
@@ -1547,7 +1636,8 @@ static struct {
{"NBWNT", run_nbwnt, 0},
{"OPLOCK", run_oplock, 0},
{"DIR", run_dirtest, 0},
- {"DENY", run_denytest, 0},
+ {"DENY1", run_denytest1, 0},
+ {"DENY2", run_denytest2, 0},
{NULL, NULL, 0}};