don't feather, removes stuff like rogue .o's
[unix-history] / usr / src / sys / kern / tty_pty.c
index 16ea116..3a9986f 100644 (file)
@@ -1,4 +1,4 @@
-/*     tty_pty.c       4.24    82/08/22        */
+/*     tty_pty.c       6.1     83/07/29        */
 
 /*
  * Pseudo-teletype Driver
 
 /*
  * Pseudo-teletype Driver
@@ -9,6 +9,7 @@
 #if NPTY > 0
 #include "../h/param.h"
 #include "../h/systm.h"
 #if NPTY > 0
 #include "../h/param.h"
 #include "../h/systm.h"
+#include "../h/ioctl.h"
 #include "../h/tty.h"
 #include "../h/dir.h"
 #include "../h/user.h"
 #include "../h/tty.h"
 #include "../h/dir.h"
 #include "../h/user.h"
@@ -16,6 +17,7 @@
 #include "../h/file.h"
 #include "../h/proc.h"
 #include "../h/uio.h"
 #include "../h/file.h"
 #include "../h/proc.h"
 #include "../h/uio.h"
+#include "../h/kernel.h"
 
 #if NPTY == 1
 #undef NPTY
 
 #if NPTY == 1
 #undef NPTY
@@ -50,25 +52,22 @@ ptsopen(dev, flag)
 {
        register struct tty *tp;
 
 {
        register struct tty *tp;
 
-       if (minor(dev) >= NPTY) {
-               u.u_error = ENXIO;
-               return;
-       }
+       if (minor(dev) >= NPTY)
+               return (ENXIO);
        tp = &pt_tty[minor(dev)];
        if ((tp->t_state & TS_ISOPEN) == 0) {
                ttychars(tp);           /* Set up default chars */
        tp = &pt_tty[minor(dev)];
        if ((tp->t_state & TS_ISOPEN) == 0) {
                ttychars(tp);           /* Set up default chars */
+               tp->t_ispeed = tp->t_ospeed = EXTB;
                tp->t_flags = 0;        /* No features (nor raw mode) */
                tp->t_flags = 0;        /* No features (nor raw mode) */
-       } else if (tp->t_state&TS_XCLUDE && u.u_uid != 0) {
-               u.u_error = EBUSY;
-               return;
-       }
+       } else if (tp->t_state&TS_XCLUDE && u.u_uid != 0)
+               return (EBUSY);
        if (tp->t_oproc)                        /* Ctrlr still around. */
                tp->t_state |= TS_CARR_ON;
        while ((tp->t_state & TS_CARR_ON) == 0) {
                tp->t_state |= TS_WOPEN;
                sleep((caddr_t)&tp->t_rawq, TTIPRI);
        }
        if (tp->t_oproc)                        /* Ctrlr still around. */
                tp->t_state |= TS_CARR_ON;
        while ((tp->t_state & TS_CARR_ON) == 0) {
                tp->t_state |= TS_WOPEN;
                sleep((caddr_t)&tp->t_rawq, TTIPRI);
        }
-       (*linesw[tp->t_line].l_open)(dev, tp);
+       return ((*linesw[tp->t_line].l_open)(dev, tp));
 }
 
 ptsclose(dev)
 }
 
 ptsclose(dev)
@@ -87,6 +86,7 @@ ptsread(dev, uio)
 {
        register struct tty *tp = &pt_tty[minor(dev)];
        register struct pt_ioctl *pti = &pt_ioctl[minor(dev)];
 {
        register struct tty *tp = &pt_tty[minor(dev)];
        register struct pt_ioctl *pti = &pt_ioctl[minor(dev)];
+       int error = 0;
 
 again:
        if (pti->pt_flags & PF_REMOTE) {
 
 again:
        if (pti->pt_flags & PF_REMOTE) {
@@ -97,36 +97,35 @@ again:
                            (u.u_procp->p_flag&SDETACH) ||
        */
                            u.u_procp->p_flag&SVFORK)
                            (u.u_procp->p_flag&SDETACH) ||
        */
                            u.u_procp->p_flag&SVFORK)
-                               return;
+                               return (EIO);
                        gsignal(u.u_procp->p_pgrp, SIGTTIN);
                        sleep((caddr_t)&lbolt, TTIPRI);
                }
                if (tp->t_rawq.c_cc == 0) {
                        gsignal(u.u_procp->p_pgrp, SIGTTIN);
                        sleep((caddr_t)&lbolt, TTIPRI);
                }
                if (tp->t_rawq.c_cc == 0) {
-                       if (tp->t_state & TS_NBIO) {
-                               u.u_error = EWOULDBLOCK;
-                               return;
-                       }
+                       if (tp->t_state & TS_NBIO)
+                               return (EWOULDBLOCK);
                        sleep((caddr_t)&tp->t_rawq, TTIPRI);
                        goto again;
                }
                while (tp->t_rawq.c_cc > 1 && uio->uio_resid > 0)
                        if (ureadc(getc(&tp->t_rawq), uio) < 0) {
                        sleep((caddr_t)&tp->t_rawq, TTIPRI);
                        goto again;
                }
                while (tp->t_rawq.c_cc > 1 && uio->uio_resid > 0)
                        if (ureadc(getc(&tp->t_rawq), uio) < 0) {
-                               u.u_error = EFAULT;
+                               error = EFAULT;
                                break;
                        }
                if (tp->t_rawq.c_cc == 1)
                        (void) getc(&tp->t_rawq);
                if (tp->t_rawq.c_cc)
                                break;
                        }
                if (tp->t_rawq.c_cc == 1)
                        (void) getc(&tp->t_rawq);
                if (tp->t_rawq.c_cc)
