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