Blame


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"
6 daefa1a9 2005-01-18 devnull
7 daefa1a9 2005-01-18 devnull vlong
8 daefa1a9 2005-01-18 devnull fsseek(CFid *fid, vlong n, int whence)
9 daefa1a9 2005-01-18 devnull {
10 daefa1a9 2005-01-18 devnull Dir *d;
11 daefa1a9 2005-01-18 devnull
12 daefa1a9 2005-01-18 devnull switch(whence){
13 daefa1a9 2005-01-18 devnull case 0:
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);
17 daefa1a9 2005-01-18 devnull break;
18 daefa1a9 2005-01-18 devnull case 1:
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;
25 daefa1a9 2005-01-18 devnull }
26 daefa1a9 2005-01-18 devnull fid->offset = n;
27 daefa1a9 2005-01-18 devnull qunlock(&fid->lk);
28 daefa1a9 2005-01-18 devnull break;
29 daefa1a9 2005-01-18 devnull case 2:
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;
36 daefa1a9 2005-01-18 devnull }
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);
40 daefa1a9 2005-01-18 devnull break;
41 daefa1a9 2005-01-18 devnull default:
42 daefa1a9 2005-01-18 devnull werrstr("bad whence in fsseek");
43 daefa1a9 2005-01-18 devnull return -1;
44 daefa1a9 2005-01-18 devnull }
45 daefa1a9 2005-01-18 devnull return n;
46 daefa1a9 2005-01-18 devnull }