1381a2a9aSdr146992 /*
2381a2a9aSdr146992 * Copyright (C) 2003 by Darren Reed.
3381a2a9aSdr146992 *
4381a2a9aSdr146992 * See the IPFILTER.LICENCE file for details on licencing.
5381a2a9aSdr146992 */
6381a2a9aSdr146992 /*
7381a2a9aSdr146992 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
8381a2a9aSdr146992 * Use is subject to license terms.
9381a2a9aSdr146992 */
10*2d6eb4a5SToomas Soome #ifdef __hpux
11381a2a9aSdr146992 struct uio;
12381a2a9aSdr146992 #endif
13381a2a9aSdr146992
14381a2a9aSdr146992 #include <sys/systm.h>
15381a2a9aSdr146992 #include <sys/types.h>
16381a2a9aSdr146992 #include <sys/stream.h>
17381a2a9aSdr146992 #include <sys/ddi.h>
18381a2a9aSdr146992
19381a2a9aSdr146992 #ifdef __hpux
20381a2a9aSdr146992 # define BCOPY(a,b,c) bcopy((caddr_t)a, (caddr_t)b, c)
21381a2a9aSdr146992 #endif
22381a2a9aSdr146992 #ifdef sun
23381a2a9aSdr146992 # define BCOPY(a,b,c) bcopy((char *)a, (char *)b, c)
24381a2a9aSdr146992 #endif
25381a2a9aSdr146992
mb_copydata(min,off,len,buf)26381a2a9aSdr146992 void mb_copydata(min, off, len, buf)
27381a2a9aSdr146992 mblk_t *min;
28381a2a9aSdr146992 size_t off, len;
29381a2a9aSdr146992 char *buf;
30381a2a9aSdr146992 {
31381a2a9aSdr146992 u_char *s, *bp = (u_char *)buf;
32381a2a9aSdr146992 size_t mlen, olen, clen;
33381a2a9aSdr146992 mblk_t *m;
34381a2a9aSdr146992
35381a2a9aSdr146992 for (m = min; (m != NULL) && (len > 0); m = m->b_cont) {
36381a2a9aSdr146992 if (m->b_datap->db_type != M_DATA)
37381a2a9aSdr146992 continue;
38381a2a9aSdr146992 s = m->b_rptr;
39381a2a9aSdr146992 mlen = m->b_wptr - s;
40381a2a9aSdr146992 olen = min(off, mlen);
41381a2a9aSdr146992 if ((olen == mlen) || (olen < off)) {
42381a2a9aSdr146992 off -= olen;
43381a2a9aSdr146992 continue;
44381a2a9aSdr146992 } else if (olen) {
45381a2a9aSdr146992 off -= olen;
46381a2a9aSdr146992 s += olen;
47381a2a9aSdr146992 mlen -= olen;
48381a2a9aSdr146992 }
49381a2a9aSdr146992 clen = min(mlen, len);
50381a2a9aSdr146992 BCOPY(s, bp, clen);
51381a2a9aSdr146992 len -= clen;
52381a2a9aSdr146992 bp += clen;
53381a2a9aSdr146992 }
54381a2a9aSdr146992 }
55381a2a9aSdr146992
56381a2a9aSdr146992
mb_copyback(min,off,len,buf)57381a2a9aSdr146992 void mb_copyback(min, off, len, buf)
58381a2a9aSdr146992 mblk_t *min;
59381a2a9aSdr146992 size_t off, len;
60381a2a9aSdr146992 char *buf;
61381a2a9aSdr146992 {
62381a2a9aSdr146992 u_char *s, *bp = (u_char *)buf;
63381a2a9aSdr146992 size_t mlen, olen, clen;
64381a2a9aSdr146992 mblk_t *m, *mp;
65381a2a9aSdr146992
66381a2a9aSdr146992 for (m = min, mp = NULL; (m != NULL) && (len > 0); m = m->b_cont) {
67381a2a9aSdr146992 mp = m;
68381a2a9aSdr146992 if (m->b_datap->db_type != M_DATA)
69381a2a9aSdr146992 continue;
70381a2a9aSdr146992
71381a2a9aSdr146992 s = m->b_rptr;
72381a2a9aSdr146992 mlen = m->b_wptr - s;
73381a2a9aSdr146992 olen = min(off, mlen);
74381a2a9aSdr146992 if ((olen == mlen) || (olen < off)) {
75381a2a9aSdr146992 off -= olen;
76381a2a9aSdr146992 continue;
77381a2a9aSdr146992 } else if (olen) {
78381a2a9aSdr146992 off -= olen;
79381a2a9aSdr146992 s += olen;
80381a2a9aSdr146992 mlen -= olen;
81381a2a9aSdr146992 }
82381a2a9aSdr146992 clen = min(mlen, len);
83381a2a9aSdr146992 BCOPY(bp, s, clen);
84381a2a9aSdr146992 len -= clen;
85381a2a9aSdr146992 bp += clen;
86381a2a9aSdr146992 }
87381a2a9aSdr146992
88381a2a9aSdr146992 if ((m == NULL) && (mp != NULL)) {
89381a2a9aSdr146992 if (len > 0) {
90381a2a9aSdr146992 mlen = mp->b_datap->db_lim - mp->b_wptr;
91381a2a9aSdr146992 if (mlen > 0) {
92381a2a9aSdr146992 if (mlen > len)
93381a2a9aSdr146992 mlen = len;
94381a2a9aSdr146992 BCOPY(bp, mp->b_wptr, mlen);
95381a2a9aSdr146992 bp += mlen;
96381a2a9aSdr146992 len -= mlen;
97381a2a9aSdr146992 mp->b_wptr += mlen;
98381a2a9aSdr146992 #ifdef STRUIO_IP
99381a2a9aSdr146992 # if SOLARIS2 < 10
100381a2a9aSdr146992 mp->b_datap->db_struiolim = mp->b_wptr;
101381a2a9aSdr146992 # endif
102381a2a9aSdr146992 mp->b_datap->db_struioflag &= ~STRUIO_IP;
103381a2a9aSdr146992 #endif
104381a2a9aSdr146992 }
105381a2a9aSdr146992 }
106381a2a9aSdr146992
107381a2a9aSdr146992 if (len > 0) {
108381a2a9aSdr146992 m = allocb(len, BPRI_MED);
109381a2a9aSdr146992 if (m != NULL) {
110381a2a9aSdr146992 BCOPY(bp, m->b_wptr, len);
111381a2a9aSdr146992 m->b_band = mp->b_band;
112381a2a9aSdr146992 m->b_wptr += len;
113381a2a9aSdr146992 linkb(mp, m);
114381a2a9aSdr146992 }
115381a2a9aSdr146992 }
116381a2a9aSdr146992 }
117381a2a9aSdr146992 }
118