| #include <u.h> |
| #include <libc.h> |
| #include <fcall.h> |
| #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; |
| } |