1dnl 
2dnl Autoconf configuration file for APR
3dnl 
4dnl Process this file with autoconf to produce a configure script.
5dnl Use ./buildconf to prepare build files and run autoconf for APR.
6
7AC_PREREQ(2.59)
8
9AC_INIT(build/apr_common.m4)
10AC_CONFIG_HEADER(include/arch/unix/apr_private.h)
11AC_CONFIG_AUX_DIR(build)
12AC_CONFIG_MACRO_DIR(build)
13
14dnl 
15dnl Include our own M4 macros along with those for libtool
16dnl 
17sinclude(build/apr_common.m4)
18sinclude(build/apr_network.m4)
19sinclude(build/apr_threads.m4)
20sinclude(build/apr_win32.m4)
21sinclude(build/apr_hints.m4)
22sinclude(build/libtool.m4)
23sinclude(build/ltsugar.m4)
24sinclude(build/argz.m4)
25sinclude(build/ltoptions.m4)
26sinclude(build/ltversion.m4)
27sinclude(build/lt~obsolete.m4)
28
29dnl Hard-coded top of apr_private.h:
30AH_TOP([
31#ifndef APR_PRIVATE_H
32#define APR_PRIVATE_H
33])
34
35dnl Hard-coded inclusion at the tail end of apr_private.h:
36AH_BOTTOM([
37/* switch this on if we have a BeOS version below BONE */
38#if defined(BEOS) && !defined(HAVE_BONE_VERSION)
39#define BEOS_R5 1
40#else
41#define BEOS_BONE 1
42#endif
43
44/*
45 * Darwin 10's default compiler (gcc42) builds for both 64 and
46 * 32 bit architectures unless specifically told not to.
47 * In those cases, we need to override types depending on how
48 * we're being built at compile time.
49 * NOTE: This is an ugly work-around for Darwin's
50 * concept of universal binaries, a single package
51 * (executable, lib, etc...) which contains both 32
52 * and 64 bit versions. The issue is that if APR is
53 * built universally, if something else is compiled
54 * against it, some bit sizes will depend on whether
55 * it is 32 or 64 bit. This is determined by the __LP64__
56 * flag. Since we need to support both, we have to
57 * handle OS X unqiuely.
58 */
59#ifdef DARWIN_10
60
61#undef APR_OFF_T_STRFN
62#undef APR_INT64_STRFN
63#undef SIZEOF_LONG
64#undef SIZEOF_SIZE_T
65#undef SIZEOF_SSIZE_T
66#undef SIZEOF_VOIDP
67#undef SIZEOF_STRUCT_IOVEC
68
69#ifdef __LP64__
70 #define APR_INT64_STRFN strtol
71 #define SIZEOF_LONG    8
72 #define SIZEOF_SIZE_T  8
73 #define SIZEOF_SSIZE_T 8
74 #define SIZEOF_VOIDP   8
75 #define SIZEOF_STRUCT_IOVEC 16
76#else
77 #define APR_INT64_STRFN strtoll
78 #define SIZEOF_LONG    4
79 #define SIZEOF_SIZE_T  4
80 #define SIZEOF_SSIZE_T 4
81 #define SIZEOF_VOIDP   4
82 #define SIZEOF_STRUCT_IOVEC 8
83#endif
84
85#undef APR_OFF_T_STRFN
86#define APR_OFF_T_STRFN APR_INT64_STRFN
87 
88
89#undef SETPGRP_VOID
90#ifdef __DARWIN_UNIX03
91 #define SETPGRP_VOID 1
92#else
93/* #undef SETPGRP_VOID */
94#endif
95 
96#endif /* DARWIN_10 */
97
98/*
99 * Include common private declarations.
100 */
101#include "../apr_private_common.h"
102#endif /* APR_PRIVATE_H */
103])
104
105dnl Save user-defined environment settings for later restoration
106dnl
107APR_SAVE_THE_ENVIRONMENT(CPPFLAGS)
108APR_SAVE_THE_ENVIRONMENT(CFLAGS)
109APR_SAVE_THE_ENVIRONMENT(LDFLAGS)
110APR_SAVE_THE_ENVIRONMENT(LIBS)
111APR_SAVE_THE_ENVIRONMENT(INCLUDES)
112
113dnl Generate ./config.nice for reproducing runs of configure
114dnl
115APR_CONFIG_NICE(config.nice)
116
117AC_CANONICAL_SYSTEM
118echo "Configuring APR library"
119echo "Platform: $host"
120
121dnl Some initial steps for configuration.  We setup the default directory
122dnl and which files are to be configured.
123
124dnl Setup the directory macros now
125
126# Absolute source/build directory
127apr_srcdir=`(cd $srcdir && pwd)`
128apr_builddir=`pwd`
129AC_SUBST(apr_srcdir)
130AC_SUBST(apr_builddir)
131
132if test "$apr_builddir" != "$apr_srcdir"; then
133  USE_VPATH=1
134  APR_CONFIG_LOCATION=build
135else
136  APR_CONFIG_LOCATION=source
137fi
138
139AC_SUBST(APR_CONFIG_LOCATION)
140
141# Libtool might need this symbol -- it must point to the location of
142# the generated libtool script (not necessarily the "top" build dir).
143#
144top_builddir="$apr_builddir"
145AC_SUBST(top_builddir)
146
147# Directory containing apr build macros, helpers, and make rules
148# NOTE: make rules (apr_rules.mk) will be in the builddir for vpath
149#
150apr_buildout=$apr_builddir/build
151apr_builders=$apr_srcdir/build
152AC_SUBST(apr_builders)
153
154MKDIR=$apr_builders/mkdir.sh
155
156dnl Initialize mkdir -p functionality.
157APR_MKDIR_P_CHECK($apr_builders/mkdir.sh)
158
159# get our version information
160get_version="$apr_builders/get-version.sh"
161version_hdr="$apr_srcdir/include/apr_version.h"
162APR_MAJOR_VERSION="`$get_version major $version_hdr APR`"
163APR_DOTTED_VERSION="`$get_version all $version_hdr APR`"
164
165AC_SUBST(APR_DOTTED_VERSION)
166AC_SUBST(APR_MAJOR_VERSION)
167
168echo "APR Version: ${APR_DOTTED_VERSION}"
169
170dnl Enable the layout handling code, then reparse the prefix-style
171dnl arguments due to autoconf being a PITA.
172APR_ENABLE_LAYOUT(apr)
173APR_PARSE_ARGUMENTS
174
175dnl Set optional CC hints here in case autoconf makes an inappropriate choice.
176dnl This allows us to suggest what the compiler should be, but still
177dnl allows the user to override CC externally.
178APR_CC_HINTS
179
180dnl Do the various CC checks *before* preloading values. The preload code
181dnl may need to use compiler characteristics to make decisions. This macro
182dnl can only be used once within a configure script, so this prevents a
183dnl preload section from invoking the macro to get compiler info.
184AC_PROG_CC
185
186dnl AC_PROG_SED is only avaliable in recent autoconf versions.
187dnl Use AC_CHECK_PROG instead if AC_PROG_SED is not present.
188ifdef([AC_PROG_SED],
189      [AC_PROG_SED],
190      [AC_CHECK_PROG(SED, sed, sed)])
191
192dnl Preload
193APR_PRELOAD
194
195dnl These added to allow default directories to be used...
196DEFAULT_OSDIR="unix"
197echo "(Default will be ${DEFAULT_OSDIR})"
198
199apr_modules="file_io network_io threadproc misc locks time mmap shmem user memory atomic poll support random"
200
201dnl Checks for programs.
202AC_PROG_MAKE_SET
203AC_PROG_CPP
204AC_PROG_AWK
205AC_PROG_LN_S
206AC_PROG_RANLIB
207AC_PROG_INSTALL
208AC_CHECK_PROG(RM, rm, rm)
209AC_CHECK_PROG(AS, as, as)
210AC_CHECK_PROG(ASCPP, cpp, cpp)
211AC_CHECK_TOOL(AR, ar, ar)
212
213dnl Various OS checks that apparently set required flags
214ifdef([AC_USE_SYSTEM_EXTENSIONS], [
215AC_USE_SYSTEM_EXTENSIONS
216], [
217AC_AIX
218AC_MINIX
219])
220
221AC_ISC_POSIX
222APR_EBCDIC
223
224dnl this is our library name
225APR_LIBNAME="apr${libsuffix}"
226AC_SUBST(APR_LIBNAME)
227
228dnl prep libtool
229dnl
230echo "performing libtool configuration..."
231
232AC_ARG_ENABLE(experimental-libtool,[  --enable-experimental-libtool Use experimental custom libtool],
233  [experimental_libtool=$enableval],[experimental_libtool=no])
234
235dnl Workarounds for busted Libtool 2.x when we don't call AC_PROG_LIBTOOL
236if test "x$Xsed" = "x"; then
237  Xsed="$SED -e 1s/^X//"
238fi
239
240case $host in
241*-os2*)
242    # Use a custom-made libtool replacement
243    echo "using aplibtool"
244    LIBTOOL="$srcdir/build/aplibtool"
245    gcc $CFLAGS $CPPFLAGS -o $LIBTOOL.exe $LIBTOOL.c
246    ;;
247*)
248    if test "x$LTFLAGS" = "x"; then
249        LTFLAGS='--silent'
250    fi
251    if test "$experimental_libtool" = "yes"; then
252        # Use a custom-made libtool replacement
253        echo "using jlibtool"
254        LIBTOOL="$apr_builddir/libtool"
255        LIBTOOL_SRC="$apr_srcdir/build/jlibtool.c"
256        $CC $CFLAGS $CPPFLAGS -o $LIBTOOL $LIBTOOL_SRC
257        eval `$apr_builddir/libtool --config | grep "^shlibpath_var=[[A-Z_]]*$"`
258        if test "x$shlibpath_var" = "x"; then
259            shlibpath_var=REPLACE_WITH_YOUR_SHLIBPATH_VAR
260        fi
261    else
262    dnl libtoolize requires that the following not be indented
263    dnl should become LT_INIT(win32-dll)
264AC_LIBTOOL_WIN32_DLL
265AC_PROG_LIBTOOL
266        # get libtool's setting of shlibpath_var
267        eval `grep "^shlibpath_var=[[A-Z_]]*$" $apr_builddir/libtool`
268        if test "x$shlibpath_var" = "x"; then
269            shlibpath_var=REPLACE_WITH_YOUR_SHLIBPATH_VAR
270        fi
271    fi
272    ;;
273esac
274
275AC_ARG_WITH(installbuilddir, [  --with-installbuilddir=DIR location to store APR build files (defaults to '${datadir}/build')],
276  [ installbuilddir=$withval ], [ installbuilddir="${datadir}/build-${APR_MAJOR_VERSION}" ] )
277AC_SUBST(installbuilddir)
278
279AC_ARG_WITH(libtool, [  --without-libtool       avoid using libtool to link the library],
280  [ use_libtool=$withval ], [ use_libtool="yes" ] )
281
282if test "x$use_libtool" = "xyes"; then
283      lt_compile='$(LIBTOOL) $(LTFLAGS) --mode=compile $(COMPILE) -o $@ -c $< && touch $@'
284      LT_VERSION="-version-info `$get_version libtool $version_hdr APR`"
285      link="\$(LIBTOOL) \$(LTFLAGS) --mode=link \$(COMPILE) \$(LT_LDFLAGS) \$(LT_VERSION) \$(ALL_LDFLAGS) -o \$@"
286      so_ext='lo'
287      lib_target='-rpath $(libdir) $(OBJECTS)'
288      export_lib_target='-rpath \$(libdir) \$(OBJECTS)'
289else
290      lt_compile='$(COMPILE) -o $@ -c $<'
291      link='$(AR) cr $(TARGET_LIB) $(OBJECTS); $(RANLIB) $(TARGET_LIB)'
292      so_ext='o'
293      lib_target=''
294      export_lib_target=''
295fi
296
297case $host in
298    *-solaris2*)
299        apr_platform_runtime_link_flag="-R"
300        ;;
301    *-mingw* | *-cygwin*)
302        LT_LDFLAGS="$LT_LDFLAGS -no-undefined"
303        ;;
304    *)
305        ;;
306esac
307
308AC_SUBST(lt_compile)
309AC_SUBST(link)
310AC_SUBST(so_ext)
311AC_SUBST(lib_target)
312AC_SUBST(export_lib_target)
313AC_SUBST(shlibpath_var)
314AC_SUBST(LTFLAGS)
315AC_SUBST(LT_LDFLAGS)
316AC_SUBST(LT_VERSION)
317
318dnl ----------------------------- Checks for compiler flags
319nl='
320'
321echo "${nl}Check for compiler flags..."
322
323dnl AC_PROG_CC sets -g in CFLAGS (and -O2 for gcc) by default.
324dnl On OS/390 this causes the compiler to insert extra debugger
325dnl hook instructions.  That's fine for debug/maintainer builds, not fine
326dnl otherwise.
327
328case $host in
329    *os390)
330        if test "$ac_test_CFLAGS" != set; then
331           APR_REMOVEFROM(CFLAGS,-g)
332        fi
333        ;;
334esac
335
336AC_ARG_ENABLE(debug,[  --enable-debug          Turn on debugging and compile time warnings],
337  [APR_ADDTO(CFLAGS,-g)
338   if test "$GCC" = "yes"; then
339     APR_ADDTO(CFLAGS,-Wall)
340   elif test "$AIX_XLC" = "yes"; then
341     APR_ADDTO(CFLAGS,-qfullpath)
342   fi
343])dnl
344
345AC_ARG_ENABLE(maintainer-mode,[  --enable-maintainer-mode  Turn on debugging and compile time warnings],
346  [APR_ADDTO(CFLAGS,-g)
347   if test "$GCC" = "yes"; then
348     APR_ADDTO(CFLAGS,[-Wall -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations])
349   elif test "$AIX_XLC" = "yes"; then
350     APR_ADDTO(CFLAGS,-qfullpath -qinitauto=FE -qcheck=all -qinfo=pro)
351   fi
352])dnl
353
354AC_ARG_ENABLE(profile,[  --enable-profile        Turn on profiling for the build (GCC)],
355  if test "$GCC" = "yes"; then
356    APR_ADDTO(CFLAGS, -pg)
357    APR_REMOVEFROM(CFLAGS, -g)
358    if test "$host" = "i586-pc-beos"; then
359        APR_REMOVEFROM(CFLAGS, -O2)
360        APR_ADDTO(CFLAGS, -O1)
361        APR_ADDTO(LDFLAGS, -p)
362    fi
363  fi
364)dnl
365
366AC_ARG_ENABLE(pool-debug,
367  [  --enable-pool-debug[[=yes|no|verbose|verbose-alloc|lifetime|owner|all]]    Turn on pools debugging],
368  [ if test -z "$enableval"; then
369        APR_ADDTO(CPPFLAGS, -DAPR_POOL_DEBUG=1)
370    elif test ! "$enableval" = "no"; then
371        apr_pool_debug=1
372    
373        for i in $enableval
374        do
375            flag=0
376        
377            case $i in
378            yes)
379                flag=1
380                ;;
381            verbose)
382                flag=2
383                ;;
384            lifetime)
385                flag=4
386                ;;
387            owner)
388                flag=8
389                ;;
390            verbose-alloc)
391                flag=16
392                ;;
393            all)
394                apr_pool_debug=31
395                ;;
396            *)
397                ;;
398            esac
399
400            if test $flag -gt 0; then
401                apr_pool_debug=`expr '(' $apr_pool_debug - $apr_pool_debug % \
402                    '(' $flag '*' 2 ')' ')' + $flag + $apr_pool_debug % $flag`
403            fi
404        done
405      
406        APR_ADDTO(CPPFLAGS, -DAPR_POOL_DEBUG=$apr_pool_debug)
407    fi
408  ])
409
410if test "$host" = "i586-pc-beos"; then
411  AC_ARG_ENABLE(malloc-debug,[  --enable-malloc-debug   Switch on malloc_debug for BeOS],
412    APR_REMOVEFROM(CFLAGS, -O2)
413    APR_ADDTO(CPPFLAGS, -fcheck-memory-usage -D_KERNEL_MODE)
414  ) dnl
415fi
416
417# this is the place to put specific options for platform/compiler
418# combinations
419case "$host:$CC" in
420    *-hp-hpux*:cc )
421	APR_ADDTO(CFLAGS,[-Ae +Z])
422	case $host in
423	  ia64-* )
424	    ;;
425          * )
426	    if echo "$CFLAGS " | grep '+DA' >/dev/null; then :
427	    else
428	      APR_ADDTO(CFLAGS,[+DAportable])
429	    fi 
430	    ;;
431        esac
432	;;
433    powerpc-*-beos:mwcc* )
434	APR_SETVAR(CPP,[mwcc -E])
435	APR_SETVAR(CC,mwcc)
436	APR_SETVAR(AR,ar)
437	;;
438    dnl If building static APR, both the APR build and the app build
439    dnl need -DAPR_DECLARE_STATIC to generate the right linkage from    
440    dnl APR_DECLARE et al.
441    dnl If building dynamic APR, the APR build needs APR_DECLARE_EXPORT
442    dnl and the app build should have neither define.
443    *-mingw* | *-cygwin*)
444        if test "$enable_shared" = "yes"; then
445            APR_ADDTO(INTERNAL_CPPFLAGS, -DAPR_DECLARE_EXPORT)
446        else
447            APR_ADDTO(CPPFLAGS, -DAPR_DECLARE_STATIC)
448        fi
449        ;;
450esac
451
452AC_CACHE_CHECK([whether the compiler provides atomic builtins], [ap_cv_atomic_builtins],
453[AC_TRY_RUN([
454int main()
455{
456    unsigned long val = 1010, tmp, *mem = &val;
457
458    if (__sync_fetch_and_add(&val, 1010) != 1010 || val != 2020)
459        return 1;
460
461    tmp = val;
462
463    if (__sync_fetch_and_sub(mem, 1010) != tmp || val != 1010)
464        return 1;
465
466    if (__sync_sub_and_fetch(&val, 1010) != 0 || val != 0)
467        return 1;
468
469    tmp = 3030;
470
471    if (__sync_val_compare_and_swap(mem, 0, tmp) != 0 || val != tmp)
472        return 1;
473
474    if (__sync_lock_test_and_set(&val, 4040) != 3030)
475        return 1;
476
477    mem = &tmp;
478
479    if (__sync_val_compare_and_swap(&mem, &tmp, &val) != &tmp)
480        return 1;
481
482    __sync_synchronize();
483
484    if (mem != &val)
485        return 1;
486
487    return 0;
488}], [ap_cv_atomic_builtins=yes], [ap_cv_atomic_builtins=no], [ap_cv_atomic_builtins=no])])
489
490if test "$ap_cv_atomic_builtins" = "yes"; then
491    AC_DEFINE(HAVE_ATOMIC_BUILTINS, 1, [Define if compiler provides atomic builtins])
492fi
493
494case $host in
495    powerpc-405-*)
496        # The IBM ppc405cr processor has a bugged stwcx instruction.
497        AC_DEFINE(PPC405_ERRATA, 1, [Define on PowerPC 405 where errata 77 applies])
498        ;;
499    *)
500        ;;
501esac
502
503dnl Check the depend program we can use
504APR_CHECK_DEPEND
505
506proc_mutex_is_global=0
507
508config_subdirs="none"
509INSTALL_SUBDIRS="none"
510OBJECTS_PLATFORM='$(OBJECTS_unix)'
511
512case $host in
513   i386-ibm-aix* | *-ibm-aix[[1-2]].* | *-ibm-aix3.* | *-ibm-aix4.1 | *-ibm-aix4.1.* | *-ibm-aix4.2 | *-ibm-aix4.2.*)
514       OSDIR="aix"
515       APR_ADDTO(LDFLAGS,-lld)
516       eolstr="\\n"
517       OBJECTS_PLATFORM='$(OBJECTS_aix)'
518       ;;
519   *-os2*)
520       APR_ADDTO(CPPFLAGS,-DOS2)
521       APR_ADDTO(CFLAGS,-Zmt)
522       AC_CHECK_LIB(bsd, random)
523       OSDIR="os2"
524       enable_threads="system_threads"
525       eolstr="\\r\\n"
526       file_as_socket="0"
527       proc_mutex_is_global=1
528       OBJECTS_PLATFORM='$(OBJECTS_os2)'
529       ;;
530   *beos*)
531       OSDIR="beos"
532       APR_ADDTO(CPPFLAGS,-DBEOS)
533       enable_threads="system_threads"
534       native_mmap_emul="1"
535       APR_CHECK_DEFINE(BONE_VERSION, sys/socket.h)
536       eolstr="\\n"
537       osver=`uname -r`
538       proc_mutex_is_global=1
539       OBJECTS_PLATFORM='$(OBJECTS_beos)'
540       case $osver in
541          5.0.4)
542             file_as_socket="1"
543             ;;
544          *)
545             file_as_socket="0"
546             ;;
547       esac
548       ;;
549   *os390)
550       OSDIR="os390"
551       OBJECTS_PLATFORM='$(OBJECTS_os390)'
552       eolstr="\\n"
553       ;;
554   *os400)
555       OSDIR="as400"
556       eolstr="\\n"
557       ;;
558   *mingw*)
559       OSDIR="win32"
560       enable_threads="system_threads"
561       eolstr="\\r\\n"
562       file_as_socket=0
563       proc_mutex_is_global=1
564       OBJECTS_PLATFORM='$(OBJECTS_win32)'
565       ;;
566   *cygwin*)
567       OSDIR="unix"
568       enable_threads="no"
569       eolstr="\\n"
570       ;;
571   *hpux10* ) 
572       enable_threads="no"
573       OSDIR="unix"
574       eolstr="\\n"
575       ;;
576   *)
577       OSDIR="unix"
578       eolstr="\\n"
579       ;;
580esac
581
582AC_SUBST(OBJECTS_PLATFORM)
583
584# Check whether LFS has explicitly been disabled
585AC_ARG_ENABLE(lfs,[  --disable-lfs           Disable large file support on 32-bit platforms],
586[apr_lfs_choice=$enableval], [apr_lfs_choice=yes])
587
588if test "$apr_lfs_choice" = "yes"; then
589   # Check whether the transitional LFS API is sufficient
590   AC_CACHE_CHECK([whether to enable -D_LARGEFILE64_SOURCE], [apr_cv_use_lfs64], [
591   apr_save_CPPFLAGS=$CPPFLAGS
592   CPPFLAGS="$CPPFLAGS -D_LARGEFILE64_SOURCE"
593   AC_TRY_RUN([
594#include <sys/types.h>
595#include <sys/stat.h>
596#include <fcntl.h>
597#include <stdlib.h>
598#include <stdio.h>
599#include <unistd.h>
600
601void main(void)
602{
603    int fd, ret = 0;
604    struct stat64 st;
605    off64_t off = 4242;
606
607    if (sizeof(off64_t) != 8 || sizeof(off_t) != 4)
608       exit(1);
609    if ((fd = open("conftest.lfs", O_LARGEFILE|O_CREAT|O_WRONLY, 0644)) < 0)
610       exit(2);
611    if (ftruncate64(fd, off) != 0)
612       ret = 3;
613    else if (fstat64(fd, &st) != 0 || st.st_size != off)
614       ret = 4;
615    else if (lseek64(fd, off, SEEK_SET) != off)
616       ret = 5;
617    else if (close(fd) != 0)
618       ret = 6;
619    else if (lstat64("conftest.lfs", &st) != 0 || st.st_size != off)
620       ret = 7;
621    else if (stat64("conftest.lfs", &st) != 0 || st.st_size != off)
622       ret = 8;
623    unlink("conftest.lfs");
624
625    exit(ret);
626}], [apr_cv_use_lfs64=yes], [apr_cv_use_lfs64=no], [apr_cv_use_lfs64=no])
627   CPPFLAGS=$apr_save_CPPFLAGS])
628   if test "$apr_cv_use_lfs64" = "yes"; then
629      APR_ADDTO(CPPFLAGS, [-D_LARGEFILE64_SOURCE])
630   fi
631fi
632
633AC_ARG_ENABLE(nonportable-atomics,
634[  --enable-nonportable-atomics  Use optimized atomic code which may produce nonportable binaries],
635[if test $enableval = yes; then
636   force_generic_atomics=no
637 else
638   force_generic_atomics=yes
639 fi
640],
641[case $host_cpu in
642   i[[456]]86) force_generic_atomics=yes ;;
643   *) force_generic_atomics=no ;;
644esac
645])
646
647if test $force_generic_atomics = yes; then
648   AC_DEFINE([USE_ATOMICS_GENERIC], 1,
649             [Define if use of generic atomics is requested])
650fi
651
652AC_SUBST(proc_mutex_is_global)
653AC_SUBST(eolstr)
654AC_SUBST(INSTALL_SUBDIRS)
655
656# For some platforms we need a version string which allows easy numeric
657# comparisons.
658case $host in
659    *freebsd*)
660        if test -x /sbin/sysctl; then
661            os_version=`/sbin/sysctl -n kern.osreldate`
662        else
663            os_version=000000
664        fi
665        ;;
666    *linux*)
667        os_major=[`uname -r | sed -e 's/\([1-9][0-9]*\)\..*/\1/'`]
668        os_minor=[`uname -r | sed -e 's/[1-9][0-9]*\.\([0-9]\+\)\..*/\1/'`]
669        if test $os_major -lt 2 -o \( $os_major -eq 2 -a $os_minor -lt 4 \); then
670            AC_MSG_WARN([Configured for pre-2.4 Linux $os_major.$os_minor])
671            os_pre24linux=1
672        else
673            os_pre24linux=0
674            AC_MSG_NOTICE([Configured for Linux $os_major.$os_minor])
675        fi
676        ;;
677    *os390)
678        os_version=`uname -r | sed -e 's/\.//g'`
679        ;;
680    *)
681        os_version=OS_VERSION_IS_NOT_SET
682        ;;
683esac
684
685echo "${nl}Checking for libraries..."
686
687dnl ----------------------------- Checks for Any required Libraries
688dnl Note: Autoconf will always append LIBS with an extra " " in AC_CHECK_LIB.
689dnl It should check for LIBS being empty and set LIBS equal to the new value 
690dnl without the extra " " in that case, but they didn't do that.  So, we
691dnl end up LIBS="-lm -lcrypt -lnsl  -ldl" which is an annoyance.
692case $host in
693   *mingw*)
694      APR_ADDTO(LIBS,[-lshell32 -ladvapi32 -lws2_32 -lrpcrt4 -lmswsock])
695      ac_cv_func_CreateFileMapping=yes
696      ;;
697   *)
698      AC_SEARCH_LIBS(gethostbyname, nsl)
699      AC_SEARCH_LIBS(gethostname, nsl)
700      AC_SEARCH_LIBS(socket, socket)
701      AC_SEARCH_LIBS(crypt, crypt ufc)
702      AC_CHECK_LIB(truerand, main)
703      AC_SEARCH_LIBS(modf, m)
704       ;;
705esac
706
707dnl ----------------------------- Checking for Threads
708echo "${nl}Checking for Threads..."
709
710if test -z "$enable_threads"; then
711	AC_ARG_ENABLE(threads,
712	[  --enable-threads        Enable threading support in APR.],
713	[ enable_threads=$enableval] ,
714	[ APR_CHECK_PTHREADS_H([ enable_threads="pthread" ] ,
715	                       [ enable_threads="no" ] ) ] )
716fi
717
718if test "$enable_threads" = "no"; then
719    threads="0"
720    pthreadh="0"
721    pthreadser="0"
722else
723    if test "$enable_threads" = "pthread"; then
724# We have specified pthreads for our threading library, just make sure
725# that we have everything we need
726      APR_PTHREADS_CHECK_SAVE
727      APR_PTHREADS_CHECK
728      APR_CHECK_PTHREADS_H([
729          threads="1"
730          pthreadh="1"
731          pthreadser="1" ], [
732          threads="0"
733          pthreadh="0"
734          pthreadser="0"
735          APR_PTHREADS_CHECK_RESTORE ] )
736    elif test "$enable_threads" = "system_threads"; then
737        threads="1"
738        pthreadh="0"
739        pthreadser="0"
740    else
741# We basically specified that we wanted threads, but not how to implement
742# them.  In this case, just look for pthreads.  In the future, we can check
743# for other threading libraries as well.
744      APR_PTHREADS_CHECK_SAVE
745      APR_PTHREADS_CHECK
746      APR_CHECK_PTHREADS_H([
747          threads="1"
748          pthreadh="1"
749          pthreadser="1" ], [
750          threads="0"
751          pthreadser="0"
752          pthreadh="0"
753          APR_PTHREADS_CHECK_RESTORE ] )
754    fi
755    if test "$pthreadh" = "1"; then
756        APR_CHECK_PTHREAD_GETSPECIFIC_TWO_ARGS
757        APR_CHECK_PTHREAD_ATTR_GETDETACHSTATE_ONE_ARG
758        APR_CHECK_PTHREAD_RECURSIVE_MUTEX
759        AC_CHECK_FUNCS([pthread_key_delete pthread_rwlock_init \
760                        pthread_attr_setguardsize pthread_yield])
761
762        if test "$ac_cv_func_pthread_rwlock_init" = "yes"; then
763            dnl ----------------------------- Checking for pthread_rwlock_t
764            AC_CACHE_CHECK([for pthread_rwlock_t], [apr_cv_type_rwlock_t],
765            AC_TRY_COMPILE([#include <sys/types.h>
766#include <pthread.h>], [pthread_rwlock_t *rwlock;],
767              [apr_cv_type_rwlock_t=yes], [apr_cv_type_rwlock_t=no], 
768              [apr_cv_type_rwlock_t=no]))
769            if test "$apr_cv_type_rwlock_t" = "yes"; then
770               AC_DEFINE(HAVE_PTHREAD_RWLOCKS, 1, [Define if pthread rwlocks are available])
771            fi
772        fi
773
774        if test "$ac_cv_func_pthread_yield" = "no"; then
775            dnl ----------------------------- Checking for sched_yield
776            AC_CHECK_HEADERS([sched.h])
777            AC_CHECK_FUNCS([sched_yield])
778        fi
779    fi
780fi
781
782ac_cv_define_READDIR_IS_THREAD_SAFE=no
783ac_cv_define_GETHOSTBYNAME_IS_THREAD_SAFE=no
784ac_cv_define_GETHOSTBYADDR_IS_THREAD_SAFE=no
785ac_cv_define_GETSERVBYNAME_IS_THREAD_SAFE=no
786if test "$threads" = "1"; then
787    echo "APR will use threads"
788    AC_CHECK_LIB(c_r, readdir,
789        AC_DEFINE(READDIR_IS_THREAD_SAFE, 1, 
790                  [Define if readdir is thread safe]))
791    if test "x$apr_gethostbyname_is_thread_safe" = "x"; then
792        AC_CHECK_LIB(c_r, gethostbyname, apr_gethostbyname_is_thread_safe=yes)
793    fi
794    if test "$apr_gethostbyname_is_thread_safe" = "yes"; then
795        AC_DEFINE(GETHOSTBYNAME_IS_THREAD_SAFE, 1,
796                  [Define if gethostbyname is thread safe])
797    fi
798    if test "x$apr_gethostbyaddr_is_thread_safe" = "x"; then
799        AC_CHECK_LIB(c_r, gethostbyaddr, apr_gethostbyaddr_is_thread_safe=yes)
800    fi
801    if test "$apr_gethostbyaddr_is_thread_safe" = "yes"; then
802        AC_DEFINE(GETHOSTBYADDR_IS_THREAD_SAFE, 1, 
803                  [Define if gethostbyaddr is thread safe])
804    fi
805    if test "x$apr_getservbyname_is_thread_safe" = "x"; then
806        AC_CHECK_LIB(c_r, getservbyname, apr_getservbyname_is_thread_safe=yes)
807    fi
808    if test "$apr_getservbyname_is_thread_safe" = "yes"; then
809        AC_DEFINE(GETSERVBYNAME_IS_THREAD_SAFE, 1, 
810                  [Define if getservbyname is thread safe])
811    fi
812    AC_CHECK_FUNCS(gethostbyname_r gethostbyaddr_r getservbyname_r)
813else
814    echo "APR will be non-threaded"
815fi
816
817dnl Electric Fence malloc checker.
818dnl --with-efence specifies the path to Electric Fence.
819dnl This test should remain after the threads checks since libefence
820dnl may depend on libpthread.
821AC_ARG_WITH(efence, 
822  [  --with-efence[[=DIR]]     path to Electric Fence installation], 
823  [ apr_efence_dir="$withval"
824    if test "$apr_efence_dir" != "yes"; then
825      APR_ADDTO(LDFLAGS,[-L$apr_efence_dir/lib])
826      if test "x$apr_platform_runtime_link_flag" != "x"; then
827          APR_ADDTO(LDFLAGS, 
828                    [$apr_platform_runtime_link_flag$apr_efence_dir/lib])
829      fi
830    fi
831    AC_CHECK_LIB(efence, malloc, 
832                 [ APR_ADDTO(LIBS,-lefence) ],
833                 [ AC_MSG_ERROR(Electric Fence requested but not detected) ])
834  ])
835
836AC_CHECK_FUNCS(sigsuspend, [ have_sigsuspend="1" ], [ have_sigsuspend="0" ])
837AC_CHECK_FUNCS(sigwait, [ have_sigwait="1" ], [ have_sigwait="0" ]) 
838dnl AC_CHECK_FUNCS doesn't work for this on Tru64 since the function
839dnl is renamed in signal.h.  Todo: Autodetect
840case $host in
841    *alpha*-dec-osf* )
842        have_sigwait="1"
843        ;;
844esac
845
846AC_SUBST(threads)
847AC_SUBST(have_sigsuspend)
848AC_SUBST(have_sigwait)
849
850AC_CHECK_FUNCS(poll kqueue port_create)
851
852# Check for the Linux epoll interface; epoll* may be available in libc
853# but return ENOSYS on a pre-2.6 kernel, so do a run-time check.
854AC_CACHE_CHECK([for epoll support], [apr_cv_epoll],
855[AC_TRY_RUN([
856#include <sys/epoll.h>
857#include <unistd.h>
858
859int main()
860{
861    return epoll_create(5) == -1;
862}], [apr_cv_epoll=yes], [apr_cv_epoll=no], [apr_cv_epoll=no])])
863
864if test "$apr_cv_epoll" = "yes"; then
865   AC_DEFINE([HAVE_EPOLL], 1, [Define if the epoll interface is supported])
866fi
867
868dnl ----------------------------- Checking for extended file descriptor handling
869# test for epoll_create1
870AC_CACHE_CHECK([for epoll_create1 support], [apr_cv_epoll_create1],
871[AC_TRY_RUN([
872#include <sys/epoll.h>
873#include <unistd.h>
874
875int main()
876{
877    return epoll_create1(0) == -1;
878}], [apr_cv_epoll_create1=yes], [apr_cv_epoll_create1=no], [apr_cv_epoll_create1=no])])
879
880if test "$apr_cv_epoll_create1" = "yes"; then
881   AC_DEFINE([HAVE_EPOLL_CREATE1], 1, [Define if epoll_create1 function is supported])
882fi
883
884# test for dup3
885AC_CACHE_CHECK([for dup3 support], [apr_cv_dup3],
886[AC_TRY_RUN([
887#include <unistd.h>
888
889int main()
890{
891    return dup3(STDOUT_FILENO, STDERR_FILENO, 0) == -1;
892}], [apr_cv_dup3=yes], [apr_cv_dup3=no], [apr_cv_dup3=no])])
893
894if test "$apr_cv_dup3" = "yes"; then
895   AC_DEFINE([HAVE_DUP3], 1, [Define if dup3 function is supported])
896fi
897
898# Test for accept4().  Create a non-blocking socket, bind it to
899# an unspecified port & address (kernel picks), and attempt to
900# call accept4() on it.  If the syscall is wired up (i.e. the
901# kernel is new enough), it should return EAGAIN.
902AC_CACHE_CHECK([for accept4 support], [apr_cv_accept4],
903[AC_TRY_RUN([
904#include <sys/types.h>
905#include <sys/socket.h>
906#include <sys/wait.h>
907#include <netinet/in.h>
908#include <netinet/tcp.h>
909#include <errno.h>
910#include <string.h>
911#include <unistd.h>
912#include <fcntl.h>
913
914int main(int argc, char **argv)
915{
916    int fd, flags;
917    struct sockaddr_in sin;
918
919    if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
920        return 1;
921    flags = fcntl(fd, F_GETFL);
922    if (flags == -1 || fcntl(fd, F_SETFL, flags|O_NONBLOCK) == -1)
923        return 5;
924
925    memset(&sin, 0, sizeof sin);
926    sin.sin_family = AF_INET;
927    
928    if (bind(fd, (struct sockaddr *) &sin, sizeof sin) == -1)
929        return 2;
930    
931    if (listen(fd, 5) == -1)
932        return 3;
933
934    if (accept4(fd, NULL, 0, SOCK_NONBLOCK) == 0
935        || errno == EAGAIN || errno == EWOULDBLOCK)
936        return 0;
937
938    return 4;
939}], [apr_cv_accept4=yes], [apr_cv_accept4=no], [apr_cv_accept4=no])])
940
941if test "$apr_cv_accept4" = "yes"; then
942   AC_DEFINE([HAVE_ACCEPT4], 1, [Define if accept4 function is supported])
943fi
944
945AC_CACHE_CHECK([for SOCK_CLOEXEC support], [apr_cv_sock_cloexec],
946[AC_TRY_RUN([
947#include <sys/types.h>
948#include <sys/socket.h>
949
950int main()
951{
952    return socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, 0) == -1;
953}], [apr_cv_sock_cloexec=yes], [apr_cv_sock_cloexec=no], [apr_cv_sock_cloexec=no])])
954
955if test "$apr_cv_sock_cloexec" = "yes"; then
956   AC_DEFINE([HAVE_SOCK_CLOEXEC], 1, [Define if the SOCK_CLOEXEC flag is supported])
957fi
958
959dnl ----------------------------- Checking for fdatasync: OS X doesn't have it
960AC_CHECK_FUNCS(fdatasync)
961
962dnl ----------------------------- Checking for extended file descriptor handling
963# test for epoll_create1
964AC_CACHE_CHECK([for epoll_create1 support], [apr_cv_epoll_create1],
965[AC_TRY_RUN([
966#include <sys/epoll.h>
967#include <unistd.h>
968
969int main()
970{
971    return epoll_create1(0) == -1;
972}], [apr_cv_epoll_create1=yes], [apr_cv_epoll_create1=no], [apr_cv_epoll_create1=no])])
973
974if test "$apr_cv_epoll_create1" = "yes"; then
975   AC_DEFINE([HAVE_EPOLL_CREATE1], 1, [Define if epoll_create1 function is supported])
976fi
977
978# Check for z/OS async i/o support.  
979AC_CACHE_CHECK([for asio -> message queue support], [apr_cv_aio_msgq],
980[AC_TRY_RUN([
981#define _AIO_OS390
982#include <aio.h>
983
984int main()
985{
986    struct aiocb a;
987
988    a.aio_notifytype = AIO_MSGQ;  /* use IPC message queue for notification */
989
990    return aio_cancel(2, NULL) == -1;
991}], [apr_cv_aio_msgq=yes], [apr_cv_aio_msgq=no], [apr_cv_aio_msgq=no])])
992
993if test "$apr_cv_aio_msgq" = "yes"; then
994   AC_DEFINE([HAVE_AIO_MSGQ], 1, [Define if async i/o supports message q's])
995fi
996
997# test for dup3
998AC_CACHE_CHECK([for dup3 support], [apr_cv_dup3],
999[AC_TRY_RUN([
1000#include <unistd.h>
1001
1002int main()
1003{
1004    return dup3(STDOUT_FILENO, STDERR_FILENO, 0) == -1;
1005}], [apr_cv_dup3=yes], [apr_cv_dup3=no], [apr_cv_dup3=no])])
1006
1007if test "$apr_cv_dup3" = "yes"; then
1008   AC_DEFINE([HAVE_DUP3], 1, [Define if dup3 function is supported])
1009fi
1010
1011# test for accept4
1012AC_CACHE_CHECK([for accept4 support], [apr_cv_accept4],
1013[AC_TRY_RUN([
1014#include <unistd.h>
1015#include <sys/types.h>
1016#include <sys/socket.h>
1017#include <sys/un.h>
1018#include <sys/wait.h>
1019#include <signal.h>
1020#include <errno.h>
1021
1022#define A4_SOCK "./apr_accept4_test_socket"
1023
1024int main()
1025{
1026    pid_t pid;
1027    int fd;
1028    struct sockaddr_un loc, rem;
1029    socklen_t rem_sz;
1030
1031    if ((pid = fork())) {
1032        int status;
1033
1034        unlink(A4_SOCK);
1035
1036        if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
1037            goto cleanup_failure2;
1038
1039        loc.sun_family = AF_UNIX;
1040        strncpy(loc.sun_path, A4_SOCK, sizeof(loc.sun_path) - 1);
1041
1042        if (bind(fd, (struct sockaddr *) &loc,
1043                 sizeof(struct sockaddr_un)) == -1)
1044            goto cleanup_failure;
1045
1046        if (listen(fd, 5) == -1)
1047            goto cleanup_failure;
1048
1049        rem_sz = sizeof(struct sockaddr_un);
1050        if (accept4(fd, (struct sockaddr *) &rem, &rem_sz, 0) == -1) {
1051            goto cleanup_failure;
1052        }
1053        else {
1054            close(fd);
1055            waitpid(pid, &status, 0);
1056            unlink(A4_SOCK);
1057            return 0;
1058        }
1059
1060cleanup_failure:
1061        close(fd);
1062cleanup_failure2:
1063        kill(pid, SIGKILL);
1064        waitpid(pid, &status, 0);
1065        unlink(A4_SOCK);
1066        return 1;
1067    }
1068    else {
1069        if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
1070            return 1; /* this will be bad: we'll hang */
1071
1072        loc.sun_family = AF_UNIX;
1073        strncpy(loc.sun_path, A4_SOCK, sizeof(loc.sun_path) - 1);
1074
1075        while(connect(fd, (struct sockaddr *) &loc,
1076                      sizeof(struct sockaddr_un)) == -1 &&
1077              (errno==ENOENT || errno==ECONNREFUSED))
1078            ;
1079
1080        close(fd);
1081        return 0;
1082    }
1083}], [apr_cv_accept4=yes], [apr_cv_accept4=no], [apr_cv_accept4=no])])
1084
1085if test "$apr_cv_accept4" = "yes"; then
1086   AC_DEFINE([HAVE_ACCEPT4], 1, [Define if accept4 function is supported])
1087fi
1088
1089AC_CACHE_CHECK([for SOCK_CLOEXEC support], [apr_cv_sock_cloexec],
1090[AC_TRY_RUN([
1091#include <sys/types.h>
1092#include <sys/socket.h>
1093
1094int main()
1095{
1096    return socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, 0) == -1;
1097}], [apr_cv_sock_cloexec=yes], [apr_cv_sock_cloexec=no], [apr_cv_sock_cloexec=no])])
1098
1099if test "$apr_cv_sock_cloexec" = "yes"; then
1100   AC_DEFINE([HAVE_SOCK_CLOEXEC], 1, [Define if the SOCK_CLOEXEC flag is supported])
1101fi
1102
1103dnl ----------------------------- Checking for missing POSIX thread functions
1104AC_CHECK_FUNCS([getpwnam_r getpwuid_r getgrnam_r getgrgid_r])
1105
1106dnl ----------------------------- Checking for Shared Memory Support 
1107echo "${nl}Checking for Shared Memory Support..."
1108
1109# The real-time POSIX extensions (e.g. shm_*, sem_*) may only
1110# be available if linking against librt.
1111AC_SEARCH_LIBS(shm_open, rt)
1112
1113case $host in
1114 *-sysv*)
1115   ac_includes_default="$ac_includes_default
1116#if HAVE_SYS_MUTEX_H /* needed to define lock_t for sys/shm.h */
1117# include <sys/mutex.h>
1118#endif";;
1119esac
1120
1121AC_CHECK_HEADERS([sys/types.h sys/mman.h sys/ipc.h sys/mutex.h sys/shm.h sys/file.h kernel/OS.h os2.h windows.h])
1122AC_CHECK_FUNCS([mmap munmap shm_open shm_unlink shmget shmat shmdt shmctl \
1123                create_area])
1124
1125APR_CHECK_DEFINE(MAP_ANON, sys/mman.h)
1126AC_CHECK_FILE(/dev/zero)
1127
1128# Not all systems can mmap /dev/zero (such as HP-UX).  Check for that.
1129if test "$ac_cv_func_mmap" = "yes" &&
1130   test "$ac_cv_file__dev_zero" = "yes"; then
1131    AC_MSG_CHECKING(for mmap that can map /dev/zero)
1132    AC_TRY_RUN([
1133#include <sys/types.h>
1134#include <sys/stat.h>
1135#include <fcntl.h>
1136#ifdef HAVE_SYS_MMAN_H
1137#include <sys/mman.h>
1138#endif
1139    int main()
1140    {
1141        int fd;
1142        void *m;
1143        fd = open("/dev/zero", O_RDWR);
1144        if (fd < 0) {
1145            return 1;
1146        }
1147        m = mmap(0, sizeof(void*), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
1148        if (m == (void *)-1) {  /* aka MAP_FAILED */
1149            return 2;
1150        }
1151        if (munmap(m, sizeof(void*)) < 0) {
1152            return 3;
1153        }
1154        return 0;
1155    }], [], [ac_cv_file__dev_zero=no], [ac_cv_file__dev_zero=no])
1156
1157    AC_MSG_RESULT($ac_cv_file__dev_zero)
1158fi
1159
1160# Now we determine which one is our anonymous shmem preference.
1161haveshmgetanon="0"
1162havemmapzero="0"
1163havemmapanon="0"
1164APR_BEGIN_DECISION([anonymous shared memory allocation method])
1165APR_IFALLYES(header:sys/ipc.h header:sys/shm.h header:sys/file.h dnl
1166             func:shmget func:shmat func:shmdt func:shmctl,
1167             [haveshmgetanon="1"
1168              APR_DECIDE(USE_SHMEM_SHMGET_ANON, [SysV IPC shmget()])])
1169APR_IFALLYES(header:sys/mman.h func:mmap func:munmap file:/dev/zero,
1170             [havemmapzero="1"
1171              APR_DECIDE(USE_SHMEM_MMAP_ZERO, 
1172                  [SVR4-style mmap() on /dev/zero])])
1173APR_IFALLYES(header:sys/mman.h func:mmap func:munmap define:MAP_ANON,
1174             [havemmapanon="1"
1175              APR_DECIDE(USE_SHMEM_MMAP_ANON, 
1176                  [4.4BSD-style mmap() via MAP_ANON])])
1177APR_IFALLYES(header:os2.h,
1178             [haveos2shm="1"
1179              APR_DECIDE(USE_SHMEM_OS2_ANON, [OS/2 DosAllocSharedMem()])])
1180APR_IFALLYES(header:kernel/OS.h func:create_area,
1181             [havebeosshm="1"
1182              APR_DECIDE(USE_SHMEM_BEOS_ANON,
1183                         [BeOS areas])])
1184APR_IFALLYES(header:windows.h func:CreateFileMapping,
1185             [havewin32shm="1"
1186              APR_DECIDE(USE_SHMEM_WIN32_ANON,
1187                         [Windows CreateFileMapping()])])
1188case $host in
1189    *linux* ) 
1190        # Linux has problems with MM_SHMT_MMANON even though it reports
1191        # that it has it.
1192        # FIXME - find exact 2.3 version that MMANON was fixed in.  It is
1193        # confirmed fixed in 2.4 series.
1194        if test $os_pre24linux -eq 1; then
1195            AC_MSG_WARN([Disabling anon mmap() support for Linux pre-2.4])
1196            APR_DECISION_OVERRIDE(USE_SHMEM_MMAP_ZERO USE_SHMEM_SHMGET_ANON)
1197        fi
1198        ;;
1199    *hpux11* ) 
1200        APR_DECISION_OVERRIDE(USE_SHMEM_SHMGET_ANON)
1201        ;;
1202esac
1203APR_END_DECISION
1204AC_DEFINE_UNQUOTED($ac_decision)
1205
1206useshmgetanon="0"
1207usemmapzero="0"
1208usemmapanon="0"
1209
1210case $ac_decision in
1211    USE_SHMEM_SHMGET_ANON )
1212        useshmgetanon="1"
1213        ;;
1214    USE_SHMEM_MMAP_ZERO )
1215        usemmapzero="1"
1216        ;;
1217    USE_SHMEM_MMAP_ANON )
1218        usemmapanon="1"
1219        ;;
1220esac
1221
1222AC_SUBST(useshmgetanon)
1223AC_SUBST(usemmapzero)
1224AC_SUBST(usemmapanon)
1225AC_SUBST(haveshmgetanon)
1226AC_SUBST(havemmapzero)
1227AC_SUBST(havemmapanon)
1228
1229# Now we determine which one is our name-based shmem preference.
1230havemmaptmp="0"
1231havemmapshm="0"
1232haveshmget="0"
1233havebeosarea="0"
1234haveos2shm="0"
1235havewin32shm="0"
1236APR_BEGIN_DECISION([namebased memory allocation method])
1237APR_IFALLYES(header:sys/mman.h func:mmap func:munmap,
1238             [havemmaptmp="1"
1239              APR_DECIDE(USE_SHMEM_MMAP_TMP, 
1240                  [Classical mmap() on temporary file])])
1241APR_IFALLYES(header:sys/mman.h func:mmap func:munmap func:shm_open dnl
1242             func:shm_unlink,
1243             [havemmapshm="1"
1244              APR_DECIDE(USE_SHMEM_MMAP_SHM, 
1245                  [mmap() via POSIX.1 shm_open() on temporary file])])
1246APR_IFALLYES(header:sys/ipc.h header:sys/shm.h header:sys/file.h dnl
1247             func:shmget func:shmat func:shmdt func:shmctl,
1248             [haveshmget="1"
1249              APR_DECIDE(USE_SHMEM_SHMGET, [SysV IPC shmget()])])
1250APR_IFALLYES(header:kernel/OS.h func:create_area,
1251             [havebeosshm="1"
1252              APR_DECIDE(USE_SHMEM_BEOS, [BeOS areas])])
1253APR_IFALLYES(header:os2.h,
1254             [haveos2shm="1"
1255              APR_DECIDE(USE_SHMEM_OS2, [OS/2 DosAllocSharedMem()])])
1256APR_IFALLYES(header:windows.h,
1257             [havewin32shm="1"
1258              APR_DECIDE(USE_SHMEM_WIN32, [Windows shared memory])])
1259AC_ARG_ENABLE(posix-shm,
1260[  --enable-posix-shm      Use POSIX shared memory (shm_open) if available],
1261[
1262if test "$havemmapshm" = "1"; then
1263  APR_DECISION_OVERRIDE(USE_SHMEM_MMAP_SHM)
1264fi
1265])
1266case $host in
1267    *linux* ) 
1268        # Linux pre-2.4 had problems with MM_SHMT_MMANON even though
1269        # it reports that it has it.
1270        if test $os_pre24linux -eq 1; then
1271            APR_DECISION_OVERRIDE(USE_SHMEM_MMAP_TMP USE_SHMEM_MMAP_SHM dnl
1272                                  USE_SHMEM_SHMGET)
1273        fi
1274        ;;
1275esac
1276APR_END_DECISION
1277AC_DEFINE_UNQUOTED($ac_decision)
1278
1279usemmaptmp="0"
1280usemmapshm="0"
1281useshmget="0"
1282usebeosarea="0"
1283useos2shm="0"
1284usewin32shm="0"
1285
1286case $ac_decision in
1287    USE_SHMEM_MMAP_TMP )
1288        usemmaptmp="1"
1289        ;;
1290    USE_SHMEM_MMAP_SHM )
1291        usemmapshm="1"
1292        ;;
1293    USE_SHMEM_SHMGET )
1294        useshmget="1"
1295        ;;
1296    USE_SHMEM_BEOS )
1297        usebeosarea="1"
1298        ;;
1299    USE_SHMEM_OS2 )
1300        useos2shm="1"
1301        ;;
1302    USE_SHMEM_WIN32 )
1303        usewin32shm="1"
1304        ;;
1305esac
1306
1307# Do we have any shared memory support?
1308if test "$usemmaptmp$usemmapshm$usemmapzero$useshmget$usemmapanon$usebeosarea$useos2shm$usewin32shm" = "00000000"; then
1309  sharedmem="0"
1310else
1311  sharedmem="1"
1312fi
1313
1314AC_SUBST(usemmaptmp)
1315AC_SUBST(usemmapshm)
1316AC_SUBST(useshmget)
1317AC_SUBST(usebeosarea)
1318AC_SUBST(useos2shm)
1319AC_SUBST(usewin32shm)
1320AC_SUBST(havemmaptmp)
1321AC_SUBST(havemmapshm)
1322AC_SUBST(haveshmget)
1323AC_SUBST(havebeosarea)
1324AC_SUBST(haveos2shm)
1325AC_SUBST(havewin32shm)
1326AC_SUBST(sharedmem)
1327
1328dnl ----------------------------- Checks for Any required Functions
1329dnl Checks for library functions. (N.B. poll is further down)
1330
1331AC_FUNC_ALLOCA
1332
1333AC_CHECK_FUNCS([calloc setsid isinf isnan \
1334                getenv putenv setenv unsetenv \
1335                writev getifaddrs utime utimes])
1336AC_CHECK_FUNCS(setrlimit, [ have_setrlimit="1" ], [ have_setrlimit="0" ]) 
1337AC_CHECK_FUNCS(getrlimit, [ have_getrlimit="1" ], [ have_getrlimit="0" ]) 
1338sendfile="0"
1339AC_CHECK_LIB(sendfile, sendfilev)
1340AC_CHECK_FUNCS(sendfile send_file sendfilev, [ sendfile="1" ])
1341
1342dnl THIS MUST COME AFTER THE THREAD TESTS - FreeBSD doesn't always have a
1343dnl threaded poll() and we don't want to use sendfile on early FreeBSD 
1344dnl systems if we are also using threads.
1345
1346AC_ARG_WITH(sendfile, [  --with-sendfile         Override decision to use sendfile],
1347  [ if test "$withval" = "yes"; then
1348        sendfile="1"
1349    else
1350        sendfile="0"
1351    fi ], [
1352    orig_sendfile=$sendfile
1353    case $host in
1354        *freebsd*)
1355            # FreeBSD < 4.2 has issues with threads+sendfile
1356            if test $os_version -le "401999"; then
1357                if test "$threads" = "1"; then
1358                    sendfile="0"
1359                fi
1360            fi
1361            ;;
1362        *alpha*-dec-osf* )
1363            sendfile="0"
1364            ;;
1365        s390-*-linux-gnu)
1366            # disable sendfile support for 2.2 on S/390
1367            if test $os_pre24linux -eq 1; then
1368                AC_MSG_WARN([Disabled sendfile support for Linux 2.2 on S/390])
1369                sendfile="0"
1370            fi
1371            ;;
1372        *aix*)
1373            # compiler-independent check for 64-bit build
1374            AC_CHECK_SIZEOF(void*, 4)
1375            if test "x$ac_cv_sizeof_voidp" = "x8"; then
1376                # sendfile not working for 64-bit build
1377                sendfile="0"
1378            fi
1379            ;;
1380    esac       
1381    if test "$orig_sendfile" != "$sendfile"; then
1382      echo "sendfile support disabled to avoid system problem"
1383    fi ] )
1384AC_SUBST(sendfile)
1385
1386AC_CHECK_FUNCS(sigaction, [ have_sigaction="1" ], [ have_sigaction="0" ]) 
1387AC_DECL_SYS_SIGLIST
1388
1389AC_CHECK_FUNCS(fork, [ fork="1" ], [ fork="0" ])
1390APR_CHECK_INET_ADDR
1391APR_CHECK_INET_NETWORK
1392AC_SUBST(apr_inaddr_none)
1393AC_CHECK_FUNC(_getch)
1394AC_CHECK_FUNCS(strerror_r, [ strerror_r="1" ], [ strerror_r="0" ])
1395if test "$strerror_r" = "1"; then
1396  APR_CHECK_STRERROR_R_RC
1397fi
1398AC_CHECK_FUNCS(mmap, [ mmap="1" ], [ mmap="0" ])
1399if test "$native_mmap_emul" = "1"; then
1400    mmap="1"
1401fi
1402AC_CHECK_FUNCS(memmove, [ have_memmove="1" ], [have_memmove="0" ])
1403AC_CHECK_FUNCS([getpass getpassphrase gmtime_r localtime_r mkstemp])
1404
1405AC_SUBST(fork)
1406AC_SUBST(have_inet_addr)
1407AC_SUBST(tcp_nodelay_inherited)
1408AC_SUBST(o_nonblock_inherited)
1409AC_SUBST(have_inet_network)
1410AC_SUBST(have_sigaction)
1411AC_SUBST(have_setrlimit)
1412AC_SUBST(have_getrlimit)
1413AC_SUBST(mmap)
1414AC_SUBST(have_memmove)
1415
1416APR_CHECK_SIGWAIT_ONE_ARG
1417
1418dnl ----------------------------- Checks for Any required Headers
1419AC_HEADER_STDC
1420
1421APR_FLAG_HEADERS(
1422    ByteOrder.h		\
1423    conio.h		\
1424    crypt.h		\
1425    ctype.h		\
1426    dir.h		\
1427    dirent.h		\
1428    dl.h		\
1429    dlfcn.h		\
1430    errno.h		\
1431    fcntl.h		\
1432    grp.h		\
1433    io.h		\
1434    limits.h		\
1435    mach-o/dyld.h	\
1436    malloc.h		\
1437    memory.h		\
1438    netdb.h		\
1439    osreldate.h		\
1440    poll.h		\
1441    process.h		\
1442    pwd.h		\
1443    semaphore.h		\
1444    signal.h		\
1445    stdarg.h		\
1446    stddef.h		\
1447    stdio.h		\
1448    stdlib.h		\
1449    string.h		\
1450    strings.h		\
1451    sysapi.h		\
1452    sysgtime.h		\
1453    termios.h		\
1454    time.h		\
1455    tpfeq.h		\
1456    tpfio.h		\
1457    unistd.h		\
1458    unix.h		\
1459    windows.h		\
1460    winsock2.h		\
1461    arpa/inet.h		\
1462    kernel/OS.h		\
1463    net/errno.h		\
1464    netinet/in.h	\
1465    netinet/sctp.h      \
1466    netinet/sctp_uio.h  \
1467    sys/file.h		\
1468    sys/ioctl.h         \
1469    sys/mman.h		\
1470    sys/param.h         \
1471    sys/poll.h		\
1472    sys/resource.h	\
1473    sys/select.h	\
1474    sys/sem.h		\
1475    sys/sendfile.h	\
1476    sys/signal.h	\
1477    sys/socket.h	\
1478    sys/sockio.h	\
1479    sys/stat.h          \
1480    sys/sysctl.h	\
1481    sys/syslimits.h	\
1482    sys/time.h		\
1483    sys/types.h		\
1484    sys/uio.h		\
1485    sys/un.h		\
1486    sys/wait.h)
1487
1488# IRIX 6.5 has a problem in <netinet/tcp.h> which prevents it from
1489# being included by itself.  Check for <netinet/tcp.h> manually,
1490# including another header file first.
1491AC_CACHE_CHECK([for netinet/tcp.h], [apr_cv_hdr_netinet_tcp_h],
1492[AC_TRY_CPP(
1493[#ifdef HAVE_NETINET_IN_H
1494#include <netinet/in.h>
1495#endif
1496#include <netinet/tcp.h>
1497], [apr_cv_hdr_netinet_tcp_h=yes], [apr_cv_hdr_netinet_tcp_h=no])])
1498if test "$apr_cv_hdr_netinet_tcp_h" = "yes"; then
1499   netinet_tcph=1
1500   AC_DEFINE([HAVE_NETINET_TCP_H], 1, [Defined if netinet/tcp.h is present])
1501else
1502   netinet_tcph=0
1503fi
1504
1505AC_SUBST(arpa_ineth)
1506AC_SUBST(conioh)
1507AC_SUBST(ctypeh)
1508AC_SUBST(crypth)
1509AC_SUBST(errnoh)
1510AC_SUBST(direnth)
1511AC_SUBST(fcntlh)
1512AC_SUBST(ioh)
1513AC_SUBST(limitsh)
1514AC_SUBST(netdbh)
1515AC_SUBST(sys_syslimitsh)
1516AC_SUBST(netinet_inh)
1517AC_SUBST(netinet_sctph)
1518AC_SUBST(netinet_sctp_uioh)
1519AC_SUBST(netinet_tcph)
1520AC_SUBST(stdargh)
1521AC_SUBST(stdioh)
1522AC_SUBST(stdlibh)
1523AC_SUBST(stringh)
1524AC_SUBST(stringsh)
1525AC_SUBST(sys_ioctlh)
1526AC_SUBST(sys_sendfileh)
1527AC_SUBST(sys_signalh)
1528AC_SUBST(sys_socketh)
1529AC_SUBST(sys_sockioh)
1530AC_SUBST(sys_typesh)
1531AC_SUBST(sys_timeh)
1532AC_SUBST(sys_uioh)
1533AC_SUBST(sys_unh)
1534AC_SUBST(timeh)
1535AC_SUBST(unistdh)
1536AC_SUBST(signalh)
1537AC_SUBST(sys_waith)
1538AC_SUBST(processh)
1539AC_SUBST(pthreadh)
1540AC_SUBST(semaphoreh)
1541AC_SUBST(windowsh)
1542AC_SUBST(winsock2h)
1543
1544# Checking for h_errno in <netdb.h>
1545if test "$netdbh" = "1"; then
1546  APR_CHECK_H_ERRNO_FLAG
1547  if test "$ac_cv_h_errno_cflags" = "no"; then
1548    AC_MSG_ERROR([can not find h_errno in netdb.h])
1549  fi
1550fi
1551
1552AC_ARG_ENABLE(allocator-uses-mmap,
1553  [  --enable-allocator-uses-mmap    Use mmap in apr_allocator instead of malloc ],
1554  [ if test "$enableval" = "yes"; then
1555        APR_IFALLYES(header:sys/mman.h func:mmap func:munmap define:MAP_ANON,
1556                     [AC_DEFINE(APR_ALLOCATOR_USES_MMAP, 1,
1557                                [Define if apr_allocator should use mmap]) ],
1558		     [AC_MSG_ERROR([mmap()/MAP_ANON not supported]) ]
1559		    )
1560    fi ]
1561)
1562
1563dnl ----------------------------- Checks for standard typedefs
1564AC_TYPE_OFF_T
1565AC_TYPE_PID_T
1566AC_TYPE_SIZE_T
1567AC_TYPE_UID_T
1568AC_CHECK_TYPE(ssize_t, int)
1569AC_C_INLINE
1570AC_C_CONST
1571AC_FUNC_SETPGRP
1572
1573APR_CHECK_SOCKLEN_T
1574
1575dnl Checks for pointer size
1576AC_CHECK_SIZEOF(void*, 4)
1577
1578if test "x$ac_cv_sizeof_voidp" != "x"; then
1579    voidp_size=$ac_cv_sizeof_voidp
1580else
1581    AC_ERROR([Cannot determine size of void*])
1582fi
1583
1584dnl Checks for integer size
1585AC_CHECK_SIZEOF(char, 1)
1586AC_CHECK_SIZEOF(int, 4)
1587AC_CHECK_SIZEOF(long, 4)
1588AC_CHECK_SIZEOF(short, 2)
1589AC_CHECK_SIZEOF(long long, 8)
1590
1591if test "$ac_cv_sizeof_short" = "2"; then
1592    short_value=short
1593fi
1594if test "$ac_cv_sizeof_int" = "4"; then
1595    int_value=int
1596fi
1597# Now we need to find what apr_int64_t (sizeof == 8) will be.
1598# The first match is our preference.
1599if test "$ac_cv_sizeof_int" = "8"; then
1600    int64_literal='#define APR_INT64_C(val) (val)'
1601    uint64_literal='#define APR_UINT64_C(val) (val##U)'
1602    int64_t_fmt='#define APR_INT64_T_FMT "d"'
1603    uint64_t_fmt='#define APR_UINT64_T_FMT "u"'
1604    uint64_t_hex_fmt='#define APR_UINT64_T_HEX_FMT "x"'
1605    int64_value="int"
1606    long_value=int
1607    int64_strfn="strtoi"
1608elif test "$ac_cv_sizeof_long" = "8"; then
1609    int64_literal='#define APR_INT64_C(val) (val##L)'
1610    uint64_literal='#define APR_UINT64_C(val) (val##UL)'
1611    int64_t_fmt='#define APR_INT64_T_FMT "ld"'
1612    uint64_t_fmt='#define APR_UINT64_T_FMT "lu"'
1613    uint64_t_hex_fmt='#define APR_UINT64_T_HEX_FMT "lx"'
1614    int64_value="long"
1615    long_value=long
1616    int64_strfn="strtol"
1617elif test "$ac_cv_sizeof_long_long" = "8"; then
1618    int64_literal='#define APR_INT64_C(val) (val##LL)'
1619    uint64_literal='#define APR_UINT64_C(val) (val##ULL)'
1620    # Linux, Solaris, FreeBSD all support ll with printf.
1621    # BSD 4.4 originated 'q'.  Solaris is more popular and 
1622    # doesn't support 'q'.  Solaris wins.  Exceptions can
1623    # go to the OS-dependent section.
1624    int64_t_fmt='#define APR_INT64_T_FMT "lld"'
1625    uint64_t_fmt='#define APR_UINT64_T_FMT "llu"'
1626    uint64_t_hex_fmt='#define APR_UINT64_T_HEX_FMT "llx"'
1627    int64_value="long long"
1628    long_value="long long"
1629    int64_strfn="strtoll"
1630elif test "$ac_cv_sizeof_longlong" = "8"; then
1631    int64_literal='#define APR_INT64_C(val) (val##LL)'
1632    uint64_literal='#define APR_UINT64_C(val) (val##ULL)'
1633    int64_t_fmt='#define APR_INT64_T_FMT "qd"'
1634    uint64_t_fmt='#define APR_UINT64_T_FMT "qu"'
1635    uint64_t_hex_fmt='#define APR_UINT64_T_HEX_FMT "qx"'
1636    int64_value="__int64"
1637    long_value="__int64"
1638    int64_strfn="strtoll"
1639else
1640    # int64_literal may be overriden if your compiler thinks you have
1641    # a 64-bit value but APR does not agree.
1642    AC_ERROR([could not detect a 64-bit integer type])
1643fi
1644
1645# If present, allow the C99 macro INT64_C to override our conversion.
1646#
1647# HP-UX's ANSI C compiler provides this without any includes, so we
1648# will first look for INT64_C without adding stdint.h
1649AC_CACHE_CHECK([for INT64_C], [apr_cv_define_INT64_C], [
1650AC_EGREP_CPP(YES_IS_DEFINED,
1651[#ifdef INT64_C
1652YES_IS_DEFINED
1653#endif], [apr_cv_define_INT64_C=yes], [
1654    # Now check for INT64_C in stdint.h
1655    AC_EGREP_CPP(YES_IS_DEFINED, [#include <stdint.h>
1656#ifdef INT64_C
1657YES_IS_DEFINED
1658#endif], [apr_cv_define_INT64_C=yes], [apr_cv_define_INT64_C=no])])])
1659
1660if test "$apr_cv_define_INT64_C" = "yes"; then
1661    int64_literal='#define APR_INT64_C(val) INT64_C(val)'
1662    uint64_literal='#define APR_UINT64_C(val) UINT64_C(val)'
1663    stdint=1
1664else
1665    stdint=0
1666fi
1667
1668if test "$ac_cv_type_size_t" = "yes"; then
1669    size_t_value="size_t"
1670else
1671    size_t_value="apr_int32_t"
1672fi
1673if test "$ac_cv_type_ssize_t" = "yes"; then
1674    ssize_t_value="ssize_t"
1675else
1676    ssize_t_value="apr_int32_t"
1677fi
1678if test "$ac_cv_socklen_t" = "yes"; then
1679    socklen_t_value="socklen_t"
1680    case $host in
1681        *-hp-hpux*)
1682            if test "$ac_cv_sizeof_long" = "8"; then
1683                # 64-bit HP-UX requires 32-bit socklens in
1684                # kernel, but user-space declarations say
1685                # 64-bit (socklen_t == size_t == long).
1686                # This will result in many compile warnings,
1687                # but we're functionally busted otherwise.
1688                socklen_t_value="int"
1689            fi
1690            ;;
1691    esac
1692else
1693    socklen_t_value="int"
1694fi
1695
1696APR_CHECK_SIZEOF_EXTENDED([#include <sys/types.h>], pid_t, 8)
1697
1698if test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_short"; then
1699    pid_t_fmt='#define APR_PID_T_FMT "hd"'
1700elif test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_int"; then
1701    pid_t_fmt='#define APR_PID_T_FMT "d"'
1702elif test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_long"; then
1703    pid_t_fmt='#define APR_PID_T_FMT "ld"'
1704elif test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_long_long"; then
1705    pid_t_fmt='#define APR_PID_T_FMT APR_INT64_T_FMT'
1706else
1707    pid_t_fmt='#error Can not determine the proper size for pid_t'
1708fi
1709
1710# Basically, we have tried to figure out the correct format strings
1711# for APR types which vary between platforms, but we don't always get
1712# it right.
1713case $host in
1714   s390*linux*)
1715       # uniquely, the 31-bit Linux/s390 uses "unsigned long int"
1716       # for size_t rather than "unsigned int":
1717       size_t_fmt="lu"
1718       ssize_t_fmt="ld"
1719       ;;
1720   *-os2*)
1721       size_t_fmt="lu"
1722       ;;
1723   *-solaris*)
1724       if test "$ac_cv_sizeof_long" = "8"; then
1725         pid_t_fmt='#define APR_PID_T_FMT "d"'
1726       else
1727         pid_t_fmt='#define APR_PID_T_FMT "ld"'
1728       fi
1729       ;;
1730   *aix4*|*aix5*)
1731       ssize_t_fmt="ld"
1732       size_t_fmt="lu"
1733       ;;
1734    *beos*)
1735        ssize_t_fmt="ld"
1736        size_t_fmt="ld"
1737        ;;
1738    *apple-darwin*)
1739        osver=`uname -r`
1740        case $osver in
1741           [[0-7]].*)
1742              ssize_t_fmt="d"
1743              ;;
1744           *)
1745              ssize_t_fmt="ld"
1746              ;;
1747        esac
1748        size_t_fmt="lu"
1749        ;;
1750    *-mingw*)
1751        int64_t_fmt='#define APR_INT64_T_FMT "I64d"'
1752        uint64_t_fmt='#define APR_UINT64_T_FMT "I64u"'
1753        uint64_t_hex_fmt='#define APR_UINT64_T_HEX_FMT "I64x"'
1754        int64_value="__int64"
1755        long_value="__int64"
1756        int64_strfn="_strtoi64"
1757        ;; 
1758esac
1759
1760APR_CHECK_TYPES_COMPATIBLE(ssize_t, int, [ssize_t_fmt="d"])
1761APR_CHECK_TYPES_COMPATIBLE(ssize_t, long, [ssize_t_fmt="ld"])
1762APR_CHECK_TYPES_COMPATIBLE(size_t, unsigned int, [size_t_fmt="u"])
1763APR_CHECK_TYPES_COMPATIBLE(size_t, unsigned long, [size_t_fmt="lu"])
1764
1765APR_CHECK_SIZEOF_EXTENDED([#include <sys/types.h>], ssize_t, 8)
1766
1767AC_MSG_CHECKING([which format to use for apr_ssize_t])
1768if test -n "$ssize_t_fmt"; then
1769    AC_MSG_RESULT(%$ssize_t_fmt)
1770elif test "$ac_cv_sizeof_ssize_t" = "$ac_cv_sizeof_int"; then
1771    ssize_t_fmt="d"
1772    AC_MSG_RESULT(%d)
1773elif test "$ac_cv_sizeof_ssize_t" = "$ac_cv_sizeof_long"; then
1774    ssize_t_fmt="ld"
1775    AC_MSG_RESULT(%ld)
1776else
1777    AC_ERROR([could not determine the proper format for apr_ssize_t])
1778fi
1779
1780ssize_t_fmt="#define APR_SSIZE_T_FMT \"$ssize_t_fmt\""
1781
1782APR_CHECK_SIZEOF_EXTENDED([#include <stddef.h>], size_t, 8)
1783
1784AC_MSG_CHECKING([which format to use for apr_size_t])
1785if test -n "$size_t_fmt"; then
1786    AC_MSG_RESULT(%$size_t_fmt)
1787elif test "$ac_cv_sizeof_size_t" = "$ac_cv_sizeof_int"; then
1788    size_t_fmt="d"
1789    AC_MSG_RESULT(%d)
1790elif test "$ac_cv_sizeof_size_t" = "$ac_cv_sizeof_long"; then
1791    size_t_fmt="ld"
1792    AC_MSG_RESULT(%ld)
1793else
1794    AC_ERROR([could not determine the proper format for apr_size_t])
1795fi
1796
1797size_t_fmt="#define APR_SIZE_T_FMT \"$size_t_fmt\""
1798
1799APR_CHECK_SIZEOF_EXTENDED([#include <sys/types.h>], off_t, 8)
1800
1801if test "${ac_cv_sizeof_off_t}${apr_cv_use_lfs64}" = "4yes"; then
1802    # Enable LFS
1803    aprlfs=1
1804    AC_CHECK_FUNCS([mmap64 sendfile64 sendfilev64 mkstemp64 readdir64_r])
1805elif test "${ac_cv_sizeof_off_t}" != "${ac_cv_sizeof_size_t}"; then
1806    # unsure of using -gt above is as portable, can can't forsee where
1807    # off_t can legitimately be smaller than size_t
1808    aprlfs=1
1809else
1810    aprlfs=0     
1811fi
1812
1813AC_MSG_CHECKING([which type to use for apr_off_t])
1814if test "${ac_cv_sizeof_off_t}${apr_cv_use_lfs64}" = "4yes"; then
1815    # LFS is go!
1816    off_t_fmt='#define APR_OFF_T_FMT APR_INT64_T_FMT'
1817    off_t_value='off64_t'
1818    off_t_strfn='apr_strtoi64'
1819elif test "${ac_cv_sizeof_off_t}x${ac_cv_sizeof_long}" = "4x4"; then
1820    # Special case: off_t may change size with _FILE_OFFSET_BITS
1821    # on 32-bit systems with LFS support.  To avoid compatibility
1822    # issues when other packages do define _FILE_OFFSET_BITS,
1823    # hard-code apr_off_t to long.
1824    off_t_value=long
1825    off_t_fmt='#define APR_OFF_T_FMT "ld"'
1826    off_t_strfn='strtol'
1827elif test "$ac_cv_type_off_t" = "yes"; then
1828    off_t_value=off_t
1829    # off_t is more commonly a long than an int; prefer that case
1830    # where int and long are the same size.
1831    if test "$ac_cv_sizeof_off_t" = "$ac_cv_sizeof_long"; then
1832        off_t_fmt='#define APR_OFF_T_FMT "ld"'
1833        off_t_strfn='strtol'
1834    elif test "$ac_cv_sizeof_off_t" = "$ac_cv_sizeof_int"; then
1835        off_t_fmt='#define APR_OFF_T_FMT "d"'
1836        off_t_strfn='strtoi'
1837    elif test "$ac_cv_sizeof_off_t" = "$ac_cv_sizeof_long_long"; then
1838        off_t_fmt='#define APR_OFF_T_FMT APR_INT64_T_FMT'
1839        off_t_strfn='apr_strtoi64'
1840    else
1841        AC_ERROR([could not determine the size of off_t])
1842    fi
1843    # Per OS tuning...
1844    case $host in
1845    *-mingw*)
1846        off_t_value=apr_int64_t
1847        off_t_fmt='#define APR_OFF_T_FMT "I64d"'
1848        off_t_strfn='_strtoi64'
1849        ;;
1850    esac
1851else
1852   # Fallback on int
1853   off_t_value=apr_int32_t
1854   off_t_fmt=d
1855   off_t_strfn='strtoi'
1856fi
1857AC_MSG_RESULT($off_t_value)
1858
1859# Regardless of whether _LARGEFILE64_SOURCE is used, on some
1860# platforms _FILE_OFFSET_BITS will affect the size of ino_t and hence
1861# the build-time ABI may be different from the apparent ABI when using
1862# APR with another package which *does* define _FILE_OFFSET_BITS.
1863# (Exactly as per the case above with off_t where LFS is *not* used)
1864#
1865# To be safe, hard-code apr_ino_t as 'unsigned long' or 'unsigned int'
1866# iff that is exactly the size of ino_t here; otherwise use ino_t as existing
1867# releases did.  To be correct, apr_ino_t should have been made an
1868# ino64_t as apr_off_t is off64_t, but this can't be done now without
1869# breaking ABI.
1870
1871# Per OS tuning...
1872case $host in
1873*mingw*)
1874    ino_t_value=apr_int64_t
1875    ;;
1876*)
1877    ino_t_value=ino_t
1878    APR_CHECK_SIZEOF_EXTENDED(AC_INCLUDES_DEFAULT, ino_t, $ac_cv_sizeof_long)
1879    if test $ac_cv_sizeof_ino_t = 4; then
1880        if test $ac_cv_sizeof_long = 4; then
1881            ino_t_value="unsigned long"
1882        else
1883            ino_t_value="unsigned int"
1884        fi
1885    fi
1886    ;;
1887esac
1888AC_MSG_NOTICE([using $ino_t_value for ino_t])
1889
1890# Checks for endianness
1891AC_C_BIGENDIAN
1892if test $ac_cv_c_bigendian = yes; then
1893    bigendian=1
1894else
1895    bigendian=0
1896fi
1897
1898APR_CHECK_SIZEOF_EXTENDED([#include <sys/types.h>
1899#include <sys/uio.h>],struct iovec,0)
1900if test "$ac_cv_sizeof_struct_iovec" = "0"; then
1901    have_iovec=0
1902else
1903    have_iovec=1
1904fi
1905
1906AC_SUBST(voidp_size)
1907AC_SUBST(short_value)
1908AC_SUBST(int_value)
1909AC_SUBST(long_value)
1910AC_SUBST(int64_value)
1911AC_SUBST(off_t_value)
1912AC_SUBST(size_t_value)
1913AC_SUBST(ssize_t_value)
1914AC_SUBST(socklen_t_value)
1915AC_SUBST(int64_t_fmt) 
1916AC_SUBST(uint64_t_fmt) 
1917AC_SUBST(uint64_t_hex_fmt) 
1918AC_SUBST(ssize_t_fmt) 
1919AC_SUBST(size_t_fmt)
1920AC_SUBST(off_t_fmt) 
1921AC_SUBST(pid_t_fmt)
1922AC_SUBST(int64_literal) 
1923AC_SUBST(uint64_literal) 
1924AC_SUBST(stdint) 
1925AC_SUBST(bigendian)
1926AC_SUBST(aprlfs)
1927AC_SUBST(have_iovec)
1928AC_SUBST(ino_t_value)
1929
1930dnl ----------------------------- Checking for string functions
1931AC_CHECK_FUNCS(strnicmp, have_strnicmp="1", have_strnicmp="0")
1932AC_CHECK_FUNCS(strncasecmp, have_strncasecmp="1", have_strncasecmp="0")
1933AC_CHECK_FUNCS(stricmp, have_stricmp="1", have_stricmp="0")
1934AC_CHECK_FUNCS(strcasecmp, have_strcasecmp="1", have_strcasecmp="0")
1935AC_CHECK_FUNCS(strdup, have_strdup="1", have_strdup="0")
1936AC_CHECK_FUNCS(strstr, have_strstr="1", have_strstr="0")
1937AC_CHECK_FUNCS(memchr, have_memchr="1", have_memchr="0")
1938AC_CHECK_FUNC($int64_strfn, have_int64_strfn="1", have_int64_strfn="0")
1939
1940dnl ----------------------------- We have a fallback position
1941if test "$have_int64_strfn" = "0" && test "$int64_strfn" = "strtoll"; then
1942    int64_strfn="strtoq"
1943    AC_CHECK_FUNC(strtoq, [have_int64_strfn=1], [have_int64_strfn=0])
1944fi
1945
1946if test "$have_int64_strfn" = "1"; then
1947  AC_DEFINE_UNQUOTED(APR_INT64_STRFN, [$int64_strfn],
1948      [Define as function which can be used for conversion of strings to apr_int64_t])
1949fi
1950
1951AC_SUBST(have_strnicmp)
1952AC_SUBST(have_strncasecmp)
1953AC_SUBST(have_stricmp)
1954AC_SUBST(have_strcasecmp)
1955AC_SUBST(have_strdup)
1956AC_SUBST(have_strstr)
1957AC_SUBST(have_memchr)
1958
1959if test "$off_t_strfn" = "apr_strtoi64" && test "$have_int64_strfn" = "1"; then
1960    off_t_strfn=$int64_strfn
1961fi
1962AC_DEFINE_UNQUOTED(APR_OFF_T_STRFN, [$off_t_strfn],
1963          [Define as function used for conversion of strings to apr_off_t])
1964
1965dnl ----------------------------- Checking for DSO support
1966echo "${nl}Checking for DSO..."
1967AC_ARG_ENABLE(dso,
1968  [  --disable-dso           Disable DSO support ],
1969  [if test "x$enableval" = "xyes"; then
1970      dsotype=any
1971   else
1972      dsotype=$enableval
1973   fi
1974  ], [dsotype=any])
1975
1976if test "$dsotype" = "any"; then
1977    if test "$dsotype" = "any"; then
1978      case $host in
1979        *darwin[[0-8]]\.*) 
1980          # Original Darwin, not for 9.0!:
1981          AC_CHECK_FUNC(NSLinkModule, [dsotype=dyld]);;
1982        hppa*-hpux[[1-9]]\.*|hppa*-hpux1[[01]]*)
1983          # shl is specific to parisc hpux SOM binaries, not used for 64 bit
1984          AC_CHECK_LIB(dld, shl_load, [have_shl=1])
1985          if test "$ac_cv_sizeof_voidp$have_shl" = "41"; then
1986            dsotype=shl; APR_ADDTO(LIBS,-ldld)
1987          fi;;
1988        *mingw*|*-os2*)
1989          # several 'other's below probably belong up here.  If they always
1990          # use a platform implementation and shouldn't test the dlopen/dlfcn
1991          # features, then bring them up here.
1992          # But if they -should- optionally use dlfcn, and/or need the config
1993          # detection of dlopen/dlsym, do not move them up.
1994          dsotype=other ;;
1995      esac
1996    fi
1997    # Normal POSIX:
1998    if test "$dsotype" = "any"; then
1999      AC_CHECK_FUNC(dlopen, [dsotype=dlfcn])
2000    fi
2001    if test "$dsotype" = "any"; then
2002      AC_CHECK_LIB(dl, dlopen, [dsotype=dlfcn; APR_ADDTO(LIBS,-ldl)])
2003    fi
2004    if test "$dsotype" = "dlfcn"; then
2005        # ReliantUnix has dlopen() in libc but dlsym() in libdl :(
2006        AC_CHECK_FUNC(dlsym, [], 
2007          [AC_CHECK_LIB(dl, dlsym, 
2008             [APR_ADDTO(LIBS, -ldl)],
2009             [dsotype=any
2010              echo "Weird: dlopen() was found but dlsym() was not found!"])])
2011    fi
2012    if test "$dsotype" = "any"; then
2013      # BeOS:
2014      AC_CHECK_LIB(root, load_image, [dsotype=other])
2015    fi
2016    # Everything else:
2017    if test "$dsotype" = "any"; then
2018        case $host in
2019        *os390|*os400|*-aix*)
2020          # Some -aix5 will use dl, no hassles.  Keep that pattern here.
2021          dsotype=other ;;
2022        *-hpux*)
2023          if test "$have_shl" = "1"; then
2024            dsotype=shl; APR_ADDTO(LIBS,-ldld)
2025          fi;;
2026        esac
2027    fi
2028fi
2029
2030if test "$dsotype" = "any"; then
2031    AC_MSG_ERROR([Could not detect suitable DSO implementation])
2032elif test "$dsotype" = "no"; then
2033    aprdso="0"
2034else
2035    case "$dsotype" in
2036    dlfcn) AC_DEFINE(DSO_USE_DLFCN, 1, [Define if DSO support uses dlfcn.h]);;
2037    shl)   AC_DEFINE(DSO_USE_SHL, 1, [Define if DSO support uses shl_load]);;
2038    dyld)  AC_DEFINE(DSO_USE_DYLD, 1, [Define if DSO support uses dyld.h]);;
2039    other) ;; # Use whatever is in dso/OSDIR
2040    *) AC_MSG_ERROR([Unknown DSO implementation "$dsotype"]);;
2041    esac
2042    aprdso="1"
2043    apr_modules="$apr_modules dso"
2044fi
2045
2046AC_SUBST(aprdso)
2047
2048dnl ----------------------------- Checking for Processes
2049echo "${nl}Checking for Processes..."
2050
2051AC_CHECK_FUNCS(waitpid)
2052
2053AC_ARG_ENABLE(other-child,
2054  [  --enable-other-child    Enable reliable child processes ],
2055  [ if test "$enableval" = "yes"; then
2056        oc="1"
2057    else
2058        oc="0"
2059    fi ],
2060  [ oc=1 ] ) 
2061  
2062AC_SUBST(oc) 
2063
2064if test -z "$have_proc_invoked"; then
2065  have_proc_invoked="0"
2066fi
2067
2068AC_SUBST(have_proc_invoked)
2069
2070AC_MSG_CHECKING(for Variable Length Arrays)
2071APR_TRY_COMPILE_NO_WARNING([],
2072[
2073    int foo[argc];
2074    foo[0] = 0;
2075], vla_msg=yes, vla_msg=no )
2076AC_MSG_RESULT([$vla_msg])
2077if test "$vla_msg" = "yes"; then
2078    AC_DEFINE(HAVE_VLA, 1, [Define if C compiler supports VLA])
2079fi
2080
2081AC_CACHE_CHECK(struct rlimit,ac_cv_struct_rlimit,[
2082AC_TRY_RUN([
2083#include <sys/types.h>
2084#include <sys/time.h>
2085#include <sys/resource.h>
2086main()
2087{
2088    struct rlimit limit;
2089    limit.rlim_cur = 0;
2090    limit.rlim_max = 0;
2091    exit(0);
2092}], [
2093    ac_cv_struct_rlimit=yes ], [
2094    ac_cv_struct_rlimit=no ], [
2095    ac_cv_struct_rlimit=no ] ) ] )
2096struct_rlimit=0
2097test "x$ac_cv_struct_rlimit" = xyes && struct_rlimit=1
2098AC_SUBST(struct_rlimit)
2099
2100dnl ----------------------------- Checking for Locking Characteristics 
2101echo "${nl}Checking for Locking..."
2102
2103AC_CHECK_FUNCS(semget semctl flock)
2104AC_CHECK_HEADERS(semaphore.h OS.h)
2105AC_SEARCH_LIBS(sem_open, rt)
2106AC_CHECK_FUNCS(sem_close sem_unlink sem_post sem_wait create_sem)
2107
2108# Some systems return ENOSYS from sem_open.
2109AC_CACHE_CHECK(for working sem_open,ac_cv_func_sem_open,[
2110AC_TRY_RUN([
2111#include <errno.h>
2112#include <stdlib.h>
2113#include <fcntl.h>
2114#include <semaphore.h>
2115#ifndef SEM_FAILED
2116#define SEM_FAILED (-1)
2117#endif
2118main()
2119{
2120    sem_t *psem;
2121    const char *sem_name = "/apr_autoconf";
2122
2123    psem = sem_open(sem_name, O_CREAT, 0644, 1);
2124    if (psem == (sem_t *)SEM_FAILED) {
2125	exit(1);
2126    }
2127    sem_close(psem);
2128    psem = sem_open(sem_name, O_CREAT | O_EXCL, 0644, 1);
2129    if (psem != (sem_t *)SEM_FAILED) {
2130        sem_close(psem);
2131        exit(1);
2132    }
2133    sem_unlink(sem_name);
2134    exit(0);
2135}], [ac_cv_func_sem_open=yes], [ac_cv_func_sem_open=no],
2136[ac_cv_func_sem_open=no])])
2137
2138# It's stupid, but not all platforms have union semun, even those that need it.
2139AC_MSG_CHECKING(for union semun in sys/sem.h)
2140AC_TRY_COMPILE([
2141#include <sys/types.h>
2142#include <sys/ipc.h>
2143#include <sys/sem.h>
2144],[
2145union semun arg;
2146semctl(0, 0, 0, arg);
2147], [have_union_semun="1" union_semun=yes ]
2148msg=yes, [
2149have_union_semun="0"
2150msg=no ] )
2151AC_MSG_RESULT([$msg])
2152AC_SUBST(have_union_semun)
2153
2154dnl Checks for libraries.
2155APR_CHECK_DEFINE(LOCK_EX, sys/file.h)
2156APR_CHECK_DEFINE(F_SETLK, fcntl.h)
2157APR_CHECK_DEFINE(SEM_UNDO, sys/sem.h)
2158
2159# We are assuming that if the platform doesn't have POLLIN, it doesn't have
2160# any POLL definitions.
2161APR_CHECK_DEFINE_FILES(POLLIN, poll.h sys/poll.h)
2162
2163if test "$threads" = "1"; then
2164    APR_CHECK_DEFINE(PTHREAD_PROCESS_SHARED, pthread.h)
2165    AC_CHECK_FUNCS(pthread_mutexattr_setpshared)
2166    # Some systems have setpshared and define PROCESS_SHARED, but don't 
2167    # really support PROCESS_SHARED locks.  So, we must validate that we 
2168    # can go through the steps without receiving some sort of system error.
2169    # Linux and older versions of AIX have this problem.
2170    APR_IFALLYES(header:pthread.h define:PTHREAD_PROCESS_SHARED func:pthread_mutexattr_setpshared, [
2171      AC_CACHE_CHECK([for working PROCESS_SHARED locks], apr_cv_process_shared_works, [
2172      AC_TRY_RUN([
2173#include <sys/types.h>
2174#include <pthread.h>
2175        int main()
2176        {
2177            pthread_mutex_t mutex;
2178            pthread_mutexattr_t attr;
2179            if (pthread_mutexattr_init(&attr))
2180                exit(1);
2181            if (pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED))
2182                exit(2);
2183            if (pthread_mutex_init(&mutex, &attr))
2184                exit(3);
2185            if (pthread_mutexattr_destroy(&attr))
2186                exit(4);
2187            if (pthread_mutex_destroy(&mutex))
2188                exit(5);
2189            exit(0);
2190        }], [apr_cv_process_shared_works=yes], [apr_cv_process_shared_works=no])])
2191      # Override detection of pthread_mutexattr_setpshared
2192      ac_cv_func_pthread_mutexattr_setpshared=$apr_cv_process_shared_works])
2193
2194    if test "$ac_cv_func_pthread_mutexattr_setpshared" = "yes"; then
2195        APR_CHECK_PTHREAD_ROBUST_SHARED_MUTEX
2196    fi
2197fi
2198
2199# See which lock mechanisms we can support on this system.
2200APR_IFALLYES(header:semaphore.h func:sem_open func:sem_close dnl
2201             func:sem_unlink func:sem_post func:sem_wait,
2202             hasposixser="1", hasposixser="0")
2203APR_IFALLYES(func:semget func:semctl define:SEM_UNDO, hassysvser="1", 
2204             hassysvser="0")
2205APR_IFALLYES(func:flock define:LOCK_EX, hasflockser="1", hasflockser="0")
2206APR_IFALLYES(header:fcntl.h define:F_SETLK, hasfcntlser="1", hasfcntlser="0")
2207# note: the current APR use of shared mutex requires /dev/zero
2208APR_IFALLYES(header:pthread.h define:PTHREAD_PROCESS_SHARED dnl
2209             func:pthread_mutexattr_setpshared dnl
2210             file:/dev/zero,
2211             hasprocpthreadser="1", hasprocpthreadser="0")
2212APR_IFALLYES(header:OS.h func:create_sem, hasbeossem="1", hasbeossem="0")
2213
2214# See which lock mechanism we'll select by default on this system.
2215# The last APR_DECIDE to execute sets the default.
2216# At this stage, we match the ordering in Apache 1.3
2217# which is (highest to lowest): sysvsem -> fcntl -> flock.
2218# POSIX semaphores and cross-process pthread mutexes are not
2219# used by default since they have less desirable behaviour when
2220# e.g. a process holding the mutex segfaults.
2221# The BEOSSEM decision doesn't require any substitutions but is
2222# included here to prevent the fcntl() branch being selected
2223# from the decision making.
2224APR_BEGIN_DECISION([apr_lock implementation method])
2225APR_IFALLYES(func:flock define:LOCK_EX,
2226            APR_DECIDE(USE_FLOCK_SERIALIZE, [4.2BSD-style flock()]))
2227APR_IFALLYES(header:fcntl.h define:F_SETLK,
2228            APR_DECIDE(USE_FCNTL_SERIALIZE, [SVR4-style fcntl()]))
2229APR_IFALLYES(func:semget func:semctl define:SEM_UNDO,
2230            APR_DECIDE(USE_SYSVSEM_SERIALIZE, [SysV IPC semget()]))
2231APR_IFALLYES(header:OS.h func:create_sem, 
2232            APR_DECIDE(USE_BEOSSEM, [BeOS Semaphores])) 
2233if test "x$apr_lock_method" != "x"; then
2234    APR_DECISION_FORCE($apr_lock_method)
2235fi
2236APR_END_DECISION
2237AC_DEFINE_UNQUOTED($ac_decision)
2238
2239flockser="0"
2240sysvser="0"
2241posixser="0"
2242procpthreadser="0"
2243fcntlser="0"
2244case $ac_decision in
2245    USE_FLOCK_SERIALIZE )
2246        flockser="1"
2247        ;;
2248    USE_FCNTL_SERIALIZE )
2249        fcntlser="1"
2250        ;;
2251    USE_SYSVSEM_SERIALIZE )
2252        sysvser="1"
2253        ;;
2254    USE_POSIXSEM_SERIALIZE )
2255        posixser="1"
2256        ;;
2257    USE_PROC_PTHREAD_SERIALIZE )
2258        procpthreadser="1"
2259        ;;
2260    USE_BEOSSEM )
2261        beossem="1"
2262        ;;
2263esac
2264
2265if test $hasfcntlser = "1"; then
2266AC_MSG_CHECKING(if fcntl returns EACCES when F_SETLK is already held)
2267AC_TRY_RUN([
2268#ifdef HAVE_STDLIB_H
2269#include <stdlib.h>
2270#endif
2271#ifdef HAVE_SYS_TYPES_H
2272#include <sys/types.h>
2273#endif
2274#ifdef HAVE_SYS_STAT_H
2275#include <sys/stat.h>
2276#endif
2277#ifdef HAVE_SYS_WAIT_H
2278#include <sys/wait.h>
2279#endif
2280#if defined(HAVE_UNISTD_H)
2281#include <unistd.h>
2282#endif
2283#include <fcntl.h>
2284#include <errno.h>
2285
2286int fd;
2287struct flock proc_mutex_lock_it = {0};
2288const char *fname = "conftest.fcntl";
2289
2290int main()
2291{
2292    int rc, status;;
2293    proc_mutex_lock_it.l_whence = SEEK_SET;   /* from current point */
2294    proc_mutex_lock_it.l_type = F_WRLCK;      /* set exclusive/write lock */
2295
2296    fd = creat(fname, S_IRWXU);
2297    unlink(fname);
2298
2299    if (rc = lockit()) {
2300        exit(-1);
2301    }
2302
2303    if (fork()) {
2304        wait(&status);
2305    }
2306    else {
2307      return(lockit());
2308    }
2309
2310    close(fd);
2311    exit(WEXITSTATUS(status) != EACCES);
2312}
2313
2314int lockit() {
2315    int rc;
2316    do {
2317        rc = fcntl(fd, F_SETLK, &proc_mutex_lock_it);
2318    } while ( rc < 0 && errno == EINTR);
2319
2320    return (rc < 0) ? errno : 0;
2321}], [apr_fcntl_tryacquire_eacces=1], [apr_fcntl_tryacquire_eacces=0], [apr_fcntl_tryacquire_eacces=0])
2322fi
2323
2324if test "$apr_fcntl_tryacquire_eacces" = "1"; then
2325  AC_DEFINE(FCNTL_TRYACQUIRE_EACCES, 1, [Define if fcntl returns EACCES when F_SETLK is already held])
2326  AC_MSG_RESULT(yes)
2327else
2328  AC_MSG_RESULT(no)
2329fi
2330
2331
2332AC_SUBST(hasflockser)
2333AC_SUBST(hassysvser)
2334AC_SUBST(hasposixser)
2335AC_SUBST(hasfcntlser)
2336AC_SUBST(hasprocpthreadser)
2337AC_SUBST(flockser)
2338AC_SUBST(sysvser)
2339AC_SUBST(posixser)
2340AC_SUBST(fcntlser)
2341AC_SUBST(procpthreadser)
2342AC_SUBST(pthreadser)
2343
2344AC_MSG_CHECKING(if all interprocess locks affect threads)
2345if test "x$apr_process_lock_is_global" = "xyes"; then
2346    proclockglobal="1"
2347    AC_MSG_RESULT(yes)
2348else
2349    proclockglobal="0"
2350    AC_MSG_RESULT(no)
2351fi
2352
2353AC_SUBST(proclockglobal)
2354
2355AC_MSG_CHECKING(if POSIX sems affect threads in the same process)
2356if test "x$apr_posixsem_is_global" = "xyes"; then
2357  AC_DEFINE(POSIXSEM_IS_GLOBAL, 1, 
2358            [Define if POSIX semaphores affect threads within the process])
2359  AC_MSG_RESULT(yes)
2360else
2361  AC_MSG_RESULT(no)
2362fi
2363
2364AC_MSG_CHECKING(if SysV sems affect threads in the same process)
2365if test "x$apr_sysvsem_is_global" = "xyes"; then
2366  AC_DEFINE(SYSVSEM_IS_GLOBAL, 1,
2367            [Define if SysV semaphores affect threads within the process])
2368  AC_MSG_RESULT(yes)
2369else
2370  AC_MSG_RESULT(no)
2371fi
2372
2373AC_MSG_CHECKING(if fcntl locks affect threads in the same process)
2374if test "x$apr_fcntl_is_global" = "xyes"; then
2375  AC_DEFINE(FCNTL_IS_GLOBAL, 1,
2376            [Define if fcntl locks affect threads within the process])
2377  AC_MSG_RESULT(yes)
2378else
2379  AC_MSG_RESULT(no)
2380fi
2381
2382AC_MSG_CHECKING(if flock locks affect threads in the same process)
2383if test "x$apr_flock_is_global" = "xyes"; then
2384  AC_DEFINE(FLOCK_IS_GLOBAL, 1,
2385            [Define if flock locks affect threads within the process])
2386  AC_MSG_RESULT(yes)
2387else
2388  AC_MSG_RESULT(no)
2389fi
2390
2391dnl ----------------------------- Checking for /dev/random 
2392AC_MSG_CHECKING(for entropy source)
2393
2394why_no_rand=""
2395
2396AC_ARG_WITH(egd, 
2397  [  --with-egd[[=DIR]]        use EGD-compatible socket],
2398  [ AC_DEFINE(HAVE_EGD, 1, [Define if EGD is supported])
2399    if test "$withval" = "yes"; then
2400        AC_DEFINE_UNQUOTED(EGD_DEFAULT_SOCKET, ["/var/run/egd-pool","/dev/egd-pool","/etc/egd-pool","/etc/entropy"], 
2401         [Define to list of paths to EGD sockets])
2402    else
2403        AC_DEFINE_UNQUOTED(EGD_DEFAULT_SOCKET, ["$withval"])
2404    fi
2405    AC_MSG_RESULT(EGD-compatible daemon)
2406    rand="1"
2407  ])
2408
2409if test "$rand" != "1"; then
2410  AC_ARG_WITH(devrandom,
2411    [  --with-devrandom[[=DEV]]  use /dev/random or compatible [[searches by default]]],
2412    [ apr_devrandom="$withval" ], [ apr_devrandom="yes" ])
2413
2414  if test "$apr_devrandom" = "yes"; then
2415    # /dev/random on OpenBSD doesn't provide random data, so
2416    # prefer /dev/arandom, which does; see random(4).
2417    for f in /dev/arandom /dev/urandom /dev/random; do
2418      if test -r $f; then
2419        apr_devrandom=$f
2420        rand=1
2421        break
2422      fi
2423    done
2424  elif test "$apr_devrandom" != "no"; then
2425    if test -r "$apr_devrandom"; then
2426      rand="1"
2427    else
2428      AC_ERROR([$apr_devrandom not found or unreadable.])
2429    fi
2430  fi
2431
2432  if test "$rand" = "1"; then
2433    case $host in
2434      *os390)
2435        if test $os_version -lt 1700; then
2436          rand="0"
2437          why_no_rand=" ($apr_devrandom unusable on z/OS before V1R7)"
2438        fi
2439        ;;
2440    esac
2441  fi
2442
2443  if test "$rand" = "1"; then
2444    AC_DEFINE_UNQUOTED(DEV_RANDOM, ["$apr_devrandom"], [Define to path of random device])
2445    AC_MSG_RESULT([$apr_devrandom])
2446  fi
2447fi
2448
2449if test "$rand" != "1"; then
2450    case $host in
2451        # we have built in support for OS/2
2452        *-os2*)
2453            AC_MSG_RESULT([Using OS/2 builtin random])
2454            rand="1"
2455            ;;
2456        *)
2457            if test "$rand" != "1"; then
2458              if test "$ac_cv_lib_truerand_main" = "yes"; then
2459                AC_DEFINE(HAVE_TRUERAND, 1, [Define if truerand is supported])
2460                AC_MSG_RESULT(truerand)
2461                rand="1"
2462              else
2463                AC_MSG_RESULT(not found$why_no_rand)
2464                rand="0"
2465              fi
2466            fi
2467            ;;
2468    esac
2469fi
2470
2471AC_SUBST(rand)
2472
2473dnl ----------------------------- Checking for File Info Support 
2474echo "${nl}Checking for File Info Support..."
2475AC_CHECK_MEMBERS([struct stat.st_blocks, struct stat.st_atimensec,
2476struct stat.st_ctimensec, struct stat.st_mtimensec, struct stat.st_atim.tv_nsec,
2477struct stat.st_ctim.tv_nsec, struct stat.st_mtim.tv_nsec,
2478struct stat.st_atime_n, struct stat.st_ctime_n, struct stat.st_mtime_n],,,[
2479#ifdef HAVE_SYS_TYPES_H
2480#include <sys/types.h>
2481#endif
2482#ifdef HAVE_SYS_STAT_H
2483#include <sys/stat.h>
2484#endif
2485#ifdef HAVE_UNISTD_H
2486#include <unistd.h>
2487#endif])
2488
2489APR_CHECK_DIRENT_INODE
2490APR_CHECK_DIRENT_TYPE
2491
2492dnl ----------------------------- Checking for UUID Support 
2493echo "${nl}Checking for OS UUID Support..."
2494
2495AC_CHECK_HEADERS(uuid.h uuid/uuid.h sys/uuid.h, break)
2496
2497apr_revert_save_LIBS=$LIBS
2498
2499# Prefer the flavor(s) that live in libc;
2500AC_SEARCH_LIBS(uuid_create, uuid)
2501AC_SEARCH_LIBS(uuid_generate, uuid)
2502if test "$ac_cv_search_uuid_create" = "none required" -o \
2503        "$ac_cv_search_uuid_generate" = "none required"; then
2504 LIBS=$apr_revert_save_LIBS
2505fi
2506
2507AC_CHECK_FUNCS(uuid_create uuid_generate)
2508
2509AC_CACHE_CHECK([for os uuid usability], [apr_cv_osuuid], [
2510# Ensure this test closely mirrors misc/unix/rand.c!
2511uuid_includes="
2512#if defined(HAVE_SYS_TYPES_H)
2513#include <sys/types.h>
2514#endif
2515#if defined(HAVE_UNISTD_H)
2516#include <unistd.h>
2517#endif
2518#if defined(HAVE_UUID_H)
2519#include <uuid.h>
2520#elif defined(HAVE_UUID_UUID_H)
2521#include <uuid/uuid.h>
2522#elif defined(HAVE_SYS_UUID_H)
2523#include <sys/uuid.h>
2524#endif
2525"
2526 apr_cv_osuuid=no
2527 if test $ac_cv_func_uuid_create = yes; then
2528  AC_TRY_LINK([$uuid_includes], [
2529    uuid_t g;
2530    uint32_t s;
2531    uuid_create(&g, &s);
2532    if (s == uuid_s_ok) s = 0;
2533  ], [apr_cv_osuuid=yes], [apr_cv_func_uuid_create=no])
2534 fi
2535 if test $ac_cv_func_uuid_generate = yes; then
2536  AC_TRY_LINK([$uuid_includes], [
2537    uuid_t g;
2538    uuid_generate(g);
2539  ], [apr_cv_osuuid=yes], [apr_cv_func_uuid_generate=no])
2540 fi 
2541])
2542
2543if test $apr_cv_osuuid = yes; then
2544  osuuid="1"
2545else
2546  osuuid="0"
2547  LIBS=$apr_revert_save_LIBS
2548fi
2549AC_SUBST(osuuid)
2550
2551
2552dnl ----------------------------- Checking for Time Support 
2553echo "${nl}Checking for Time Support..."
2554
2555AC_CHECK_MEMBERS([struct tm.tm_gmtoff, struct tm.__tm_gmtoff],,,[
2556#include <sys/types.h>
2557#include <time.h>])
2558
2559dnl ----------------------------- Checking for Networking Support 
2560echo "${nl}Checking for Networking support..."
2561APR_TYPE_IN_ADDR
2562if test "$ac_cv_type_in_addr" = "yes"; then
2563  have_in_addr="1"
2564else
2565  have_in_addr="0"
2566fi
2567
2568AC_MSG_CHECKING([if fd == socket on this platform])
2569if test "x$file_as_socket" != "x0" ; then
2570    file_as_socket="1";
2571    echo "yes"
2572else
2573    echo "no"
2574fi
2575
2576AC_SUBST(have_in_addr)
2577AC_SUBST(file_as_socket)
2578
2579if test "$ac_cv_func_poll $file_as_socket" = "yes 1"; then
2580    AC_DEFINE(WAITIO_USES_POLL, 1,
2581              [Define if apr_wait_for_io_or_timeout() uses poll(2)])
2582fi
2583
2584# Check the types only if we have gethostbyname_r
2585if test "$ac_cv_func_gethostbyname_r" = "yes"; then
2586    APR_CHECK_GETHOSTBYNAME_R_STYLE
2587fi
2588
2589# Check the types only if we have getservbyname_r
2590if test "$ac_cv_func_getservbyname_r" = "yes"; then
2591    APR_CHECK_GETSERVBYNAME_R_STYLE
2592fi
2593
2594APR_CHECK_TCP_NODELAY_INHERITED
2595APR_CHECK_O_NONBLOCK_INHERITED
2596APR_CHECK_TCP_NODELAY_WITH_CORK
2597
2598# Look for a way of corking TCP...
2599APR_CHECK_DEFINE(TCP_CORK, netinet/tcp.h)
2600APR_CHECK_DEFINE(TCP_NOPUSH, netinet/tcp.h)
2601apr_tcp_nopush_flag="0"
2602have_corkable_tcp="0"
2603if test "x$ac_cv_define_TCP_CORK" = "xyes"; then
2604    apr_tcp_nopush_flag="TCP_CORK"
2605    have_corkable_tcp="1"
2606else
2607    case $host in
2608        *linux*)
2609            AC_EGREP_CPP(yes,[
2610#include <linux/socket.h>
2611#ifdef TCP_CORK
2612yes
2613#endif
2614            ],[
2615                apr_tcp_nopush_flag="3"
2616                have_corkable_tcp="1"
2617            ])
2618            ;;
2619        *)
2620            ;;
2621    esac
2622fi
2623if test "x$ac_cv_define_TCP_NOPUSH" = "xyes"; then
2624    apr_tcp_nopush_flag="TCP_NOPUSH"
2625    have_corkable_tcp="1"
2626fi
2627
2628APR_CHECK_DEFINE(SO_ACCEPTFILTER, sys/socket.h)
2629if test "x$ac_cv_define_SO_ACCEPTFILTER" = "xyes"; then
2630    acceptfilter="1"
2631else
2632    acceptfilter="0"
2633fi
2634
2635APR_CHECK_SCTP
2636APR_CHECK_MCAST
2637
2638AC_SUBST(apr_tcp_nopush_flag)
2639AC_SUBST(have_corkable_tcp)
2640AC_SUBST(acceptfilter)
2641AC_SUBST(have_sctp)
2642
2643AC_CHECK_FUNCS(set_h_errno)
2644
2645echo "${nl}Checking for IPv6 Networking support..."
2646dnl Start of checking for IPv6 support...
2647
2648AC_ARG_ENABLE(ipv6,
2649  [  --disable-ipv6          Disable IPv6 support in APR.],
2650  [ if test "$enableval" = "no"; then
2651        user_disabled_ipv6=1
2652    fi ],
2653  [ user_disabled_ipv6=0 ] )
2654
2655case $host in
2656  *)
2657    broken_ipv6=0
2658esac
2659
2660AC_SEARCH_LIBS(getaddrinfo, socket inet6)
2661AC_SEARCH_LIBS(gai_strerror, socket inet6)
2662AC_SEARCH_LIBS(getnameinfo, socket inet6)
2663AC_CHECK_FUNCS(gai_strerror)
2664APR_CHECK_WORKING_GETADDRINFO
2665APR_CHECK_NEGATIVE_EAI
2666APR_CHECK_WORKING_GETNAMEINFO
2667APR_CHECK_SOCKADDR_IN6
2668APR_CHECK_SOCKADDR_STORAGE
2669
2670have_ipv6="0"
2671if test "$user_disabled_ipv6" = 1; then
2672    ipv6_result="no -- disabled by user"
2673else
2674    if test "x$broken_ipv6" = "x0"; then
2675        if test "x$have_sockaddr_in6" = "x1"; then
2676            if test "x$ac_cv_working_getaddrinfo" = "xyes"; then
2677                if test "x$ac_cv_working_getnameinfo" = "xyes"; then
2678                    APR_CHECK_GETADDRINFO_ADDRCONFIG
2679                    have_ipv6="1"
2680                    ipv6_result="yes"
2681                else
2682                    ipv6_result="no -- no getnameinfo"
2683                fi
2684            else
2685                ipv6_result="no -- no working getaddrinfo"
2686            fi
2687        else
2688            ipv6_result="no -- no sockaddr_in6"
2689        fi
2690    else
2691        ipv6_result="no -- the platform has known problems supporting IPv6"
2692    fi
2693fi
2694
2695AC_MSG_CHECKING(if APR supports IPv6)
2696AC_MSG_RESULT($ipv6_result)
2697
2698AC_SUBST(have_ipv6)
2699
2700# hstrerror is only needed if IPv6 is not enabled,
2701# so getaddrinfo/gai_strerror are not used.
2702if test $have_ipv6 = 0; then
2703  AC_SEARCH_LIBS(hstrerror, resolv,
2704    [AC_DEFINE(HAVE_HSTRERROR, 1, [Define if hstrerror is present])])
2705fi
2706
2707dnl Check for langinfo support
2708
2709AC_CHECK_HEADERS(langinfo.h)
2710AC_CHECK_FUNCS(nl_langinfo)
2711
2712dnl ------------------------------ Defaults for some platform nuances
2713
2714dnl Do we have a Win32-centric Unicode FS?
2715APR_SETIFNULL(have_unicode_fs, [0])
2716AC_SUBST(have_unicode_fs)
2717
2718APR_SETIFNULL(apr_has_xthread_files, [0])
2719AC_SUBST(apr_has_xthread_files)
2720
2721APR_SETIFNULL(apr_procattr_user_set_requires_password, [0])
2722AC_SUBST(apr_procattr_user_set_requires_password)
2723
2724APR_SETIFNULL(apr_thread_func, [])
2725AC_SUBST(apr_thread_func)
2726
2727APR_SETIFNULL(apr_has_user, [1])
2728AC_SUBST(apr_has_user)
2729
2730dnl ----------------------------- Finalize the variables
2731
2732echo "${nl}Restore user-defined environment settings..."
2733
2734APR_RESTORE_THE_ENVIRONMENT(CPPFLAGS, EXTRA_)
2735APR_RESTORE_THE_ENVIRONMENT(CFLAGS, EXTRA_)
2736APR_RESTORE_THE_ENVIRONMENT(LDFLAGS, EXTRA_)
2737APR_RESTORE_THE_ENVIRONMENT(LIBS, EXTRA_)
2738APR_RESTORE_THE_ENVIRONMENT(INCLUDES, EXTRA_)
2739AC_SUBST(NOTEST_CPPFLAGS)
2740AC_SUBST(NOTEST_CFLAGS)
2741AC_SUBST(NOTEST_LDFLAGS)
2742AC_SUBST(NOTEST_LIBS)
2743AC_SUBST(NOTEST_INCLUDES)
2744
2745dnl ----------------------------- Construct the files
2746
2747AC_SUBST(INTERNAL_CPPFLAGS)
2748AC_SUBST(LDLIBS)
2749AC_SUBST(INCLUDES)
2750AC_SUBST(AR)
2751AC_SUBST(RM)
2752AC_SUBST(OSDIR)
2753AC_SUBST(DEFAULT_OSDIR)
2754AC_SUBST(EXEEXT)
2755AC_SUBST(LIBTOOL_LIBS)
2756
2757# Use -no-install or -no-fast-install to link the test 
2758# programs on all platforms but Darwin, where it would cause
2759# the programs to be linked against installed versions of
2760# libapr instead of those just built.
2761case $host in
2762    *-apple-darwin*)
2763        LT_NO_INSTALL=""
2764        ;;
2765    *-mingw*)
2766        LT_NO_INSTALL="-no-fast-install"
2767        ;;
2768    *)
2769        LT_NO_INSTALL="-no-install"
2770        ;;
2771esac
2772AC_SUBST(LT_NO_INSTALL)
2773
2774#
2775# BSD/OS (BSDi) needs to use a different include syntax in the Makefiles
2776#
2777case $host in
2778*bsdi*)
2779    # Check whether they've installed GNU make
2780    if make --version > /dev/null 2>&1; then 
2781	INCLUDE_RULES="include $apr_buildout/apr_rules.mk"
2782	INCLUDE_OUTPUTS="include $apr_srcdir/build-outputs.mk"
2783    else
2784	# BSDi make
2785	INCLUDE_RULES=".include \"$apr_buildout/apr_rules.mk\""
2786	INCLUDE_OUTPUTS=".include \"$apr_srcdir/build-outputs.mk\""
2787    fi
2788    ;;
2789*)
2790    INCLUDE_RULES="include $apr_buildout/apr_rules.mk"
2791    INCLUDE_OUTPUTS="include $apr_srcdir/build-outputs.mk"
2792    ;;
2793esac
2794AC_SUBST(INCLUDE_RULES)
2795AC_SUBST(INCLUDE_OUTPUTS)
2796
2797AC_CONFIG_FILES([Makefile
2798                 include/apr.h
2799                 build/apr_rules.mk
2800                 build/pkg/pkginfo
2801                 apr-$APR_MAJOR_VERSION-config:apr-config.in
2802                 apr.pc])
2803
2804if test -d $srcdir/test; then
2805   AC_CONFIG_FILES([test/Makefile test/internal/Makefile])
2806fi
2807
2808dir=include/arch/unix
2809test -d $dir || $MKDIR $dir
2810
2811AC_CONFIG_COMMANDS([default], [
2812# Commands run at the end of config.status:
2813for i in $APR_SAVE_HEADERS; do
2814  if cmp -s $i $i.save 2>/dev/null; then
2815    mv $i.save $i
2816    AC_MSG_NOTICE([$i is unchanged])
2817  fi
2818  rm -f $i.save
2819done
2820chmod +x apr-$APR_MAJOR_VERSION-config
2821],[
2822dnl This section is expanded by configure UNQUOTED so variable 
2823dnl references must be backslash-escaped as necessary.
2824
2825# Commands run at the beginning of config.status:
2826APR_SAVE_HEADERS="include/apr.h include/arch/unix/apr_private.h"
2827APR_MAJOR_VERSION=$APR_MAJOR_VERSION
2828APR_PLATFORM=$host
2829
2830for apri in \${APR_SAVE_HEADERS}; do
2831  test -r \${apri} && mv \${apri} \${apri}.save
2832done
2833])
2834
2835AC_OUTPUT
2836