| /* 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 = 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; |
| } |
| |