diff options
author | Simo Sorce <idra@samba.org> | 2011-08-14 18:05:27 -0400 |
---|---|---|
committer | Simo Sorce <idra@samba.org> | 2011-08-14 19:51:45 -0400 |
commit | a171938408adde0d787b9ff40a4cebeee66d747a (patch) | |
tree | 57bd82d7211d00d14475e19e905c520101e2697e | |
parent | 88ecf1a9b8032669e097cca448c0640d1453a234 (diff) | |
download | samba-a171938408adde0d787b9ff40a4cebeee66d747a.tar.gz samba-a171938408adde0d787b9ff40a4cebeee66d747a.tar.bz2 samba-a171938408adde0d787b9ff40a4cebeee66d747a.zip |
replace: Check if we have mremap() available
-rw-r--r-- | lib/replace/libreplace.m4 | 7 | ||||
-rw-r--r-- | lib/replace/test/shared_mremap.c | 48 |
2 files changed, 55 insertions, 0 deletions
diff --git a/lib/replace/libreplace.m4 b/lib/replace/libreplace.m4 index 808d5d1c06..d644e5062e 100644 --- a/lib/replace/libreplace.m4 +++ b/lib/replace/libreplace.m4 @@ -98,6 +98,13 @@ if test x"$libreplace_cv_HAVE_MMAP" = x"yes"; then 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) diff --git a/lib/replace/test/shared_mremap.c b/lib/replace/test/shared_mremap.c new file mode 100644 index 0000000000..05032ad12e --- /dev/null +++ b/lib/replace/test/shared_mremap.c @@ -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); +} |