diff options
Diffstat (limited to 'source3/utils')
-rw-r--r-- | source3/utils/torture.c | 100 |
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}}; |