"Fossies" - the Fresh Open Source Software Archive

Member "fuse-3.2.1/lib/fuse_signals.c" (14 Nov 2017, 2282 Bytes) of package /linux/misc/fuse-3.2.1.tar.xz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "fuse_signals.c" see the Fossies "Dox" file reference documentation and the last Fossies "Diffs" side-by-side code changes report: 3.0.2_vs_3.1.0.

    1 /*
    2   FUSE: Filesystem in Userspace
    3   Copyright (C) 2001-2007  Miklos Szeredi <miklos@szeredi.hu>
    4 
    5   Utility functions for setting signal handlers.
    6 
    7   This program can be distributed under the terms of the GNU LGPLv2.
    8   See the file COPYING.LIB
    9 */
   10 
   11 #include "config.h"
   12 #include "fuse_lowlevel.h"
   13 #include "fuse_i.h"
   14 
   15 #include <stdio.h>
   16 #include <string.h>
   17 #include <signal.h>
   18 #include <stdlib.h>
   19 
   20 static struct fuse_session *fuse_instance;
   21 
   22 static void exit_handler(int sig)
   23 {
   24     (void) sig;
   25     if (fuse_instance) {
   26         fuse_session_exit(fuse_instance);
   27         if(sig <= 0) {
   28             fprintf(stderr, "assertion error: signal value <= 0\n");
   29             abort();
   30         }
   31         fuse_instance->error = sig;
   32     }
   33 }
   34 
   35 static void do_nothing(int sig)
   36 {
   37     (void) sig;
   38 }
   39 
   40 static int set_one_signal_handler(int sig, void (*handler)(int), int remove)
   41 {
   42     struct sigaction sa;
   43     struct sigaction old_sa;
   44 
   45     memset(&sa, 0, sizeof(struct sigaction));
   46     sa.sa_handler = remove ? SIG_DFL : handler;
   47     sigemptyset(&(sa.sa_mask));
   48     sa.sa_flags = 0;
   49 
   50     if (sigaction(sig, NULL, &old_sa) == -1) {
   51         perror("fuse: cannot get old signal handler");
   52         return -1;
   53     }
   54 
   55     if (old_sa.sa_handler == (remove ? handler : SIG_DFL) &&
   56         sigaction(sig, &sa, NULL) == -1) {
   57         perror("fuse: cannot set signal handler");
   58         return -1;
   59     }
   60     return 0;
   61 }
   62 
   63 int fuse_set_signal_handlers(struct fuse_session *se)
   64 {
   65     /* If we used SIG_IGN instead of the do_nothing function,
   66        then we would be unable to tell if we set SIG_IGN (and
   67        thus should reset to SIG_DFL in fuse_remove_signal_handlers)
   68        or if it was already set to SIG_IGN (and should be left
   69        untouched. */
   70     if (set_one_signal_handler(SIGHUP, exit_handler, 0) == -1 ||
   71         set_one_signal_handler(SIGINT, exit_handler, 0) == -1 ||
   72         set_one_signal_handler(SIGTERM, exit_handler, 0) == -1 ||
   73         set_one_signal_handler(SIGPIPE, do_nothing, 0) == -1)
   74         return -1;
   75 
   76     fuse_instance = se;
   77     return 0;
   78 }
   79 
   80 void fuse_remove_signal_handlers(struct fuse_session *se)
   81 {
   82     if (fuse_instance != se)
   83         fprintf(stderr,
   84             "fuse: fuse_remove_signal_handlers: unknown session\n");
   85     else
   86         fuse_instance = NULL;
   87 
   88     set_one_signal_handler(SIGHUP, exit_handler, 1);
   89     set_one_signal_handler(SIGINT, exit_handler, 1);
   90     set_one_signal_handler(SIGTERM, exit_handler, 1);
   91     set_one_signal_handler(SIGPIPE, do_nothing, 1);
   92 }