* lib/fnmatch.c (WIDE_CHAR_SUPPORT): Require HAVE_ISWCTYPE, too.
[gnulib.git] / m4 / c-stack.m4
index 81c873b..3604fa1 100644 (file)
@@ -1,34 +1,29 @@
 # Check prerequisites for compiling lib/c-stack.c.
 
-# Copyright (C) 2002 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
+# Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
 
 # Written by Paul Eggert.
 
 AC_DEFUN([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC],
   [# for STACK_DIRECTION
    AC_REQUIRE([AC_FUNC_ALLOCA])
+   AC_CHECK_FUNCS(setrlimit)
 
    AC_CACHE_CHECK([for working C stack overflow detection],
      ac_cv_sys_xsi_stack_overflow_heuristic,
      [AC_TRY_RUN(
        [
+        #include <unistd.h>
         #include <signal.h>
         #include <ucontext.h>
+        #if HAVE_SETRLIMIT
+        # include <sys/types.h>
+        # include <sys/time.h>
+        # include <sys/resource.h>
+        #endif
 
         static union
         {
@@ -71,7 +66,7 @@ AC_DEFUN([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC],
         }
 
         static int
-        c_stack_action (void)
+        c_stack_action ()
         {
           stack_t st;
           struct sigaction act;
@@ -99,8 +94,18 @@ AC_DEFUN([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC],
         }
 
         int
-        main (void)
+        main ()
         {
+          #if HAVE_SETRLIMIT && defined RLIMIT_STACK
+          /* Before starting the endless recursion, try to be friendly
+             to the user's machine.  On some Linux 2.2.x systems, there
+             is no stack limit for user processes at all.  We don't want
+             to kill such systems.  */
+          struct rlimit rl;
+          rl.rlim_cur = rl.rlim_max = 0x100000; /* 1 MB */
+          setrlimit (RLIMIT_STACK, &rl);
+          #endif
+
           c_stack_action ();
           return recurse ("\1");
         }
@@ -121,7 +126,7 @@ AC_DEFUN([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC],
    fi])
 
 
-AC_DEFUN([jm_PREREQ_C_STACK],
+AC_DEFUN([gl_PREREQ_C_STACK],
   [AC_REQUIRE([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC])
 
    # for STACK_DIRECTION
@@ -134,10 +139,12 @@ AC_DEFUN([jm_PREREQ_C_STACK],
    AC_CHECK_HEADERS_ONCE(sys/time.h unistd.h)
    AC_CHECK_HEADERS(sys/resource.h ucontext.h)
 
+   AC_CHECK_MEMBERS([struct sigaction.sa_sigaction], , , [#include <signal.h>])
+
    AC_CHECK_TYPES([stack_t], , , [#include <signal.h>])])
 
 AC_DEFUN([gl_C_STACK],
 [
   dnl Prerequisites of lib/c-stack.c.
-  jm_PREREQ_C_STACK
+  gl_PREREQ_C_STACK
 ])