#include "headers.h" SmbProcessResult smbcomqueryinformation(SmbSession *s, SmbHeader *h, uchar *, SmbBuffer *b) { SmbTree *t; uchar fmt; char *path; Dir *d; char *fullpath; if (!smbcheckwordcount("comqueryinformation", h, 0) || !smbbuffergetb(b, &fmt) || fmt != 4 || !smbbuffergetstring(b, h, SMB_STRING_PATH, &path)) return SmbProcessResultFormat; t = smbidmapfind(s->tidmap, h->tid); if (t == nil) { free(path); smbseterror(s, ERRSRV, ERRinvtid); return SmbProcessResultError; } smblogprint(h->command, "smbcomqueryinformation: %s\n", path); fullpath = nil; smbstringprint(&fullpath, "%s%s", t->serv->path, path); d = dirstat(fullpath); free(fullpath); free(path); if (d == nil) { smbseterror(s, ERRDOS, ERRbadpath); return SmbProcessResultError; } h->wordcount = 10; if (!smbbufferputheader(s->response, h, &s->peerinfo) || !smbbufferputs(s->response, smbplan9mode2dosattr(d->mode)) || !smbbufferputl(s->response, smbplan9time2utime(d->mtime, s->tzoff)) || !smbbufferputl(s->response, smbplan9length2size32(d->length)) || !smbbufferfill(s->response, 0, 10) || !smbbufferputs(s->response, 0)) { free(d); return SmbProcessResultMisc; } free(d); return SmbProcessResultReply; } SmbProcessResult smbcomqueryinformation2(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *) { SmbTree *t; Dir *d; ushort fid; ushort mtime, mdate; ushort atime, adate; SmbFile *f; if (!smbcheckwordcount("comqueryinformation2", h, 1)) return SmbProcessResultFormat; fid = smbnhgets(pdata); t = smbidmapfind(s->tidmap, h->tid); if (t == nil) { smbseterror(s, ERRSRV, ERRinvtid); return SmbProcessResultError; } f = smbidmapfind(s->fidmap, fid); if (f == nil) { smbseterror(s, ERRDOS, ERRbadfid); return SmbProcessResultError; } d = dirfstat(f->fd); if (d == nil) { smbseterror(s, ERRDOS, ERRbadpath); return SmbProcessResultError; } h->wordcount = 11; smbplan9time2datetime(d->atime, s->tzoff, &adate, &atime); smbplan9time2datetime(d->mtime, s->tzoff, &mdate, &mtime); if (!smbbufferputheader(s->response, h, &s->peerinfo) || !smbbufferputs(s->response, mdate) || !smbbufferputs(s->response, mtime) || !smbbufferputs(s->response, adate) || !smbbufferputs(s->response, atime) || !smbbufferputs(s->response, mdate) || !smbbufferputs(s->response, mtime) || !smbbufferputl(s->response, smbplan9length2size32(d->length)) || !smbbufferputl(s->response, smbplan9length2size32(smbl2roundupvlong(d->length, smbglobals.l2allocationsize))) || !smbbufferputs(s->response, smbplan9mode2dosattr(d->mode)) || !smbbufferputs(s->response, 0)) { free(d); return SmbProcessResultMisc; } free(d); return SmbProcessResultReply; }