#endif not lint
#ifndef lint
-static char sccsid[] = "@(#)rlogind.c 5.8 (Berkeley) %G%";
+static char sccsid[] = "@(#)rlogind.c 5.9 (Berkeley) %G%";
#endif not lint
/*
}
char magic[2] = { 0377, 0377 };
+char oobdata[] = {TIOCPKT_WINDOW};
/*
* Handle a "control" request (signaled by magic being present)
if (n < 4+sizeof (*wp) || cp[2] != 's' || cp[3] != 's')
return (0);
+ oobdata[0] &= ~TIOCPKT_WINDOW; /* we know he heard */
wp = (struct winsize *)(cp+4);
wp->ws_row = ntohs(wp->ws_row);
wp->ws_col = ntohs(wp->ws_col);
{
char pibuf[1024], fibuf[1024], *pbp, *fbp;
register pcc = 0, fcc = 0;
- int cc, stop = TIOCPKT_DOSTOP, wsize;
- static char oob[] = {TIOCPKT_WINDOW};
+ int cc;
/*
* Must ignore SIGTTOU, otherwise we'll stop
* when we try and set slave pty's window shape
- * (our pgrp is that of the master pty).
+ * (our controlling tty is the master pty).
*/
(void) signal(SIGTTOU, SIG_IGN);
- send(f, oob, 1, MSG_OOB); /* indicate new rlogin */
+ send(f, oobdata, 1, MSG_OOB); /* indicate new rlogin */
for (;;) {
int ibits = 0, obits = 0;
fbp = fibuf;
top:
- for (cp = fibuf; cp < fibuf+fcc; cp++)
+ for (cp = fibuf; cp < fibuf+fcc-1; cp++)
if (cp[0] == magic[0] &&
cp[1] == magic[1]) {
left = fcc - (cp-fibuf);
if (n) {
left -= n;
if (left > 0)
- bcopy(cp, cp+n, left);
+ bcopy(cp+n, cp, left);
fcc -= n;
goto top; /* n^2 */
- } /* if (n) */
- } /* for (cp = ) */
- } /* else */
- } /* if (ibits & (1<<f)) */
+ }
+ }
+ }
+ }
if ((obits & (1<<p)) && fcc > 0) {
- wsize = fcc;
- do {
- cc = write(p, fbp, wsize);
- wsize /= 2;
- } while (cc<0 && errno==EWOULDBLOCK && wsize);
+ cc = write(p, fbp, fcc);
if (cc > 0) {
fcc -= cc;
fbp += cc;
pbp++, pcc--;
else {
#define pkcontrol(c) ((c)&(TIOCPKT_FLUSHWRITE|TIOCPKT_NOSTOP|TIOCPKT_DOSTOP))
- int out = FREAD;
-
if (pkcontrol(pibuf[0])) {
- /* The following 3 lines do nothing. */
- int nstop = pibuf[0] &
- (TIOCPKT_NOSTOP|TIOCPKT_DOSTOP);
-
- if (nstop)
- stop = nstop;
- pibuf[0] |= nstop | oob[0];
+ pibuf[0] |= oobdata[0];
send(f, &pibuf[0], 1, MSG_OOB);
- if (pibuf[0] & TIOCPKT_FLUSHWRITE)
- ioctl(p, TIOCFLUSH, (char *)&out);
-
}
pcc = 0;
}
}
if ((obits & (1<<f)) && pcc > 0) {
- wsize = pcc;
- do {
- cc = write(f, pbp, wsize);
- wsize /= 2;
- } while (cc<0 && errno==EWOULDBLOCK && wsize);
+ cc = write(f, pbp, pcc);
+ if (cc < 0 && errno == EWOULDBLOCK) {
+ /* also shouldn't happen */
+ sleep(5);
+ continue;
+ }
if (cc > 0) {
pcc -= cc;
pbp += cc;