aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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;
}