void *private_data;
};
+struct messaging_dgm_context;
int messaging_dgm_init(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
struct server_id pid,
- struct messaging_backend **presult,
void (*recv_cb)(int msg_type,
struct server_id src,
struct server_id dst,
const uint8_t *msg,
size_t msg_len,
void *private_data),
- void *recv_cb_private_data);
-int messaging_dgm_cleanup(struct messaging_context *msg_ctx, pid_t pid);
-int messaging_dgm_wipe(struct messaging_context *msg_ctx);
+ void *recv_cb_private_data,
+ struct messaging_dgm_context **pctx);
+int messaging_dgm_send(struct messaging_dgm_context *ctx,
+ struct server_id src, struct server_id pid,
+ int msg_type, const struct iovec *iov, int iovlen);
+int messaging_dgm_cleanup(struct messaging_dgm_context *ctx, pid_t pid);
+int messaging_dgm_wipe(struct messaging_dgm_context *ctx);
void *messaging_dgm_register_tevent_context(TALLOC_CTX *mem_ctx,
- struct messaging_context *msg_ctx,
+ struct messaging_dgm_context *ctx,
struct tevent_context *ev);
NTSTATUS messaging_ctdbd_init(struct messaging_context *msg_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
struct tevent_req **waiters;
unsigned num_waiters;
- struct messaging_backend *local;
+ struct messaging_dgm_context *local;
+
struct messaging_backend *remote;
bool *have_context;
ctx->have_context = &have_context;
ret = messaging_dgm_init(ctx, ctx->event_ctx, ctx->id,
- &ctx->local, messaging_recv_cb, ctx);
+ messaging_recv_cb, ctx, &ctx->local);
if (ret != 0) {
DEBUG(2, ("messaging_dgm_init failed: %s\n", strerror(ret)));
msg_ctx->id = procid_self();
ret = messaging_dgm_init(msg_ctx, msg_ctx->event_ctx,
- msg_ctx->id, &msg_ctx->local,
- messaging_recv_cb, msg_ctx);
+ msg_ctx->id, 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);
return NT_STATUS_OK;
}
- ret = msg_ctx->local->send_fn(msg_ctx->id, server, msg_type,
- iov, iovlen, msg_ctx->local);
+ ret = messaging_dgm_send(msg_ctx->local, msg_ctx->id, server, msg_type,
+ iov, iovlen);
if (ret != 0) {
return map_nt_error_from_unix(ret);
}
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);
}
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",
int ret;
if (pid == 0) {
- ret = messaging_dgm_wipe(msg_ctx);
+ ret = messaging_dgm_wipe(msg_ctx->local);
} else {
- ret = messaging_dgm_cleanup(msg_ctx, pid);
+ ret = messaging_dgm_cleanup(msg_ctx->local, pid);
}
return ret;
}
-struct messaging_backend *messaging_local_backend(
- struct messaging_context *msg_ctx)
-{
- return msg_ctx->local;
-}
-
struct tevent_context *messaging_tevent_context(
struct messaging_context *msg_ctx)
{
struct server_id src;
};
-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);
int messaging_dgm_init(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
struct server_id pid,
- struct messaging_backend **presult,
void (*recv_cb)(int msg_type,
struct server_id src,
struct server_id dst,
const uint8_t *msg,
size_t msg_len,
void *private_data),
- void *recv_cb_private_data)
+ void *recv_cb_private_data,
+ struct messaging_dgm_context **pctx)
{
- struct messaging_backend *result;
struct messaging_dgm_context *ctx;
int ret;
bool ok;
return errno;
}
- 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->pid = pid;
-
ctx->recv_cb = recv_cb;
ctx->recv_cb_private_data = recv_cb_private_data;
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;
}
if (ret != 0) {
DEBUG(1, ("%s: messaging_dgm_create_lockfile failed: %s\n",
__func__, strerror(ret)));
- TALLOC_FREE(result);
+ TALLOC_FREE(ctx);
return ret;
}
0700);
if (!ok) {
DEBUG(1, ("Could not create socket directory\n"));
- TALLOC_FREE(result);
+ TALLOC_FREE(ctx);
return EACCES;
}
TALLOC_FREE(socket_dir);
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;
+ *pctx = ctx;
return 0;
fail_nomem:
- TALLOC_FREE(result);
+ TALLOC_FREE(ctx);
return ENOMEM;
}
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,
+ struct server_id src, struct server_id pid,
+ int msg_type, 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;
dgm_ctx->recv_cb_private_data);
}
-int messaging_dgm_cleanup(struct messaging_context *msg_ctx, pid_t pid)
+int messaging_dgm_cleanup(struct messaging_dgm_context *ctx, pid_t pid)
{
- struct messaging_backend *be = messaging_local_backend(msg_ctx);
- struct messaging_dgm_context *ctx = talloc_get_type_abort(
- be->private_data, struct messaging_dgm_context);
char *lockfile_name, *socket_name;
int fd, ret;
struct flock lck = {};
return 0;
}
-int messaging_dgm_wipe(struct messaging_context *msg_ctx)
+int messaging_dgm_wipe(struct messaging_dgm_context *ctx)
{
- struct messaging_backend *be = messaging_local_backend(msg_ctx);
- struct messaging_dgm_context *ctx = talloc_get_type_abort(
- be->private_data, struct messaging_dgm_context);
char *msgdir_name;
DIR *msgdir;
struct dirent *dp;
continue;
}
- ret = messaging_dgm_cleanup(msg_ctx, pid);
+ ret = messaging_dgm_cleanup(ctx, pid);
DEBUG(10, ("messaging_dgm_cleanup(%lu) returned %s\n",
pid, ret ? strerror(ret) : "ok"));
}
}
void *messaging_dgm_register_tevent_context(TALLOC_CTX *mem_ctx,
- struct messaging_context *msg_ctx,
+ struct messaging_dgm_context *ctx,
struct tevent_context *ev)
{
- struct messaging_backend *be = messaging_local_backend(msg_ctx);
- struct messaging_dgm_context *ctx = talloc_get_type_abort(
- be->private_data, struct messaging_dgm_context);
return poll_funcs_tevent_register(mem_ctx, ctx->msg_callbacks, ev);
}