From 42153221a54cc58775a254633c54d869d19f95c7 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Tue, 8 Sep 2020 10:19:07 -0400 Subject: [PATCH] sleep: On SIGINT, call default SIGINT handler after printing remaining time With this, hitting ctrl-c twice in `for i in $(seq 10) { sleep 1 }` terminates the loop as expected (...well, I'd expect it to quit after just one ctrl-c, but serenity's shell makes a single ctrl-c only quit the current loop iteration). Part of #3419. --- Userland/sleep.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Userland/sleep.cpp b/Userland/sleep.cpp index 32dd6462754253..025a1443000aff 100644 --- a/Userland/sleep.cpp +++ b/Userland/sleep.cpp @@ -30,8 +30,10 @@ #include #include +static bool g_interrupted; static void handle_sigint(int) { + g_interrupted = true; } int main(int argc, char** argv) @@ -47,7 +49,7 @@ int main(int argc, char** argv) sa.sa_handler = handle_sigint; sigaction(SIGINT, &sa, nullptr); - if (pledge("stdio", nullptr) < 0) { + if (pledge("stdio sigaction", nullptr) < 0) { perror("pledge"); return 1; } @@ -56,5 +58,11 @@ int main(int argc, char** argv) if (remaining) { printf("Sleep interrupted with %u seconds remaining.\n", remaining); } + + if (g_interrupted) { + signal(SIGINT, SIG_DFL); + raise(SIGINT); + } + return 0; }