smbcomdelete.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include "headers.h"
  2. #include <String.h>
  3. int
  4. smbremovefile(SmbTree *t, char *dir, char *name)
  5. {
  6. String *s;
  7. int rv;
  8. s = s_new();
  9. s_append(s, t->serv->path);
  10. s_append(s, "/");
  11. if (dir) {
  12. s_append(s, dir);
  13. s_append(s, "/");
  14. }
  15. s_append(s, name);
  16. rv = remove(s_to_c(s));
  17. s_free(s);
  18. return rv;
  19. }
  20. SmbProcessResult
  21. smbcomdelete(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
  22. {
  23. SmbProcessResult pr;
  24. ushort sattr;
  25. uchar fmt;
  26. char *pattern = nil;
  27. char *dir = nil;
  28. char *name = nil;
  29. Reprog *r = nil;
  30. SmbTree *t;
  31. int x, count;
  32. SmbDirCache *dc = nil;
  33. if (h->wordcount != 1)
  34. return SmbProcessResultFormat;
  35. sattr = smbnhgets(pdata);
  36. if (!smbbuffergetb(b, &fmt) || fmt != 0x04
  37. || !smbbuffergetstring(b, h, SMB_STRING_PATH, &pattern))
  38. return SmbProcessResultFormat;
  39. smblogprint(SMB_COM_DELETE, "searchattributes: 0x%.4ux\npattern:%s\n", sattr, pattern);
  40. smbpathsplit(pattern, &dir, &name);
  41. t = smbidmapfind(s->tidmap, h->tid);
  42. if (t == nil) {
  43. smbseterror(s, ERRSRV, ERRinvtid);
  44. pr = SmbProcessResultError;
  45. goto done;
  46. }
  47. dc = smbmkdircache(t, dir);
  48. if (dc == nil) {
  49. pr = SmbProcessResultMisc;
  50. goto done;
  51. }
  52. r = smbmkrep(name);
  53. count = 0;
  54. for (x = 0; x < dc->n; x++) {
  55. if (!smbmatch(dc->buf[x].name, r))
  56. continue;
  57. if (smbremovefile(t, dir, dc->buf[x].name) == 0)
  58. count++;
  59. }
  60. if (count == 0) {
  61. smbseterror(s, ERRDOS, ERRnoaccess);
  62. pr = SmbProcessResultError;
  63. }
  64. else
  65. pr = smbbufferputack(s->response,h, &s->peerinfo);
  66. done:
  67. free(pattern);
  68. free(dir);
  69. free(name);
  70. smbdircachefree(&dc);
  71. free(r);
  72. return pr;
  73. }