The branch, v4-6-stable has been updated
       via  54b08f2 VERSION: Disable git snapshots for the 4.2.0rc2 release.
       via  0270762 WHATSNEW: Add release notes for Samba 4.6.0rc2.
       via  4817385 script/release.sh: fix off by 1 error in 
announce.${tagname}.mail.txt creation
       via  d5eebe5 winbind: Don't add duplicate IDs in wbinfo -r
       via  4773e25 winbind: Fix a typo
       via  1166de1 s3/winbindd: fix invalid free
       via  6a87647 winbind: Fix CID 1398534 Dereference before null check
       via  8c49f54 winbind: Fix CID 1398530 Resource leak
       via  bfd0fb3 winbind: Fix CID 1398530 Resource leak
       via  f629f59 winbind: Fix CID 1398531 Resource leak
       via  ff102c9 winbind: Fix CID 1398533 Resource leak
       via  bd82056 winbind: Fix CID 1398533 Resource leak
       via  1a234f5 WHATSNEW: document winbind changes
       via  56e9090 vfs_default: unlock the right file in copy chunk
       via  479fd27 ctdb-tests: Add "13.per_ip_routing shutdown" test
       via  bcdf945 ctdb-scripts: Fix regression when cleaning up routing table 
IDs
       via  5319e50 ctdb-daemon: Remove stale eventd socket
       via  e3c4968 ctdb-scripts: Fix remaining uses of "ctdb gratiousarp"
       via  77a80b7 ctdb-tests: Add takeover helper tests with 
banned/disconnected nodes
       via  e733776 ctdb-takeover: Handle case where there are no RELEASE_IPs 
to send
       via  11841d3 ctdb-takeover: Known and available IP lists should be the 
same size as nodemap
       via  c331736 ctdb-common: Add wait_send/wait_recv to sock_daemon_funcs
       via  a13e48f ctdb-common: Avoid any processing after finishing tevent_req
       via  2930832 ctdb-common: Pass tevent_req to the computation 
sub-functions
       via  6b67083 ctdb-common: Use consistent naming for sock_daemon_run 
computation functions
       via  bc79bda ctdb-common: Correct name of sock_daemon_run_send/recv 
state structure
       via  bc8e36a ctdb-tests: Add robust mutex test
       via  f1c8b35 ctdb-locking: Explicitly unlock record/db in lock helper
       via  cb31b71 ctdb-locking: Remove support for locking multiple databases
       via  28ed3cd python/schema: fix tests flapping due to oid collision
       via  63b9e1c messaging: Fix dead but not cleaned-up-yet destination 
sockets
       via  65313eb s3:winbindd: talloc_steal the extra_data in 
winbindd_list_users_recv()
       via  bbe371e ctdb-tests: Do not attempt to unregister the join handler 
multiple times
       via  a01ba6c ctdb-tests: Add tests for generic socket I/O
       via  554d208 ctdb-common: Fix a bug in packet reading code for generic 
socket I/O
       via  6c9d136 ctdb-tests: Add another test for sock_daemon
       via  969faf5 ctdb-common: Simplify async computation for 
sock_socket_write_send/recv
       via  36562d5 VERSION: Bump version up to 4.6.0rc2...
      from  b88d95e VERSION: Diable git snapshots for the 4.6.0rc1 release.

https://git.samba.org/?p=samba.git;a=shortlog;h=v4-6-stable


- Log -----------------------------------------------------------------
-----------------------------------------------------------------------

