123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- #include "headers.h"
- SmbProcessResult
- smbcomsetinformation2(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *)
- {
- ushort fid, adate, atime, mdate, mtime;
- SmbTree *t;
- SmbFile *f;
- Dir d;
- if (h->wordcount != 7)
- return SmbProcessResultFormat;
- fid = smbnhgets(pdata);
- adate = smbnhgets(pdata + 6);
- atime = smbnhgets(pdata + 8);
- mdate = smbnhgets(pdata + 10);
- mtime = smbnhgets(pdata + 12);
- smblogprint(h->command,
- "smbcomsetinformation2: fid 0x%.4ux adate 0x%.4ux atime 0x%.4ux mdate 0x%.4ux mtime 0x%.4ux\n",
- fid, adate, atime, mdate, mtime);
- t = smbidmapfind(s->tidmap, h->tid);
- if (t == nil) {
- smbseterror(s, ERRSRV, ERRinvtid);
- return SmbProcessResultError;
- }
- f = smbidmapfind(s->fidmap, fid);
- if (f == nil) {
- smbseterror(s, ERRDOS, ERRbadfid);
- return SmbProcessResultError;
- }
- memset(&d, 0xff, sizeof(d));
- d.name = d.uid = d.gid = d.muid = nil;
- if (adate || atime || mdate || mtime) {
- //smblogprint(-1, "smbcomsetinformation2: changing times not implemented\n");
- // return SmbProcessResultUnimp;
- /* something to change */
- if (!(adate && atime && mdate && mtime)) {
- /* some null entries */
- ushort odate, otime;
- Dir *od = dirfstat(f->fd);
- if (od == nil) {
- smbseterror(s, ERRDOS, ERRnoaccess);
- return SmbProcessResultError;
- }
- if (adate || atime) {
- /* something changed in access time */
- if (!(adate && atime)) {
- /* some nulls in access time */
- smbplan9time2datetime(d.atime, s->tzoff, &odate, &otime);
- if (adate == 0)
- adate = odate;
- if (atime == 0)
- atime = otime;
- }
- d.atime = smbdatetime2plan9time(adate, atime, s->tzoff);
- }
- if (mdate || mtime) {
- /* something changed in modify time */
- if (!(mdate && mtime)) {
- /* some nulls in modify time */
- smbplan9time2datetime(d.mtime, s->tzoff, &odate, &otime);
- if (mdate == 0)
- mdate = odate;
- if (mtime == 0)
- mtime = otime;
- }
- d.mtime = smbdatetime2plan9time(mdate, mtime, s->tzoff);
- }
- free(od);
- }
- if (dirfwstat(f->fd, &d) < 0) {
- smbseterror(s, ERRDOS, ERRnoaccess);
- return SmbProcessResultError;
- }
- }
- return smbbufferputack(s->response, h, &s->peerinfo);
- }
- SmbProcessResult
- smbcomsetinformation(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
- {
- ushort attr;
- ulong utime;
- char *name;
- if (h->wordcount != 8)
- return SmbProcessResultFormat;
- attr = smbnhgets(pdata); pdata += 2;
- utime = smbnhgetl(pdata);
- if (!smbbuffergetstring(b, h, SMB_STRING_PATH, &name))
- return SmbProcessResultFormat;
- smblogprint(h->command,
- "smbcomsetinformation: attr 0x%.4ux utime %lud path %s\n",
- attr, utime, name);
- if (utime) {
- Dir d;
- memset(&d, 0xff, sizeof(d));
- d.name = d.uid = d.gid = d.muid = nil;
- d.mtime = smbutime2plan9time(utime, s->tzoff);
- if (dirwstat(name, &d) < 0) {
- smbseterror(s, ERRDOS, ERRnoaccess);
- free(name);
- return SmbProcessResultError;
- }
- }
- free(name);
- return smbbufferputack(s->response, h, &s->peerinfo);
- }
|