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