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