aboutsummaryrefslogtreecommitdiffstats
path: root/nnn.c
diff options
context:
space:
mode:
authorGravatar Arun Prakash Jana <engineerarun@gmail.com>2017-07-02 20:32:38 +0530
committerGravatar Arun Prakash Jana <engineerarun@gmail.com>2017-07-02 20:32:38 +0530
commitacdc6dc0a3d0a5abe7e708ae89b1569476eb4f8f (patch)
tree2a9760b8c1a6ac77a8eebc069e4e11626f7272eb /nnn.c
parent55d916921f4c13f66395fc6742543c33ad261d00 (diff)
downloadnnn-acdc6dc0a3d0a5abe7e708ae89b1569476eb4f8f.tar.gz
Use non-blocking pipes
Diffstat (limited to 'nnn.c')
-rw-r--r--nnn.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/nnn.c b/nnn.c
index 93feadd..b6df774 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;
}