Summary of changes:
 VERSION                                          |   2 +-
 WHATSNEW.txt                                     |  79 ++++-
 ctdb/common/sock_daemon.c                        | 188 +++++------
 ctdb/common/sock_daemon.h                        |  14 +-
 ctdb/common/sock_io.c                            |  28 +-
 ctdb/config/events.d/10.interface                |   4 +-
 ctdb/config/events.d/13.per_ip_routing           |   8 +-
 ctdb/config/events.d/91.lvs                      |   2 +-
 ctdb/doc/ctdb.1.xml                              |   4 +-
 ctdb/server/ctdb_lock.c                          |   6 +-
 ctdb/server/ctdb_lock_helper.c                   | 194 +++++++++--
 ctdb/server/ctdb_takeover_helper.c               |  23 +-
 ctdb/server/eventscript.c                        |   9 +
 ctdb/tests/cunit/sock_daemon_test_001.sh         |  25 +-
 ctdb/tests/cunit/sock_io_test_001.sh             |   9 +
 ctdb/tests/eventscripts/13.per_ip_routing.024.sh |  31 ++
 ctdb/tests/eventscripts/stubs/ctdb               |   2 +-
 ctdb/tests/src/cluster_wait.c                    |  40 ++-
 ctdb/tests/src/sock_daemon_test.c                | 400 +++++++++++++++++++++--
 ctdb/tests/src/sock_io_test.c                    | 283 ++++++++++++++++
 ctdb/tests/src/test_mutex_raw.c                  | 261 +++++++++++++++
 ctdb/tests/takeover_helper/{010.sh => 027.sh}    |  10 +-
 ctdb/tests/takeover_helper/{010.sh => 028.sh}    |  10 +-
 ctdb/wscript                                     |   9 +-
 script/release.sh                                |   5 +-
 source3/lib/messages.c                           |  11 +
 source3/modules/vfs_default.c                    |   2 +-
 source3/winbindd/wb_gettoken.c                   |  81 +++--
 source3/winbindd/wb_sids2xids.c                  |   2 +-
 source3/winbindd/winbindd_ads.c                  |  13 +-
 source3/winbindd/winbindd_cache.c                |   1 +
 source3/winbindd/winbindd_list_users.c           |   2 +-
 source3/winbindd/winbindd_msrpc.c                |   3 +-
 source3/winbindd/winbindd_rpc.c                  |   1 +
 source3/winbindd/winbindd_samr.c                 |   7 +-
 source4/dsdb/tests/python/dsdb_schema_info.py    |  12 +-
 source4/dsdb/tests/python/ldap_schema.py         |  54 +--
 source4/setup/schema_samba4.ldif                 |   4 +
 38 files changed, 1527 insertions(+), 312 deletions(-)
 create mode 100755 ctdb/tests/cunit/sock_io_test_001.sh
 create mode 100755 ctdb/tests/eventscripts/13.per_ip_routing.024.sh
 create mode 100644 ctdb/tests/src/sock_io_test.c
 create mode 100644 ctdb/tests/src/test_mutex_raw.c
 copy ctdb/tests/takeover_helper/{010.sh => 027.sh} (72%)
 copy ctdb/tests/takeover_helper/{010.sh => 028.sh} (72%)


Changeset truncated at 500 lines:

diff --git a/VERSION b/VERSION
index 5414011..7a4c23b 100644
--- a/VERSION
+++ b/VERSION
@@ -87,7 +87,7 @@ SAMBA_VERSION_PRE_RELEASE=
 # e.g. SAMBA_VERSION_RC_RELEASE=1                      #
 #  ->  "3.0.0rc1"                                      #
 ########################################################
-SAMBA_VERSION_RC_RELEASE=1
+SAMBA_VERSION_RC_RELEASE=2
 
 ########################################################
 # To mark SVN snapshots this should be set to 'yes'    #
diff --git a/WHATSNEW.txt b/WHATSNEW.txt
index 7795523..43c5200 100644
--- a/WHATSNEW.txt
+++ b/WHATSNEW.txt
@@ -1,7 +1,7 @@
 Release Announcements
 =====================
 
-This is the first preview release of Samba 4.6.  This is *not*
+This is the second release candidate of Samba 4.6.  This is *not*
 intended for production environments and is designed for testing
 purposes only.  Please report any defects via the Samba bug reporting
 system at https://bugzilla.samba.org/.
@@ -174,6 +174,53 @@ CTDB changes
   To build/install these, use the --enable-etcd-reclock and
   --enable-ceph-reclock configure options.
 
