#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; }