Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

/* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */
/* See COPYRIGHT */

#include <u.h>
#include <libc.h>
#include <fcall.h>
#include <9pclient.h>
#include "fsimpl.h"

Dir*
fsdirstat(CFsys *fs, char *name)
{
        Dir *d;
        CFid *fid;

        if((fid = fswalk(fs->root, name)) == nil)
                return nil;
        
        d = fsdirfstat(fid);
        fsclose(fid);
        return d;
}

Dir*
fsdirfstat(CFid *fid)
{
        Dir *d;
        CFsys *fs;
        Fcall tx, rx;
        void *freep;
        int n;

        fs = fid->fs;
        tx.type = Tstat;
        tx.fid = fid->fid;

        if(_fsrpc(fs, &tx, &rx, &freep) < 0)
                return nil;

        d = malloc(sizeof(Dir)+rx.nstat);
        if(d == nil){
                free(freep);
                return nil;
        }
        n = convM2D(rx.stat, rx.nstat, d, (char*)&d[1]);
        free(freep);
        if(n != rx.nstat){
                free(d);
                werrstr("rx.nstat and convM2D disagree about dir length");
                return nil;
        }
        return d;
}