[PATCH] Remove some source3'isms from messages_dgm

Volker Lendecke Volker.Lendecke at SerNet.DE
Wed Jun 18 07:12:58 MDT 2014


Hi!

The attached patchset is a small step towards making
messages_dgm usable outside of source3/. It removes some
source3 specific code, in particular full_path_tos and some
talloc_tos calls. It also removes some NTSTATUS references,
eventually this might also be usable inside ctdb.

This work is far from finished, but kindof complete in its
own sense.

Review would be appreciated!

Thanks,

Volker

-- 
SerNet GmbH, Bahnhofsallee 1b, 37081 Göttingen
phone: +49-551-370000-0, fax: +49-551-370000-9
AG Göttingen, HRB 2816, GF: Dr. Johannes Loxen
http://www.sernet.de, mailto:kontakt at sernet.de
-------------- next part --------------
From 97ffb1e02f3ccefbc1d0d9954b28ffa3a0dd3684 Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Sun, 1 Jun 2014 20:57:21 +0200
Subject: [PATCH 01/13] unix_msg: Lift sockaddr_un handling from
 unix_dgram_init

Signed-off-by: Volker Lendecke <vl at samba.org>
---
 source3/lib/unix_msg/unix_msg.c | 39 +++++++++++++++++++++++----------------
 1 file changed, 23 insertions(+), 16 deletions(-)

diff --git a/source3/lib/unix_msg/unix_msg.c b/source3/lib/unix_msg/unix_msg.c
index 602ecc6..d9a2340 100644
--- a/source3/lib/unix_msg/unix_msg.c
+++ b/source3/lib/unix_msg/unix_msg.c
@@ -135,7 +135,7 @@ static int prepare_socket(int sock)
 	return prepare_socket_cloexec(sock);
 }
 
