git-svn: trunk@4146
Török Edvin authored on 2008/08/28 18:36:441 | 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 |
+ |