#include <sys/types.h>
#include <sys/mman.h>
#include <sys/uio.h>

#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>

int
main(int argc, char *argv[])
{
	struct iovec iovec[2];
	char *mmap_buf;
	size_t pagesize, len;
	int error, fd;

	pagesize = getpagesize();
	mmap_buf = mmap(NULL, pagesize * 3, PROT_READ, MAP_ANON, -1,
	    0);
	if (mmap_buf == NULL) {
		perror("mmap");
		exit(-1);
	}
	printf("mmap: 0x%x\n", mmap_buf);

	error = mprotect(mmap_buf, pagesize, 0);
	if (error) {
		perror("mprotect");
		exit(-1);
	}

	iovec[0].iov_base = mmap_buf;
	iovec[1].iov_base = mmap_buf + pagesize;
	iovec[0].iov_len = pagesize;
	iovec[1].iov_len = pagesize;

	unlink("out");
	fd = open("out", O_RDWR | O_CREAT, 0777);
	if (fd == -1) {
		perror("out");
		exit(-1);
	}
	len = writev(fd, iovec, 1);
	printf("first page writev returned len: %d\n", len);
	if (len == -1)
		perror("first page");
	printf("\n");
	len = writev(fd, iovec+1, 1);
	printf("second page writev returned len: %d\n", len);
	if (len == -1)
		perror("second page");
	printf("\n");
	len = writev(fd, iovec, 2);
	printf("both pages writev returned len: %d\n", len);
	if (len == -1)
		perror("both pages");
	printf("\n");

	printf("For grins:\n");
	printf("Read page2\n");
	printf("%c\n", mmap_buf[pagesize]);
	printf("Read page1\n");
	printf("%c\n", mmap_buf[0]);
}

