plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

debugpacket.c (3833B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <venti.h>
      4 #include <libsec.h>
      5 
      6 #define MAGIC 0x54798314
      7 #define NOTFREE(p)	assert((p)->magic == MAGIC)
      8 
      9 struct Packet
     10 {
     11 	char *data;
     12 	int len;
     13 	void (*free)(void*);
     14 	void *arg;
     15 	int magic;
     16 };
     17 
     18 Packet*
     19 packetalloc(void)
     20 {
     21 	Packet *p;
     22 
     23 	p = vtmallocz(sizeof *p);
     24 	p->free = vtfree;
     25 	p->arg = nil;
     26 	p->magic = MAGIC;
     27 	return p;
     28 }
     29 
     30 void
     31 packetappend(Packet *p, uchar *buf, int n)
     32 {
     33 	NOTFREE(p);
     34 	if(n < 0)
     35 		abort();
     36 	if(p->free != vtfree)
     37 		sysfatal("packetappend");
     38 	p->data = vtrealloc(p->data, p->len+n);
     39 	p->arg = p->data;
     40 	memmove(p->data+p->len, buf, n);
     41 	p->len += n;
     42 }
     43 
     44 uint
     45 packetasize(Packet *p)
     46 {
     47 	NOTFREE(p);
     48 	return p->len;
     49 }
     50 
     51 int
     52 packetcmp(Packet *p, Packet *q)
     53 {
     54 	int i, len;
     55 
     56 	NOTFREE(p);
     57 	NOTFREE(q);
     58 	len = p->len;
     59 	if(len > q->len)
     60 		len = q->len;
     61 	if(len && (i=memcmp(p->data, q->data, len)) != 0)
     62 		return i;
     63 	if(p->len > len)
     64 		return 1;
     65 	if(q->len > len)
     66 		return -1;
     67 	return 0;
     68 }
     69 
     70 void
     71 packetconcat(Packet *p, Packet *q)
     72 {
     73 	NOTFREE(p);
     74 	NOTFREE(q);
     75 	packetappend(p, q->data, q->len);
     76 	if(q->free == vtfree)
     77 		memset(q->data, 0xFE, q->len);
     78 	q->free(q->arg);
     79 	q->data = nil;
     80 	q->len = 0;
     81 }
     82 
     83 int
     84 packetconsume(Packet *p, uchar *buf, int n)
     85 {
     86 	NOTFREE(p);
     87 	if(n < 0)
     88 		abort();
     89 	if(p->len < n)
     90 		abort();
     91 	memmove(buf, p->data, n);
     92 	p->len -= n;
     93 	memmove(p->data, p->data+n, p->len);
     94 	return 0;
     95 }
     96 
     97 int
     98 packetcopy(Packet *p, uchar *buf, int offset, int n)
     99 {
    100 	NOTFREE(p);
    101 	if(offset < 0 || n < 0)
    102 		abort();
    103 	if(offset > p->len)
    104 		abort();
    105 	if(offset+n > p->len)
    106 		n = p->len - offset;
    107 	memmove(buf, p->data+offset, n);
    108 	return 0;
    109 }
    110 
    111 Packet*
    112 packetdup(Packet *p, int offset, int n)
    113 {
    114 	Packet *q;
    115 
    116 	NOTFREE(p);
    117 	if(offset < 0 || n < 0)
    118 		abort();
    119 	if(offset > p->len)
    120 		abort();
    121 	if(offset+n > p->len)
    122 		n = p->len - offset;
    123 	q = packetalloc();
    124 	packetappend(q, p->data+offset, n);
    125 	return q;
    126 }
    127 
    128 Packet*
    129 packetforeign(uchar *buf, int n, void (*free)(void*), void *a)
    130 {
    131 	Packet *p;
    132 
    133 	if(n < 0)
    134 		abort();
    135 	p = packetalloc();
    136 	p->data = (char*)buf;
    137 	p->len = n;
    138 	p->free = free;
    139 	p->arg = a;
    140 	return p;
    141 }
    142 
    143 int
    144 packetfragments(Packet *p, IOchunk *io, int nio, int offset)
    145 {
    146 	NOTFREE(p);
    147 	if(offset < 0)
    148 		abort();
    149 	if(nio == 0)
    150 		return 0;
    151 	memset(io, 0, sizeof(io[0])*nio);
    152 	if(offset >= p->len)
    153 		return 0;
    154 	io[0].addr = p->data + offset;
    155 	io[0].len = p->len - offset;
    156 	return p->len;
    157 }
    158 
    159 void
    160 packetfree(Packet *p)
    161 {
    162 	NOTFREE(p);
    163 	if(p->free == free)
    164 		memset(p->data, 0xFE, p->len);
    165 	p->free(p->arg);
    166 	p->data = nil;
    167 	p->len = 0;
    168 	memset(p, 0xFB, sizeof *p);
    169 	free(p);
    170 }
    171 
    172 uchar*
    173 packetheader(Packet *p, int n)
    174 {
    175 	NOTFREE(p);
    176 	if(n < 0)
    177 		abort();
    178 	if(n > p->len)
    179 		abort();
    180 	return p->data;
    181 }
    182 
    183 uchar*
    184 packetpeek(Packet *p, uchar *buf, int offset, int n)
    185 {
    186 	NOTFREE(p);
    187 	if(offset < 0 || n < 0)
    188 		abort();
    189 	if(offset+n > p->len)
    190 		abort();
    191 	return p->data+offset;
    192 }
    193 
    194 void
    195 packetprefix(Packet *p, uchar *buf, int n)
    196 {
    197 	NOTFREE(p);
    198 	if(n < 0)
    199 		abort();
    200 	if(p->free != free)
    201 		sysfatal("packetappend");
    202 	p->data = vtrealloc(p->data, p->len+n);
    203 	p->arg = p->data;
    204 	memmove(p->data+n, p->data, p->len);
    205 	memmove(p->data, buf, n);
    206 	p->len += n;
    207 }
    208 
    209 void
    210 packetsha1(Packet *p, uchar d[20])
    211 {
    212 	NOTFREE(p);
    213 	sha1((uchar*)p->data, p->len, d, nil);
    214 }
    215 
    216 uint
    217 packetsize(Packet *p)
    218 {
    219 	NOTFREE(p);
    220 	return p->len;
    221 }
    222 
    223 Packet*
    224 packetsplit(Packet *p, int n)
    225 {
    226 	Packet *q;
    227 
    228 	NOTFREE(p);
    229 	q = packetalloc();
    230 	q->data = vtmalloc(n);
    231 	q->arg = q->data;
    232 	q->free = vtfree;
    233 	packetconsume(p, q->data, n);
    234 	return q;
    235 }
    236 
    237 void
    238 packetstats(void)
    239 {
    240 }
    241 
    242 uchar*
    243 packettrailer(Packet *p, int n)
    244 {
    245 	NOTFREE(p);
    246 	if(n < 0)
    247 		abort();
    248 	if(n > p->len)
    249 		abort();
    250 	return p->data + p->len - n;
    251 }
    252 
    253 int
    254 packettrim(Packet *p, int offset, int n)
    255 {
    256 	NOTFREE(p);
    257 	if(offset < 0 || n < 0)
    258 		abort();
    259 	if(offset+n > p->len)
    260 		abort();
    261 	memmove(p->data+offset, p->data+offset+n, p->len-offset-n);
    262 	p->len -= n;
    263 	return 0;
    264 }