about summary refs log tree commit diff
path: root/filter.c
diff options
context:
space:
mode:
Diffstat (limited to 'filter.c')
-rw-r--r--filter.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/filter.c b/filter.c
index a9bd45b..0baa5e6 100644
--- a/filter.c
+++ b/filter.c
@@ -15,7 +15,6 @@ filter(char *input, size_t inlen, char *cmd, char **outputo, size_t *outleno)
 	ssize_t outalloc = 4096;
 	pid_t pid;
 	sigset_t mask, orig_mask;
-	struct timespec immediately = { 0, 0 };
 
 	sigemptyset(&mask);
 	sigaddset(&mask, SIGPIPE);
@@ -105,7 +104,11 @@ filter(char *input, size_t inlen, char *cmd, char **outputo, size_t *outleno)
 	*outputo = output;
 	*outleno = outlen;
 
-	sigtimedwait(&mask, 0, &immediately);
+	sigpending(&mask);
+	if (sigismember(&mask, SIGPIPE)) {
+		int sig;
+		sigwait(&mask, &sig);
+	}
 	sigprocmask(SIG_SETMASK, &orig_mask, 0);
 
 	return WEXITSTATUS(status);
@@ -115,7 +118,11 @@ fail:
 	*outleno = 0;
 	free(output);
 
-	sigtimedwait(&mask, 0, &immediately);
+	sigpending(&mask);
+	if (sigismember(&mask, SIGPIPE)) {
+		int sig;
+		sigwait(&mask, &sig);
+	}
 	sigprocmask(SIG_SETMASK, &orig_mask, 0);
 
 	return -1;