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