-                       return;
+                       return (error);
        } else
                if (tp->t_oproc)
        } else
                if (tp->t_oproc)
-                       (*linesw[tp->t_line].l_read)(tp, uio);
+                       error = (*linesw[tp->t_line].l_read)(tp, uio);
        wakeup((caddr_t)&tp->t_rawq.c_cf);
        if (pti->pt_selw) {
                selwakeup(pti->pt_selw, pti->pt_flags & PF_WCOLL);
                pti->pt_selw = 0;
                pti->pt_flags &= ~PF_WCOLL;
        }
        wakeup((caddr_t)&tp->t_rawq.c_cf);
        if (pti->pt_selw) {
                selwakeup(pti->pt_selw, pti->pt_flags & PF_WCOLL);
                pti->pt_selw = 0;
                pti->pt_flags &= ~PF_WCOLL;
        }
+       return (error);
 }
 
 /*
 }
 
 /*
@@ -141,8 +140,9 @@ ptswrite(dev, uio)
        register struct tty *tp;
 
        tp = &pt_tty[minor(dev)];
        register struct tty *tp;
 
        tp = &pt_tty[minor(dev)];
-       if (tp->t_oproc)
-               (*linesw[tp->t_line].l_write)(tp, uio);
+       if (tp->t_oproc == 0)
+               return (EIO);
+       return ((*linesw[tp->t_line].l_write)(tp, uio));
 }
 
 /*
 }
 
 /*
@@ -184,15 +184,11 @@ ptcopen(dev, flag)
        register struct tty *tp;
        struct pt_ioctl *pti;
 
        register struct tty *tp;
        struct pt_ioctl *pti;
 
-       if (minor(dev) >= NPTY) {
-               u.u_error = ENXIO;
-               return;
-       }
+       if (minor(dev) >= NPTY)
+               return (ENXIO);
        tp = &pt_tty[minor(dev)];
        tp = &pt_tty[minor(dev)];
-       if (tp->t_oproc) {
-               u.u_error = EIO;
-               return;
-       }
+       if (tp->t_oproc)
+               return (EIO);
        tp->t_oproc = ptsstart;
        if (tp->t_state & TS_WOPEN)
                wakeup((caddr_t)&tp->t_rawq);
        tp->t_oproc = ptsstart;
        if (tp->t_state & TS_WOPEN)
                wakeup((caddr_t)&tp->t_rawq);
@@ -200,6 +196,7 @@ ptcopen(dev, flag)
        pti = &pt_ioctl[minor(dev)];
        pti->pt_flags = 0;
        pti->pt_send = 0;
        pti = &pt_ioctl[minor(dev)];
        pti->pt_flags = 0;
        pti->pt_send = 0;
+       return (0);
 }
 
 ptcclose(dev)
 }
 
 ptcclose(dev)
@@ -211,7 +208,7 @@ ptcclose(dev)
        if (tp->t_state & TS_ISOPEN)
                gsignal(tp->t_pgrp, SIGHUP);
        tp->t_state &= ~TS_CARR_ON;     /* virtual carrier gone */
        if (tp->t_state & TS_ISOPEN)
                gsignal(tp->t_pgrp, SIGHUP);
        tp->t_state &= ~TS_CARR_ON;     /* virtual carrier gone */
-       flushtty(tp, FREAD|FWRITE);
+       ttyflush(tp, FREAD|FWRITE);
        tp->t_oproc = 0;                /* mark closed */
 }
 
        tp->t_oproc = 0;                /* mark closed */
 }
 
