smbclientopen.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #include "headers.h"
  2. int
  3. smbclientopen(SmbClient *c, ushort mode, char *name, uchar *errclassp, ushort *errorp,
  4. ushort *fidp, ushort *attrp, ulong *mtimep, ulong *sizep, ushort *accessallowedp, char **errmsgp)
  5. {
  6. SmbBuffer *b;
  7. SmbHeader h;
  8. ulong bytecountfixup;
  9. long n;
  10. uchar *pdata;
  11. ushort bytecount;
  12. b = smbbuffernew(65535);
  13. h = c->protoh;
  14. h.tid = c->sharetid;
  15. h.command = SMB_COM_OPEN;
  16. h.wordcount = 2;
  17. smbbufferputheader(b, &h, &c->peerinfo);
  18. smbbufferputs(b, mode);
  19. smbbufferputs(b, 0);
  20. bytecountfixup = smbbufferwriteoffset(b);
  21. smbbufferputs(b, 0);
  22. smbbufferputb(b, 4);
  23. smbbufferputstring(b, &c->peerinfo, SMB_STRING_REVPATH, name);
  24. smbbufferfixuprelatives(b, bytecountfixup);
  25. nbsswrite(c->nbss, smbbufferreadpointer(b), smbbufferwriteoffset(b));
  26. smbbufferreset(b);
  27. n = nbssread(c->nbss, smbbufferwritepointer(b), smbbufferwritespace(b));
  28. if (n < 0) {
  29. smbstringprint(errmsgp, "read error: %r");
  30. smbbufferfree(&b);
  31. return 0;
  32. }
  33. smbbuffersetreadlen(b, n);
  34. if (!smbbuffergetandcheckheader(b, &h, h.command, 7, &pdata, &bytecount, errmsgp)) {
  35. smbbufferfree(&b);
  36. return 0;
  37. }
  38. if (h.errclass) {
  39. *errclassp = h.errclass;
  40. *errorp = h.error;
  41. smbbufferfree(&b);
  42. return 0;
  43. }
  44. *fidp = smbnhgets(pdata); pdata += 2;
  45. *attrp = smbnhgets(pdata); pdata += 2;
  46. *mtimep = smbnhgetl(pdata); pdata += 4;
  47. *sizep = smbnhgets(pdata); pdata += 4;
  48. *accessallowedp = smbnhgets(pdata);
  49. return 1;
  50. }