Annotation of 41BSD/sys/dev/bk.c, revision 1.1

1.1     ! root        1: /*     bk.c    4.2     11/9/80 */
        !             2: 
        !             3: #include "../h/param.h"
        !             4: #include "../h/systm.h"
        !             5: #include "../h/dir.h"
        !             6: #include "../h/user.h"
        !             7: #include "../h/tty.h"
        !             8: #include "../h/proc.h"
        !             9: #include "../h/mx.h"
        !            10: #include "../h/inode.h"
        !            11: #include "../h/file.h"
        !            12: #include "../h/conf.h"
        !            13: #include "../h/buf.h"
        !            14: 
        !            15: /*
        !            16:  * When running dz's using only SAE (silo alarm) on input
        !            17:  * it is necessary to call dzrint() at clock interrupt time.
        !            18:  * This is unsafe unless spl5()s in tty code are changed to
        !            19:  * spl6()s to block clock interrupts.  Note that the dh driver
        !            20:  * currently in use works the same way as the dz, even though
        !            21:  * we could try to more intelligently manage its silo.
        !            22:  * Thus don't take this out if you have no dz's unless you
        !            23:  * change clock.c and dhtimer().
        !            24:  */
        !            25: #define        spl5    spl6
        !            26: 
        !            27: /*
        !            28:  * Line discipline for Berkeley network.
        !            29:  *
        !            30:  * This supplies single lines to a user level program
        !            31:  * with a minimum of fuss.  Lines are newline terminated.
        !            32:  * A later version will implement full 8-bit paths by providing
        !            33:  * an escape sequence to include a newline in a record.
        !            34:  *
        !            35:  * This discipline requires that tty device drivers call
        !            36:  * the line specific l_ioctl routine from their ioctl routines,
        !            37:  * assigning the result to cmd so that we can refuse most tty specific
        !            38:  * ioctls which are unsafe because we have ambushed the
        !            39:  * teletype input queues, overlaying them with other information.
        !            40:  */
        !            41: 
        !            42: /*
        !            43:  * Open as networked discipline.  Called when discipline changed
        !            44:  * with ioctl, this assigns a buffer to the line for input, and
        !            45:  * changing the interpretation of the information in the tty structure.
        !            46:  */
        !            47: /*ARGSUSED*/
        !            48: bkopen(dev, tp)
        !            49: dev_t dev;
        !            50: register struct tty *tp;
        !            51: {
        !            52:        register struct buf *bp;
        !            53: 
        !            54:        if (u.u_error)
        !            55:                return;         /* paranoia */
        !            56:        if (tp->t_line == NETLDISC) {
        !            57:                u.u_error = EBUSY;              /* sometimes the network */
        !            58:                return;                         /* ... opens /dev/tty */
        !            59:        }
        !            60:        bp = geteblk();
        !            61:        flushtty(tp, FREAD|FWRITE);
        !            62:        tp->t_bufp = bp;
        !            63:        tp->t_cp = (char *)bp->b_un.b_addr;
        !            64:        tp->t_inbuf = 0;
        !            65:        tp->t_rec = 0;
        !            66: }
        !            67: 
        !            68: /*
        !            69:  * Break down... called when discipline changed or from device
        !            70:  * close routine.
        !            71:  */
        !            72: bkclose(tp)
        !            73: register struct tty *tp;
        !            74: {
        !            75:        register s;
        !            76: 
        !            77:        s = spl5();
        !            78:        wakeup((caddr_t)&tp->t_rawq);
        !            79:        if (tp->t_bufp) {
        !            80:                brelse(tp->t_bufp);
        !            81:                tp->t_bufp = 0;
        !            82:        } else
        !            83:                printf("bkclose: no buf\n");
        !            84:        tp->t_cp = 0;
        !            85:        tp->t_inbuf = 0;
        !            86:        tp->t_rec = 0;
        !            87:        tp->t_line = 0;         /* paranoid: avoid races */
        !            88:        splx(s);
        !            89: }
        !            90: 
        !            91: /*
        !            92:  * Read from a network line.
        !            93:  * Characters have been buffered in a system buffer and are
        !            94:  * now dumped back to the user in one fell swoop, and with a
        !            95:  * minimum of fuss.  Note that no input is accepted when a record
        !            96:  * is waiting.  Our clearing tp->t_rec here allows further input
        !            97:  * to accumulate.
        !            98:  */
        !            99: bkread(tp)
        !           100: register struct tty *tp;
        !           101: {
        !           102:        register int i;
        !           103:        register s;
        !           104: 
        !           105:        if ((tp->t_state&CARR_ON)==0)
        !           106:                return (-1);
        !           107:        s = spl5();
        !           108:        while (tp->t_rec == 0 && tp->t_line == NETLDISC)
        !           109:                sleep((caddr_t)&tp->t_rawq, TTIPRI);
        !           110:        splx(s);
        !           111:        if (tp->t_line != NETLDISC)
        !           112:                return (-1);
        !           113:        i = MIN(tp->t_inbuf, (int)u.u_count);
        !           114:        if (copyout(tp->t_bufp->b_un.b_addr, u.u_base, (unsigned)i)) {
        !           115:                u.u_error = EFAULT;
        !           116:                return (-1);
        !           117:        }
        !           118:        u.u_count -= i;
        !           119:        u.u_base += i;
        !           120:        u.u_offset += i;
        !           121:        tp->t_cp = (char *)tp->t_bufp->b_un.b_addr;
        !           122:        tp->t_inbuf = 0;
        !           123:        tp->t_rec = 0;
        !           124:        return (0);
        !           125: }
        !           126: 
        !           127: /*
        !           128:  * Low level character input routine.
        !           129:  * Stuff the character in the buffer, and wake up the top
        !           130:  * half after setting t_rec if this completes the record
        !           131:  * or if the buffer is (ick!) full.
        !           132:  *
        !           133:  * Thisis where the formatting should get done to allow
        !           134:  * 8 character data paths through escapes.
        !           135:  *
        !           136:  * This rutine should be expanded in-line in the receiver
        !           137:  * interrupt routine of the dh-11 to make it run as fast as possible.
        !           138:  */
        !           139: bkinput(c, tp)
        !           140: register c;
        !           141: register struct tty *tp;
        !           142: {
        !           143: 
        !           144:        if (tp->t_rec)
        !           145:                return;
        !           146:        *tp->t_cp++ = c;
        !           147:        if (++tp->t_inbuf == BSIZE || c == '\n') {
        !           148:                tp->t_rec = 1;
        !           149:                wakeup((caddr_t)&tp->t_rawq);
        !           150:        }
        !           151: }
        !           152: 
        !           153: /*
        !           154:  * This routine is called whenever a ioctl is about to be performed
        !           155:  * and gets a chance to reject the ioctl.  We reject all teletype
        !           156:  * oriented ioctl's except those which set the discipline, and
        !           157:  * those which get parameters (gtty and get special characters).
        !           158:  */
        !           159: /*ARGSUSED*/
        !           160: bkioctl(tp, cmd, addr)
        !           161: struct tty *tp;
        !           162: caddr_t addr;
        !           163: {
        !           164: 
        !           165:        if ((cmd>>8) != 't')
        !           166:                return (cmd);
        !           167:        switch (cmd) {
        !           168: 
        !           169:        case TIOCSETD:
        !           170:        case TIOCGETD:
        !           171:        case TIOCGETP:
        !           172:        case TIOCGETC:
        !           173:                return (cmd);
        !           174:        }
        !           175:        u.u_error = ENOTTY;
        !           176:        return (0);
        !           177: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.