The branch, master has been updated
       via  4f4bb1f s4:torture:basic: add more delete test - variants of 
deltest16 and deltest17
       via  c35bdb3 s3: add a debug message for failed execv in sys_popen()
       via  471a853 lib/util: add server_id_set_disconnected() and 
server_id_is_disconnected()
       via  3cdf441 lib/util: let server_id_str() skip the task_id if 0 in the 
cluster case too
       via  6457fb5 s3:lib: implement interpret_pid() as wrapper of 
server_id_from_string()
       via  d4a0aeb lib/util: add server_id_from_string()
       via  6a58c5f s3:lib: implement serverid_equal() as macro of 
server_id_equal()
       via  8149623 lib/util: add server_id_equal()
      from  f46c4df s3:vfs_tsmsm only send notifications when file was offline 
before

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 4f4bb1f20d149e47ee1c6b5251b7376bb86ef530
Author: Michael Adam <[email protected]>
Date:   Wed Aug 8 23:43:05 2012 +0200

    s4:torture:basic: add more delete test - variants of deltest16 and deltest17
    
    There seems to be a difference if the initial delete_on_close flag
    was set on a handle that created the file or if the handle if was
    for a file that already existed.
    
    Pair-Programmed-With: Stefan Metzmacher <[email protected]>
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    
    Autobuild-User(master): Stefan Metzmacher <[email protected]>
    Autobuild-Date(master): Fri Aug 17 21:44:24 CEST 2012 on sn-devel-104

commit c35bdb34da91504a6ed2abe5355aebcab8b73181
Author: Michael Adam <[email protected]>
Date:   Wed Aug 1 15:42:49 2012 +0200

    s3: add a debug message for failed execv in sys_popen()
    
    Signed-off-by: Stefan Metzmacher <[email protected]>

commit 471a853e343e336adb14a219fba2d2ead9a1db62
Author: Michael Adam <[email protected]>
Date:   Mon Aug 6 16:35:46 2012 +0200

    lib/util: add server_id_set_disconnected() and server_id_is_disconnected()
    
    Utility functions for handling the special placeholder server-id value
    for disconnected clients (to be used for durable handles).
    
    Pair-Programmed-With: Stefan Metzmacher <[email protected]>

commit 3cdf441da1ff0c969c89285cfd9fd0f968f1a4e9
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Aug 17 12:50:09 2012 +0200

    lib/util: let server_id_str() skip the task_id if 0 in the cluster case too
    
    server_id_from_string() already handles that case.
    
    metze

commit 6457fb5c39fd49fab2a804241de22e0e081093f4
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Aug 17 12:49:26 2012 +0200

    s3:lib: implement interpret_pid() as wrapper of server_id_from_string()
    
    metze

commit d4a0aeb49a3e7536b34d101cf7b70b48cfa5f4ba
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Aug 17 12:47:57 2012 +0200

    lib/util: add server_id_from_string()
    
    metze

commit 6a58c5fc648088c7c8930a0e653c2f1b01a90b13
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Aug 17 12:45:33 2012 +0200

    s3:lib: implement serverid_equal() as macro of server_id_equal()
    
    metze

commit 8149623ad4e07f03b92832972c6d36ada92cc810
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Aug 17 12:41:02 2012 +0200

    lib/util: add server_id_equal()
    
    metze

-----------------------------------------------------------------------

Summary of changes:
 lib/util/samba_util.h          |   15 +
 lib/util/server_id.c           |   99 +++++++-
 selftest/knownfail             |    8 +-
 source3/include/proto.h        |    2 +-
 source3/include/serverid.h     |    2 -
 source3/lib/serverid.c         |   21 --
 source3/lib/system.c           |    7 +-
 source3/lib/util.c             |   31 +--
 source4/torture/basic/delete.c |  622 ++++++++++++++++++++++++++++++++++++++++
 9 files changed, 750 insertions(+), 57 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/util/samba_util.h b/lib/util/samba_util.h
index 274dde8..4a6dd3b 100644
--- a/lib/util/samba_util.h
+++ b/lib/util/samba_util.h
@@ -899,6 +899,21 @@ char *data_path(TALLOC_CTX *mem_ctx, const char *name);
 const char *shlib_ext(void);
 
 struct server_id;
