Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#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;
}