[PATCH] some cleanups for notifyd
Volker Lendecke
Volker.Lendecke at SerNet.DE
Thu Jul 6 14:15:34 UTC 2017
Hi!
The messaging_handler abstraction did not really take off. Remove it.
Review appreciated!
Thanks, Volker
--
SerNet GmbH, Bahnhofsallee 1b, 37081 Göttingen
phone: +49-551-370000-0, fax: +49-551-370000-9
AG Göttingen, HRB 2816, GF: Dr. Johannes Loxen
http://www.sernet.de, mailto:kontakt at sernet.de
-------------- next part --------------
From 56086d0c7b166e34631572200a686e321dc34584 Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Fri, 16 Jun 2017 15:20:22 +0200
Subject: [PATCH 01/10] notifyd: Only ask for messaging_ctdb_conn when
clustering
Without clustering, messaging_ctdb_conn will fail anyway.
Review with "git show -b".
Signed-off-by: Volker Lendecke <vl at samba.org>
---
source3/smbd/notifyd/notifyd.c | 65 +++++++++++++++++++++++-------------------
source3/smbd/server.c | 8 ++++--
2 files changed, 42 insertions(+), 31 deletions(-)
diff --git a/source3/smbd/notifyd/notifyd.c b/source3/smbd/notifyd/notifyd.c
index f02ccfa..377d953 100644
--- a/source3/smbd/notifyd/notifyd.c
+++ b/source3/smbd/notifyd/notifyd.c
@@ -242,13 +242,15 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
tevent_req_set_callback(subreq, notifyd_handler_done, req);
#ifdef CLUSTER_SUPPORT
- subreq = messaging_handler_send(state, ev, msg_ctx,
- MSG_SMB_NOTIFY_DB,
- notifyd_got_db, state);
- if (tevent_req_nomem(subreq, req)) {
- return tevent_req_post(req, ev);
+ if (ctdbd_conn != NULL) {
+ subreq = messaging_handler_send(state, ev, msg_ctx,
+ MSG_SMB_NOTIFY_DB,
+ notifyd_got_db, state);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, notifyd_handler_done, req);
}
- tevent_req_set_callback(subreq, notifyd_handler_done, req);
#endif
names_db = messaging_names_db(msg_ctx);
@@ -270,32 +272,37 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
}
#ifdef CLUSTER_SUPPORT
- state->log = talloc_zero(state, struct messaging_reclog);
- if (tevent_req_nomem(state->log, req)) {
- return tevent_req_post(req, ev);
- }
+ if (ctdbd_conn != NULL) {
+ state->log = talloc_zero(state, struct messaging_reclog);
+ if (tevent_req_nomem(state->log, req)) {
+ return tevent_req_post(req, ev);
+ }
- subreq = notifyd_broadcast_reclog_send(
- state->log, ev, ctdbd_conn, messaging_server_id(msg_ctx),
- state->log);
- if (tevent_req_nomem(subreq, req)) {
- return tevent_req_post(req, ev);
- }
- tevent_req_set_callback(subreq, notifyd_broadcast_reclog_finished,
- req);
+ subreq = notifyd_broadcast_reclog_send(
+ state->log, ev, ctdbd_conn,
+ messaging_server_id(msg_ctx),
+ state->log);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq,
+ notifyd_broadcast_reclog_finished,
+ req);
- subreq = notifyd_clean_peers_send(state, ev, state);
- if (tevent_req_nomem(subreq, req)) {
- return tevent_req_post(req, ev);
- }
- tevent_req_set_callback(subreq, notifyd_clean_peers_finished,
- req);
+ subreq = notifyd_clean_peers_send(state, ev, state);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, notifyd_clean_peers_finished,
+ req);
- ret = register_with_ctdbd(ctdbd_conn, CTDB_SRVID_SAMBA_NOTIFY_PROXY,
- notifyd_snoop_broadcast, state);
- if (ret != 0) {
- tevent_req_error(req, ret);
- return tevent_req_post(req, ev);
+ ret = register_with_ctdbd(ctdbd_conn,
+ CTDB_SRVID_SAMBA_NOTIFY_PROXY,
+ notifyd_snoop_broadcast, state);
+ if (ret != 0) {
+ tevent_req_error(req, ret);
+ return tevent_req_post(req, ev);
+ }
}
#endif
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index fa13dbc..e18a4e5 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -334,6 +334,7 @@ static struct tevent_req *notifyd_req(struct messaging_context *msg_ctx,
struct tevent_req *req;
sys_notify_watch_fn sys_notify_watch = NULL;
struct sys_notify_context *sys_notify_ctx = NULL;
+ struct ctdbd_connection *ctdbd_conn = NULL;
if (lp_kernel_change_notify()) {
@@ -358,8 +359,11 @@ static struct tevent_req *notifyd_req(struct messaging_context *msg_ctx,
}
}
- req = notifyd_send(msg_ctx, ev, msg_ctx,
- messaging_ctdbd_connection(),
+ if (lp_clustering()) {
+ ctdbd_conn = messaging_ctdbd_connection();
+ }
+
+ req = notifyd_send(msg_ctx, ev, msg_ctx, ctdbd_conn,
sys_notify_watch, sys_notify_ctx);
if (req == NULL) {
TALLOC_FREE(sys_notify_ctx);
--
2.1.4
From b89e869834b0c555a917f8f8630959ea4ccb4c2f Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Wed, 5 Jul 2017 09:34:51 +0200
Subject: [PATCH 02/10] notifyd: Consolidate two #ifdef CLUSTER into one
Signed-off-by: Volker Lendecke <vl at samba.org>
---
source3/smbd/notifyd/notifyd.c | 21 +++++++++------------
1 file changed, 9 insertions(+), 12 deletions(-)
diff --git a/source3/smbd/notifyd/notifyd.c b/source3/smbd/notifyd/notifyd.c
index 377d953..fec9a5b 100644
--- a/source3/smbd/notifyd/notifyd.c
+++ b/source3/smbd/notifyd/notifyd.c
@@ -241,18 +241,6 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
}
tevent_req_set_callback(subreq, notifyd_handler_done, req);
-#ifdef CLUSTER_SUPPORT
- if (ctdbd_conn != NULL) {
- subreq = messaging_handler_send(state, ev, msg_ctx,
- MSG_SMB_NOTIFY_DB,
- notifyd_got_db, state);
- if (tevent_req_nomem(subreq, req)) {
- return tevent_req_post(req, ev);
- }
- tevent_req_set_callback(subreq, notifyd_handler_done, req);
- }
-#endif
-
names_db = messaging_names_db(msg_ctx);
ret = server_id_db_set_exclusive(names_db, "notify-daemon");
@@ -273,6 +261,15 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
#ifdef CLUSTER_SUPPORT
if (ctdbd_conn != NULL) {
+
+ subreq = messaging_handler_send(state, ev, msg_ctx,
+ MSG_SMB_NOTIFY_DB,
+ notifyd_got_db, state);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, notifyd_handler_done, req);
+
state->log = talloc_zero(state, struct messaging_reclog);
if (tevent_req_nomem(state->log, req)) {
return tevent_req_post(req, ev);
--
2.1.4
From 7df09fe4e9440a97b62b6517d24a542fc47bb624 Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Wed, 5 Jul 2017 09:37:14 +0200
Subject: [PATCH 03/10] notifyd: Avoid an if-expression
Best reviewed with "git show -b -U10"
Signed-off-by: Volker Lendecke <vl at samba.org>
---
source3/smbd/notifyd/notifyd.c | 69 ++++++++++++++++++++----------------------
1 file changed, 33 insertions(+), 36 deletions(-)
diff --git a/source3/smbd/notifyd/notifyd.c b/source3/smbd/notifyd/notifyd.c
index fec9a5b..2b70371 100644
--- a/source3/smbd/notifyd/notifyd.c
+++ b/source3/smbd/notifyd/notifyd.c
@@ -260,46 +260,43 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
}
#ifdef CLUSTER_SUPPORT
- if (ctdbd_conn != NULL) {
-
- subreq = messaging_handler_send(state, ev, msg_ctx,
- MSG_SMB_NOTIFY_DB,
- notifyd_got_db, state);
- if (tevent_req_nomem(subreq, req)) {
- return tevent_req_post(req, ev);
- }
- tevent_req_set_callback(subreq, notifyd_handler_done, req);
+ subreq = messaging_handler_send(state, ev, msg_ctx,
+ MSG_SMB_NOTIFY_DB,
+ notifyd_got_db, state);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, notifyd_handler_done, req);
- state->log = talloc_zero(state, struct messaging_reclog);
- if (tevent_req_nomem(state->log, req)) {
- return tevent_req_post(req, ev);
- }
+ state->log = talloc_zero(state, struct messaging_reclog);
+ if (tevent_req_nomem(state->log, req)) {
+ return tevent_req_post(req, ev);
+ }
- subreq = notifyd_broadcast_reclog_send(
- state->log, ev, ctdbd_conn,
- messaging_server_id(msg_ctx),
- state->log);
- if (tevent_req_nomem(subreq, req)) {
- return tevent_req_post(req, ev);
- }
- tevent_req_set_callback(subreq,
- notifyd_broadcast_reclog_finished,
- req);
+ subreq = notifyd_broadcast_reclog_send(
+ state->log, ev, ctdbd_conn,
+ messaging_server_id(msg_ctx),
+ state->log);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq,
+ notifyd_broadcast_reclog_finished,
+ req);
- subreq = notifyd_clean_peers_send(state, ev, state);
- if (tevent_req_nomem(subreq, req)) {
- return tevent_req_post(req, ev);
- }
- tevent_req_set_callback(subreq, notifyd_clean_peers_finished,
- req);
+ subreq = notifyd_clean_peers_send(state, ev, state);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, notifyd_clean_peers_finished,
+ req);
- ret = register_with_ctdbd(ctdbd_conn,
- CTDB_SRVID_SAMBA_NOTIFY_PROXY,
- notifyd_snoop_broadcast, state);
- if (ret != 0) {
- tevent_req_error(req, ret);
- return tevent_req_post(req, ev);
- }
+ ret = register_with_ctdbd(ctdbd_conn,
+ CTDB_SRVID_SAMBA_NOTIFY_PROXY,
+ notifyd_snoop_broadcast, state);
+ if (ret != 0) {
+ tevent_req_error(req, ret);
+ return tevent_req_post(req, ev);
}
#endif
--
2.1.4
From cb2f6ea2e9282cd17bb45dbd63e97be9cc232730 Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Sat, 24 Jun 2017 08:38:19 +0200
Subject: [PATCH 04/10] messaging: make messaging_rec_create public
Signed-off-by: Volker Lendecke <vl at samba.org>
---
source3/include/messages.h | 5 +++++
source3/lib/messages.c | 2 +-
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/source3/include/messages.h b/source3/include/messages.h
index 806f7b0..46dc6c0 100644
--- a/source3/include/messages.h
+++ b/source3/include/messages.h
@@ -145,6 +145,11 @@ int messaging_cleanup(struct messaging_context *msg_ctx, pid_t pid);
bool messaging_parent_dgm_cleanup_init(struct messaging_context *msg);
+struct messaging_rec *messaging_rec_create(
+ TALLOC_CTX *mem_ctx, struct server_id src, struct server_id dst,
+ uint32_t msg_type, const struct iovec *iov, int iovlen,
+ const int *fds, size_t num_fds);
+
#include "librpc/gen_ndr/ndr_messaging.h"
#endif
diff --git a/source3/lib/messages.c b/source3/lib/messages.c
index b0edb30..da13a1e 100644
--- a/source3/lib/messages.c
+++ b/source3/lib/messages.c
@@ -110,7 +110,7 @@ static void ping_message(struct messaging_context *msg_ctx,
messaging_send(msg_ctx, src, MSG_PONG, data);
}
-static struct messaging_rec *messaging_rec_create(
+struct messaging_rec *messaging_rec_create(
TALLOC_CTX *mem_ctx, struct server_id src, struct server_id dst,
uint32_t msg_type, const struct iovec *iov, int iovlen,
const int *fds, size_t num_fds)
--
2.1.4
From 586f4c233061b29f9855160b52b5777a0f1aa803 Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Sat, 24 Jun 2017 08:38:53 +0200
Subject: [PATCH 05/10] notifyd: Use messaging_register for
MSG_SMB_NOTIFY_REC_CHANGE
Signed-off-by: Volker Lendecke <vl at samba.org>
---
source3/smbd/notifyd/notifyd.c | 73 ++++++++++++++++++++++++------------------
1 file changed, 41 insertions(+), 32 deletions(-)
diff --git a/source3/smbd/notifyd/notifyd.c b/source3/smbd/notifyd/notifyd.c
index 2b70371..e078b40 100644
--- a/source3/smbd/notifyd/notifyd.c
+++ b/source3/smbd/notifyd/notifyd.c
@@ -32,6 +32,7 @@
#include "notifyd.h"
#include "lib/util/server_id_db.h"
#include "lib/util/tevent_unix.h"
+#include "lib/util/tevent_ntstatus.h"
#include "ctdbd_conn.h"
#include "ctdb_srvids.h"
#include "server_id_db_util.h"
@@ -122,9 +123,9 @@ struct notifyd_peer {
time_t last_broadcast;
};
-static bool notifyd_rec_change(struct messaging_context *msg_ctx,
- struct messaging_rec **prec,
- void *private_data);
+static void notifyd_rec_change(struct messaging_context *msg_ctx,
+ void *private_data, uint32_t msg_type,
+ struct server_id src, DATA_BLOB *data);
static bool notifyd_trigger(struct messaging_context *msg_ctx,
struct messaging_rec **prec,
void *private_data);
@@ -195,6 +196,7 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
struct tevent_req *req, *subreq;
struct notifyd_state *state;
struct server_id_db *names_db;
+ NTSTATUS status;
int ret;
req = tevent_req_create(mem_ctx, &state, struct notifyd_state);
@@ -217,19 +219,17 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
return tevent_req_post(req, ev);
}
- subreq = messaging_handler_send(state, ev, msg_ctx,
- MSG_SMB_NOTIFY_REC_CHANGE,
- notifyd_rec_change, state);
- if (tevent_req_nomem(subreq, req)) {
+ status = messaging_register(msg_ctx, state, MSG_SMB_NOTIFY_REC_CHANGE,
+ notifyd_rec_change);
+ if (tevent_req_nterror(req, status)) {
return tevent_req_post(req, ev);
}
- tevent_req_set_callback(subreq, notifyd_handler_done, req);
subreq = messaging_handler_send(state, ev, msg_ctx,
MSG_SMB_NOTIFY_TRIGGER,
notifyd_trigger, state);
if (tevent_req_nomem(subreq, req)) {
- return tevent_req_post(req, ev);
+ goto deregister_rec_change;
}
tevent_req_set_callback(subreq, notifyd_handler_done, req);
@@ -237,7 +237,7 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
MSG_SMB_NOTIFY_GET_DB,
notifyd_get_db, state);
if (tevent_req_nomem(subreq, req)) {
- return tevent_req_post(req, ev);
+ goto deregister_rec_change;
}
tevent_req_set_callback(subreq, notifyd_handler_done, req);
@@ -248,7 +248,7 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
DEBUG(10, ("%s: server_id_db_add failed: %s\n",
__func__, strerror(ret)));
tevent_req_error(req, ret);
- return tevent_req_post(req, ev);
+ goto deregister_rec_change;
}
if (ctdbd_conn == NULL) {
@@ -264,13 +264,13 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
MSG_SMB_NOTIFY_DB,
notifyd_got_db, state);
if (tevent_req_nomem(subreq, req)) {
- return tevent_req_post(req, ev);
+ goto deregister_rec_change;
}
tevent_req_set_callback(subreq, notifyd_handler_done, req);
state->log = talloc_zero(state, struct messaging_reclog);
if (tevent_req_nomem(state->log, req)) {
- return tevent_req_post(req, ev);
+ goto deregister_rec_change;
}
subreq = notifyd_broadcast_reclog_send(
@@ -278,7 +278,7 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
messaging_server_id(msg_ctx),
state->log);
if (tevent_req_nomem(subreq, req)) {
- return tevent_req_post(req, ev);
+ goto deregister_rec_change;
}
tevent_req_set_callback(subreq,
notifyd_broadcast_reclog_finished,
@@ -286,7 +286,7 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
subreq = notifyd_clean_peers_send(state, ev, state);
if (tevent_req_nomem(subreq, req)) {
- return tevent_req_post(req, ev);
+ goto deregister_rec_change;
}
tevent_req_set_callback(subreq, notifyd_clean_peers_finished,
req);
@@ -296,11 +296,15 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
notifyd_snoop_broadcast, state);
if (ret != 0) {
tevent_req_error(req, ret);
- return tevent_req_post(req, ev);
+ goto deregister_rec_change;
}
#endif
return req;
+
+deregister_rec_change:
+ messaging_deregister(msg_ctx, MSG_SMB_NOTIFY_REC_CHANGE, state);
+ return tevent_req_post(req, ev);
}
static void notifyd_handler_done(struct tevent_req *subreq)
@@ -568,40 +572,38 @@ static bool notifyd_parse_rec_change(uint8_t *buf, size_t bufsize,
return true;
}
-static bool notifyd_rec_change(struct messaging_context *msg_ctx,
- struct messaging_rec **prec,
- void *private_data)
+static void notifyd_rec_change(struct messaging_context *msg_ctx,
+ void *private_data, uint32_t msg_type,
+ struct server_id src, DATA_BLOB *data)
{
struct notifyd_state *state = talloc_get_type_abort(
private_data, struct notifyd_state);
struct server_id_buf idbuf;
- struct messaging_rec *rec = *prec;
struct notify_rec_change_msg *msg;
size_t pathlen;
bool ok;
- DEBUG(10, ("%s: Got %d bytes from %s\n", __func__,
- (unsigned)rec->buf.length,
- server_id_str_buf(rec->src, &idbuf)));
+ DBG_DEBUG("Got %zu bytes from %s\n", data->length,
+ server_id_str_buf(src, &idbuf));
- ok = notifyd_parse_rec_change(rec->buf.data, rec->buf.length,
+ ok = notifyd_parse_rec_change(data->data, data->length,
&msg, &pathlen);
if (!ok) {
- return true;
+ return;
}
ok = notifyd_apply_rec_change(
- &rec->src, msg->path, pathlen, &msg->instance,
+ &src, msg->path, pathlen, &msg->instance,
state->entries, state->sys_notify_watch, state->sys_notify_ctx,
state->msg_ctx);
if (!ok) {
DEBUG(1, ("%s: notifyd_apply_rec_change failed, ignoring\n",
__func__));
- return true;
+ return;
}
if ((state->log == NULL) || (state->ctdbd_conn == NULL)) {
- return true;
+ return;
}
#ifdef CLUSTER_SUPPORT
@@ -609,6 +611,7 @@ static bool notifyd_rec_change(struct messaging_context *msg_ctx,
struct messaging_rec **tmp;
struct messaging_reclog *log;
+ struct iovec iov = { .iov_base = data->data, .iov_len = data->length };
log = state->log;
@@ -616,11 +619,19 @@ static bool notifyd_rec_change(struct messaging_context *msg_ctx,
log->num_recs+1);
if (tmp == NULL) {
DEBUG(1, ("%s: talloc_realloc failed, ignoring\n", __func__));
- return true;
+ return;
}
log->recs = tmp;
- log->recs[log->num_recs] = talloc_move(log->recs, prec);
+ log->recs[log->num_recs] = messaging_rec_create(
+ log->recs, src, messaging_server_id(msg_ctx),
+ msg_type, &iov, 1, NULL, 0);
+
+ if (log->recs[log->num_recs] == NULL) {
+ DBG_WARNING("messaging_rec_create failed, ignoring\n");
+ return;
+ }
+
log->num_recs += 1;
if (log->num_recs >= 100) {
@@ -633,8 +644,6 @@ static bool notifyd_rec_change(struct messaging_context *msg_ctx,
}
#endif
-
- return true;
}
struct notifyd_trigger_state {
--
2.1.4
From 8fba4ab707e412915b9c3e93d7446167cfaf3450 Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Sat, 24 Jun 2017 08:45:17 +0200
Subject: [PATCH 06/10] notifyd: Use messaging_register for
MSG_SMB_NOTIFY_TRIGGER
Signed-off-by: Volker Lendecke <vl at samba.org>
---
source3/smbd/notifyd/notifyd.c | 61 ++++++++++++++++++++----------------------
1 file changed, 29 insertions(+), 32 deletions(-)
diff --git a/source3/smbd/notifyd/notifyd.c b/source3/smbd/notifyd/notifyd.c
index e078b40..99539f8 100644
--- a/source3/smbd/notifyd/notifyd.c
+++ b/source3/smbd/notifyd/notifyd.c
@@ -126,9 +126,9 @@ struct notifyd_peer {
static void notifyd_rec_change(struct messaging_context *msg_ctx,
void *private_data, uint32_t msg_type,
struct server_id src, DATA_BLOB *data);
-static bool notifyd_trigger(struct messaging_context *msg_ctx,
- struct messaging_rec **prec,
- void *private_data);
+static void notifyd_trigger(struct messaging_context *msg_ctx,
+ void *private_data, uint32_t msg_type,
+ struct server_id src, DATA_BLOB *data);
static bool notifyd_get_db(struct messaging_context *msg_ctx,
struct messaging_rec **prec,
void *private_data);
@@ -225,19 +225,17 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
return tevent_req_post(req, ev);
}
- subreq = messaging_handler_send(state, ev, msg_ctx,
- MSG_SMB_NOTIFY_TRIGGER,
- notifyd_trigger, state);
- if (tevent_req_nomem(subreq, req)) {
+ status = messaging_register(msg_ctx, state, MSG_SMB_NOTIFY_TRIGGER,
+ notifyd_trigger);
+ if (tevent_req_nterror(req, status)) {
goto deregister_rec_change;
}
- tevent_req_set_callback(subreq, notifyd_handler_done, req);
subreq = messaging_handler_send(state, ev, msg_ctx,
MSG_SMB_NOTIFY_GET_DB,
notifyd_get_db, state);
if (tevent_req_nomem(subreq, req)) {
- goto deregister_rec_change;
+ goto deregister_trigger;
}
tevent_req_set_callback(subreq, notifyd_handler_done, req);
@@ -248,7 +246,7 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
DEBUG(10, ("%s: server_id_db_add failed: %s\n",
__func__, strerror(ret)));
tevent_req_error(req, ret);
- goto deregister_rec_change;
+ goto deregister_trigger;
}
if (ctdbd_conn == NULL) {
@@ -264,13 +262,13 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
MSG_SMB_NOTIFY_DB,
notifyd_got_db, state);
if (tevent_req_nomem(subreq, req)) {
- goto deregister_rec_change;
+ goto deregister_trigger;
}
tevent_req_set_callback(subreq, notifyd_handler_done, req);
state->log = talloc_zero(state, struct messaging_reclog);
if (tevent_req_nomem(state->log, req)) {
- goto deregister_rec_change;
+ goto deregister_trigger;
}
subreq = notifyd_broadcast_reclog_send(
@@ -278,7 +276,7 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
messaging_server_id(msg_ctx),
state->log);
if (tevent_req_nomem(subreq, req)) {
- goto deregister_rec_change;
+ goto deregister_trigger;
}
tevent_req_set_callback(subreq,
notifyd_broadcast_reclog_finished,
@@ -286,7 +284,7 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
subreq = notifyd_clean_peers_send(state, ev, state);
if (tevent_req_nomem(subreq, req)) {
- goto deregister_rec_change;
+ goto deregister_trigger;
}
tevent_req_set_callback(subreq, notifyd_clean_peers_finished,
req);
@@ -296,12 +294,14 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
notifyd_snoop_broadcast, state);
if (ret != 0) {
tevent_req_error(req, ret);
- goto deregister_rec_change;
+ goto deregister_trigger;
}
#endif
return req;
+deregister_trigger:
+ messaging_deregister(msg_ctx, MSG_SMB_NOTIFY_TRIGGER, state);
deregister_rec_change:
messaging_deregister(msg_ctx, MSG_SMB_NOTIFY_REC_CHANGE, state);
return tevent_req_post(req, ev);
@@ -656,34 +656,33 @@ struct notifyd_trigger_state {
static void notifyd_trigger_parser(TDB_DATA key, TDB_DATA data,
void *private_data);
-static bool notifyd_trigger(struct messaging_context *msg_ctx,
- struct messaging_rec **prec,
- void *private_data)
+static void notifyd_trigger(struct messaging_context *msg_ctx,
+ void *private_data, uint32_t msg_type,
+ struct server_id src, DATA_BLOB *data)
{
struct notifyd_state *state = talloc_get_type_abort(
private_data, struct notifyd_state);
struct server_id my_id = messaging_server_id(msg_ctx);
- struct messaging_rec *rec = *prec;
struct notifyd_trigger_state tstate;
const char *path;
const char *p, *next_p;
- if (rec->buf.length < offsetof(struct notify_trigger_msg, path) + 1) {
- DEBUG(1, ("message too short, ignoring: %u\n",
- (unsigned)rec->buf.length));
- return true;
+ if (data->length < offsetof(struct notify_trigger_msg, path) + 1) {
+ DBG_WARNING("message too short, ignoring: %zu\n",
+ data->length);
+ return;
}
- if (rec->buf.data[rec->buf.length-1] != 0) {
+ if (data->data[data->length-1] != 0) {
DEBUG(1, ("%s: path not 0-terminated, ignoring\n", __func__));
- return true;
+ return;
}
tstate.msg_ctx = msg_ctx;
- tstate.covered_by_sys_notify = (rec->src.vnn == my_id.vnn);
- tstate.covered_by_sys_notify &= !server_id_equal(&rec->src, &my_id);
+ tstate.covered_by_sys_notify = (src.vnn == my_id.vnn);
+ tstate.covered_by_sys_notify &= !server_id_equal(&src, &my_id);
- tstate.msg = (struct notify_trigger_msg *)rec->buf.data;
+ tstate.msg = (struct notify_trigger_msg *)data->data;
path = tstate.msg->path;
DEBUG(10, ("%s: Got trigger_msg action=%u, filter=%u, path=%s\n",
@@ -693,7 +692,7 @@ static bool notifyd_trigger(struct messaging_context *msg_ctx,
if (path[0] != '/') {
DEBUG(1, ("%s: path %s does not start with /, ignoring\n",
__func__, path));
- return true;
+ return;
}
for (p = strchr(path+1, '/'); p != NULL; p = next_p) {
@@ -717,7 +716,7 @@ static bool notifyd_trigger(struct messaging_context *msg_ctx,
continue;
}
- if (rec->src.vnn != my_id.vnn) {
+ if (src.vnn != my_id.vnn) {
continue;
}
@@ -732,8 +731,6 @@ static bool notifyd_trigger(struct messaging_context *msg_ctx,
notifyd_trigger_parser, &tstate);
}
}
-
- return true;
}
static void notifyd_send_delete(struct messaging_context *msg_ctx,
--
2.1.4
From 305ef3becc6847fdd9007be0c0901ac0246937bc Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Sat, 24 Jun 2017 08:48:45 +0200
Subject: [PATCH 07/10] notifyd: Use messaging_register for
MSG_SMB_NOTIFY_GET_DB
Signed-off-by: Volker Lendecke <vl at samba.org>
---
source3/smbd/notifyd/notifyd.c | 47 ++++++++++++++++++++----------------------
1 file changed, 22 insertions(+), 25 deletions(-)
diff --git a/source3/smbd/notifyd/notifyd.c b/source3/smbd/notifyd/notifyd.c
index 99539f8..cd98ff5 100644
--- a/source3/smbd/notifyd/notifyd.c
+++ b/source3/smbd/notifyd/notifyd.c
@@ -129,9 +129,9 @@ static void notifyd_rec_change(struct messaging_context *msg_ctx,
static void notifyd_trigger(struct messaging_context *msg_ctx,
void *private_data, uint32_t msg_type,
struct server_id src, DATA_BLOB *data);
-static bool notifyd_get_db(struct messaging_context *msg_ctx,
- struct messaging_rec **prec,
- void *private_data);
+static void notifyd_get_db(struct messaging_context *msg_ctx,
+ void *private_data, uint32_t msg_type,
+ struct server_id src, DATA_BLOB *data);
#ifdef CLUSTER_SUPPORT
static bool notifyd_got_db(struct messaging_context *msg_ctx,
@@ -231,13 +231,11 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
goto deregister_rec_change;
}
- subreq = messaging_handler_send(state, ev, msg_ctx,
- MSG_SMB_NOTIFY_GET_DB,
- notifyd_get_db, state);
- if (tevent_req_nomem(subreq, req)) {
+ status = messaging_register(msg_ctx, state, MSG_SMB_NOTIFY_GET_DB,
+ notifyd_get_db);
+ if (tevent_req_nterror(req, status)) {
goto deregister_trigger;
}
- tevent_req_set_callback(subreq, notifyd_handler_done, req);
names_db = messaging_names_db(msg_ctx);
@@ -246,7 +244,7 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
DEBUG(10, ("%s: server_id_db_add failed: %s\n",
__func__, strerror(ret)));
tevent_req_error(req, ret);
- goto deregister_trigger;
+ goto deregister_get_db;
}
if (ctdbd_conn == NULL) {
@@ -262,13 +260,13 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
MSG_SMB_NOTIFY_DB,
notifyd_got_db, state);
if (tevent_req_nomem(subreq, req)) {
- goto deregister_trigger;
+ goto deregister_get_db;
}
tevent_req_set_callback(subreq, notifyd_handler_done, req);
state->log = talloc_zero(state, struct messaging_reclog);
if (tevent_req_nomem(state->log, req)) {
- goto deregister_trigger;
+ goto deregister_get_db;
}
subreq = notifyd_broadcast_reclog_send(
@@ -276,7 +274,7 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
messaging_server_id(msg_ctx),
state->log);
if (tevent_req_nomem(subreq, req)) {
- goto deregister_trigger;
+ goto deregister_get_db;
}
tevent_req_set_callback(subreq,
notifyd_broadcast_reclog_finished,
@@ -284,7 +282,7 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
subreq = notifyd_clean_peers_send(state, ev, state);
if (tevent_req_nomem(subreq, req)) {
- goto deregister_trigger;
+ goto deregister_get_db;
}
tevent_req_set_callback(subreq, notifyd_clean_peers_finished,
req);
@@ -294,12 +292,14 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
notifyd_snoop_broadcast, state);
if (ret != 0) {
tevent_req_error(req, ret);
- goto deregister_trigger;
+ goto deregister_get_db;
}
#endif
return req;
+deregister_get_db:
+ messaging_deregister(msg_ctx, MSG_SMB_NOTIFY_GET_DB, state);
deregister_trigger:
messaging_deregister(msg_ctx, MSG_SMB_NOTIFY_TRIGGER, state);
deregister_rec_change:
@@ -852,13 +852,12 @@ static void notifyd_send_delete(struct messaging_context *msg_ctx,
}
}
-static bool notifyd_get_db(struct messaging_context *msg_ctx,
- struct messaging_rec **prec,
- void *private_data)
+static void notifyd_get_db(struct messaging_context *msg_ctx,
+ void *private_data, uint32_t msg_type,
+ struct server_id src, DATA_BLOB *data)
{
struct notifyd_state *state = talloc_get_type_abort(
private_data, struct notifyd_state);
- struct messaging_rec *rec = *prec;
struct server_id_buf id1, id2;
NTSTATUS status;
uint64_t rec_index = UINT64_MAX;
@@ -869,11 +868,11 @@ static bool notifyd_get_db(struct messaging_context *msg_ctx,
dbsize = dbwrap_marshall(state->entries, NULL, 0);
- buf = talloc_array(rec, uint8_t, dbsize);
+ buf = talloc_array(talloc_tos(), uint8_t, dbsize);
if (buf == NULL) {
DEBUG(1, ("%s: talloc_array(%ju) failed\n",
__func__, (uintmax_t)dbsize));
- return true;
+ return;
}
dbsize = dbwrap_marshall(state->entries, buf, dbsize);
@@ -883,7 +882,7 @@ static bool notifyd_get_db(struct messaging_context *msg_ctx,
(uintmax_t)talloc_get_size(buf),
(uintmax_t)dbsize));
TALLOC_FREE(buf);
- return true;
+ return;
}
if (state->log != NULL) {
@@ -899,17 +898,15 @@ static bool notifyd_get_db(struct messaging_context *msg_ctx,
DEBUG(10, ("%s: Sending %ju bytes to %s->%s\n", __func__,
(uintmax_t)iov_buflen(iov, ARRAY_SIZE(iov)),
server_id_str_buf(messaging_server_id(msg_ctx), &id1),
- server_id_str_buf(rec->src, &id2)));
+ server_id_str_buf(src, &id2)));
- status = messaging_send_iov(msg_ctx, rec->src, MSG_SMB_NOTIFY_DB,
+ status = messaging_send_iov(msg_ctx, src, MSG_SMB_NOTIFY_DB,
iov, ARRAY_SIZE(iov), NULL, 0);
TALLOC_FREE(buf);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(1, ("%s: messaging_send_iov failed: %s\n",
__func__, nt_errstr(status)));
}
-
- return true;
}
#ifdef CLUSTER_SUPPORT
--
2.1.4
From 56eece38e630137e9de28672e35b6fb295af9584 Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Sat, 24 Jun 2017 08:56:35 +0200
Subject: [PATCH 08/10] notifyd: Use messaging_register for MSG_SMB_NOTIFY_DB
Signed-off-by: Volker Lendecke <vl at samba.org>
---
source3/smbd/notifyd/notifyd.c | 71 +++++++++++++++++++++---------------------
1 file changed, 36 insertions(+), 35 deletions(-)
diff --git a/source3/smbd/notifyd/notifyd.c b/source3/smbd/notifyd/notifyd.c
index cd98ff5..bc69485 100644
--- a/source3/smbd/notifyd/notifyd.c
+++ b/source3/smbd/notifyd/notifyd.c
@@ -134,9 +134,9 @@ static void notifyd_get_db(struct messaging_context *msg_ctx,
struct server_id src, DATA_BLOB *data);
#ifdef CLUSTER_SUPPORT
-static bool notifyd_got_db(struct messaging_context *msg_ctx,
- struct messaging_rec **prec,
- void *private_data);
+static void notifyd_got_db(struct messaging_context *msg_ctx,
+ void *private_data, uint32_t msg_type,
+ struct server_id src, DATA_BLOB *data);
static void notifyd_broadcast_reclog(struct ctdbd_connection *ctdbd_conn,
struct server_id src,
struct messaging_reclog *log);
@@ -193,7 +193,10 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
sys_notify_watch_fn sys_notify_watch,
struct sys_notify_context *sys_notify_ctx)
{
- struct tevent_req *req, *subreq;
+ struct tevent_req *req;
+#ifdef CLUSTER_SUPPORT
+ struct tevent_req *subreq;
+#endif
struct notifyd_state *state;
struct server_id_db *names_db;
NTSTATUS status;
@@ -256,17 +259,15 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
}
#ifdef CLUSTER_SUPPORT
- subreq = messaging_handler_send(state, ev, msg_ctx,
- MSG_SMB_NOTIFY_DB,
- notifyd_got_db, state);
- if (tevent_req_nomem(subreq, req)) {
+ status = messaging_register(msg_ctx, state, MSG_SMB_NOTIFY_DB,
+ notifyd_got_db);
+ if (tevent_req_nterror(req, status)) {
goto deregister_get_db;
}
- tevent_req_set_callback(subreq, notifyd_handler_done, req);
state->log = talloc_zero(state, struct messaging_reclog);
if (tevent_req_nomem(state->log, req)) {
- goto deregister_get_db;
+ goto deregister_db;
}
subreq = notifyd_broadcast_reclog_send(
@@ -274,7 +275,7 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
messaging_server_id(msg_ctx),
state->log);
if (tevent_req_nomem(subreq, req)) {
- goto deregister_get_db;
+ goto deregister_db;
}
tevent_req_set_callback(subreq,
notifyd_broadcast_reclog_finished,
@@ -282,7 +283,7 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
subreq = notifyd_clean_peers_send(state, ev, state);
if (tevent_req_nomem(subreq, req)) {
- goto deregister_get_db;
+ goto deregister_db;
}
tevent_req_set_callback(subreq, notifyd_clean_peers_finished,
req);
@@ -292,12 +293,16 @@ struct tevent_req *notifyd_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
notifyd_snoop_broadcast, state);
if (ret != 0) {
tevent_req_error(req, ret);
- goto deregister_get_db;
+ goto deregister_db;
}
#endif
return req;
+#ifdef CLUSTER_SUPPORT
+deregister_db:
+ messaging_deregister(msg_ctx, MSG_SMB_NOTIFY_DB, state);
+#endif
deregister_get_db:
messaging_deregister(msg_ctx, MSG_SMB_NOTIFY_GET_DB, state);
deregister_trigger:
@@ -914,13 +919,12 @@ static void notifyd_get_db(struct messaging_context *msg_ctx,
static int notifyd_add_proxy_syswatches(struct db_record *rec,
void *private_data);
-static bool notifyd_got_db(struct messaging_context *msg_ctx,
- struct messaging_rec **prec,
- void *private_data)
+static void notifyd_got_db(struct messaging_context *msg_ctx,
+ void *private_data, uint32_t msg_type,
+ struct server_id src, DATA_BLOB *data)
{
struct notifyd_state *state = talloc_get_type_abort(
private_data, struct notifyd_state);
- struct messaging_rec *rec = *prec;
struct notifyd_peer *p = NULL;
struct server_id_buf idbuf;
NTSTATUS status;
@@ -928,52 +932,49 @@ static bool notifyd_got_db(struct messaging_context *msg_ctx,
size_t i;
for (i=0; i<state->num_peers; i++) {
- if (server_id_equal(&rec->src, &state->peers[i]->pid)) {
+ if (server_id_equal(&src, &state->peers[i]->pid)) {
p = state->peers[i];
break;
}
}
if (p == NULL) {
- DEBUG(10, ("%s: Did not find peer for db from %s\n",
- __func__, server_id_str_buf(rec->src, &idbuf)));
- return true;
+ DBG_DEBUG("Did not find peer for db from %s\n",
+ server_id_str_buf(src, &idbuf));
+ return;
}
- if (rec->buf.length < 8) {
- DEBUG(10, ("%s: Got short db length %u from %s\n", __func__,
- (unsigned)rec->buf.length,
- server_id_str_buf(rec->src, &idbuf)));
+ if (data->length < 8) {
+ DBG_DEBUG("Got short db length %zu from %s\n", data->length,
+ server_id_str_buf(src, &idbuf));
TALLOC_FREE(p);
- return true;
+ return;
}
- p->rec_index = BVAL(rec->buf.data, 0);
+ p->rec_index = BVAL(data->data, 0);
p->db = db_open_rbt(p);
if (p->db == NULL) {
DEBUG(10, ("%s: db_open_rbt failed\n", __func__));
TALLOC_FREE(p);
- return true;
+ return;
}
- status = dbwrap_unmarshall(p->db, rec->buf.data + 8,
- rec->buf.length - 8);
+ status = dbwrap_unmarshall(p->db, data->data + 8,
+ data->length - 8);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(10, ("%s: dbwrap_unmarshall returned %s for db %s\n",
__func__, nt_errstr(status),
- server_id_str_buf(rec->src, &idbuf)));
+ server_id_str_buf(src, &idbuf)));
TALLOC_FREE(p);
- return true;
+ return;
}
dbwrap_traverse_read(p->db, notifyd_add_proxy_syswatches, state,
&count);
DEBUG(10, ("%s: Database from %s contained %d records\n", __func__,
- server_id_str_buf(rec->src, &idbuf), count));
-
- return true;
+ server_id_str_buf(src, &idbuf), count));
}
static void notifyd_broadcast_reclog(struct ctdbd_connection *ctdbd_conn,
--
2.1.4
From 420029b9b4c2bff8903e7a0a519bd516ac5e1ff6 Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Sat, 24 Jun 2017 08:57:18 +0200
Subject: [PATCH 09/10] notifyd: Remove notifyd_handler_done
Signed-off-by: Volker Lendecke <vl at samba.org>
---
source3/smbd/notifyd/notifyd.c | 13 -------------
1 file changed, 13 deletions(-)
diff --git a/source3/smbd/notifyd/notifyd.c b/source3/smbd/notifyd/notifyd.c
index bc69485..caf894e 100644
--- a/source3/smbd/notifyd/notifyd.c
+++ b/source3/smbd/notifyd/notifyd.c
@@ -176,8 +176,6 @@ static int sys_notify_watch_dummy(
return 0;
}
-static void notifyd_handler_done(struct tevent_req *subreq);
-
#ifdef CLUSTER_SUPPORT
static void notifyd_broadcast_reclog_finished(struct tevent_req *subreq);
static void notifyd_clean_peers_finished(struct tevent_req *subreq);
@@ -312,17 +310,6 @@ deregister_rec_change:
return tevent_req_post(req, ev);
}
-static void notifyd_handler_done(struct tevent_req *subreq)
-{
- struct tevent_req *req = tevent_req_callback_data(
- subreq, struct tevent_req);
- int ret;
-
- ret = messaging_handler_recv(subreq);
- TALLOC_FREE(subreq);
- tevent_req_error(req, ret);
-}
-
#ifdef CLUSTER_SUPPORT
static void notifyd_broadcast_reclog_finished(struct tevent_req *subreq)
--
2.1.4
From 534ad83ed7377512fb1346d78d875511f00adb1b Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Sat, 24 Jun 2017 09:01:46 +0200
Subject: [PATCH 10/10] messaging: Remove messaging_handler_send
This did not really take off, notifyd was the only user
Signed-off-by: Volker Lendecke <vl at samba.org>
---
source3/include/messages.h | 8 -----
source3/lib/messages.c | 81 ----------------------------------------------
2 files changed, 89 deletions(-)
diff --git a/source3/include/messages.h b/source3/include/messages.h
index 46dc6c0..970dc38 100644
--- a/source3/include/messages.h
+++ b/source3/include/messages.h
@@ -133,14 +133,6 @@ struct tevent_req *messaging_read_send(TALLOC_CTX *mem_ctx,
int messaging_read_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
struct messaging_rec **presult);
-struct tevent_req *messaging_handler_send(
- TALLOC_CTX *mem_ctx, struct tevent_context *ev,
- struct messaging_context *msg_ctx, uint32_t msg_type,
- bool (*handler)(struct messaging_context *msg_ctx,
- struct messaging_rec **rec, void *private_data),
- void *private_data);
-int messaging_handler_recv(struct tevent_req *req);
-
int messaging_cleanup(struct messaging_context *msg_ctx, pid_t pid);
bool messaging_parent_dgm_cleanup_init(struct messaging_context *msg);
diff --git a/source3/lib/messages.c b/source3/lib/messages.c
index da13a1e..b94a696 100644
--- a/source3/lib/messages.c
+++ b/source3/lib/messages.c
@@ -906,87 +906,6 @@ int messaging_read_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
return 0;
}
-struct messaging_handler_state {
- struct tevent_context *ev;
- struct messaging_context *msg_ctx;
- uint32_t msg_type;
- bool (*handler)(struct messaging_context *msg_ctx,
- struct messaging_rec **rec, void *private_data);
- void *private_data;
-};
-
-static void messaging_handler_got_msg(struct tevent_req *subreq);
-
-struct tevent_req *messaging_handler_send(
- TALLOC_CTX *mem_ctx, struct tevent_context *ev,
- struct messaging_context *msg_ctx, uint32_t msg_type,
- bool (*handler)(struct messaging_context *msg_ctx,
- struct messaging_rec **rec, void *private_data),
- void *private_data)
-{
- struct tevent_req *req, *subreq;
- struct messaging_handler_state *state;
-
- req = tevent_req_create(mem_ctx, &state,
- struct messaging_handler_state);
- if (req == NULL) {
- return NULL;
- }
- state->ev = ev;
- state->msg_ctx = msg_ctx;
- state->msg_type = msg_type;
- state->handler = handler;
- state->private_data = private_data;
-
- subreq = messaging_read_send(state, state->ev, state->msg_ctx,
- state->msg_type);
- if (tevent_req_nomem(subreq, req)) {
- return tevent_req_post(req, ev);
- }
- tevent_req_set_callback(subreq, messaging_handler_got_msg, req);
- return req;
-}
-
-static void messaging_handler_got_msg(struct tevent_req *subreq)
-{
- struct tevent_req *req = tevent_req_callback_data(
- subreq, struct tevent_req);
- struct messaging_handler_state *state = tevent_req_data(
- req, struct messaging_handler_state);
- struct messaging_rec *rec;
- int ret;
- bool ok;
-
- ret = messaging_read_recv(subreq, state, &rec);
- TALLOC_FREE(subreq);
- if (tevent_req_error(req, ret)) {
- return;
- }
-
- subreq = messaging_read_send(state, state->ev, state->msg_ctx,
- state->msg_type);
- if (tevent_req_nomem(subreq, req)) {
- return;
- }
- tevent_req_set_callback(subreq, messaging_handler_got_msg, req);
-
- ok = state->handler(state->msg_ctx, &rec, state->private_data);
- TALLOC_FREE(rec);
- if (ok) {
- /*
- * Next round
- */
- return;
- }
- TALLOC_FREE(subreq);
- tevent_req_done(req);
-}
-
-int messaging_handler_recv(struct tevent_req *req)
-{
- return tevent_req_simple_recv_unix(req);
-}
-
static bool messaging_append_new_waiters(struct messaging_context *msg_ctx)
{
if (msg_ctx->num_new_waiters == 0) {
--
2.1.4
More information about the samba-technical
mailing list