1 daefa1a9 2005-01-18 devnull #include <u.h>
2 daefa1a9 2005-01-18 devnull #include <libc.h>
3 daefa1a9 2005-01-18 devnull #include <fcall.h>
4 daefa1a9 2005-01-18 devnull #include <9pclient.h>
5 daefa1a9 2005-01-18 devnull #include "fsimpl.h"
8 daefa1a9 2005-01-18 devnull fsseek(CFid *fid, vlong n, int whence)
12 daefa1a9 2005-01-18 devnull switch(whence){
14 daefa1a9 2005-01-18 devnull qlock(&fid->lk);
15 daefa1a9 2005-01-18 devnull fid->offset = n;
16 daefa1a9 2005-01-18 devnull qunlock(&fid->lk);
19 daefa1a9 2005-01-18 devnull qlock(&fid->lk);
20 daefa1a9 2005-01-18 devnull n += fid->offset;
21 daefa1a9 2005-01-18 devnull if(n < 0){
22 daefa1a9 2005-01-18 devnull qunlock(&fid->lk);
23 daefa1a9 2005-01-18 devnull werrstr("negative offset");
24 daefa1a9 2005-01-18 devnull return -1;
26 daefa1a9 2005-01-18 devnull fid->offset = n;
27 daefa1a9 2005-01-18 devnull qunlock(&fid->lk);
30 daefa1a9 2005-01-18 devnull if((d = fsdirfstat(fid)) == nil)
31 daefa1a9 2005-01-18 devnull return -1;
32 daefa1a9 2005-01-18 devnull n += d->length;
33 daefa1a9 2005-01-18 devnull if(n < 0){
34 daefa1a9 2005-01-18 devnull werrstr("negative offset");
35 daefa1a9 2005-01-18 devnull return -1;
37 daefa1a9 2005-01-18 devnull qlock(&fid->lk);
38 daefa1a9 2005-01-18 devnull fid->offset = n;
39 daefa1a9 2005-01-18 devnull qunlock(&fid->lk);
42 daefa1a9 2005-01-18 devnull werrstr("bad whence in fsseek");
43 daefa1a9 2005-01-18 devnull return -1;
45 daefa1a9 2005-01-18 devnull return n;