Use non-blocking pipes

This commit is contained in:
Arun Prakash Jana 2017-07-02 20:32:38 +05:30
parent 55d916921f
commit acdc6dc0a3
No known key found for this signature in database
GPG Key ID: A75979F35C080412
1 changed files with 18 additions and 4 deletions

22
nnn.c
View File

@ -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;
}