sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

st-externalpipe-0.8.5.diff (2296B)


      1 diff --git a/st.c b/st.c
      2 index 034954d..98f2589 100644
      3 --- a/st.c
      4 +++ b/st.c
      5 @@ -718,8 +718,14 @@ sigchld(int a)
      6  	if ((p = waitpid(pid, &stat, WNOHANG)) < 0)
      7  		die("waiting for pid %hd failed: %s\n", pid, strerror(errno));
      8  
      9 -	if (pid != p)
     10 +	if (pid != p) {
     11 +		if (p == 0 && wait(&stat) < 0)
     12 +			die("wait: %s\n", strerror(errno));
     13 +
     14 +		/* reinstall sigchld handler */
     15 +		signal(SIGCHLD, sigchld);
     16  		return;
     17 +	}
     18  
     19  	if (WIFEXITED(stat) && WEXITSTATUS(stat))
     20  		die("child exited with status %d\n", WEXITSTATUS(stat));
     21 @@ -803,7 +809,7 @@ ttynew(const char *line, char *cmd, const char *out, char **args)
     22  		break;
     23  	default:
     24  #ifdef __OpenBSD__
     25 -		if (pledge("stdio rpath tty proc", NULL) == -1)
     26 +		if (pledge("stdio rpath tty proc exec", NULL) == -1)
     27  			die("pledge\n");
     28  #endif
     29  		close(s);
     30 @@ -1991,6 +1997,59 @@ strparse(void)
     31  	}
     32  }
     33  
     34 +void
     35 +externalpipe(const Arg *arg)
     36 +{
     37 +	int to[2];
     38 +	char buf[UTF_SIZ];
     39 +	void (*oldsigpipe)(int);
     40 +	Glyph *bp, *end;
     41 +	int lastpos, n, newline;
     42 +
     43 +	if (pipe(to) == -1)
     44 +		return;
     45 +
     46 +	switch (fork()) {
     47 +	case -1:
     48 +		close(to[0]);
     49 +		close(to[1]);
     50 +		return;
     51 +	case 0:
     52 +		dup2(to[0], STDIN_FILENO);
     53 +		close(to[0]);
     54 +		close(to[1]);
     55 +		execvp(((char **)arg->v)[0], (char **)arg->v);
     56 +		fprintf(stderr, "st: execvp %s\n", ((char **)arg->v)[0]);
     57 +		perror("failed");
     58 +		exit(0);
     59 +	}
     60 +
     61 +	close(to[0]);
     62 +	/* ignore sigpipe for now, in case child exists early */
     63 +	oldsigpipe = signal(SIGPIPE, SIG_IGN);
     64 +	newline = 0;
     65 +	for (n = 0; n < term.row; n++) {
     66 +		bp = term.line[n];
     67 +		lastpos = MIN(tlinelen(n) + 1, term.col) - 1;
     68 +		if (lastpos < 0)
     69 +			break;
     70 +		end = &bp[lastpos + 1];
     71 +		for (; bp < end; ++bp)
     72 +			if (xwrite(to[1], buf, utf8encode(bp->u, buf)) < 0)
     73 +				break;
     74 +		if ((newline = term.line[n][lastpos].mode & ATTR_WRAP))
     75 +			continue;
     76 +		if (xwrite(to[1], "\n", 1) < 0)
     77 +			break;
     78 +		newline = 0;
     79 +	}
     80 +	if (newline)
     81 +		(void)xwrite(to[1], "\n", 1);
     82 +	close(to[1]);
     83 +	/* restore */
     84 +	signal(SIGPIPE, oldsigpipe);
     85 +}
     86 +
     87  void
     88  strdump(void)
     89  {
     90 diff --git a/st.h b/st.h
     91 index fd3b0d8..754cd08 100644
     92 --- a/st.h
     93 +++ b/st.h
     94 @@ -81,6 +81,7 @@ void die(const char *, ...);
     95  void redraw(void);
     96  void draw(void);
     97  
     98 +void externalpipe(const Arg *);
     99  void printscreen(const Arg *);
    100  void printsel(const Arg *);
    101  void sendbreak(const Arg *);
    102 -- 
    103 2.42.0
    104