STREAMS-UX Programmer's Guide (February 2007)

Modules and Drivers
Entry Points
Chapter 4
78
/* Allocate state buffer */
if ((tmp = allocb(sizeof(struct state), BPRI_LO)) == NULL) {
bp->b_datap->db_type = M_IOCNAK;
iocbp->ioc_error = EAGAIN;
qreply(q, bp);
break;
}
tmp->b_wptr += sizeof(struct state);
stp = (struct state *)tmp->b_rptr;
stp->st_state = GETSTRUCT;
cq->cq_private = tmp;
cq->cq_size = sizeof(struct transparent_data);
cq->cq_flag = 0;
bp->b_datap->db_type = M_COPYIN;
bp->b_wptr = bp->b_rptr + sizeof(struct copyreq);
} else {
/* Send negative acknowledgement */
bp->b_datap->db_type = M_IOCNACK;
iocbp->ioc_error = EINVAL;
}
qreply(q, bp);
break;
default:
/* Unknown message, so pass to next component */
putnext(q, bp);
break;
}
case M_IOCDATA:
iocbp = (struct iocblk *)bp->b_rptr;
csp = (struct copyresp *)bp->b_rptr;
if (csp->cp_cmd == I_TRANSPARENT) {
if (csp->cp_rval) { /* GETSTRUCT failure */
if (csp->cp_private) /* state structure */
freemsg(csp->cp_private);
freemsg(bp);
break;
}
stp = (struct state *)csp->cp_private->b_rptr;
switch( stp->st_state ) {
case GETSTRUCT:
stp->st_data = *(struct transparent_data *)bp->b_cont->b_rptr;
freemsg(bp->b_cont);