smbcomrename.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #include "headers.h"
  2. SmbProcessResult
  3. smbcomrename(SmbSession *s, SmbHeader *h, uchar *, SmbBuffer *b)
  4. {
  5. int rv;
  6. char *oldpath, *newpath;
  7. char *olddir, *newdir;
  8. char *oldname, *newname;
  9. uchar oldfmt, newfmt;
  10. Dir d;
  11. SmbProcessResult pr;
  12. if (h->wordcount != 1)
  13. return SmbProcessResultFormat;
  14. if (!smbbuffergetb(b, &oldfmt) || oldfmt != 0x04 || !smbbuffergetstring(b, h, SMB_STRING_PATH, &oldpath)
  15. || !smbbuffergetb(b, &newfmt) || newfmt != 0x04 || !smbbuffergetstring(b, h, SMB_STRING_PATH, &newpath))
  16. return SmbProcessResultFormat;
  17. smblogprint(h->command, "smbcomrename: %s to %s\n", oldpath, newpath);
  18. smbpathsplit(oldpath, &olddir, &oldname);
  19. smbpathsplit(newpath, &newdir, &newname);
  20. if (strcmp(olddir, newdir) != 0) {
  21. smblogprint(h->command, "smbcomrename: directories differ\n");
  22. goto noaccess;
  23. }
  24. memset(&d, 0xff, sizeof(d));
  25. d.uid = d.gid = d.muid = nil;
  26. d.name = newname;
  27. rv = dirwstat(oldpath, &d);
  28. if (rv < 0) {
  29. smblogprint(h->command, "smbcomrename failed: %r\n");
  30. noaccess:
  31. smbseterror(s, ERRDOS, ERRnoaccess);
  32. pr = SmbProcessResultError;
  33. }
  34. else
  35. pr = smbbufferputack(s->response, h, &s->peerinfo);
  36. free(oldpath);
  37. free(olddir);
  38. free(oldname);
  39. free(newpath);
  40. free(newdir);
  41. free(newname);
  42. return pr;
  43. }