diff --git a/src/attacher.c b/src/attacher.c index 460f1ea..5982a93 100644 --- a/src/attacher.c +++ b/src/attacher.c @@ -133,6 +133,48 @@ struct msg *m; return 0; } +int +WriteOldMessage(struct msg *m) +{ + sleep(1); /* give the server some time to reopen the pipe */ + if (m->type == MSG_ATTACH && (m->m.attach.detachfirst == MSG_ATTACH || + m->m.attach.detachfirst == MSG_DETACH || + m->m.attach.detachfirst == MSG_POW_DETACH)) + { + struct old_msg old_m; + int s; + int r, l = sizeof(old_m); + + s = MakeClientSocket(0); + if (s < 0) + return 0; + old_m.protocol_revision = (('m'<<24) | ('s'<<16) | ('g'<<8) | 2); + old_m.type = m->type; + memcpy(old_m.m_tty, m->m_tty, sizeof(old_m.m_tty)); + memcpy(old_m.m.attach.auser, m->m.attach.auser, sizeof(old_m.m.attach.auser)); + old_m.m.attach.apid = m->m.attach.apid; + old_m.m.attach.adaptflag = m->m.attach.adaptflag; + old_m.m.attach.lines = m->m.attach.lines; + old_m.m.attach.columns = m->m.attach.columns; + memcpy(old_m.m.attach.preselect, m->m.attach.preselect, sizeof(old_m.m.attach.preselect)); + old_m.m.attach.esc = m->m.attach.esc; + old_m.m.attach.meta_esc = m->m.attach.meta_esc; + memcpy(old_m.m.attach.envterm, m->m.attach.envterm, sizeof(old_m.m.attach.envterm)); + old_m.m.attach.encoding = m->m.attach.encoding; + while(l > 0) + { + r = write(s, (char *)&old_m + (sizeof(struct old_msg) - l), l); + if (r == -1 && errno == EINTR) + continue; + if (r == -1 || r == 0) + return -1; + l -= r; + } + close(s); + } + return 0; +} + int Attach(how) @@ -397,6 +439,7 @@ int how; if (WriteMessage(lasts, &m)) Panic(errno, "WriteMessage"); close(lasts); + WriteOldMessage(&m); debug1("Attach(%d): sent\n", m.type); #ifdef MULTIUSER if (multi && (how == MSG_ATTACH || how == MSG_CONT)) diff --git a/src/screen.h b/src/screen.h index b95f8a2..fb4a8d4 100644 --- a/src/screen.h +++ b/src/screen.h @@ -240,6 +240,60 @@ struct msg } m; }; +struct old_msg +{ + int protocol_revision; /* reduce harm done by incompatible messages */ + int type; + char m_tty[MAXPATHLEN]; /* ttyname */ + union + { + struct + { + int lflag; + int aflag; + int flowflag; + int hheight; /* size of scrollback buffer */ + int nargs; + char line[MAXPATHLEN]; + char dir[MAXPATHLEN]; + char screenterm[20]; /* is screen really "screen" ? */ + } + create; + struct + { + char auser[20 + 1]; /* username */ + int apid; /* pid of frontend */ + int adaptflag; /* adapt window size? */ + int lines, columns; /* display size */ + char preselect[20]; + int esc; /* his new escape character unless -1 */ + int meta_esc; /* his new meta esc character unless -1 */ + char envterm[40 + 1]; /* terminal type */ + int encoding; /* encoding of display */ + int detachfirst; + } + attach; + struct + { + char duser[20 + 1]; /* username */ + int dpid; /* pid of frontend */ + } + detach; + struct + { + char auser[20 + 1]; /* username */ + int nargs; + char cmd[MAXPATHLEN]; /* command */ + int apid; /* pid of frontend */ + char preselect[20]; + char writeback[MAXPATHLEN]; + } + command; + char message[MAXPATHLEN * 2]; + } m; +}; + + /* * And the signals the attacher receives from the backend */ diff --git a/src/socket.c b/src/socket.c index 32c5047..d5a3d74 100644 --- a/src/socket.c +++ b/src/socket.c @@ -1067,7 +1067,9 @@ ReceiveMsg() } if (left > 0) { - if (left != sizeof(m)) + if (left == sizeof(struct msg) - sizeof(struct old_msg)) + ;/* old format message, ignore */ + else if (left != sizeof(m)) Msg(0, "Message %d of %d bytes too small", left, (int)sizeof(m)); else debug("No data on socket.\n");