1/* this tests whether we can use a shared writeable mmap on a file -
2   as needed for the mmap variant of FAST_SHARE_MODES */
3
4#if defined(HAVE_UNISTD_H)
5#include <unistd.h>
6#endif
7#include <sys/mman.h>
8#include <sys/types.h>
9#include <sys/stat.h>
10#include <fcntl.h>
11
12#define DATA "conftest.mmap"
13
14#ifndef MAP_FILE
15#define MAP_FILE 0
16#endif
17
18main()
19{
20	int *buf;
21	int i;
22	int fd = open(DATA,O_RDWR|O_CREAT|O_TRUNC,0666);
23	int count=7;
24
25	if (fd == -1) exit(1);
26
27	for (i=0;i<10000;i++) {
28		write(fd,&i,sizeof(i));
29	}
30
31	close(fd);
32
33	if (fork() == 0) {
34		fd = open(DATA,O_RDWR);
35		if (fd == -1) exit(1);
36
37		buf = (int *)mmap(NULL, 10000*sizeof(int),
38				   (PROT_READ | PROT_WRITE),
39				   MAP_FILE | MAP_SHARED,
40				   fd, 0);
41
42		if (buf == (int *)-1) exit(1);
43
44		while (count-- && buf[9124] != 55732) sleep(1);
45
46		if (count <= 0) exit(1);
47
48		buf[1763] = 7268;
49		exit(0);
50	}
51
52	fd = open(DATA,O_RDWR);
53	if (fd == -1) exit(1);
54
55	buf = (int *)mmap(NULL, 10000*sizeof(int),
56			   (PROT_READ | PROT_WRITE),
57			   MAP_FILE | MAP_SHARED,
58			   fd, 0);
59
60	if (buf == (int *)-1) exit(1);
61
62	buf[9124] = 55732;
63
64	while (count-- && buf[1763] != 7268) sleep(1);
65
66	unlink(DATA);
67
68	if (count > 0) exit(0);
69	exit(1);
70}
71