don't indirect thru uninit'ed iov in ptcwrite; change ptcwrite like ttwrite
authorMike Karels <karels@ucbvax.Berkeley.EDU>
Tue, 13 Nov 1990 12:16:09 +0000 (04:16 -0800)
committerMike Karels <karels@ucbvax.Berkeley.EDU>
Tue, 13 Nov 1990 12:16:09 +0000 (04:16 -0800)
to avoid mucking in the iov's; switch to u_char so we don't have to mask

SCCS-vsn: sys/kern/tty_pty.c 7.17

usr/src/sys/kern/tty_pty.c

index fd97a11..f0c6217 100644 (file)
@@ -4,7 +4,7 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)tty_pty.c   7.16 (Berkeley) %G%
+ *     @(#)tty_pty.c   7.17 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
@@ -437,10 +437,9 @@ ptcwrite(dev, uio, flag)
        register struct uio *uio;
 {
        register struct tty *tp = &pt_tty[minor(dev)];
        register struct uio *uio;
 {
        register struct tty *tp = &pt_tty[minor(dev)];
-       register struct iovec *iov;
-       register char *cp;
+       register u_char *cp;
        register int cc = 0;
        register int cc = 0;
-       char locbuf[BUFSIZ];
+       u_char locbuf[BUFSIZ];
        int cnt = 0;
        struct pt_ioctl *pti = &pt_ioctl[minor(dev)];
        int error = 0;
        int cnt = 0;
        struct pt_ioctl *pti = &pt_ioctl[minor(dev)];
        int error = 0;
@@ -451,18 +450,12 @@ again:
        if (pti->pt_flags & PF_REMOTE) {
                if (tp->t_canq.c_cc)
                        goto block;
        if (pti->pt_flags & PF_REMOTE) {
                if (tp->t_canq.c_cc)
                        goto block;
-               while (uio->uio_iovcnt > 0 && tp->t_canq.c_cc < TTYHOG - 1) {
-                       iov = uio->uio_iov;
-                       if (iov->iov_len == 0) {
-                               uio->uio_iovcnt--;      
-                               uio->uio_iov++;
-                               continue;
-                       }
+               while (uio->uio_resid > 0 && tp->t_canq.c_cc < TTYHOG - 1) {
                        if (cc == 0) {
                        if (cc == 0) {
-                               cc = MIN(iov->iov_len, BUFSIZ);
-                               cc = MIN(cc, TTYHOG - 1 - tp->t_canq.c_cc);
+                               cc = min(uio->uio_resid, BUFSIZ);
+                               cc = min(cc, TTYHOG - 1 - tp->t_canq.c_cc);
                                cp = locbuf;
                                cp = locbuf;
-                               error = uiomove(cp, cc, uio);
+                               error = uiomove((caddr_t)cp, cc, uio);
                                if (error)
                                        return (error);
                                /* check again for safety */
                                if (error)
                                        return (error);
                                /* check again for safety */
@@ -470,7 +463,7 @@ again:
                                        return (EIO);
                        }
                        if (cc)
                                        return (EIO);
                        }
                        if (cc)
-                               (void) b_to_q(cp, cc, &tp->t_canq);
+                               (void) b_to_q((char *)cp, cc, &tp->t_canq);
                        cc = 0;
                }
                (void) putc(0, &tp->t_canq);
                        cc = 0;
                }
                (void) putc(0, &tp->t_canq);
@@ -478,17 +471,11 @@ again:
                wakeup((caddr_t)&tp->t_canq);
                return (0);
        }
                wakeup((caddr_t)&tp->t_canq);
                return (0);
        }
-       while (uio->uio_iovcnt > 0) {
-               iov = uio->uio_iov;
+       while (uio->uio_resid > 0) {
                if (cc == 0) {
                if (cc == 0) {
-                       if (iov->iov_len == 0) {
-                               uio->uio_iovcnt--;      
-                               uio->uio_iov++;
-                               continue;
-                       }
-                       cc = MIN(iov->iov_len, BUFSIZ);
+                       cc = min(uio->uio_resid, BUFSIZ);
                        cp = locbuf;
                        cp = locbuf;
-                       error = uiomove(cp, cc, uio);
+                       error = uiomove((caddr_t)cp, cc, uio);
                        if (error)
                                return (error);
                        /* check again for safety */
                        if (error)
                                return (error);
                        /* check again for safety */
@@ -501,7 +488,7 @@ again:
                                wakeup((caddr_t)&tp->t_rawq);
                                goto block;
                        }
                                wakeup((caddr_t)&tp->t_rawq);
                                goto block;
                        }
-                       (*linesw[tp->t_line].l_rint)(*cp++&0377, tp);
+                       (*linesw[tp->t_line].l_rint)(*cp++, tp);
                        cnt++;
                        cc--;
                }
                        cnt++;
                        cc--;
                }
@@ -515,18 +502,19 @@ block:
         */
        if ((tp->t_state&TS_CARR_ON) == 0)
                return (EIO);
         */
        if ((tp->t_state&TS_CARR_ON) == 0)
                return (EIO);
-       if ((pti->pt_flags & PF_NBIO) || (flag & IO_NDELAY)) {
-               iov->iov_base -= cc;
-               iov->iov_len += cc;
+       if (flag & IO_NDELAY) {
+               /* adjust for data copied in but not written */
                uio->uio_resid += cc;
                uio->uio_resid += cc;
-               uio->uio_offset -= cc;
                if (cnt == 0)
                        return (EWOULDBLOCK);
                return (0);
        }
        if (error = tsleep((caddr_t)&tp->t_rawq.c_cf, TTOPRI | PCATCH,
                if (cnt == 0)
                        return (EWOULDBLOCK);
                return (0);
        }
        if (error = tsleep((caddr_t)&tp->t_rawq.c_cf, TTOPRI | PCATCH,
-           ttyout, 0))
+           ttyout, 0)) {
+               /* adjust for data copied in but not written */
+               uio->uio_resid += cc;
                return (error);
                return (error);
+       }
        goto again;
 }
 
        goto again;
 }
 
@@ -635,13 +623,6 @@ ptyioctl(dev, cmd, data, flag)
                        ttyflush(tp, FREAD|FWRITE);
                        return (0);
 
                        ttyflush(tp, FREAD|FWRITE);
                        return (0);
 
-               case FIONBIO:
-                       if (*(int *)data)
-                               pti->pt_flags |= PF_NBIO;
-                       else
-                               pti->pt_flags &= ~PF_NBIO;
-                       return (0);
-
                case FIONREAD:
                        *(int *)data = tp->t_outq.c_cc;
                        return (0);
                case FIONREAD:
                        *(int *)data = tp->t_outq.c_cc;
                        return (0);
@@ -652,9 +633,9 @@ ptyioctl(dev, cmd, data, flag)
                case TIOCSETA:
                case TIOCSETAW:
                case TIOCSETAF:
                case TIOCSETA:
                case TIOCSETAW:
                case TIOCSETAF:
-               case JUNK_TIOCSETAS:
-               case JUNK_TIOCSETAWS:
-               case JUNK_TIOCSETAFS:
+               case JUNK_TIOCSETAS:    /* XXX */
+               case JUNK_TIOCSETAWS:   /* XXX */
+               case JUNK_TIOCSETAFS:   /* XXX */
                        while (getc(&tp->t_outq) >= 0)
                                ;
                        break;
                        while (getc(&tp->t_outq) >= 0)
                                ;
                        break;
@@ -752,7 +733,7 @@ ptyioctl(dev, cmd, data, flag)
         */
        if (linesw[tp->t_line].l_rint != ttyinput) {
                (*linesw[tp->t_line].l_close)(tp);
         */
        if (linesw[tp->t_line].l_rint != ttyinput) {
                (*linesw[tp->t_line].l_close)(tp);
-               tp->t_line = 0;
+               tp->t_line = TTYDISC;
                (void)(*linesw[tp->t_line].l_open)(dev, tp, flag);
                error = ENOTTY;
        }
                (void)(*linesw[tp->t_line].l_open)(dev, tp, flag);
                error = ENOTTY;
        }
@@ -776,9 +757,9 @@ ptyioctl(dev, cmd, data, flag)
                case TIOCSETA:
                case TIOCSETAW:
                case TIOCSETAF:
                case TIOCSETA:
                case TIOCSETAW:
                case TIOCSETAF:
-               case JUNK_TIOCSETAS:
-               case JUNK_TIOCSETAWS:
-               case JUNK_TIOCSETAFS:
+               case JUNK_TIOCSETAS:    /* XXX */
+               case JUNK_TIOCSETAWS:   /* XXX */
+               case JUNK_TIOCSETAFS:   /* XXX */
                case TIOCSETP:
                case TIOCSETN:
 #ifdef COMPAT_43
                case TIOCSETP:
                case TIOCSETN:
 #ifdef COMPAT_43