smbrap2client.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include "headers.h"
  2. static SmbTransactionMethod smbtransactionmethodrap = {
  3. .encodeprimary = smbtransactionencodeprimary,
  4. .sendrequest = smbtransactionclientsend,
  5. .receiveresponse = smbtransactionclientreceive,
  6. .decoderesponse = smbtransactiondecoderesponse,
  7. };
  8. int
  9. smbclientrap(SmbClient *c, SmbBuffer *inparam, SmbBuffer *outparam, SmbBuffer *outdata, char **errmsgp)
  10. {
  11. SmbTransaction transaction;
  12. SmbHeader h;
  13. memset(&transaction, 0, sizeof(transaction));
  14. transaction.in.name = smbglobals.pipelanman;
  15. transaction.in.parameters = smbbufferreadpointer(inparam);
  16. transaction.in.tpcount = smbbufferreadspace(inparam);
  17. transaction.in.maxpcount = smbbufferwritespace(outparam);
  18. transaction.in.maxdcount = smbbufferwritespace(outdata);
  19. transaction.out.parameters = outparam;
  20. transaction.out.data = outdata;
  21. h = c->protoh;
  22. h.tid = c->ipctid;
  23. h.mid = 0;
  24. return smbtransactionexecute(&transaction, &h, &c->peerinfo, c->b, &smbtransactionmethodrap, c, nil, errmsgp);
  25. }
  26. int
  27. smbnetserverenum2(SmbClient *c, ulong stype, char *domain, int *entriesp, SmbRapServerInfo1 **sip, char **errmsgp)
  28. {
  29. int rv;
  30. ushort ec, entries, total, converter;
  31. SmbRapServerInfo1 *si = nil;
  32. SmbBuffer *ipb = smbbuffernew(512);
  33. SmbBuffer *odb = smbbuffernew(65535);
  34. SmbBuffer *opb = smbbuffernew(8);
  35. smbbufferputs(ipb, 104);
  36. smbbufferputstring(ipb, nil, SMB_STRING_ASCII, "WrLehDz");
  37. smbbufferputstring(ipb, nil, SMB_STRING_ASCII, "B16BBDz");
  38. smbbufferputs(ipb, 1);
  39. smbbufferputs(ipb, smbbufferwritespace(odb));
  40. smbbufferputl(ipb, stype);
  41. smbbufferputstring(ipb, nil, SMB_STRING_ASCII, domain);
  42. rv = !smbclientrap(c, ipb, opb, odb, errmsgp);
  43. smbbufferfree(&ipb);
  44. if (rv == 0) {
  45. char *remark, *eremark;
  46. int remarkspace;
  47. int i;
  48. if (!smbbuffergets(opb, &ec)
  49. || !smbbuffergets(opb, &converter)
  50. || !smbbuffergets(opb, &entries)
  51. || !smbbuffergets(opb, &total)) {
  52. smbstringprint(errmsgp, "smbnetserverenum2: not enough return parameters");
  53. rv = -1;
  54. goto done;
  55. }
  56. if (ec != 0) {
  57. rv = ec;
  58. goto done;
  59. }
  60. if (smbbufferreadspace(odb) < entries * 26) {
  61. smbstringprint(errmsgp, "smbnetserverenum2: not enough return data");
  62. rv = -1;
  63. goto done;
  64. }
  65. remarkspace = smbbufferreadspace(odb) - entries * 26;
  66. si = smbemalloc(entries * sizeof(SmbRapServerInfo1) + remarkspace);
  67. remark = (char *)&si[entries];
  68. eremark = remark + remarkspace;
  69. for (i = 0; i < entries; i++) {
  70. ulong offset;
  71. int remarklen;
  72. assert(smbbuffergetbytes(odb, si[i].name, 16));
  73. assert(smbbuffergetb(odb, &si[i].vmaj));
  74. assert(smbbuffergetb(odb, &si[i].vmin));
  75. assert(smbbuffergetl(odb, &si[i].type));
  76. assert(smbbuffergetl(odb, &offset));
  77. offset -= converter;
  78. if (!smbbufferoffsetcopystr(odb, offset, remark, eremark - remark, &remarklen)) {
  79. smbstringprint(errmsgp, "smbnetserverenum2: invalid string offset");
  80. rv = -1;
  81. goto done;
  82. }
  83. si[i].remark = remark;
  84. remark += remarklen;
  85. }
  86. *sip = si;
  87. si = nil;
  88. *entriesp = entries;
  89. }
  90. else
  91. rv = -1;
  92. done:
  93. free(si);
  94. smbbufferfree(&opb);
  95. smbbufferfree(&odb);
  96. return rv;
  97. }