commit 73a5509ae929e41ca0047254a880c8efd4aa72a1 from: rsc date: Sun Jul 23 02:55:34 2006 UTC more functions commit - 9b3357a896417eb166cf94dd2a04aa391fef21c8 commit + 73a5509ae929e41ca0047254a880c8efd4aa72a1 blob - de9d2691971e5abf8c5aecf40e2a8d4fdae71f36 blob + 52b2cb963f20aa1e7c20024e6fb5db87b6d6e6e2 --- include/9pclient.h +++ include/9pclient.h @@ -47,8 +47,15 @@ CFid *fscreate(CFsys*, char*, int, ulong); int fsaccess(CFsys*, char*, int); int fsvprint(CFid*, char*, va_list); int fsprint(CFid*, char*, ...); +Qid fsqid(CFid*); +/* manipulate unopened fids */ +CFid *fswalk(CFid*, char*); +int fsfopen(CFid*, int); +int fsfcreate(CFid*, char*, int, ulong); + extern int chatty9pclient; +extern int eofkill9pclient; #ifdef __cplusplus } blob - 9ef37d3660a5229300c527593adc2469a6114301 blob + 1bb868cced37d3dd4d76cf72a88525d29f9cdd20 --- man/man3/9pclient.3 +++ man/man3/9pclient.3 @@ -1,6 +1,6 @@ .TH 9PCLIENT 3 .SH NAME -CFid, CFsys, fsinit, fsmount, fsroot, fssetroot, fsunmount, nsinit, nsmount, fsversion, fsauth, fsattach, fsclose, fscreate, fsremove, fsfremove, fsaccess, fsdirread, fsdirreadall, fsdirstat, fsdirfstat, fsdirwstat, fsdirfwstat, fsopen, nsopen, fsopenfd, fspread, fspwrite, fsread, fsreadn, fsseek, fswrite, fsprint, fsvprint \- 9P client library +CFid, CFsys, fsinit, fsmount, fsroot, fssetroot, fsunmount, nsinit, nsmount, fsversion, fsauth, fsattach, fsclose, fscreate, fsfcreate, fsremove, fsfremove, fsaccess, fsdirread, fsdirreadall, fsdirstat, fsdirfstat, fsdirwstat, fsdirfwstat, fsopen, fsfopen, nsopen, fsopenfd, fspread, fspwrite, fsread, fsreadn, fsseek, fswrite, fsprint, fsvprint \- 9P client library .SH SYNOPSIS .B #include .PP @@ -50,6 +50,9 @@ void fsclose(CFid *fid) CFid* fscreate(CFsys *fs, char *path, int mode, ulong perm) .PP .B +int fsfcreate(CFid *fid, char *path, int mode, ulong perm) +.PP +.B int fsremove(CFSys *fs, char *path) .PP .B @@ -62,6 +65,9 @@ int fsaccess(CFsys *fs, char *path, int amode) CFid* fsopen(CFsys *fs, char *path, int mode) .PP .B +int fsfopen(CFid *fid, char *path, int mode) +.PP +.B long fspread(CFid *fid, void *buf, long n, vlong offset) .PP .B @@ -86,6 +92,9 @@ int fsvprint(CFid *fid, char *fmt, ...) vlong fsseek(CFid *Fid, vlong n, int type) .PP .B +Qid fsqid(CFid *fid) +.PP +.B long fsdirread(CFid *fid, Dir **d) .PP .B @@ -108,6 +117,12 @@ int fsopenfd(CFsys *fs, char *path, int mode) .PP .B CFsys* nsopen(char *name, char *aname, char *path, int mode) +.PP +.B +extern int chatty9pclient; +.PP +.B +extern int eofkill9pclient; .SH DESCRIPTION The .I 9pclient @@ -218,6 +233,9 @@ Fids are not reference counted: when .I fsclose is called, the clunk transaction and freeing of storage happen immediately. +Despite its name, +.I fsclose +can be used to clunk fids that are not open for I/O. .PP .I Fscreate and @@ -249,7 +267,25 @@ dot .RB ( . ) are ignored. .PP -Once opened, these fids can be read and written using +Alternately, +.I fswalk +walks from a fid to a given name +to create a new fid. +The name may be nil, corresponding to a walk with no names. +Otherwise the name is taken as a slash-separated sequence +of path elements. +.I Fsfcreate +and +.I fsfopen +issue +.I create +and +.I open +transactions using the passed fid argument, +which should have been obtained by calling +.IR fswalk . +.PP +Once opened, fids can be read and written using .I fspread and .IR fspwrite , @@ -291,6 +327,17 @@ repeatedly to obtain exactly .I n bytes of data, unless it encounters end-of-file or an error. .PP +.IR Attach , +.IR walk , +.IR create , +and +.I open +transactions include in their replies an updated qid for the +fid being manipulated. +.I Fsqid +returns the most recent qid returned by one of these transactions +for the given fid. +.PP .I Fsaccess behaves like Unix's .IR access (2). @@ -386,6 +433,18 @@ opens a single file on a name space server: it runs .IR fsopen , and then .IR fsunmount . +.PP +If the +.B chatty9pclient +flag is set, the library prints all 9P messages +to standard error. +If the +.B eofkill9pclient +flag is set, the library calls +.I threadexitsall +(see +.IR thread (3)) +when it detects EOF on a 9P connection. .SH SOURCE .B \*9/src/lib9pclient .SH SEE ALSO blob - 350dee62bc65c6ae26e2e27f3b2d2da01e71e23b blob + 9e1d5c257d959d4e4b30dfe5bf6e0ef409a31acc --- src/lib9pclient/create.c +++ 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; } blob - 44f2f47408bc238290dcc9e010e55b09d73dcbc8 blob + c6b1c3e92b016ce44aefa50b19848bf2e98879bf --- src/lib9pclient/fs.c +++ 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; +} blob - 2317bbb772b231196a51c45022773eaeef7ac6b7 blob + 2e8e343cd9192581e44bce22e0abf44490bc9bde --- src/lib9pclient/open.c +++ 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); blob - ef26e5c457960bedda083a475c16ba390d885cf4 blob + 68762e294191552f26cea5c31fb29d211a8c4b74 --- src/lib9pclient/openfd.c +++ 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; blob - 1eb77cdccf306159a45af8538b159bae8fd43a74 blob + b0ce2da8d01897ce22817faa9afad4452e344441 --- src/lib9pclient/remove.c +++ 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); } blob - cb5d8261cbc99b5a13038f46e63d1e987f587cbc blob + 9c69446aa74e2705649db85b7a7d0cffc508c062 --- src/lib9pclient/stat.c +++ 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); blob - 32a2fd7b52cb45650c643818d286eff483b55c29 blob + 4ef426d9d84fa42a11183eb2138893f220387e04 --- src/lib9pclient/walk.c +++ 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; blob - 27a28740210e45ed6fb5d63a070d96f0f2e47c4c blob + 26e44f8e86cdb3926b4149378640caccba8a9774 --- src/lib9pclient/wstat.c +++ 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);