diff options
Diffstat (limited to 'source3/lib/messages_local.c')
-rw-r--r-- | source3/lib/messages_local.c | 50 |
1 files changed, 40 insertions, 10 deletions
diff --git a/source3/lib/messages_local.c b/source3/lib/messages_local.c index f82b107bcc..6b63d72925 100644 --- a/source3/lib/messages_local.c +++ b/source3/lib/messages_local.c @@ -45,7 +45,8 @@ #include "includes.h" #include "system/filesys.h" #include "messages.h" -#include "lib/util/tdb_wrap.h" +#include "lib/tdb_wrap/tdb_wrap.h" +#include "lib/param/param.h" struct messaging_tdb_context { struct messaging_context *msg_ctx; @@ -76,6 +77,16 @@ static void messaging_tdb_signal_handler(struct tevent_context *ev_ctx, message_dispatch(ctx->msg_ctx); } +void *messaging_tdb_event(TALLOC_CTX *mem_ctx, struct messaging_context *msg, + struct tevent_context *ev) +{ + struct messaging_tdb_context *msg_tdb = talloc_get_type_abort( + msg->local->private_data, struct messaging_tdb_context); + + return tevent_add_signal(ev, mem_ctx, SIGUSR1, 0, + messaging_tdb_signal_handler, msg_tdb); +} + /**************************************************************************** Initialise the messaging functions. ****************************************************************************/ @@ -86,13 +97,20 @@ NTSTATUS messaging_tdb_init(struct messaging_context *msg_ctx, { struct messaging_backend *result; struct messaging_tdb_context *ctx; + struct loadparm_context *lp_ctx; - if (!(result = TALLOC_P(mem_ctx, struct messaging_backend))) { + if (!(result = talloc(mem_ctx, struct messaging_backend))) { DEBUG(0, ("talloc failed\n")); return NT_STATUS_NO_MEMORY; } - ctx = TALLOC_ZERO_P(result, struct messaging_tdb_context); + lp_ctx = loadparm_init_s3(result, loadparm_s3_helpers()); + if (lp_ctx == NULL) { + DEBUG(0, ("loadparm_init_s3 failed\n")); + return NT_STATUS_INTERNAL_ERROR; + } + + ctx = talloc_zero(result, struct messaging_tdb_context); if (!ctx) { DEBUG(0, ("talloc failed\n")); TALLOC_FREE(result); @@ -105,7 +123,8 @@ NTSTATUS messaging_tdb_init(struct messaging_context *msg_ctx, ctx->tdb = tdb_wrap_open(ctx, lock_path("messages.tdb"), 0, TDB_CLEAR_IF_FIRST|TDB_DEFAULT|TDB_VOLATILE|TDB_INCOMPATIBLE_HASH, - O_RDWR|O_CREAT,0600); + O_RDWR|O_CREAT,0600, lp_ctx); + talloc_unlink(result, lp_ctx); if (!ctx->tdb) { NTSTATUS status = map_nt_error_from_unix(errno); @@ -137,6 +156,13 @@ NTSTATUS messaging_tdb_init(struct messaging_context *msg_ctx, bool messaging_tdb_parent_init(TALLOC_CTX *mem_ctx) { struct tdb_wrap *db; + struct loadparm_context *lp_ctx; + + lp_ctx = loadparm_init_s3(mem_ctx, loadparm_s3_helpers()); + if (lp_ctx == NULL) { + DEBUG(0, ("loadparm_init_s3 failed\n")); + return false; + } /* * Open the tdb in the parent process (smbd) so that our @@ -146,7 +172,8 @@ bool messaging_tdb_parent_init(TALLOC_CTX *mem_ctx) db = tdb_wrap_open(mem_ctx, lock_path("messages.tdb"), 0, TDB_CLEAR_IF_FIRST|TDB_DEFAULT|TDB_VOLATILE|TDB_INCOMPATIBLE_HASH, - O_RDWR|O_CREAT,0600); + O_RDWR|O_CREAT,0600, lp_ctx); + talloc_unlink(mem_ctx, lp_ctx); if (db == NULL) { DEBUG(1, ("could not open messaging.tdb: %s\n", strerror(errno))); @@ -187,7 +214,7 @@ static NTSTATUS messaging_tdb_fetch(TDB_CONTEXT *msg_tdb, DATA_BLOB blob; enum ndr_err_code ndr_err; - if (!(result = TALLOC_ZERO_P(mem_ctx, struct messaging_array))) { + if (!(result = talloc_zero(mem_ctx, struct messaging_array))) { return NT_STATUS_NO_MEMORY; } @@ -200,7 +227,7 @@ static NTSTATUS messaging_tdb_fetch(TDB_CONTEXT *msg_tdb, blob = data_blob_const(data.dptr, data.dsize); - ndr_err = ndr_pull_struct_blob( + ndr_err = ndr_pull_struct_blob_all( &blob, result, result, (ndr_pull_flags_fn_t)ndr_pull_messaging_array); @@ -282,6 +309,9 @@ static NTSTATUS message_notify(struct server_id procid) */ SMB_ASSERT(pid > 0); + if (pid <= 0) { + return NT_STATUS_INVALID_HANDLE; + } if (euid != 0) { /* If we're not root become so to send the message. */ @@ -352,7 +382,7 @@ static NTSTATUS messaging_tdb_send(struct messaging_context *msg_ctx, key = message_key_pid(frame, pid); - if (tdb_chainlock(tdb->tdb, key) == -1) { + if (tdb_chainlock(tdb->tdb, key) != 0) { TALLOC_FREE(frame); return NT_STATUS_LOCK_NOT_GRANTED; } @@ -371,7 +401,7 @@ static NTSTATUS messaging_tdb_send(struct messaging_context *msg_ctx, goto done; } - if (!(rec = TALLOC_REALLOC_ARRAY(talloc_tos(), msg_array->messages, + if (!(rec = talloc_realloc(talloc_tos(), msg_array->messages, struct messaging_rec, msg_array->num_messages+1))) { status = NT_STATUS_NO_MEMORY; @@ -420,7 +450,7 @@ static NTSTATUS retrieve_all_messages(TDB_CONTEXT *msg_tdb, TDB_DATA key = message_key_pid(mem_ctx, id); NTSTATUS status; - if (tdb_chainlock(msg_tdb, key) == -1) { + if (tdb_chainlock(msg_tdb, key) != 0) { TALLOC_FREE(key.dptr); return NT_STATUS_LOCK_NOT_GRANTED; } |