tremove libfs.  now lib9pclient - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 2600337aa704efbeba8201e88147a764b4fd2b90
 (DIR) parent acc021b8f8c727c0f04f33615354170fd7bccd0c
 (HTM) Author: rsc <devnull@localhost>
       Date:   Sun,  2 Jan 2005 19:46:12 +0000
       
       remove libfs.  now lib9pclient
       
       Diffstat:
         D src/libfs/COPYRIGHT                 |      27 ---------------------------
         D src/libfs/close.c                   |      26 --------------------------
         D src/libfs/create.c                  |      25 -------------------------
         D src/libfs/dirread.c                 |     100 -------------------------------
         D src/libfs/fs.c                      |     309 -------------------------------
         D src/libfs/fsimpl.h                  |      45 -------------------------------
         D src/libfs/mkfile                    |      23 -----------------------
         D src/libfs/ns.c                      |      40 -------------------------------
         D src/libfs/open.c                    |      24 ------------------------
         D src/libfs/openfd.c                  |      26 --------------------------
         D src/libfs/read.c                    |      72 -------------------------------
         D src/libfs/stat.c                    |      54 -------------------------------
         D src/libfs/walk.c                    |      73 -------------------------------
         D src/libfs/write.c                   |      74 -------------------------------
         D src/libfs/wstat.c                   |      49 -------------------------------
       
       15 files changed, 0 insertions(+), 967 deletions(-)
       ---
 (DIR) diff --git a/src/libfs/COPYRIGHT b/src/libfs/COPYRIGHT
       t@@ -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.
       -
 (DIR) diff --git a/src/libfs/close.c b/src/libfs/close.c
       t@@ -1,26 +0,0 @@
       -/* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */
       -/* See COPYRIGHT */
       -
       -#include <u.h>
       -#include <libc.h>
       -#include <fcall.h>
       -#include <fs.h>
       -#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);
       -}
 (DIR) diff --git a/src/libfs/create.c b/src/libfs/create.c
       t@@ -1,25 +0,0 @@
       -#include <u.h>
       -#include <libc.h>
       -#include <fcall.h>
       -#include <fs.h>
       -#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;
       -}
 (DIR) diff --git a/src/libfs/dirread.c b/src/libfs/dirread.c
       t@@ -1,100 +0,0 @@
       -/* Mostly copied from Plan 9's libc. */
       -
       -#include <u.h>
       -#include <libc.h>
       -#include <fcall.h>
       -#include <fs.h>
       -
       -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;
       -}
 (DIR) diff --git a/src/libfs/fs.c b/src/libfs/fs.c
       t@@ -1,309 +0,0 @@
       -/* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */
       -/* See COPYRIGHT */
       -
       -#include <u.h>
       -#include <libc.h>
       -#include <fcall.h>
       -#include <fs.h>
       -#include <thread.h>
       -#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; i<Fidchunk; i++){
       -                        f[i].fid = fs->nextfid++;
       -                        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;
       -}
 (DIR) diff --git a/src/libfs/fsimpl.h b/src/libfs/fsimpl.h
       t@@ -1,45 +0,0 @@
       -/* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */
       -/* See COPYRIGHT */
       -
       -#include <thread.h>
       -
       -typedef struct Queue Queue;
       -Queue *_fsqalloc(void);
       -int _fsqsend(Queue*, void*);
       -void *_fsqrecv(Queue*);
       -void _fsqhangup(Queue*);
       -void *_fsnbqrecv(Queue*);
       -
       -#include <mux.h>
       -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*);
       -
 (DIR) diff --git a/src/libfs/mkfile b/src/libfs/mkfile
       t@@ -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
 (DIR) diff --git a/src/libfs/ns.c b/src/libfs/ns.c
       t@@ -1,40 +0,0 @@
       -#include <u.h>
       -#include <libc.h>
       -#include <fcall.h>
       -#include <fs.h>
       -#include <ctype.h>
       -
       -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;
       -}
 (DIR) diff --git a/src/libfs/open.c b/src/libfs/open.c
       t@@ -1,24 +0,0 @@
       -#include <u.h>
       -#include <libc.h>
       -#include <fcall.h>
       -#include <fs.h>
       -#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;
       -}
 (DIR) diff --git a/src/libfs/openfd.c b/src/libfs/openfd.c
       t@@ -1,26 +0,0 @@
       -#include <u.h>
       -#include <libc.h>
       -#include <fcall.h>
       -#include <fs.h>
       -#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;
       -}
 (DIR) diff --git a/src/libfs/read.c b/src/libfs/read.c
       t@@ -1,72 +0,0 @@
       -/* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */
       -/* See COPYRIGHT */
       -
       -#include <u.h>
       -#include <libc.h>
       -#include <fcall.h>
       -#include <fs.h>
       -#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<n; tot+=nn){
       -                nn = fsread(fid, (char*)buf+tot, n-tot);
       -                if(nn <= 0){
       -                        if(tot == 0)
       -                                return nn;
       -                        break;
       -                }
       -        }
       -        return tot;
       -}
       -                        
       -
 (DIR) diff --git a/src/libfs/stat.c b/src/libfs/stat.c
       t@@ -1,54 +0,0 @@
       -/* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */
       -/* See COPYRIGHT */
       -
       -#include <u.h>
       -#include <libc.h>
       -#include <fcall.h>
       -#include <fs.h>
       -#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;
       -}
       -
 (DIR) diff --git a/src/libfs/walk.c b/src/libfs/walk.c
       t@@ -1,73 +0,0 @@
       -/* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */
       -/* See COPYRIGHT */
       -
       -#include <u.h>
       -#include <libc.h>
       -#include <fcall.h>
       -#include <fs.h>
       -#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;
       -}
 (DIR) diff --git a/src/libfs/write.c b/src/libfs/write.c
       t@@ -1,74 +0,0 @@
       -/* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */
       -/* See COPYRIGHT */
       -
       -#include <u.h>
       -#include <libc.h>
       -#include <fcall.h>
       -#include <fs.h>
       -#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);
       -}
 (DIR) diff --git a/src/libfs/wstat.c b/src/libfs/wstat.c
       t@@ -1,49 +0,0 @@
       -/* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */
       -/* See COPYRIGHT */
       -
       -#include <u.h>
       -#include <libc.h>
       -#include <fcall.h>
       -#include <fs.h>
       -#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;
       -}