home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 September
/
Simtel20_Sept92.cdr
/
msdos
/
ddjmag
/
ddj8901.arc
/
STREAM.ASC
< prev
Wrap
Text File
|
1989-01-02
|
2KB
|
15 lines
_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);}