externalpipe patch applied - success
This commit is contained in:
		
							parent
							
								
									27e8772cc2
								
							
						
					
					
						commit
						0befa1a5eb
					
				| 
						 | 
				
			
			@ -0,0 +1,76 @@
 | 
			
		|||
diff --git a/st.c b/st.c
 | 
			
		||||
index ede7ae6..f55d30f 100644
 | 
			
		||||
--- a/st.c
 | 
			
		||||
+++ b/st.c
 | 
			
		||||
@@ -1914,6 +1914,59 @@ strparse(void)
 | 
			
		||||
 	}
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+void
 | 
			
		||||
+externalpipe(const Arg *arg)
 | 
			
		||||
+{
 | 
			
		||||
+	int to[2];
 | 
			
		||||
+	char buf[UTF_SIZ];
 | 
			
		||||
+	void (*oldsigpipe)(int);
 | 
			
		||||
+	Glyph *bp, *end;
 | 
			
		||||
+	int lastpos, n, newline;
 | 
			
		||||
+
 | 
			
		||||
+	if (pipe(to) == -1)
 | 
			
		||||
+		return;
 | 
			
		||||
+
 | 
			
		||||
+	switch (fork()) {
 | 
			
		||||
+	case -1:
 | 
			
		||||
+		close(to[0]);
 | 
			
		||||
+		close(to[1]);
 | 
			
		||||
+		return;
 | 
			
		||||
+	case 0:
 | 
			
		||||
+		dup2(to[0], STDIN_FILENO);
 | 
			
		||||
+		close(to[0]);
 | 
			
		||||
+		close(to[1]);
 | 
			
		||||
+		execvp(((char **)arg->v)[0], (char **)arg->v);
 | 
			
		||||
+		fprintf(stderr, "st: execvp %s\n", ((char **)arg->v)[0]);
 | 
			
		||||
+		perror("failed");
 | 
			
		||||
+		exit(0);
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
+	close(to[0]);
 | 
			
		||||
+	/* ignore sigpipe for now, in case child exists early */
 | 
			
		||||
+	oldsigpipe = signal(SIGPIPE, SIG_IGN);
 | 
			
		||||
+	newline = 0;
 | 
			
		||||
+	for (n = 0; n < term.row; n++) {
 | 
			
		||||
+		bp = term.line[n];
 | 
			
		||||
+		lastpos = MIN(tlinelen(n) + 1, term.col) - 1;
 | 
			
		||||
+		if (lastpos < 0)
 | 
			
		||||
+			break;
 | 
			
		||||
+		end = &bp[lastpos + 1];
 | 
			
		||||
+		for (; bp < end; ++bp)
 | 
			
		||||
+			if (xwrite(to[1], buf, utf8encode(bp->u, buf)) < 0)
 | 
			
		||||
+				break;
 | 
			
		||||
+		if ((newline = term.line[n][lastpos].mode & ATTR_WRAP))
 | 
			
		||||
+			continue;
 | 
			
		||||
+		if (xwrite(to[1], "\n", 1) < 0)
 | 
			
		||||
+			break;
 | 
			
		||||
+		newline = 0;
 | 
			
		||||
+	}
 | 
			
		||||
+	if (newline)
 | 
			
		||||
+		(void)xwrite(to[1], "\n", 1);
 | 
			
		||||
+	close(to[1]);
 | 
			
		||||
+	/* restore */
 | 
			
		||||
+	signal(SIGPIPE, oldsigpipe);
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 void
 | 
			
		||||
 strdump(void)
 | 
			
		||||
 {
 | 
			
		||||
diff --git a/st.h b/st.h
 | 
			
		||||
index 4da3051..cb7101f 100644
 | 
			
		||||
--- a/st.h
 | 
			
		||||
+++ b/st.h
 | 
			
		||||
@@ -80,6 +80,7 @@ void die(const char *, ...);
 | 
			
		||||
 void redraw(void);
 | 
			
		||||
 void draw(void);
 | 
			
		||||
 
 | 
			
		||||
+void externalpipe(const Arg *);
 | 
			
		||||
 void printscreen(const Arg *);
 | 
			
		||||
 void printsel(const Arg *);
 | 
			
		||||
 void sendbreak(const Arg *);
 | 
			
		||||
							
								
								
									
										53
									
								
								st.c
								
								
								
								
							
							
						
						
									
										53
									
								
								st.c
								
								
								
								
							| 
						 | 
				
			
			@ -1919,6 +1919,59 @@ strparse(void)
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
externalpipe(const Arg *arg)
 | 
			
		||||
{
 | 
			
		||||
	int to[2];
 | 
			
		||||
	char buf[UTF_SIZ];
 | 
			
		||||
	void (*oldsigpipe)(int);
 | 
			
		||||
	Glyph *bp, *end;
 | 
			
		||||
	int lastpos, n, newline;
 | 
			
		||||
 | 
			
		||||
	if (pipe(to) == -1)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	switch (fork()) {
 | 
			
		||||
	case -1:
 | 
			
		||||
		close(to[0]);
 | 
			
		||||
		close(to[1]);
 | 
			
		||||
		return;
 | 
			
		||||
	case 0:
 | 
			
		||||
		dup2(to[0], STDIN_FILENO);
 | 
			
		||||
		close(to[0]);
 | 
			
		||||
		close(to[1]);
 | 
			
		||||
		execvp(((char **)arg->v)[0], (char **)arg->v);
 | 
			
		||||
		fprintf(stderr, "st: execvp %s\n", ((char **)arg->v)[0]);
 | 
			
		||||
		perror("failed");
 | 
			
		||||
		exit(0);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	close(to[0]);
 | 
			
		||||
	/* ignore sigpipe for now, in case child exists early */
 | 
			
		||||
	oldsigpipe = signal(SIGPIPE, SIG_IGN);
 | 
			
		||||
	newline = 0;
 | 
			
		||||
	for (n = 0; n < term.row; n++) {
 | 
			
		||||
		bp = term.line[n];
 | 
			
		||||
		lastpos = MIN(tlinelen(n) + 1, term.col) - 1;
 | 
			
		||||
		if (lastpos < 0)
 | 
			
		||||
			break;
 | 
			
		||||
		end = &bp[lastpos + 1];
 | 
			
		||||
		for (; bp < end; ++bp)
 | 
			
		||||
			if (xwrite(to[1], buf, utf8encode(bp->u, buf)) < 0)
 | 
			
		||||
				break;
 | 
			
		||||
		if ((newline = term.line[n][lastpos].mode & ATTR_WRAP))
 | 
			
		||||
			continue;
 | 
			
		||||
		if (xwrite(to[1], "\n", 1) < 0)
 | 
			
		||||
			break;
 | 
			
		||||
		newline = 0;
 | 
			
		||||
	}
 | 
			
		||||
	if (newline)
 | 
			
		||||
		(void)xwrite(to[1], "\n", 1);
 | 
			
		||||
	close(to[1]);
 | 
			
		||||
	/* restore */
 | 
			
		||||
	signal(SIGPIPE, oldsigpipe);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
strdump(void)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue