STREAMS-UX Programmer's Guide (February 2007)
Modules and Drivers
Entry Points
Chapter 4
79
bp->b_cont = nilp(mblk_t);
/* reuse M_IOCDATA to copyin data */
bp->b_datap->db_type = M_COPYIN;
cq = (struct copyreq *)bp->b_rptr;
cq->cq_size = stp->st_data.buflen;
cq->cq_addr = stp->st_data.bufaddr;
cq->cq_flag = 0;
stp->st_state = GETINDATA; /* next state */
qreply(q, bp);
break;
case GETINDATA: /* data successfully copied in */
/* process input */
...
...
/* return output */
bp->b_datap->db_type = M_COPYOUT;
cq = (struct copyreq *)bp->b_rptr;
cq->cq_size = stp->st_data.buflen;
cq->cq_addr = stp->st_data.bufaddr;
cq->cq_flag = 0;
stp->st_state = PUTOUTDATA; /* next state */
qreply(q, bp);
break;
case PUTOUTDATA:
freemsg(csp->cp_private); /* state structure */
csp->cp_private = nilp(mblk_t);
bp->b_datap->db_type = M_IOCACK;
iocbp->ioc_error = 0; /* may have been overwritten */
iocbp->ioc_count = 0; /* may have been overwritten */
iocbp->ioc_rval = 0; /* may have been overwritten */
qreply(q, bp);
break;
default:
/* Unknown state: This can't happen but in case */
freemsg(bp->b_cont);
bp->b_cont = nilp(mblk_t);
bp->b_datap->db_type = M_IOCNAK;
iocbp->ioc_error = EINVAL;
qreply(q, bp);
break;