]> git.proxmox.com Git - mirror_lxcfs.git/commitdiff
bindings: introduce set_signal_handler
authorChristian Brauner <christian.brauner@ubuntu.com>
Sat, 14 Mar 2020 23:39:17 +0000 (00:39 +0100)
committerStéphane Graber <stgraber@ubuntu.com>
Mon, 16 Mar 2020 13:37:21 +0000 (09:37 -0400)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/bindings.c
src/bindings.h
src/lxcfs.c

index e642e6494502b623c17c55cbe818a72cd75b4d45..c297f70cfa2b6d17b2a500b54e4e86c85b383ce7 100644 (file)
@@ -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>
 #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 @@ please_compiler:
        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 (install_signal_handler(SIGUSR2, sigusr2_toggle_virtualization)) {
+               lxcfs_info("%s - Failed to install SIGUSR2 signal handler", strerror(errno));
                goto broken_upgrade;
+       }
 
        reload_successful = 1;
        return;
index 43dc258b21348f1b1871095403c15208c1857ade..ee693af32e283e548b0d0df71db4a35aaaf4cadf 100644 (file)
@@ -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 install_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 */
index db9996447fb871c015539b449ebeb81c8a47175c..44e79569672717340670130a919169dfe1ce04a8 100644 (file)
@@ -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 (install_signal_handler(SIGUSR1, sigusr1_reload)) {
+               lxcfs_error("%s - Failed to install SIGUSR1 signal handler", strerror(errno));
                goto out;
        }