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