cleaned up and re-enable compaction
[unix-history] / usr / src / sys / kern / tty.c
index d57e691..fd286d6 100644 (file)
@@ -1,4 +1,4 @@
-/*     tty.c   4.6     81/03/22        */
+/*     tty.c   4.14    81/11/18        */
 
 /*
  * TTY subroutines common to more than one line discipline
 
 /*
  * TTY subroutines common to more than one line discipline
@@ -9,7 +9,6 @@
 #include "../h/user.h"
 #include "../h/tty.h"
 #include "../h/proc.h"
 #include "../h/user.h"
 #include "../h/tty.h"
 #include "../h/proc.h"
-#include "../h/mx.h"
 #include "../h/inode.h"
 #include "../h/file.h"
 #include "../h/reg.h"
 #include "../h/inode.h"
 #include "../h/file.h"
 #include "../h/reg.h"
@@ -104,8 +103,6 @@ register struct tty *tp;
 {
        register s;
 
 {
        register s;
 
-       if (tp->t_line == NETLDISC)
-               return;
        s = spl6();
        if (rw & FREAD) {
                while (getc(&tp->t_canq) >= 0)
        s = spl6();
        if (rw & FREAD) {
                while (getc(&tp->t_canq) >= 0)
@@ -284,17 +281,6 @@ caddr_t addr;
                (void) spl0();
                break;
 
                (void) spl0();
                break;
 
-       /*
-        * Prevent more opens on channel
-        */
-       case TIOCEXCL:
-               tp->t_state |= XCLUDE;
-               break;
-
-       case TIOCNXCL:
-               tp->t_state &= ~XCLUDE;
-               break;
-
        /*
         * Set new parameters
         */
        /*
         * Set new parameters
         */
@@ -305,44 +291,29 @@ caddr_t addr;
                        return(1);
                }
                (void) spl5();
                        return(1);
                }
                (void) spl5();
-               if (tp->t_line == 0) {
-                       if (com == TIOCSETP)
-                               wflushtty(tp);
-                       while (canon(tp)>=0) 
-                               ;
-#ifdef notdef
-                       wakeup((caddr_t)&tp->t_rawq);
-#endif
-               } else if (tp->t_line == NTTYDISC) {
-                       if (tp->t_flags&RAW || iocb.sg_flags&RAW ||
-                           com == TIOCSETP)
-                               wflushtty(tp);
-                       else if ((tp->t_flags&CBREAK) != (iocb.sg_flags&CBREAK)) {
-                               if (iocb.sg_flags & CBREAK) {
-                                       catq(&tp->t_rawq, &tp->t_canq);
-                                       tq = tp->t_rawq;
-                                       tp->t_rawq = tp->t_canq;
-                                       tp->t_canq = tq;
-                               } else {
-                                       tp->t_local |= LPENDIN;
-                                       if (tp->t_canq.c_cc)
-                                               panic("ioccom canq");
-#ifdef notdef
-                                       if (tp->t_chan)
-                                               (void) sdata(tp->t_chan);
-                                       else
-#endif
-                                               wakeup((caddr_t)&tp->t_rawq);
-                               }
+               if (tp->t_flags&RAW || iocb.sg_flags&RAW ||
+                   com == TIOCSETP)
+                       wflushtty(tp);
+               else if ((tp->t_flags&CBREAK) != (iocb.sg_flags&CBREAK)) {
+                       if (iocb.sg_flags & CBREAK) {
+                               catq(&tp->t_rawq, &tp->t_canq);
+                               tq = tp->t_rawq;
+                               tp->t_rawq = tp->t_canq;
+                               tp->t_canq = tq;
+                       } else {
+                               tp->t_local |= LPENDIN;
+                               ttwakeup(tp);
                        }
                }
                        }
                }
-               if ((tp->t_state&SPEEDS)==0) {
-                       tp->t_ispeed = iocb.sg_ispeed;
-                       tp->t_ospeed = iocb.sg_ospeed;
-               }
+               tp->t_ispeed = iocb.sg_ispeed;
+               tp->t_ospeed = iocb.sg_ospeed;
                tp->t_erase = iocb.sg_erase;
                tp->t_kill = iocb.sg_kill;
                tp->t_flags = iocb.sg_flags;
                tp->t_erase = iocb.sg_erase;
                tp->t_kill = iocb.sg_kill;
                tp->t_flags = iocb.sg_flags;
+               if (tp->t_flags & RAW) {
+                       tp->t_state &= ~TTSTOP;
+                       ttstart(tp);
+               }
                (void) spl0();
                break;
 
                (void) spl0();
                break;
 
@@ -366,9 +337,17 @@ caddr_t addr;
                tp->t_state |= HUPCLS;
                break;
 
                tp->t_state |= HUPCLS;
                break;
 
-       case TIOCFLUSH:
-               flushtty(tp, FREAD|FWRITE);
+       case TIOCFLUSH: {
+               int flags;
+               if (addr == 0)
+                       flags = FREAD|FWRITE;
+               else if (copyin(addr, (caddr_t)&flags, sizeof (flags))) {
+                       u.u_error = EFAULT;
+                       return(1);
+               }
+               flushtty(tp, flags);
                break;
                break;
+       }
 
        /*
         * Set and fetch special characters
 
        /*
         * Set and fetch special characters
@@ -401,28 +380,7 @@ caddr_t addr;
         * Return number of characters immediately available.
         */
        case FIONREAD: {
         * Return number of characters immediately available.
         */
        case FIONREAD: {
-               off_t nread;
-
-               switch (tp->t_line) {
-
-               case NETLDISC:
-                       nread = tp->t_rec ? tp->t_inbuf : 0;
-                       break;
-
-               case 0:
-                       (void) spl5();
-                       while (canon(tp)>=0)
-                               ;
-                       (void) spl0();
-                       /* fall into ... */
-
-               case NTTYDISC:
-                       nread = tp->t_canq.c_cc;
-                       if (tp->t_flags & (RAW|CBREAK))
-                               nread += tp->t_rawq.c_cc;
-                       break;
-
-               }
+               off_t nread = ttnread(tp);
                if (copyout((caddr_t)&nread, addr, sizeof (off_t)))
                        u.u_error = EFAULT;
                break;
                if (copyout((caddr_t)&nread, addr, sizeof (off_t)))
                        u.u_error = EFAULT;
                break;
@@ -496,3 +454,40 @@ caddr_t addr;
        }
        return(1);
 }
        }
        return(1);
 }
+
+ttnread(tp)
+       struct tty *tp;
+{
+       int nread = 0;
+
+       if (tp->t_local & LPENDIN)
+               ttypend(tp);
+       nread = tp->t_canq.c_cc;
+       if (tp->t_flags & (RAW|CBREAK))
+               nread += tp->t_rawq.c_cc;
+       return (nread);
+}
+
+ttselect(dev, flag)
+       dev_t dev;
+       int flag;
+{
+       register struct tty *tp = &cdevsw[major(dev)].d_ttys[minor(dev)];
+       int nread;
+
+       switch (flag) {
+
+       case FREAD:
+               nread = ttnread(tp);
+               if (nread > 0)
+                       return (1);
+               if (tp->t_rsel && tp->t_rsel->p_wchan == (caddr_t)&selwait)
+                       tp->t_state |= RCOLL;
+               else
+                       tp->t_rsel = u.u_procp;
+               return (0);
+
+       default:
+               return (1);
+       }
+}