|
|
1.1 root 1: /*
2: * stream pipe
3: */
4: #include "sys/param.h"
5: #include "sys/stream.h"
6: #include "sys/conf.h"
7:
8: extern struct queue *spipes[];
9: extern int spcnt;
10:
11: int spsrv(), spclose();
12: long spopen();
13: static struct qinit sprinit = { putq, spsrv, spopen, spclose, 128, 65 };
14: struct streamtab spinfo = { &sprinit, &sprinit };
15: struct cdevsw spcdev = cstrinit(&spinfo);
16:
17: long
18: spopen(q, dev)
19: register struct queue *q;
20: {
21: register d = minor(dev);
22: register struct queue *oq;
23:
24: if (d > spcnt)
25: return (0);
26: if (q->ptr) { /* already open */
27: if (d&01)
28: return(0); /* reopening master */
29: else
30: return(1); /* reopening slave */
31: }
32: q->flag |= QDELIM;
33: if (oq = spipes[d^01]) {
34: if (d&01)
35: return(0); /* master with old lingering slave */
36: WR(q)->ptr = (caddr_t)oq;
37: WR(oq)->ptr = (caddr_t)q;
38: } else if ((d&01) == 0)
39: return(0); /* slave opened first */
40: q->ptr = (caddr_t)dev;
41: spipes[d] = q;
42: return(1);
43: }
44:
45: spclose(q)
46: register struct queue *q;
47: {
48: register struct queue *oq;
49: register struct block *bp;
50:
51: if (oq = (struct queue *)WR(q)->ptr) {
52: while (bp = getq(WR(q)))
53: (*oq->next->qinfo->putp)(oq->next, bp);
54: putctl(oq->next, M_HANGUP);
55: WR(oq)->ptr = NULL;
56: }
57: spipes[minor((int)q->ptr)] = NULL;
58: }
59:
60: spsrv(q)
61: register struct queue *q;
62: {
63: register struct block *bp;
64: register struct queue *oq;
65:
66: if (q->flag&QREADR) {
67: oq = (struct queue *)WR(q)->ptr;
68: if (oq && (q->next->flag & QFULL) == 0)
69: qenable(WR(oq));
70: return;
71: }
72: oq = (struct queue *)q->ptr;
73: while (bp = getq(q)) {
74: if (oq == NULL) {
75: freeb(bp);
76: continue;
77: }
78: if (oq->next->flag & QFULL && bp->type < QPCTL) {
79: putbq(q, bp);
80: return;
81: }
82: (*oq->next->qinfo->putp)(oq->next, bp);
83: }
84: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.