Commit Diff


commit - 0fcd970331d664ae6ae2b7a414efb086361ceff7
commit + daefa1a92f688399290f231c4c738ef99e7b8ab4
blob - 8a0d342f7282f7c4b170b3d0958a1e0fa90fa62f
blob + e8beed4fad48344c795bd6ef35f461f69b626202
--- include/9pclient.h
+++ include/9pclient.h
@@ -22,6 +22,9 @@ CFid *fsopen(CFsys*, char*, int);
 int fsopenfd(CFsys*, char*, int);
 long fsread(CFid*, void*, long);
 long fsreadn(CFid*, void*, long);
+long fspread(CFid*, void*, long, vlong);
+long fspwrite(CFid*, void*, long, vlong);
+vlong fsseek(CFid*, vlong, int);
 long fswrite(CFid*, void*, long);
 void fsclose(CFid*);
 void fsunmount(CFsys*);
blob - c6bbc7dc8cd96755159ac5f4c91686fa135ff2bb
blob + 097f20ad8268a5503f109e838f06a30456090dc2
--- src/lib9pclient/mkfile
+++ src/lib9pclient/mkfile
@@ -11,6 +11,7 @@ OFILES=\
 	open.$O\
 	openfd.$O\
 	read.$O\
+	seek.$O\
 	stat.$O\
 	walk.$O\
 	write.$O\
blob - /dev/null
blob + 0785c4b489b91bbe1c9b3fd5f26428a63ca96fdd (mode 644)
--- /dev/null
+++ src/lib9pclient/seek.c
@@ -0,0 +1,46 @@
+#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;
+}