+winbind changes
+---------------
+
+4.6 winbind simplifies the calculation of supplementary groups to make
+it more reliable and predictable. Before 4.6, winbind contained code
+that tried to emulate the group membership calculation that domain
+controllers do when a user logs in. This group membership calculation
+is a very complex process, in particular for domain trust relationship
+situations. Also, in many scenarios it is impossible for winbind to
+correctly do this calculation due to access restrictions in the
+domains: winbind using its machine account simply does not have the
+rights to ask for an arbitrary user's group memberships.
+
+When a user logs in to a Samba server, the domain controller correctly
+calculates the user's group memberships authoritatively and makes the
+information available to the Samba server. This is the only reliable
+way Samba can get informed about the groups a user is member of.
+
+Because of its flakiness, the fallback group membership code was
+removed.
+
+This means that "id <username>" without the user having logged in
+previously stops showing any supplementary groups. Also, it will show
+"DOMAIN\Domain Users" as the primary group. Once the user has logged
+in, "id <username>" will correctly show the primary group and
+supplementary group list.
+
+winbind primary group and nss info
+----------------------------------
+
+With 4.6, it will be possible to optionally use the primary group as
+set in the "Unix Attributes" tab for the local unix token of a domain
+user.  Before 4.6, the Windows primary group was always chosen as
+primary group for the local unix token.
+
+To activate the unix primary group, set
+
+idmap config <DOMAIN> : unix_primary_group = yes
+
+Similarly, set
+
+idmap config <DOMAIN> : unix_nss_info = yes
+
+to retrieve the home directory and login shell from the "Unix
+Attributes" of the user. This supersedes the "winbind nss info"
+parameter with a per-domain configuration option.
+
 
 smb.conf changes
 ================
@@ -192,6 +239,36 @@ KNOWN ISSUES
 
 Currently none.
 
+
+CHANGES SINCE 4.5.0rc1
+======================
+
+o  Amitay Isaacs <[email protected]>
+   * BUG 12469: CTDB lock helper getting stuck trying to lock a record.
+   * BUG 12500: ctdb-common: Fix a bug in packet reading code for generic 
socket
+     I/O.
+   * BUG 12510: sock_daemon_test 4 crashes with SEGV.
+   * BUG 12513: ctdb-daemon: Remove stale eventd socket.
+
+o  Björn Jacke <[email protected]>
+   * BUG 12535: vfs_default: Unlock the right file in copy chunk.
+
+o  Volker Lendecke <[email protected]>
+   * BUG 12509: messaging: Fix dead but not cleaned-up-yet destination sockets.
+   * BUG 12538: Backport winbind fixes.
+
+o  Stefan Metzmacher <[email protected]>
+   * BUG 12501: s3:winbindd: talloc_steal the extra_data in
+     winbindd_list_users_recv().
+
+o  Martin Schwenke <[email protected]>
+   * BUG 12511: ctdb-takeover: Handle case where there are no RELEASE_IPs to
+     send.
+   * BUG 12512: ctdb-scripts: Fix remaining uses of "ctdb gratiousarp".
+   * BUG 12516: /etc/iproute2/rt_tables gets populated with multiple
+     'default' entries.
+
+
 #######################################
 Reporting bugs & Development Discussion
 #######################################
diff --git a/ctdb/common/sock_daemon.c b/ctdb/common/sock_daemon.c
index dc5dba0..b53b4d8 100644
--- a/ctdb/common/sock_daemon.c
+++ b/ctdb/common/sock_daemon.c
@@ -70,7 +70,6 @@ struct sock_daemon_context {
 
        struct pidfile_context *pid_ctx;
        struct sock_socket *socket_list;
-       struct tevent_req *req;
 };
 
 /*
@@ -420,83 +419,37 @@ static bool sock_socket_start_recv(struct tevent_req 
*req, int *perr)
  * Send message to a client
  */
 
-struct sock_socket_write_state {
-       int status;
-};
-
-static void sock_socket_write_done(struct tevent_req *subreq);
-
 struct tevent_req *sock_socket_write_send(TALLOC_CTX *mem_ctx,
                                         struct tevent_context *ev,
                                         struct sock_client_context *client_ctx,
                                         uint8_t *buf, size_t buflen)
 {
-       struct tevent_req *req, *subreq;
-       struct sock_socket_write_state *state;
-
-       req = tevent_req_create(mem_ctx, &state,
-                               struct sock_socket_write_state);
-       if (req == NULL) {
-               return NULL;
-       }
+       struct tevent_req *req;
 
-       subreq = comm_write_send(state, ev, client_ctx->comm, buf, buflen);
-       if (tevent_req_nomem(subreq, req)) {
-               return tevent_req_post(req, ev);
-       }
-       tevent_req_set_callback(subreq, sock_socket_write_done, req);
+       req = comm_write_send(mem_ctx, ev, client_ctx->comm, buf, buflen);
 
        return req;
 }
 
