mirror of
https://github.com/jarun/nnn.git
synced 2024-11-24 11:51:27 +00:00
Use non-blocking pipes
This commit is contained in:
parent
55d916921f
commit
acdc6dc0a3
22
nnn.c
22
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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue