blob: 718d31dd7d8a10655a2592a6d9773703aacb519f [file] [log] [blame]
/* -*- Mode: C; tab-width: 8; c-basic-offset: 2; indent-tabs-mode: nil; -*- */
#include "util.h"
int main(void) {
int fd = open("tmp.txt", O_RDWR | O_CREAT | O_EXCL, 0700);
ssize_t page_size = sysconf(_SC_PAGESIZE);
char buf[page_size];
char* p;
char* q;
pid_t child;
int status;
test_assert(fd >= 0);
memset(buf, 1, sizeof(buf));
test_assert(page_size == write(fd, buf, page_size));
test_assert(0 == close(fd));
fd = open("tmp.txt", O_RDWR);
p = mmap(NULL, page_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
test_assert(p != MAP_FAILED);
test_assert(p[0] == 1);
test_assert(p[9] == 1);
test_assert(p[10] == 1);
memset(p, 2, 10);
child = fork();
if (!child) {
q = mmap(NULL, page_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
test_assert(q != MAP_FAILED);
test_assert(q[0] == 2);
test_assert(q[9] == 2);
test_assert(q[10] == 1);
return 77;
}
test_assert(child == wait(&status));
test_assert(WIFEXITED(status) && WEXITSTATUS(status) == 77);
memset(buf, 3, 10);
test_assert(10 == pwrite(fd, buf, 10, 0));
test_assert(0 == fsync(fd));
test_assert(0 == close(fd));
test_assert(0 == unlink("tmp.txt"));
atomic_puts("EXIT-SUCCESS");
return 0;
}