only need to indicate window knowledge in oob messages
authorMike Karels <karels@ucbvax.Berkeley.EDU>
Sat, 9 Nov 1985 00:32:50 +0000 (16:32 -0800)
committerMike Karels <karels@ucbvax.Berkeley.EDU>
Sat, 9 Nov 1985 00:32:50 +0000 (16:32 -0800)
until we get a response; close hole in message after control correctly;
remove sun grot and other useless code

SCCS-vsn: libexec/rlogind/rlogind.c 5.9

usr/src/libexec/rlogind/rlogind.c

index 5c56e6a..b27bdb5 100644 (file)
@@ -11,7 +11,7 @@ char copyright[] =
 #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
 
 /*
@@ -164,6 +164,7 @@ gotpty:
 }
 
 char   magic[2] = { 0377, 0377 };
+char   oobdata[] = {TIOCPKT_WINDOW};
 
 /*
  * Handle a "control" request (signaled by magic being present)
@@ -179,6 +180,7 @@ control(pty, cp, n)
 
        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);
@@ -196,16 +198,15 @@ protocol(f, p)
 {
        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;
 
@@ -241,7 +242,7 @@ protocol(f, p)
                                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);
@@ -249,20 +250,16 @@ protocol(f, p)
                                                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;
@@ -280,30 +277,20 @@ protocol(f, p)
                                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;