testnbdgram.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include "headers.h"
  2. static int
  3. deliver(void *, NbDgram *s)
  4. {
  5. SmbHeader h;
  6. uchar *pdata;
  7. ushort bytecount;
  8. SmbBuffer *b;
  9. char *errmsg;
  10. SmbTransaction transaction;
  11. int rv;
  12. // int x;
  13. char *comment, *servername;
  14. unsigned char opcode, updatecount, versionminor, versionmajor;
  15. ulong periodicity, signature, type;
  16. errmsg = nil;
  17. comment = nil;
  18. servername = nil;
  19. // nbdumpdata(s->datagram.data, s->datagram.length);
  20. b = smbbufferinit(s->datagram.data, s->datagram.data, s->datagram.length);
  21. if (!smbbuffergetandcheckheader(b, &h, SMB_COM_TRANSACTION, 0, &pdata, &bytecount, &errmsg)) {
  22. print("ignored: %s\n", errmsg);
  23. goto done;
  24. }
  25. memset(&transaction, 0, sizeof(transaction));
  26. rv = smbtransactiondecodeprimary(&transaction, &h, pdata, b, &errmsg);
  27. if (rv < 0) {
  28. print("transaction decode fail: %s\n", errmsg);
  29. goto done;
  30. }
  31. if (rv == 0) {
  32. print("transaction too big\n");
  33. goto done;
  34. }
  35. /*
  36. print("name: %s\n", transaction.in.name);
  37. print("setup:");
  38. for (x = 0; x < transaction.in.scount; x++)
  39. print(" 0x%.4ux", transaction.in.setup[x]);
  40. print("\n");
  41. print("parameters:\n");
  42. nbdumpdata(transaction.in.parameters, transaction.in.tpcount);
  43. print("data:\n");
  44. nbdumpdata(transaction.in.data, transaction.in.tdcount);
  45. */
  46. if (strcmp(transaction.in.name, "\\MAILSLOT\\BROWSE") != 0) {
  47. print("not a supported mailslot\n");
  48. goto done;
  49. }
  50. if (!smbbuffergetb(b, &opcode)) {
  51. print("not enough data for opcode\n");
  52. goto done;
  53. }
  54. if (opcode != 1) {
  55. print("not a supported mailslot opcode %d\n", opcode);
  56. goto done;
  57. }
  58. if (!smbbuffergetb(b, &updatecount)
  59. || !smbbuffergetl(b, &periodicity)
  60. || !smbbuffergetstrn(b, 16, &servername)
  61. || !smbbuffergetb(b, &versionmajor)
  62. || !smbbuffergetb(b, &versionminor)
  63. || !smbbuffergetl(b, &type)
  64. || !smbbuffergetl(b, &signature)
  65. || !smbbuffergetstr(b, &comment)) {
  66. print("mailslot parse failed\n");
  67. goto done;
  68. }
  69. /*
  70. * not advisable to check this! Netgear printservers send 0x55aa
  71. if ((signature & 0xffff0000) != 0xaa550000) {
  72. print("wrong signature\n");
  73. goto done;
  74. }
  75. */
  76. print("%s: period %ludms version %d.%d type 0x%.8lux browserversion %d.%d comment %s\n",
  77. servername, periodicity, versionmajor, versionminor, type, (signature >> 8) & 0xff, signature & 0xff, comment);
  78. done:
  79. free(errmsg);
  80. free(comment);
  81. free(servername);
  82. smbtransactionfree(&transaction);
  83. smbbufferfree(&b);
  84. return 1;
  85. }
  86. void
  87. threadmain(int, char **)
  88. {
  89. char *e;
  90. NbDgramSendParameters p;
  91. nbinit();
  92. smbglobalsguess(1);
  93. nbmknamefromstringandtype(p.to, smbglobals.primarydomain, 0x1d);
  94. e = nbdgramlisten(p.to, deliver, nil);
  95. if (e) {
  96. print("listen failed: %s\n", e);
  97. threadexitsall("net");
  98. }
  99. p.type = NbDgramDirectUnique;
  100. for (;;) {
  101. if (!smbbrowsesendhostannouncement(smbglobals.serverinfo.name, 3 * 60 * 1000,
  102. SV_TYPE_SERVER,
  103. "Testing testing", &e)) {
  104. print("hostannounce failed: %s\n", e);
  105. }
  106. sleep(60 * 1000);
  107. }
  108. }