smbcomsetinfo.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include "headers.h"
  2. SmbProcessResult
  3. smbcomsetinformation2(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *)
  4. {
  5. ushort fid, adate, atime, mdate, mtime;
  6. SmbTree *t;
  7. SmbFile *f;
  8. Dir d;
  9. if (h->wordcount != 7)
  10. return SmbProcessResultFormat;
  11. fid = smbnhgets(pdata);
  12. adate = smbnhgets(pdata + 6);
  13. atime = smbnhgets(pdata + 8);
  14. mdate = smbnhgets(pdata + 10);
  15. mtime = smbnhgets(pdata + 12);
  16. smblogprint(h->command,
  17. "smbcomsetinformation2: fid 0x%.4ux adate 0x%.4ux atime 0x%.4ux mdate 0x%.4ux mtime 0x%.4ux\n",
  18. fid, adate, atime, mdate, mtime);
  19. t = smbidmapfind(s->tidmap, h->tid);
  20. if (t == nil) {
  21. smbseterror(s, ERRSRV, ERRinvtid);
  22. return SmbProcessResultError;
  23. }
  24. f = smbidmapfind(s->fidmap, fid);
  25. if (f == nil) {
  26. smbseterror(s, ERRDOS, ERRbadfid);
  27. return SmbProcessResultError;
  28. }
  29. memset(&d, 0xff, sizeof(d));
  30. d.name = d.uid = d.gid = d.muid = nil;
  31. if (adate || atime || mdate || mtime) {
  32. //smblogprint(-1, "smbcomsetinformation2: changing times not implemented\n");
  33. // return SmbProcessResultUnimp;
  34. /* something to change */
  35. if (!(adate && atime && mdate && mtime)) {
  36. /* some null entries */
  37. ushort odate, otime;
  38. Dir *od = dirfstat(f->fd);
  39. if (od == nil) {
  40. smbseterror(s, ERRDOS, ERRnoaccess);
  41. return SmbProcessResultError;
  42. }
  43. if (adate || atime) {
  44. /* something changed in access time */
  45. if (!(adate && atime)) {
  46. /* some nulls in access time */
  47. smbplan9time2datetime(d.atime, s->tzoff, &odate, &otime);
  48. if (adate == 0)
  49. adate = odate;
  50. if (atime == 0)
  51. atime = otime;
  52. }
  53. d.atime = smbdatetime2plan9time(adate, atime, s->tzoff);
  54. }
  55. if (mdate || mtime) {
  56. /* something changed in modify time */
  57. if (!(mdate && mtime)) {
  58. /* some nulls in modify time */
  59. smbplan9time2datetime(d.mtime, s->tzoff, &odate, &otime);
  60. if (mdate == 0)
  61. mdate = odate;
  62. if (mtime == 0)
  63. mtime = otime;
  64. }
  65. d.mtime = smbdatetime2plan9time(mdate, mtime, s->tzoff);
  66. }
  67. free(od);
  68. }
  69. if (dirfwstat(f->fd, &d) < 0) {
  70. smbseterror(s, ERRDOS, ERRnoaccess);
  71. return SmbProcessResultError;
  72. }
  73. }
  74. return smbbufferputack(s->response, h, &s->peerinfo);
  75. }
  76. SmbProcessResult
  77. smbcomsetinformation(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
  78. {
  79. ushort attr;
  80. ulong utime;
  81. char *name;
  82. if (h->wordcount != 8)
  83. return SmbProcessResultFormat;
  84. attr = smbnhgets(pdata); pdata += 2;
  85. utime = smbnhgetl(pdata);
  86. if (!smbbuffergetstring(b, h, SMB_STRING_PATH, &name))
  87. return SmbProcessResultFormat;
  88. smblogprint(h->command,
  89. "smbcomsetinformation: attr 0x%.4ux utime %lud path %s\n",
  90. attr, utime, name);
  91. if (utime) {
  92. Dir d;
  93. memset(&d, 0xff, sizeof(d));
  94. d.name = d.uid = d.gid = d.muid = nil;
  95. d.mtime = smbutime2plan9time(utime, s->tzoff);
  96. if (dirwstat(name, &d) < 0) {
  97. smbseterror(s, ERRDOS, ERRnoaccess);
  98. free(name);
  99. return SmbProcessResultError;
  100. }
  101. }
  102. free(name);
  103. return smbbufferputack(s->response, h, &s->peerinfo);
  104. }