dump.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <ip.h>
  4. #include <thread.h>
  5. #include "netbios.h"
  6. static char *
  7. opname(int opcode)
  8. {
  9. switch (opcode) {
  10. case NbnsOpQuery: return "query";
  11. case NbnsOpRegistration: return "registration";
  12. case NbnsOpRelease: return "release";
  13. case NbnsOpWack: return "wack";
  14. case NbnsOpRefresh: return "refresh";
  15. default:
  16. return "???";
  17. }
  18. }
  19. void
  20. nbnsdumpname(NbName name)
  21. {
  22. int x;
  23. for (x = 0; x < NbNameLen - 1; x++) {
  24. if (name[x] == ' ')
  25. break;
  26. print("%c", tolower(name[x]));
  27. }
  28. print("\\x%.2ux", name[NbNameLen - 1]);
  29. }
  30. void
  31. nbnsdumpmessagequestion(NbnsMessageQuestion *q)
  32. {
  33. print("question: ");
  34. nbnsdumpname(q->name);
  35. switch (q->type) {
  36. case NbnsQuestionTypeNb: print(" NB"); break;
  37. case NbnsQuestionTypeNbStat: print(" NBSTAT"); break;
  38. default: print(" ???");
  39. }
  40. switch (q->class) {
  41. case NbnsQuestionClassIn: print(" IN"); break;
  42. default: print(" ???");
  43. }
  44. print("\n");
  45. }
  46. void
  47. nbnsdumpmessageresource(NbnsMessageResource *r, char *name)
  48. {
  49. print("%s: ", name);
  50. nbnsdumpname(r->name);
  51. switch (r->type) {
  52. case NbnsResourceTypeA: print(" A"); break;
  53. case NbnsResourceTypeNs: print(" NS"); break;
  54. case NbnsResourceTypeNull: print(" NULL"); break;
  55. case NbnsResourceTypeNb: print(" NB"); break;
  56. case NbnsResourceTypeNbStat: print(" NBSTAT"); break;
  57. default: print(" ???");
  58. }
  59. switch (r->class) {
  60. case NbnsResourceClassIn: print(" IN"); break;
  61. default: print(" ???");
  62. }
  63. print(" ttl: %lud", r->ttl);
  64. if (r->rdlength) {
  65. int i;
  66. print(" rdata: ");
  67. for (i = 0; i < r->rdlength; i++)
  68. print("%.2ux", r->rdata[i]);
  69. }
  70. print("\n");
  71. }
  72. void
  73. nbnsdumpmessage(NbnsMessage *s)
  74. {
  75. NbnsMessageQuestion *q;
  76. NbnsMessageResource *r;
  77. print("0x%.4ux %s %s (%d)",
  78. s->id, opname(s->opcode), s->response ? "response" : "request", s->opcode);
  79. if (s->broadcast)
  80. print(" B");
  81. if (s->recursionavailable)
  82. print(" RA");
  83. if (s->recursiondesired)
  84. print(" RD");
  85. if (s->truncation)
  86. print(" TC");
  87. if (s->authoritativeanswer)
  88. print(" AA");
  89. if (s->response)
  90. print(" rcode %d", s->rcode);
  91. print("\n");
  92. for (q = s->q; q; q = q->next)
  93. nbnsdumpmessagequestion(q);
  94. for (r = s->an; r; r = r->next)
  95. nbnsdumpmessageresource(r, "answer");
  96. for (r = s->ns; r; r = r->next)
  97. nbnsdumpmessageresource(r, "ns");
  98. for (r = s->ar; r; r = r->next)
  99. nbnsdumpmessageresource(r, "additional");
  100. }
  101. void
  102. nbdumpdata(void *ap, long n)
  103. {
  104. uchar *p = ap;
  105. long i;
  106. i = 0;
  107. while (i < n) {
  108. int l = n - i < 16 ? n - i : 16;
  109. int b;
  110. print("0x%.4lux ", i);
  111. for (b = 0; b < l; b += 2) {
  112. print(" %.2ux", p[i + b]);
  113. if (b < l - 1)
  114. print("%.2ux", p[i + b + 1]);
  115. else
  116. print(" ");
  117. }
  118. while (b < 16) {
  119. print(" ");
  120. b++;
  121. }
  122. print(" ");
  123. for (b = 0; b < l; b++)
  124. if (p[i + b] >= ' ' && p[i + b] <= '~')
  125. print("%c", p[i + b]);
  126. else
  127. print(".");
  128. print("\n");
  129. i += l;
  130. }
  131. }