#include <lib.h>
#include <unistd.h>

ssize_t pread(int fd, void *buffer, size_t nbytes, off_t where)
{
	off_t here;
	ssize_t r;

	if((here = lseek(fd, 0, SEEK_CUR)) < 0)
		return -1;

	if(lseek(fd, where, SEEK_SET) < 0)
		return -1;

	if((r=read(fd, buffer, nbytes)) < 0) {
		int e = errno;
		lseek(fd, here, SEEK_SET);
		errno = e;
		return -1;
	}

	if(lseek(fd, here, SEEK_SET) < 0)
		return -1;

	return r;
}

