2
dnl AC_FUNC_MMAP checks for private fixed mappings, we don't need
3
dnl fixed mappings, so check only wether private mappings work.
4
dnl AC_FUNC_MMAP would fail on HP-UX for example.
5
AC_DEFUN([AC_C_FUNC_MMAP_PRIVATE],
7
AC_CACHE_CHECK([for working mmap], [ac_cv_c_mmap_private],
9
AC_RUN_IFELSE([AC_LANG_SOURCE([
13
#ifdef HAVE_SYS_TYPES_H
14
#include <sys/types.h>
16
#ifdef HAVE_SYS_STAT_H
22
char *data, *data2, *data3;
23
unsigned i, datasize = 1024;
26
/* First, make a file with some known garbage in it. */
27
data = (char*) malloc(datasize);
30
for(i=0;i<datasize;i++)
33
fd = creat("conftest.mmap", 0600);
36
if(write (fd, data, datasize) != datasize)
39
fd = open("conftest.mmap", O_RDWR);
42
/* Next, try to mmap the file at a fixed address which already has
43
something else allocated at it. If we can, also make sure that
44
we see the same garbage. */
45
data2 = mmap(NULL, sizeof(data), PROT_READ | PROT_WRITE,
47
if(data2 == MAP_FAILED)
49
for(i=0;i<sizeof(data);i++)
50
if(*(data + i) != *(data2+ i))
52
/* Finally, make sure that changes to the mapped area do not
53
percolate back to the file as seen by read(). (This is a bug on
54
some variants of i386 svr4.0.) */
55
for (i = 0; i < datasize; ++i)
56
*(data2 + i) = *(data2 + i) + 1;
57
data3 = (char*) malloc(datasize);
60
if(read (fd, data3, datasize) != datasize)
62
for(i=0;i<sizeof(data);i++)
63
if(*(data + i) != *(data3 + i))
68
[ac_cv_c_mmap_private=yes],
69
[ac_cv_c_mmap_private=no],
70
[ac_cv_c_mmap_private=no])])
71
if test $ac_cv_c_mmap_private = yes; then
72
AC_DEFINE(HAVE_MMAP, 1,
73
[Define to 1 if you have a working `mmap' system call that supports MAP_PRIVATE.])