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.
This commit is contained in:
Ori Bernstein 2021-06-26 17:29:27 +00:00
parent 4fd09def0f
commit b68b3a6e19
2 changed files with 30 additions and 15 deletions

View file

@ -1090,13 +1090,22 @@ static struct {
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 @@ getdim(void)
tty.cols = atoi(s);
free(s);
}
return 1;
}
void
@ -1175,6 +1185,7 @@ main(int argc, char *argv[])
fmtinstall('[', encodefmt);
fmtinstall('k', kfmt);
tty.gen = -1;
tty.term = getenv("TERM");
if(tty.term == nil)
tty.term = "";
@ -1403,7 +1414,7 @@ Mux:
intr = 1;
if(intr){
if(!raw) break;
getdim();
if(getdim()){
sendpkt("busbuuuu", MSG_CHANNEL_REQUEST,
send.chan,
"window-change", 13,
@ -1412,11 +1423,13 @@ Mux:
tty.lines,
tty.xpixels,
tty.ypixels);
}else{
sendpkt("busbs", MSG_CHANNEL_REQUEST,
send.chan,
"signal", 6,
0,
"INT", 3);
}
intr = 0;
continue;
}

View file

@ -61,6 +61,7 @@ int backc;
int nbacklines;
int xmax, ymax;
int blocked;
int winchgen;
int resize_flag = 1;
int pagemode;
int olines;
@ -867,6 +868,7 @@ putenvint(char *name, int x)
void
exportsize(void)
{
putenvint("WINCH", ++winchgen);
putenvint("XPIXELS", (xmax+1)*ftsize.x);
putenvint("YPIXELS", (ymax+1)*ftsize.y);
putenvint("LINES", ymax+1);