---
st.c | 28 ++++++++++++++++++++++++----
st.h | 1 +
2 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/st.c b/st.c
index ab291ac..ac19ebf 100644
--- a/st.c
+++ b/st.c
_AT_@ -225,6 +225,7 @@ static CSIEscape csiescseq;
static STREscape strescseq;
static int iofd = 1;
static int cmdfd;
+static int csdfd;
static pid_t pid;
static uchar utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0};
_AT_@ -712,12 +713,14 @@ sigchld(int a)
int stat;
pid_t p;
- if ((p = waitpid(pid, &stat, WNOHANG)) < 0)
+ if ((p = waitpid(-1, &stat, WNOHANG)) < 0)
die("waiting for pid %hd failed: %s\n", pid, strerror(errno));
if (pid != p)
return;
+ close(csdfd);
+
if (WIFEXITED(stat) && WEXITSTATUS(stat))
die("child exited with status %d\n", WEXITSTATUS(stat));
else if (WIFSIGNALED(stat))
_AT_@ -753,6 +756,7 @@ int
ttynew(char *line, char *cmd, char *out, char **args)
{
int m, s;
+ struct sigaction sa;
if (out) {
term.mode |= MODE_PRINT;
_AT_@ -802,9 +806,12 @@ ttynew(char *line, char *cmd, char *out, char **args)
if (pledge("stdio rpath tty proc", NULL) == -1)
die("pledge\n");
#endif
- close(s);
+ csdfd = s;
cmdfd = m;
- signal(SIGCHLD, sigchld);
+ memset(&sa, 0, sizeof(sa));
+ sigemptyset(&sa.sa_mask);
+ sa.sa_handler = sigchld;
+ sigaction(SIGCHLD, &sa, NULL);
break;
}
return cmdfd;
_AT_@ -1920,7 +1927,7 @@ strparse(void)
}
void
-externalpipe(const Arg *arg)
+extpipe(const Arg *arg, int in)
{
int to[2];
char buf[UTF_SIZ];
_AT_@ -1940,6 +1947,9 @@ externalpipe(const Arg *arg)
dup2(to[0], STDIN_FILENO);
close(to[0]);
close(to[1]);
+ if (in)
+ dup2(csdfd, STDOUT_FILENO);
+ close(csdfd);
execvp(((char **)arg->v)[0], (char **)arg->v);
fprintf(stderr, "st: execvp %s\n", ((char **)arg->v)[0]);
perror("failed");
_AT_@ -1972,6 +1982,16 @@ externalpipe(const Arg *arg)
signal(SIGPIPE, oldsigpipe);
}
+void
+externalpipe(const Arg *arg) {
+ extpipe(arg, 0);
+}
+
+void
+externalpipein(const Arg *arg) {
+ extpipe(arg, 1);
+}
+
void
strdump(void)
{
diff --git a/st.h b/st.h
index fe84fda..bbf38fa 100644
--- a/st.h
+++ b/st.h
_AT_@ -82,6 +82,7 @@ void redraw(void);
void draw(void);
void externalpipe(const Arg *);
+void externalpipein(const Arg *);
void printscreen(const Arg *);
void printsel(const Arg *);
void sendbreak(const Arg *);
--
2.20.1
Received on Sat Apr 18 2020 - 22:27:13 CEST
This archive was generated by hypermail 2.3.0 : Sat Apr 18 2020 - 22:36:50 CEST