#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <err.h>
#include <string.h>
#include <sys/types.h>
#include <sys/mman.h>
#define MAGIC "The voices in my head are trying to ignore me."
int
main(int argc, char *argv[])
{
char fname[25] = "/tmp/mmaptestXXXXXXXXXX";
int page_size;
int fd;
char *v1, *v2;
if ((fd = mkstemp(fname)) < 0)
err(1, "mkstemp");
if (remove(fname) < 0)
err(1, "remove");
if ((page_size = sysconf(_SC_PAGESIZE)) < 0)
err(1, "sysconf");
if (ftruncate(fd, 2 * page_size) < 0)
err(1, "ftruncate");
v1 = mmap(NULL, 2 * page_size, PROT_READ|PROT_WRITE,
MAP_SHARED, fd, 0);
if (v1 == MAP_FAILED)
err(1, "mmap 1");
v2 = mmap(v1 + page_size, page_size, PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_FIXED, fd, 0);
if (v2 == MAP_FAILED)
err(1, "mmap 2");
memcpy(v1, MAGIC, sizeof(MAGIC));
if (memcmp(v2, MAGIC, sizeof(MAGIC)) != 0)
errx(1, "comparison 1 failed");
if (memcmp(v1, v2, sizeof(MAGIC)) != 0)
errx(1, "comparison 2 failed");
if (munmap(v1, 2 * page_size) < 0)
errx(1, "munmap");
close(fd);
return 0;
}