Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include "headers.h"

SmbProcessResult
smbcomcheckdirectory(SmbSession *s, SmbHeader *h, uchar *, SmbBuffer *b)
{
        char *path;
        Dir *d;
        uchar fmt;
        SmbProcessResult pr;
        SmbTree *t;
        char *fullpath = nil;

        if (!smbcheckwordcount("comcheckdirectory", h, 0))
                return SmbProcessResultFormat;

        if (!smbbuffergetb(b, &fmt)
                || fmt != 4
                || !smbbuffergetstring(b, h, SMB_STRING_PATH, &path))
                return SmbProcessResultFormat;

        t = smbidmapfind(s->tidmap, h->tid);
        if (t == nil) {
                smbseterror(s, ERRSRV, ERRinvtid);
                return SmbProcessResultError;
        }
        
        smbstringprint(&fullpath, "%s%s", t->serv->path, path);
smblogprintif(1, "smbcomcheckdirectory: statting %s\n", fullpath);
        d = dirstat(fullpath);

        if (d == nil || (d->mode & DMDIR) == 0) {
                smbseterror(s, ERRDOS, ERRbadpath);
                pr = SmbProcessResultError;
                goto done;
        }

        if (access(fullpath, AREAD) < 0) {
                smbseterror(s, ERRDOS, ERRbadpath);
                pr = SmbProcessResultError;
                goto done;
        }

        pr = smbbufferputack(s->response, h, &s->peerinfo) ? SmbProcessResultReply : SmbProcessResultMisc;
done:
        free(fullpath);
        free(path);
        free(d);
        return pr;
}