[SCM] Samba Shared Repository - branch v4-6-stable updated

Karolin Seeger kseeger at samba.org
Fri Jan 27 04:45:53 UTC 2017


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 <amitay at gmail.com>
+   * 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 <bj at sernet.de>
+   * BUG 12535: vfs_default: Unlock the right file in copy chunk.
+
+o  Volker Lendecke <vl at samba.org>
+   * BUG 12509: messaging: Fix dead but not cleaned-up-yet destination sockets.
+   * BUG 12538: Backport winbind fixes.
+
+o  Stefan Metzmacher <metze at samba.org>
+   * BUG 12501: s3:winbindd: talloc_steal the extra_data in
+     winbindd_list_users_recv().
+
+o  Martin Schwenke <martin at meltin.net>
+   * 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



More information about the samba-cvs mailing list