code: plan9front

Download patch

ref: b68b3a6e19eb57c9f1c8b70b624f103254f4964a
parent: 4fd09def0fc51d0606e677f1ab59ad695d1cd780
author: Ori Bernstein <ori@eigenstate.org>
date: Sat Jun 26 13:29:27 EDT 2021

vt, ssh: don't send interrupts on window resize

When resizing windows, vt would signal ssh by updating
the window size and sending an interrupt. Ssh reacted
by forwarding both the winch and an interrupt.

This change adds a WINCH generation counter so that
ssh can differentiate between resizes and interrupts.
If an interrupt comes in, and the WINCH generation
changes, then the interrupt is taken as signalling a
WINCH.

--- a/sys/src/cmd/ssh.c
+++ b/sys/src/cmd/ssh.c
@@ -1090,13 +1090,22 @@
 	int	ypixels;
 	int	lines;
 	int	cols;
+	int	gen;
 } tty;
 
-void
+int
 getdim(void)
 {
 	char *s;
+	int g;
 
+	if(s = getenv("WINCH")){
+		g = atoi(s);
+		if(tty.gen == g)
+			return 0;
+		tty.gen = g;
+		free(s);
+	}
 	if(s = getenv("XPIXELS")){
 		tty.xpixels = atoi(s);
 		free(s);
@@ -1113,6 +1122,7 @@
 		tty.cols = atoi(s);
 		free(s);
 	}
+	return 1;
 }
 
 void
@@ -1175,6 +1185,7 @@
 	fmtinstall('[', encodefmt);
 	fmtinstall('k', kfmt);
 
+	tty.gen = -1;
 	tty.term = getenv("TERM");
 	if(tty.term == nil)
 		tty.term = "";
@@ -1403,20 +1414,22 @@
 			intr = 1;
 		if(intr){
 			if(!raw) break;
-			getdim();
-			sendpkt("busbuuuu", MSG_CHANNEL_REQUEST,
-				send.chan,
-				"window-change", 13,
-				0,
-				tty.cols,
-				tty.lines,
-				tty.xpixels,
-				tty.ypixels);
-			sendpkt("busbs", MSG_CHANNEL_REQUEST,
-				send.chan,
-				"signal", 6,
-				0,
-				"INT", 3);
+			if(getdim()){
+				sendpkt("busbuuuu", MSG_CHANNEL_REQUEST,
+					send.chan,
+					"window-change", 13,
+					0,
+					tty.cols,
+					tty.lines,
+					tty.xpixels,
+					tty.ypixels);
+			}else{
+				sendpkt("busbs", MSG_CHANNEL_REQUEST,
+					send.chan,
+					"signal", 6,
+					0,
+					"INT", 3);
+			}
 			intr = 0;
 			continue;
 		}
--- a/sys/src/cmd/vt/main.c
+++ b/sys/src/cmd/vt/main.c
@@ -61,6 +61,7 @@
 int	nbacklines;
 int	xmax, ymax;
 int	blocked;
+int	winchgen;
 int	resize_flag = 1;
 int	pagemode;
 int	olines;
@@ -867,6 +868,7 @@
 void
 exportsize(void)
 {
+	putenvint("WINCH", ++winchgen);
 	putenvint("XPIXELS", (xmax+1)*ftsize.x);
 	putenvint("YPIXELS", (ymax+1)*ftsize.y);
 	putenvint("LINES", ymax+1);