summaryrefslogtreecommitdiffstats
path: root/source/utils
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2001-03-30 21:53:33 +0000
committerJeremy Allison <jra@samba.org>2001-03-30 21:53:33 +0000
commitf952380c5d0cfbbec1e7de98b712952f302cddfd (patch)
tree6188e2ad9f76e1e58d2f14b3dca4eff7205b5979 /source/utils
parentfe38692643ad7c163c30d9c031a8bd3dec81ffee (diff)
downloadsamba-f952380c5d0cfbbec1e7de98b712952f302cddfd.tar.gz
samba-f952380c5d0cfbbec1e7de98b712952f302cddfd.tar.xz
samba-f952380c5d0cfbbec1e7de98b712952f302cddfd.zip
utils/torture.c: Added one more delete on close test.
smbd/notify_kernel.c: This code was wrong I believe. It was structured to only return a changenotify event on being called from timeout processing (t != 0). The kernel changenotify events should fire on *asynchronous* processing (EINTR return from select caused by the realtime signal delivery) with t == 0. Reported by Juergen Hasch (Hasch@t-online.de). ANDREW PLEASE CHECK THIS ! Currently the hash style changenotify is done on async processing as well as timeout processing. As this is expensive we may want to revisit doing this and maybe set it to fire only on timeout processing. Jeremy.
Diffstat (limited to 'source/utils')
-rw-r--r--source/utils/torture.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/source/utils/torture.c b/source/utils/torture.c
index 8588aa96106..ac922eed61b 100644
--- a/source/utils/torture.c
+++ b/source/utils/torture.c
@@ -2051,6 +2051,7 @@ static void run_oplock2(int dummy)
static void run_deletetest(int dummy)
{
static struct cli_state cli1;
+ static struct cli_state cli2;
char *fname = "\\delete.file";
int fnum1, fnum2;
@@ -2324,12 +2325,66 @@ static void run_deletetest(int dummy)
printf("seventh delete on close test succeeded.\n");
+ /* Test 7 ... */
cli_setatr(&cli1, fname, 0, 0);
cli_unlink(&cli1, fname);
+ if (!open_connection(&cli2)) {
+ printf("[8] failed to open second connection.\n");
+ return;
+ }
+
+ cli_sockopt(&cli1, sockops);
+
+ fnum1 = cli_nt_create_full(&cli1, fname, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
+ FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OVERWRITE_IF, 0);
+
+ if (fnum1 == -1) {
+ printf("[8] open of %s failed (%s)\n", fname, cli_errstr(&cli1));
+ return;
+ }
+
+ fnum2 = cli_nt_create_full(&cli2, fname, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
+ FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN, 0);
+
+ if (fnum2 == -1) {
+ printf("[8] open of %s failed (%s)\n", fname, cli_errstr(&cli1));
+ return;
+ }
+
+ if (!cli_nt_delete_on_close(&cli1, fnum1, True)) {
+ printf("[8] setting delete_on_close on file failed !\n");
+ return;
+ }
+
+ if (!cli_close(&cli1, fnum1)) {
+ printf("[8] close - 1 failed (%s)\n", cli_errstr(&cli1));
+ return;
+ }
+
+ if (!cli_close(&cli2, fnum2)) {
+ printf("[8] close - 2 failed (%s)\n", cli_errstr(&cli2));
+ return;
+ }
+
+ /* This should fail.. */
+ fnum1 = cli_open(&cli1, fname, O_RDONLY, DENY_NONE);
+ if (fnum1 != -1) {
+ printf("[8] open of %s succeeded should have been deleted on close !\n", fname);
+ if (!cli_close(&cli1, fnum1)) {
+ printf("[8] close failed (%s)\n", cli_errstr(&cli1));
+ }
+ cli_unlink(&cli1, fname);
+ } else
+ printf("eighth delete on close test succeeded.\n");
+
printf("finished delete test\n");
+ cli_setatr(&cli1, fname, 0, 0);
+ cli_unlink(&cli1, fname);
+
close_connection(&cli1);
+ close_connection(&cli2);
}
/*