+bool server_id_equal(const struct server_id *p1, const struct server_id *p2);
 char *server_id_str(TALLOC_CTX *mem_ctx, const struct server_id *id);
+struct server_id server_id_from_string(uint32_t local_vnn,
+                                      const char *pid_string);
+
+/**
+ * Set the serverid to the special value that represents a disconnected
+ * client for (e.g.) durable handles.
+ */
+void server_id_set_disconnected(struct server_id *id);
+
+/**
+ * check whether a serverid is the special placeholder for
+ * a disconnected client
+ */
+bool server_id_is_disconnected(const struct server_id *id);
 
 #endif /* _SAMBA_UTIL_H_ */
diff --git a/lib/util/server_id.c b/lib/util/server_id.c
index 195deea..a06891d 100644
--- a/lib/util/server_id.c
+++ b/lib/util/server_id.c
@@ -20,9 +20,32 @@
 #include "includes.h"
 #include "librpc/gen_ndr/server_id.h"
 
+bool server_id_equal(const struct server_id *p1, const struct server_id *p2)
+{
+       if (p1->pid != p2->pid) {
+               return false;
+       }
+
+       if (p1->task_id != p2->task_id) {
+               return false;
+       }
+
+       if (p1->vnn != p2->vnn) {
+               return false;
+       }
+
+       if (p1->unique_id != p2->unique_id) {
+               return false;
+       }
+
+       return true;
+}
+
 char *server_id_str(TALLOC_CTX *mem_ctx, const struct server_id *id)
 {
-       if (id->vnn == NONCLUSTER_VNN && id->task_id == 0) {
+       if (server_id_is_disconnected(id)) {
+               return talloc_strdup(mem_ctx, "disconnected");
+       } else if (id->vnn == NONCLUSTER_VNN && id->task_id == 0) {
                return talloc_asprintf(mem_ctx,
                                       "%llu",
                                       (unsigned long long)id->pid);
@@ -31,6 +54,11 @@ char *server_id_str(TALLOC_CTX *mem_ctx, const struct 
server_id *id)
                                       "%llu.%u",
                                       (unsigned long long)id->pid,
                                       (unsigned)id->task_id);
+       } else if (id->task_id == 0) {
+               return talloc_asprintf(mem_ctx,
+                                      "%u:%llu",
+                                      (unsigned)id->vnn,
+                                      (unsigned long long)id->pid);
        } else {
                return talloc_asprintf(mem_ctx,
                                       "%u:%llu.%u",
@@ -39,3 +67,72 @@ char *server_id_str(TALLOC_CTX *mem_ctx, const struct 
server_id *id)
                                       (unsigned)id->task_id);
        }
 }
+
+struct server_id server_id_from_string(uint32_t local_vnn,
+                                      const char *pid_string)
+{
+       struct server_id result;
+       unsigned long long pid;
+       unsigned int vnn, task_id = 0;
+
+       ZERO_STRUCT(result);
+
+       /*
+        * We accept various forms with 1, 2 or 3 component forms
+        * because the server_id_str() can print different forms, and
+        * we want backwards compatibility for scripts that may call
+        * smbclient.
+        */
+       if (sscanf(pid_string, "%u:%llu.%u", &vnn, &pid, &task_id) == 3) {
+               result.vnn = vnn;
+               result.pid = pid;
+               result.task_id = task_id;
+       } else if (sscanf(pid_string, "%u:%llu", &vnn, &pid) == 2) {
+               result.vnn = vnn;
+               result.pid = pid;
+       } else if (sscanf(pid_string, "%llu.%u", &pid, &task_id) == 2) {
+               result.vnn = local_vnn;
+               result.pid = pid;
+               result.task_id = task_id;
+       } else if (sscanf(pid_string, "%llu", &pid) == 1) {
+               result.vnn = local_vnn;
+               result.pid = pid;
+       } else if (strcmp(pid_string, "disconnected") ==0) {
+               server_id_set_disconnected(&result);
+       } else {
+               result.vnn = NONCLUSTER_VNN;
+               result.pid = UINT64_MAX;
+       }
+       return result;
+}
+
+/**
+ * Set the serverid to the special value that represents a disconnected
+ * client for (e.g.) durable handles.
+ */
+void server_id_set_disconnected(struct server_id *id)
+{
+       SMB_ASSERT(id != NULL);
+
+       id->pid = UINT64_MAX;
+       id->task_id = UINT32_MAX;
+       id->vnn = NONCLUSTER_VNN;
+       id->unique_id = SERVERID_UNIQUE_ID_NOT_TO_VERIFY;
+
+       return;
+}
+
+/**
+ * check whether a serverid is the special placeholder for
+ * a disconnected client
+ */
+bool server_id_is_disconnected(const struct server_id *id)
+{
+       struct server_id dis;
+
+       SMB_ASSERT(id != NULL);
+
+       server_id_set_disconnected(&dis);
+
+       return server_id_equal(id, &dis);
+}
diff --git a/selftest/knownfail b/selftest/knownfail
index 9376264..1c72718 100644
--- a/selftest/knownfail
+++ b/selftest/knownfail
@@ -46,6 +46,8 @@
 ^samba3.raw.samba3checkfsp.samba3checkfsp\(s3dc\) # This test fails against an 
