From: Arun Prakash Jana Date: Sun, 2 Jul 2017 15:02:38 +0000 (+0530) Subject: Use non-blocking pipes X-Git-Tag: v1.3~20 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=acdc6dc0a3d0a5abe7e708ae89b1569476eb4f8f;p=nnn.git Use non-blocking pipes --- diff --git a/nnn.c b/nnn.c index 93feadde..b6df7744 100644 --- a/nnn.c +++ b/nnn.c @@ -1279,25 +1279,38 @@ get_output(char *buf, size_t bytes, char *file, pid_t pid; int pipefd[2]; FILE *pf; - int status; + int tmp, flags; char *ret = NULL; if (pipe(pipefd) == -1) printerr(1, "pipe(2)"); + for (tmp = 0; tmp < 2; ++tmp) { + /* Get previous flags */ + flags = fcntl(pipefd[tmp], F_GETFL, 0); + + /* Set bit for non-blocking flag */ + flags |= O_NONBLOCK; + + /* Change flags on fd */ + fcntl(pipefd[tmp], F_SETFL, flags); + } + pid = fork(); if (pid == 0) { /* In child */ close(pipefd[0]); dup2(pipefd[1], STDOUT_FILENO); dup2(pipefd[1], STDERR_FILENO); + close(pipefd[1]); execlp(file, file, arg1, arg2, NULL); _exit(1); } /* In parent */ - waitpid(pid, &status, 0); + waitpid(pid, &tmp, 0); close(pipefd[1]); + if (!pager) { pf = fdopen(pipefd[0], "r"); if (pf) { @@ -1312,13 +1325,14 @@ get_output(char *buf, size_t bytes, char *file, if (pid == 0) { /* Show in pager in child */ dup2(pipefd[0], STDIN_FILENO); - execlp("less", "less", NULL); close(pipefd[0]); + execlp("less", "less", NULL); _exit(1); } /* In parent */ - waitpid(pid, &status, 0); + waitpid(pid, &tmp, 0); + close(pipefd[0]); return NULL; }