@@ -219,31 +216,31 @@ ptcread(dev, uio)
        dev_t dev;
        struct uio *uio;
 {
        dev_t dev;
        struct uio *uio;
 {
-       register struct tty *tp;
+       register struct tty *tp = &pt_tty[minor(dev)];
        struct pt_ioctl *pti;
        struct pt_ioctl *pti;
+       int error = 0;
 
 
-       tp = &pt_tty[minor(dev)];
        if ((tp->t_state&(TS_CARR_ON|TS_ISOPEN)) == 0)
        if ((tp->t_state&(TS_CARR_ON|TS_ISOPEN)) == 0)
-               return;
+               return (EIO);
        pti = &pt_ioctl[minor(dev)];
        if (pti->pt_flags & PF_PKT) {
                if (pti->pt_send) {
        pti = &pt_ioctl[minor(dev)];
        if (pti->pt_flags & PF_PKT) {
                if (pti->pt_send) {
-                       (void) ureadc(pti->pt_send, uio);
+                       error = ureadc(pti->pt_send, uio);
+                       if (error)
+                               return (error);
                        pti->pt_send = 0;
                        pti->pt_send = 0;
-                       return;
+                       return (0);
                }
                }
-               (void) ureadc(0, uio);
+               error = ureadc(0, uio);
        }
        while (tp->t_outq.c_cc == 0 || (tp->t_state&TS_TTSTOP)) {
        }
        while (tp->t_outq.c_cc == 0 || (tp->t_state&TS_TTSTOP)) {
-               if (pti->pt_flags&PF_NBIO) {
-                       u.u_error = EWOULDBLOCK;
-                       return;
-               }
+               if (pti->pt_flags&PF_NBIO)
+                       return (EWOULDBLOCK);
                sleep((caddr_t)&tp->t_outq.c_cf, TTIPRI);
        }
        while (tp->t_outq.c_cc && uio->uio_resid > 0)
                if (ureadc(getc(&tp->t_outq), uio) < 0) {
                sleep((caddr_t)&tp->t_outq.c_cf, TTIPRI);
        }
        while (tp->t_outq.c_cc && uio->uio_resid > 0)
                if (ureadc(getc(&tp->t_outq), uio) < 0) {
-                       u.u_error = EFAULT;
+                       error = EFAULT;
                        break;
                }
        if (tp->t_outq.c_cc <= TTLOWAT(tp)) {
                        break;
                }
        if (tp->t_outq.c_cc <= TTLOWAT(tp)) {
@@ -257,6 +254,7 @@ ptcread(dev, uio)
                        tp->t_state &= ~TS_WCOLL;
                }
        }
                        tp->t_state &= ~TS_WCOLL;
                }
        }
+       return (error);
 }
 
 ptsstop(tp, flush)
 }
 
 ptsstop(tp, flush)
@@ -320,16 +318,16 @@ ptcwrite(dev, uio)
        dev_t dev;
        struct uio *uio;
 {
        dev_t dev;
        struct uio *uio;
 {
-       register struct tty *tp;
+       register struct tty *tp = &pt_tty[minor(dev)];
        register char *cp, *ce;
        register int cc;
        char locbuf[BUFSIZ];
        int cnt = 0;
        struct pt_ioctl *pti = &pt_ioctl[minor(dev)];
        register char *cp, *ce;
        register int cc;
        char locbuf[BUFSIZ];
        int cnt = 0;
        struct pt_ioctl *pti = &pt_ioctl[minor(dev)];
+       int error = 0;
 
 
-       tp = &pt_tty[minor(dev)];
        if ((tp->t_state&(TS_CARR_ON|TS_ISOPEN)) == 0)
        if ((tp->t_state&(TS_CARR_ON|TS_ISOPEN)) == 0)
-               return;
+               return (EIO);
        do {
                register struct iovec *iov;
 
        do {
                register struct iovec *iov;
 
@@ -345,8 +343,8 @@ ptcwrite(dev, uio)
                }
                cc = MIN(iov->iov_len, BUFSIZ);
                cp = locbuf;
                }
                cc = MIN(iov->iov_len, BUFSIZ);
                cp = locbuf;
-               u.u_error = uiomove(cp, cc, UIO_WRITE, uio);
-               if (u.u_error)
+               error = uiomove(cp, cc, UIO_WRITE, uio);
+               if (error)
                        break;
                ce = cp + cc;
 again:
                        break;
                ce = cp + cc;
 again:
@@ -357,8 +355,7 @@ again:
                                        iov->iov_len += ce - cp;
                                        uio->uio_resid += ce - cp;
                                        uio->uio_offset -= ce - cp;
                                        iov->iov_len += ce - cp;
                                        uio->uio_resid += ce - cp;
                                        uio->uio_offset -= ce - cp;
-                                       u.u_error = EWOULDBLOCK;
-                                       return;
+                                       return (EWOULDBLOCK);
                                }
                                sleep((caddr_t)&tp->t_rawq.c_cf, TTOPRI);
                                goto again;
                                }
                                sleep((caddr_t)&tp->t_rawq.c_cf, TTOPRI);
                                goto again;
