Skip to content

Commit

Permalink
sleep: On SIGINT, call default SIGINT handler after printing remainin…
Browse files Browse the repository at this point in the history
…g 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 SerenityOS#3419.
  • Loading branch information
nico authored and awesomekling committed Sep 9, 2020
1 parent 92bfe40 commit 4215322
Showing 1 changed file with 9 additions and 1 deletion.
10 changes: 9 additions & 1 deletion Userland/sleep.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,10 @@
#include <string.h>
#include <unistd.h>

static bool g_interrupted;
static void handle_sigint(int)
{
g_interrupted = true;
}

int main(int argc, char** argv)
Expand All @@ -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;
}
Expand All @@ -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;
}

0 comments on commit 4215322

Please sign in to comment.