[SCM] Samba Shared Repository - branch master updated
Jeremy Allison
jra at samba.org
Mon Aug 11 18:22:04 MDT 2014
The branch, master has been updated
via c2f66e7 messaging3: Include messages_dgm.h only in messages.c
via 121d3dd messaging3: Move messaging_hdr handling to messages.c.
via bff27ee messaging3: Only store the pid in messaging_dgm_context
via 6e63420 messaging3: Save 48 bytes .text
via 90a2246 messaging3: Remove one-context protection from messages.c
via d22bb34 messaging3: Protect messaging_dgm against multiple contexts
via a1529c3 messaging3: Add messages_dgm.h
via 274998f messaging3: Pass on msg_type unmasked
via ea5280e messaging3: I don't see 2 versions running concurrently...
via a0efa09 messaging3: Avoid "enum messaging_type" in messages_dgm
via bab01d1 messaging3: Pass dir_owner to messaging_dgm_init()
via f408a42 messaging3: Pass cache_dir to messaging_dgm_init()
via 99e288c messaging3: Move [un]become_root() calls out of messaging_dgm_send()
via 7c6a6cd messaging3: Move sec_init() call out of messaging_dgm_init()
via 3aa3c6e messaging3: Directly refer to messaging_dgm in messages.c
via 28db680 smbd: Use messaging_cleanup()
via 32d45cf messaging3: Add messaging_cleanup
via dcd3e2f messaging_dgm: Remove unused "messaging_context"
via 7cb94e6 messaging3: Explicitly pass server_id to messaging_dgm_init
via 706ba59 messaging3: Explicitly pass tevent_context to messaging_dgm_init
via 371e999 messaging_dgm: Receive through a cb function
from 42e1556 smbd: Add debugs to smbXsrv_open.c
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit c2f66e71aaf6f31f177ea53686cf30438e292b23
Author: Volker Lendecke <vl at samba.org>
Date: Sun Jul 27 12:31:21 2014 +0200
messaging3: Include messages_dgm.h only in messages.c
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
Autobuild-User(master): Jeremy Allison <jra at samba.org>
Autobuild-Date(master): Tue Aug 12 02:21:32 CEST 2014 on sn-devel-104
commit 121d3ddce66053c8e00983d95f2689a64baf06c8
Author: Volker Lendecke <vl at samba.org>
Date: Sun Jul 27 12:29:26 2014 +0200
messaging3: Move messaging_hdr handling to messages.c.
This makes messages_dgm a simple byte-transport across processes that
knows almost nothing about server_id etc.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit bff27ee7837861d8c3fd8fef7ed7411944be575b
Author: Volker Lendecke <vl at samba.org>
Date: Fri Jul 25 11:03:11 2014 +0000
messaging3: Only store the pid in messaging_dgm_context
That's all we need here
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 6e6342055a74e5cc4a630821c2e0ac207a5b44ae
Author: Volker Lendecke <vl at samba.org>
Date: Fri Jul 25 10:42:19 2014 +0000
messaging3: Save 48 bytes .text
commit 90a2246aac4a441ffc2ff6c5165c6de4c2c4123f
Author: Volker Lendecke <vl at samba.org>
Date: Sat Aug 9 17:18:04 2014 +0200
messaging3: Remove one-context protection from messages.c
messages_dgm.c takes care of it.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit d22bb34b7308794b721af7c62f3682b37d997f6b
Author: Volker Lendecke <vl at samba.org>
Date: Sun Jul 20 14:51:47 2014 +0200
messaging3: Protect messaging_dgm against multiple contexts
We can't rely on posix locking within a process
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit a1529c3302656fad3daf1247141a987d36801066
Author: Volker Lendecke <vl at samba.org>
Date: Thu Jul 17 11:57:51 2014 +0000
messaging3: Add messages_dgm.h
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 274998fb89e9225db5549e8a6500cbe982e84c42
Author: Volker Lendecke <vl at samba.org>
Date: Thu Jul 17 11:56:18 2014 +0000
messaging3: Pass on msg_type unmasked
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit ea5280e856b46bfef4de950a795daa26bd777387
Author: Volker Lendecke <vl at samba.org>
Date: Thu Jul 17 11:55:33 2014 +0000
messaging3: I don't see 2 versions running concurrently...
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit a0efa091464930e21a0dfcd398f582c32492acf5
Author: Volker Lendecke <vl at samba.org>
Date: Thu Jul 17 11:51:13 2014 +0000
messaging3: Avoid "enum messaging_type" in messages_dgm
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit bab01d1a89c51a1c9ff1bc80bcabf840d5f0308f
Author: Volker Lendecke <vl at samba.org>
Date: Thu Jul 17 11:47:32 2014 +0000
messaging3: Pass dir_owner to messaging_dgm_init()
commit f408a428962e6b7ccbbe580ac853cbba283b3c8f
Author: Volker Lendecke <vl at samba.org>
Date: Thu Jul 17 11:38:36 2014 +0000
messaging3: Pass cache_dir to messaging_dgm_init()
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 99e288c22b8b1136ec639145f156527a44811e64
Author: Volker Lendecke <vl at samba.org>
Date: Thu Jul 17 11:34:24 2014 +0000
messaging3: Move [un]become_root() calls out of messaging_dgm_send()
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 7c6a6cd5c8d4e561cb11bf37267295abaf9ed9d6
Author: Volker Lendecke <vl at samba.org>
Date: Thu Jul 17 11:33:26 2014 +0000
messaging3: Move sec_init() call out of messaging_dgm_init()
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 3aa3c6ed012dd344cbc91ac49870c6adc4c3d891
Author: Volker Lendecke <vl at samba.org>
Date: Thu Jul 17 11:23:46 2014 +0000
messaging3: Directly refer to messaging_dgm in messages.c
This removes the messaging_backend abstraction layer from messages_dgm.c. That
layer was introduced for ctdb and is still used there. But as the messaging_dgm
interface is very slim anyway, I don't think directly calling it is too bad.
Why this commit? It is another step towards making messages_dgm
independent of messages.[ch], thus it might become usable in other
contexts like ctdb and source4
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 28db680a0df9ce4329668d50ce7ba6d5a7c29761
Author: Volker Lendecke <vl at samba.org>
Date: Thu Jul 17 11:05:02 2014 +0000
smbd: Use messaging_cleanup()
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 32d45cf2f3a0d709f35560f9cc119438a0a5b397
Author: Volker Lendecke <vl at samba.org>
Date: Thu Jul 17 11:01:00 2014 +0000
messaging3: Add messaging_cleanup
Rename smbcontrol's dgm-cleanup to msg-cleanup. We haven't published
this UI yet :-)
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit dcd3e2f2dc43875aec0448d74b2e040290338426
Author: Volker Lendecke <vl at samba.org>
Date: Thu Jul 17 09:58:50 2014 +0000
messaging_dgm: Remove unused "messaging_context"
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 7cb94e686075b9815ca645af4f82d094f91c8573
Author: Volker Lendecke <vl at samba.org>
Date: Thu Jul 17 09:56:39 2014 +0000
messaging3: Explicitly pass server_id to messaging_dgm_init
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 706ba593d672775c28b6dfa4bd65fdd1e5a6fb4a
Author: Volker Lendecke <vl at samba.org>
Date: Thu Jul 17 09:52:28 2014 +0000
messaging3: Explicitly pass tevent_context to messaging_dgm_init
One dependency less on messaging_context()
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 371e99959cf8c02b3a4e7b6352ed83f1d8b9200d
Author: Volker Lendecke <vl at samba.org>
Date: Thu Jul 17 09:44:41 2014 +0000
messaging_dgm: Receive through a cb function
This avoids calling messaging_dispatch_rec directly from messaging_dgm.c
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
-----------------------------------------------------------------------
Summary of changes:
source3/include/messages.h | 13 +---
source3/lib/messages.c | 109 +++++++++++++++++++--------
source3/lib/messages_dgm.c | 179 +++++++++++++++-----------------------------
source3/lib/messages_dgm.h | 42 ++++++++++
source3/smbd/server.c | 4 +-
source3/utils/smbcontrol.c | 10 +--
6 files changed, 188 insertions(+), 169 deletions(-)
create mode 100644 source3/lib/messages_dgm.h
Changeset truncated at 500 lines:
diff --git a/source3/include/messages.h b/source3/include/messages.h
index b718dd7..7543301 100644
--- a/source3/include/messages.h
+++ b/source3/include/messages.h
@@ -73,15 +73,6 @@ struct messaging_backend {
void *private_data;
};
-int messaging_dgm_init(struct messaging_context *msg_ctx,
- TALLOC_CTX *mem_ctx,
- struct messaging_backend **presult);
-int messaging_dgm_cleanup(struct messaging_context *msg_ctx, pid_t pid);
-int messaging_dgm_wipe(struct messaging_context *msg_ctx);
-void *messaging_dgm_register_tevent_context(TALLOC_CTX *mem_ctx,
- struct messaging_context *msg_ctx,
- struct tevent_context *ev);
-
NTSTATUS messaging_ctdbd_init(struct messaging_context *msg_ctx,
TALLOC_CTX *mem_ctx,
struct messaging_backend **presult);
@@ -97,8 +88,6 @@ struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx,
struct server_id messaging_server_id(const struct messaging_context *msg_ctx);
struct tevent_context *messaging_tevent_context(
struct messaging_context *msg_ctx);
-struct messaging_backend *messaging_local_backend(
- struct messaging_context *msg_ctx);
/*
* re-init after a fork
@@ -143,6 +132,8 @@ 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);
+int messaging_cleanup(struct messaging_context *msg_ctx, pid_t pid);
+
bool messaging_parent_dgm_cleanup_init(struct messaging_context *msg);
#include "librpc/gen_ndr/ndr_messaging.h"
diff --git a/source3/lib/messages.c b/source3/lib/messages.c
index bbc5183..25d3f01 100644
--- a/source3/lib/messages.c
+++ b/source3/lib/messages.c
@@ -51,6 +51,7 @@
#include "messages.h"
#include "lib/util/tevent_unix.h"
#include "lib/background.h"
+#include "lib/messages_dgm.h"
struct messaging_callback {
struct messaging_callback *prev, *next;
@@ -72,13 +73,16 @@ struct messaging_context {
struct tevent_req **waiters;
unsigned num_waiters;
- struct messaging_backend *local;
- struct messaging_backend *remote;
+ struct messaging_dgm_context *local;
- bool *have_context;
+ struct messaging_backend *remote;
};
-static int messaging_context_destructor(struct messaging_context *msg_ctx);
+struct messaging_hdr {
+ int msg_type;
+ struct server_id dst;
+ struct server_id src;
+};
/****************************************************************************
A useful function for testing the message system.
@@ -201,19 +205,47 @@ bool message_send_all(struct messaging_context *msg_ctx,
return true;
}
+static void messaging_recv_cb(const uint8_t *msg, size_t msg_len,
+ void *private_data)
+{
+ struct messaging_context *msg_ctx = talloc_get_type_abort(
+ private_data, struct messaging_context);
+ const struct messaging_hdr *hdr;
+ struct server_id_buf idbuf;
+ struct messaging_rec rec;
+
+ if (msg_len < sizeof(*hdr)) {
+ DEBUG(1, ("message too short: %u\n", (unsigned)msg_len));
+ return;
+ }
+
+ /*
+ * messages_dgm guarantees alignment, so we can cast here
+ */
+ hdr = (const struct messaging_hdr *)msg;
+
+ DEBUG(10, ("%s: Received message 0x%x len %u from %s\n", __func__,
+ (unsigned)hdr->msg_type, (unsigned)(msg_len - sizeof(*hdr)),
+ server_id_str_buf(hdr->src, &idbuf)));
+
+ rec = (struct messaging_rec) {
+ .msg_version = MESSAGE_VERSION,
+ .msg_type = hdr->msg_type,
+ .src = hdr->src,
+ .dest = hdr->dst,
+ .buf.data = discard_const_p(uint8, msg) + sizeof(*hdr),
+ .buf.length = msg_len - sizeof(*hdr)
+ };
+
+ messaging_dispatch_rec(msg_ctx, &rec);
+}
+
struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx,
struct tevent_context *ev)
{
struct messaging_context *ctx;
NTSTATUS status;
int ret;
- static bool have_context = false;
-
- if (have_context) {
- DEBUG(0, ("No two messaging contexts per process\n"));
- return NULL;
- }
-
if (!(ctx = talloc_zero(mem_ctx, struct messaging_context))) {
return NULL;
@@ -221,9 +253,12 @@ struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx,
ctx->id = procid_self();
ctx->event_ctx = ev;
- ctx->have_context = &have_context;
- ret = messaging_dgm_init(ctx, ctx, &ctx->local);
+ sec_init();
+
+ ret = messaging_dgm_init(ctx, ctx->event_ctx, ctx->id,
+ lp_cache_directory(), sec_initial_uid(),
+ messaging_recv_cb, ctx, &ctx->local);
if (ret != 0) {
DEBUG(2, ("messaging_dgm_init failed: %s\n", strerror(ret)));
@@ -251,19 +286,9 @@ struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx,
register_dmalloc_msgs(ctx);
debug_register_msgs(ctx);
- have_context = true;
- talloc_set_destructor(ctx, messaging_context_destructor);
-
return ctx;
}
-static int messaging_context_destructor(struct messaging_context *msg_ctx)
-{
- SMB_ASSERT(*msg_ctx->have_context);
- *msg_ctx->have_context = false;
- return 0;
-}
-
struct server_id messaging_server_id(const struct messaging_context *msg_ctx)
{
return msg_ctx->id;
@@ -281,7 +306,10 @@ NTSTATUS messaging_reinit(struct messaging_context *msg_ctx)
msg_ctx->id = procid_self();
- ret = messaging_dgm_init(msg_ctx, msg_ctx, &msg_ctx->local);
+ ret = messaging_dgm_init(msg_ctx, msg_ctx->event_ctx, msg_ctx->id,
+ lp_cache_directory(), sec_initial_uid(),
+ messaging_recv_cb, msg_ctx,
+ &msg_ctx->local);
if (ret != 0) {
DEBUG(0, ("messaging_dgm_init failed: %s\n", strerror(errno)));
return map_nt_error_from_unix(ret);
@@ -410,6 +438,8 @@ NTSTATUS messaging_send_iov(struct messaging_context *msg_ctx,
const struct iovec *iov, int iovlen)
{
int ret;
+ struct messaging_hdr hdr;
+ struct iovec iov2[iovlen+1];
if (server_id_is_disconnected(&server)) {
return NT_STATUS_INVALID_PARAMETER_MIX;
@@ -444,8 +474,18 @@ NTSTATUS messaging_send_iov(struct messaging_context *msg_ctx,
return NT_STATUS_OK;
}
- ret = msg_ctx->local->send_fn(msg_ctx->id, server, msg_type,
- iov, iovlen, msg_ctx->local);
+ hdr = (struct messaging_hdr) {
+ .msg_type = msg_type,
+ .dst = server,
+ .src = msg_ctx->id
+ };
+ iov2[0] = (struct iovec){ .iov_base = &hdr, .iov_len = sizeof(hdr) };
+ memcpy(&iov2[1], iov, iovlen * sizeof(*iov));
+
+ become_root();
+ ret = messaging_dgm_send(msg_ctx->local, server.pid, iov2, iovlen+1);
+ unbecome_root();
+
if (ret != 0) {
return map_nt_error_from_unix(ret);
}
@@ -512,7 +552,7 @@ struct tevent_req *messaging_filtered_read_send(
tevent_req_defer_callback(req, state->ev);
state->tevent_handle = messaging_dgm_register_tevent_context(
- state, msg_ctx, ev);
+ state, msg_ctx->local, ev);
if (tevent_req_nomem(state, req)) {
return tevent_req_post(req, ev);
}
@@ -875,7 +915,7 @@ static int mess_parent_dgm_cleanup(void *private_data)
private_data, struct messaging_context);
int ret;
- ret = messaging_dgm_wipe(msg_ctx);
+ ret = messaging_dgm_wipe(msg_ctx->local);
DEBUG(10, ("messaging_dgm_wipe returned %s\n",
ret ? strerror(ret) : "ok"));
return lp_parm_int(-1, "messaging", "messaging dgm cleanup interval",
@@ -904,10 +944,17 @@ static void mess_parent_dgm_cleanup_done(struct tevent_req *req)
tevent_req_set_callback(req, mess_parent_dgm_cleanup_done, msg);
}
-struct messaging_backend *messaging_local_backend(
- struct messaging_context *msg_ctx)
+int messaging_cleanup(struct messaging_context *msg_ctx, pid_t pid)
{
- return msg_ctx->local;
+ int ret;
+
+ if (pid == 0) {
+ ret = messaging_dgm_wipe(msg_ctx->local);
+ } else {
+ ret = messaging_dgm_cleanup(msg_ctx->local, pid);
+ }
+
+ return ret;
}
struct tevent_context *messaging_tevent_context(
diff --git a/source3/lib/messages_dgm.c b/source3/lib/messages_dgm.c
index df34d53..2c43ec3 100644
--- a/source3/lib/messages_dgm.c
+++ b/source3/lib/messages_dgm.c
@@ -22,32 +22,27 @@
#include "lib/util/debug.h"
#include "lib/unix_msg/unix_msg.h"
#include "system/filesys.h"
-#include "messages.h"
+#include "lib/messages_dgm.h"
#include "lib/param/param.h"
#include "poll_funcs/poll_funcs_tevent.h"
#include "unix_msg/unix_msg.h"
-#include "librpc/gen_ndr/messaging.h"
struct messaging_dgm_context {
- struct messaging_context *msg_ctx;
+ pid_t pid;
struct poll_funcs *msg_callbacks;
void *tevent_handle;
struct unix_msg_ctx *dgm_ctx;
char *cache_dir;
int lockfile_fd;
-};
-struct messaging_dgm_hdr {
- uint32_t msg_version;
- enum messaging_type msg_type;
- struct server_id dst;
- struct server_id src;
+ void (*recv_cb)(const uint8_t *msg,
+ size_t msg_len,
+ void *private_data);
+ void *recv_cb_private_data;
+
+ bool *have_dgm_context;
};
-static int messaging_dgm_send(struct server_id src,
- struct server_id pid, int msg_type,
- const struct iovec *iov, int iovlen,
- struct messaging_backend *backend);
static void messaging_dgm_recv(struct unix_msg_ctx *ctx,
uint8_t *msg, size_t msg_len,
void *private_data);
@@ -55,14 +50,15 @@ static void messaging_dgm_recv(struct unix_msg_ctx *ctx,
static int messaging_dgm_context_destructor(struct messaging_dgm_context *c);
static int messaging_dgm_lockfile_create(TALLOC_CTX *tmp_ctx,
- const char *cache_dir, pid_t pid,
+ const char *cache_dir,
+ uid_t dir_owner, pid_t pid,
int *plockfile_fd, uint64_t unique)
{
fstring buf;
char *dir;
char *lockfile_name;
int lockfile_fd;
- struct flock lck = {};
+ struct flock lck;
int unique_len, ret;
ssize_t written;
bool ok;
@@ -72,7 +68,7 @@ static int messaging_dgm_lockfile_create(TALLOC_CTX *tmp_ctx,
return ENOMEM;
}
- ok = directory_create_or_exist_strict(dir, sec_initial_uid(), 0755);
+ ok = directory_create_or_exist_strict(dir, dir_owner, 0755);
if (!ok) {
ret = errno;
DEBUG(1, ("%s: Could not create lock directory: %s\n",
@@ -98,10 +94,10 @@ static int messaging_dgm_lockfile_create(TALLOC_CTX *tmp_ctx,
goto fail_free;
}
- lck.l_type = F_WRLCK;
- lck.l_whence = SEEK_SET;
- lck.l_start = 0;
- lck.l_len = 0;
+ lck = (struct flock) {
+ .l_type = F_WRLCK,
+ .l_whence = SEEK_SET
+ };
ret = fcntl(lockfile_fd, F_SETLK, &lck);
if (ret == -1) {
@@ -165,38 +161,37 @@ static int messaging_dgm_lockfile_remove(TALLOC_CTX *tmp_ctx,
return ret;
}
-int messaging_dgm_init(struct messaging_context *msg_ctx,
- TALLOC_CTX *mem_ctx,
- struct messaging_backend **presult)
+int messaging_dgm_init(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct server_id pid,
+ const char *cache_dir,
+ uid_t dir_owner,
+ void (*recv_cb)(const uint8_t *msg,
+ size_t msg_len,
+ void *private_data),
+ void *recv_cb_private_data,
+ struct messaging_dgm_context **pctx)
{
- struct messaging_backend *result;
struct messaging_dgm_context *ctx;
- struct server_id pid = messaging_server_id(msg_ctx);
int ret;
bool ok;
- const char *cache_dir;
char *socket_dir;
struct sockaddr_un socket_address;
size_t sockname_len;
uint64_t cookie;
+ static bool have_dgm_context = false;
- cache_dir = lp_cache_directory();
- if (cache_dir == NULL) {
- return errno;
+ if (have_dgm_context) {
+ return EEXIST;
}
- result = talloc(mem_ctx, struct messaging_backend);
- if (result == NULL) {
- goto fail_nomem;
- }
- ctx = talloc_zero(result, struct messaging_dgm_context);
+ ctx = talloc_zero(mem_ctx, struct messaging_dgm_context);
if (ctx == NULL) {
goto fail_nomem;
}
-
- result->private_data = ctx;
- result->send_fn = messaging_dgm_send;
- ctx->msg_ctx = msg_ctx;
+ ctx->pid = pid.pid;
+ ctx->recv_cb = recv_cb;
+ ctx->recv_cb_private_data = recv_cb_private_data;
ctx->cache_dir = talloc_strdup(ctx, cache_dir);
if (ctx->cache_dir == NULL) {
@@ -212,18 +207,16 @@ int messaging_dgm_init(struct messaging_context *msg_ctx,
sizeof(socket_address.sun_path),
"%s/%u", socket_dir, (unsigned)pid.pid);
if (sockname_len >= sizeof(socket_address.sun_path)) {
- TALLOC_FREE(result);
+ TALLOC_FREE(ctx);
return ENAMETOOLONG;
}
- sec_init();
-
- ret = messaging_dgm_lockfile_create(ctx, cache_dir, pid.pid,
+ ret = messaging_dgm_lockfile_create(ctx, cache_dir, dir_owner, pid.pid,
&ctx->lockfile_fd, pid.unique_id);
if (ret != 0) {
DEBUG(1, ("%s: messaging_dgm_create_lockfile failed: %s\n",
__func__, strerror(ret)));
- TALLOC_FREE(result);
+ TALLOC_FREE(ctx);
return ret;
}
@@ -233,17 +226,15 @@ int messaging_dgm_init(struct messaging_context *msg_ctx,
}
ctx->tevent_handle = poll_funcs_tevent_register(
- ctx, ctx->msg_callbacks,
- messaging_tevent_context(msg_ctx));
+ ctx, ctx->msg_callbacks, ev);
if (ctx->tevent_handle == NULL) {
goto fail_nomem;
}
- ok = directory_create_or_exist_strict(socket_dir, sec_initial_uid(),
- 0700);
+ ok = directory_create_or_exist_strict(socket_dir, dir_owner, 0700);
if (!ok) {
DEBUG(1, ("Could not create socket directory\n"));
- TALLOC_FREE(result);
+ TALLOC_FREE(ctx);
return EACCES;
}
TALLOC_FREE(socket_dir);
@@ -256,46 +247,44 @@ int messaging_dgm_init(struct messaging_context *msg_ctx,
messaging_dgm_recv, ctx, &ctx->dgm_ctx);
if (ret != 0) {
DEBUG(1, ("unix_msg_init failed: %s\n", strerror(ret)));
- TALLOC_FREE(result);
+ TALLOC_FREE(ctx);
return ret;
}
talloc_set_destructor(ctx, messaging_dgm_context_destructor);
- *presult = result;
+ ctx->have_dgm_context = &have_dgm_context;
+
+ *pctx = ctx;
return 0;
fail_nomem:
- TALLOC_FREE(result);
+ TALLOC_FREE(ctx);
return ENOMEM;
}
static int messaging_dgm_context_destructor(struct messaging_dgm_context *c)
{
- struct server_id pid = messaging_server_id(c->msg_ctx);
-
/*
* First delete the socket to avoid races. The lockfile is the
* indicator that we're still around.
*/
unix_msg_free(c->dgm_ctx);
- if (getpid() == pid.pid) {
- (void)messaging_dgm_lockfile_remove(c, c->cache_dir, pid.pid);
+ if (getpid() == c->pid) {
+ (void)messaging_dgm_lockfile_remove(c, c->cache_dir, c->pid);
}
close(c->lockfile_fd);
+
+ if (c->have_dgm_context != NULL) {
+ *c->have_dgm_context = false;
+ }
+
return 0;
}
-static int messaging_dgm_send(struct server_id src,
- struct server_id pid, int msg_type,
- const struct iovec *iov, int iovlen,
- struct messaging_backend *backend)
+int messaging_dgm_send(struct messaging_dgm_context *ctx, pid_t pid,
+ const struct iovec *iov, int iovlen)
{
- struct messaging_dgm_context *ctx = talloc_get_type_abort(
- backend->private_data, struct messaging_dgm_context);
- struct messaging_dgm_hdr hdr;
- struct iovec iov2[iovlen + 1];
- struct server_id_buf idbuf;
struct sockaddr_un dst;
ssize_t dst_pathlen;
int ret;
@@ -303,27 +292,14 @@ static int messaging_dgm_send(struct server_id src,
dst = (struct sockaddr_un) { .sun_family = AF_UNIX };
dst_pathlen = snprintf(dst.sun_path, sizeof(dst.sun_path),
- "%s/msg/%u", ctx->cache_dir, (unsigned)pid.pid);
+ "%s/msg/%u", ctx->cache_dir, (unsigned)pid);
if (dst_pathlen >= sizeof(dst.sun_path)) {
return ENAMETOOLONG;
}
- hdr.msg_version = MESSAGE_VERSION;
--
Samba Shared Repository
More information about the samba-cvs
mailing list