From 13db67713f4f2f4dde8c8dfbf7b2432560ae9230 Mon Sep 17 00:00:00 2001 From: Leah Neukirchen Date: Sun, 6 Aug 2017 20:05:37 +0200 Subject: filter: use a non-blocking write pipe --- filter.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'filter.c') diff --git a/filter.c b/filter.c index c0b1541..7b86106 100644 --- a/filter.c +++ b/filter.c @@ -1,5 +1,7 @@ #include +#include +#include #include #include #include @@ -34,6 +36,10 @@ filter(char *input, size_t inlen, char *cmd, char **outputo, size_t *outleno) if (pipe(pipe0) != 0 || pipe(pipe1) != 0) goto fail; + int got = fcntl(pipe0[1], F_GETFL); + if (got > 0) + fcntl(pipe0[1], F_SETFL, got | O_NONBLOCK); + char *argv[] = { "/bin/sh", "-c", cmd, (char *)0 }; if (!(pid = fork())) { @@ -85,13 +91,14 @@ filter(char *input, size_t inlen, char *cmd, char **outputo, size_t *outleno) } if (fds[1].revents & POLLOUT) { - ssize_t ret = write(fds[1].fd, input, - inlen > PIPE_BUF ? PIPE_BUF : inlen); + ssize_t ret = write(fds[1].fd, input, inlen); if (ret > 0) { input += ret; inlen -= ret; } - if (ret <= 0 || inlen == 0) + if (ret <= 0 && errno == EAGAIN) { + /* ignore */ + } else if (ret <= 0 || inlen == 0) close(fds[1].fd); } else if (fds[1].revents & (POLLERR | POLLHUP | POLLNVAL)) { fds[1].fd = -1; -- cgit 1.4.1