From 73a5509ae929e41ca0047254a880c8efd4aa72a1 Mon Sep 17 00:00:00 2001 From: rsc Date: Sun, 23 Jul 2006 02:55:34 +0000 Subject: more functions --- src/lib9pclient/create.c | 33 ++++++++++++++++++++------------- src/lib9pclient/fs.c | 18 ++++++++++++++++-- src/lib9pclient/open.c | 22 ++++++++++++++++------ src/lib9pclient/openfd.c | 2 +- src/lib9pclient/remove.c | 2 +- src/lib9pclient/stat.c | 2 +- src/lib9pclient/walk.c | 2 +- src/lib9pclient/wstat.c | 2 +- 8 files changed, 57 insertions(+), 26 deletions(-) (limited to 'src/lib9pclient') diff --git a/src/lib9pclient/create.c b/src/lib9pclient/create.c index 350dee62..9e1d5c25 100644 --- a/src/lib9pclient/create.c +++ b/src/lib9pclient/create.c @@ -4,11 +4,26 @@ #include <9pclient.h> #include "fsimpl.h" +int +fsfcreate(CFid *fid, char *name, int mode, ulong perm) +{ + Fcall tx, rx; + + tx.type = Tcreate; + tx.name = name; + tx.fid = fid->fid; + tx.mode = mode; + tx.perm = perm; + if(_fsrpc(fid->fs, &tx, &rx, 0) < 0) + return -1; + fid->mode = mode; + return 0; +} + CFid* fscreate(CFsys *fs, char *name, int mode, ulong perm) { CFid *fid; - Fcall tx, rx; char *p, *dir, *elem; p = strrchr(name, '/'); @@ -21,24 +36,16 @@ fscreate(CFsys *fs, char *name, int mode, ulong perm) elem = p+1; } - if((fid = _fswalk(fs->root, dir)) == nil){ + if((fid = fswalk(fs->root, dir)) == nil){ if(p) *p = '/'; return nil; } - tx.type = Tcreate; - tx.name = elem; - tx.fid = fid->fid; - tx.mode = mode; - tx.perm = perm; - if(_fsrpc(fs, &tx, &rx, 0) < 0){ - if(p) - *p = '/'; + if(p) + *p = '/'; + if(fsfcreate(fid, elem, mode, perm) < 0){ fsclose(fid); return nil; } - if(p) - *p = '/'; - fid->mode = mode; return fid; } diff --git a/src/lib9pclient/fs.c b/src/lib9pclient/fs.c index 44f2f474..c6b1c3e9 100644 --- a/src/lib9pclient/fs.c +++ b/src/lib9pclient/fs.c @@ -14,6 +14,7 @@ static int _fsgettag(Mux*, void*); static int _fssettag(Mux*, void*, uint); int chatty9pclient; +int eofkill9pclient; enum { @@ -318,9 +319,13 @@ static int _fssend(Mux *mux, void *pkt) { CFsys *fs; + int n; fs = mux->aux; - return iowrite(fs->iosend, fs->fd, pkt, GBIT32((uchar*)pkt)); + n = iowrite(fs->iosend, fs->fd, pkt, GBIT32((uchar*)pkt)); + if(n < 0 && eofkill9pclient) + threadexitsall(nil); + return n; } static void* @@ -333,8 +338,11 @@ _fsrecv(Mux *mux) fs = mux->aux; n = ioreadn(fs->iorecv, fs->fd, buf, 4); - if(n != 4) + if(n != 4){ + if(eofkill9pclient) + threadexitsall(nil); return nil; + } n = GBIT32(buf); pkt = malloc(n+4); if(pkt == nil){ @@ -356,3 +364,9 @@ _fsrecv(Mux *mux) } return pkt; } + +Qid +fsqid(CFid *fid) +{ + return fid->qid; +} diff --git a/src/lib9pclient/open.c b/src/lib9pclient/open.c index 2317bbb7..2e8e343c 100644 --- a/src/lib9pclient/open.c +++ b/src/lib9pclient/open.c @@ -4,19 +4,29 @@ #include <9pclient.h> #include "fsimpl.h" +int +fsfopen(CFid *fid, int mode) +{ + Fcall tx, rx; + + tx.type = Topen; + tx.fid = fid->fid; + tx.mode = mode; + if(_fsrpc(fid->fs, &tx, &rx, 0) < 0) + return -1; + fid->mode = mode; + return 0; +} + CFid* fsopen(CFsys *fs, char *name, int mode) { char e[ERRMAX]; CFid *fid; - Fcall tx, rx; - if((fid = _fswalk(fs->root, name)) == nil) + 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){ + if(fsfopen(fid, mode) < 0){ rerrstr(e, sizeof e); fsclose(fid); errstr(e, sizeof e); diff --git a/src/lib9pclient/openfd.c b/src/lib9pclient/openfd.c index ef26e5c4..68762e29 100644 --- a/src/lib9pclient/openfd.c +++ b/src/lib9pclient/openfd.c @@ -10,7 +10,7 @@ fsopenfd(CFsys *fs, char *name, int mode) CFid *fid; Fcall tx, rx; - if((fid = _fswalk(fs->root, name)) == nil) + if((fid = fswalk(fs->root, name)) == nil) return -1; tx.type = Topenfd; tx.fid = fid->fid; diff --git a/src/lib9pclient/remove.c b/src/lib9pclient/remove.c index 1eb77cdc..b0ce2da8 100644 --- a/src/lib9pclient/remove.c +++ b/src/lib9pclient/remove.c @@ -12,7 +12,7 @@ fsremove(CFsys *fs, char *name) { CFid *fid; - if((fid = _fswalk(fs->root, name)) == nil) + if((fid = fswalk(fs->root, name)) == nil) return -1; return fsfremove(fid); } diff --git a/src/lib9pclient/stat.c b/src/lib9pclient/stat.c index cb5d8261..9c69446a 100644 --- a/src/lib9pclient/stat.c +++ b/src/lib9pclient/stat.c @@ -13,7 +13,7 @@ fsdirstat(CFsys *fs, char *name) Dir *d; CFid *fid; - if((fid = _fswalk(fs->root, name)) == nil) + if((fid = fswalk(fs->root, name)) == nil) return nil; d = fsdirfstat(fid); diff --git a/src/lib9pclient/walk.c b/src/lib9pclient/walk.c index 32a2fd7b..4ef426d9 100644 --- a/src/lib9pclient/walk.c +++ b/src/lib9pclient/walk.c @@ -8,7 +8,7 @@ #include "fsimpl.h" CFid* -_fswalk(CFid *fid, char *oname) +fswalk(CFid *fid, char *oname) { char *freep, *name; int i, nwalk; diff --git a/src/lib9pclient/wstat.c b/src/lib9pclient/wstat.c index 27a28740..26e44f8e 100644 --- a/src/lib9pclient/wstat.c +++ b/src/lib9pclient/wstat.c @@ -13,7 +13,7 @@ fsdirwstat(CFsys *fs, char *name, Dir *d) int n; CFid *fid; - if((fid = _fswalk(fs->root, name)) == nil) + if((fid = fswalk(fs->root, name)) == nil) return -1; n = fsdirfwstat(fid, d); -- cgit v1.2.3