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