[lxc-devel] [lxcfs/master] bindings: introduce set_signal_handler

brauner on Github lxc-bot at linuxcontainers.org
Sat Mar 14 23:41:35 UTC 2020


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 365 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200314/9cabe316/attachment-0001.bin>
-------------- next part --------------
From 950353e057f7f8b20d278540bcf953e7959aa9e9 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Sun, 15 Mar 2020 00:39:17 +0100
Subject: [PATCH] bindings: introduce set_signal_handler

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
 src/bindings.c | 34 ++++++++++------------------------
 src/bindings.h | 12 ++++++++++++
 src/lxcfs.c    |  6 +++---
 3 files changed, 25 insertions(+), 27 deletions(-)

diff --git a/src/bindings.c b/src/bindings.c
index e642e64..78f27e7 100644
--- a/src/bindings.c
+++ b/src/bindings.c
@@ -16,6 +16,8 @@
 #include <fuse.h>
 #include <inttypes.h>
 #include <libgen.h>
+#include <linux/magic.h>
+#include <linux/sched.h>
 #include <pthread.h>
 #include <sched.h>
 #include <stdarg.h>
@@ -24,27 +26,24 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <time.h>
-#include <unistd.h>
-#include <wait.h>
-#include <linux/magic.h>
-#include <linux/sched.h>
 #include <sys/epoll.h>
 #include <sys/mman.h>
 #include <sys/mount.h>
 #include <sys/param.h>
-#include <signal.h>
 #include <sys/socket.h>
 #include <sys/syscall.h>
 #include <sys/sysinfo.h>
 #include <sys/vfs.h>
+#include <time.h>
+#include <unistd.h>
+#include <wait.h>
 
 #include "api_extensions.h"
 #include "bindings.h"
-#include "config.h"
 #include "cgroup_fuse.h"
 #include "cgroups/cgroup.h"
 #include "cgroups/cgroup_utils.h"
+#include "config.h"
 #include "memory_utils.h"
 #include "proc_cpuview.h"
 #include "utils.h"
@@ -722,7 +721,7 @@ static bool cgfs_setup_controllers(void)
 	return true;
 }
 
-static void sigusr2_handler(int signo, siginfo_t *info, void *extra)
+static void sigusr2_toggle_virtualization(int signo, siginfo_t *info, void *extra)
 {
 	int ret;
 
@@ -755,21 +754,6 @@ static void sigusr2_handler(int signo, siginfo_t *info, void *extra)
 	return;
 }
 
-static int set_sigusr2_handler(void)
-{
-	int ret;
-	struct sigaction action = {
-		.sa_flags = SA_SIGINFO,
-		.sa_sigaction = sigusr2_handler,
-	};
-
-	ret = sigaction(SIGUSR2, &action, NULL);
-	if (ret)
-		return log_error_errno(-1, errno, "Failed to set SIGUSR2 signal handler");
-
-	return 0;
-}
-
 static void __attribute__((constructor)) lxcfs_init(void)
 {
 	__do_close_prot_errno int init_ns = -EBADF, root_fd = -EBADF,
@@ -837,8 +821,10 @@ static void __attribute__((constructor)) lxcfs_init(void)
 	else if (fchdir(root_fd) < 0)
 		lxcfs_info("%s - Failed to change to root directory", strerror(errno));
 
-	if (set_sigusr2_handler())
+	if (set_signal_handler(SIGUSR2, sigusr2_toggle_virtualization)) {
+		lxcfs_info("%s - Failed to install SIGUSR2 signal handler");
 		goto broken_upgrade;
+	}
 
 	reload_successful = 1;
 	return;
diff --git a/src/bindings.h b/src/bindings.h
index 43dc258..33b850f 100644
--- a/src/bindings.h
+++ b/src/bindings.h
@@ -14,6 +14,7 @@
 #define _FILE_OFFSET_BITS 64
 
 #include <fuse.h>
+#include <signal.h>
 #include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -91,4 +92,15 @@ extern void prune_init_slice(char *cg);
 extern bool supports_pidfd(void);
 extern bool liblxcfs_functional(void);
 
+static inline int set_signal_handler(int signo,
+				     void (*handler)(int, siginfo_t *, void *))
+{
+	struct sigaction action = {
+	    .sa_flags = SA_SIGINFO,
+	    .sa_sigaction = handler,
+	};
+
+	return sigaction(signo, &action, NULL);
+}
+
 #endif /* __LXCFS_BINDINGS_H */
diff --git a/src/lxcfs.c b/src/lxcfs.c
index db99964..2af67b4 100644
--- a/src/lxcfs.c
+++ b/src/lxcfs.c
@@ -173,7 +173,7 @@ static void down_users(void)
 	users_unlock();
 }
 
-static void reload_handler(int sig)
+static void sigusr1_reload(int signo, siginfo_t *info, void *extra)
 {
 	need_reload = 1;
 }
@@ -1148,8 +1148,8 @@ int main(int argc, char *argv[])
 		usage();
 
 	do_reload();
-	if (signal(SIGUSR1, reload_handler) == SIG_ERR) {
-		lxcfs_error("Error setting USR1 signal handler: %m");
+	if (set_signal_handler(SIGUSR1, sigusr1_reload)) {
+		lxcfs_error("%s - Failed to install SIGUSR1 signal handler");
 		goto out;
 	}
 


More information about the lxc-devel mailing list