debugpacket.c 3.7 KB

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