Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#include "lib.h"
#include <string.h>
#include "sys9.h"
#include "dir.h"
#define nil ((void*)0)

static char nullstring[] = "";

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

        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;

        d->name = nil;
        d->uid = nil;
        d->gid = nil;
        d->muid = nil;

        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){
                        nsv[i] = ns;
                        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;
}