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