Browse code

forgot to add file

git-svn: trunk@4146

Török Edvin authored on 2008/08/28 18:36:44
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,79 @@
0
+dnl Check for mmap()
1
+dnl AC_FUNC_MMAP checks for private fixed mappings, we don't need
2
+dnl fixed mappings, so check only wether private mappings work.
3
+dnl AC_FUNC_MMAP would fail on HP-UX for example.
4
+AC_DEFUN([AC_C_FUNC_MMAP_PRIVATE],
5
+[ 
6
+	AC_CACHE_CHECK([for working mmap], [ac_cv_c_mmap_private],
7
+	[
8
+		AC_RUN_IFELSE([AC_LANG_SOURCE([
9
+#include <unistd.h>
10
+#include <stdlib.h>
11
+#include <sys/mman.h>
12
+#ifdef HAVE_SYS_TYPES_H
13
+#include <sys/types.h>
14
+#endif
15
+#ifdef HAVE_SYS_STAT_H
16
+#include <sys/stat.h>
17
+#endif
18
+#include <fcntl.h> 
19
+int main(void)
20
+{
21
+	char *data, *data2, *data3;
22
+	unsigned i, datasize = 1024;
23
+	int fd;
24
+
25
+  	/* First, make a file with some known garbage in it. */
26
+	data = (char*) malloc(datasize);
27
+	if(!data)
28
+		return 1;
29
+	for(i=0;i<datasize;i++)
30
+		*(data + i) = rand();
31
+	umask(0);
32
+	fd = creat("conftest.mmap", 0600);
33
+	if(fd < 0)
34
+		return 1;
35
+	if(write (fd, data, datasize) != datasize)
36
+		return 1;
37
+	close(fd);
38
+	fd = open("conftest.mmap", O_RDWR);
39
+	if (fd < 0)
40
+		return 1;
41
+	/* Next, try to mmap the file at a fixed address which already has
42
+	   something else allocated at it.  If we can, also make sure that
43
+	   we see the same garbage.  */
44
+	data2 = mmap(NULL, sizeof(data), PROT_READ | PROT_WRITE,
45
+		MAP_PRIVATE, fd, 0L);	
46
+	if(data2 == MAP_FAILED)
47
+		return 2;
48
+	for(i=0;i<sizeof(data);i++)
49
+		if(*(data + i) != *(data2+ i))
50
+			return 3;
51
+	  /* Finally, make sure that changes to the mapped area do not
52
+     	     percolate back to the file as seen by read().  (This is a bug on
53
+             some variants of i386 svr4.0.)  */
54
+	  for (i = 0; i < datasize; ++i)
55
+	    *(data2 + i) = *(data2 + i) + 1;
56
+	data3 = (char*) malloc(datasize);
57
+	if(!data3)
58
+		return 1;
59
+	if(read (fd, data3, datasize) != datasize)
60
+		return 1;
61
+	for(i=0;i<sizeof(data);i++)
62
+		if(*(data + i) != *(data3 + i))
63
+			return 3;
64
+	close(fd);
65
+	return 0;
66
+}])],
67
+	[ac_cv_c_mmap_private=yes],
68
+	[ac_cv_c_mmap_private=no],
69
+	[ac_cv_c_mmap_private=no])])
70
+if test $ac_cv_c_mmap_private = yes; then
71
+	AC_DEFINE(HAVE_MMAP, 1,
72
+		[Define to 1 if you have a working `mmap' system call that supports MAP_PRIVATE.])
73
+fi
74
+rm -f conftest.mmap
75
+])
76
+
77
+
78
+