summaryrefslogtreecommitdiffstats
path: root/source3/lib/messages_local.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/lib/messages_local.c')
-rw-r--r--source3/lib/messages_local.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/source3/lib/messages_local.c b/source3/lib/messages_local.c
index 6b9c251cbb..4f8d81c8bf 100644
--- a/source3/lib/messages_local.c
+++ b/source3/lib/messages_local.c
@@ -53,6 +53,7 @@ struct messaging_tdb_context {
struct tdb_wrap *tdb;
struct tevent_signal *se;
int received_messages;
+ bool *have_context;
};
static NTSTATUS messaging_tdb_send(struct messaging_context *msg_ctx,
@@ -77,6 +78,8 @@ static void messaging_tdb_signal_handler(struct tevent_context *ev_ctx,
message_dispatch(ctx->msg_ctx);
}
+static int messaging_tdb_context_destructor(struct messaging_tdb_context *ctx);
+
/****************************************************************************
Initialise the messaging functions.
****************************************************************************/
@@ -88,6 +91,12 @@ NTSTATUS messaging_tdb_init(struct messaging_context *msg_ctx,
struct messaging_backend *result;
struct messaging_tdb_context *ctx;
struct loadparm_context *lp_ctx;
+ static bool have_context = false;
+
+ if (have_context) {
+ DEBUG(0, ("No two messaging contexts per process\n"));
+ return NT_STATUS_OBJECT_NAME_COLLISION;
+ }
if (!(result = talloc(mem_ctx, struct messaging_backend))) {
DEBUG(0, ("talloc failed\n"));
@@ -110,6 +119,7 @@ NTSTATUS messaging_tdb_init(struct messaging_context *msg_ctx,
result->send_fn = messaging_tdb_send;
ctx->msg_ctx = msg_ctx;
+ ctx->have_context = &have_context;
ctx->tdb = tdb_wrap_open(ctx, lock_path("messages.tdb"), 0,
TDB_CLEAR_IF_FIRST|TDB_DEFAULT|TDB_VOLATILE|TDB_INCOMPATIBLE_HASH,
@@ -139,10 +149,20 @@ NTSTATUS messaging_tdb_init(struct messaging_context *msg_ctx,
sec_init();
+ have_context = true;
+ talloc_set_destructor(ctx, messaging_tdb_context_destructor);
+
*presult = result;
return NT_STATUS_OK;
}
+static int messaging_tdb_context_destructor(struct messaging_tdb_context *ctx)
+{
+ SMB_ASSERT(*ctx->have_context);
+ *ctx->have_context = false;
+ return 0;
+}
+
bool messaging_tdb_parent_init(TALLOC_CTX *mem_ctx)
{
struct tdb_wrap *db;