#include <9pm/windows.h>
#include <9pm/u.h>
#include <9pm/libc.h>
#include "syscall.h"

long
pwrite(int fd, void *buf, long n, vlong off)
{
	long a, m, m2;
	Syscallmem *c;

	c = _getsyscallmem();
	c->arg[0] = fd;
	c->arg[1] = 0;
	c->arg[2] = n;
	c->nr = Spwrite;

	for(a=0; a<n; a+=m){
		m = n-a;
		if(m > CallMem)
			m = CallMem;
		*(vlong*)(&c->arg[3]) = off+a;
		memmove(&c[1], (uchar*)buf+a, m);
		m2 = _dosyscall(c);
		if(m2 < 0){
			if(a==0)
				return -1;
			return a;
		}
		if(m2 < m)
			return a+m2;
	}
	return a;
}


syntax highlighted by Code2HTML, v. 0.9.1