[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