smbd environment with NT ACLs enabled
 ^samba3.raw.samba3closeerr.samba3closeerr\(s3dc\) # This test fails against an 
smbd environment with NT ACLs enabled
 ^samba3.raw.acls.generic\(s3dc\) # This fails against smbd
+^samba3.base.delete.deltest16a
+^samba3.base.delete.deltest17a
 ^samba3.unix.whoami anonymous connection.whoami\(plugin_s4_dc\) # We need to 
resolve if we should be including SID_NT_WORLD and SID_NT_NETWORK in this token
 ^samba3.unix.whoami anonymous connection.whoami\(s3member\) # smbd maps 
anonymous logins to domain guest in the local domain, not SID_NT_ANONYMOUS
 # these show that we still have some differences between our system
@@ -54,7 +56,11 @@
 ^samba.vfstest.acl.vfstest\(s3dc:local\) #until we get the fake_acls module 
into selftest
 ^samba4.local.convert_string_handle.system.iconv.gd_ascii
 ^samba4.local.convert_string_handle.system.iconv.gd_iso8859_cp850
-^samba4..*base.delete.*.deltest17
+^samba4..*base.delete.*.deltest17\(
+^samba4..*base.delete.*.deltest17b
+^samba4..*base.delete.*.deltest17c
+^samba4..*base.delete.*.deltest17e
+^samba4..*base.delete.*.deltest17f
 ^samba4..*base.delete.*.deltest20a
 ^samba4..*base.delete.*.deltest20b
 ^samba4.raw.session.reauth
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 9af72a1..00dbab8 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -454,7 +454,7 @@ void set_my_unique_id(uint64_t unique_id);
 struct server_id pid_to_procid(pid_t pid);
 struct server_id procid_self(void);
 struct server_id *new_server_id_task(TALLOC_CTX *mem_ctx);
-bool serverid_equal(const struct server_id *p1, const struct server_id *p2);
+#define serverid_equal(p1, p2) server_id_equal(p1,p2)
 bool procid_is_me(const struct server_id *pid);
 struct server_id interpret_pid(const char *pid_string);
 char *procid_str_static(const struct server_id *pid);
diff --git a/source3/include/serverid.h b/source3/include/serverid.h
index ed8d17f..1833f53 100644
--- a/source3/include/serverid.h
+++ b/source3/include/serverid.h
@@ -75,6 +75,4 @@ bool serverid_parent_init(TALLOC_CTX *mem_ctx);
  */
 uint64_t serverid_get_random_unique_id(void);
 
-bool serverid_equal(const struct server_id *p1, const struct server_id *p2);
-
 #endif
diff --git a/source3/lib/serverid.c b/source3/lib/serverid.c
index 3068d77..3c5402e 100644
--- a/source3/lib/serverid.c
+++ b/source3/lib/serverid.c
@@ -458,24 +458,3 @@ uint64_t serverid_get_random_unique_id(void)
 
        return unique_id;
 }
