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