home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / drdobbs / 1989 / 01 / stream.asc < prev   
Text File  |  1989-01-02  |  2KB  |  15 lines

  1. _UNIX STREAMS_
  2.  
  3. by Michael Garwood & Andrew Schweig
  4.  
  5. [EXAMPLE 1]
  6.  
  7.  
  8. /* * 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;                }}
  9.  
  10. [EXAMPLE 2]
  11. 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 */}
  12.  
  13. [EXAMPLE 3]
  14.  
  15. 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);}