-
-bool serverid_equal(const struct server_id *p1, const struct server_id *p2)
-{
-       if (p1->pid != p2->pid) {
-               return false;
-       }
-
-       if (p1->task_id != p2->task_id) {
-               return false;
-       }
-
-       if (p1->vnn != p2->vnn) {
-               return false;
-       }
-
-       if (p1->unique_id != p2->unique_id) {
-               return false;
-       }
-
-       return true;
-}
diff --git a/source3/lib/system.c b/source3/lib/system.c
index 270d0f5..2881fd6 100644
--- a/source3/lib/system.c
+++ b/source3/lib/system.c
@@ -1159,6 +1159,7 @@ int sys_popen(const char *command)
        int pipe_fds[2];
        popen_list *entry = NULL;
        char **argl = NULL;
+       int ret;
 
        if (pipe(pipe_fds) < 0)
                return -1;
@@ -1213,7 +1214,11 @@ int sys_popen(const char *command)
                for (p = popen_chain; p; p = p->next)
                        close(p->fd);
 
-               execv(argl[0], argl);
+               ret = execv(argl[0], argl);
+               if (ret == -1) {
+                       DEBUG(0, ("sys_popen: ERROR executing dfree command "
+                                 "'%s': %s\n", command, strerror(errno)));
+               }
                _exit (127);
        }
 
diff --git a/source3/lib/util.c b/source3/lib/util.c
index b8513f6..242fb10 100644
--- a/source3/lib/util.c
+++ b/source3/lib/util.c
@@ -2106,36 +2106,7 @@ bool procid_is_me(const struct server_id *pid)
 
 struct server_id interpret_pid(const char *pid_string)
 {
-       struct server_id result;
-       unsigned long long pid;
-       unsigned int vnn, task_id = 0;
-
-       ZERO_STRUCT(result);
-
-       /* We accept various forms with 1, 2 or 3 component forms
-        * because the server_id_str() can print different forms, and
-        * we want backwards compatibility for scripts that may call
-        * smbclient. */
-       if (sscanf(pid_string, "%u:%llu.%u", &vnn, &pid, &task_id) == 3) {
-               result.vnn = vnn;
-               result.pid = pid;
-               result.task_id = task_id;
-       } else if (sscanf(pid_string, "%u:%llu", &vnn, &pid) == 2) {
-               result.vnn = vnn;
-               result.pid = pid;
-               result.task_id = 0;
-       } else if (sscanf(pid_string, "%llu.%u", &pid, &task_id) == 2) {
-               result.vnn = get_my_vnn();
-               result.pid = pid;
-               result.task_id = task_id;
-       } else if (sscanf(pid_string, "%llu", &pid) == 1) {
-               result.vnn = get_my_vnn();
-               result.pid = pid;
-       } else {
-               result.vnn = NONCLUSTER_VNN;
-               result.pid = (uint64_t)-1;
-       }
-       return result;
+       return server_id_from_string(get_my_vnn(), pid_string);
 }
 
 char *procid_str_static(const struct server_id *pid)
diff --git a/source4/torture/basic/delete.c b/source4/torture/basic/delete.c
index 7fb9345..e3d830d 100644
--- a/source4/torture/basic/delete.c
+++ b/source4/torture/basic/delete.c
@@ -883,6 +883,95 @@ static bool deltest16(struct torture_context *tctx, struct 
smbcli_state *cli1, s
        return correct;
 }
 
