Blame


1 46f79934 2005-01-04 devnull /* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */
2 46f79934 2005-01-04 devnull /* See COPYRIGHT */
3 46f79934 2005-01-04 devnull
4 46f79934 2005-01-04 devnull #include <u.h>
5 46f79934 2005-01-04 devnull #include <libc.h>
6 46f79934 2005-01-04 devnull #include <fcall.h>
7 46f79934 2005-01-04 devnull #include <9pclient.h>
8 46f79934 2005-01-04 devnull #include "fsimpl.h"
9 46f79934 2005-01-04 devnull
10 46f79934 2005-01-04 devnull Dir*
11 46f79934 2005-01-04 devnull fsdirstat(CFsys *fs, char *name)
12 46f79934 2005-01-04 devnull {
13 46f79934 2005-01-04 devnull Dir *d;
14 46f79934 2005-01-04 devnull CFid *fid;
15 46f79934 2005-01-04 devnull
16 73a5509a 2006-07-23 devnull if((fid = fswalk(fs->root, name)) == nil)
17 46f79934 2005-01-04 devnull return nil;
18 fa325e9b 2020-01-10 cross
19 46f79934 2005-01-04 devnull d = fsdirfstat(fid);
20 46f79934 2005-01-04 devnull fsclose(fid);
21 46f79934 2005-01-04 devnull return d;
22 46f79934 2005-01-04 devnull }
23 46f79934 2005-01-04 devnull
24 46f79934 2005-01-04 devnull Dir*
25 46f79934 2005-01-04 devnull fsdirfstat(CFid *fid)
26 46f79934 2005-01-04 devnull {
27 46f79934 2005-01-04 devnull Dir *d;
28 46f79934 2005-01-04 devnull CFsys *fs;
29 46f79934 2005-01-04 devnull Fcall tx, rx;
30 46f79934 2005-01-04 devnull void *freep;
31 46f79934 2005-01-04 devnull int n;
32 46f79934 2005-01-04 devnull
33 46f79934 2005-01-04 devnull fs = fid->fs;
34 46f79934 2005-01-04 devnull tx.type = Tstat;
35 46f79934 2005-01-04 devnull tx.fid = fid->fid;
36 46f79934 2005-01-04 devnull
37 46f79934 2005-01-04 devnull if(_fsrpc(fs, &tx, &rx, &freep) < 0)
38 46f79934 2005-01-04 devnull return nil;
39 46f79934 2005-01-04 devnull
40 46f79934 2005-01-04 devnull d = malloc(sizeof(Dir)+rx.nstat);
41 46f79934 2005-01-04 devnull if(d == nil){
42 46f79934 2005-01-04 devnull free(freep);
43 46f79934 2005-01-04 devnull return nil;
44 46f79934 2005-01-04 devnull }
45 74dd0321 2010-12-07 rsc n = convM2D(rx.stat, rx.nstat, d, (char*)&d[1]);
46 46f79934 2005-01-04 devnull free(freep);
47 46f79934 2005-01-04 devnull if(n != rx.nstat){
48 46f79934 2005-01-04 devnull free(d);
49 46f79934 2005-01-04 devnull werrstr("rx.nstat and convM2D disagree about dir length");
50 46f79934 2005-01-04 devnull return nil;
51 46f79934 2005-01-04 devnull }
52 46f79934 2005-01-04 devnull return d;
53 46f79934 2005-01-04 devnull }