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
 | 
					void
 | 
				
			||||||
strdump(void)
 | 
					strdump(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										1
									
								
								st.h
								
								
								
								
							
							
						
						
									
										1
									
								
								st.h
								
								
								
								
							| 
						 | 
					@ -81,6 +81,7 @@ void die(const char *, ...);
 | 
				
			||||||
void redraw(void);
 | 
					void redraw(void);
 | 
				
			||||||
void draw(void);
 | 
					void draw(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void externalpipe(const Arg *);
 | 
				
			||||||
void printscreen(const Arg *);
 | 
					void printscreen(const Arg *);
 | 
				
			||||||
void printsel(const Arg *);
 | 
					void printsel(const Arg *);
 | 
				
			||||||
void sendbreak(const Arg *);
 | 
					void sendbreak(const Arg *);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue