6 #define MAGIC 0x54798314
7 #define NOTFREE(p) assert((p)->magic == MAGIC)
23 p = vtmallocz(sizeof *p);
31 packetappend(Packet *p, uchar *buf, int n)
37 sysfatal("packetappend");
38 p->data = vtrealloc(p->data, p->len+n);
40 memmove(p->data+p->len, buf, n);
45 packetasize(Packet *p)
52 packetcmp(Packet *p, Packet *q)
61 if(len && (i=memcmp(p->data, q->data, len)) != 0)
71 packetconcat(Packet *p, Packet *q)
75 packetappend(p, q->data, q->len);
77 memset(q->data, 0xFE, q->len);
84 packetconsume(Packet *p, uchar *buf, int n)
91 memmove(buf, p->data, n);
93 memmove(p->data, p->data+n, p->len);
98 packetcopy(Packet *p, uchar *buf, int offset, int n)
101 if(offset < 0 || n < 0)
105 if(offset+n > p->len)
107 memmove(buf, p->data+offset, n);
112 packetdup(Packet *p, int offset, int n)
117 if(offset < 0 || n < 0)
121 if(offset+n > p->len)
124 packetappend(q, p->data+offset, n);
129 packetforeign(uchar *buf, int n, void (*free)(void*), void *a)
136 p->data = (char*)buf;
144 packetfragments(Packet *p, IOchunk *io, int nio, int offset)
151 memset(io, 0, sizeof(io[0])*nio);
154 io[0].addr = p->data + offset;
155 io[0].len = p->len - offset;
160 packetfree(Packet *p)
164 memset(p->data, 0xFE, p->len);
168 memset(p, 0xFB, sizeof *p);
173 packetheader(Packet *p, int n)
184 packetpeek(Packet *p, uchar *buf, int offset, int n)
187 if(offset < 0 || n < 0)
189 if(offset+n > p->len)
191 return p->data+offset;
195 packetprefix(Packet *p, uchar *buf, int n)
201 sysfatal("packetappend");
202 p->data = vtrealloc(p->data, p->len+n);
204 memmove(p->data+n, p->data, p->len);
205 memmove(p->data, buf, n);
210 packetsha1(Packet *p, uchar d[20])
213 sha1((uchar*)p->data, p->len, d, nil);
217 packetsize(Packet *p)
224 packetsplit(Packet *p, int n)
230 q->data = vtmalloc(n);
233 packetconsume(p, q->data, n);
243 packettrailer(Packet *p, int n)
250 return p->data + p->len - n;
254 packettrim(Packet *p, int offset, int n)
257 if(offset < 0 || n < 0)
259 if(offset+n > p->len)
261 memmove(p->data+offset, p->data+offset+n, p->len-offset-n);