47 lines
707 B
C
47 lines
707 B
C
#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;
|
|
}
|