-static void sock_socket_write_done(struct tevent_req *subreq)
+bool sock_socket_write_recv(struct tevent_req *req, int *perr)
 {
-       struct tevent_req *req = tevent_req_callback_data(
-               subreq, struct tevent_req);
-       struct sock_socket_write_state *state = tevent_req_data(
-               req, struct sock_socket_write_state);
        int ret;
        bool status;
 
-       status = comm_write_recv(subreq, &ret);
-       TALLOC_FREE(subreq);
+       status = comm_write_recv(req, &ret);
        if (! status) {
-               state->status = ret;
-               return;
-       }
-}
-
-bool sock_socket_write_recv(struct tevent_req *req, int *perr)
-{
-       struct sock_socket_write_state *state = tevent_req_data(
-               req, struct sock_socket_write_state);
-       int ret;
-
-       if (tevent_req_is_unix_error(req, &ret)) {
                if (perr != NULL) {
                        *perr = ret;
                }
-               return false;
-       }
-
-       if (state->status != 0) {
-               if (perr != NULL) {
-                       *perr = state->status;
-               }
-               return false;
        }
 
-       if (perr != NULL) {
-               *perr = 0;
-       }
-       return true;
+       return status;
 }
+
 /*
  * Socket daemon
  */
 
-static int sock_daemon_context_destructor(struct sock_daemon_context *sockd);
-
 int sock_daemon_setup(TALLOC_CTX *mem_ctx, const char *daemon_name,
                      const char *logging, const char *debug_level,
                      const char *pidfile,
@@ -531,21 +484,10 @@ int sock_daemon_setup(TALLOC_CTX *mem_ctx, const char 
*daemon_name,
                }
        }
 
-       talloc_set_destructor(sockd, sock_daemon_context_destructor);
-
        *out = sockd;
        return 0;
 }
 
