summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Lendecke <vlendec@samba.org>2005-07-06 07:45:22 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:19:17 -0500
commit44b66a73d3e55cb30eec5d80f51edf5188401ac0 (patch)
treea3b13fbb61fcfa8154d50bca5d29ab1df3c9cf4d
parent3de3d6a02dfb790af21f6c848a202064922ea780 (diff)
downloadsamba-44b66a73d3e55cb30eec5d80f51edf5188401ac0.tar.gz
samba-44b66a73d3e55cb30eec5d80f51edf5188401ac0.tar.bz2
samba-44b66a73d3e55cb30eec5d80f51edf5188401ac0.zip
r8176: Exploring the share mode database...
A delete-on-close deleted file is still around while open on another fd. But only for findfirst, not for qpathinfo :-) Volker (This used to be commit dbc7a1a978d782c73f593f4b46f2a81d35169713)
-rw-r--r--source4/torture/basic/delete.c39
-rw-r--r--source4/torture/raw/search.c20
2 files changed, 50 insertions, 9 deletions
diff --git a/source4/torture/basic/delete.c b/source4/torture/basic/delete.c
index 7ddd39c1cb..19af9fc76d 100644
--- a/source4/torture/basic/delete.c
+++ b/source4/torture/basic/delete.c
@@ -463,6 +463,45 @@ BOOL torture_test_delete(void)
goto fail;
}
+ {
+ TALLOC_CTX *mem_ctx = talloc_init("single_search");
+ union smb_search_data data;
+ status = torture_single_search(cli1, mem_ctx,
+ fname, RAW_SEARCH_FULL_DIRECTORY_INFO,
+ &data);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("(%s) single_search failed (%s)\n",
+ __location__, nt_errstr(status));
+ correct = False;
+ }
+ talloc_free(mem_ctx);
+ }
+
+ {
+ time_t c_time, a_time, m_time, w_time;
+ size_t size;
+ uint16_t mode;
+ ino_t ino;
+ status = smbcli_qpathinfo(cli1->tree, fname,
+ &c_time, &a_time, &m_time,
+ &size, &mode);
+ if (!NT_STATUS_EQUAL(status, NT_STATUS_DELETE_PENDING)) {
+ printf("(%s) qpathinfo did not give correct error "
+ "code (%s) -- NT_STATUS_DELETE_PENDING "
+ "expected\n", __location__,
+ nt_errstr(status));
+ correct = False;
+ }
+ status = smbcli_qfileinfo(cli2->tree, fnum2, &mode, &size,
+ &c_time, &a_time, &m_time,
+ &w_time, &ino);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("(%s) qfileinfo failed (%s)\n",
+ __location__, smbcli_errstr(cli1->tree));
+ correct = False;
+ }
+ }
+
if (NT_STATUS_IS_ERR(smbcli_close(cli2->tree, fnum2))) {
printf("(%s) close - 2 failed (%s)\n",
__location__, smbcli_errstr(cli2->tree));
diff --git a/source4/torture/raw/search.c b/source4/torture/raw/search.c
index 0f04648672..05fa24c6a2 100644
--- a/source4/torture/raw/search.c
+++ b/source4/torture/raw/search.c
@@ -40,11 +40,11 @@ static BOOL single_search_callback(void *private, union smb_search_data *file)
/*
do a single file (non-wildcard) search
*/
-static NTSTATUS single_search(struct smbcli_state *cli,
- TALLOC_CTX *mem_ctx,
- const char *pattern,
- enum smb_search_level level,
- union smb_search_data *data)
+NTSTATUS torture_single_search(struct smbcli_state *cli,
+ TALLOC_CTX *mem_ctx,
+ const char *pattern,
+ enum smb_search_level level,
+ union smb_search_data *data)
{
union smb_search_first io;
union smb_search_close c;
@@ -144,8 +144,9 @@ static BOOL test_one_file(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
printf("testing %s\n", levels[i].name);
- levels[i].status = single_search(cli, mem_ctx, fname,
- levels[i].level, &levels[i].data);
+ levels[i].status = torture_single_search(cli, mem_ctx, fname,
+ levels[i].level,
+ &levels[i].data);
/* see if this server claims to support this level */
if ((cap & levels[i].capability_mask) != levels[i].capability_mask) {
@@ -162,8 +163,9 @@ static BOOL test_one_file(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
continue;
}
- status = single_search(cli, mem_ctx, fname2,
- levels[i].level, &levels[i].data);
+ status = torture_single_search(cli, mem_ctx, fname2,
+ levels[i].level,
+ &levels[i].data);
expected_status = NT_STATUS_NO_SUCH_FILE;
if (levels[i].level == RAW_SEARCH_SEARCH ||