4bd802b209
Clean up includes so that osdep.h is included first and headers
which it implies are not included manually.
This commit was created with scripts/clean-includes, with the changes
to the following files manually reverted:
contrib/libvhost-user/libvhost-user-glib.h
contrib/libvhost-user/libvhost-user.c
contrib/libvhost-user/libvhost-user.h
contrib/plugins/hotblocks.c
contrib/plugins/hotpages.c
contrib/plugins/howvec.c
contrib/plugins/lockstep.c
linux-user/mips64/cpu_loop.c
linux-user/mips64/signal.c
linux-user/sparc64/cpu_loop.c
linux-user/sparc64/signal.c
linux-user/x86_64/cpu_loop.c
linux-user/x86_64/signal.c
target/s390x/gen-features.c
tests/fp/platform.h
tests/migration/s390x/a-b-bios.c
tests/plugin/bb.c
tests/plugin/empty.c
tests/plugin/insn.c
tests/plugin/mem.c
tests/test-rcu-simpleq.c
tests/test-rcu-slist.c
tests/test-rcu-tailq.c
tests/uefi-test-tools/UefiTestToolsPkg/BiosTablesTest/BiosTablesTest.c
contrib/plugins/, tests/plugin/, and tests/test-rcu-slist.c appear not
to include osdep.h intentionally. The remaining reverts are the same
as in commit bbfff19688
.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20201113061216.2483385-1-armbru@redhat.com>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Tested-by: Thomas Huth <thuth@redhat.com>
Acked-by: Cornelia Huck <cohuck@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Acked-by: Alexander Bulekov <alxndr@bu.edu>
94 lines
2.5 KiB
C
94 lines
2.5 KiB
C
/*
|
|
* FUSE: Filesystem in Userspace
|
|
* Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
|
|
*
|
|
* Utility functions for setting signal handlers.
|
|
*
|
|
* This program can be distributed under the terms of the GNU LGPLv2.
|
|
* See the file COPYING.LIB
|
|
*/
|
|
|
|
#include "qemu/osdep.h"
|
|
#include "fuse_i.h"
|
|
#include "fuse_lowlevel.h"
|
|
|
|
|
|
static struct fuse_session *fuse_instance;
|
|
|
|
static void exit_handler(int sig)
|
|
{
|
|
if (fuse_instance) {
|
|
fuse_session_exit(fuse_instance);
|
|
if (sig <= 0) {
|
|
fuse_log(FUSE_LOG_ERR, "assertion error: signal value <= 0\n");
|
|
abort();
|
|
}
|
|
fuse_instance->error = sig;
|
|
}
|
|
}
|
|
|
|
static void do_nothing(int sig)
|
|
{
|
|
(void)sig;
|
|
}
|
|
|
|
static int set_one_signal_handler(int sig, void (*handler)(int), int remove)
|
|
{
|
|
struct sigaction sa;
|
|
struct sigaction old_sa;
|
|
|
|
memset(&sa, 0, sizeof(struct sigaction));
|
|
sa.sa_handler = remove ? SIG_DFL : handler;
|
|
sigemptyset(&(sa.sa_mask));
|
|
sa.sa_flags = 0;
|
|
|
|
if (sigaction(sig, NULL, &old_sa) == -1) {
|
|
fuse_log(FUSE_LOG_ERR, "fuse: cannot get old signal handler: %s\n",
|
|
strerror(errno));
|
|
return -1;
|
|
}
|
|
|
|
if (old_sa.sa_handler == (remove ? handler : SIG_DFL) &&
|
|
sigaction(sig, &sa, NULL) == -1) {
|
|
fuse_log(FUSE_LOG_ERR, "fuse: cannot set signal handler: %s\n",
|
|
strerror(errno));
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int fuse_set_signal_handlers(struct fuse_session *se)
|
|
{
|
|
/*
|
|
* If we used SIG_IGN instead of the do_nothing function,
|
|
* then we would be unable to tell if we set SIG_IGN (and
|
|
* thus should reset to SIG_DFL in fuse_remove_signal_handlers)
|
|
* or if it was already set to SIG_IGN (and should be left
|
|
* untouched.
|
|
*/
|
|
if (set_one_signal_handler(SIGHUP, exit_handler, 0) == -1 ||
|
|
set_one_signal_handler(SIGINT, exit_handler, 0) == -1 ||
|
|
set_one_signal_handler(SIGTERM, exit_handler, 0) == -1 ||
|
|
set_one_signal_handler(SIGPIPE, do_nothing, 0) == -1) {
|
|
return -1;
|
|
}
|
|
|
|
fuse_instance = se;
|
|
return 0;
|
|
}
|
|
|
|
void fuse_remove_signal_handlers(struct fuse_session *se)
|
|
{
|
|
if (fuse_instance != se) {
|
|
fuse_log(FUSE_LOG_ERR,
|
|
"fuse: fuse_remove_signal_handlers: unknown session\n");
|
|
} else {
|
|
fuse_instance = NULL;
|
|
}
|
|
|
|
set_one_signal_handler(SIGHUP, exit_handler, 1);
|
|
set_one_signal_handler(SIGINT, exit_handler, 1);
|
|
set_one_signal_handler(SIGTERM, exit_handler, 1);
|
|
set_one_signal_handler(SIGPIPE, do_nothing, 1);
|
|
}
|