Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#include        <u.h>
#include        <libc.h>
#include        <fcall.h>

int
statcheck(uchar *buf, uint nbuf)
{
        uchar *ebuf;
        int i;

        ebuf = buf + nbuf;

        if(nbuf < STATFIXLEN || nbuf != BIT16SZ + GBIT16(buf))
                return -1;

        buf += STATFIXLEN - 4 * BIT16SZ;

        for(i = 0; i < 4; i++){
                if(buf + BIT16SZ > ebuf)
                        return -1;
                buf += BIT16SZ + GBIT16(buf);
        }

        if(buf != ebuf)
                return -1;

        return 0;
}

static char nullstring[] = "";

uint
convM2D(uchar *buf, uint nbuf, Dir *d, char *strs)
{
        uchar *p, *ebuf;
        char *sv[4];
        int i, ns;

        if(nbuf < STATFIXLEN)
                return 0; 

        p = buf;
        ebuf = buf + nbuf;

        p += BIT16SZ;   /* ignore size */
        d->type = GBIT16(p);
        p += BIT16SZ;
        d->dev = GBIT32(p);
        p += BIT32SZ;
        d->qid.type = GBIT8(p);
        p += BIT8SZ;
        d->qid.vers = GBIT32(p);
        p += BIT32SZ;
        d->qid.path = GBIT64(p);
        p += BIT64SZ;
        d->mode = GBIT32(p);
        p += BIT32SZ;
        d->atime = GBIT32(p);
        p += BIT32SZ;
        d->mtime = GBIT32(p);
        p += BIT32SZ;
        d->length = GBIT64(p);
        p += BIT64SZ;

        for(i = 0; i < 4; i++){
                if(p + BIT16SZ > ebuf)
                        return 0;
                ns = GBIT16(p);
                p += BIT16SZ;
                if(p + ns > ebuf)
                        return 0;
                if(strs){
                        sv[i] = strs;
                        memmove(strs, p, ns);
                        strs += ns;
                        *strs++ = '\0';
                }
                p += ns;
        }

        if(strs){
                d->name = sv[0];
                d->uid = sv[1];
                d->gid = sv[2];
                d->muid = sv[3];
        }else{
                d->name = nullstring;
                d->uid = nullstring;
                d->gid = nullstring;
                d->muid = nullstring;
        }
        
        return p - buf;
}