]> arthur.barton.de Git - netatalk.git/blob - sys/solaris/ioc.c
84b1586167666c37dceeb2f8cabbfc8ba67edc68
[netatalk.git] / sys / solaris / ioc.c
1 /* $Id: ioc.c,v 1.2 2002-01-17 07:11:13 srittau 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
21 ioc_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
46 ioc_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
71 ioc_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
100 ioc_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 }