Blame


1 d3df3087 2003-12-06 devnull /* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */
2 d3df3087 2003-12-06 devnull /* See COPYRIGHT */
3 d3df3087 2003-12-06 devnull
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"
9 d3df3087 2003-12-06 devnull
10 d3df3087 2003-12-06 devnull Dir*
11 d3df3087 2003-12-06 devnull fsdirstat(Fsys *fs, char *name)
12 d3df3087 2003-12-06 devnull {
13 d3df3087 2003-12-06 devnull Dir *d;
14 d3df3087 2003-12-06 devnull Fid *fid;
15 d3df3087 2003-12-06 devnull
16 d3df3087 2003-12-06 devnull if((fid = fswalk(fs->root, name)) == nil)
17 d3df3087 2003-12-06 devnull return nil;
18 d3df3087 2003-12-06 devnull
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;
22 d3df3087 2003-12-06 devnull }
23 d3df3087 2003-12-06 devnull
24 d3df3087 2003-12-06 devnull Dir*
25 d3df3087 2003-12-06 devnull fsdirfstat(Fid *fid)
26 d3df3087 2003-12-06 devnull {
27 d3df3087 2003-12-06 devnull Dir *d;
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;
31 d3df3087 2003-12-06 devnull int n;
32 d3df3087 2003-12-06 devnull
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;
36 d3df3087 2003-12-06 devnull
37 d3df3087 2003-12-06 devnull if(fsrpc(fs, &tx, &rx, &freep) < 0)
38 d3df3087 2003-12-06 devnull return nil;
39 d3df3087 2003-12-06 devnull
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;
44 d3df3087 2003-12-06 devnull }
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){
48 d3df3087 2003-12-06 devnull free(d);
49 d3df3087 2003-12-06 devnull werrstr("rx.nstat and convM2D disagree about dir length");
50 d3df3087 2003-12-06 devnull return nil;
51 d3df3087 2003-12-06 devnull }
52 d3df3087 2003-12-06 devnull return d;
53 d3df3087 2003-12-06 devnull }
54 d3df3087 2003-12-06 devnull