summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2004-11-12 09:37:59 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:05:45 -0500
commit0e255bb542b1f79c32e9295617199ea8d60753d4 (patch)
tree7762f159a4f72d3670c6e8ba6ce326c3ae070c4e
parent27859603d7e42550678a2f7dbb2ccd63078a6689 (diff)
downloadsamba-0e255bb542b1f79c32e9295617199ea8d60753d4.tar.gz
samba-0e255bb542b1f79c32e9295617199ea8d60753d4.tar.bz2
samba-0e255bb542b1f79c32e9295617199ea8d60753d4.zip
r3699: - split the delayed write testing out of RAW-WRITE, as it is not yet
clear what the correct behaviour is for delayed stat info update. - use a common torture_setup_dir() function for setting up a test directory in torture tests. (This used to be commit f7fb34715b7d6ea3c35ddd684cfb27459a420339)
-rw-r--r--source4/torture/basic/charset.c7
-rw-r--r--source4/torture/basic/delaywrite.c284
-rw-r--r--source4/torture/basic/dir.c7
-rw-r--r--source4/torture/basic/disconnect.c14
-rw-r--r--source4/torture/basic/mangle_test.c6
-rw-r--r--source4/torture/basic/utable.c9
-rw-r--r--source4/torture/config.mk1
-rw-r--r--source4/torture/raw/chkpath.c7
-rw-r--r--source4/torture/raw/context.c12
-rw-r--r--source4/torture/raw/ioctl.c7
-rw-r--r--source4/torture/raw/lock.c20
-rw-r--r--source4/torture/raw/mux.c15
-rw-r--r--source4/torture/raw/notify.c7
-rw-r--r--source4/torture/raw/open.c7
-rw-r--r--source4/torture/raw/read.c16
-rw-r--r--source4/torture/raw/rename.c8
-rw-r--r--source4/torture/raw/search.c16
-rw-r--r--source4/torture/raw/seek.c4
-rw-r--r--source4/torture/raw/setfileinfo.c5
-rw-r--r--source4/torture/raw/unlink.c4
-rw-r--r--source4/torture/raw/write.c255
-rw-r--r--source4/torture/torture.c1
-rw-r--r--source4/torture/torture_util.c14
23 files changed, 344 insertions, 382 deletions
diff --git a/source4/torture/basic/charset.c b/source4/torture/basic/charset.c
index 090303ac30..4f57eba64a 100644
--- a/source4/torture/basic/charset.c
+++ b/source4/torture/basic/charset.c
@@ -239,12 +239,7 @@ BOOL torture_charset(void)
printf("Starting charset tests\n");
- if (smbcli_deltree(cli->tree, BASEDIR) == -1) {
- printf("Failed to clean " BASEDIR "\n");
- return False;
- }
- if (NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Failed to create " BASEDIR " - %s\n", smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
diff --git a/source4/torture/basic/delaywrite.c b/source4/torture/basic/delaywrite.c
new file mode 100644
index 0000000000..3a632c49ea
--- /dev/null
+++ b/source4/torture/basic/delaywrite.c
@@ -0,0 +1,284 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ test suite for delayed write update
+
+ Copyright (C) Volker Lendecke 2004
+ Copyright (C) Andrew Tridgell 2004
+
+ 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"
+#include "libcli/raw/libcliraw.h"
+#include "system/time.h"
+
+#define BASEDIR "\\delaywrite"
+
+static BOOL test_delayed_write_update(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
+{
+ union smb_fileinfo finfo1, finfo2;
+ const char *fname = BASEDIR "\\torture_file.txt";
+ NTSTATUS status;
+ int fnum1 = -1;
+ BOOL ret = True;
+ ssize_t written;
+ time_t t;
+
+ printf("Testing delayed update of write time\n");
+
+ if (!torture_setup_dir(cli, BASEDIR)) {
+ return False;
+ }
+
+ fnum1 = smbcli_open(cli->tree, fname, O_RDWR|O_CREAT, DENY_NONE);
+ if (fnum1 == -1) {
+ printf("Failed to open %s\n", fname);
+ return False;
+ }
+
+ finfo1.basic_info.level = RAW_FILEINFO_BASIC_INFO;
+ finfo1.basic_info.in.fnum = fnum1;
+ finfo2 = finfo1;
+
+ status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo1);
+
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(0, ("fileinfo failed: %s\n", nt_errstr(status)));
+ return False;
+ }
+
+ printf("Initial write time %s\n",
+ nt_time_string(mem_ctx, finfo1.basic_info.out.write_time));
+
+ /* 3 second delay to ensure we get past any 2 second time
+ granularity (older systems may have that) */
+ sleep(3);
+
+ written = smbcli_write(cli->tree, fnum1, 0, "x", 0, 1);
+
+ if (written != 1) {
+ printf("write failed - wrote %d bytes (%s)\n", written, __location__);
+ return False;
+ }
+
+ t = time(NULL);
+
+ while (time(NULL) < t+120) {
+ status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo2);
+
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(0, ("fileinfo failed: %s\n", nt_errstr(status)));
+ ret = False;
+ break;
+ }
+ printf("write time %s\n",
+ nt_time_string(mem_ctx, finfo2.basic_info.out.write_time));
+ if (finfo1.basic_info.out.write_time != finfo2.basic_info.out.write_time) {
+ printf("Server updated write_time after %d seconds\n",
+ (int)(time(NULL) - t));
+ break;
+ }
+ sleep(1);
+ fflush(stdout);
+ }
+
+ if (finfo1.basic_info.out.write_time == finfo2.basic_info.out.write_time) {
+ printf("Server did not update write time?!\n");
+ ret = False;
+ }
+
+
+ if (fnum1 != -1)
+ smbcli_close(cli->tree, fnum1);
+ smbcli_unlink(cli->tree, fname);
+ smbcli_deltree(cli->tree, BASEDIR);
+
+ return ret;
+}
+
+
+/* Windows does obviously not update the stat info during a write call. I
+ * *think* this is the problem causing a spurious Excel 2003 on XP error
+ * message when saving a file. Excel does a setfileinfo, writes, and then does
+ * a getpath(!)info. Or so... For Samba sometimes it displays an error message
+ * that the file might have been changed in between. What i've been able to
+ * trace down is that this happens if the getpathinfo after the write shows a
+ * different last write time than the setfileinfo showed. This is really
+ * nasty....
+ */
+
+static BOOL test_finfo_after_write(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
+{
+ union smb_fileinfo finfo1, finfo2;
+ const char *fname = BASEDIR "\\torture_file.txt";
+ NTSTATUS status;
+ int fnum1 = -1;
+ int fnum2;
+ BOOL ret = True;
+ ssize_t written;
+ struct smbcli_state *cli2=NULL;
+
+ printf("Testing finfo update on close\n");
+
+ if (!torture_setup_dir(cli, BASEDIR)) {
+ return False;
+ }
+
+ fnum1 = smbcli_open(cli->tree, fname, O_RDWR|O_CREAT, DENY_NONE);
+ if (fnum1 == -1) {
+ ret = False;
+ goto done;
+ }
+
+ finfo1.basic_info.level = RAW_FILEINFO_BASIC_INFO;
+ finfo1.basic_info.in.fnum = fnum1;
+
+ status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo1);
+
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(0, ("fileinfo failed: %s\n", nt_errstr(status)));
+ ret = False;
+ goto done;
+ }
+
+ msleep(1000);
+
+ written = smbcli_write(cli->tree, fnum1, 0, "x", 0, 1);
+
+ if (written != 1) {
+ printf("(%s) written gave %d - should have been 1\n",
+ __location__, written);
+ ret = False;
+ goto done;
+ }
+
+ if (!torture_open_connection(&cli2)) {
+ return False;
+ }
+
+ fnum2 = smbcli_open(cli2->tree, fname, O_RDWR, DENY_NONE);
+ if (fnum2 == -1) {
+ printf("(%s) failed to open 2nd time - %s\n",
+ __location__, smbcli_errstr(cli2->tree));
+ ret = False;
+ goto done;
+ }
+
+ written = smbcli_write(cli2->tree, fnum2, 0, "x", 0, 1);
+
+ if (written != 1) {
+ printf("(%s) written gave %d - should have been 1\n",
+ __location__, written);
+ ret = False;
+ goto done;
+ }
+
+ finfo2.basic_info.level = RAW_FILEINFO_BASIC_INFO;
+ finfo2.basic_info.in.fname = fname;
+
+ status = smb_raw_pathinfo(cli2->tree, mem_ctx, &finfo2);
+
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(0, ("(%s) fileinfo failed: %s\n",
+ __location__, nt_errstr(status)));
+ ret = False;
+ goto done;
+ }
+
+ if (finfo1.basic_info.out.create_time !=
+ finfo2.basic_info.out.create_time) {
+ printf("(%s) create_time changed\n", __location__);
+ ret = False;
+ goto done;
+ }
+
+ if (finfo1.basic_info.out.access_time !=
+ finfo2.basic_info.out.access_time) {
+ printf("(%s) access_time changed\n", __location__);
+ ret = False;
+ goto done;
+ }
+
+ if (finfo1.basic_info.out.write_time !=
+ finfo2.basic_info.out.write_time) {
+ printf("(%s) write_time changed\n", __location__);
+ ret = False;
+ goto done;
+ }
+
+ if (finfo1.basic_info.out.change_time !=
+ finfo2.basic_info.out.change_time) {
+ printf("(%s) change_time changed\n", __location__);
+ ret = False;
+ goto done;
+ }
+
+ /* One of the two following calls updates the qpathinfo. */
+
+ /* If you had skipped the smbcli_write on fnum2, it would
+ * *not* have updated the stat on disk */
+
+ smbcli_close(cli2->tree, fnum2);
+ torture_close_connection(cli2);
+ cli2 = NULL;
+
+ /* This call is only for the people looking at ethereal :-) */
+ finfo2.basic_info.level = RAW_FILEINFO_BASIC_INFO;
+ finfo2.basic_info.in.fname = fname;
+
+ status = smb_raw_pathinfo(cli->tree, mem_ctx, &finfo2);
+
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(0, ("fileinfo failed: %s\n", nt_errstr(status)));
+ ret = False;
+ goto done;
+ }
+
+ done:
+ if (fnum1 != -1)
+ smbcli_close(cli->tree, fnum1);
+ smbcli_unlink(cli->tree, fname);
+ smbcli_deltree(cli->tree, BASEDIR);
+ if (cli2 != NULL) {
+ torture_close_connection(cli2);
+ }
+
+ return ret;
+}
+
+
+/*
+ testing of delayed update of write_time
+*/
+BOOL torture_delay_write(void)
+{
+ struct smbcli_state *cli;
+ BOOL ret = True;
+ TALLOC_CTX *mem_ctx;
+
+ if (!torture_open_connection(&cli)) {
+ return False;
+ }
+
+ mem_ctx = talloc_init("torture_delay_write");
+
+ ret &= test_finfo_after_write(cli, mem_ctx);
+ ret &= test_delayed_write_update(cli, mem_ctx);
+
+ torture_close_connection(cli);
+ talloc_destroy(mem_ctx);
+ return ret;
+}
diff --git a/source4/torture/basic/dir.c b/source4/torture/basic/dir.c
index 7921b3eb03..6e2e21fc08 100644
--- a/source4/torture/basic/dir.c
+++ b/source4/torture/basic/dir.c
@@ -99,12 +99,7 @@ BOOL torture_dirtest2(void)
return False;
}
- if (smbcli_deltree(cli->tree, "\\LISTDIR") == -1) {
- fprintf(stderr,"Failed to deltree %s, error=%s\n", "\\LISTDIR", smbcli_errstr(cli->tree));
- return False;
- }
- if (NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, "\\LISTDIR"))) {
- fprintf(stderr,"Failed to mkdir %s, error=%s\n", "\\LISTDIR", smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, "\\LISTDIR")) {
return False;
}
diff --git a/source4/torture/basic/disconnect.c b/source4/torture/basic/disconnect.c
index 683cdb81c8..a225178b96 100644
--- a/source4/torture/basic/disconnect.c
+++ b/source4/torture/basic/disconnect.c
@@ -136,17 +136,8 @@ BOOL torture_disconnect(void)
return False;
}
- /* cleanup */
- if (smbcli_deltree(cli->tree, BASEDIR) == -1) {
- printf("(%s) Failed to cleanup " BASEDIR "\n", __location__);
- ret = False;
- goto done;
- }
-
- if (NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Failed to create %s\n", BASEDIR);
- ret = False;
- goto done;
+ if (!torture_setup_dir(cli, BASEDIR)) {
+ return False;
}
for (i=0;i<100;i++) {
@@ -161,7 +152,6 @@ BOOL torture_disconnect(void)
}
}
-done:
smb_raw_exit(cli->session);
smbcli_deltree(cli->tree, BASEDIR);
torture_close_connection(cli);
diff --git a/source4/torture/basic/mangle_test.c b/source4/torture/basic/mangle_test.c
index 8c4f5514a6..70a9227521 100644
--- a/source4/torture/basic/mangle_test.c
+++ b/source4/torture/basic/mangle_test.c
@@ -167,11 +167,7 @@ BOOL torture_mangle(void)
return False;
}
- smbcli_unlink(cli->tree, "\\mangle_test\\*");
- smbcli_rmdir(cli->tree, "\\mangle_test");
-
- if (NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, "\\mangle_test"))) {
- printf("ERROR: Failed to make directory\n");
+ if (!torture_setup_dir(cli, "\\mangle_test")) {
return False;
}
diff --git a/source4/torture/basic/utable.c b/source4/torture/basic/utable.c
index c09ef576a5..30d389dd92 100644
--- a/source4/torture/basic/utable.c
+++ b/source4/torture/basic/utable.c
@@ -42,8 +42,9 @@ BOOL torture_utable(void)
memset(valid, 0, sizeof(valid));
- smbcli_mkdir(cli->tree, "\\utable");
- smbcli_unlink(cli->tree, "\\utable\\*");
+ if (!torture_setup_dir(cli, "\\utable")) {
+ return False;
+ }
for (c=1; c < 0x10000; c++) {
char *p;
@@ -133,9 +134,7 @@ BOOL torture_casetable(void)
memset(equiv, 0, sizeof(equiv));
- smbcli_deltree(cli->tree, "\\utable");
- if (NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, "\\utable"))) {
- printf("Failed to create utable directory!\n");
+ if (!torture_setup_dir(cli, "\\utable")) {
return False;
}
diff --git a/source4/torture/config.mk b/source4/torture/config.mk
index d939175bb3..d57bbd8e8e 100644
--- a/source4/torture/config.mk
+++ b/source4/torture/config.mk
@@ -17,6 +17,7 @@ ADD_OBJ_FILES = \
torture/basic/delete.o \
torture/basic/unlink.o \
torture/basic/disconnect.o \
+ torture/basic/delaywrite.o \
torture/basic/attr.o
REQUIRED_SUBSYSTEMS = \
LIBSMB
diff --git a/source4/torture/raw/chkpath.c b/source4/torture/raw/chkpath.c
index 20bb3f8ebd..4948949886 100644
--- a/source4/torture/raw/chkpath.c
+++ b/source4/torture/raw/chkpath.c
@@ -223,12 +223,7 @@ BOOL torture_raw_chkpath(void)
mem_ctx = talloc_init("torture_raw_chkpath");
- if (smbcli_deltree(cli->tree, BASEDIR) == -1) {
- printf("Failed to clean " BASEDIR "\n");
- return False;
- }
- if (NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Failed to create " BASEDIR " - %s\n", smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
diff --git a/source4/torture/raw/context.c b/source4/torture/raw/context.c
index 8f72c6d582..446ada80a6 100644
--- a/source4/torture/raw/context.c
+++ b/source4/torture/raw/context.c
@@ -70,9 +70,7 @@ static BOOL test_session(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
printf("TESTING SESSION HANDLING\n");
- if (smbcli_deltree(cli->tree, BASEDIR) == -1 ||
- NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Unable to setup %s - %s\n", BASEDIR, smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
@@ -213,9 +211,7 @@ static BOOL test_tree(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
printf("TESTING TREE HANDLING\n");
- if (smbcli_deltree(cli->tree, BASEDIR) == -1 ||
- NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Unable to setup %s - %s\n", BASEDIR, smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
@@ -315,9 +311,7 @@ static BOOL test_pid(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
printf("TESTING PID HANDLING\n");
- if (smbcli_deltree(cli->tree, BASEDIR) == -1 ||
- NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Unable to setup %s - %s\n", BASEDIR, smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
diff --git a/source4/torture/raw/ioctl.c b/source4/torture/raw/ioctl.c
index 50d3566fe8..f050d220eb 100644
--- a/source4/torture/raw/ioctl.c
+++ b/source4/torture/raw/ioctl.c
@@ -142,12 +142,7 @@ BOOL torture_raw_ioctl(void)
mem_ctx = talloc_init("torture_raw_ioctl");
- if (smbcli_deltree(cli->tree, BASEDIR) == -1) {
- printf("Failed to clean " BASEDIR "\n");
- return False;
- }
- if (NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Failed to create " BASEDIR " - %s\n", smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
diff --git a/source4/torture/raw/lock.c b/source4/torture/raw/lock.c
index 034c793260..547115c9f5 100644
--- a/source4/torture/raw/lock.c
+++ b/source4/torture/raw/lock.c
@@ -52,9 +52,7 @@ static BOOL test_lock(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
int fnum;
const char *fname = BASEDIR "\\test.txt";
- if (smbcli_deltree(cli->tree, BASEDIR) == -1 ||
- NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Unable to setup %s - %s\n", BASEDIR, smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
@@ -190,9 +188,7 @@ static BOOL test_lockx(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
int fnum;
const char *fname = BASEDIR "\\test.txt";
- if (smbcli_deltree(cli->tree, BASEDIR) == -1 ||
- NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Unable to setup %s - %s\n", BASEDIR, smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
@@ -372,9 +368,7 @@ static BOOL test_pidhigh(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
const char *fname = BASEDIR "\\test.txt";
char c = 1;
- if (smbcli_deltree(cli->tree, BASEDIR) == -1 ||
- NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Unable to setup %s - %s\n", BASEDIR, smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
@@ -456,9 +450,7 @@ static BOOL test_async(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
time_t t;
struct smbcli_request *req;
- if (smbcli_deltree(cli->tree, BASEDIR) == -1 ||
- NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Unable to setup %s - %s\n", BASEDIR, smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
@@ -609,9 +601,7 @@ static BOOL test_changetype(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
char c = 0;
const char *fname = BASEDIR "\\test.txt";
- if (smbcli_deltree(cli->tree, BASEDIR) == -1 ||
- NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Unable to setup %s - %s\n", BASEDIR, smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
diff --git a/source4/torture/raw/mux.c b/source4/torture/raw/mux.c
index 79eb485d55..9afbc7c506 100644
--- a/source4/torture/raw/mux.c
+++ b/source4/torture/raw/mux.c
@@ -315,18 +315,8 @@ BOOL torture_raw_mux(void)
mem_ctx = talloc_init("torture_raw_mux");
- /* cleanup */
- if (smbcli_deltree(cli->tree, BASEDIR) == -1) {
- printf("(%s) Failed to cleanup " BASEDIR "\n", __location__);
- ret = False;
- goto done;
- }
-
-
- if (NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Failed to create %s\n", BASEDIR);
- ret = False;
- goto done;
+ if (!torture_setup_dir(cli, BASEDIR)) {
+ return False;
}
if (!test_mux_open(cli, mem_ctx)) {
@@ -341,7 +331,6 @@ BOOL torture_raw_mux(void)
ret = False;
}
-done:
smb_raw_exit(cli->session);
smbcli_deltree(cli->tree, BASEDIR);
torture_close_connection(cli);
diff --git a/source4/torture/raw/notify.c b/source4/torture/raw/notify.c
index 3fff04fc6f..0156f5b251 100644
--- a/source4/torture/raw/notify.c
+++ b/source4/torture/raw/notify.c
@@ -67,11 +67,8 @@ BOOL torture_raw_notify(void)
mem_ctx = talloc_init("torture_raw_notify");
- /* cleanup */
- if (smbcli_deltree(cli->tree, BASEDIR) == -1) {
- printf("Failed to cleanup " BASEDIR "\n");
- ret = False;
- goto done;
+ if (!torture_setup_dir(cli, BASEDIR)) {
+ return False;
}
/*
diff --git a/source4/torture/raw/open.c b/source4/torture/raw/open.c
index e299bba254..b80f6278c6 100644
--- a/source4/torture/raw/open.c
+++ b/source4/torture/raw/open.c
@@ -993,12 +993,7 @@ BOOL torture_raw_open(void)
mem_ctx = talloc_init("torture_raw_open");
- if (smbcli_deltree(cli->tree, BASEDIR) == -1) {
- printf("Failed to clean " BASEDIR "\n");
- return False;
- }
- if (NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Failed to create " BASEDIR " - %s\n", smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
diff --git a/source4/torture/raw/read.c b/source4/torture/raw/read.c
index 8b76a5a029..ff6d2baa2b 100644
--- a/source4/torture/raw/read.c
+++ b/source4/torture/raw/read.c
@@ -92,9 +92,7 @@ static BOOL test_read(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
buf = talloc_zero(mem_ctx, maxsize);
- if (smbcli_deltree(cli->tree, BASEDIR) == -1 ||
- NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Unable to setup %s - %s\n", BASEDIR, smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
@@ -218,9 +216,7 @@ static BOOL test_lockread(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
buf = talloc_zero(mem_ctx, maxsize);
- if (smbcli_deltree(cli->tree, BASEDIR) == -1 ||
- NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Unable to setup %s - %s\n", BASEDIR, smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
@@ -363,9 +359,7 @@ static BOOL test_readx(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
buf = talloc_zero(mem_ctx, maxsize);
- if (smbcli_deltree(cli->tree, BASEDIR) == -1 ||
- NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Unable to setup %s - %s\n", BASEDIR, smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
@@ -559,9 +553,7 @@ static BOOL test_readbraw(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
buf = talloc_zero(mem_ctx, maxsize);
- if (smbcli_deltree(cli->tree, BASEDIR) == -1 ||
- NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Unable to setup %s - %s\n", BASEDIR, smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
diff --git a/source4/torture/raw/rename.c b/source4/torture/raw/rename.c
index f80d6e1308..68bd2eda2d 100644
--- a/source4/torture/raw/rename.c
+++ b/source4/torture/raw/rename.c
@@ -51,9 +51,7 @@ static BOOL test_mv(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
printf("Testing SMBmv\n");
- if (smbcli_deltree(cli->tree, BASEDIR) == -1 ||
- NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Unable to setup %s - %s\n", BASEDIR, smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
@@ -141,9 +139,7 @@ static BOOL test_ntrename(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
printf("Testing SMBntrename\n");
- if (smbcli_deltree(cli->tree, BASEDIR) == -1 ||
- NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Unable to setup %s - %s\n", BASEDIR, smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
diff --git a/source4/torture/raw/search.c b/source4/torture/raw/search.c
index 0c3a724bf9..bca41e23f5 100644
--- a/source4/torture/raw/search.c
+++ b/source4/torture/raw/search.c
@@ -607,9 +607,7 @@ static BOOL test_many_files(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
{"DIRECTORY_INFO", "NAME", RAW_SEARCH_DIRECTORY_INFO, CONT_NAME}
};
- if (smbcli_deltree(cli->tree, BASEDIR) == -1 ||
- NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Failed to create " BASEDIR " - %s\n", smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
@@ -742,9 +740,7 @@ static BOOL test_modify_search(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
union smb_search_next io2;
union smb_setfileinfo sfinfo;
- if (smbcli_deltree(cli->tree, BASEDIR) == -1 ||
- NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Failed to create " BASEDIR " - %s\n", smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
@@ -862,9 +858,7 @@ static BOOL test_sorted(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
NTSTATUS status;
struct multiple_result result;
- if (smbcli_deltree(cli->tree, BASEDIR) == -1 ||
- NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Failed to create " BASEDIR " - %s\n", smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
@@ -927,9 +921,7 @@ static BOOL test_many_dirs(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
NTSTATUS status;
union smb_search_data *file, *file2, *file3;
- if (smbcli_deltree(cli->tree, BASEDIR) == -1 ||
- NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Failed to create " BASEDIR " - %s\n", smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
diff --git a/source4/torture/raw/seek.c b/source4/torture/raw/seek.c
index 94f0ba2385..10b930b18f 100644
--- a/source4/torture/raw/seek.c
+++ b/source4/torture/raw/seek.c
@@ -52,9 +52,7 @@ static BOOL test_seek(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
const char *fname = BASEDIR "\\test.txt";
char c[2];
- if (smbcli_deltree(cli->tree, BASEDIR) == -1 ||
- NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Unable to setup %s - %s\n", BASEDIR, smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
diff --git a/source4/torture/raw/setfileinfo.c b/source4/torture/raw/setfileinfo.c
index 2e4cff99b0..298ccf674b 100644
--- a/source4/torture/raw/setfileinfo.c
+++ b/source4/torture/raw/setfileinfo.c
@@ -56,8 +56,9 @@ BOOL torture_raw_sfileinfo(void)
mem_ctx = talloc_init("torture_sfileinfo");
- smbcli_deltree(cli->tree, BASEDIR);
- smbcli_mkdir(cli->tree, BASEDIR);
+ if (!torture_setup_dir(cli, BASEDIR)) {
+ return False;
+ }
#define RECREATE_FILE(fname) do { \
if (fnum != -1) smbcli_close(cli->tree, fnum); \
diff --git a/source4/torture/raw/unlink.c b/source4/torture/raw/unlink.c
index 40ab137fa0..d9c7ac6dfa 100644
--- a/source4/torture/raw/unlink.c
+++ b/source4/torture/raw/unlink.c
@@ -40,9 +40,7 @@ static BOOL test_unlink(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
BOOL ret = True;
const char *fname = BASEDIR "\\test.txt";
- if (smbcli_deltree(cli->tree, BASEDIR) == -1 ||
- NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
- printf("Unable to setup %s - %s\n", BASEDIR, smbcli_errstr(cli->tree));
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
diff --git a/source4/torture/raw/write.c b/source4/torture/raw/write.c
index 585e231cac..7def976b46 100644
--- a/source4/torture/raw/write.c
+++ b/source4/torture/raw/write.c
@@ -1,6 +1,7 @@
/*
Unix SMB/CIFS implementation.
test suite for various write operations
+
Copyright (C) Andrew Tridgell 2003
This program is free software; you can redistribute it and/or modify
@@ -60,18 +61,6 @@
#define BASEDIR "\\testwrite"
-static BOOL setup_dir(struct smbcli_state *cli, const char *dname)
-{
- smb_raw_exit(cli->session);
- if (smbcli_deltree(cli->tree, dname) == -1 ||
- NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, dname))) {
- printf("Unable to setup %s - %s\n", dname, smbcli_errstr(cli->tree));
- return False;
- }
- return True;
-}
-
-
/*
setup a random buffer based on a seed
*/
@@ -117,7 +106,7 @@ static BOOL test_write(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
buf = talloc_zero(mem_ctx, maxsize);
- if (!setup_dir(cli, BASEDIR)) {
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
@@ -234,7 +223,7 @@ static BOOL test_writex(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
buf = talloc_zero(mem_ctx, maxsize);
- if (!setup_dir(cli, BASEDIR)) {
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
@@ -410,7 +399,7 @@ static BOOL test_writeunlock(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
buf = talloc_zero(mem_ctx, maxsize);
- if (!setup_dir(cli, BASEDIR)) {
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
@@ -547,7 +536,7 @@ static BOOL test_writeclose(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
buf = talloc_zero(mem_ctx, maxsize);
- if (!setup_dir(cli, BASEDIR)) {
+ if (!torture_setup_dir(cli, BASEDIR)) {
return False;
}
@@ -680,238 +669,6 @@ done:
return ret;
}
-static BOOL test_delayed_write_update(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
-{
- union smb_fileinfo finfo1, finfo2;
- const char *fname = BASEDIR "\\torture_file.txt";
- NTSTATUS status;
- int fnum1 = -1;
- BOOL ret = True;
- ssize_t written;
- time_t t;
-
- printf("Testing delayed update of write time\n");
-
- if (!setup_dir(cli, BASEDIR)) {
- return False;
- }
-
- fnum1 = smbcli_open(cli->tree, fname, O_RDWR|O_CREAT, DENY_NONE);
- if (fnum1 == -1) {
- printf("Failed to open %s\n", fname);
- return False;
- }
-
- finfo1.basic_info.level = RAW_FILEINFO_BASIC_INFO;
- finfo1.basic_info.in.fnum = fnum1;
- finfo2 = finfo1;
-
- status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo1);
-
- if (!NT_STATUS_IS_OK(status)) {
- DEBUG(0, ("fileinfo failed: %s\n", nt_errstr(status)));
- return False;
- }
-
- printf("Initial write time %s\n",
- nt_time_string(mem_ctx, finfo1.basic_info.out.write_time));
-
- /* 3 second delay to ensure we get past any 2 second time
- granularity (older systems may have that) */
- sleep(3);
-
- written = smbcli_write(cli->tree, fnum1, 0, "x", 0, 1);
-
- if (written != 1) {
- printf("write failed - wrote %d bytes (%s)\n", written, __location__);
- return False;
- }
-
- t = time(NULL);
-
- while (time(NULL) < t+120) {
- status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo2);
-
- if (!NT_STATUS_IS_OK(status)) {
- DEBUG(0, ("fileinfo failed: %s\n", nt_errstr(status)));
- ret = False;
- break;
- }
- printf("write time %s\n",
- nt_time_string(mem_ctx, finfo2.basic_info.out.write_time));
- if (finfo1.basic_info.out.write_time != finfo2.basic_info.out.write_time) {
- printf("Server updated write_time after %d seconds\n",
- (int)(time(NULL) - t));
- break;
- }
- sleep(1);
- fflush(stdout);
- }
-
- if (finfo1.basic_info.out.write_time == finfo2.basic_info.out.write_time) {
- printf("Server did not update write time?!\n");
- ret = False;
- }
-
-
- if (fnum1 != -1)
- smbcli_close(cli->tree, fnum1);
- smbcli_unlink(cli->tree, fname);
- smbcli_deltree(cli->tree, BASEDIR);
-
- return ret;
-}
-
-
-/* Windows does obviously not update the stat info during a write call. I
- * *think* this is the problem causing a spurious Excel 2003 on XP error
- * message when saving a file. Excel does a setfileinfo, writes, and then does
- * a getpath(!)info. Or so... For Samba sometimes it displays an error message
- * that the file might have been changed in between. What i've been able to
- * trace down is that this happens if the getpathinfo after the write shows a
- * different last write time than the setfileinfo showed. This is really
- * nasty....
- */
-
-static BOOL test_finfo_after_write(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
-{
- union smb_fileinfo finfo1, finfo2;
- const char *fname = BASEDIR "\\torture_file.txt";
- NTSTATUS status;
- int fnum1 = -1;
- int fnum2;
- BOOL ret = True;
- ssize_t written;
- struct smbcli_state *cli2=NULL;
-
- printf("Testing finfo update on close\n");
-
- if (!setup_dir(cli, BASEDIR)) {
- return False;
- }
-
- fnum1 = smbcli_open(cli->tree, fname, O_RDWR|O_CREAT, DENY_NONE);
- if (fnum1 == -1) {
- ret = False;
- goto done;
- }
-
- finfo1.basic_info.level = RAW_FILEINFO_BASIC_INFO;
- finfo1.basic_info.in.fnum = fnum1;
-
- status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo1);
-
- if (!NT_STATUS_IS_OK(status)) {
- DEBUG(0, ("fileinfo failed: %s\n", nt_errstr(status)));
- ret = False;
- goto done;
- }
-
- msleep(1000);
-
- written = smbcli_write(cli->tree, fnum1, 0, "x", 0, 1);
-
- if (written != 1) {
- printf("(%s) written gave %d - should have been 1\n",
- __location__, written);
- ret = False;
- goto done;
- }
-
- if (!torture_open_connection(&cli2)) {
- return False;
- }
-
- fnum2 = smbcli_open(cli2->tree, fname, O_RDWR, DENY_NONE);
- if (fnum2 == -1) {
- printf("(%s) failed to open 2nd time - %s\n",
- __location__, smbcli_errstr(cli2->tree));
- ret = False;
- goto done;
- }
-
- written = smbcli_write(cli2->tree, fnum2, 0, "x", 0, 1);
-
- if (written != 1) {
- printf("(%s) written gave %d - should have been 1\n",
- __location__, written);
- ret = False;
- goto done;
- }
-
- finfo2.basic_info.level = RAW_FILEINFO_BASIC_INFO;
- finfo2.basic_info.in.fname = fname;
-
- status = smb_raw_pathinfo(cli2->tree, mem_ctx, &finfo2);
-
- if (!NT_STATUS_IS_OK(status)) {
- DEBUG(0, ("(%s) fileinfo failed: %s\n",
- __location__, nt_errstr(status)));
- ret = False;
- goto done;
- }
-
- if (finfo1.basic_info.out.create_time !=
- finfo2.basic_info.out.create_time) {
- printf("(%s) create_time changed\n", __location__);
- ret = False;
- goto done;
- }
-
- if (finfo1.basic_info.out.access_time !=
- finfo2.basic_info.out.access_time) {
- printf("(%s) access_time changed\n", __location__);
- ret = False;
- goto done;
- }
-
- if (finfo1.basic_info.out.write_time !=
- finfo2.basic_info.out.write_time) {
- printf("(%s) write_time changed\n", __location__);
- ret = False;
- goto done;
- }
-
- if (finfo1.basic_info.out.change_time !=
- finfo2.basic_info.out.change_time) {
- printf("(%s) change_time changed\n", __location__);
- ret = False;
- goto done;
- }
-
- /* One of the two following calls updates the qpathinfo. */
-
- /* If you had skipped the smbcli_write on fnum2, it would
- * *not* have updated the stat on disk */
-
- smbcli_close(cli2->tree, fnum2);
- torture_close_connection(cli2);
- cli2 = NULL;
-
- /* This call is only for the people looking at ethereal :-) */
- finfo2.basic_info.level = RAW_FILEINFO_BASIC_INFO;
- finfo2.basic_info.in.fname = fname;
-
- status = smb_raw_pathinfo(cli->tree, mem_ctx, &finfo2);
-
- if (!NT_STATUS_IS_OK(status)) {
- DEBUG(0, ("fileinfo failed: %s\n", nt_errstr(status)));
- ret = False;
- goto done;
- }
-
- done:
- if (fnum1 != -1)
- smbcli_close(cli->tree, fnum1);
- smbcli_unlink(cli->tree, fname);
- smbcli_deltree(cli->tree, BASEDIR);
- if (cli2 != NULL) {
- torture_close_connection(cli2);
- }
-
- return ret;
-}
-
/*
basic testing of write calls
*/
@@ -927,8 +684,6 @@ BOOL torture_raw_write(void)
mem_ctx = talloc_init("torture_raw_write");
- ret &= test_finfo_after_write(cli, mem_ctx);
- ret &= test_delayed_write_update(cli, mem_ctx);
ret &= test_write(cli, mem_ctx);
ret &= test_writeunlock(cli, mem_ctx);
ret &= test_writeclose(cli, mem_ctx);
diff --git a/source4/torture/torture.c b/source4/torture/torture.c
index 4db4662f6c..9db2f7f6bc 100644
--- a/source4/torture/torture.c
+++ b/source4/torture/torture.c
@@ -2391,6 +2391,7 @@ static struct {
{"BASE-CHKPATH", torture_chkpath_test, 0},
{"BASE-SECLEAK", torture_sec_leak, 0},
{"BASE-DISCONNECT", torture_disconnect, 0},
+ {"BASE-DELAYWRITE", torture_delay_write, 0},
/* benchmarking tests */
{"BENCH-HOLDCON", torture_holdcon, 0},
diff --git a/source4/torture/torture_util.c b/source4/torture/torture_util.c
index 22aa9ffedd..af8a1ca065 100644
--- a/source4/torture/torture_util.c
+++ b/source4/torture/torture_util.c
@@ -25,6 +25,20 @@
/*
+ setup a directory ready for a test
+*/
+BOOL torture_setup_dir(struct smbcli_state *cli, const char *dname)
+{
+ smb_raw_exit(cli->session);
+ if (smbcli_deltree(cli->tree, dname) == -1 ||
+ NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, dname))) {
+ printf("Unable to setup %s - %s\n", dname, smbcli_errstr(cli->tree));
+ return False;
+ }
+ return True;
+}
+
+/*
create a directory, returning a handle to it
*/
int create_directory_handle(struct smbcli_tree *tree, const char *dname)