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