On Fri, 2016-02-19 at 13:09 +0100, Jan Pokorný wrote:
> Hello Svante,
> 
> On 19/02/16 11:40 +0100, Svante Signell wrote:
> > The attached patch, hurd_support.patch, against git master adds support for
> > the
> > GNU/Hurd OS. Please consider including this patch to upstream git. It has
> > already been reported in Debian as bug #803777 against version 0.17.2.real-
> > 4,
> > see https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=803777
> 
> thanks for you contribution.  Currently, the preferred patchflow is via
> pull requests on GitHub against https://github.com/ClusterLabs/libqb.
> 
> If it doesn't cause you a lot of troubles, could you please forward your
> patches in this direction?
> 
> Otherwise, please at least send full git-formatted patches (git
> format-patch or, even better, git send-email) so that the patch
> authorship is properly tracked.

Attached are two git-formatted patches against the latest git. In order to issue
a git pull request, I'd need an account on github, right?

0001-Add-hurd-support.patch
0002-Fix-address.sun_path-in-lib-ipc_setup.c-and-lib-ipc_.patch

Thanks!
From a3d7393f5e3e9e7d7518a4bdb1a88a948dd98bf2 Mon Sep 17 00:00:00 2001
From: Svante Signell <[email protected]>
Date: Tue, 23 Feb 2016 11:58:53 +0100
Subject: [PATCH 1/2] Add hurd support

* configure.ac: Define QB_GNU
* lib/ipc_setup.c: Add defines on QB_GNU were needed
* lib/ipc_socket.c: Likewise
* lib/unix.c: Likewise
* lib/log_thread.c: Replace second argument of
  qb_log_thread_priority_set: logt_sched_param.sched_priority by 0
  when not supported by the OS.

---
 configure.ac     |  5 +++++
 lib/ipc_setup.c  |  6 +++---
 lib/ipc_socket.c | 16 ++++++++--------
 lib/log_thread.c |  4 ++++
 lib/unix.c       |  2 +-
 5 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/configure.ac b/configure.ac
index 7cfde10..5c54e9f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -335,6 +335,11 @@ case "$host_os" in
 		CP=rsync
 		AC_MSG_RESULT([Solaris])
 	;;
+	*gnu*)
+		AC_DEFINE_UNQUOTED([QB_GNU], [1],
+				   [Compiling for GNU/Hurd platform])
+		AC_MSG_RESULT([GNU])
+	;;
 	*)
 		AC_MSG_ERROR([Unsupported OS? hmmmm])
 	;;
diff --git a/lib/ipc_setup.c b/lib/ipc_setup.c
index 700de94..1a39105 100644
--- a/lib/ipc_setup.c
+++ b/lib/ipc_setup.c
@@ -285,7 +285,7 @@ qb_ipcc_stream_sock_connect(const char *socket_name, int32_t * sock_pt)
 	address.sun_len = QB_SUN_LEN(&address);
 #endif
 
