comparison aclocal.m4 @ 31511:b7463306b3ac

(AC_FUNC_MMAP): Use fixed version from development autoconf.
author Dave Love <fx@gnu.org>
date Fri, 08 Sep 2000 16:14:08 +0000
parents 56407d559c03
children 14bff16f1d37
comparison
equal deleted inserted replaced
31510:15eaa1c573ba 31511:b7463306b3ac
353 [Define to make ftello visible on some hosts (e.g. glibc 2.1.3).], 353 [Define to make ftello visible on some hosts (e.g. glibc 2.1.3).],
354 [#include <stdio.h>], [return !ftello;]) 354 [#include <stdio.h>], [return !ftello;])
355 fi 355 fi
356 ]) 356 ])
357 357
358 undefine([AC_FUNC_MMAP])dnl
359 dnl The autoconf 2.13 version loses on OSF, at least,
360 dnl by messing up the declaration of malloc.
361 AC_DEFUN([AC_FUNC_MMAP],
362 [AC_CHECK_HEADERS(stdlib.h unistd.h sys/stat.h)
363 AC_CHECK_FUNCS(getpagesize)
364 AC_CACHE_CHECK(for working mmap, ac_cv_func_mmap_fixed_mapped,
365 [AC_TRY_RUN(
366 [/* Thanks to Mike Haertel and Jim Avera for this test.
367 Here is a matrix of mmap possibilities:
368 mmap private not fixed
369 mmap private fixed at somewhere currently unmapped
370 mmap private fixed at somewhere already mapped
371 mmap shared not fixed
372 mmap shared fixed at somewhere currently unmapped
373 mmap shared fixed at somewhere already mapped
374 For private mappings, we should verify that changes cannot be read()
375 back from the file, nor mmap's back from the file at a different
376 address. (There have been systems where private was not correctly
377 implemented like the infamous i386 svr4.0, and systems where the
378 VM page cache was not coherent with the file system buffer cache
379 like early versions of FreeBSD and possibly contemporary NetBSD.)
380 For shared mappings, we should conversely verify that changes get
381 propogated back to all the places they're supposed to be.
382
383 Grep wants private fixed already mapped.
384 The main things grep needs to know about mmap are:
385 * does it exist and is it safe to write into the mmap'd area
386 * how to use it (BSD variants) */
387 #include <sys/types.h>
388 #include <fcntl.h>
389 #include <sys/mman.h>
390
391 #if STDC_HEADERS || HAVE_STDLIB_H
392 # include <stdlib.h>
393 #else
394 char *malloc ();
395 #endif
396 #if HAVE_UNISTD_H
397 # include <unistd.h>
398 #endif
399 #if HAVE_SYS_STAT_H
400 # include <sys/stat.h>
401 #endif
402
403 /* This mess was copied from the GNU getpagesize.h. */
404 #if !HAVE_GETPAGESIZE
405 /* Assume that all systems that can run configure have sys/param.h. */
406 # if !HAVE_SYS_PARAM_H
407 # define HAVE_SYS_PARAM_H 1
408 # endif
409
410 # ifdef _SC_PAGESIZE
411 # define getpagesize() sysconf(_SC_PAGESIZE)
412 # else /* no _SC_PAGESIZE */
413 # if HAVE_SYS_PARAM_H
414 # include <sys/param.h>
415 # ifdef EXEC_PAGESIZE
416 # define getpagesize() EXEC_PAGESIZE
417 # else /* no EXEC_PAGESIZE */
418 # ifdef NBPG
419 # define getpagesize() NBPG * CLSIZE
420 # ifndef CLSIZE
421 # define CLSIZE 1
422 # endif /* no CLSIZE */
423 # else /* no NBPG */
424 # ifdef NBPC
425 # define getpagesize() NBPC
426 # else /* no NBPC */
427 # ifdef PAGESIZE
428 # define getpagesize() PAGESIZE
429 # endif /* PAGESIZE */
430 # endif /* no NBPC */
431 # endif /* no NBPG */
432 # endif /* no EXEC_PAGESIZE */
433 # else /* no HAVE_SYS_PARAM_H */
434 # define getpagesize() 8192 /* punt totally */
435 # endif /* no HAVE_SYS_PARAM_H */
436 # endif /* no _SC_PAGESIZE */
437
438 #endif /* no HAVE_GETPAGESIZE */
439
440 int
441 main ()
442 {
443 char *data, *data2, *data3;
444 int i, pagesize;
445 int fd;
446
447 pagesize = getpagesize ();
448
449 /* First, make a file with some known garbage in it. */
450 data = (char *) malloc (pagesize);
451 if (!data)
452 exit (1);
453 for (i = 0; i < pagesize; ++i)
454 *(data + i) = rand ();
455 umask (0);
456 fd = creat ("conftestmmap", 0600);
457 if (fd < 0)
458 exit (1);
459 if (write (fd, data, pagesize) != pagesize)
460 exit (1);
461 close (fd);
462
463 /* Next, try to mmap the file at a fixed address which already has
464 something else allocated at it. If we can, also make sure that
465 we see the same garbage. */
466 fd = open ("conftestmmap", O_RDWR);
467 if (fd < 0)
468 exit (1);
469 data2 = (char *) malloc (2 * pagesize);
470 if (!data2)
471 exit (1);
472 data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1);
473 if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE,
474 MAP_PRIVATE | MAP_FIXED, fd, 0L))
475 exit (1);
476 for (i = 0; i < pagesize; ++i)
477 if (*(data + i) != *(data2 + i))
478 exit (1);
479
480 /* Finally, make sure that changes to the mapped area do not
481 percolate back to the file as seen by read(). (This is a bug on
482 some variants of i386 svr4.0.) */
483 for (i = 0; i < pagesize; ++i)
484 *(data2 + i) = *(data2 + i) + 1;
485 data3 = (char *) malloc (pagesize);
486 if (!data3)
487 exit (1);
488 if (read (fd, data3, pagesize) != pagesize)
489 exit (1);
490 for (i = 0; i < pagesize; ++i)
491 if (*(data + i) != *(data3 + i))
492 exit (1);
493 close (fd);
494 unlink ("conftestmmap");
495 exit (0);
496 }], ac_cv_func_mmap_fixed_mapped=yes, ac_cv_func_mmap_fixed_mapped=no,
497 ac_cv_func_mmap_fixed_mapped=no)])
498 if test $ac_cv_func_mmap_fixed_mapped = yes; then
499 AC_DEFINE(HAVE_MMAP, 1,
500 [Define if you have a working `mmap' system call.])
501 fi
502 ])# AC_FUNC_MMAP
503
358 ) dnl ifelse 504 ) dnl ifelse