-static int sock_daemon_context_destructor(struct sock_daemon_context *sockd)
-{
-       if (sockd->req != NULL) {
-               tevent_req_done(sockd->req);
-       }
-
-       return 0;
-}
-
 int sock_daemon_add_unix(struct sock_daemon_context *sockd,
                         const char *sockpath,
                         struct sock_socket_funcs *funcs,
@@ -573,7 +515,7 @@ int sock_daemon_add_unix(struct sock_daemon_context *sockd,
  * Run socket daemon
  */
 
-struct sock_daemon_start_state {
+struct sock_daemon_run_state {
        struct tevent_context *ev;
        struct sock_daemon_context *sockd;
        pid_t pid_watch;
@@ -581,15 +523,16 @@ struct sock_daemon_start_state {
        int fd;
 };
 
-static void sock_daemon_started(struct tevent_req *subreq);
-static void sock_daemon_signal_handler(struct tevent_context *ev,
-                                      struct tevent_signal *se,
-                                      int signum, int count, void *siginfo,
-                                      void *private_data);
-static void sock_daemon_socket_fail(struct tevent_req *subreq);
-static void sock_daemon_watch_pid(struct tevent_req *subreq);
-static void sock_daemon_reconfigure(struct sock_daemon_start_state *state);
-static void sock_daemon_shutdown(struct sock_daemon_start_state *state);
+static void sock_daemon_run_started(struct tevent_req *subreq);
+static void sock_daemon_run_signal_handler(struct tevent_context *ev,
+                                          struct tevent_signal *se,
+                                          int signum, int count, void *siginfo,
+                                          void *private_data);
+static void sock_daemon_run_reconfigure(struct tevent_req *req);
+static void sock_daemon_run_shutdown(struct tevent_req *req);
+static void sock_daemon_run_socket_fail(struct tevent_req *subreq);
+static void sock_daemon_run_watch_pid(struct tevent_req *subreq);
+static void sock_daemon_run_wait_done(struct tevent_req *subreq);
 
 struct tevent_req *sock_daemon_run_send(TALLOC_CTX *mem_ctx,
                                        struct tevent_context *ev,
@@ -597,12 +540,12 @@ struct tevent_req *sock_daemon_run_send(TALLOC_CTX 
*mem_ctx,
                                        pid_t pid_watch)
 {
        struct tevent_req *req, *subreq;
-       struct sock_daemon_start_state *state;
+       struct sock_daemon_run_state *state;
        struct tevent_signal *se;
        struct sock_socket *sock;
 
        req = tevent_req_create(mem_ctx, &state,
-                               struct sock_daemon_start_state);
+                               struct sock_daemon_run_state);
        if (req == NULL) {
                return NULL;
        }
@@ -617,28 +560,28 @@ struct tevent_req *sock_daemon_run_send(TALLOC_CTX 
*mem_ctx,
        if (tevent_req_nomem(subreq, req)) {
                return tevent_req_post(req, ev);
        }
-       tevent_req_set_callback(subreq, sock_daemon_started, req);
+       tevent_req_set_callback(subreq, sock_daemon_run_started, req);
 
        se = tevent_add_signal(ev, state, SIGHUP, 0,
-                              sock_daemon_signal_handler, req);
+                              sock_daemon_run_signal_handler, req);
        if (tevent_req_nomem(se, req)) {
                return tevent_req_post(req, ev);
        }
 
        se = tevent_add_signal(ev, state, SIGUSR1, 0,
-                              sock_daemon_signal_handler, req);
+                              sock_daemon_run_signal_handler, req);
        if (tevent_req_nomem(se, req)) {
                return tevent_req_post(req, ev);
        }
 
        se = tevent_add_signal(ev, state, SIGINT, 0,
-                              sock_daemon_signal_handler, req);
+                              sock_daemon_run_signal_handler, req);
        if (tevent_req_nomem(se, req)) {
                return tevent_req_post(req, ev);
        }
 
        se = tevent_add_signal(ev, state, SIGTERM, 0,
-                              sock_daemon_signal_handler, req);
+                              sock_daemon_run_signal_handler, req);
        if (tevent_req_nomem(se, req)) {
                return tevent_req_post(req, ev);
        }
@@ -648,7 +591,8 @@ struct tevent_req *sock_daemon_run_send(TALLOC_CTX *mem_ctx,
                if (tevent_req_nomem(subreq, req)) {
                        return tevent_req_post(req, ev);
                }
-               tevent_req_set_callback(subreq, sock_daemon_socket_fail, req);
+               tevent_req_set_callback(subreq, sock_daemon_run_socket_fail,
+                                       req);
 
                sock->req = subreq;
        }
@@ -659,20 +603,30 @@ struct tevent_req *sock_daemon_run_send(TALLOC_CTX 
*mem_ctx,
                if (tevent_req_nomem(subreq, req)) {
                        return tevent_req_post(req, ev);
                }
-               tevent_req_set_callback(subreq, sock_daemon_watch_pid, req);
+               tevent_req_set_callback(subreq, sock_daemon_run_watch_pid,
+                                       req);
        }
 
-       sockd->req = req;
+       if (sockd->funcs != NULL && sockd->funcs->wait_send != NULL &&
+           sockd->funcs->wait_recv != NULL) {
+               subreq = sockd->funcs->wait_send(state, ev,
+                                                sockd->private_data);
+               if (tevent_req_nomem(subreq, req)) {
+                       return tevent_req_post(req, ev);
+               }
+               tevent_req_set_callback(subreq, sock_daemon_run_wait_done,
+                                       req);
+       }
 
        return req;
 }
 
-static void sock_daemon_started(struct tevent_req *subreq)
+static void sock_daemon_run_started(struct tevent_req *subreq)
 {
        struct tevent_req *req = tevent_req_callback_data(
                subreq, struct tevent_req);
-       struct sock_daemon_start_state *state = tevent_req_data(
-               req, struct sock_daemon_start_state);
+       struct sock_daemon_run_state *state = tevent_req_data(
+               req, struct sock_daemon_run_state);
        struct sock_daemon_context *sockd = state->sockd;
 
        D_NOTICE("daemon started, pid=%u\n", getpid());
@@ -682,31 +636,31 @@ static void sock_daemon_started(struct tevent_req *subreq)
        }
 }
 
-static void sock_daemon_signal_handler(struct tevent_context *ev,
-                                      struct tevent_signal *se,
-                                      int signum, int count, void *siginfo,
-                                      void *private_data)
+static void sock_daemon_run_signal_handler(struct tevent_context *ev,
+                                          struct tevent_signal *se,
+                                          int signum, int count, void *siginfo,
+                                          void *private_data)
 {
        struct tevent_req *req = talloc_get_type_abort(
                private_data, struct tevent_req);
-       struct sock_daemon_start_state *state = tevent_req_data(
-               req, struct sock_daemon_start_state);
 
        D_NOTICE("Received signal %d\n", signum);
 
        if (signum == SIGHUP || signum == SIGUSR1) {
-               sock_daemon_reconfigure(state);
+               sock_daemon_run_reconfigure(req);
                return;
        }
 
        if (signum == SIGINT || signum == SIGTERM) {
-               sock_daemon_shutdown(state);
+               sock_daemon_run_shutdown(req);
                tevent_req_error(req, EINTR);
        }
 }
 
