libroot: system() should ignore SIGINT, SIGQUIT while waiting

https://pubs.opengroup.org/onlinepubs/9699919799/functions/system.html
Change-Id: Ic9919e403fb4e6ee4406b0c33789fe8b00b22d1f
Reviewed-on: https://review.haiku-os.org/c/haiku/+/5341
Reviewed-by: waddlesplash <[email protected]>
Tested-by: Commit checker robot <[email protected]>
This commit is contained in:
Jérôme Duval
2022-05-26 18:48:02 +00:00
committed by Adrien Destugues
parent 4b0d8831c2
commit a8db4bae55
@@ -8,6 +8,7 @@
#include <errno.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>
@@ -28,6 +29,20 @@ system(const char *command)
if (thread < 0)
RETURN_AND_SET_ERRNO_TEST_CANCEL(thread);
// block SIGCHLD ...
sigset_t mask, oldMask;
sigemptyset(&mask);
sigaddset(&mask, SIGCHLD);
sigprocmask(SIG_BLOCK, &mask, &oldMask);
// and ignore SIGINT and SIGQUIT while waiting for completion
struct sigaction intSave, quitSave, sa;
memset(&sa, 0, sizeof(sa));
sigemptyset(&sa.sa_mask);
sa.sa_handler = SIG_IGN;
sigaction(SIGINT, &sa, &intSave);
sigaction(SIGQUIT, &sa, &quitSave);
resume_thread(thread);
int exitStatus;
@@ -37,6 +52,11 @@ system(const char *command)
// waitpid() was interrupted by a signal, retry...
}
// unblock and reset signal handlers
sigprocmask(SIG_SETMASK, &oldMask, NULL);
sigaction(SIGINT, &intSave, NULL);
sigaction(SIGQUIT, &quitSave, NULL);
if (result < 0)
return -1;