more functions

This commit is contained in:
rsc 2006-07-23 02:55:34 +00:00
parent 9b3357a896
commit 73a5509ae9
10 changed files with 126 additions and 29 deletions

View file

@ -47,8 +47,15 @@ CFid *fscreate(CFsys*, char*, int, ulong);
int fsaccess(CFsys*, char*, int); int fsaccess(CFsys*, char*, int);
int fsvprint(CFid*, char*, va_list); int fsvprint(CFid*, char*, va_list);
int fsprint(CFid*, char*, ...); 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 chatty9pclient;
extern int eofkill9pclient;
#ifdef __cplusplus #ifdef __cplusplus
} }

View file

@ -1,6 +1,6 @@
.TH 9PCLIENT 3 .TH 9PCLIENT 3
.SH NAME .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 .SH SYNOPSIS
.B #include <u.h> .B #include <u.h>
.PP .PP
@ -50,6 +50,9 @@ void fsclose(CFid *fid)
CFid* fscreate(CFsys *fs, char *path, int mode, ulong perm) CFid* fscreate(CFsys *fs, char *path, int mode, ulong perm)
.PP .PP
.B .B
int fsfcreate(CFid *fid, char *path, int mode, ulong perm)
.PP
.B
int fsremove(CFSys *fs, char *path) int fsremove(CFSys *fs, char *path)
.PP .PP
.B .B
@ -62,6 +65,9 @@ int fsaccess(CFsys *fs, char *path, int amode)
CFid* fsopen(CFsys *fs, char *path, int mode) CFid* fsopen(CFsys *fs, char *path, int mode)
.PP .PP
.B .B
int fsfopen(CFid *fid, char *path, int mode)
.PP
.B
long fspread(CFid *fid, void *buf, long n, vlong offset) long fspread(CFid *fid, void *buf, long n, vlong offset)
.PP .PP
.B .B
@ -86,6 +92,9 @@ int fsvprint(CFid *fid, char *fmt, ...)
vlong fsseek(CFid *Fid, vlong n, int type) vlong fsseek(CFid *Fid, vlong n, int type)
.PP .PP
.B .B
Qid fsqid(CFid *fid)
.PP
.B
long fsdirread(CFid *fid, Dir **d) long fsdirread(CFid *fid, Dir **d)
.PP .PP
.B .B
@ -108,6 +117,12 @@ int fsopenfd(CFsys *fs, char *path, int mode)
.PP .PP
.B .B
CFsys* nsopen(char *name, char *aname, char *path, int mode) CFsys* nsopen(char *name, char *aname, char *path, int mode)
.PP
.B
extern int chatty9pclient;
.PP
.B
extern int eofkill9pclient;
.SH DESCRIPTION .SH DESCRIPTION
The The
.I 9pclient .I 9pclient
@ -218,6 +233,9 @@ Fids are not reference counted: when
.I fsclose .I fsclose
is called, the clunk transaction and freeing of storage is called, the clunk transaction and freeing of storage
happen immediately. happen immediately.
Despite its name,
.I fsclose
can be used to clunk fids that are not open for I/O.
.PP .PP
.I Fscreate .I Fscreate
and and
@ -249,7 +267,25 @@ dot
.RB ( . ) .RB ( . )
are ignored. are ignored.
.PP .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 .I fspread
and and
.IR fspwrite , .IR fspwrite ,
@ -291,6 +327,17 @@ repeatedly to obtain exactly
.I n .I n
bytes of data, unless it encounters end-of-file or an error. bytes of data, unless it encounters end-of-file or an error.
.PP .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 .I Fsaccess
behaves like Unix's behaves like Unix's
.IR access (2). .IR access (2).
@ -386,6 +433,18 @@ opens a single file on a name space server: it runs
.IR fsopen , .IR fsopen ,
and then and then
.IR fsunmount . .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 .SH SOURCE
.B \*9/src/lib9pclient .B \*9/src/lib9pclient
.SH SEE ALSO .SH SEE ALSO

View file

@ -4,11 +4,26 @@
#include <9pclient.h> #include <9pclient.h>
#include "fsimpl.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* CFid*
fscreate(CFsys *fs, char *name, int mode, ulong perm) fscreate(CFsys *fs, char *name, int mode, ulong perm)
{ {
CFid *fid; CFid *fid;
Fcall tx, rx;
char *p, *dir, *elem; char *p, *dir, *elem;
p = strrchr(name, '/'); p = strrchr(name, '/');
@ -21,24 +36,16 @@ fscreate(CFsys *fs, char *name, int mode, ulong perm)
elem = p+1; elem = p+1;
} }
if((fid = _fswalk(fs->root, dir)) == nil){ if((fid = fswalk(fs->root, dir)) == nil){
if(p) if(p)
*p = '/'; *p = '/';
return nil; 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) if(p)
*p = '/'; *p = '/';
if(fsfcreate(fid, elem, mode, perm) < 0){
fsclose(fid); fsclose(fid);
return nil; return nil;
} }
if(p)
*p = '/';
fid->mode = mode;
return fid; return fid;
} }

