replace: Check if we have mremap() available
authorSimo Sorce <idra@samba.org>
Sun, 14 Aug 2011 22:05:27 +0000 (18:05 -0400)
committerSimo Sorce <idra@samba.org>
Sun, 14 Aug 2011 23:51:45 +0000 (19:51 -0400)
lib/replace/libreplace.m4
lib/replace/test/shared_mremap.c [new file with mode: 0644]

index 808d5d1c0662cb46c423a73a0fa91583730d3d1b..d644e5062e567869ca492cd916b69ca6a99d6398 100644 (file)
@@ -98,6 +98,13 @@ if test x"$libreplace_cv_HAVE_MMAP" = x"yes"; then
     AC_DEFINE(HAVE_MMAP,1,[Whether mmap works])
 fi
 
     AC_DEFINE(HAVE_MMAP,1,[Whether mmap works])
 fi
 
+AC_CACHE_CHECK([for working mremap],libreplace_cv_HAVE_MREMAP,[
+AC_TRY_RUN([#include "$libreplacedir/test/shared_mremap.c"],
+           libreplace_cv_HAVE_MREMAP=yes,libreplace_cv_HAVE_MREMAP=no,libreplace_cv_HAVE_MREMAP=cross)])
+if test x"$libreplace_cv_HAVE_MREMAP" = x"yes"; then
+    AC_DEFINE(HAVE_MREMAP,1,[Whether mremap works])
+fi
+
 
 AC_CHECK_HEADERS(sys/syslog.h syslog.h)
 AC_CHECK_HEADERS(sys/time.h time.h)
 
 AC_CHECK_HEADERS(sys/syslog.h syslog.h)
 AC_CHECK_HEADERS(sys/time.h time.h)
diff --git a/lib/replace/test/shared_mremap.c b/lib/replace/test/shared_mremap.c
new file mode 100644 (file)
index 0000000..05032ad
--- /dev/null
@@ -0,0 +1,48 @@
+/* this tests whether we can use mremap */
+
+#if defined(HAVE_UNISTD_H)
+#include <unistd.h>
+#endif
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#define DATA "conftest.mmap"
+
+#ifndef MAP_FILE
+#define MAP_FILE 0
+#endif
+
+#ifndef MAP_FAILED
+#define MAP_FAILED (int *)-1
+#endif
+
+main()
+{
+       int *buf;
+       int fd;
+       int err = 1;
+
+       fd = open(DATA, O_RDWR|O_CREAT|O_TRUNC, 0666);
+       if (fd == -1) {
+               exit(1);
+       }
+
+       buf = (int *)mmap(NULL, 0x1000, PROT_READ | PROT_WRITE,
+                         MAP_FILE | MAP_SHARED, fd, 0);
+       if (buf == MAP_FAILED) {
+               goto done;
+       }
+
+       buf = mremap(buf, 0x1000, 0x2000, MREMAP_MAYMOVE);
+       if (buf == MAP_FAILED) {
+               goto done;
+       }
+
+       err = 0;
+done:
+       close(fd);
+       unlink(DATA);
+       exit(err);
+}