1 d3df3087 2003-12-06 devnull /* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */
2 d3df3087 2003-12-06 devnull /* See COPYRIGHT */
4 d3df3087 2003-12-06 devnull #include <u.h>
5 d3df3087 2003-12-06 devnull #include <libc.h>
6 d3df3087 2003-12-06 devnull #include <fcall.h>
7 d3df3087 2003-12-06 devnull #include <fs.h>
8 d3df3087 2003-12-06 devnull #include "fsimpl.h"
11 d3df3087 2003-12-06 devnull fsdirstat(Fsys *fs, char *name)
14 d3df3087 2003-12-06 devnull Fid *fid;
16 d3df3087 2003-12-06 devnull if((fid = fswalk(fs->root, name)) == nil)
17 d3df3087 2003-12-06 devnull return nil;
19 d3df3087 2003-12-06 devnull d = fsdirfstat(fid);
20 d3df3087 2003-12-06 devnull fsclose(fid);
21 d3df3087 2003-12-06 devnull return d;
25 d3df3087 2003-12-06 devnull fsdirfstat(Fid *fid)
28 d3df3087 2003-12-06 devnull Fsys *fs;
29 d3df3087 2003-12-06 devnull Fcall tx, rx;
30 d3df3087 2003-12-06 devnull void *freep;
33 d3df3087 2003-12-06 devnull fs = fid->fs;
34 d3df3087 2003-12-06 devnull tx.type = Tstat;
35 d3df3087 2003-12-06 devnull tx.fid = fid->fid;
37 d3df3087 2003-12-06 devnull if(fsrpc(fs, &tx, &rx, &freep) < 0)
38 d3df3087 2003-12-06 devnull return nil;
40 d3df3087 2003-12-06 devnull d = malloc(sizeof(Dir)+rx.nstat);
41 d3df3087 2003-12-06 devnull if(d == nil){
42 d3df3087 2003-12-06 devnull free(freep);
43 d3df3087 2003-12-06 devnull return nil;
45 d3df3087 2003-12-06 devnull n = convM2D(rx.stat, rx.nstat, d, (char*)&d[1]);
46 d3df3087 2003-12-06 devnull free(freep);
47 d3df3087 2003-12-06 devnull if(n != rx.nstat){
49 d3df3087 2003-12-06 devnull werrstr("rx.nstat and convM2D disagree about dir length");
50 d3df3087 2003-12-06 devnull return nil;
52 d3df3087 2003-12-06 devnull return d;