1*381a2a9aSdr146992 /*
2*381a2a9aSdr146992 * Copyright (C) 2003 by Darren Reed.
3*381a2a9aSdr146992 *
4*381a2a9aSdr146992 * See the IPFILTER.LICENCE file for details on licencing.
5*381a2a9aSdr146992 */
6*381a2a9aSdr146992 /*
7*381a2a9aSdr146992 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
8*381a2a9aSdr146992 * Use is subject to license terms.
9*381a2a9aSdr146992 */
10*381a2a9aSdr146992 #ifndef __hpux
11*381a2a9aSdr146992 #pragma ident "@(#)$Id: misc.c,v 1.12 2003/11/29 07:11:03 darrenr Exp $"
12*381a2a9aSdr146992 #else
13*381a2a9aSdr146992 struct uio;
14*381a2a9aSdr146992 #endif
15*381a2a9aSdr146992
16*381a2a9aSdr146992 #pragma ident "%Z%%M% %I% %E% SMI"
17*381a2a9aSdr146992
18*381a2a9aSdr146992 #include <sys/systm.h>
19*381a2a9aSdr146992 #include <sys/types.h>
20*381a2a9aSdr146992 #include <sys/stream.h>
21*381a2a9aSdr146992 #include <sys/ddi.h>
22*381a2a9aSdr146992
23*381a2a9aSdr146992 #ifdef __hpux
24*381a2a9aSdr146992 # define BCOPY(a,b,c) bcopy((caddr_t)a, (caddr_t)b, c)
25*381a2a9aSdr146992 #endif
26*381a2a9aSdr146992 #ifdef sun
27*381a2a9aSdr146992 # define BCOPY(a,b,c) bcopy((char *)a, (char *)b, c)
28*381a2a9aSdr146992 #endif
29*381a2a9aSdr146992
mb_copydata(min,off,len,buf)30*381a2a9aSdr146992 void mb_copydata(min, off, len, buf)
31*381a2a9aSdr146992 mblk_t *min;
32*381a2a9aSdr146992 size_t off, len;
33*381a2a9aSdr146992 char *buf;
34*381a2a9aSdr146992 {
35*381a2a9aSdr146992 u_char *s, *bp = (u_char *)buf;
36*381a2a9aSdr146992 size_t mlen, olen, clen;
37*381a2a9aSdr146992 mblk_t *m;
38*381a2a9aSdr146992
39*381a2a9aSdr146992 for (m = min; (m != NULL) && (len > 0); m = m->b_cont) {
40*381a2a9aSdr146992 if (m->b_datap->db_type != M_DATA)
41*381a2a9aSdr146992 continue;
42*381a2a9aSdr146992 s = m->b_rptr;
43*381a2a9aSdr146992 mlen = m->b_wptr - s;
44*381a2a9aSdr146992 olen = min(off, mlen);
45*381a2a9aSdr146992 if ((olen == mlen) || (olen < off)) {
46*381a2a9aSdr146992 off -= olen;
47*381a2a9aSdr146992 continue;
48*381a2a9aSdr146992 } else if (olen) {
49*381a2a9aSdr146992 off -= olen;
50*381a2a9aSdr146992 s += olen;
51*381a2a9aSdr146992 mlen -= olen;
52*381a2a9aSdr146992 }
53*381a2a9aSdr146992 clen = min(mlen, len);
54*381a2a9aSdr146992 BCOPY(s, bp, clen);
55*381a2a9aSdr146992 len -= clen;
56*381a2a9aSdr146992 bp += clen;
57*381a2a9aSdr146992 }
58*381a2a9aSdr146992 }
59*381a2a9aSdr146992
60*381a2a9aSdr146992
mb_copyback(min,off,len,buf)61*381a2a9aSdr146992 void mb_copyback(min, off, len, buf)
62*381a2a9aSdr146992 mblk_t *min;
63*381a2a9aSdr146992 size_t off, len;
64*381a2a9aSdr146992 char *buf;
65*381a2a9aSdr146992 {
66*381a2a9aSdr146992 u_char *s, *bp = (u_char *)buf;
67*381a2a9aSdr146992 size_t mlen, olen, clen;
68*381a2a9aSdr146992 mblk_t *m, *mp;
69*381a2a9aSdr146992
70*381a2a9aSdr146992 for (m = min, mp = NULL; (m != NULL) && (len > 0); m = m->b_cont) {
71*381a2a9aSdr146992 mp = m;
72*381a2a9aSdr146992 if (m->b_datap->db_type != M_DATA)
73*381a2a9aSdr146992 continue;
74*381a2a9aSdr146992
75*381a2a9aSdr146992 s = m->b_rptr;
76*381a2a9aSdr146992 mlen = m->b_wptr - s;
77*381a2a9aSdr146992 olen = min(off, mlen);
78*381a2a9aSdr146992 if ((olen == mlen) || (olen < off)) {
79*381a2a9aSdr146992 off -= olen;
80*381a2a9aSdr146992 continue;
81*381a2a9aSdr146992 } else if (olen) {
82*381a2a9aSdr146992 off -= olen;
83*381a2a9aSdr146992 s += olen;
84*381a2a9aSdr146992 mlen -= olen;
85*381a2a9aSdr146992 }
86*381a2a9aSdr146992 clen = min(mlen, len);
87*381a2a9aSdr146992 BCOPY(bp, s, clen);
88*381a2a9aSdr146992 len -= clen;
89*381a2a9aSdr146992 bp += clen;
90*381a2a9aSdr146992 }
91*381a2a9aSdr146992
92*381a2a9aSdr146992 if ((m == NULL) && (mp != NULL)) {
93*381a2a9aSdr146992 if (len > 0) {
94*381a2a9aSdr146992 mlen = mp->b_datap->db_lim - mp->b_wptr;
95*381a2a9aSdr146992 if (mlen > 0) {
96*381a2a9aSdr146992 if (mlen > len)
97*381a2a9aSdr146992 mlen = len;
98*381a2a9aSdr146992 BCOPY(bp, mp->b_wptr, mlen);
99*381a2a9aSdr146992 bp += mlen;
100*381a2a9aSdr146992 len -= mlen;
101*381a2a9aSdr146992 mp->b_wptr += mlen;
102*381a2a9aSdr146992 #ifdef STRUIO_IP
103*381a2a9aSdr146992 # if SOLARIS2 < 10
104*381a2a9aSdr146992 mp->b_datap->db_struiolim = mp->b_wptr;
105*381a2a9aSdr146992 # endif
106*381a2a9aSdr146992 mp->b_datap->db_struioflag &= ~STRUIO_IP;
107*381a2a9aSdr146992 #endif
108*381a2a9aSdr146992 }
109*381a2a9aSdr146992 }
110*381a2a9aSdr146992
111*381a2a9aSdr146992 if (len > 0) {
112*381a2a9aSdr146992 m = allocb(len, BPRI_MED);
113*381a2a9aSdr146992 if (m != NULL) {
114*381a2a9aSdr146992 BCOPY(bp, m->b_wptr, len);
115*381a2a9aSdr146992 m->b_band = mp->b_band;
116*381a2a9aSdr146992 m->b_wptr += len;
117*381a2a9aSdr146992 linkb(mp, m);
118*381a2a9aSdr146992 }
119*381a2a9aSdr146992 }
120*381a2a9aSdr146992 }
121*381a2a9aSdr146992 }
122