-static void sock_daemon_reconfigure(struct sock_daemon_start_state *state)
+static void sock_daemon_run_reconfigure(struct tevent_req *req)
 {
+       struct sock_daemon_run_state *state = tevent_req_data(
+               req, struct sock_daemon_run_state);
        struct sock_daemon_context *sockd = state->sockd;
 
        if (sockd->funcs != NULL && sockd->funcs->reconfigure != NULL) {
@@ -714,8 +668,10 @@ static void sock_daemon_reconfigure(struct 
sock_daemon_start_state *state)
        }
 }
 
-static void sock_daemon_shutdown(struct sock_daemon_start_state *state)
+static void sock_daemon_run_shutdown(struct tevent_req *req)
 {
+       struct sock_daemon_run_state *state = tevent_req_data(
+               req, struct sock_daemon_run_state);
        struct sock_daemon_context *sockd = state->sockd;
        struct sock_socket *sock;
 
@@ -734,32 +690,29 @@ static void sock_daemon_shutdown(struct 
sock_daemon_start_state *state)
        TALLOC_FREE(sockd->pid_ctx);
 }
 
-static void sock_daemon_socket_fail(struct tevent_req *subreq)
+static void sock_daemon_run_socket_fail(struct tevent_req *subreq)
 {
        struct tevent_req *req = tevent_req_callback_data(
                subreq, struct tevent_req);
-       struct sock_daemon_start_state *state = tevent_req_data(
-               req, struct sock_daemon_start_state);
        int ret = 0;
        bool status;
 
        status = sock_socket_start_recv(subreq, &ret);
        TALLOC_FREE(subreq);
+       sock_daemon_run_shutdown(req);
        if (! status) {
                tevent_req_error(req, ret);
        } else {
                tevent_req_done(req);
        }
-
-       sock_daemon_shutdown(state);
 }
 
-static void sock_daemon_watch_pid(struct tevent_req *subreq)
+static void sock_daemon_run_watch_pid(struct tevent_req *subreq)
 {
        struct tevent_req *req = tevent_req_callback_data(
                subreq, struct tevent_req);
-       struct sock_daemon_start_state *state = tevent_req_data(
-               req, struct sock_daemon_start_state);
+       struct sock_daemon_run_state *state = tevent_req_data(
+               req, struct sock_daemon_run_state);
        int ret;
        bool status;
 
@@ -774,7 +727,7 @@ static void sock_daemon_watch_pid(struct tevent_req *subreq)
        if (ret == -1) {
                if (errno == ESRCH) {
                        D_ERR("PID %d gone away, exiting\n", state->pid_watch);
-                       sock_daemon_shutdown(state);
+                       sock_daemon_run_shutdown(req);
                        tevent_req_error(req, ESRCH);
                        return;
                } else {
@@ -788,7 +741,27 @@ static void sock_daemon_watch_pid(struct tevent_req 
*subreq)
        if (tevent_req_nomem(subreq, req)) {
                return;
        }
-       tevent_req_set_callback(subreq, sock_daemon_watch_pid, req);
+       tevent_req_set_callback(subreq, sock_daemon_run_watch_pid, req);
+}
+
+static void sock_daemon_run_wait_done(struct tevent_req *subreq)
+{
+       struct tevent_req *req = tevent_req_callback_data(
+               subreq, struct tevent_req);
+       struct sock_daemon_run_state *state = tevent_req_data(
+               req, struct sock_daemon_run_state);
+       struct sock_daemon_context *sockd = state->sockd;
+       int ret;
+       bool status;
+
+       status = sockd->funcs->wait_recv(subreq, &ret);
+       TALLOC_FREE(subreq);
+       sock_daemon_run_shutdown(req);
+       if (! status) {
+               tevent_req_error(req, ret);
+       } else {
+               tevent_req_done(req);
+       }
 }
 
 bool sock_daemon_run_recv(struct tevent_req *req, int *perr)


-- 
Samba Shared Repository

Reply via email to