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
