xref: /plan9/sys/src/cmd/aquarela/smbcomsetinfo.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
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