1/* $Id: ioc.c,v 1.3 2005-04-28 20:50:07 bfernhomberg Exp $ 2 */ 3 4#ifdef HAVE_CONFIG_H 5#include "config.h" 6#endif /* HAVE_CONFIG_H */ 7 8#include <sys/types.h> 9#include <sys/stream.h> 10#include <sys/cmn_err.h> 11 12#ifdef STDC_HEADERS 13#include <strings.h> 14#else 15#include <string.h> 16#endif 17 18#include "ioc.h" 19 20 void 21ioc_ok_ack( queue_t *q, mblk_t *m, int rval ) 22{ 23 struct iocblk *ioc; 24 mblk_t *m0; 25 26 if (( m0 = unlinkb( m )) != NULL ) { 27 freemsg( m0 ); 28 } 29 30 if ( m->b_wptr - m->b_rptr < sizeof( struct iocblk )) { 31 cmn_err( CE_CONT, "ioc_ok_ack too small\n" ); 32 freemsg( m ); 33 return; 34 } 35 m->b_datap->db_type = M_IOCACK; 36 m->b_wptr = m->b_rptr + sizeof( struct iocblk ); 37 ioc = (struct iocblk *)m->b_rptr; 38 ioc->ioc_error = 0; 39 ioc->ioc_count = 0; 40 ioc->ioc_rval = rval; 41 qreply( q, m ); 42 return; 43} 44 45 void 46ioc_error_ack( queue_t *q, mblk_t *m, int errno ) 47{ 48 struct iocblk *ioc; 49 mblk_t *m0; 50 51 if (( m0 = unlinkb( m )) != NULL ) { 52 freemsg( m0 ); 53 } 54 55 if ( m->b_wptr - m->b_rptr < sizeof( struct iocblk )) { 56 cmn_err( CE_CONT, "ioc_error_ack too small\n" ); 57 freemsg( m ); 58 return; 59 } 60 m->b_datap->db_type = M_IOCNAK; 61 m->b_wptr = m->b_rptr + sizeof( struct iocblk ); 62 ioc = (struct iocblk *)m->b_rptr; 63 ioc->ioc_error = errno; 64 ioc->ioc_count = 0; 65 ioc->ioc_rval = -1; 66 qreply( q, m ); 67 return; 68} 69 70 void 71ioc_copyin( queue_t *q, mblk_t *m, mblk_t *private, caddr_t addr, uint size ) 72{ 73 struct copyreq *cq; 74 mblk_t *m0; 75 76 if (( m0 = unlinkb( m )) != NULL ) { 77 freemsg( m0 ); 78 } 79 80#ifdef notdef 81 /* supposedly this will fit anyway */ 82 if ( m->b_wptr - m->b_rptr < sizeof( struct copyreq )) { 83 cmn_err( CE_CONT, "ioc_copyin too small\n" ); 84 freemsg( m ); 85 return; 86 } 87#endif /* notdef */ 88 m->b_datap->db_type = M_COPYIN; 89 m->b_wptr = m->b_rptr + sizeof( struct copyreq ); 90 cq = (struct copyreq *)m->b_rptr; 91 cq->cq_addr = addr; 92 cq->cq_size = size; 93 cq->cq_flag = 0; 94 cq->cq_private = private; 95 qreply( q, m ); 96 return; 97} 98 99 void 100ioc_copyout( queue_t *q, mblk_t *m, mblk_t *private, caddr_t data, 101 caddr_t addr, uint size ) 102{ 103 struct copyreq *cq; 104 mblk_t *m0; 105 106 if (( m0 = unlinkb( m )) != NULL ) { 107 freemsg( m0 ); 108 } 109 110#ifdef notdef 111 /* supposedly this will fit anyway */ 112 if ( m->b_wptr - m->b_rptr < sizeof( struct copyreq )) { 113 cmn_err( CE_CONT, "ioc_copyout too small\n" ); 114 freemsg( m ); 115 return; 116 } 117#endif /* notdef */ 118 if (( m0 = allocb( size, BPRI_MED )) == NULL ) { 119 cmn_err( CE_CONT, "ioc_copyout nomem\n" ); 120 freemsg( m ); 121 return; 122 } 123 m0->b_wptr = m0->b_rptr + size; 124 bcopy( data, m0->b_rptr, size ); 125 linkb( m, m0 ); 126 127 m->b_datap->db_type = M_COPYOUT; 128 m->b_wptr = m->b_rptr + sizeof( struct copyreq ); 129 cq = (struct copyreq *)m->b_rptr; 130 cq->cq_addr = addr; 131 cq->cq_size = size; 132 cq->cq_flag = 0; 133 cq->cq_private = private; 134 135 qreply( q, m ); 136 return; 137} 138