@@ -366,7 +363,7 @@ again:
                        (void) b_to_q(cp, cc, &tp->t_rawq);
                        (void) putc(0, &tp->t_rawq);
                        wakeup((caddr_t)&tp->t_rawq);
                        (void) b_to_q(cp, cc, &tp->t_rawq);
                        (void) putc(0, &tp->t_rawq);
                        wakeup((caddr_t)&tp->t_rawq);
-                       return;
+                       return (0);
                }
                while (cp < ce) {
                        while (tp->t_delct && tp->t_rawq.c_cc >= TTYHOG - 2) {
                }
                while (cp < ce) {
                        while (tp->t_delct && tp->t_rawq.c_cc >= TTYHOG - 2) {
@@ -377,8 +374,8 @@ again:
                                        uio->uio_resid += ce - cp;
                                        uio->uio_offset -= ce - cp;
                                        if (cnt == 0)
                                        uio->uio_resid += ce - cp;
                                        uio->uio_offset -= ce - cp;
                                        if (cnt == 0)
-                                               u.u_error = EWOULDBLOCK;
-                                       return;
+                                               return (EWOULDBLOCK);
+                                       return (0);
                                }
                                /* Better than just flushing it! */
                                /* Wait for something to be read */
                                }
                                /* Better than just flushing it! */
                                /* Wait for something to be read */
@@ -389,6 +386,7 @@ again:
                        cnt++;
                }
        } while (uio->uio_resid);
                        cnt++;
                }
        } while (uio->uio_resid);
+       return (error);
 }
 
 /*ARGSUSED*/
 }
 
 /*ARGSUSED*/
@@ -398,6 +396,7 @@ ptyioctl(dev, cmd, data, flag)
 {
        register struct tty *tp = &pt_tty[minor(dev)];
        register struct pt_ioctl *pti = &pt_ioctl[minor(dev)];
 {
        register struct tty *tp = &pt_tty[minor(dev)];
        register struct pt_ioctl *pti = &pt_ioctl[minor(dev)];
+       int error;
 
        /* IF CONTROLLER STTY THEN MUST FLUSH TO PREVENT A HANG ??? */
        if (cdevsw[major(dev)].d_open == ptcopen)
 
        /* IF CONTROLLER STTY THEN MUST FLUSH TO PREVENT A HANG ??? */
        if (cdevsw[major(dev)].d_open == ptcopen)
@@ -408,32 +407,33 @@ ptyioctl(dev, cmd, data, flag)
                                pti->pt_flags |= PF_PKT;
                        else
                                pti->pt_flags &= ~PF_PKT;
                                pti->pt_flags |= PF_PKT;
                        else
                                pti->pt_flags &= ~PF_PKT;
-                       return;
+                       return (0);
 
                case TIOCREMOTE:
                        if (*(int *)data)
                                pti->pt_flags |= PF_REMOTE;
                        else
                                pti->pt_flags &= ~PF_REMOTE;
 
                case TIOCREMOTE:
                        if (*(int *)data)
                                pti->pt_flags |= PF_REMOTE;
                        else
                                pti->pt_flags &= ~PF_REMOTE;
-                       flushtty(tp, FREAD|FWRITE);
-                       return;
+                       ttyflush(tp, FREAD|FWRITE);
+                       return (0);
 
                case FIONBIO:
                        if (*(int *)data)
                                pti->pt_flags |= PF_NBIO;
                        else
                                pti->pt_flags &= ~PF_NBIO;
 
                case FIONBIO:
                        if (*(int *)data)
                                pti->pt_flags |= PF_NBIO;
                        else
                                pti->pt_flags &= ~PF_NBIO;
-                       return;
+                       return (0);
 
                case TIOCSETP:
                        while (getc(&tp->t_outq) >= 0)
                                ;
                        break;
                }
 
                case TIOCSETP:
                        while (getc(&tp->t_outq) >= 0)
                                ;
                        break;
                }
-       if (ttioctl(tp, cmd, data, dev) == 0)
-               u.u_error = ENOTTY;
-       { int stop = (tp->t_un.t_chr.t_stopc == ('s'&037) &&
-                     tp->t_un.t_chr.t_startc == ('q'&037));
+       error = ttioctl(tp, cmd, data, dev);
+       if (error < 0)
+               error = ENOTTY;
+       { int stop = (tp->t_stopc == ('s'&037) &&
+                     tp->t_startc == ('q'&037));
        if (pti->pt_flags & PF_NOSTOP) {
                if (stop) {
                        pti->pt_send &= TIOCPKT_NOSTOP;
        if (pti->pt_flags & PF_NOSTOP) {
                if (stop) {
                        pti->pt_send &= TIOCPKT_NOSTOP;
@@ -450,5 +450,6 @@ ptyioctl(dev, cmd, data, flag)
                }
        }
        }
                }
        }
        }
+       return (error);
 }
 #endif
 }
 #endif