1 02846514 2006-05-05 devnull #include <u.h>
2 02846514 2006-05-05 devnull #include <libc.h>
3 02846514 2006-05-05 devnull #include <venti.h>
4 02846514 2006-05-05 devnull #include <libsec.h>
6 02846514 2006-05-05 devnull #define MAGIC 0x54798314
7 02846514 2006-05-05 devnull #define NOTFREE(p) assert((p)->magic == MAGIC)
9 02846514 2006-05-05 devnull struct Packet
11 02846514 2006-05-05 devnull char *data;
13 02846514 2006-05-05 devnull void (*free)(void*);
14 02846514 2006-05-05 devnull void *arg;
15 02846514 2006-05-05 devnull int magic;
19 02846514 2006-05-05 devnull packetalloc(void)
21 02846514 2006-05-05 devnull Packet *p;
23 02846514 2006-05-05 devnull p = vtmallocz(sizeof *p);
24 02846514 2006-05-05 devnull p->free = vtfree;
25 02846514 2006-05-05 devnull p->arg = nil;
26 02846514 2006-05-05 devnull p->magic = MAGIC;
27 02846514 2006-05-05 devnull return p;
31 02846514 2006-05-05 devnull packetappend(Packet *p, uchar *buf, int n)
33 02846514 2006-05-05 devnull NOTFREE(p);
34 02846514 2006-05-05 devnull if(n < 0)
36 02846514 2006-05-05 devnull if(p->free != vtfree)
37 02846514 2006-05-05 devnull sysfatal("packetappend");
38 02846514 2006-05-05 devnull p->data = vtrealloc(p->data, p->len+n);
39 02846514 2006-05-05 devnull p->arg = p->data;
40 02846514 2006-05-05 devnull memmove(p->data+p->len, buf, n);
41 02846514 2006-05-05 devnull p->len += n;
45 02846514 2006-05-05 devnull packetasize(Packet *p)
47 02846514 2006-05-05 devnull NOTFREE(p);
48 02846514 2006-05-05 devnull return p->len;
52 02846514 2006-05-05 devnull packetcmp(Packet *p, Packet *q)
54 02846514 2006-05-05 devnull int i, len;
56 02846514 2006-05-05 devnull NOTFREE(p);
57 02846514 2006-05-05 devnull NOTFREE(q);
58 02846514 2006-05-05 devnull len = p->len;
59 02846514 2006-05-05 devnull if(len > q->len)
60 02846514 2006-05-05 devnull len = q->len;
61 02846514 2006-05-05 devnull if(len && (i=memcmp(p->data, q->data, len)) != 0)
62 02846514 2006-05-05 devnull return i;
63 02846514 2006-05-05 devnull if(p->len > len)
64 02846514 2006-05-05 devnull return 1;
65 02846514 2006-05-05 devnull if(q->len > len)
66 02846514 2006-05-05 devnull return -1;
67 02846514 2006-05-05 devnull return 0;
71 02846514 2006-05-05 devnull packetconcat(Packet *p, Packet *q)
73 02846514 2006-05-05 devnull NOTFREE(p);
74 02846514 2006-05-05 devnull NOTFREE(q);
75 02846514 2006-05-05 devnull packetappend(p, q->data, q->len);
76 02846514 2006-05-05 devnull if(q->free == vtfree)
77 02846514 2006-05-05 devnull memset(q->data, 0xFE, q->len);
78 02846514 2006-05-05 devnull q->free(q->arg);
79 02846514 2006-05-05 devnull q->data = nil;
80 02846514 2006-05-05 devnull q->len = 0;
84 02846514 2006-05-05 devnull packetconsume(Packet *p, uchar *buf, int n)
86 02846514 2006-05-05 devnull NOTFREE(p);
87 02846514 2006-05-05 devnull if(n < 0)
89 02846514 2006-05-05 devnull if(p->len < n)
91 02846514 2006-05-05 devnull memmove(buf, p->data, n);
92 02846514 2006-05-05 devnull p->len -= n;
93 02846514 2006-05-05 devnull memmove(p->data, p->data+n, p->len);
94 02846514 2006-05-05 devnull return 0;
98 02846514 2006-05-05 devnull packetcopy(Packet *p, uchar *buf, int offset, int n)
100 02846514 2006-05-05 devnull NOTFREE(p);
101 02846514 2006-05-05 devnull if(offset < 0 || n < 0)
102 02846514 2006-05-05 devnull abort();
103 02846514 2006-05-05 devnull if(offset > p->len)
104 02846514 2006-05-05 devnull abort();
105 02846514 2006-05-05 devnull if(offset+n > p->len)
106 02846514 2006-05-05 devnull n = p->len - offset;
107 02846514 2006-05-05 devnull memmove(buf, p->data+offset, n);
108 02846514 2006-05-05 devnull return 0;
112 02846514 2006-05-05 devnull packetdup(Packet *p, int offset, int n)
114 02846514 2006-05-05 devnull Packet *q;
116 02846514 2006-05-05 devnull NOTFREE(p);
117 02846514 2006-05-05 devnull if(offset < 0 || n < 0)
118 02846514 2006-05-05 devnull abort();
119 02846514 2006-05-05 devnull if(offset > p->len)
120 02846514 2006-05-05 devnull abort();
121 02846514 2006-05-05 devnull if(offset+n > p->len)
122 02846514 2006-05-05 devnull n = p->len - offset;
123 02846514 2006-05-05 devnull q = packetalloc();
124 02846514 2006-05-05 devnull packetappend(q, p->data+offset, n);
125 02846514 2006-05-05 devnull return q;
129 02846514 2006-05-05 devnull packetforeign(uchar *buf, int n, void (*free)(void*), void *a)
131 02846514 2006-05-05 devnull Packet *p;
133 02846514 2006-05-05 devnull if(n < 0)
134 02846514 2006-05-05 devnull abort();
135 02846514 2006-05-05 devnull p = packetalloc();
136 02846514 2006-05-05 devnull p->data = (char*)buf;
137 02846514 2006-05-05 devnull p->len = n;
138 02846514 2006-05-05 devnull p->free = free;
139 02846514 2006-05-05 devnull p->arg = a;
140 02846514 2006-05-05 devnull return p;
144 02846514 2006-05-05 devnull packetfragments(Packet *p, IOchunk *io, int nio, int offset)
146 02846514 2006-05-05 devnull NOTFREE(p);
147 02846514 2006-05-05 devnull if(offset < 0)
148 02846514 2006-05-05 devnull abort();
149 02846514 2006-05-05 devnull if(nio == 0)
150 02846514 2006-05-05 devnull return 0;
151 02846514 2006-05-05 devnull memset(io, 0, sizeof(io[0])*nio);
152 02846514 2006-05-05 devnull if(offset >= p->len)
153 02846514 2006-05-05 devnull return 0;
154 02846514 2006-05-05 devnull io[0].addr = p->data + offset;
155 02846514 2006-05-05 devnull io[0].len = p->len - offset;
156 02846514 2006-05-05 devnull return p->len;
160 02846514 2006-05-05 devnull packetfree(Packet *p)
162 02846514 2006-05-05 devnull NOTFREE(p);
163 02846514 2006-05-05 devnull if(p->free == free)
164 02846514 2006-05-05 devnull memset(p->data, 0xFE, p->len);
165 02846514 2006-05-05 devnull p->free(p->arg);
166 02846514 2006-05-05 devnull p->data = nil;
167 02846514 2006-05-05 devnull p->len = 0;
168 02846514 2006-05-05 devnull memset(p, 0xFB, sizeof *p);
169 02846514 2006-05-05 devnull free(p);
173 02846514 2006-05-05 devnull packetheader(Packet *p, int n)
175 02846514 2006-05-05 devnull NOTFREE(p);
176 02846514 2006-05-05 devnull if(n < 0)
177 02846514 2006-05-05 devnull abort();
178 02846514 2006-05-05 devnull if(n > p->len)
179 02846514 2006-05-05 devnull abort();
180 02846514 2006-05-05 devnull return p->data;
184 02846514 2006-05-05 devnull packetpeek(Packet *p, uchar *buf, int offset, int n)
186 02846514 2006-05-05 devnull NOTFREE(p);
187 02846514 2006-05-05 devnull if(offset < 0 || n < 0)
188 02846514 2006-05-05 devnull abort();
189 02846514 2006-05-05 devnull if(offset+n > p->len)
190 02846514 2006-05-05 devnull abort();
191 02846514 2006-05-05 devnull return p->data+offset;
195 02846514 2006-05-05 devnull packetprefix(Packet *p, uchar *buf, int n)
197 02846514 2006-05-05 devnull NOTFREE(p);
198 02846514 2006-05-05 devnull if(n < 0)
199 02846514 2006-05-05 devnull abort();
200 02846514 2006-05-05 devnull if(p->free != free)
201 02846514 2006-05-05 devnull sysfatal("packetappend");
202 02846514 2006-05-05 devnull p->data = vtrealloc(p->data, p->len+n);
203 02846514 2006-05-05 devnull p->arg = p->data;
204 02846514 2006-05-05 devnull memmove(p->data+n, p->data, p->len);
205 02846514 2006-05-05 devnull memmove(p->data, buf, n);
206 02846514 2006-05-05 devnull p->len += n;
210 02846514 2006-05-05 devnull packetsha1(Packet *p, uchar d[20])
212 02846514 2006-05-05 devnull NOTFREE(p);
213 02846514 2006-05-05 devnull sha1((uchar*)p->data, p->len, d, nil);
217 02846514 2006-05-05 devnull packetsize(Packet *p)
219 02846514 2006-05-05 devnull NOTFREE(p);
220 02846514 2006-05-05 devnull return p->len;
224 02846514 2006-05-05 devnull packetsplit(Packet *p, int n)
226 02846514 2006-05-05 devnull Packet *q;
228 02846514 2006-05-05 devnull NOTFREE(p);
229 02846514 2006-05-05 devnull q = packetalloc();
230 02846514 2006-05-05 devnull q->data = vtmalloc(n);
231 02846514 2006-05-05 devnull q->arg = q->data;
232 02846514 2006-05-05 devnull q->free = vtfree;
233 02846514 2006-05-05 devnull packetconsume(p, q->data, n);
234 02846514 2006-05-05 devnull return q;
238 02846514 2006-05-05 devnull packetstats(void)
243 02846514 2006-05-05 devnull packettrailer(Packet *p, int n)
245 02846514 2006-05-05 devnull NOTFREE(p);
246 02846514 2006-05-05 devnull if(n < 0)
247 02846514 2006-05-05 devnull abort();
248 02846514 2006-05-05 devnull if(n > p->len)
249 02846514 2006-05-05 devnull abort();
250 02846514 2006-05-05 devnull return p->data + p->len - n;
254 02846514 2006-05-05 devnull packettrim(Packet *p, int offset, int n)
256 02846514 2006-05-05 devnull NOTFREE(p);
257 02846514 2006-05-05 devnull if(offset < 0 || n < 0)
258 02846514 2006-05-05 devnull abort();
259 02846514 2006-05-05 devnull if(offset+n > p->len)
260 02846514 2006-05-05 devnull abort();
261 02846514 2006-05-05 devnull memmove(p->data+offset, p->data+offset+n, p->len-offset-n);
262 02846514 2006-05-05 devnull p->len -= n;
263 02846514 2006-05-05 devnull return 0;