ctx->id = (struct server_id) {
.pid = getpid(), .vnn = NONCLUSTER_VNN
};
- ctx->id.unique_id = serverid_get_random_unique_id();
ctx->event_ctx = ev;
}
ctx->msg_dgm_ref = messaging_dgm_ref(
- ctx, ctx->event_ctx, ctx->id.unique_id,
+ ctx, ctx->event_ctx, &ctx->id.unique_id,
priv_path, lck_path, messaging_recv_cb, ctx, &ret);
if (ctx->msg_dgm_ref == NULL) {
msg_ctx->id = (struct server_id) {
.pid = getpid(), .vnn = msg_ctx->id.vnn
};
- msg_ctx->id.unique_id = serverid_get_random_unique_id();
msg_ctx->msg_dgm_ref = messaging_dgm_ref(
- msg_ctx, msg_ctx->event_ctx, msg_ctx->id.unique_id,
+ msg_ctx, msg_ctx->event_ctx, &msg_ctx->id.unique_id,
private_path("msg.sock"), lock_path("msg.lock"),
messaging_recv_cb, msg_ctx, &ret);
#include "lib/param/param.h"
#include "poll_funcs/poll_funcs_tevent.h"
#include "unix_msg/unix_msg.h"
+#include "lib/util/genrand.h"
struct sun_path_buf {
/*
static int messaging_dgm_lockfile_create(struct messaging_dgm_context *ctx,
pid_t pid, int *plockfile_fd,
- uint64_t unique)
+ uint64_t *punique)
{
char buf[64];
int lockfile_fd;
struct sun_path_buf lockfile_name;
struct flock lck;
+ uint64_t unique;
int unique_len, ret;
ssize_t written;
goto fail_close;
}
+ /*
+ * Directly using the binary value for
+ * SERVERID_UNIQUE_ID_NOT_TO_VERIFY is a layering
+ * violation. But including all of ndr here just for this
+ * seems to be a bit overkill to me. Also, messages_dgm might
+ * be replaced sooner or later by something streams-based,
+ * where unique_id generation will be handled differently.
+ */
+
+ do {
+ generate_random_buffer((uint8_t *)&unique, sizeof(unique));
+ } while (unique == UINT64_C(0xFFFFFFFFFFFFFFFF));
+
unique_len = snprintf(buf, sizeof(buf), "%ju\n", (uintmax_t)unique);
/* shorten a potentially preexisting file */
}
*plockfile_fd = lockfile_fd;
+ *punique = unique;
return 0;
fail_unlink:
}
int messaging_dgm_init(struct tevent_context *ev,
- uint64_t unique,
+ uint64_t *punique,
const char *socket_dir,
const char *lockfile_dir,
void (*recv_cb)(const uint8_t *msg,
}
ret = messaging_dgm_lockfile_create(ctx, ctx->pid, &ctx->lockfile_fd,
- unique);
+ punique);
if (ret != 0) {
DEBUG(1, ("%s: messaging_dgm_create_lockfile failed: %s\n",
__func__, strerror(ret)));
#include <tevent.h>
int messaging_dgm_init(struct tevent_context *ev,
- uint64_t unique,
+ uint64_t *unique,
const char *socket_dir,
const char *lockfile_dir,
void (*recv_cb)(const uint8_t *msg,
int *fds, size_t num_fds, void *private_data);
void *messaging_dgm_ref(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
- uint64_t unique,
+ uint64_t *unique,
const char *socket_dir,
const char *lockfile_dir,
void (*recv_cb)(const uint8_t *msg, size_t msg_len,
}
dgm_pid = getpid();
} else {
+ int ret;
+ ret = messaging_dgm_get_unique(getpid(), unique);
+ if (ret != 0) {
+ TALLOC_FREE(result);
+ *err = ret;
+ return NULL;
+ }
+
result->tevent_handle = messaging_dgm_register_tevent_context(
result, ev);
if (result->tevent_handle == NULL) {
#include "replace.h"
void *messaging_dgm_ref(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
- uint64_t unique,
+ uint64_t *unique,
const char *socket_dir,
const char *lockfile_dir,
void (*recv_cb)(const uint8_t *msg, size_t msg_len,
bld.SAMBA3_LIBRARY('messages_dgm',
source='''lib/messages_dgm.c lib/messages_dgm_ref.c''',
- deps='talloc UNIX_MSG POLL_FUNCS_TEVENT samba-debug',
+ deps='''talloc UNIX_MSG POLL_FUNCS_TEVENT samba-debug
+ genrand''',
private_library=True)
bld.SAMBA3_LIBRARY('messages_util',
}
msg->msg_dgm_ref = messaging_dgm_ref(
- msg, ev, server_id.unique_id, msg->sock_dir, msg->lock_dir,
+ msg, ev, &server_id.unique_id, msg->sock_dir, msg->lock_dir,
imessaging_dgm_recv, msg, &ret);
if (msg->msg_dgm_ref == NULL) {