1: /* 2: * Copyright (c) 1982, 1986 Regents of the University of California. 3: * All rights reserved. The Berkeley software License Agreement 4: * specifies the terms and conditions for redistribution. 5: * 6: * @(#)tty_bk.c 7.1 (Berkeley) 6/5/86 7: */ 8: 9: #include "bk.h" 10: 11: #if NBK > 0 12: #include "param.h" 13: #include "systm.h" 14: #include "dir.h" 15: #include "user.h" 16: #include "ioctl.h" 17: #include "tty.h" 18: #include "proc.h" 19: #include "inode.h" 20: #include "file.h" 21: #include "conf.h" 22: #include "buf.h" 23: #include "uio.h" 24: 25: /* 26: * Line discipline for Berkeley network. 27: * 28: * This supplies single lines to a user level program 29: * with a minimum of fuss. Lines are newline terminated. 30: * 31: * This discipline requires that tty device drivers call 32: * the line specific l_ioctl routine from their ioctl routines, 33: * assigning the result to cmd so that we can refuse most tty specific 34: * ioctls which are unsafe because we have ambushed the 35: * teletype input queues, overlaying them with other information. 36: */ 37: 38: /* 39: * Open as networked discipline. Called when discipline changed 40: * with ioctl, this assigns a buffer to the line for input, and 41: * changing the interpretation of the information in the tty structure. 42: */ 43: /*ARGSUSED*/ 44: bkopen(dev, tp) 45: dev_t dev; 46: register struct tty *tp; 47: { 48: register struct buf *bp; 49: 50: if (tp->t_line == NETLDISC) 51: return (EBUSY); /* sometimes the network opens /dev/tty */ 52: bp = geteblk(1024); 53: ttyflush(tp, FREAD|FWRITE); 54: tp->t_bufp = bp; 55: tp->t_cp = (char *)bp->b_un.b_addr; 56: tp->t_inbuf = 0; 57: tp->t_rec = 0; 58: return (0); 59: } 60: 61: /* 62: * Break down... called when discipline changed or from device 63: * close routine. 64: */ 65: bkclose(tp) 66: register struct tty *tp; 67: { 68: register int s; 69: 70: s = spl5(); 71: wakeup((caddr_t)&tp->t_rawq); 72: if (tp->t_bufp) { 73: brelse(tp->t_bufp); 74: tp->t_bufp = 0; 75: } else 76: printf("bkclose: no buf\n"); 77: tp->t_cp = 0; 78: tp->t_inbuf = 0; 79: tp->t_rec = 0; 80: tp->t_line = 0; /* paranoid: avoid races */ 81: splx(s); 82: } 83: 84: /* 85: * Read from a network line. 86: * Characters have been buffered in a system buffer and are 87: * now dumped back to the user in one fell swoop, and with a 88: * minimum of fuss. Note that no input is accepted when a record 89: * is waiting. Our clearing tp->t_rec here allows further input 90: * to accumulate. 91: */ 92: bkread(tp, uio) 93: register struct tty *tp; 94: struct uio *uio; 95: { 96: register int s; 97: int error; 98: 99: if ((tp->t_state&TS_CARR_ON)==0) 100: return (-1); 101: s = spl5(); 102: while (tp->t_rec == 0 && tp->t_line == NETLDISC) 103: sleep((caddr_t)&tp->t_rawq, TTIPRI); 104: splx(s); 105: if (tp->t_line != NETLDISC) 106: return (-1); 107: error = uiomove(tp->t_bufp->b_un.b_addr, tp->t_inbuf, UIO_READ, uio); 108: tp->t_cp = (char *)tp->t_bufp->b_un.b_addr; 109: tp->t_inbuf = 0; 110: tp->t_rec = 0; 111: return (error); 112: } 113: 114: /* 115: * Low level character input routine. 116: * Stuff the character in the buffer, and wake up the top 117: * half after setting t_rec if this completes the record 118: * or if the buffer is (ick!) full. 119: * 120: * Thisis where the formatting should get done to allow 121: * 8 character data paths through escapes. 122: * 123: * This rutine should be expanded in-line in the receiver 124: * interrupt routine of the dh-11 to make it run as fast as possible. 125: */ 126: bkinput(c, tp) 127: register c; 128: register struct tty *tp; 129: { 130: 131: if (tp->t_rec) 132: return; 133: *tp->t_cp++ = c; 134: if (++tp->t_inbuf == 1024 || c == '\n') { 135: tp->t_rec = 1; 136: wakeup((caddr_t)&tp->t_rawq); 137: } 138: } 139: 140: /* 141: * This routine is called whenever a ioctl is about to be performed 142: * and gets a chance to reject the ioctl. We reject all teletype 143: * oriented ioctl's except those which set the discipline, and 144: * those which get parameters (gtty and get special characters). 145: */ 146: /*ARGSUSED*/ 147: bkioctl(tp, cmd, data, flag) 148: struct tty *tp; 149: caddr_t data; 150: { 151: 152: if ((cmd>>8) != 't') 153: return (-1); 154: switch (cmd) { 155: 156: case TIOCSETD: 157: case TIOCGETD: 158: case TIOCGETP: 159: case TIOCGETC: 160: return (-1); 161: } 162: return (ENOTTY); 163: } 164: #endif