commit daefa1a92f688399290f231c4c738ef99e7b8ab4 from: rsc date: Tue Jan 18 18:11:39 2005 UTC add fsseek commit - 0fcd970331d664ae6ae2b7a414efb086361ceff7 commit + daefa1a92f688399290f231c4c738ef99e7b8ab4 blob - 8a0d342f7282f7c4b170b3d0958a1e0fa90fa62f blob + e8beed4fad48344c795bd6ef35f461f69b626202 --- include/9pclient.h +++ include/9pclient.h @@ -22,6 +22,9 @@ CFid *fsopen(CFsys*, char*, int); int fsopenfd(CFsys*, char*, int); long fsread(CFid*, void*, long); long fsreadn(CFid*, void*, long); +long fspread(CFid*, void*, long, vlong); +long fspwrite(CFid*, void*, long, vlong); +vlong fsseek(CFid*, vlong, int); long fswrite(CFid*, void*, long); void fsclose(CFid*); void fsunmount(CFsys*); blob - c6bbc7dc8cd96755159ac5f4c91686fa135ff2bb blob + 097f20ad8268a5503f109e838f06a30456090dc2 --- src/lib9pclient/mkfile +++ src/lib9pclient/mkfile @@ -11,6 +11,7 @@ OFILES=\ open.$O\ openfd.$O\ read.$O\ + seek.$O\ stat.$O\ walk.$O\ write.$O\ blob - /dev/null blob + 0785c4b489b91bbe1c9b3fd5f26428a63ca96fdd (mode 644) --- /dev/null +++ src/lib9pclient/seek.c @@ -0,0 +1,46 @@ +#include +#include +#include +#include <9pclient.h> +#include "fsimpl.h" + +vlong +fsseek(CFid *fid, vlong n, int whence) +{ + Dir *d; + + switch(whence){ + case 0: + qlock(&fid->lk); + fid->offset = n; + qunlock(&fid->lk); + break; + case 1: + qlock(&fid->lk); + n += fid->offset; + if(n < 0){ + qunlock(&fid->lk); + werrstr("negative offset"); + return -1; + } + fid->offset = n; + qunlock(&fid->lk); + break; + case 2: + if((d = fsdirfstat(fid)) == nil) + return -1; + n += d->length; + if(n < 0){ + werrstr("negative offset"); + return -1; + } + qlock(&fid->lk); + fid->offset = n; + qunlock(&fid->lk); + break; + default: + werrstr("bad whence in fsseek"); + return -1; + } + return n; +}