-#if defined(QB_LINUX) || defined(QB_CYGWIN)
+#if defined(QB_LINUX) || defined(QB_CYGWIN) || defined(QB_GNU)
 	snprintf(address.sun_path + 1, UNIX_PATH_MAX - 1, "%s", socket_name);
 #else
 	snprintf(address.sun_path, sizeof(address.sun_path), "%s/%s", SOCKETDIR,
@@ -534,7 +534,7 @@ qb_ipcs_us_publish(struct qb_ipcs_service * s)
 #endif
 
 	qb_util_log(LOG_INFO, "server name: %s", s->name);
-#if defined(QB_LINUX) || defined(QB_CYGWIN)
+#if defined(QB_LINUX) || defined(QB_CYGWIN) || defined(QB_GNU)
 	snprintf(un_addr.sun_path + 1, UNIX_PATH_MAX - 1, "%s", s->name);
 #else
 	{
@@ -566,7 +566,7 @@ qb_ipcs_us_publish(struct qb_ipcs_service * s)
 	 * Allow everyone to write to the socket since the IPC layer handles
 	 * security automatically
 	 */
-#if !defined(QB_LINUX) && !defined(QB_CYGWIN)
+#if !defined(QB_LINUX) && !defined(QB_CYGWIN) && !defined(QB_GNU)
 	res = chmod(un_addr.sun_path, S_IRWXU | S_IRWXG | S_IRWXO);
 #endif
 #ifdef SO_PASSCRED
diff --git a/lib/ipc_socket.c b/lib/ipc_socket.c
index 68ff5e5..89c0588 100644
--- a/lib/ipc_socket.c
+++ b/lib/ipc_socket.c
@@ -50,7 +50,7 @@ set_sock_addr(struct sockaddr_un *address, const char *socket_name)
 	address->sun_len = QB_SUN_LEN(address);
 #endif
 
-#if defined(QB_LINUX) || defined(QB_CYGWIN)
+#if defined(QB_LINUX) || defined(QB_CYGWIN) || defined(QB_GNU)
 	snprintf(address->sun_path + 1, UNIX_PATH_MAX - 1, "%s", socket_name);
 #else
 	snprintf(address->sun_path, sizeof(address->sun_path), "%s/%s", SOCKETDIR,
@@ -80,12 +80,12 @@ qb_ipc_dgram_sock_setup(const char *base_name,
 	}
 	snprintf(sock_path, PATH_MAX, "%s-%s", base_name, service_name);
 	set_sock_addr(&local_address, sock_path);
-#if !(defined(QB_LINUX) || defined(QB_CYGWIN))
+#if !(defined(QB_LINUX) || defined(QB_CYGWIN) || defined(QB_GNU))
 	res = unlink(local_address.sun_path);
 #endif
 	res = bind(request_fd, (struct sockaddr *)&local_address,
 		   sizeof(local_address));
-#if !(defined(QB_LINUX) || defined(QB_CYGWIN))
+#if !(defined(QB_LINUX) || defined(QB_CYGWIN) || defined(QB_GNU))
 	chmod(local_address.sun_path, 0660);
 	chown(local_address.sun_path, -1, gid);
 #endif
@@ -315,7 +315,7 @@ _finish_connecting(struct qb_ipc_one_way *one_way)
 static void
 qb_ipcc_us_disconnect(struct qb_ipcc_connection *c)
 {
-#if !(defined(QB_LINUX) || defined(QB_CYGWIN))
+#if !(defined(QB_LINUX) || defined(QB_CYGWIN) || defined(QB_GNU))
   struct sockaddr_un un_addr;
   socklen_t un_addr_len = sizeof(struct sockaddr_un);
   char *base_name;
@@ -326,7 +326,7 @@ qb_ipcc_us_disconnect(struct qb_ipcc_connection *c)
 	munmap(c->request.u.us.shared_data, SHM_CONTROL_SIZE);
 	unlink(c->request.u.us.shared_file_name);
 
-#if !(defined(QB_LINUX) || defined(QB_CYGWIN))
+#if !(defined(QB_LINUX) || defined(QB_CYGWIN) || defined(QB_GNU))
     if (getsockname(c->response.u.us.sock, (struct sockaddr *)&un_addr, &un_addr_len) == 0) {
       length = strlen(un_addr.sun_path);
       base_name = strndup(un_addr.sun_path,length-9);
@@ -450,7 +450,7 @@ retry_peek:
 
 		if (errno != EAGAIN) {
 			final_rc = -errno;
-#if !(defined(QB_LINUX) || defined(QB_CYGWIN))
+#if !(defined(QB_LINUX) || defined(QB_CYGWIN) || defined(QB_GNU))
 			if (errno == ECONNRESET || errno == EPIPE) {
 				final_rc = -ENOTCONN;
 			}
@@ -685,7 +685,7 @@ _sock_rm_from_mainloop(struct qb_ipcs_connection *c)
 static void
 qb_ipcs_us_disconnect(struct qb_ipcs_connection *c)
 {
-#if !(defined(QB_LINUX) || defined(QB_CYGWIN))
+#if !(defined(QB_LINUX) || defined(QB_CYGWIN) || defined(QB_GNU))
 	struct sockaddr_un un_addr;
 	socklen_t un_addr_len = sizeof(struct sockaddr_un);
 	char *base_name;
@@ -698,7 +698,7 @@ qb_ipcs_us_disconnect(struct qb_ipcs_connection *c)
 	    c->state == QB_IPCS_CONNECTION_ACTIVE) {
 		_sock_rm_from_mainloop(c);
 
-#if !(defined(QB_LINUX) || defined(QB_CYGWIN))
+#if !(defined(QB_LINUX) || defined(QB_CYGWIN) || defined(QB_GNU))
 		if (getsockname(c->response.u.us.sock, (struct sockaddr *)&un_addr, &un_addr_len) == 0) {
 			length = strlen(un_addr.sun_path);
 			base_name = strndup(un_addr.sun_path,length-8);
diff --git a/lib/log_thread.c b/lib/log_thread.c
index 56008f8..930fb33 100644
--- a/lib/log_thread.c
+++ b/lib/log_thread.c
@@ -164,7 +164,11 @@ qb_log_thread_start(void)
 
 	if (logt_sched_param_queued) {
 		res = qb_log_thread_priority_set(logt_sched_policy,
+#if defined(HAVE_PTHREAD_SETSCHEDPARAM) && defined(HAVE_SCHED_GET_PRIORITY_MAX)
 		                                 logt_sched_param.sched_priority);
+#else
+		                                 0);
+#endif
 		if (res != 0) {
 			goto cleanup_pthread;
 		}
diff --git a/lib/unix.c b/lib/unix.c
index 44389d2..59a1ce2 100644
--- a/lib/unix.c
+++ b/lib/unix.c
@@ -80,7 +80,7 @@ qb_sys_mmap_file_open(char *path, const char *file, size_t bytes,
 	if (is_absolute) {
 		(void)strlcpy(path, file, PATH_MAX);
 	} else {
-#if defined(QB_LINUX) || defined(QB_CYGWIN)
+#if defined(QB_LINUX) || defined(QB_CYGWIN) || defined(QB_GNU)
 		snprintf(path, PATH_MAX, "/dev/shm/%s", file);
 #else
 		snprintf(path, PATH_MAX, "%s/%s", SOCKETDIR, file);
-- 
2.6.4

From 604488b10c25d386c40804408d06bc2bd33aa47f Mon Sep 17 00:00:00 2001
From: Svante Signell <[email protected]>
Date: Tue, 23 Feb 2016 12:06:11 +0100
Subject: [PATCH 2/2] Fix address.sun_path in lib/ipc_setup.c and
 lib/ipc_socket.c

This patch fixes writing of the *.sun_path socket names to become
non-zero for bind() and connect().

The previous race condition is back for the ipc_stress_connections_us
test. Adding the unlink statement solves this problem (unknown how,
since res=-1 due to ENOENT: No such file or directory.)

This patch and problem was reported to Debian in bug #803776, see
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=803776

* lib/ipc_setup.c: Fix correct printing of *.sun_path
* lib/ipc_socket.c: Likewise

---
 lib/ipc_setup.c  | 4 ++--
 lib/ipc_socket.c | 4 +++-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/lib/ipc_setup.c b/lib/ipc_setup.c
index 1a39105..6182ec7 100644
--- a/lib/ipc_setup.c
+++ b/lib/ipc_setup.c
@@ -286,7 +286,7 @@ qb_ipcc_stream_sock_connect(const char *socket_name, int32_t * sock_pt)
 #endif
 
 #if defined(QB_LINUX) || defined(QB_CYGWIN) || defined(QB_GNU)
-	snprintf(address.sun_path + 1, UNIX_PATH_MAX - 1, "%s", socket_name);
+	snprintf(address.sun_path, sizeof(address.sun_path), "%s", socket_name);
 #else
 	snprintf(address.sun_path, sizeof(address.sun_path), "%s/%s", SOCKETDIR,
 		 socket_name);
@@ -535,7 +535,7 @@ qb_ipcs_us_publish(struct qb_ipcs_service * s)
 
 	qb_util_log(LOG_INFO, "server name: %s", s->name);
 #if defined(QB_LINUX) || defined(QB_CYGWIN) || defined(QB_GNU)
-	snprintf(un_addr.sun_path + 1, UNIX_PATH_MAX - 1, "%s", s->name);
+	snprintf(un_addr.sun_path, sizeof(un_addr.sun_path), "%s", s->name);
 #else
 	{
 		struct stat stat_out;
diff --git a/lib/ipc_socket.c b/lib/ipc_socket.c
index 89c0588..608a8c6 100644
--- a/lib/ipc_socket.c
+++ b/lib/ipc_socket.c
@@ -51,7 +51,7 @@ set_sock_addr(struct sockaddr_un *address, const char *socket_name)
 #endif
 
 #if defined(QB_LINUX) || defined(QB_CYGWIN) || defined(QB_GNU)
-	snprintf(address->sun_path + 1, UNIX_PATH_MAX - 1, "%s", socket_name);
+	snprintf(address->sun_path, sizeof(address->sun_path), "%s", socket_name);
 #else
 	snprintf(address->sun_path, sizeof(address->sun_path), "%s/%s", SOCKETDIR,
 		 socket_name);
@@ -83,6 +83,8 @@ qb_ipc_dgram_sock_setup(const char *base_name,
 #if !(defined(QB_LINUX) || defined(QB_CYGWIN) || defined(QB_GNU))
 	res = unlink(local_address.sun_path);
 #endif
+	/* Note: This makes the race go away even if res=-1 due to ENOENT */
+	res = unlink(local_address.sun_path);
 	res = bind(request_fd, (struct sockaddr *)&local_address,
 		   sizeof(local_address));
 #if !(defined(QB_LINUX) || defined(QB_CYGWIN) || defined(QB_GNU))
-- 
2.6.4

_______________________________________________
Developers mailing list
[email protected]
http://clusterlabs.org/mailman/listinfo/developers

Reply via email to