Merge pull request #20168 from poettering/signal-util-tweak

generalize SIGINT handling in copy.c
This commit is contained in:
Yu Watanabe
2021-07-09 07:24:43 +09:00
committed by GitHub
4 changed files with 80 additions and 18 deletions
+35
View File
@@ -253,3 +253,38 @@ int signal_is_blocked(int sig) {
return r;
}
int pop_pending_signal_internal(int sig, ...) {
sigset_t ss;
va_list ap;
int r;
if (sig < 0) /* Empty list? */
return -EINVAL;
if (sigemptyset(&ss) < 0)
return -errno;
/* Add first signal (if the signal is zero, we'll silently skip it, to make it easiert to build
* parameter lists where some element are sometimes off, similar to how sigset_add_many_ap() handles
* this.) */
if (sig > 0 && sigaddset(&ss, sig) < 0)
return -errno;
/* Add all other signals */
va_start(ap, sig);
r = sigset_add_many_ap(&ss, ap);
va_end(ap);
if (r < 0)
return r;
r = sigtimedwait(&ss, NULL, &(struct timespec) { 0, 0 });
if (r < 0) {
if (errno == EAGAIN)
return 0;
return -errno;
}
return r; /* Returns the signal popped */
}
+3
View File
@@ -62,3 +62,6 @@ static inline const char* signal_to_string_with_check(int n) {
}
int signal_is_blocked(int sig);
int pop_pending_signal_internal(int sig, ...);
#define pop_pending_signal(...) pop_pending_signal_internal(__VA_ARGS__, -1)