#include <stdio.h>
#include <string.h>
#include <err.h>
#include <unistd.h>
#include <sys/mman.h>

static char input[]  = "Hello world\n";

int main()
{
	size_t pgsz;
	uintptr_t addr;
	void *p;
	char *src;

	pgsz = getpagesize();
	printf("%zu\n", pgsz);

	addr = 0x7fffffff;
	printf("pagesize = %jx\n", (uintmax_t)addr);

	addr &= ~(pgsz - 1);
	printf("hint = %jx\n", (uintmax_t)addr);

	p = (void *)addr;
	p = mmap(p, 2 * pgsz, PROT_READ|PROT_WRITE, MAP_ANON|MAP_FIXED, -1, 0);
	if (p == MAP_FAILED)
		err(1, "mmap");
	printf("mapping = %p..%p\n", p, (char *)p + 2 * pgsz - 1);

	src = (char *)p + pgsz - 4;
	printf("source = %p\n", src);

	memcpy(src, input, sizeof(input));

	printf("input %s", src);
	printf("strlen = %zu\n", strlen(src));
	printf("strnlen = %zu\n", strnlen(src, pgsz));

	return 0;
}