-static int unix_dgram_init(const char *path, size_t max_msg,
+static int unix_dgram_init(const struct sockaddr_un *addr, size_t max_msg,
 			   const struct poll_funcs *ev_funcs,
 			   void (*recv_callback)(struct unix_dgram_ctx *ctx,
 						 uint8_t *msg, size_t msg_len,
@@ -144,15 +144,11 @@ static int unix_dgram_init(const char *path, size_t max_msg,
 			   struct unix_dgram_ctx **result)
 {
 	struct unix_dgram_ctx *ctx;
-	struct sockaddr_un addr = { 0, };
 	size_t pathlen;
 	int ret;
 
-	if (path != NULL) {
-		pathlen = strlen(path)+1;
-		if (pathlen > sizeof(addr.sun_path)) {
-			return ENAMETOOLONG;
-		}
+	if (addr != NULL) {
+		pathlen = strlen(addr->sun_path)+1;
 	} else {
 		pathlen = 1;
 	}
@@ -161,8 +157,8 @@ static int unix_dgram_init(const char *path, size_t max_msg,
 	if (ctx == NULL) {
 		return ENOMEM;
 	}
-	if (path != NULL) {
-		memcpy(ctx->path, path, pathlen);
+	if (addr != NULL) {
+		memcpy(ctx->path, addr->sun_path, pathlen);
 	} else {
 		ctx->path[0] = '\0';
 	}
@@ -194,12 +190,10 @@ static int unix_dgram_init(const char *path, size_t max_msg,
 		goto fail_close;
 	}
 
-	if (path != NULL) {
-		addr.sun_family = AF_UNIX;
-		memcpy(addr.sun_path, path, pathlen);
-
-		ret = bind(ctx->sock, (struct sockaddr *)(void *)&addr,
-				sizeof(addr));
+	if (addr != NULL) {
+		ret = bind(ctx->sock,
+			   (const struct sockaddr *)(const void *)addr,
+			   sizeof(*addr));
 		if (ret == -1) {
 			ret = errno;
 			goto fail_close;
@@ -633,6 +627,8 @@ int unix_msg_init(const char *path, const struct poll_funcs *ev_funcs,
 		  struct unix_msg_ctx **result)
 {
 	struct unix_msg_ctx *ctx;
+	struct sockaddr_un addr;
+	struct sockaddr_un *paddr = NULL;
 	int ret;
 
 	ctx = malloc(sizeof(*ctx));
@@ -640,7 +636,18 @@ int unix_msg_init(const char *path, const struct poll_funcs *ev_funcs,
 		return ENOMEM;
 	}
 
-	ret = unix_dgram_init(path, fragment_len, ev_funcs,
+	if (path != NULL) {
+		size_t pathlen = strlen(path)+1;
+
+		if (pathlen > sizeof(addr.sun_path)) {
+			return ENAMETOOLONG;
+		}
+		addr = (struct sockaddr_un) { .sun_family = AF_UNIX };
+		memcpy(addr.sun_path, path, pathlen);
+		paddr = &addr;
+	}
+
+	ret = unix_dgram_init(paddr, fragment_len, ev_funcs,
 			      unix_msg_recv, ctx, &ctx->dgram);
 	if (ret != 0) {
 		free(ctx);
-- 
1.8.1.2


From f0983166a49c51ca16ba3c54c84a538c1534771f Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Sun, 1 Jun 2014 20:57:21 +0200
Subject: [PATCH 02/13] unix_msg: Lift sockaddr_un handling from
 unix_dgram_send_queue_init

Signed-off-by: Volker Lendecke <vl at samba.org>
---
 source3/lib/unix_msg/unix_msg.c | 20 +++++++-------------
 1 file changed, 7 insertions(+), 13 deletions(-)

diff --git a/source3/lib/unix_msg/unix_msg.c b/source3/lib/unix_msg/unix_msg.c
index d9a2340..d68f4dc 100644
--- a/source3/lib/unix_msg/unix_msg.c
+++ b/source3/lib/unix_msg/unix_msg.c
@@ -296,19 +296,14 @@ static int unix_dgram_init_pthreadpool(struct unix_dgram_ctx *ctx)
 }
 
 static int unix_dgram_send_queue_init(
-	struct unix_dgram_ctx *ctx, const char *path,
+	struct unix_dgram_ctx *ctx, const struct sockaddr_un *dst,
 	struct unix_dgram_send_queue **result)
 {
 	struct unix_dgram_send_queue *q;
-	struct sockaddr_un addr = { 0, };
 	size_t pathlen;
 	int ret, err;
 
-	pathlen = strlen(path)+1;
-
-	if (pathlen > sizeof(addr.sun_path)) {
-		return ENAMETOOLONG;
-	}
+	pathlen = strlen(dst->sun_path)+1;
 
 	q = malloc(offsetof(struct unix_dgram_send_queue, path) + pathlen);
 	if (q == NULL) {
@@ -316,7 +311,7 @@ static int unix_dgram_send_queue_init(
 	}
 	q->ctx = ctx;
 	q->msgs = NULL;
-	memcpy(q->path, path, pathlen);
+	memcpy(q->path, dst->sun_path, pathlen);
 
 	q->sock = socket(AF_UNIX, SOCK_DGRAM, 0);
 	if (q->sock == -1) {
@@ -329,11 +324,10 @@ static int unix_dgram_send_queue_init(
 		goto fail_close;
 	}
 
-	addr.sun_family = AF_UNIX;
-	memcpy(addr.sun_path, path, pathlen+1);
-
 	do {
-		ret = connect(q->sock, (struct sockaddr *)&addr, sizeof(addr));
+		ret = connect(q->sock,
+			      (const struct sockaddr *)(const void *)dst,
+			      sizeof(*dst));
 	} while ((ret == -1) && (errno == EINTR));
 
 	if (ret == -1) {
@@ -523,7 +517,7 @@ static int unix_dgram_send(struct unix_dgram_ctx *ctx, const char *dst_sock,
 		return errno;
 	}
 
-	ret = unix_dgram_send_queue_init(ctx, dst_sock, &q);
+	ret = unix_dgram_send_queue_init(ctx, &addr, &q);
 	if (ret != 0) {
 		return ret;
 	}
-- 
1.8.1.2


From 1ca777ec3ebf830e0df8ccce0b6cc5f868bc21ea Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Sun, 1 Jun 2014 20:57:21 +0200
Subject: [PATCH 03/13] unix_msg: Lift sockaddr_un handling from
 unix_dgram_send

Signed-off-by: Volker Lendecke <vl at samba.org>
---
 source3/lib/unix_msg/unix_msg.c | 36 +++++++++++++++++-------------------
 1 file changed, 17 insertions(+), 19 deletions(-)

diff --git a/source3/lib/unix_msg/unix_msg.c b/source3/lib/unix_msg/unix_msg.c
index d68f4dc..b53a4c6 100644
--- a/source3/lib/unix_msg/unix_msg.c
+++ b/source3/lib/unix_msg/unix_msg.c
@@ -465,25 +465,19 @@ static void unix_dgram_job_finished(struct poll_watch *w, int fd, short events,
 	unix_dgram_send_queue_free(q);
 }
 
-static int unix_dgram_send(struct unix_dgram_ctx *ctx, const char *dst_sock,
+static int unix_dgram_send(struct unix_dgram_ctx *ctx,
+			   const struct sockaddr_un *dst,
 			   const struct iovec *iov, int iovlen)
 {
 	struct unix_dgram_send_queue *q;
-	struct sockaddr_un addr = { 0, };
 	struct msghdr msg;
-	size_t dst_len;
 	int ret;
 
-	dst_len = strlen(dst_sock);
-	if (dst_len >= sizeof(addr.sun_path)) {
-		return ENAMETOOLONG;
-	}
-
 	/*
 	 * To preserve message ordering, we have to queue a message when
 	 * others are waiting in line already.
 	 */
-	q = find_send_queue(ctx, dst_sock);
+	q = find_send_queue(ctx, dst->sun_path);
 	if (q != NULL) {
 		return queue_msg(q, iov, iovlen);
 	}
@@ -492,11 +486,8 @@ static int unix_dgram_send(struct unix_dgram_ctx *ctx, const char *dst_sock,
 	 * Try a cheap nonblocking send
 	 */
 
-	addr.sun_family = AF_UNIX;
-	memcpy(addr.sun_path, dst_sock, dst_len);
-
-	msg.msg_name = &addr;
-	msg.msg_namelen = sizeof(addr);
+	msg.msg_name = discard_const_p(struct sockaddr_un, dst);
+	msg.msg_namelen = sizeof(*dst);
 	msg.msg_iov = discard_const_p(struct iovec, iov);
 	msg.msg_iovlen = iovlen;
 #ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
@@ -517,7 +508,7 @@ static int unix_dgram_send(struct unix_dgram_ctx *ctx, const char *dst_sock,
 		return errno;
 	}
 
-	ret = unix_dgram_send_queue_init(ctx, &addr, &q);
+	ret = unix_dgram_send_queue_init(ctx, dst, &q);
 	if (ret != 0) {
 		return ret;
 	}
@@ -667,6 +658,15 @@ int unix_msg_send(struct unix_msg_ctx *ctx, const char *dst_sock,
 	struct iovec *iov_copy;
 	struct unix_msg_hdr hdr;
 	struct iovec src_iov;
+	struct sockaddr_un dst;
+	size_t dst_len;
+
+	dst_len = strlen(dst_sock);
+	if (dst_len >= sizeof(dst.sun_path)) {
+		return ENAMETOOLONG;
+	}
+	dst = (struct sockaddr_un) { .sun_family = AF_UNIX };
+	memcpy(dst.sun_path, dst_sock, dst_len);
 
 	if (iovlen < 0) {
 		return EINVAL;
@@ -688,8 +688,7 @@ int unix_msg_send(struct unix_msg_ctx *ctx, const char *dst_sock,
 			       sizeof(struct iovec) * iovlen);
 		}
 
-		return unix_dgram_send(ctx->dgram, dst_sock, tmp_iov,
-				       iovlen+1);
+		return unix_dgram_send(ctx->dgram, &dst, tmp_iov, iovlen+1);
 	}
 
 	hdr.msglen = msglen;
@@ -747,8 +746,7 @@ int unix_msg_send(struct unix_msg_ctx *ctx, const char *dst_sock,
 		}
 		sent += (fragment_len - sizeof(ctx->cookie) - sizeof(hdr));
 
-		ret = unix_dgram_send(ctx->dgram, dst_sock,
-				      iov_copy, iov_index);
+		ret = unix_dgram_send(ctx->dgram, &dst, iov_copy, iov_index);
 		if (ret != 0) {
 			break;
 		}
-- 
1.8.1.2


From 604c78bdf8141ae2e71c1f622804b59d05306aa9 Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Sun, 1 Jun 2014 20:57:21 +0200
Subject: [PATCH 04/13] unix_msg: Lift sockaddr_un handling from unix_msg_init

Signed-off-by: Volker Lendecke <vl at samba.org>
---
 source3/lib/messages_dgm.c        | 21 +++++++++++++--------
 source3/lib/unix_msg/test_drain.c |  9 +++++----
 source3/lib/unix_msg/tests.c      | 32 ++++++++++++++++++--------------
 source3/lib/unix_msg/unix_msg.c   | 20 ++++----------------
 source3/lib/unix_msg/unix_msg.h   |  4 +++-
 5 files changed, 43 insertions(+), 43 deletions(-)

diff --git a/source3/lib/messages_dgm.c b/source3/lib/messages_dgm.c
index c3ab0d1..f71ec85 100644
--- a/source3/lib/messages_dgm.c
+++ b/source3/lib/messages_dgm.c
@@ -179,7 +179,9 @@ NTSTATUS messaging_dgm_init(struct messaging_context *msg_ctx,
 	int ret;
 	bool ok;
 	const char *cache_dir;
-	char *socket_dir, *socket_name;
+	char *socket_dir;
+	struct sockaddr_un socket_address;
+	size_t sockname_len;
 	uint64_t cookie;
 
 	cache_dir = lp_cache_directory();
@@ -209,10 +211,14 @@ NTSTATUS messaging_dgm_init(struct messaging_context *msg_ctx,
 	if (socket_dir == NULL) {
 		goto fail_nomem;
 	}
-	socket_name = talloc_asprintf(ctx, "%s/%u", socket_dir,
-				      (unsigned)pid.pid);
-	if (socket_name == NULL) {
-		goto fail_nomem;
+
+	socket_address = (struct sockaddr_un) { .sun_family = AF_UNIX };
+	sockname_len = snprintf(socket_address.sun_path,
+				sizeof(socket_address.sun_path),
+				"%s/%u", socket_dir, (unsigned)pid.pid);
+	if (sockname_len >= sizeof(socket_address.sun_path)) {
+		TALLOC_FREE(result);
+		return NT_STATUS_NAME_TOO_LONG;
 	}
 
 	sec_init();
@@ -249,13 +255,12 @@ NTSTATUS messaging_dgm_init(struct messaging_context *msg_ctx,
 	}
 	TALLOC_FREE(socket_dir);
 
-	unlink(socket_name);
+	unlink(socket_address.sun_path);
 
 	generate_random_buffer((uint8_t *)&cookie, sizeof(cookie));
 
-	ret = unix_msg_init(socket_name, ctx->msg_callbacks, 1024, cookie,
+	ret = unix_msg_init(&socket_address, ctx->msg_callbacks, 1024, cookie,
 			    messaging_dgm_recv, ctx, &ctx->dgm_ctx);
-	TALLOC_FREE(socket_name);
 	if (ret != 0) {
 		DEBUG(1, ("unix_msg_init failed: %s\n", strerror(ret)));
 		TALLOC_FREE(result);
diff --git a/source3/lib/unix_msg/test_drain.c b/source3/lib/unix_msg/test_drain.c
index c2568b6..abaf5ef 100644
--- a/source3/lib/unix_msg/test_drain.c
+++ b/source3/lib/unix_msg/test_drain.c
@@ -17,7 +17,7 @@ static void recv_cb(struct unix_msg_ctx *ctx,
 int main(int argc, const char *argv[])
 {
 	struct poll_funcs *funcs;
-	const char *sock;
+	struct sockaddr_un addr;
 	struct unix_msg_ctx *ctx;
 	struct tevent_context *ev;
 	int ret;
@@ -29,8 +29,9 @@ int main(int argc, const char *argv[])
 		return 1;
 	}
 
-	sock = argv[1];
-	unlink(sock);
+	addr = (struct sockaddr_un) { .sun_family = AF_UNIX };
+	strlcpy(addr.sun_path, argv[1], sizeof(addr.sun_path));
+	unlink(addr.sun_path);
 
 	ev = tevent_context_init(NULL);
 	if (ev == NULL) {
@@ -43,7 +44,7 @@ int main(int argc, const char *argv[])
 		return 1;
 	}
 
-	ret = unix_msg_init(sock, funcs, 256, 1, recv_cb, &state, &ctx);
+	ret = unix_msg_init(&addr, funcs, 256, 1, recv_cb, &state, &ctx);
 	if (ret != 0) {
 		fprintf(stderr, "unix_msg_init failed: %s\n",
 			strerror(ret));
diff --git a/source3/lib/unix_msg/tests.c b/source3/lib/unix_msg/tests.c
index 29d5dcb..f5a2e8c 100644
--- a/source3/lib/unix_msg/tests.c
+++ b/source3/lib/unix_msg/tests.c
@@ -34,8 +34,7 @@ int main(void)
 {
 	struct poll_funcs *funcs;
 	void *tevent_handle;
-	const char *sock1 = "sock1";
-	const char *sock2 = "sock2";
+	struct sockaddr_un addr1, addr2;
 	struct unix_msg_ctx *ctx1, *ctx2;
 	struct tevent_context *ev;
 	struct iovec iov;
@@ -45,8 +44,13 @@ int main(void)
 
 	struct cb_state state;
 
-	unlink(sock1);
-	unlink(sock2);
+	addr1 = (struct sockaddr_un) { .sun_family = AF_UNIX };
+	strlcpy(addr1.sun_path, "sock1", sizeof(addr1.sun_path));
+	unlink(addr1.sun_path);
+
+	addr2 = (struct sockaddr_un) { .sun_family = AF_UNIX };
+	strlcpy(addr2.sun_path, "sock2", sizeof(addr2.sun_path));
+	unlink(addr2.sun_path);
 
 	ev = tevent_context_init(NULL);
 	if (ev == NULL) {
@@ -65,7 +69,7 @@ int main(void)
 		return 1;
 	}
 
-	ret = unix_msg_init(sock1, funcs, 256, 1,
+	ret = unix_msg_init(&addr1, funcs, 256, 1,
 			    recv_cb, &state, &ctx1);
 	if (ret != 0) {
 		fprintf(stderr, "unix_msg_init failed: %s\n",
@@ -73,7 +77,7 @@ int main(void)
 		return 1;
 	}
 
-	ret = unix_msg_init(sock1, funcs, 256, 1,
+	ret = unix_msg_init(&addr1, funcs, 256, 1,
 			    recv_cb, &state, &ctx1);
 	if (ret == 0) {
 		fprintf(stderr, "unix_msg_init succeeded unexpectedly\n");
@@ -85,7 +89,7 @@ int main(void)
 		return 1;
 	}
 
-	ret = unix_msg_init(sock2, funcs, 256, 1,
+	ret = unix_msg_init(&addr2, funcs, 256, 1,
 			    recv_cb, &state, &ctx2);
 	if (ret != 0) {
 		fprintf(stderr, "unix_msg_init failed: %s\n",
@@ -98,7 +102,7 @@ int main(void)
 	state.buf = NULL;
 	state.buflen = 0;
 
-	ret = unix_msg_send(ctx1, sock2, NULL, 0);
+	ret = unix_msg_send(ctx1, addr2.sun_path, NULL, 0);
 	if (ret != 0) {
 		fprintf(stderr, "unix_msg_send failed: %s\n",
 			strerror(ret));
@@ -115,7 +119,7 @@ int main(void)
 	state.buf = &msg;
 	state.buflen = sizeof(msg);
 
-	ret = unix_msg_send(ctx1, sock2, &iov, 1);
+	ret = unix_msg_send(ctx1, addr2.sun_path, &iov, 1);
 	if (ret != 0) {
 		fprintf(stderr, "unix_msg_send failed: %s\n",
 			strerror(ret));
@@ -136,13 +140,13 @@ int main(void)
 	state.buflen = sizeof(buf);
 
 	for (i=0; i<3; i++) {
-		ret = unix_msg_send(ctx1, sock2, &iov, 1);
+		ret = unix_msg_send(ctx1, addr2.sun_path, &iov, 1);
 		if (ret != 0) {
 			fprintf(stderr, "unix_msg_send failed: %s\n",
 				strerror(ret));
 			return 1;
 		}
-		ret = unix_msg_send(ctx2, sock2, &iov, 1);
+		ret = unix_msg_send(ctx2, addr2.sun_path, &iov, 1);
 		if (ret != 0) {
 			fprintf(stderr, "unix_msg_send failed: %s\n",
 				strerror(ret));
@@ -181,7 +185,7 @@ int main(void)
 			j++;
 		}
 
-		ret = unix_msg_send(ctx1, sock1, iovs, j);
+		ret = unix_msg_send(ctx1, addr1.sun_path, iovs, j);
 		if (ret != 0) {
 			fprintf(stderr, "unix_msg_send failed: %s\n",
 				strerror(ret));
@@ -194,13 +198,13 @@ int main(void)
 	printf("Filling send queues before freeing\n");
 
 	for (i=0; i<5; i++) {
-		ret = unix_msg_send(ctx1, sock2, &iov, 1);
+		ret = unix_msg_send(ctx1, addr2.sun_path, &iov, 1);
 		if (ret != 0) {
 			fprintf(stderr, "unix_msg_send failed: %s\n",
 				strerror(ret));
 			return 1;
 		}
-		ret = unix_msg_send(ctx1, sock1, &iov, 1);
+		ret = unix_msg_send(ctx1, addr1.sun_path, &iov, 1);
 		if (ret != 0) {
 			fprintf(stderr, "unix_msg_send failed: %s\n",
 				strerror(ret));
diff --git a/source3/lib/unix_msg/unix_msg.c b/source3/lib/unix_msg/unix_msg.c
index b53a4c6..4087683 100644
--- a/source3/lib/unix_msg/unix_msg.c
+++ b/source3/lib/unix_msg/unix_msg.c
@@ -603,7 +603,8 @@ static void unix_msg_recv(struct unix_dgram_ctx *ctx,
 			  uint8_t *msg, size_t msg_len,
 			  void *private_data);
 
-int unix_msg_init(const char *path, const struct poll_funcs *ev_funcs,
+int unix_msg_init(const struct sockaddr_un *addr,
+		  const struct poll_funcs *ev_funcs,
 		  size_t fragment_len, uint64_t cookie,
 		  void (*recv_callback)(struct unix_msg_ctx *ctx,
 					uint8_t *msg, size_t msg_len,
@@ -612,8 +613,6 @@ int unix_msg_init(const char *path, const struct poll_funcs *ev_funcs,
 		  struct unix_msg_ctx **result)
 {
 	struct unix_msg_ctx *ctx;
-	struct sockaddr_un addr;
-	struct sockaddr_un *paddr = NULL;
 	int ret;
 
 	ctx = malloc(sizeof(*ctx));
@@ -621,18 +620,7 @@ int unix_msg_init(const char *path, const struct poll_funcs *ev_funcs,
 		return ENOMEM;
 	}
 
-	if (path != NULL) {
-		size_t pathlen = strlen(path)+1;
-
-		if (pathlen > sizeof(addr.sun_path)) {
-			return ENAMETOOLONG;
-		}
-		addr = (struct sockaddr_un) { .sun_family = AF_UNIX };
-		memcpy(addr.sun_path, path, pathlen);
-		paddr = &addr;
-	}
-
-	ret = unix_dgram_init(paddr, fragment_len, ev_funcs,
+	ret = unix_dgram_init(addr, fragment_len, ev_funcs,
 			      unix_msg_recv, ctx, &ctx->dgram);
 	if (ret != 0) {
 		free(ctx);
@@ -661,7 +649,7 @@ int unix_msg_send(struct unix_msg_ctx *ctx, const char *dst_sock,
 	struct sockaddr_un dst;
 	size_t dst_len;
 
-	dst_len = strlen(dst_sock);
+	dst_len = strlen(dst_sock)+1;
 	if (dst_len >= sizeof(dst.sun_path)) {
 		return ENAMETOOLONG;
 	}
diff --git a/source3/lib/unix_msg/unix_msg.h b/source3/lib/unix_msg/unix_msg.h
index fc636d8..bf9efe7 100644
--- a/source3/lib/unix_msg/unix_msg.h
+++ b/source3/lib/unix_msg/unix_msg.h
@@ -75,7 +75,9 @@ struct unix_msg_ctx;
  * @return 0 on success, errno on failure
  */
 
-int unix_msg_init(const char *path, const struct poll_funcs *ev_funcs,
+
+int unix_msg_init(const struct sockaddr_un *addr,
+		  const struct poll_funcs *ev_funcs,
 		  size_t fragment_size, uint64_t cookie,
 		  void (*recv_callback)(struct unix_msg_ctx *ctx,
 					uint8_t *msg, size_t msg_len,
-- 
1.8.1.2


From 0bd12156b6665dd7c6449107dd58225f8a0faf21 Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Sun, 1 Jun 2014 20:57:21 +0200
Subject: [PATCH 05/13] unix_msg: Lift sockaddr_un handling from unix_msg_send

Signed-off-by: Volker Lendecke <vl at samba.org>
---
 source3/lib/messages_dgm.c         | 20 ++++++++------------
 source3/lib/unix_msg/test_source.c |  6 +++++-
 source3/lib/unix_msg/tests.c       | 14 +++++++-------
 source3/lib/unix_msg/unix_msg.c    | 15 +++------------
 source3/lib/unix_msg/unix_msg.h    |  2 +-
 5 files changed, 24 insertions(+), 33 deletions(-)

diff --git a/source3/lib/messages_dgm.c b/source3/lib/messages_dgm.c
index f71ec85..edef889 100644
--- a/source3/lib/messages_dgm.c
+++ b/source3/lib/messages_dgm.c
@@ -300,21 +300,19 @@ static NTSTATUS messaging_dgm_send(struct server_id src,
 {
 	struct messaging_dgm_context *ctx = talloc_get_type_abort(
 		backend->private_data, struct messaging_dgm_context);
-	fstring pid_str;
-	char buf[PATH_MAX];
-	char *dst_sock, *to_free;
 	struct messaging_dgm_hdr hdr;
 	struct iovec iov2[iovlen + 1];
-	ssize_t pathlen;
 	struct server_id_buf idbuf;
+	struct sockaddr_un dst;
+	ssize_t dst_pathlen;
 	int ret;
 
-	fstr_sprintf(pid_str, "msg/%u", (unsigned)pid.pid);
+	dst = (struct sockaddr_un) { .sun_family = AF_UNIX };
 
-	pathlen = full_path_tos(ctx->cache_dir, pid_str, buf, sizeof(buf),
-				&dst_sock, &to_free);
-	if (pathlen == -1) {
-		return NT_STATUS_NO_MEMORY;
+	dst_pathlen = snprintf(dst.sun_path, sizeof(dst.sun_path),
+			       "%s/msg/%u", ctx->cache_dir, (unsigned)pid.pid);
+	if (dst_pathlen >= sizeof(dst.sun_path)) {
+		return NT_STATUS_NAME_TOO_LONG;
 	}
 
 	hdr.msg_version = MESSAGE_VERSION;
@@ -331,11 +329,9 @@ static NTSTATUS messaging_dgm_send(struct server_id src,
 	memcpy(iov2+1, iov, iovlen*sizeof(struct iovec));
 
 	become_root();
-	ret = unix_msg_send(ctx->dgm_ctx, dst_sock, iov2, iovlen + 1);
+	ret = unix_msg_send(ctx->dgm_ctx, &dst, iov2, iovlen + 1);
 	unbecome_root();
 
-	TALLOC_FREE(to_free);
-
 	if (ret != 0) {
 		return map_nt_error_from_unix(ret);
 	}
diff --git a/source3/lib/unix_msg/test_source.c b/source3/lib/unix_msg/test_source.c
index 94984d8..7f6a7a5 100644
--- a/source3/lib/unix_msg/test_source.c
+++ b/source3/lib/unix_msg/test_source.c
@@ -13,6 +13,7 @@ int main(int argc, const char *argv[])
 	int ret;
 	unsigned i;
 	unsigned num_ctxs = 1;
+	struct sockaddr_un dst;
 
 	if (argc < 2) {
 		fprintf(stderr, "Usage: %s <sockname> [num_contexts]\n", argv[0]);
@@ -57,11 +58,14 @@ int main(int argc, const char *argv[])
 	iov.iov_base = &i;
 	iov.iov_len = sizeof(i);
 
+	dst = (struct sockaddr_un) { .sun_family = AF_UNIX };
+	strlcpy(dst.sun_path, argv[1], sizeof(dst.sun_path));
+
 	for (i=0; i<num_ctxs; i++) {
 		unsigned j;
 
 		for (j=0; j<100000; j++) {
-			ret = unix_msg_send(ctxs[i], argv[1], &iov, 1);
+			ret = unix_msg_send(ctxs[i], &dst, &iov, 1);
 			if (ret != 0) {
 				fprintf(stderr, "unix_msg_send failed: %s\n",
 					strerror(ret));
diff --git a/source3/lib/unix_msg/tests.c b/source3/lib/unix_msg/tests.c
index f5a2e8c..37ff304 100644
--- a/source3/lib/unix_msg/tests.c
+++ b/source3/lib/unix_msg/tests.c
@@ -102,7 +102,7 @@ int main(void)
 	state.buf = NULL;
 	state.buflen = 0;
 
-	ret = unix_msg_send(ctx1, addr2.sun_path, NULL, 0);
+	ret = unix_msg_send(ctx1, &addr2, NULL, 0);
 	if (ret != 0) {
 		fprintf(stderr, "unix_msg_send failed: %s\n",
 			strerror(ret));
@@ -119,7 +119,7 @@ int main(void)
 	state.buf = &msg;
 	state.buflen = sizeof(msg);
 
-	ret = unix_msg_send(ctx1, addr2.sun_path, &iov, 1);
+	ret = unix_msg_send(ctx1, &addr2, &iov, 1);
 	if (ret != 0) {
 		fprintf(stderr, "unix_msg_send failed: %s\n",
 			strerror(ret));
@@ -140,13 +140,13 @@ int main(void)
 	state.buflen = sizeof(buf);
 
 	for (i=0; i<3; i++) {
-		ret = unix_msg_send(ctx1, addr2.sun_path, &iov, 1);
+		ret = unix_msg_send(ctx1, &addr2, &iov, 1);
 		if (ret != 0) {
 			fprintf(stderr, "unix_msg_send failed: %s\n",
 				strerror(ret));
 			return 1;
 		}
-		ret = unix_msg_send(ctx2, addr2.sun_path, &iov, 1);
+		ret = unix_msg_send(ctx2, &addr2, &iov, 1);
 		if (ret != 0) {
 			fprintf(stderr, "unix_msg_send failed: %s\n",
 				strerror(ret));
@@ -185,7 +185,7 @@ int main(void)
 			j++;
 		}
 
-		ret = unix_msg_send(ctx1, addr1.sun_path, iovs, j);
+		ret = unix_msg_send(ctx1, &addr1, iovs, j);
 		if (ret != 0) {
 			fprintf(stderr, "unix_msg_send failed: %s\n",
 				strerror(ret));
@@ -198,13 +198,13 @@ int main(void)
 	printf("Filling send queues before freeing\n");
 
 	for (i=0; i<5; i++) {
-		ret = unix_msg_send(ctx1, addr2.sun_path, &iov, 1);
+		ret = unix_msg_send(ctx1, &addr2, &iov, 1);
 		if (ret != 0) {
 			fprintf(stderr, "unix_msg_send failed: %s\n",
 				strerror(ret));
 			return 1;
 		}
-		ret = unix_msg_send(ctx1, addr1.sun_path, &iov, 1);
+		ret = unix_msg_send(ctx1, &addr1, &iov, 1);
 		if (ret != 0) {
 			fprintf(stderr, "unix_msg_send failed: %s\n",
 				strerror(ret));
diff --git a/source3/lib/unix_msg/unix_msg.c b/source3/lib/unix_msg/unix_msg.c
index 4087683..f3185a3 100644
--- a/source3/lib/unix_msg/unix_msg.c
+++ b/source3/lib/unix_msg/unix_msg.c
@@ -637,7 +637,7 @@ int unix_msg_init(const struct sockaddr_un *addr,
 	return 0;
 }
 
-int unix_msg_send(struct unix_msg_ctx *ctx, const char *dst_sock,
+int unix_msg_send(struct unix_msg_ctx *ctx, const struct sockaddr_un *dst,
 		  const struct iovec *iov, int iovlen)
 {
 	ssize_t msglen;
@@ -646,15 +646,6 @@ int unix_msg_send(struct unix_msg_ctx *ctx, const char *dst_sock,
 	struct iovec *iov_copy;
 	struct unix_msg_hdr hdr;
 	struct iovec src_iov;
-	struct sockaddr_un dst;
-	size_t dst_len;
-
-	dst_len = strlen(dst_sock)+1;
-	if (dst_len >= sizeof(dst.sun_path)) {
-		return ENAMETOOLONG;
-	}
-	dst = (struct sockaddr_un) { .sun_family = AF_UNIX };
-	memcpy(dst.sun_path, dst_sock, dst_len);
 
 	if (iovlen < 0) {
 		return EINVAL;
@@ -676,7 +667,7 @@ int unix_msg_send(struct unix_msg_ctx *ctx, const char *dst_sock,
 			       sizeof(struct iovec) * iovlen);
 		}
 
-		return unix_dgram_send(ctx->dgram, &dst, tmp_iov, iovlen+1);
+		return unix_dgram_send(ctx->dgram, dst, tmp_iov, iovlen+1);
 	}
 
 	hdr.msglen = msglen;
@@ -734,7 +725,7 @@ int unix_msg_send(struct unix_msg_ctx *ctx, const char *dst_sock,
 		}
 		sent += (fragment_len - sizeof(ctx->cookie) - sizeof(hdr));
 
-		ret = unix_dgram_send(ctx->dgram, &dst, iov_copy, iov_index);
+		ret = unix_dgram_send(ctx->dgram, dst, iov_copy, iov_index);
 		if (ret != 0) {
 			break;
 		}
diff --git a/source3/lib/unix_msg/unix_msg.h b/source3/lib/unix_msg/unix_msg.h
index bf9efe7..a712a8f 100644
--- a/source3/lib/unix_msg/unix_msg.h
+++ b/source3/lib/unix_msg/unix_msg.h
@@ -95,7 +95,7 @@ int unix_msg_init(const struct sockaddr_un *addr,
  * @return 0 on success, errno on failure
  */
 
-int unix_msg_send(struct unix_msg_ctx *ctx, const char *dst_sock,
+int unix_msg_send(struct unix_msg_ctx *ctx, const struct sockaddr_un *dst,
 		  const struct iovec *iov, int iovlen);
 
 /**
-- 
1.8.1.2


From d849fd905c25148089cf202c890045e4a6e4209b Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Mon, 2 Jun 2014 22:29:44 +0200
Subject: [PATCH 06/13] messaging3: Remove use of full_path_tos()

This is not performance critical, and this removes source3 specific
code

Signed-off-by: Volker Lendecke <vl at samba.org>
---
 source3/lib/messages_dgm.c | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/source3/lib/messages_dgm.c b/source3/lib/messages_dgm.c
index edef889..8836bf8 100644
--- a/source3/lib/messages_dgm.c
+++ b/source3/lib/messages_dgm.c
@@ -57,9 +57,8 @@ static int messaging_dgm_context_destructor(struct messaging_dgm_context *c);
 static int messaging_dgm_lockfile_create(const char *cache_dir, pid_t pid,
 					 int *plockfile_fd, uint64_t unique)
 {
-	char buf[PATH_MAX];
-	char *dir, *to_free;
-	ssize_t dirlen;
+	fstring buf;
+	char *dir;
 	char *lockfile_name;
 	int lockfile_fd;
 	struct flock lck = {};
@@ -67,9 +66,8 @@ static int messaging_dgm_lockfile_create(const char *cache_dir, pid_t pid,
 	ssize_t written;
 	bool ok;
 
-	dirlen = full_path_tos(cache_dir, "lck", buf, sizeof(buf),
-			       &dir, &to_free);
-	if (dirlen == -1) {
+	dir = talloc_asprintf(talloc_tos(), "%s/lck", cache_dir);
+	if (dir == NULL) {
 		return ENOMEM;
 	}
 
@@ -78,13 +76,13 @@ static int messaging_dgm_lockfile_create(const char *cache_dir, pid_t pid,
 		ret = errno;
 		DEBUG(1, ("%s: Could not create lock directory: %s\n",
 			  __func__, strerror(ret)));
-		TALLOC_FREE(to_free);
+		TALLOC_FREE(dir);
 		return ret;
 	}
 
 	lockfile_name = talloc_asprintf(talloc_tos(), "%s/%u", dir,
 					(unsigned)pid);
-	TALLOC_FREE(to_free);
+	TALLOC_FREE(dir);
 	if (lockfile_name == NULL) {
 		DEBUG(1, ("%s: talloc_asprintf failed\n", __func__));
 		return ENOMEM;
-- 
1.8.1.2


From feaa5bab981d32080fb706a2b1736b2ca5f4123b Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Mon, 2 Jun 2014 23:01:46 +0200
Subject: [PATCH 07/13] messaging3: Remove two uses of talloc_tos()

Signed-off-by: Volker Lendecke <vl at samba.org>
---
 source3/lib/messages_dgm.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/source3/lib/messages_dgm.c b/source3/lib/messages_dgm.c
index 8836bf8..09b635d 100644
--- a/source3/lib/messages_dgm.c
+++ b/source3/lib/messages_dgm.c
@@ -54,7 +54,8 @@ 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(const char *cache_dir, pid_t pid,
+static int messaging_dgm_lockfile_create(TALLOC_CTX *tmp_ctx,
+					 const char *cache_dir, pid_t pid,
 					 int *plockfile_fd, uint64_t unique)
 {
 	fstring buf;
@@ -66,7 +67,7 @@ static int messaging_dgm_lockfile_create(const char *cache_dir, pid_t pid,
 	ssize_t written;
 	bool ok;
 
-	dir = talloc_asprintf(talloc_tos(), "%s/lck", cache_dir);
+	dir = talloc_asprintf(tmp_ctx, "%s/lck", cache_dir);
 	if (dir == NULL) {
 		return ENOMEM;
 	}
@@ -80,7 +81,7 @@ static int messaging_dgm_lockfile_create(const char *cache_dir, pid_t pid,
 		return ret;
 	}
 
-	lockfile_name = talloc_asprintf(talloc_tos(), "%s/%u", dir,
+	lockfile_name = talloc_asprintf(tmp_ctx, "%s/%u", dir,
 					(unsigned)pid);
 	TALLOC_FREE(dir);
 	if (lockfile_name == NULL) {
@@ -221,7 +222,7 @@ NTSTATUS messaging_dgm_init(struct messaging_context *msg_ctx,
 
 	sec_init();
 
-	ret = messaging_dgm_lockfile_create(cache_dir, pid.pid,
+	ret = messaging_dgm_lockfile_create(ctx, cache_dir, pid.pid,
 					    &ctx->lockfile_fd, pid.unique_id);
 	if (ret != 0) {
 		DEBUG(1, ("%s: messaging_dgm_create_lockfile failed: %s\n",
-- 
1.8.1.2


From 0d6b12d6138678c3b487076c2647cbe43f80eabe Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Wed, 4 Jun 2014 14:36:57 +0000
Subject: [PATCH 08/13] messaging3: Make the _send function return 0/errno

This is to eventually make messaging_dgm usable in ctdb

Signed-off-by: Volker Lendecke <vl at samba.org>
---
 source3/include/messages.h   |  8 ++++----
 source3/lib/messages.c       | 20 +++++++++++++++-----
 source3/lib/messages_ctdbd.c | 15 +++++++++------
 source3/lib/messages_dgm.c   | 23 ++++++++++-------------
 4 files changed, 38 insertions(+), 28 deletions(-)

diff --git a/source3/include/messages.h b/source3/include/messages.h
index 5784e41..71b344a 100644
--- a/source3/include/messages.h
+++ b/source3/include/messages.h
@@ -66,10 +66,10 @@ struct messaging_context;
 struct messaging_rec;
 
 struct messaging_backend {
-	NTSTATUS (*send_fn)(struct server_id src,
-			    struct server_id pid, int msg_type,
-			    const struct iovec *iov, int iovlen,
-			    struct messaging_backend *backend);
+	int (*send_fn)(struct server_id src,
+		       struct server_id pid, int msg_type,
+		       const struct iovec *iov, int iovlen,
+		       struct messaging_backend *backend);
 	void *private_data;
 };
 
diff --git a/source3/lib/messages.c b/source3/lib/messages.c
index 1263bf1..a9015d0 100644
--- a/source3/lib/messages.c
+++ b/source3/lib/messages.c
@@ -412,14 +412,20 @@ NTSTATUS messaging_send_iov(struct messaging_context *msg_ctx,
 			    struct server_id server, uint32_t msg_type,
 			    const struct iovec *iov, int iovlen)
 {
+	int ret;
+
 	if (server_id_is_disconnected(&server)) {
 		return NT_STATUS_INVALID_PARAMETER_MIX;
 	}
 
 	if (!procid_is_local(&server)) {
-		return msg_ctx->remote->send_fn(msg_ctx->id, server,
-						msg_type, iov, iovlen,
-						msg_ctx->remote);
+		ret = msg_ctx->remote->send_fn(msg_ctx->id, server,
+					       msg_type, iov, iovlen,
+					       msg_ctx->remote);
+		if (ret != 0) {
+			return map_nt_error_from_unix(ret);
+		}
+		return NT_STATUS_OK;
 	}
 
 	if (messaging_is_self_send(msg_ctx, &server)) {
@@ -444,8 +450,12 @@ NTSTATUS messaging_send_iov(struct messaging_context *msg_ctx,
 		return NT_STATUS_OK;
 	}
 
-	return msg_ctx->local->send_fn(msg_ctx->id, server, msg_type,
-				       iov, iovlen, msg_ctx->local);
+	ret = msg_ctx->local->send_fn(msg_ctx->id, server, msg_type,
+				      iov, iovlen, msg_ctx->local);
+	if (ret != 0) {
+		return map_nt_error_from_unix(ret);
+	}
+	return NT_STATUS_OK;
 }
 
 static struct messaging_rec *messaging_rec_dup(TALLOC_CTX *mem_ctx,
diff --git a/source3/lib/messages_ctdbd.c b/source3/lib/messages_ctdbd.c
index 3b7fa05..add089da 100644
--- a/source3/lib/messages_ctdbd.c
+++ b/source3/lib/messages_ctdbd.c
@@ -88,10 +88,10 @@ struct ctdbd_connection *messaging_ctdbd_connection(void)
 	return global_ctdbd_connection;
 }
 
-static NTSTATUS messaging_ctdb_send(struct server_id src,
-				    struct server_id pid, int msg_type,
-				    const struct iovec *iov, int iovlen,
-				    struct messaging_backend *backend)
+static int messaging_ctdb_send(struct server_id src,
+			       struct server_id pid, int msg_type,
+			       const struct iovec *iov, int iovlen,
+			       struct messaging_backend *backend)
 {
 	struct messaging_ctdbd_context *ctx = talloc_get_type_abort(
 		backend->private_data, struct messaging_ctdbd_context);
@@ -102,7 +102,7 @@ static NTSTATUS messaging_ctdb_send(struct server_id src,
 
 	buf = iov_buf(talloc_tos(), iov, iovlen);
 	if (buf == NULL) {
-		return NT_STATUS_NO_MEMORY;
+		return ENOMEM;
 	}
 
 
@@ -116,7 +116,10 @@ static NTSTATUS messaging_ctdb_send(struct server_id src,
 
 	TALLOC_FREE(buf);
 
-	return status;
+	if (NT_STATUS_IS_OK(status)) {
+		return 0;
+	}
+	return map_errno_from_nt_status(status);
 }
 
 static int messaging_ctdbd_destructor(struct messaging_ctdbd_context *ctx)
diff --git a/source3/lib/messages_dgm.c b/source3/lib/messages_dgm.c
index 09b635d..fb0419d 100644
--- a/source3/lib/messages_dgm.c
+++ b/source3/lib/messages_dgm.c
@@ -44,10 +44,10 @@ struct messaging_dgm_hdr {
 	struct server_id src;
 };
 
-static NTSTATUS 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 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);
@@ -292,10 +292,10 @@ static int messaging_dgm_context_destructor(struct messaging_dgm_context *c)
 	return 0;
 }
 
-static NTSTATUS 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 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)
 {
 	struct messaging_dgm_context *ctx = talloc_get_type_abort(
 		backend->private_data, struct messaging_dgm_context);
@@ -311,7 +311,7 @@ static NTSTATUS messaging_dgm_send(struct server_id src,
 	dst_pathlen = snprintf(dst.sun_path, sizeof(dst.sun_path),
 			       "%s/msg/%u", ctx->cache_dir, (unsigned)pid.pid);
 	if (dst_pathlen >= sizeof(dst.sun_path)) {
-		return NT_STATUS_NAME_TOO_LONG;
+		return ENAMETOOLONG;
 	}
 
 	hdr.msg_version = MESSAGE_VERSION;
@@ -331,10 +331,7 @@ static NTSTATUS messaging_dgm_send(struct server_id src,
 	ret = unix_msg_send(ctx->dgm_ctx, &dst, iov2, iovlen + 1);
 	unbecome_root();
 
-	if (ret != 0) {
-		return map_nt_error_from_unix(ret);
-	}
-	return NT_STATUS_OK;
+	return ret;
 }
 
 static void messaging_dgm_recv(struct unix_msg_ctx *ctx,
-- 
1.8.1.2


From 402b57253371d80eadc6636970e14553d0b35f9b Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Wed, 4 Jun 2014 14:42:46 +0000
Subject: [PATCH 09/13] messaging3: Make messaging_dgm_cleanup return 0/errno

Signed-off-by: Volker Lendecke <vl at samba.org>
---
 source3/include/messages.h |  2 +-
 source3/lib/messages_dgm.c | 26 ++++++++++++--------------
 source3/smbd/server.c      |  6 +++---
 source3/utils/smbcontrol.c |  8 ++++++--
 4 files changed, 22 insertions(+), 20 deletions(-)

diff --git a/source3/include/messages.h b/source3/include/messages.h
index 71b344a..d826c11 100644
--- a/source3/include/messages.h
+++ b/source3/include/messages.h
@@ -76,7 +76,7 @@ struct messaging_backend {
 NTSTATUS messaging_dgm_init(struct messaging_context *msg_ctx,
 			    TALLOC_CTX *mem_ctx,
 			    struct messaging_backend **presult);
-NTSTATUS messaging_dgm_cleanup(struct messaging_context *msg_ctx, pid_t pid);
+int messaging_dgm_cleanup(struct messaging_context *msg_ctx, pid_t pid);
 NTSTATUS messaging_dgm_wipe(struct messaging_context *msg_ctx);
 void *messaging_dgm_register_tevent_context(TALLOC_CTX *mem_ctx,
 					    struct messaging_context *msg_ctx,
diff --git a/source3/lib/messages_dgm.c b/source3/lib/messages_dgm.c
index fb0419d..1e6e954 100644
--- a/source3/lib/messages_dgm.c
+++ b/source3/lib/messages_dgm.c
@@ -368,7 +368,7 @@ static void messaging_dgm_recv(struct unix_msg_ctx *ctx,
 	messaging_dispatch_rec(dgm_ctx->msg_ctx, &rec);
 }
 
-NTSTATUS messaging_dgm_cleanup(struct messaging_context *msg_ctx, pid_t pid)
+int messaging_dgm_cleanup(struct messaging_context *msg_ctx, pid_t pid)
 {
 	struct messaging_backend *be = messaging_local_backend(msg_ctx);
 	struct messaging_dgm_context *ctx = talloc_get_type_abort(
@@ -376,26 +376,25 @@ NTSTATUS messaging_dgm_cleanup(struct messaging_context *msg_ctx, pid_t pid)
 	char *lockfile_name, *socket_name;
 	int fd, ret;
 	struct flock lck = {};
-	NTSTATUS status = NT_STATUS_OK;
 
 	lockfile_name = talloc_asprintf(talloc_tos(), "%s/lck/%u",
 					ctx->cache_dir, (unsigned)pid);
 	if (lockfile_name == NULL) {
-		return NT_STATUS_NO_MEMORY;
+		return ENOMEM;
 	}
 	socket_name = talloc_asprintf(lockfile_name, "%s/msg/%u",
 				      ctx->cache_dir, (unsigned)pid);
 	if (socket_name == NULL) {
 		TALLOC_FREE(lockfile_name);
-		return NT_STATUS_NO_MEMORY;
+		return ENOMEM;
 	}
 
 	fd = open(lockfile_name, O_NONBLOCK|O_WRONLY, 0);
 	if (fd == -1) {
-		status = map_nt_error_from_unix(errno);
+		ret = errno;
 		DEBUG(10, ("%s: open(%s) failed: %s\n", __func__,
-			   lockfile_name, strerror(errno)));
-		return status;
+			   lockfile_name, strerror(ret)));
+		return ret;
 	}
 
 	lck.l_type = F_WRLCK;
@@ -405,12 +404,12 @@ NTSTATUS messaging_dgm_cleanup(struct messaging_context *msg_ctx, pid_t pid)
 
 	ret = fcntl(fd, F_SETLK, &lck);
 	if (ret != 0) {
-		status = map_nt_error_from_unix(errno);
+		ret = errno;
 		DEBUG(10, ("%s: Could not get lock: %s\n", __func__,
-			   strerror(errno)));
+			   strerror(ret)));
 		TALLOC_FREE(lockfile_name);
 		close(fd);
-		return status;
+		return ret;
 	}
 
 	(void)unlink(socket_name);
@@ -418,7 +417,7 @@ NTSTATUS messaging_dgm_cleanup(struct messaging_context *msg_ctx, pid_t pid)
 	(void)close(fd);
 
 	TALLOC_FREE(lockfile_name);
-	return NT_STATUS_OK;
+	return 0;
 }
 
 NTSTATUS messaging_dgm_wipe(struct messaging_context *msg_ctx)
@@ -449,7 +448,6 @@ NTSTATUS messaging_dgm_wipe(struct messaging_context *msg_ctx)
 	}
 
 	while ((dp = readdir(msgdir)) != NULL) {
-		NTSTATUS status;
 		unsigned long pid;
 
 		pid = strtoul(dp->d_name, NULL, 10);
@@ -467,9 +465,9 @@ NTSTATUS messaging_dgm_wipe(struct messaging_context *msg_ctx)
 			continue;
 		}
 
-		status = messaging_dgm_cleanup(msg_ctx, pid);
+		ret = messaging_dgm_cleanup(msg_ctx, pid);
 		DEBUG(10, ("messaging_dgm_cleanup(%lu) returned %s\n",
-			   pid, nt_errstr(status)));
+			   pid, ret ? strerror(ret) : "ok"));
 	}
 	closedir(msgdir);
 
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index 53d615e..40684ad 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -445,13 +445,13 @@ static void remove_child_pid(struct smbd_parent_context *parent,
 {
 	struct smbd_child_pid *child;
 	struct server_id child_id;
-	NTSTATUS status;
+	int ret;
 
 	child_id = pid_to_procid(pid);
 
-	status = messaging_dgm_cleanup(parent->msg_ctx, pid);
+	ret = messaging_dgm_cleanup(parent->msg_ctx, pid);
 	DEBUG(10, ("%s: messaging_dgm_cleanup returned %s\n",
-		   __func__, nt_errstr(status)));
+		   __func__, ret ? strerror(ret) : "ok"));
 
 	for (child = parent->children; child != NULL; child = child->next) {
 		if (child->pid == pid) {
diff --git a/source3/utils/smbcontrol.c b/source3/utils/smbcontrol.c
index 274de70..d11adc6 100644
--- a/source3/utils/smbcontrol.c
+++ b/source3/utils/smbcontrol.c
@@ -973,10 +973,14 @@ static bool do_dgm_cleanup(struct tevent_context *ev_ctx,
 			   const struct server_id pid,
 			   const int argc, const char **argv)
 {
-	NTSTATUS status;
+	NTSTATUS status = NT_STATUS_OK;
 
 	if (pid.pid != 0) {
-		status = messaging_dgm_cleanup(msg_ctx, pid.pid);
+		int ret;
+		ret = messaging_dgm_cleanup(msg_ctx, pid.pid);
+		if (ret != 0) {
+			status = map_nt_error_from_unix(ret);
+		}
 	} else {
 		status = messaging_dgm_wipe(msg_ctx);
 	}
-- 
1.8.1.2


From 7462439a796d73edc741f4459a5b5295f6dc483b Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Wed, 4 Jun 2014 14:47:05 +0000
Subject: [PATCH 10/13] messaging3: Make messaging_dgm_wipe return 0/errno

Signed-off-by: Volker Lendecke <vl at samba.org>
---
 source3/include/messages.h |  2 +-
 source3/lib/messages.c     |  7 ++++---
 source3/lib/messages_dgm.c | 13 ++++++++-----
 source3/utils/smbcontrol.c | 12 ++++--------
 4 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/source3/include/messages.h b/source3/include/messages.h
index d826c11..fdfa3d9 100644
--- a/source3/include/messages.h
+++ b/source3/include/messages.h
@@ -77,7 +77,7 @@ NTSTATUS 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);
-NTSTATUS messaging_dgm_wipe(struct messaging_context *msg_ctx);
+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);
diff --git a/source3/lib/messages.c b/source3/lib/messages.c
index a9015d0..53fff21 100644
--- a/source3/lib/messages.c
+++ b/source3/lib/messages.c
@@ -879,10 +879,11 @@ static int mess_parent_dgm_cleanup(void *private_data)
 {
 	struct messaging_context *msg_ctx = talloc_get_type_abort(
 		private_data, struct messaging_context);
-	NTSTATUS status;
+	int ret;
 
-	status = messaging_dgm_wipe(msg_ctx);
-	DEBUG(10, ("messaging_dgm_wipe returned %s\n", nt_errstr(status)));
+	ret = messaging_dgm_wipe(msg_ctx);
+	DEBUG(10, ("messaging_dgm_wipe returned %s\n",
+		   ret ? strerror(ret) : "ok"));
 	return lp_parm_int(-1, "messaging", "messaging dgm cleanup interval",
 			   60*15);
 }
diff --git a/source3/lib/messages_dgm.c b/source3/lib/messages_dgm.c
index 1e6e954..999945f 100644
--- a/source3/lib/messages_dgm.c
+++ b/source3/lib/messages_dgm.c
@@ -420,7 +420,7 @@ int messaging_dgm_cleanup(struct messaging_context *msg_ctx, pid_t pid)
 	return 0;
 }
 
-NTSTATUS messaging_dgm_wipe(struct messaging_context *msg_ctx)
+int messaging_dgm_wipe(struct messaging_context *msg_ctx)
 {
 	struct messaging_backend *be = messaging_local_backend(msg_ctx);
 	struct messaging_dgm_context *ctx = talloc_get_type_abort(
@@ -429,6 +429,7 @@ NTSTATUS messaging_dgm_wipe(struct messaging_context *msg_ctx)
 	DIR *msgdir;
 	struct dirent *dp;
 	pid_t our_pid = getpid();
+	int ret;
 
 	/*
 	 * We scan the socket directory and not the lock directory. Otherwise
@@ -438,14 +439,16 @@ NTSTATUS messaging_dgm_wipe(struct messaging_context *msg_ctx)
 
 	msgdir_name = talloc_asprintf(talloc_tos(), "%s/msg", ctx->cache_dir);
 	if (msgdir_name == NULL) {
-		return NT_STATUS_NO_MEMORY;
+		return ENOMEM;
 	}
 
 	msgdir = opendir(msgdir_name);
-	TALLOC_FREE(msgdir_name);
 	if (msgdir == NULL) {
-		return map_nt_error_from_unix(errno);
+		ret = errno;
+		TALLOC_FREE(msgdir_name);
+		return ret;
 	}
+	TALLOC_FREE(msgdir_name);
 
 	while ((dp = readdir(msgdir)) != NULL) {
 		unsigned long pid;
@@ -471,7 +474,7 @@ NTSTATUS messaging_dgm_wipe(struct messaging_context *msg_ctx)
 	}
 	closedir(msgdir);
 
-	return NT_STATUS_OK;
+	return 0;
 }
 
 void *messaging_dgm_register_tevent_context(TALLOC_CTX *mem_ctx,
diff --git a/source3/utils/smbcontrol.c b/source3/utils/smbcontrol.c
index d11adc6..edd2edc 100644
--- a/source3/utils/smbcontrol.c
+++ b/source3/utils/smbcontrol.c
@@ -973,22 +973,18 @@ static bool do_dgm_cleanup(struct tevent_context *ev_ctx,
 			   const struct server_id pid,
 			   const int argc, const char **argv)
 {
-	NTSTATUS status = NT_STATUS_OK;
+	int ret;
 
 	if (pid.pid != 0) {
-		int ret;
 		ret = messaging_dgm_cleanup(msg_ctx, pid.pid);
-		if (ret != 0) {
-			status = map_nt_error_from_unix(ret);
-		}
 	} else {
-		status = messaging_dgm_wipe(msg_ctx);
+		ret = messaging_dgm_wipe(msg_ctx);
 	}
 
 	printf("cleanup(%u) returned %s\n", (unsigned)pid.pid,
-	       nt_errstr(status));
+	       ret ? strerror(ret) : "ok");
 
-	return NT_STATUS_IS_OK(status);
+	return (ret == 0);
 }
 
 /* Shutdown a server process */
-- 
1.8.1.2


From 7cd06e1e480b006b7aa9644c9cf51534239771eb Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Fri, 30 May 2014 15:31:33 +0000
Subject: [PATCH 11/13] messaging3: simplify messaging_dgm_lockfile_remove

full_path_tos() isn't really required here, this is not a hot code path

Signed-off-by: Volker Lendecke <vl at samba.org>
---
 source3/lib/messages_dgm.c | 25 +++++++++++--------------
 1 file changed, 11 insertions(+), 14 deletions(-)

diff --git a/source3/lib/messages_dgm.c b/source3/lib/messages_dgm.c
index 999945f..4bbf89c 100644
--- a/source3/lib/messages_dgm.c
+++ b/source3/lib/messages_dgm.c
@@ -142,29 +142,26 @@ fail_free:
 	return ret;
 }
 
-static int messaging_dgm_lockfile_remove(const char *cache_dir, pid_t pid)
+static int messaging_dgm_lockfile_remove(TALLOC_CTX *tmp_ctx,
+					 const char *cache_dir, pid_t pid)
 {
-	fstring fname;
-	char buf[PATH_MAX];
-	char *lockfile_name, *to_free;
-	ssize_t len;
+	char *lockfile_name;
 	int ret;
 
-	fstr_sprintf(fname, "lck/%u", (unsigned)pid);
-
-	len = full_path_tos(cache_dir, fname, buf, sizeof(buf),
-			    &lockfile_name, &to_free);
-	if (len == -1) {
+	lockfile_name = talloc_asprintf(
+		tmp_ctx, "%s/lck/%u", cache_dir, (unsigned)pid);
+	if (lockfile_name == NULL) {
 		return ENOMEM;
 	}
 
 	ret = unlink(lockfile_name);
 	if (ret == -1) {
 		ret = errno;
-		DEBUG(10, ("%s: unlink failed: %s\n", __func__,
-			   strerror(ret)));
+		DEBUG(10, ("%s: unlink(%s) failed: %s\n", __func__,
+			   lockfile_name, strerror(ret)));
 	}
-	TALLOC_FREE(to_free);
+
+	TALLOC_FREE(lockfile_name);
 	return ret;
 }
 
@@ -286,7 +283,7 @@ static int messaging_dgm_context_destructor(struct messaging_dgm_context *c)
 	unix_msg_free(c->dgm_ctx);
 
 	if (getpid() == pid.pid) {
-		(void)messaging_dgm_lockfile_remove(c->cache_dir, pid.pid);
+		(void)messaging_dgm_lockfile_remove(c, c->cache_dir, pid.pid);
 	}
 	close(c->lockfile_fd);
 	return 0;
-- 
1.8.1.2


From 2ce318eaaa82c6e0806518b990ebd8e93d9a06c4 Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Tue, 10 Jun 2014 14:57:05 +0000
Subject: [PATCH 12/13] messaging3: Use "goto fail_nomem" where appropriate

Signed-off-by: Volker Lendecke <vl at samba.org>
---
 source3/lib/messages_dgm.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/source3/lib/messages_dgm.c b/source3/lib/messages_dgm.c
index 4bbf89c..2f30503 100644
--- a/source3/lib/messages_dgm.c
+++ b/source3/lib/messages_dgm.c
@@ -230,16 +230,14 @@ NTSTATUS messaging_dgm_init(struct messaging_context *msg_ctx,
 
 	ctx->msg_callbacks = poll_funcs_init_tevent(ctx);
 	if (ctx->msg_callbacks == NULL) {
-		TALLOC_FREE(result);
-		return NT_STATUS_NO_MEMORY;
+		goto fail_nomem;
 	}
 
 	ctx->tevent_handle = poll_funcs_tevent_register(
 		ctx, ctx->msg_callbacks,
 		messaging_tevent_context(msg_ctx));
 	if (ctx->tevent_handle == NULL) {
-		TALLOC_FREE(result);
-		return NT_STATUS_NO_MEMORY;
+		goto fail_nomem;
 	}
 
 	ok = directory_create_or_exist_strict(socket_dir, sec_initial_uid(),
-- 
1.8.1.2


From fcdf3d0cd6a3a85c180e1d64f5ecd3c592fe915a Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Tue, 10 Jun 2014 15:21:10 +0000
Subject: [PATCH 13/13] messaging3: Make messaging_dgm_init return 0/errno

Signed-off-by: Volker Lendecke <vl at samba.org>
---
 source3/include/messages.h |  6 +++---
 source3/lib/messages.c     | 18 +++++++++---------
 source3/lib/messages_dgm.c | 21 ++++++++++-----------
 3 files changed, 22 insertions(+), 23 deletions(-)

diff --git a/source3/include/messages.h b/source3/include/messages.h
index fdfa3d9..b718dd7 100644
--- a/source3/include/messages.h
+++ b/source3/include/messages.h
@@ -73,9 +73,9 @@ struct messaging_backend {
 	void *private_data;
 };
 
-NTSTATUS messaging_dgm_init(struct messaging_context *msg_ctx,
-			    TALLOC_CTX *mem_ctx,
-			    struct messaging_backend **presult);
+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,
diff --git a/source3/lib/messages.c b/source3/lib/messages.c
index 53fff21..9514392 100644
--- a/source3/lib/messages.c
+++ b/source3/lib/messages.c
@@ -209,6 +209,7 @@ struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx,
 {
 	struct messaging_context *ctx;
 	NTSTATUS status;
+	int ret;
 	static bool have_context = false;
 
 	if (have_context) {
@@ -225,11 +226,10 @@ struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx,
 	ctx->event_ctx = ev;
 	ctx->have_context = &have_context;
 
-	status = messaging_dgm_init(ctx, ctx, &ctx->local);
+	ret = messaging_dgm_init(ctx, ctx, &ctx->local);
 
-	if (!NT_STATUS_IS_OK(status)) {
-		DEBUG(2, ("messaging_dgm_init failed: %s\n",
-			  nt_errstr(status)));
+	if (ret != 0) {
+		DEBUG(2, ("messaging_dgm_init failed: %s\n", strerror(ret)));
 		TALLOC_FREE(ctx);
 		return NULL;
 	}
@@ -278,16 +278,16 @@ struct server_id messaging_server_id(const struct messaging_context *msg_ctx)
 NTSTATUS messaging_reinit(struct messaging_context *msg_ctx)
 {
 	NTSTATUS status;
+	int ret;
 
 	TALLOC_FREE(msg_ctx->local);
 
 	msg_ctx->id = procid_self();
 
-	status = messaging_dgm_init(msg_ctx, msg_ctx, &msg_ctx->local);
-	if (!NT_STATUS_IS_OK(status)) {
-		DEBUG(0, ("messaging_dgm_init failed: %s\n",
-			  nt_errstr(status)));
-		return status;
+	ret = messaging_dgm_init(msg_ctx, 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);
 	}
 
 	TALLOC_FREE(msg_ctx->remote);
diff --git a/source3/lib/messages_dgm.c b/source3/lib/messages_dgm.c
index 2f30503..8b897f6 100644
--- a/source3/lib/messages_dgm.c
+++ b/source3/lib/messages_dgm.c
@@ -165,9 +165,9 @@ static int messaging_dgm_lockfile_remove(TALLOC_CTX *tmp_ctx,
 	return ret;
 }
 
-NTSTATUS messaging_dgm_init(struct messaging_context *msg_ctx,
-			    TALLOC_CTX *mem_ctx,
-			    struct messaging_backend **presult)
+int messaging_dgm_init(struct messaging_context *msg_ctx,
+		       TALLOC_CTX *mem_ctx,
+		       struct messaging_backend **presult)
 {
 	struct messaging_backend *result;
 	struct messaging_dgm_context *ctx;
@@ -182,8 +182,7 @@ NTSTATUS messaging_dgm_init(struct messaging_context *msg_ctx,
 
 	cache_dir = lp_cache_directory();
 	if (cache_dir == NULL) {
-		NTSTATUS status = map_nt_error_from_unix(errno);
-		return status;
+		return errno;
 	}
 
 	result = talloc(mem_ctx, struct messaging_backend);
@@ -214,7 +213,7 @@ NTSTATUS messaging_dgm_init(struct messaging_context *msg_ctx,
 				"%s/%u", socket_dir, (unsigned)pid.pid);
 	if (sockname_len >= sizeof(socket_address.sun_path)) {
 		TALLOC_FREE(result);
-		return NT_STATUS_NAME_TOO_LONG;
+		return ENAMETOOLONG;
 	}
 
 	sec_init();
@@ -225,7 +224,7 @@ NTSTATUS messaging_dgm_init(struct messaging_context *msg_ctx,
 		DEBUG(1, ("%s: messaging_dgm_create_lockfile failed: %s\n",
 			  __func__, strerror(ret)));
 		TALLOC_FREE(result);
-		return map_nt_error_from_unix(ret);
+		return ret;
 	}
 
 	ctx->msg_callbacks = poll_funcs_init_tevent(ctx);
@@ -245,7 +244,7 @@ NTSTATUS messaging_dgm_init(struct messaging_context *msg_ctx,
 	if (!ok) {
 		DEBUG(1, ("Could not create socket directory\n"));
 		TALLOC_FREE(result);
-		return NT_STATUS_ACCESS_DENIED;
+		return EACCES;
 	}
 	TALLOC_FREE(socket_dir);
 
@@ -258,16 +257,16 @@ NTSTATUS messaging_dgm_init(struct messaging_context *msg_ctx,
 	if (ret != 0) {
 		DEBUG(1, ("unix_msg_init failed: %s\n", strerror(ret)));
 		TALLOC_FREE(result);
-		return map_nt_error_from_unix(ret);
+		return ret;
 	}
 	talloc_set_destructor(ctx, messaging_dgm_context_destructor);
 
 	*presult = result;
-	return NT_STATUS_OK;
+	return 0;
 
 fail_nomem:
 	TALLOC_FREE(result);
-	return NT_STATUS_NO_MEMORY;
+	return ENOMEM;
 }
 
 static int messaging_dgm_context_destructor(struct messaging_dgm_context *c)
-- 
1.8.1.2



More information about the samba-technical mailing list