xref: /illumos-gate/usr/src/uts/common/inet/ipf/misc.c (revision 2d6eb4a5)
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