|
|
1.1 ! root 1: /* ! 2: * connector l.d.: install on a stream-mounted file. ! 3: * Opens on the file send new, unique pipe to the ! 4: * server and return the other end of the pipe. ! 5: */ ! 6: ! 7: #include "../h/param.h" ! 8: #include "../h/systm.h" ! 9: #include "../h/stream.h" ! 10: #include "../h/ioctl.h" ! 11: #include "../h/map.h" ! 12: #include "../h/buf.h" ! 13: #include "../h/ubavar.h" ! 14: #include "../h/conf.h" ! 15: #include "../h/file.h" ! 16: #include "../h/inode.h" ! 17: #include "../h/ttyld.h" ! 18: #include "connld.h" ! 19: ! 20: #if NCONNLD ! 21: ! 22: #define STIPRI 28 ! 23: int connopen(), connput(), nulldev(), conngput(); ! 24: ! 25: static struct qinit connrinit = { connput, 0, connopen, nulldev, 0, 0 }; ! 26: static struct qinit connwinit = { connput, 0, connopen, nulldev, 0, 0 }; ! 27: struct streamtab connldinfo = { &connrinit, &connwinit }; ! 28: ! 29: static struct qinit connrgrab = { conngput, 0, nulldev, nulldev, 0, 0 }; ! 30: static struct qinit connwgrab = { connput, 0, nulldev, nulldev, 0, 0 }; ! 31: struct streamtab connginfo = { &connrgrab, &connwgrab }; ! 32: ! 33: connopen(q, dev) ! 34: register struct queue *q; ! 35: { ! 36: struct inode *ip1, *ip2; ! 37: register struct file *fp, *nfp; ! 38: register s; ! 39: register struct block *bp; ! 40: register struct queue *nq; ! 41: register ioc; ! 42: ! 43: if ((int)q->ptr == 0) { /* the open on push does nothing */ ! 44: q->ptr = (caddr_t)1; ! 45: return(1); ! 46: } ! 47: /* make pipe, send one end to other side */ ! 48: if ((fp = allocfile()) == NULL) ! 49: return(0); ! 50: if (makepipe(&ip1, &ip2)==0) { ! 51: fp->f_count = 0; ! 52: return(0); ! 53: } ! 54: fp->f_inode = ip2; ! 55: fp->f_flag = FREAD|FWRITE; ! 56: fp->f_count--; ! 57: nq = RD(ip1->i_sptr->wrq); ! 58: if (sndfile(WR(q), fp)==0 || qattach(&connginfo, nq, (dev_t)0)==0) { ! 59: stclose(ip1); ! 60: iput(ip1); ! 61: return(0); ! 62: } ! 63: nq = backq(nq); ! 64: /* wait for reply */ ! 65: s = spl5(); ! 66: while ((bp = getq(nq))==NULL) { ! 67: if (tsleep((caddr_t)nq, STIPRI, 0) != TS_OK) { ! 68: stclose(ip1); ! 69: iput(ip1); ! 70: return(0); ! 71: } ! 72: } ! 73: splx(s); ! 74: ! 75: switch(bp->type) { ! 76: ! 77: case M_HANGUP: ! 78: freeb(bp); ! 79: stclose(ip1, 1); ! 80: iput(ip1); ! 81: return(0); ! 82: ! 83: case M_PASS: /* accept, and provide a newer file */ ! 84: stclose(ip1, 1); ! 85: iput(ip1); ! 86: nfp = ((struct kpassfd *)bp->rptr)->f.fp; ! 87: ip1 = nfp->f_inode; ! 88: ip1->i_count++; ! 89: closef(nfp); ! 90: return((long)ip1); ! 91: ! 92: case M_IOCTL: ! 93: ioc = ((union stmsg *)bp->rptr)->ioc0.com; ! 94: if (ioc==FIOACCEPT || ioc==FIOREJECT) { ! 95: bp->type = M_IOCACK; ! 96: qreply(nq, bp); ! 97: if (ioc==FIOREJECT) { ! 98: stclose(ip1, 1); ! 99: iput(ip1); ! 100: return(0); ! 101: } ! 102: while (bp = getq(nq)) ! 103: (*nq->next->qinfo->putp)(nq->next, bp); ! 104: qdetach(nq, 1); ! 105: return((long)ip1); ! 106: } ! 107: default: /* flow through */ ! 108: (*nq->next->qinfo->putp)(nq->next, bp); ! 109: while (bp = getq(nq)) ! 110: (*nq->next->qinfo->putp)(nq->next, bp); ! 111: qdetach(nq, 1); ! 112: return((long)ip1); ! 113: } ! 114: } ! 115: ! 116: connput(q, bp) ! 117: register struct queue *q; ! 118: register struct block *bp; ! 119: { ! 120: switch (bp->type) { ! 121: ! 122: case M_HANGUP: ! 123: case M_IOCTL: ! 124: case M_IOCACK: ! 125: case M_IOCNAK: ! 126: case M_PASS: ! 127: (*q->next->qinfo->putp)(q->next, bp); ! 128: return; ! 129: } ! 130: freeb(bp); ! 131: } ! 132: ! 133: conngput(q, bp) ! 134: register struct queue *q; ! 135: register struct block *bp; ! 136: { ! 137: putq(q, bp); ! 138: wakeup((caddr_t)q); ! 139: } ! 140: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.