xref: /plan9/sys/src/cmd/aquarela/smbcomquery.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier #include "headers.h"
2*8ccd4a63SDavid du Colombier 
3*8ccd4a63SDavid du Colombier SmbProcessResult
smbcomqueryinformation(SmbSession * s,SmbHeader * h,uchar *,SmbBuffer * b)4*8ccd4a63SDavid du Colombier smbcomqueryinformation(SmbSession *s, SmbHeader *h, uchar *, SmbBuffer *b)
5*8ccd4a63SDavid du Colombier {
6*8ccd4a63SDavid du Colombier 	SmbTree *t;
7*8ccd4a63SDavid du Colombier 	uchar fmt;
8*8ccd4a63SDavid du Colombier 	char *path;
9*8ccd4a63SDavid du Colombier 	Dir *d;
10*8ccd4a63SDavid du Colombier 	char *fullpath;
11*8ccd4a63SDavid du Colombier 
12*8ccd4a63SDavid du Colombier 	if (!smbcheckwordcount("comqueryinformation", h, 0)
13*8ccd4a63SDavid du Colombier 		|| !smbbuffergetb(b, &fmt)
14*8ccd4a63SDavid du Colombier 		|| fmt != 4
15*8ccd4a63SDavid du Colombier 		|| !smbbuffergetstring(b, h, SMB_STRING_PATH, &path))
16*8ccd4a63SDavid du Colombier 		return SmbProcessResultFormat;
17*8ccd4a63SDavid du Colombier 	t = smbidmapfind(s->tidmap, h->tid);
18*8ccd4a63SDavid du Colombier 	if (t == nil) {
19*8ccd4a63SDavid du Colombier 		free(path);
20*8ccd4a63SDavid du Colombier 		smbseterror(s, ERRSRV, ERRinvtid);
21*8ccd4a63SDavid du Colombier 		return SmbProcessResultError;
22*8ccd4a63SDavid du Colombier 	}
23*8ccd4a63SDavid du Colombier 	smblogprint(h->command, "smbcomqueryinformation: %s\n", path);
24*8ccd4a63SDavid du Colombier 	fullpath = nil;
25*8ccd4a63SDavid du Colombier 	smbstringprint(&fullpath, "%s%s", t->serv->path, path);
26*8ccd4a63SDavid du Colombier 	d = dirstat(fullpath);
27*8ccd4a63SDavid du Colombier 	free(fullpath);
28*8ccd4a63SDavid du Colombier 	free(path);
29*8ccd4a63SDavid du Colombier 	if (d == nil) {
30*8ccd4a63SDavid du Colombier 		smbseterror(s, ERRDOS, ERRbadpath);
31*8ccd4a63SDavid du Colombier 		return SmbProcessResultError;
32*8ccd4a63SDavid du Colombier 	}
33*8ccd4a63SDavid du Colombier 	h->wordcount = 10;
34*8ccd4a63SDavid du Colombier 	if (!smbbufferputheader(s->response, h, &s->peerinfo)
35*8ccd4a63SDavid du Colombier 		|| !smbbufferputs(s->response, smbplan9mode2dosattr(d->mode))
36*8ccd4a63SDavid du Colombier 		|| !smbbufferputl(s->response, smbplan9time2utime(d->mtime, s->tzoff))
37*8ccd4a63SDavid du Colombier 		|| !smbbufferputl(s->response, smbplan9length2size32(d->length))
38*8ccd4a63SDavid du Colombier 		|| !smbbufferfill(s->response, 0, 10)
39*8ccd4a63SDavid du Colombier 		|| !smbbufferputs(s->response, 0)) {
40*8ccd4a63SDavid du Colombier 		free(d);
41*8ccd4a63SDavid du Colombier 		return SmbProcessResultMisc;
42*8ccd4a63SDavid du Colombier 	}
43*8ccd4a63SDavid du Colombier 	free(d);
44*8ccd4a63SDavid du Colombier 	return SmbProcessResultReply;
45*8ccd4a63SDavid du Colombier }
46*8ccd4a63SDavid du Colombier 
47*8ccd4a63SDavid du Colombier SmbProcessResult
smbcomqueryinformation2(SmbSession * s,SmbHeader * h,uchar * pdata,SmbBuffer *)48*8ccd4a63SDavid du Colombier smbcomqueryinformation2(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *)
49*8ccd4a63SDavid du Colombier {
50*8ccd4a63SDavid du Colombier 	SmbTree *t;
51*8ccd4a63SDavid du Colombier 	Dir *d;
52*8ccd4a63SDavid du Colombier 	ushort fid;
53*8ccd4a63SDavid du Colombier 	ushort mtime, mdate;
54*8ccd4a63SDavid du Colombier 	ushort atime, adate;
55*8ccd4a63SDavid du Colombier 	SmbFile *f;
56*8ccd4a63SDavid du Colombier 
57*8ccd4a63SDavid du Colombier 	if (!smbcheckwordcount("comqueryinformation2", h, 1))
58*8ccd4a63SDavid du Colombier 		return SmbProcessResultFormat;
59*8ccd4a63SDavid du Colombier 	fid = smbnhgets(pdata);
60*8ccd4a63SDavid du Colombier 	t = smbidmapfind(s->tidmap, h->tid);
61*8ccd4a63SDavid du Colombier 	if (t == nil) {
62*8ccd4a63SDavid du Colombier 		smbseterror(s, ERRSRV, ERRinvtid);
63*8ccd4a63SDavid du Colombier 		return SmbProcessResultError;
64*8ccd4a63SDavid du Colombier 	}
65*8ccd4a63SDavid du Colombier 	f = smbidmapfind(s->fidmap, fid);
66*8ccd4a63SDavid du Colombier 	if (f == nil) {
67*8ccd4a63SDavid du Colombier 		smbseterror(s, ERRDOS, ERRbadfid);
68*8ccd4a63SDavid du Colombier 		return SmbProcessResultError;
69*8ccd4a63SDavid du Colombier 	}
70*8ccd4a63SDavid du Colombier 	d = dirfstat(f->fd);
71*8ccd4a63SDavid du Colombier 	if (d == nil) {
72*8ccd4a63SDavid du Colombier 		smbseterror(s, ERRDOS, ERRbadpath);
73*8ccd4a63SDavid du Colombier 		return SmbProcessResultError;
74*8ccd4a63SDavid du Colombier 	}
75*8ccd4a63SDavid du Colombier 	h->wordcount = 11;
76*8ccd4a63SDavid du Colombier 	smbplan9time2datetime(d->atime, s->tzoff, &adate, &atime);
77*8ccd4a63SDavid du Colombier 	smbplan9time2datetime(d->mtime, s->tzoff, &mdate, &mtime);
78*8ccd4a63SDavid du Colombier 	if (!smbbufferputheader(s->response, h, &s->peerinfo)
79*8ccd4a63SDavid du Colombier 		|| !smbbufferputs(s->response, mdate)
80*8ccd4a63SDavid du Colombier 		|| !smbbufferputs(s->response, mtime)
81*8ccd4a63SDavid du Colombier 		|| !smbbufferputs(s->response, adate)
82*8ccd4a63SDavid du Colombier 		|| !smbbufferputs(s->response, atime)
83*8ccd4a63SDavid du Colombier 		|| !smbbufferputs(s->response, mdate)
84*8ccd4a63SDavid du Colombier 		|| !smbbufferputs(s->response, mtime)
85*8ccd4a63SDavid du Colombier 		|| !smbbufferputl(s->response, smbplan9length2size32(d->length))
86*8ccd4a63SDavid du Colombier 		|| !smbbufferputl(s->response,
87*8ccd4a63SDavid du Colombier 			smbplan9length2size32(smbl2roundupvlong(d->length, smbglobals.l2allocationsize)))
88*8ccd4a63SDavid du Colombier 		|| !smbbufferputs(s->response, smbplan9mode2dosattr(d->mode))
89*8ccd4a63SDavid du Colombier 		|| !smbbufferputs(s->response, 0)) {
90*8ccd4a63SDavid du Colombier 		free(d);
91*8ccd4a63SDavid du Colombier 		return SmbProcessResultMisc;
92*8ccd4a63SDavid du Colombier 	}
93*8ccd4a63SDavid du Colombier 	free(d);
94*8ccd4a63SDavid du Colombier 	return SmbProcessResultReply;
95*8ccd4a63SDavid du Colombier }
96