/* 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 = convM2Du(rx.stat, rx.nstat, d, (char*)&d[1], fs->dotu); free(freep); if(n != rx.nstat){ free(d); werrstr("rx.nstat and convM2D disagree about dir length"); return nil; } return d;}
/* 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 = convM2Du(rx.stat, rx.nstat, d, (char*)&d[1], fs->dotu);
free(freep);
if(n != rx.nstat){
free(d);
werrstr("rx.nstat and convM2D disagree about dir length");
return nil;
}
return d;
}