diff options
author | Hiltjo Posthuma <hiltjo@codemadness.org> | 2022-05-05 06:28:11 +0200 |
---|---|---|
committer | Hiltjo Posthuma <hiltjo@codemadness.org> | 2022-05-05 10:11:05 +0200 |
commit | 78e54359372d02d17e9ab453c7bc0cd725b807f2 (patch) | |
tree | 4328eada04808a5ffe9297839ceb97cca7b10403 | |
parent | f0ca847fca5100dd98fbbed9c49b08ba5f310ac5 (diff) |
sfeed_curses: close stdin for spawning a plumb program in non-interactive mode
This is only for plumbing in non-interactive mode in forkexec(), but not piping
content.
Probably obvious what the descriptors are, but also add a few comments to dup2
of the file descriptors (stdin, stdout, stderr).
To reproduce a behaviour:
Plumb script:
#!/bin/sh
dmenu
Then launch it:
SFEED_PLUMB_INTERACTIVE=0 SFEED_PLUMB=thescript sfeed_curses ~/.sfeed/feeds/*
The program now waits on input while in non-interactive mode and only seems to
hang.
After:
The program starts but just has no input passed to it.
-rw-r--r-- | sfeed_curses.1 | 3 | ||||
-rw-r--r-- | sfeed_curses.c | 13 |
2 files changed, 9 insertions, 7 deletions
diff --git a/sfeed_curses.1 b/sfeed_curses.1 index 30d6543..be68d92 100644 --- a/sfeed_curses.1 +++ b/sfeed_curses.1 @@ -1,4 +1,4 @@ -.Dd May 4, 2022 +.Dd May 5, 2022 .Dt SFEED_CURSES 1 .Os .Sh NAME @@ -290,6 +290,7 @@ In non-interactive mode .Nm doesn't wait until the process exits. Stdout and stderr of the program are not written as output. +When plumbing an URL then stdin is closed also. .Sh EXIT STATUS .Ex -std The exit status is 130 on SIGINT and 143 on SIGTERM. diff --git a/sfeed_curses.c b/sfeed_curses.c index d09f8a0..78071b7 100644 --- a/sfeed_curses.c +++ b/sfeed_curses.c @@ -604,8 +604,8 @@ pipeitem(const char *cmd, struct item *item, int field, int interactive) die("fork"); case 0: if (!interactive) { - dup2(devnullfd, 1); - dup2(devnullfd, 2); + dup2(devnullfd, 1); /* stdout */ + dup2(devnullfd, 2); /* stderr */ } errno = 0; @@ -642,8 +642,9 @@ forkexec(char *argv[], int interactive) die("fork"); case 0: if (!interactive) { - dup2(devnullfd, 1); - dup2(devnullfd, 2); + dup2(devnullfd, 0); /* stdin */ + dup2(devnullfd, 1); /* stdout */ + dup2(devnullfd, 2); /* stderr */ } if (execvp(argv[0], argv) == -1) _exit(1); @@ -1847,8 +1848,8 @@ markread(struct pane *p, off_t from, off_t to, int isread) case -1: die("fork"); case 0: - dup2(devnullfd, 1); - dup2(devnullfd, 2); + dup2(devnullfd, 1); /* stdout */ + dup2(devnullfd, 2); /* stderr */ errno = 0; if (!(fp = popen(cmd, "w"))) |