Pass $status to process-exit event handlers in all cases

Previously, an event handler would receive -1 if the process exited due
to a signal. Instead pass the same value as $status.
This commit is contained in:
ridiculousfish 2021-05-17 14:34:52 -07:00
parent 82fd8fe9fb
commit 962b0f8b90
4 changed files with 20 additions and 9 deletions

View File

@ -26,6 +26,7 @@ Scripting improvements
- Better errors when a command in a command substitution wasn't found or is not allowed.
- ``fish_indent`` allows to write inline variable assignments on multiple lines (ending in a backslash), instead of joining them into one line (:issue:`7955`).
- fish gained a ``--no-config`` option to disable reading config.fish. This applies both to the user's and the admin's config.fish (typically in /etc/fish/config.fish) and also sets $fish_function_path to just the functions shipped with fish and disables universal variables and history. (:issue:`7921`, :issue:`1256`).
- ``process-exit`` event handlers now receive the same value as ``$status`` in all cases, instead of receiving -1 when the exit was due to a signal.
Interactive improvements
-------------------------

View File

@ -135,12 +135,10 @@ static void print_ignored_signals() {
static void print_stop_cont() {
signal(SIGTSTP, [](int) {
auto __attribute__((unused)) _ = write(STDOUT_FILENO, "SIGTSTP\n", strlen("SIGTSTP\n"));
(void)write(STDOUT_FILENO, "SIGTSTP\n", strlen("SIGTSTP\n"));
kill(getpid(), SIGSTOP);
});
signal(SIGCONT, [](int) {
auto __attribute__((unused)) _ = write(STDOUT_FILENO, "SIGCONT\n", strlen("SIGCONT\n"));
});
signal(SIGCONT, [](int) { (void)write(STDOUT_FILENO, "SIGCONT\n", strlen("SIGCONT\n")); });
char buff[1];
for (;;) {
if (read(STDIN_FILENO, buff, sizeof buff) >= 0) {
@ -149,6 +147,11 @@ static void print_stop_cont() {
}
}
static void sigkill_self() {
kill(getpid(), SIGKILL);
abort();
}
static void show_help();
/// A thing that fish_test_helper can do.
@ -180,6 +183,7 @@ static fth_command_t s_commands[] = {
{"print_ignored_signals", print_ignored_signals,
"Print to stdout the name(s) of ignored signals"},
{"print_stop_cont", print_stop_cont, "Print when we get SIGTSTP and SIGCONT, exiting on input"},
{"sigkill_self", sigkill_self, "Send SIGKILL to self"},
{"help", show_help, "Print list of fish_test_helper commands"},
};

View File

@ -554,8 +554,8 @@ static bool try_clean_process_in_job(parser_t &parser, process_t *p, job_t *j,
// Add an exit event if the process did not come from a job handler.
if (!j->from_event_handler()) {
exit_events->push_back(proc_create_event(L"PROCESS_EXIT", event_type_t::exit, p->pid,
s.normal_exited() ? s.exit_code() : -1));
exit_events->push_back(
proc_create_event(L"PROCESS_EXIT", event_type_t::exit, p->pid, s.status_value()));
}
// Ignore SIGPIPE. We issue it ourselves to the pipe writer when the pipe reader dies.

View File

@ -1,4 +1,4 @@
# RUN: %fish -C 'set -l fish %fish' %s
# RUN: env fish_test_helper=%fish_test_helper %fish -C 'set -l fish %fish' %s
$fish -c 'function main; exit 4; true; end; main'
echo $status
@ -47,13 +47,19 @@ command false | command true
# CHECK: PROCESS_EXIT 0
# CHECK: JOB_EXIT 0
# Signals are reported correctly.
# SIGKILL $status is 128 + 9 = 137
$fish_test_helper sigkill_self
# CHECK: PROCESS_EXIT 137
# CHECK: JOB_EXIT 0
function test_blocks
block -l
command echo "This is the process whose exit event shuld be blocked"
command echo "This is the process whose exit event should be blocked"
echo "This should come before the event handler"
end
test_blocks
# CHECK: This is the process whose exit event shuld be blocked
# CHECK: This is the process whose exit event should be blocked
# CHECK: This should come before the event handler
echo "Now event handler should have run"