+/* Test 16 ... */
+static bool deltest16a(struct torture_context *tctx, struct smbcli_state 
*cli1, struct smbcli_state *cli2)
+{
+       int fnum1 = -1;
+       int fnum2 = -1;
+       bool correct = true;
+
+       del_clean_area(cli1, cli2);
+
+       /* Test 16. */
+
+       /* Ensure the file doesn't already exist. */
+       smbcli_close(cli1->tree, fnum1);
+       smbcli_close(cli1->tree, fnum2);
+       smbcli_setatr(cli1->tree, fname, 0, 0);
+       smbcli_unlink(cli1->tree, fname);
+
+       /* Firstly open and create with all access */
+       fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
+                                     SEC_RIGHTS_FILE_ALL,
+                                     FILE_ATTRIBUTE_NORMAL,
+                                     NTCREATEX_SHARE_ACCESS_READ|
+                                     NTCREATEX_SHARE_ACCESS_WRITE|
+                                     NTCREATEX_SHARE_ACCESS_DELETE,
+                                     NTCREATEX_DISP_CREATE,
+                                     0, 0);
+       torture_assert(tctx, fnum1 != -1, talloc_asprintf(tctx, "open - 1 of %s 
failed (%s)",
+                      fname, smbcli_errstr(cli1->tree)));
+
+       /* And close - just to create the file. */
+       smbcli_close(cli1->tree, fnum1);
+
+       /* Firstly create with all access, but delete on close. */
+       fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
+                                     SEC_RIGHTS_FILE_ALL,
+                                     FILE_ATTRIBUTE_NORMAL,
+                                     NTCREATEX_SHARE_ACCESS_READ|
+                                     NTCREATEX_SHARE_ACCESS_WRITE|
+                                     NTCREATEX_SHARE_ACCESS_DELETE,
+                                     NTCREATEX_DISP_OPEN,
+                                     NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0);
+
+       torture_assert (tctx, fnum1 != -1, talloc_asprintf(tctx, "open - 1 of 
%s failed (%s)", fname, smbcli_errstr(cli1->tree)));
+
+       /* The delete on close bit is *not* reported as being set. */
+       correct &= check_delete_on_close(tctx, cli1, fnum1, fname, false, 
__location__);
+
+       /* The delete on close bit is *not* reported as being set. */
+       correct &= check_delete_on_close(tctx, cli1, -1, fname, false, 
__location__);
+       correct &= check_delete_on_close(tctx, cli2, -1, fname, false, 
__location__);
+
+       /* Now try opening again for read-only. */
+       fnum2 = smbcli_nt_create_full(cli2->tree, fname, 0,
+                                     SEC_RIGHTS_FILE_READ,
+                                     FILE_ATTRIBUTE_NORMAL,
+                                     NTCREATEX_SHARE_ACCESS_READ|
+                                     NTCREATEX_SHARE_ACCESS_WRITE|
+                                     NTCREATEX_SHARE_ACCESS_DELETE,
+                                     NTCREATEX_DISP_OPEN,
+                                     0, 0);
+
+       /* Should work. */
+       torture_assert(tctx, fnum2 != -1, talloc_asprintf(tctx, "open - 1 of %s 
failed (%s)",
+                     fname, smbcli_errstr(cli1->tree)));
+
+       correct &= check_delete_on_close(tctx, cli1, fnum1, fname, false, 
__location__);
+       correct &= check_delete_on_close(tctx, cli1, -1, fname, false, 
__location__);
+       correct &= check_delete_on_close(tctx, cli2, fnum2, fname, false, 
__location__);
+       correct &= check_delete_on_close(tctx, cli2, -1, fname, false, 
__location__);
+
+       smbcli_close(cli1->tree, fnum1);
+
+       correct &= check_delete_on_close(tctx, cli2, fnum2, fname, false, 
__location__);
+       correct &= check_delete_on_close(tctx, cli2, -1, fname, false, 
__location__);
+
+       smbcli_close(cli2->tree, fnum2);
+
+       /* And the file should be deleted ! */
+       fnum1 = smbcli_open(cli1->tree, fname, O_RDWR, DENY_NONE);
+       torture_assert(tctx, fnum1 != -1, talloc_asprintf(tctx, "open of %s 
failed (%s)",
+                      fname, smbcli_errstr(cli1->tree)));
+
+       smbcli_close(cli1->tree, fnum1);
+       smbcli_setatr(cli1->tree, fname, 0, 0);
+       smbcli_unlink(cli1->tree, fname);
+
+       return correct;
+}
+
 /* Test 17 ... */
 static bool deltest17(struct torture_context *tctx, struct smbcli_state *cli1, 
struct smbcli_state *cli2)
 {
@@ -967,6 +1056,532 @@ static bool deltest17(struct torture_context *tctx, 
struct smbcli_state *cli1, s
        return correct;
 }
 
+/* Test 17a - like 17, but the delete on close handle is closed last */
+static bool deltest17a(struct torture_context *tctx, struct smbcli_state 
*cli1, struct smbcli_state *cli2)
+{
+       int fnum1 = -1;
+       int fnum2 = -1;
+       bool correct = true;
+
+       del_clean_area(cli1, cli2);
+
+       /* Ensure the file doesn't already exist. */
+       smbcli_close(cli1->tree, fnum1);
+       smbcli_close(cli1->tree, fnum2);
+       smbcli_setatr(cli1->tree, fname, 0, 0);
+       smbcli_unlink(cli1->tree, fname);
+
+       /* Firstly open and create with all access */
+       fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
+                                     SEC_RIGHTS_FILE_ALL,
+                                     FILE_ATTRIBUTE_NORMAL,
+                                     NTCREATEX_SHARE_ACCESS_READ|
+                                     NTCREATEX_SHARE_ACCESS_WRITE|
+                                     NTCREATEX_SHARE_ACCESS_DELETE,
+                                     NTCREATEX_DISP_CREATE,
+                                     0, 0);
+       torture_assert(tctx, fnum1 != -1, talloc_asprintf(tctx, "open - 1 of %s 
failed (%s)",
+                      fname, smbcli_errstr(cli1->tree)));
+
+       /* And close - just to create the file. */
+       smbcli_close(cli1->tree, fnum1);
+
+       /* Next open with all access, but add delete on close. */
+       fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
+                                     SEC_RIGHTS_FILE_ALL,
+                                     FILE_ATTRIBUTE_NORMAL,
+                                     NTCREATEX_SHARE_ACCESS_READ|
+                                     NTCREATEX_SHARE_ACCESS_WRITE|
+                                     NTCREATEX_SHARE_ACCESS_DELETE,
+                                     NTCREATEX_DISP_OPEN,
+                                     NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0);
+
+       torture_assert(tctx, fnum1 != -1, talloc_asprintf(tctx, "open - 1 of %s 
failed (%s)",
+                      fname, smbcli_errstr(cli1->tree)));
+
+       /* The delete on close bit is *not* reported as being set. */
+       correct &= check_delete_on_close(tctx, cli1, fnum1, fname, false, 
__location__);
+
+       /* Now try opening again for read-only. */
+       fnum2 = smbcli_nt_create_full(cli1->tree, fname, 0,
+                                     SEC_RIGHTS_FILE_READ|
+                                     SEC_STD_DELETE,
+                                     FILE_ATTRIBUTE_NORMAL,
+                                     NTCREATEX_SHARE_ACCESS_READ|
+                                     NTCREATEX_SHARE_ACCESS_WRITE|
+                                     NTCREATEX_SHARE_ACCESS_DELETE,
+                                     NTCREATEX_DISP_OPEN,
+                                     0, 0);
+
+       /* Should work. */
+       torture_assert(tctx, fnum2 != -1, talloc_asprintf(tctx, "open - 2 of %s 
failed (%s)",
+                      fname, smbcli_errstr(cli1->tree)));
+
+       /* still not reported as being set on either */
+       correct &= check_delete_on_close(tctx, cli1, fnum1, fname, false, 
__location__);
+       correct &= check_delete_on_close(tctx, cli1, fnum2, fname, false, 
__location__);
+
+       smbcli_close(cli1->tree, fnum2);
+
+       correct &= check_delete_on_close(tctx, cli1, fnum1, fname, false, 
__location__);
+
+       smbcli_close(cli1->tree, fnum1);
+
+       /*
+        * The file is still there:
+        * The second open seems to have removed the initial
+        * delete on close flag from the first handle
+        */
+       fnum1 = smbcli_open(cli1->tree, fname, O_RDWR, DENY_NONE);
+       torture_assert(tctx, fnum1 != -1, talloc_asprintf(tctx, "open - 3 of %s 
failed (%s)",
+                      fname, smbcli_errstr(cli1->tree)));
+
+       smbcli_close(cli1->tree, fnum1);
+       smbcli_setatr(cli1->tree, fname, 0, 0);
+       smbcli_unlink(cli1->tree, fname);
+
+       return correct;
+}
+
+/* Test 17b - like 17a, but the initial delete on close is set on the second 
handle */
+static bool deltest17b(struct torture_context *tctx, struct smbcli_state 
*cli1, struct smbcli_state *cli2)
+{
+       int fnum1 = -1;
+       int fnum2 = -1;
+       bool correct = true;
+
+       del_clean_area(cli1, cli2);
+
+       /* Ensure the file doesn't already exist. */
+       smbcli_close(cli1->tree, fnum1);
+       smbcli_close(cli1->tree, fnum2);
+       smbcli_setatr(cli1->tree, fname, 0, 0);
+       smbcli_unlink(cli1->tree, fname);


-- 
Samba Shared Repository

Reply via email to