From 2600337aa704efbeba8201e88147a764b4fd2b90 Mon Sep 17 00:00:00 2001 From: rsc Date: Sun, 2 Jan 2005 19:46:12 +0000 Subject: remove libfs. now lib9pclient --- src/libfs/COPYRIGHT | 27 ----- src/libfs/close.c | 26 ----- src/libfs/create.c | 25 ----- src/libfs/dirread.c | 100 ----------------- src/libfs/fs.c | 309 ---------------------------------------------------- src/libfs/fsimpl.h | 45 -------- src/libfs/mkfile | 23 ---- src/libfs/ns.c | 40 ------- src/libfs/open.c | 24 ---- src/libfs/openfd.c | 26 ----- src/libfs/read.c | 72 ------------ src/libfs/stat.c | 54 --------- src/libfs/walk.c | 73 ------------- src/libfs/write.c | 74 ------------- src/libfs/wstat.c | 49 --------- 15 files changed, 967 deletions(-) delete mode 100644 src/libfs/COPYRIGHT delete mode 100644 src/libfs/close.c delete mode 100644 src/libfs/create.c delete mode 100644 src/libfs/dirread.c delete mode 100644 src/libfs/fs.c delete mode 100644 src/libfs/fsimpl.h delete mode 100644 src/libfs/mkfile delete mode 100644 src/libfs/ns.c delete mode 100644 src/libfs/open.c delete mode 100644 src/libfs/openfd.c delete mode 100644 src/libfs/read.c delete mode 100644 src/libfs/stat.c delete mode 100644 src/libfs/walk.c delete mode 100644 src/libfs/write.c delete mode 100644 src/libfs/wstat.c (limited to 'src') diff --git a/src/libfs/COPYRIGHT b/src/libfs/COPYRIGHT deleted file mode 100644 index de348d12..00000000 --- a/src/libfs/COPYRIGHT +++ /dev/null @@ -1,27 +0,0 @@ - -This software was developed as part of a project at MIT: - /sys/src/libfs/* except dirread.c - /sys/include/fs.h - -Copyright (c) 2003 Russ Cox, - Massachusetts Institute of Technology - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/src/libfs/close.c b/src/libfs/close.c deleted file mode 100644 index 23388ae3..00000000 --- a/src/libfs/close.c +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */ -/* See COPYRIGHT */ - -#include -#include -#include -#include -#include "fsimpl.h" - -static void -fidclunk(Fid *fid) -{ - Fcall tx, rx; - - tx.type = Tclunk; - tx.fid = fid->fid; - fsrpc(fid->fs, &tx, &rx, 0); - _fsputfid(fid); -} - -void -fsclose(Fid *fid) -{ - /* maybe someday there will be a ref count */ - fidclunk(fid); -} diff --git a/src/libfs/create.c b/src/libfs/create.c deleted file mode 100644 index ef52a2a8..00000000 --- a/src/libfs/create.c +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include -#include -#include -#include "fsimpl.h" - -Fid* -fscreate(Fsys *fs, char *name, int mode, ulong perm) -{ - Fid *fid; - Fcall tx, rx; - - if((fid = fswalk(fs->root, name)) == nil) - return nil; - tx.type = Tcreate; - tx.fid = fid->fid; - tx.mode = mode; - tx.perm = perm; - if(fsrpc(fs, &tx, &rx, 0) < 0){ - fsclose(fid); - return nil; - } - fid->mode = mode; - return fid; -} diff --git a/src/libfs/dirread.c b/src/libfs/dirread.c deleted file mode 100644 index 0ca40645..00000000 --- a/src/libfs/dirread.c +++ /dev/null @@ -1,100 +0,0 @@ -/* Mostly copied from Plan 9's libc. */ - -#include -#include -#include -#include - -static -long -dirpackage(uchar *buf, long ts, Dir **d) -{ - char *s; - long ss, i, n, nn, m; - - *d = nil; - if(ts <= 0) - return 0; - - /* - * first find number of all stats, check they look like stats, & size all associated strings - */ - ss = 0; - n = 0; - for(i = 0; i < ts; i += m){ - m = BIT16SZ + GBIT16(&buf[i]); - if(statcheck(&buf[i], m) < 0) - break; - ss += m; - n++; - } - - if(i != ts) - return -1; - - *d = malloc(n * sizeof(Dir) + ss); - if(*d == nil) - return -1; - - /* - * then convert all buffers - */ - s = (char*)*d + n * sizeof(Dir); - nn = 0; - for(i = 0; i < ts; i += m){ - m = BIT16SZ + GBIT16((uchar*)&buf[i]); - if(nn >= n || convM2D(&buf[i], m, *d + nn, s) != m){ - free(*d); - *d = nil; - return -1; - } - nn++; - s += m; - } - - return nn; -} - -long -fsdirread(Fid *fid, Dir **d) -{ - uchar *buf; - long ts; - - buf = malloc(DIRMAX); - if(buf == nil) - return -1; - ts = fsread(fid, buf, DIRMAX); - if(ts >= 0) - ts = dirpackage(buf, ts, d); - free(buf); - return ts; -} - -long -fsdirreadall(Fid *fid, Dir **d) -{ - uchar *buf, *nbuf; - long n, ts; - - buf = nil; - ts = 0; - for(;;){ - nbuf = realloc(buf, ts+DIRMAX); - if(nbuf == nil){ - free(buf); - return -1; - } - buf = nbuf; - n = fsread(fid, buf+ts, DIRMAX); - if(n <= 0) - break; - ts += n; - } - if(ts >= 0) - ts = dirpackage(buf, ts, d); - free(buf); - if(ts == 0 && n < 0) - return -1; - return ts; -} diff --git a/src/libfs/fs.c b/src/libfs/fs.c deleted file mode 100644 index 9714ef60..00000000 --- a/src/libfs/fs.c +++ /dev/null @@ -1,309 +0,0 @@ -/* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */ -/* See COPYRIGHT */ - -#include -#include -#include -#include -#include -#include "fsimpl.h" - -static int _fssend(Mux*, void*); -static void *_fsrecv(Mux*); -static int _fsgettag(Mux*, void*); -static int _fssettag(Mux*, void*, uint); - -enum -{ - Fidchunk = 32 -}; - -Fsys* -fsinit(int fd) -{ - Fsys *fs; - - fmtinstall('F', fcallfmt); - fmtinstall('D', dirfmt); - fmtinstall('M', dirmodefmt); - - fs = mallocz(sizeof(Fsys), 1); - if(fs == nil) - return nil; - fs->fd = fd; - fs->ref = 1; - fs->mux.aux = fs; - fs->mux.mintag = 0; - fs->mux.maxtag = 256; - fs->mux.send = _fssend; - fs->mux.recv = _fsrecv; - fs->mux.gettag = _fsgettag; - fs->mux.settag = _fssettag; - fs->iorecv = ioproc(); - fs->iosend = ioproc(); - muxinit(&fs->mux); - return fs; -} - -Fid* -fsroot(Fsys *fs) -{ - /* N.B. no incref */ - return fs->root; -} - -Fsys* -fsmount(int fd, char *aname) -{ - int n; - char *user; - Fsys *fs; - - fs = fsinit(fd); - if(fs == nil) - return nil; - strcpy(fs->version, "9P2000"); - if((n = fsversion(fs, 8192, fs->version, sizeof fs->version)) < 0){ - Error: - fs->fd = -1; - fsunmount(fs); - return nil; - } - fs->msize = n; - - user = getuser(); - if((fs->root = fsattach(fs, nil, getuser(), aname)) == nil) - goto Error; - return fs; -} - -void -fsunmount(Fsys *fs) -{ - fsclose(fs->root); - fs->root = nil; - _fsdecref(fs); -} - -void -_fsdecref(Fsys *fs) -{ - Fid *f, **l, *next; - - qlock(&fs->lk); - --fs->ref; - //fprint(2, "fsdecref %p to %d\n", fs, fs->ref); - if(fs->ref == 0){ - close(fs->fd); - /* trim the list down to just the first in each chunk */ - for(l=&fs->freefid; *l; ){ - if((*l)->fid%Fidchunk == 0) - l = &(*l)->next; - else - *l = (*l)->next; - } - /* now free the list */ - for(f=fs->freefid; f; f=next){ - next = f->next; - free(f); - } - closeioproc(fs->iorecv); - closeioproc(fs->iosend); - free(fs); - return; - } - qunlock(&fs->lk); -} - -int -fsversion(Fsys *fs, int msize, char *version, int nversion) -{ - void *freep; - Fcall tx, rx; - - tx.tag = 0; - tx.type = Tversion; - tx.version = version; - tx.msize = msize; - - if(fsrpc(fs, &tx, &rx, &freep) < 0) - return -1; - strecpy(version, version+nversion, rx.version); - free(freep); - return rx.msize; -} - -Fid* -fsattach(Fsys *fs, Fid *afid, char *user, char *aname) -{ - Fcall tx, rx; - Fid *fid; - - if(aname == nil) - aname = ""; - - if((fid = _fsgetfid(fs)) == nil) - return nil; - - tx.tag = 0; - tx.type = Tattach; - tx.afid = afid ? afid->fid : NOFID; - tx.fid = fid->fid; - tx.uname = user; - tx.aname = aname; - - if(fsrpc(fs, &tx, &rx, 0) < 0){ - _fsputfid(fid); - return nil; - } - fid->qid = rx.qid; - return fid; -} - -int -fsrpc(Fsys *fs, Fcall *tx, Fcall *rx, void **freep) -{ - int n, nn; - void *tpkt, *rpkt; - - n = sizeS2M(tx); - tpkt = malloc(n); - if(freep) - *freep = nil; - if(tpkt == nil) - return -1; - //fprint(2, "<- %F\n", tx); - nn = convS2M(tx, tpkt, n); - if(nn != n){ - free(tpkt); - werrstr("libfs: sizeS2M convS2M mismatch"); - fprint(2, "%r\n"); - return -1; - } - rpkt = muxrpc(&fs->mux, tpkt); - free(tpkt); - if(rpkt == nil) - return -1; - n = GBIT32((uchar*)rpkt); - nn = convM2S(rpkt, n, rx); - if(nn != n){ - free(rpkt); - werrstr("libfs: convM2S packet size mismatch %d %d", n, nn); - fprint(2, "%r\n"); - return -1; - } - //fprint(2, "-> %F\n", rx); - if(rx->type == Rerror){ - werrstr("%s", rx->ename); - free(rpkt); - return -1; - } - if(rx->type != tx->type+1){ - werrstr("packet type mismatch -- tx %d rx %d", - tx->type, rx->type); - free(rpkt); - return -1; - } - if(freep) - *freep = rpkt; - else - free(rpkt); - return 0; -} - -Fid* -_fsgetfid(Fsys *fs) -{ - int i; - Fid *f; - - qlock(&fs->lk); - if(fs->freefid == nil){ - f = mallocz(sizeof(Fid)*Fidchunk, 1); - if(f == nil){ - qunlock(&fs->lk); - return nil; - } - for(i=0; inextfid++; - f[i].next = &f[i+1]; - f[i].fs = fs; - } - f[i-1].next = nil; - fs->freefid = f; - } - f = fs->freefid; - fs->freefid = f->next; - fs->ref++; - qunlock(&fs->lk); - return f; -} - -void -_fsputfid(Fid *f) -{ - Fsys *fs; - - fs = f->fs; - qlock(&fs->lk); - f->next = fs->freefid; - fs->freefid = f; - qunlock(&fs->lk); - _fsdecref(fs); -} - -static int -_fsgettag(Mux *mux, void *pkt) -{ - return GBIT16((uchar*)pkt+5); -} - -static int -_fssettag(Mux *mux, void *pkt, uint tag) -{ - PBIT16((uchar*)pkt+5, tag); - return 0; -} - -static int -_fssend(Mux *mux, void *pkt) -{ - Fsys *fs; - - fs = mux->aux; - return iowrite(fs->iosend, fs->fd, pkt, GBIT32((uchar*)pkt)); -} - -static void* -_fsrecv(Mux *mux) -{ - uchar *pkt; - uchar buf[4]; - int n, nfd; - Fsys *fs; - - fs = mux->aux; - n = ioreadn(fs->iorecv, fs->fd, buf, 4); - if(n != 4) - return nil; - n = GBIT32(buf); - pkt = malloc(n+4); - if(pkt == nil){ - fprint(2, "libfs out of memory reading 9p packet; here comes trouble\n"); - return nil; - } - PBIT32(pkt, n); - if(ioreadn(fs->iorecv, fs->fd, pkt+4, n-4) != n-4){ - free(pkt); - return nil; - } - if(pkt[4] == Ropenfd){ - if((nfd=iorecvfd(fs->iorecv, fs->fd)) < 0){ - fprint(2, "recv fd error: %r\n"); - free(pkt); - return nil; - } - PBIT32(pkt+n-4, nfd); - } - return pkt; -} diff --git a/src/libfs/fsimpl.h b/src/libfs/fsimpl.h deleted file mode 100644 index 59cecaa5..00000000 --- a/src/libfs/fsimpl.h +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */ -/* See COPYRIGHT */ - -#include - -typedef struct Queue Queue; -Queue *_fsqalloc(void); -int _fsqsend(Queue*, void*); -void *_fsqrecv(Queue*); -void _fsqhangup(Queue*); -void *_fsnbqrecv(Queue*); - -#include -struct Fsys -{ - char version[20]; - int msize; - QLock lk; - int fd; - int ref; - Mux mux; - Fid *root; - Queue *txq; - Queue *rxq; - Fid *freefid; - int nextfid; - Ioproc *iorecv; - Ioproc *iosend; -}; - -struct Fid -{ - int fid; - int mode; - Fid *next; - QLock lk; - Fsys *fs; - Qid qid; - vlong offset; -}; - -void _fsdecref(Fsys*); -void _fsputfid(Fid*); -Fid *_fsgetfid(Fsys*); - diff --git a/src/libfs/mkfile b/src/libfs/mkfile deleted file mode 100644 index 17d197ec..00000000 --- a/src/libfs/mkfile +++ /dev/null @@ -1,23 +0,0 @@ -<$PLAN9/src/mkhdr - -LIB=libfs.a - -OFILES=\ - close.$O\ - create.$O\ - dirread.$O\ - fs.$O\ - ns.$O\ - open.$O\ - openfd.$O\ - read.$O\ - stat.$O\ - walk.$O\ - write.$O\ - wstat.$O\ - -HFILES=\ - $PLAN9/include/fs.h\ - $PLAN9/include/mux.h\ - -<$PLAN9/src/mksyslib diff --git a/src/libfs/ns.c b/src/libfs/ns.c deleted file mode 100644 index 763080ba..00000000 --- a/src/libfs/ns.c +++ /dev/null @@ -1,40 +0,0 @@ -#include -#include -#include -#include -#include - -Fsys* -nsmount(char *name, char *aname) -{ - char *addr, *ns; - int fd; - Fsys *fs; - - ns = getns(); - if(ns == nil) - return nil; - - addr = smprint("unix!%s/%s", ns, name); - free(ns); - if(addr == nil) - return nil; - - fd = dial(addr, 0, 0, 0); - if(fd < 0){ - werrstr("dial %s: %r", addr); - free(addr); - return nil; - } - free(addr); - - fcntl(fd, F_SETFL, FD_CLOEXEC); - - fs = fsmount(fd, aname); - if(fs == nil){ - close(fd); - return nil; - } - - return fs; -} diff --git a/src/libfs/open.c b/src/libfs/open.c deleted file mode 100644 index 458c5dac..00000000 --- a/src/libfs/open.c +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include -#include -#include -#include "fsimpl.h" - -Fid* -fsopen(Fsys *fs, char *name, int mode) -{ - Fid *fid; - Fcall tx, rx; - - if((fid = fswalk(fs->root, name)) == nil) - return nil; - tx.type = Topen; - tx.fid = fid->fid; - tx.mode = mode; - if(fsrpc(fs, &tx, &rx, 0) < 0){ - fsclose(fid); - return nil; - } - fid->mode = mode; - return fid; -} diff --git a/src/libfs/openfd.c b/src/libfs/openfd.c deleted file mode 100644 index 9e48c791..00000000 --- a/src/libfs/openfd.c +++ /dev/null @@ -1,26 +0,0 @@ -#include -#include -#include -#include -#include "fsimpl.h" - -int -fsopenfd(Fsys *fs, char *name, int mode) -{ - Fid *fid; - Fcall tx, rx; - - if((fid = fswalk(fs->root, name)) == nil) - return -1; - tx.type = Topenfd; - tx.fid = fid->fid; - tx.mode = mode&~OCEXEC; - if(fsrpc(fs, &tx, &rx, 0) < 0){ - fsclose(fid); - return -1; - } - _fsputfid(fid); - if(mode&OCEXEC && rx.unixfd>=0) - fcntl(rx.unixfd, F_SETFL, FD_CLOEXEC); - return rx.unixfd; -} diff --git a/src/libfs/read.c b/src/libfs/read.c deleted file mode 100644 index f868e123..00000000 --- a/src/libfs/read.c +++ /dev/null @@ -1,72 +0,0 @@ -/* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */ -/* See COPYRIGHT */ - -#include -#include -#include -#include -#include "fsimpl.h" - -long -fspread(Fid *fid, void *buf, long n, vlong offset) -{ - Fcall tx, rx; - void *freep; - uint msize; - - msize = fid->fs->msize - IOHDRSZ; - if(n > msize) - n = msize; - tx.type = Tread; - tx.fid = fid->fid; - if(offset == -1){ - qlock(&fid->lk); - tx.offset = fid->offset; - qunlock(&fid->lk); - }else - tx.offset = offset; - tx.count = n; - - if(fsrpc(fid->fs, &tx, &rx, &freep) < 0) - return -1; - if(rx.type == Rerror){ - werrstr("%s", rx.ename); - free(freep); - return -1; - } - if(rx.count){ - memmove(buf, rx.data, rx.count); - if(offset == -1){ - qlock(&fid->lk); - fid->offset += rx.count; - qunlock(&fid->lk); - } - } - free(freep); - - return rx.count; -} - -long -fsread(Fid *fid, void *buf, long n) -{ - return fspread(fid, buf, n, -1); -} - -long -fsreadn(Fid *fid, void *buf, long n) -{ - long tot, nn; - - for(tot=0; tot -#include -#include -#include -#include "fsimpl.h" - -Dir* -fsdirstat(Fsys *fs, char *name) -{ - Dir *d; - Fid *fid; - - if((fid = fswalk(fs->root, name)) == nil) - return nil; - - d = fsdirfstat(fid); - fsclose(fid); - return d; -} - -Dir* -fsdirfstat(Fid *fid) -{ - Dir *d; - Fsys *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; -} - diff --git a/src/libfs/walk.c b/src/libfs/walk.c deleted file mode 100644 index ad4eddc7..00000000 --- a/src/libfs/walk.c +++ /dev/null @@ -1,73 +0,0 @@ -/* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */ -/* See COPYRIGHT */ - -#include -#include -#include -#include -#include "fsimpl.h" - -Fid* -fswalk(Fid *fid, char *oname) -{ - char *freep, *name; - int i, nwalk; - char *p; - Fid *wfid; - Fcall tx, rx; - - freep = nil; - name = oname; - if(name){ - freep = malloc(strlen(name)+1); - if(freep == nil) - return nil; - strcpy(freep, name); - name = freep; - } - - if((wfid = _fsgetfid(fid->fs)) == nil){ - free(freep); - return nil; - } - - nwalk = 0; - do{ - /* collect names */ - for(i=0; name && *name && i < MAXWELEM; ){ - p = name; - name = strchr(name, '/'); - if(name) - *name++ = 0; - if(*p == 0) - continue; - tx.wname[i++] = p; - } - - /* do a walk */ - tx.type = Twalk; - tx.fid = nwalk ? wfid->fid : fid->fid; - tx.newfid = wfid->fid; - tx.nwname = i; - if(fsrpc(fid->fs, &tx, &rx, 0) < 0){ - Error: - free(freep); - if(nwalk) - fsclose(wfid); - else - _fsputfid(wfid); - return nil; - } - if(rx.nwqid != tx.nwname){ - /* XXX lame error */ - werrstr("file '%s' not found", oname); - goto Error; - } - if(rx.nwqid == 0) - wfid->qid = fid->qid; - else - wfid->qid = rx.wqid[rx.nwqid-1]; - nwalk++; - }while(name && *name); - return wfid; -} diff --git a/src/libfs/write.c b/src/libfs/write.c deleted file mode 100644 index e4b6253d..00000000 --- a/src/libfs/write.c +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */ -/* See COPYRIGHT */ - -#include -#include -#include -#include -#include "fsimpl.h" - -static long -_fspwrite(Fid *fid, void *buf, long n, vlong offset) -{ - Fcall tx, rx; - void *freep; - - tx.type = Twrite; - tx.fid = fid->fid; - if(offset == -1){ - qlock(&fid->lk); - tx.offset = fid->offset; - qunlock(&fid->lk); - }else - tx.offset = offset; - tx.count = n; - tx.data = buf; - - if(fsrpc(fid->fs, &tx, &rx, &freep) < 0) - return -1; - if(rx.type == Rerror){ - werrstr("%s", rx.ename); - free(freep); - return -1; - } - if(offset == -1 && rx.count){ - qlock(&fid->lk); - fid->offset += rx.count; - qunlock(&fid->lk); - } - free(freep); - return rx.count; -} - -long -fspwrite(Fid *fid, void *buf, long n, vlong offset) -{ - long tot, want, got, first; - uint msize; - - msize = fid->fs->msize - IOHDRSZ; - tot = 0; - first = 1; - while(tot < n || first){ - want = n - tot; - if(want > msize) - want = msize; - got = _fspwrite(fid, buf, want, offset); - first = 0; - if(got < 0){ - if(tot == 0) - return got; - break; - } - tot += got; - if(offset != -1) - offset += got; - } - return tot; -} - -long -fswrite(Fid *fid, void *buf, long n) -{ - return fspwrite(fid, buf, n, -1); -} diff --git a/src/libfs/wstat.c b/src/libfs/wstat.c deleted file mode 100644 index f1f14ea5..00000000 --- a/src/libfs/wstat.c +++ /dev/null @@ -1,49 +0,0 @@ -/* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */ -/* See COPYRIGHT */ - -#include -#include -#include -#include -#include "fsimpl.h" - -int -fsdirwstat(Fsys *fs, char *name, Dir *d) -{ - int n; - Fid *fid; - - if((fid = fswalk(fs->root, name)) == nil) - return -1; - - n = fsdirfwstat(fid, d); - fsclose(fid); - return n; -} - -int -fsdirfwstat(Fid *fid, Dir *d) -{ - uchar *a; - int n, nn; - Fcall tx, rx; - - n = sizeD2M(d); - a = malloc(n); - if(a == nil) - return -1; - nn = convD2M(d, a, n); - if(n != nn){ - werrstr("convD2M and sizeD2M disagree"); - free(a); - return -1; - } - - tx.type = Twstat; - tx.fid = fid->fid; - tx.stat = a; - tx.nstat = n; - n = fsrpc(fid->fs, &tx, &rx, 0); - free(a); - return n; -} -- cgit v1.2.3