/* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */ /* See COPYRIGHT */ #include #include #include #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; }