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 }