home *** CD-ROM | disk | FTP | other *** search
- _UNIX STREAMS_
-
- by Michael Garwood & Andrew Schweig
-
- [EXAMPLE 1]
-
-
- /* * module put procedure */modput(q, mp) queue_t *q; mblk_t *mp;{ switch(mp->b_datap->db_type) { case M_IOCTL: do_ioctl(mp); /* process IOCTLs immediately */ break; case M_DATA: putq(q, mp); /* enqueue for service processing */ break; default: putnext(q, mp); /* pass downstream */ break; }}/* * module service procedure */modsrv(q) queue_t *q;{ mblk_t *mp; while (mp = getq()) /* dequeue messages */ if (canput(q->q_next)) { transform(mp); /* local transformation of data */ putnext(q, mp); } else { putbq(q, mp); return; }}
-
- [EXAMPLE 2]
- struct queue_t *drvqueue[MAXDEV];drvopen(q, dev, flag, sflag) queue_t *q; dev_t dev;{ unsigned int mindev; char error = 0; if (sflag == CLONEOPEN) { for (mindev = 0 ; mindev < MAXDEV; mindev++) /* allocate dev */ if (drvqueue[mindev] == NULL) break; if (mindev >= MAXDEV) return(OPENFAIL); } else { mindev = minor(dev); if (mindev >= MAXDEV) error = ENXIO; else if (drvqueue[mindev] && drvqueue[mindev] != q) /* one at a time */ error = EBUSY; /* maybe EAGAIN */ } if (error) u.u_error = error; else drvqueue[mindev] = q; return(mindev); /* return minor for clone driver */}
-
- [EXAMPLE 3]
-
- sendbuf(q) queue_t *q;{ mblk_t *bp; if (!(bp = alloc(BUFSIZE, BPRI_MED))) { if (!bufcall(BUFSIZE, BPRI_MED, sendbuf, q)) timeout(sendbuf, q, HZ); /* if all else fails */ return(0); } putnext(q, bp); return(1);}