View file

@ -14,6 +14,7 @@ static int _fsgettag(Mux*, void*);
static int _fssettag(Mux*, void*, uint); static int _fssettag(Mux*, void*, uint);
int chatty9pclient; int chatty9pclient;
int eofkill9pclient;
enum enum
{ {
@ -318,9 +319,13 @@ static int
_fssend(Mux *mux, void *pkt) _fssend(Mux *mux, void *pkt)
{ {
CFsys *fs; CFsys *fs;
int n;
fs = mux->aux; 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* static void*
@ -333,8 +338,11 @@ _fsrecv(Mux *mux)
fs = mux->aux; fs = mux->aux;
n = ioreadn(fs->iorecv, fs->fd, buf, 4); n = ioreadn(fs->iorecv, fs->fd, buf, 4);
if(n != 4) if(n != 4){
if(eofkill9pclient)
threadexitsall(nil);
return nil; return nil;
}
n = GBIT32(buf); n = GBIT32(buf);
pkt = malloc(n+4); pkt = malloc(n+4);
if(pkt == nil){ if(pkt == nil){
@ -356,3 +364,9 @@ _fsrecv(Mux *mux)
} }
return pkt; return pkt;
} }
Qid
fsqid(CFid *fid)
{
return fid->qid;
}

View file

@ -4,19 +4,29 @@
#include <9pclient.h> #include <9pclient.h>
#include "fsimpl.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* CFid*
fsopen(CFsys *fs, char *name, int mode) fsopen(CFsys *fs, char *name, int mode)
{ {
char e[ERRMAX]; char e[ERRMAX];
CFid *fid; CFid *fid;
Fcall tx, rx;
if((fid = _fswalk(fs->root, name)) == nil) if((fid = fswalk(fs->root, name)) == nil)
return nil; return nil;
tx.type = Topen; if(fsfopen(fid, mode) < 0){
tx.fid = fid->fid;
tx.mode = mode;
if(_fsrpc(fs, &tx, &rx, 0) < 0){
rerrstr(e, sizeof e); rerrstr(e, sizeof e);
fsclose(fid); fsclose(fid);
errstr(e, sizeof e); errstr(e, sizeof e);

View file

@ -10,7 +10,7 @@ fsopenfd(CFsys *fs, char *name, int mode)
CFid *fid; CFid *fid;
Fcall tx, rx; Fcall tx, rx;
if((fid = _fswalk(fs->root, name)) == nil) if((fid = fswalk(fs->root, name)) == nil)
return -1; return -1;
tx.type = Topenfd; tx.type = Topenfd;
tx.fid = fid->fid; tx.fid = fid->fid;

View file

@ -12,7 +12,7 @@ fsremove(CFsys *fs, char *name)
{ {
CFid *fid; CFid *fid;
if((fid = _fswalk(fs->root, name)) == nil) if((fid = fswalk(fs->root, name)) == nil)
return -1; return -1;
return fsfremove(fid); return fsfremove(fid);
} }

View file

@ -13,7 +13,7 @@ fsdirstat(CFsys *fs, char *name)
Dir *d; Dir *d;
CFid *fid; CFid *fid;
if((fid = _fswalk(fs->root, name)) == nil) if((fid = fswalk(fs->root, name)) == nil)
return nil; return nil;
d = fsdirfstat(fid); d = fsdirfstat(fid);

View file

@ -8,7 +8,7 @@
#include "fsimpl.h" #include "fsimpl.h"
CFid* CFid*
_fswalk(CFid *fid, char *oname) fswalk(CFid *fid, char *oname)
{ {
char *freep, *name; char *freep, *name;
int i, nwalk; int i, nwalk;

View file

@ -13,7 +13,7 @@ fsdirwstat(CFsys *fs, char *name, Dir *d)
int n; int n;
CFid *fid; CFid *fid;
if((fid = _fswalk(fs->root, name)) == nil) if((fid = fswalk(fs->root, name)) == nil)
return -1; return -1;
n = fsdirfwstat(fid, d); n = fsdirfwstat(fid, d);