mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-27 05:13:10 +00:00
restyle signal module to match project style
Reduces lint errors from 15 to 15 (-0%). Line count from 754 to 438 (-42%). Another step in resolving issue #2902.
This commit is contained in:
parent
fa53563733
commit
0aa7fd95b8
2 changed files with 151 additions and 467 deletions
565
src/signal.cpp
565
src/signal.cpp
|
@ -1,10 +1,7 @@
|
|||
/** \file signal.c
|
||||
|
||||
The library for various signal related issues
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <signal.h>
|
||||
// The library for various signal related issues.
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#ifdef HAVE_SIGINFO_H
|
||||
#include <siginfo.h>
|
||||
#endif
|
||||
|
@ -12,383 +9,167 @@ The library for various signal related issues
|
|||
#include <stdbool.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "fallback.h" // IWYU pragma: keep
|
||||
#include "wutil.h" // IWYU pragma: keep
|
||||
#include "signal.h"
|
||||
#include "event.h"
|
||||
#include "reader.h"
|
||||
#include "fallback.h" // IWYU pragma: keep
|
||||
#include "proc.h"
|
||||
#include "reader.h"
|
||||
#include "signal.h"
|
||||
#include "wutil.h" // IWYU pragma: keep
|
||||
|
||||
/**
|
||||
Struct describing an entry for the lookup table used to convert
|
||||
between signal names and signal ids, etc.
|
||||
*/
|
||||
struct lookup_entry
|
||||
{
|
||||
/**
|
||||
Signal id
|
||||
*/
|
||||
/// Struct describing an entry for the lookup table used to convert between signal names and signal
|
||||
/// ids, etc.
|
||||
struct lookup_entry {
|
||||
/// Signal id.
|
||||
int signal;
|
||||
/**
|
||||
Signal name
|
||||
*/
|
||||
/// Signal name.
|
||||
const wchar_t *name;
|
||||
/**
|
||||
Signal description
|
||||
*/
|
||||
/// Signal description.
|
||||
const wchar_t *desc;
|
||||
};
|
||||
|
||||
/**
|
||||
The number of signal blocks in place. Increased by signal_block, decreased by signal_unblock.
|
||||
*/
|
||||
static int block_count=0;
|
||||
/// The number of signal blocks in place. Increased by signal_block, decreased by signal_unblock.
|
||||
static int block_count = 0;
|
||||
|
||||
|
||||
/**
|
||||
Lookup table used to convert between signal names and signal ids,
|
||||
etc.
|
||||
*/
|
||||
static const struct lookup_entry lookup[] =
|
||||
{
|
||||
/// Lookup table used to convert between signal names and signal ids, etc.
|
||||
static const struct lookup_entry lookup[] = {
|
||||
#ifdef SIGHUP
|
||||
{
|
||||
SIGHUP,
|
||||
L"SIGHUP",
|
||||
N_(L"Terminal hung up")
|
||||
}
|
||||
,
|
||||
{SIGHUP, L"SIGHUP", N_(L"Terminal hung up")},
|
||||
#endif
|
||||
#ifdef SIGINT
|
||||
{
|
||||
SIGINT,
|
||||
L"SIGINT",
|
||||
N_(L"Quit request from job control (^C)")
|
||||
}
|
||||
,
|
||||
{SIGINT, L"SIGINT", N_(L"Quit request from job control (^C)")},
|
||||
#endif
|
||||
#ifdef SIGQUIT
|
||||
{
|
||||
SIGQUIT,
|
||||
L"SIGQUIT",
|
||||
N_(L"Quit request from job control with core dump (^\\)")
|
||||
}
|
||||
,
|
||||
{SIGQUIT, L"SIGQUIT", N_(L"Quit request from job control with core dump (^\\)")},
|
||||
#endif
|
||||
#ifdef SIGILL
|
||||
{
|
||||
SIGILL,
|
||||
L"SIGILL",
|
||||
N_(L"Illegal instruction")
|
||||
}
|
||||
,
|
||||
{SIGILL, L"SIGILL", N_(L"Illegal instruction")},
|
||||
#endif
|
||||
#ifdef SIGTRAP
|
||||
{
|
||||
SIGTRAP,
|
||||
L"SIGTRAP",
|
||||
N_(L"Trace or breakpoint trap")
|
||||
}
|
||||
,
|
||||
{SIGTRAP, L"SIGTRAP", N_(L"Trace or breakpoint trap")},
|
||||
#endif
|
||||
#ifdef SIGABRT
|
||||
{
|
||||
SIGABRT,
|
||||
L"SIGABRT",
|
||||
N_(L"Abort")
|
||||
}
|
||||
,
|
||||
{SIGABRT, L"SIGABRT", N_(L"Abort")},
|
||||
#endif
|
||||
#ifdef SIGBUS
|
||||
{
|
||||
SIGBUS,
|
||||
L"SIGBUS",
|
||||
N_(L"Misaligned address error")
|
||||
}
|
||||
,
|
||||
{SIGBUS, L"SIGBUS", N_(L"Misaligned address error")},
|
||||
#endif
|
||||
#ifdef SIGFPE
|
||||
{
|
||||
SIGFPE,
|
||||
L"SIGFPE",
|
||||
N_(L"Floating point exception")
|
||||
}
|
||||
,
|
||||
{SIGFPE, L"SIGFPE", N_(L"Floating point exception")},
|
||||
#endif
|
||||
#ifdef SIGKILL
|
||||
{
|
||||
SIGKILL,
|
||||
L"SIGKILL",
|
||||
N_(L"Forced quit")
|
||||
}
|
||||
,
|
||||
{SIGKILL, L"SIGKILL", N_(L"Forced quit")},
|
||||
#endif
|
||||
#ifdef SIGUSR1
|
||||
{
|
||||
SIGUSR1,
|
||||
L"SIGUSR1",
|
||||
N_(L"User defined signal 1")
|
||||
}
|
||||
,
|
||||
{SIGUSR1, L"SIGUSR1", N_(L"User defined signal 1")},
|
||||
#endif
|
||||
#ifdef SIGUSR2
|
||||
{
|
||||
SIGUSR2, L"SIGUSR2",
|
||||
N_(L"User defined signal 2")
|
||||
}
|
||||
,
|
||||
{SIGUSR2, L"SIGUSR2", N_(L"User defined signal 2")},
|
||||
#endif
|
||||
#ifdef SIGSEGV
|
||||
{
|
||||
SIGSEGV,
|
||||
L"SIGSEGV",
|
||||
N_(L"Address boundary error")
|
||||
}
|
||||
,
|
||||
{SIGSEGV, L"SIGSEGV", N_(L"Address boundary error")},
|
||||
#endif
|
||||
#ifdef SIGPIPE
|
||||
{
|
||||
SIGPIPE,
|
||||
L"SIGPIPE",
|
||||
N_(L"Broken pipe")
|
||||
}
|
||||
,
|
||||
{SIGPIPE, L"SIGPIPE", N_(L"Broken pipe")},
|
||||
#endif
|
||||
#ifdef SIGALRM
|
||||
{
|
||||
SIGALRM,
|
||||
L"SIGALRM",
|
||||
N_(L"Timer expired")
|
||||
}
|
||||
,
|
||||
{SIGALRM, L"SIGALRM", N_(L"Timer expired")},
|
||||
#endif
|
||||
#ifdef SIGTERM
|
||||
{
|
||||
SIGTERM,
|
||||
L"SIGTERM",
|
||||
N_(L"Polite quit request")
|
||||
}
|
||||
,
|
||||
{SIGTERM, L"SIGTERM", N_(L"Polite quit request")},
|
||||
#endif
|
||||
#ifdef SIGCHLD
|
||||
{
|
||||
SIGCHLD,
|
||||
L"SIGCHLD",
|
||||
N_(L"Child process status changed")
|
||||
}
|
||||
,
|
||||
{SIGCHLD, L"SIGCHLD", N_(L"Child process status changed")},
|
||||
#endif
|
||||
#ifdef SIGCONT
|
||||
{
|
||||
SIGCONT,
|
||||
L"SIGCONT",
|
||||
N_(L"Continue previously stopped process")
|
||||
}
|
||||
,
|
||||
{SIGCONT, L"SIGCONT", N_(L"Continue previously stopped process")},
|
||||
#endif
|
||||
#ifdef SIGSTOP
|
||||
{
|
||||
SIGSTOP,
|
||||
L"SIGSTOP",
|
||||
N_(L"Forced stop")
|
||||
}
|
||||
,
|
||||
{SIGSTOP, L"SIGSTOP", N_(L"Forced stop")},
|
||||
#endif
|
||||
#ifdef SIGTSTP
|
||||
{
|
||||
SIGTSTP,
|
||||
L"SIGTSTP",
|
||||
N_(L"Stop request from job control (^Z)")
|
||||
}
|
||||
,
|
||||
{SIGTSTP, L"SIGTSTP", N_(L"Stop request from job control (^Z)")},
|
||||
#endif
|
||||
#ifdef SIGTTIN
|
||||
{
|
||||
SIGTTIN,
|
||||
L"SIGTTIN",
|
||||
N_(L"Stop from terminal input")
|
||||
}
|
||||
,
|
||||
{SIGTTIN, L"SIGTTIN", N_(L"Stop from terminal input")},
|
||||
#endif
|
||||
#ifdef SIGTTOU
|
||||
{
|
||||
SIGTTOU,
|
||||
L"SIGTTOU",
|
||||
N_(L"Stop from terminal output")
|
||||
}
|
||||
,
|
||||
{SIGTTOU, L"SIGTTOU", N_(L"Stop from terminal output")},
|
||||
#endif
|
||||
#ifdef SIGURG
|
||||
{
|
||||
SIGURG,
|
||||
L"SIGURG",
|
||||
N_(L"Urgent socket condition")
|
||||
}
|
||||
,
|
||||
{SIGURG, L"SIGURG", N_(L"Urgent socket condition")},
|
||||
#endif
|
||||
#ifdef SIGXCPU
|
||||
{
|
||||
SIGXCPU,
|
||||
L"SIGXCPU",
|
||||
N_(L"CPU time limit exceeded")
|
||||
}
|
||||
,
|
||||
{SIGXCPU, L"SIGXCPU", N_(L"CPU time limit exceeded")},
|
||||
#endif
|
||||
#ifdef SIGXFSZ
|
||||
{
|
||||
SIGXFSZ,
|
||||
L"SIGXFSZ",
|
||||
N_(L"File size limit exceeded")
|
||||
}
|
||||
,
|
||||
{SIGXFSZ, L"SIGXFSZ", N_(L"File size limit exceeded")},
|
||||
#endif
|
||||
#ifdef SIGVTALRM
|
||||
{
|
||||
SIGVTALRM,
|
||||
L"SIGVTALRM",
|
||||
N_(L"Virtual timer expired")
|
||||
}
|
||||
,
|
||||
{SIGVTALRM, L"SIGVTALRM", N_(L"Virtual timer expired")},
|
||||
#endif
|
||||
#ifdef SIGPROF
|
||||
{
|
||||
SIGPROF,
|
||||
L"SIGPROF",
|
||||
N_(L"Profiling timer expired")
|
||||
}
|
||||
,
|
||||
{SIGPROF, L"SIGPROF", N_(L"Profiling timer expired")},
|
||||
#endif
|
||||
#ifdef SIGWINCH
|
||||
{
|
||||
SIGWINCH,
|
||||
L"SIGWINCH",
|
||||
N_(L"Window size change")
|
||||
}
|
||||
,
|
||||
{SIGWINCH, L"SIGWINCH", N_(L"Window size change")},
|
||||
#endif
|
||||
#ifdef SIGWIND
|
||||
{
|
||||
SIGWIND,
|
||||
L"SIGWIND",
|
||||
N_(L"Window size change")
|
||||
}
|
||||
,
|
||||
{SIGWIND, L"SIGWIND", N_(L"Window size change")},
|
||||
#endif
|
||||
#ifdef SIGIO
|
||||
{
|
||||
SIGIO,
|
||||
L"SIGIO",
|
||||
N_(L"I/O on asynchronous file descriptor is possible")
|
||||
}
|
||||
,
|
||||
{SIGIO, L"SIGIO", N_(L"I/O on asynchronous file descriptor is possible")},
|
||||
#endif
|
||||
#ifdef SIGPWR
|
||||
{
|
||||
SIGPWR,
|
||||
L"SIGPWR",
|
||||
N_(L"Power failure")
|
||||
}
|
||||
,
|
||||
{SIGPWR, L"SIGPWR", N_(L"Power failure")},
|
||||
#endif
|
||||
#ifdef SIGSYS
|
||||
{
|
||||
SIGSYS,
|
||||
L"SIGSYS",
|
||||
N_(L"Bad system call")
|
||||
}
|
||||
,
|
||||
{SIGSYS, L"SIGSYS", N_(L"Bad system call")},
|
||||
#endif
|
||||
#ifdef SIGINFO
|
||||
{
|
||||
SIGINFO,
|
||||
L"SIGINFO",
|
||||
N_(L"Information request")
|
||||
}
|
||||
,
|
||||
{SIGINFO, L"SIGINFO", N_(L"Information request")},
|
||||
#endif
|
||||
#ifdef SIGSTKFLT
|
||||
{
|
||||
SIGSTKFLT,
|
||||
L"SISTKFLT",
|
||||
N_(L"Stack fault")
|
||||
}
|
||||
,
|
||||
{SIGSTKFLT, L"SISTKFLT", N_(L"Stack fault")},
|
||||
#endif
|
||||
#ifdef SIGEMT
|
||||
{
|
||||
SIGEMT,
|
||||
L"SIGEMT",
|
||||
N_(L"Emulator trap")
|
||||
}
|
||||
,
|
||||
{SIGEMT, L"SIGEMT", N_(L"Emulator trap")},
|
||||
#endif
|
||||
#ifdef SIGIOT
|
||||
{
|
||||
SIGIOT,
|
||||
L"SIGIOT",
|
||||
N_(L"Abort (Alias for SIGABRT)")
|
||||
}
|
||||
,
|
||||
{SIGIOT, L"SIGIOT", N_(L"Abort (Alias for SIGABRT)")},
|
||||
#endif
|
||||
#ifdef SIGUNUSED
|
||||
{
|
||||
SIGUNUSED,
|
||||
L"SIGUNUSED",
|
||||
N_(L"Unused signal")
|
||||
}
|
||||
,
|
||||
{SIGUNUSED, L"SIGUNUSED", N_(L"Unused signal")},
|
||||
#endif
|
||||
{
|
||||
0,
|
||||
0,
|
||||
0
|
||||
}
|
||||
}
|
||||
;
|
||||
{0, 0, 0}};
|
||||
|
||||
/// Test if \c name is a string describing the signal named \c canonical.
|
||||
static int match_signal_name(const wchar_t *canonical, const wchar_t *name) {
|
||||
if (wcsncasecmp(name, L"sig", 3) == 0) name += 3;
|
||||
|
||||
/**
|
||||
Test if \c name is a string describing the signal named \c canonical.
|
||||
*/
|
||||
static int match_signal_name(const wchar_t *canonical,
|
||||
const wchar_t *name)
|
||||
{
|
||||
if (wcsncasecmp(name, L"sig", 3)==0)
|
||||
name +=3;
|
||||
|
||||
return wcscasecmp(canonical+3,name) == 0;
|
||||
return wcscasecmp(canonical + 3, name) == 0;
|
||||
}
|
||||
|
||||
|
||||
int wcs2sig(const wchar_t *str)
|
||||
{
|
||||
int wcs2sig(const wchar_t *str) {
|
||||
int i;
|
||||
wchar_t *end=0;
|
||||
wchar_t *end = 0;
|
||||
|
||||
for (i=0; lookup[i].desc ; i++)
|
||||
{
|
||||
if (match_signal_name(lookup[i].name, str))
|
||||
{
|
||||
for (i = 0; lookup[i].desc; i++) {
|
||||
if (match_signal_name(lookup[i].name, str)) {
|
||||
return lookup[i].signal;
|
||||
}
|
||||
}
|
||||
errno=0;
|
||||
errno = 0;
|
||||
int res = fish_wcstoi(str, &end, 10);
|
||||
if (!errno && res>=0 && !*end)
|
||||
return res;
|
||||
if (!errno && res >= 0 && !*end) return res;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
const wchar_t *sig2wcs(int sig)
|
||||
{
|
||||
const wchar_t *sig2wcs(int sig) {
|
||||
int i;
|
||||
|
||||
for (i=0; lookup[i].desc ; i++)
|
||||
{
|
||||
if (lookup[i].signal == sig)
|
||||
{
|
||||
for (i = 0; lookup[i].desc; i++) {
|
||||
if (lookup[i].signal == sig) {
|
||||
return lookup[i].name;
|
||||
}
|
||||
}
|
||||
|
@ -396,14 +177,11 @@ const wchar_t *sig2wcs(int sig)
|
|||
return _(L"Unknown");
|
||||
}
|
||||
|
||||
const wchar_t *signal_get_desc(int sig)
|
||||
{
|
||||
const wchar_t *signal_get_desc(int sig) {
|
||||
int i;
|
||||
|
||||
for (i=0; lookup[i].desc ; i++)
|
||||
{
|
||||
if (lookup[i].signal == sig)
|
||||
{
|
||||
for (i = 0; lookup[i].desc; i++) {
|
||||
if (lookup[i].signal == sig) {
|
||||
return _(lookup[i].desc);
|
||||
}
|
||||
}
|
||||
|
@ -411,103 +189,74 @@ const wchar_t *signal_get_desc(int sig)
|
|||
return _(L"Unknown");
|
||||
}
|
||||
|
||||
/**
|
||||
Standard signal handler
|
||||
*/
|
||||
static void default_handler(int signal, siginfo_t *info, void *context)
|
||||
{
|
||||
if (event_is_signal_observed(signal))
|
||||
{
|
||||
/// Standard signal handler.
|
||||
static void default_handler(int signal, siginfo_t *info, void *context) {
|
||||
if (event_is_signal_observed(signal)) {
|
||||
event_fire_signal(signal);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Respond to a winch signal by checking the terminal size
|
||||
*/
|
||||
static void handle_winch(int sig, siginfo_t *info, void *context)
|
||||
{
|
||||
/// Respond to a winch signal by checking the terminal size.
|
||||
static void handle_winch(int sig, siginfo_t *info, void *context) {
|
||||
common_handle_winch(sig);
|
||||
default_handler(sig, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
Respond to a hup signal by exiting, unless it is caught by a
|
||||
shellscript function, in which case we do nothing.
|
||||
*/
|
||||
static void handle_hup(int sig, siginfo_t *info, void *context)
|
||||
{
|
||||
if (event_is_signal_observed(SIGHUP))
|
||||
{
|
||||
/// Respond to a hup signal by exiting, unless it is caught by a shellscript function, in which case
|
||||
/// we do nothing.
|
||||
static void handle_hup(int sig, siginfo_t *info, void *context) {
|
||||
if (event_is_signal_observed(SIGHUP)) {
|
||||
default_handler(sig, 0, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
reader_exit(1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
/** Handle sigterm. The only thing we do is restore the front process ID, then die. */
|
||||
static void handle_term(int sig, siginfo_t *info, void *context)
|
||||
{
|
||||
/// Handle sigterm. The only thing we do is restore the front process ID, then die.
|
||||
static void handle_term(int sig, siginfo_t *info, void *context) {
|
||||
restore_term_foreground_process_group();
|
||||
signal(SIGTERM, SIG_DFL);
|
||||
raise(SIGTERM);
|
||||
}
|
||||
|
||||
/**
|
||||
Interactive mode ^C handler. Respond to int signal by setting
|
||||
interrupted-flag and stopping all loops and conditionals.
|
||||
*/
|
||||
static void handle_int(int sig, siginfo_t *info, void *context)
|
||||
{
|
||||
/// Interactive mode ^C handler. Respond to int signal by setting interrupted-flag and stopping all
|
||||
/// loops and conditionals.
|
||||
static void handle_int(int sig, siginfo_t *info, void *context) {
|
||||
reader_handle_int(sig);
|
||||
default_handler(sig, info, context);
|
||||
}
|
||||
|
||||
/**
|
||||
sigchld handler. Does notification and calls the handler in proc.c
|
||||
*/
|
||||
static void handle_chld(int sig, siginfo_t *info, void *context)
|
||||
{
|
||||
/// sigchld handler. Does notification and calls the handler in proc.c.
|
||||
static void handle_chld(int sig, siginfo_t *info, void *context) {
|
||||
job_handle_signal(sig, info, context);
|
||||
default_handler(sig, info, context);
|
||||
}
|
||||
|
||||
void signal_reset_handlers()
|
||||
{
|
||||
void signal_reset_handlers() {
|
||||
int i;
|
||||
|
||||
struct sigaction act;
|
||||
sigemptyset(& act.sa_mask);
|
||||
act.sa_flags=0;
|
||||
act.sa_handler=SIG_DFL;
|
||||
sigemptyset(&act.sa_mask);
|
||||
act.sa_flags = 0;
|
||||
act.sa_handler = SIG_DFL;
|
||||
|
||||
for (i=0; lookup[i].desc ; i++)
|
||||
{
|
||||
for (i = 0; lookup[i].desc; i++) {
|
||||
sigaction(lookup[i].signal, &act, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Sets appropriate signal handlers.
|
||||
*/
|
||||
void signal_set_handlers()
|
||||
{
|
||||
/// Sets appropriate signal handlers.
|
||||
void signal_set_handlers() {
|
||||
struct sigaction act;
|
||||
|
||||
if (get_is_interactive() == -1)
|
||||
return;
|
||||
if (get_is_interactive() == -1) return;
|
||||
|
||||
sigemptyset(& act.sa_mask);
|
||||
act.sa_flags=SA_SIGINFO;
|
||||
sigemptyset(&act.sa_mask);
|
||||
act.sa_flags = SA_SIGINFO;
|
||||
act.sa_sigaction = &default_handler;
|
||||
|
||||
/*
|
||||
First reset everything to a use default_handler, a function
|
||||
whose sole action is to fire of an event
|
||||
*/
|
||||
// First reset everything to a use default_handler, a function whose sole action is to fire of
|
||||
// an event.
|
||||
sigaction(SIGINT, &act, 0);
|
||||
sigaction(SIGQUIT, &act, 0);
|
||||
sigaction(SIGTSTP, &act, 0);
|
||||
|
@ -515,19 +264,13 @@ void signal_set_handlers()
|
|||
sigaction(SIGTTOU, &act, 0);
|
||||
sigaction(SIGCHLD, &act, 0);
|
||||
|
||||
/*
|
||||
Ignore sigpipe, which we may get from the universal variable notifier.
|
||||
*/
|
||||
// Ignore sigpipe, which we may get from the universal variable notifier.
|
||||
sigaction(SIGPIPE, &act, 0);
|
||||
|
||||
if (get_is_interactive())
|
||||
{
|
||||
/*
|
||||
Interactive mode. Ignore interactive signals. We are a
|
||||
shell, we know whats best for the user. ;-)
|
||||
*/
|
||||
|
||||
act.sa_handler=SIG_IGN;
|
||||
if (get_is_interactive()) {
|
||||
// Interactive mode. Ignore interactive signals. We are a shell, we know whats best for the
|
||||
// user.
|
||||
act.sa_handler = SIG_IGN;
|
||||
|
||||
sigaction(SIGINT, &act, 0);
|
||||
sigaction(SIGQUIT, &act, 0);
|
||||
|
@ -537,95 +280,71 @@ void signal_set_handlers()
|
|||
|
||||
act.sa_sigaction = &handle_int;
|
||||
act.sa_flags = SA_SIGINFO;
|
||||
if (sigaction(SIGINT, &act, 0))
|
||||
{
|
||||
if (sigaction(SIGINT, &act, 0)) {
|
||||
wperror(L"sigaction");
|
||||
FATAL_EXIT();
|
||||
}
|
||||
|
||||
act.sa_sigaction = &handle_chld;
|
||||
act.sa_flags = SA_SIGINFO;
|
||||
if (sigaction(SIGCHLD, &act, 0))
|
||||
{
|
||||
if (sigaction(SIGCHLD, &act, 0)) {
|
||||
wperror(L"sigaction");
|
||||
FATAL_EXIT();
|
||||
}
|
||||
|
||||
#ifdef SIGWINCH
|
||||
act.sa_flags = SA_SIGINFO;
|
||||
act.sa_sigaction= &handle_winch;
|
||||
if (sigaction(SIGWINCH, &act, 0))
|
||||
{
|
||||
act.sa_sigaction = &handle_winch;
|
||||
if (sigaction(SIGWINCH, &act, 0)) {
|
||||
wperror(L"sigaction");
|
||||
FATAL_EXIT();
|
||||
}
|
||||
#endif
|
||||
|
||||
act.sa_flags = SA_SIGINFO;
|
||||
act.sa_sigaction= &handle_hup;
|
||||
if (sigaction(SIGHUP, &act, 0))
|
||||
{
|
||||
act.sa_sigaction = &handle_hup;
|
||||
if (sigaction(SIGHUP, &act, 0)) {
|
||||
wperror(L"sigaction");
|
||||
FATAL_EXIT();
|
||||
}
|
||||
|
||||
// SIGTERM restores the terminal controlling process before dying
|
||||
// SIGTERM restores the terminal controlling process before dying.
|
||||
act.sa_flags = SA_SIGINFO;
|
||||
act.sa_sigaction= &handle_term;
|
||||
if (sigaction(SIGTERM, &act, 0))
|
||||
{
|
||||
act.sa_sigaction = &handle_term;
|
||||
if (sigaction(SIGTERM, &act, 0)) {
|
||||
wperror(L"sigaction");
|
||||
FATAL_EXIT();
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
Non-interactive. Ignore interrupt, check exit status of
|
||||
processes to determine result instead.
|
||||
*/
|
||||
act.sa_handler=SIG_IGN;
|
||||
|
||||
} else {
|
||||
// Non-interactive. Ignore interrupt, check exit status of processes to determine result
|
||||
// instead.
|
||||
act.sa_handler = SIG_IGN;
|
||||
sigaction(SIGINT, &act, 0);
|
||||
sigaction(SIGQUIT, &act, 0);
|
||||
|
||||
act.sa_handler=SIG_DFL;
|
||||
|
||||
act.sa_handler = SIG_DFL;
|
||||
act.sa_sigaction = &handle_chld;
|
||||
act.sa_flags = SA_SIGINFO;
|
||||
if (sigaction(SIGCHLD, &act, 0))
|
||||
{
|
||||
if (sigaction(SIGCHLD, &act, 0)) {
|
||||
wperror(L"sigaction");
|
||||
exit_without_destructors(1);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void signal_handle(int sig, int do_handle)
|
||||
{
|
||||
void signal_handle(int sig, int do_handle) {
|
||||
struct sigaction act;
|
||||
|
||||
/*
|
||||
These should always be handled
|
||||
*/
|
||||
if ((sig == SIGINT) ||
|
||||
(sig == SIGQUIT) ||
|
||||
(sig == SIGTSTP) ||
|
||||
(sig == SIGTTIN) ||
|
||||
(sig == SIGTTOU) ||
|
||||
(sig == SIGCHLD))
|
||||
// These should always be handled.
|
||||
if ((sig == SIGINT) || (sig == SIGQUIT) || (sig == SIGTSTP) || (sig == SIGTTIN) ||
|
||||
(sig == SIGTTOU) || (sig == SIGCHLD))
|
||||
return;
|
||||
|
||||
sigemptyset(&act.sa_mask);
|
||||
if (do_handle)
|
||||
{
|
||||
if (do_handle) {
|
||||
act.sa_flags = SA_SIGINFO;
|
||||
act.sa_sigaction = &default_handler;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
act.sa_flags = 0;
|
||||
act.sa_handler = SIG_DFL;
|
||||
}
|
||||
|
@ -633,57 +352,45 @@ void signal_handle(int sig, int do_handle)
|
|||
sigaction(sig, &act, 0);
|
||||
}
|
||||
|
||||
void get_signals_with_handlers(sigset_t *set)
|
||||
{
|
||||
void get_signals_with_handlers(sigset_t *set) {
|
||||
sigemptyset(set);
|
||||
for (int i=0; lookup[i].desc ; i++)
|
||||
{
|
||||
for (int i = 0; lookup[i].desc; i++) {
|
||||
struct sigaction act = {};
|
||||
sigaction(lookup[i].signal, NULL, &act);
|
||||
if (act.sa_handler != SIG_DFL)
|
||||
sigaddset(set, lookup[i].signal);
|
||||
if (act.sa_handler != SIG_DFL) sigaddset(set, lookup[i].signal);
|
||||
}
|
||||
}
|
||||
|
||||
void signal_block()
|
||||
{
|
||||
void signal_block() {
|
||||
ASSERT_IS_MAIN_THREAD();
|
||||
sigset_t chldset;
|
||||
|
||||
if (!block_count)
|
||||
{
|
||||
if (!block_count) {
|
||||
sigfillset(&chldset);
|
||||
VOMIT_ON_FAILURE(pthread_sigmask(SIG_BLOCK, &chldset, NULL));
|
||||
}
|
||||
|
||||
block_count++;
|
||||
// debug( 0, L"signal block level increased to %d", block_count );
|
||||
// debug( 0, L"signal block level increased to %d", block_count );
|
||||
}
|
||||
|
||||
void signal_unblock()
|
||||
{
|
||||
void signal_unblock() {
|
||||
ASSERT_IS_MAIN_THREAD();
|
||||
sigset_t chldset;
|
||||
|
||||
block_count--;
|
||||
|
||||
if (block_count < 0)
|
||||
{
|
||||
if (block_count < 0) {
|
||||
debug(0, _(L"Signal block mismatch"));
|
||||
bugreport();
|
||||
FATAL_EXIT();
|
||||
}
|
||||
|
||||
if (!block_count)
|
||||
{
|
||||
if (!block_count) {
|
||||
sigfillset(&chldset);
|
||||
VOMIT_ON_FAILURE(pthread_sigmask(SIG_UNBLOCK, &chldset, 0));
|
||||
}
|
||||
// debug( 0, L"signal block level decreased to %d", block_count );
|
||||
}
|
||||
|
||||
bool signal_is_blocked()
|
||||
{
|
||||
return !!block_count;
|
||||
// debug( 0, L"signal block level decreased to %d", block_count );
|
||||
}
|
||||
|
||||
bool signal_is_blocked() { return !!block_count; }
|
||||
|
|
53
src/signal.h
53
src/signal.h
|
@ -1,65 +1,42 @@
|
|||
/** \file signal.h
|
||||
|
||||
The library for various signal related issues
|
||||
*/
|
||||
// The library for various signal related issues.
|
||||
#ifndef FISH_SIGNALH
|
||||
#define FISH_SIGNALH
|
||||
|
||||
#include <signal.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
/**
|
||||
Get the integer signal value representing the specified signal, or
|
||||
-1 of no signal was found
|
||||
*/
|
||||
/// Get the integer signal value representing the specified signal, or -1 of no signal was found.
|
||||
int wcs2sig(const wchar_t *str);
|
||||
|
||||
/**
|
||||
Get string representation of a signal
|
||||
*/
|
||||
/// Get string representation of a signal.
|
||||
const wchar_t *sig2wcs(int sig);
|
||||
|
||||
/**
|
||||
Returns a description of the specified signal.
|
||||
*/
|
||||
/// Returns a description of the specified signal.
|
||||
const wchar_t *signal_get_desc(int sig);
|
||||
|
||||
/**
|
||||
Set all signal handlers to SIG_DFL
|
||||
*/
|
||||
/// Set all signal handlers to SIG_DFL.
|
||||
void signal_reset_handlers();
|
||||
|
||||
/**
|
||||
Set signal handlers to fish default handlers
|
||||
*/
|
||||
/// Set signal handlers to fish default handlers.
|
||||
void signal_set_handlers();
|
||||
|
||||
/**
|
||||
Tell fish what to do on the specified signal.
|
||||
|
||||
\param sig The signal to specify the action of
|
||||
\param do_handle If true fish will catch the specified signal and fire an event, otherwise the default action (SIG_DFL) will be set
|
||||
*/
|
||||
/// Tell fish what to do on the specified signal.
|
||||
///
|
||||
/// \param sig The signal to specify the action of
|
||||
/// \param do_handle If true fish will catch the specified signal and fire an event, otherwise the
|
||||
/// default action (SIG_DFL) will be set
|
||||
void signal_handle(int sig, int do_handle);
|
||||
|
||||
/**
|
||||
Block all signals
|
||||
*/
|
||||
/// Block all signals.
|
||||
void signal_block();
|
||||
|
||||
/**
|
||||
Unblock all signals
|
||||
*/
|
||||
/// Unblock all signals.
|
||||
void signal_unblock();
|
||||
|
||||
/**
|
||||
Returns true if signals are being blocked
|
||||
*/
|
||||
/// Returns true if signals are being blocked.
|
||||
bool signal_is_blocked();
|
||||
|
||||
/**
|
||||
Returns signals with non-default handlers
|
||||
*/
|
||||
/// Returns signals with non-default handlers.
|
||||
void get_signals_with_handlers(sigset_t *set);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue