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