X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fc-stack.c;h=e5d8c5ab69c140d7c3bcd1924a59b4fd8ecf9a99;hb=f58214d62e0c8a65aa13cf38ea148cef2547a06d;hp=e42d5f52769fee6da88e209a9621d563999f194d;hpb=9ff3ae2ea9f71c303b455196a713b83ca89b5d80;p=gnulib.git
diff --git a/lib/c-stack.c b/lib/c-stack.c
index e42d5f527..e5d8c5ab6 100644
--- a/lib/c-stack.c
+++ b/lib/c-stack.c
@@ -1,11 +1,11 @@
/* Stack overflow handling.
- Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2006, 2008 Free Software Foundation, Inc.
- This program is free software; you can redistribute it and/or modify
+ 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.
+ the Free Software Foundation; either version 3 of the License, 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
@@ -13,8 +13,7 @@
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. */
+ along with this program. If not, see . */
/* Written by Paul Eggert. */
@@ -34,12 +33,10 @@
No attempt has been made to deal with multithreaded applications. */
-#if HAVE_CONFIG_H
-# include
-#endif
+#include
#ifndef __attribute__
-# if __GNUC__ < 3 || __STRICT_ANSI__
+# if __GNUC__ < 3
# define __attribute__(x)
# endif
#endif
@@ -77,9 +74,7 @@ typedef struct sigaltstack stack_t;
# include
#endif
-#if HAVE_UNISTD_H
-# include
-#endif
+#include
#ifndef STDERR_FILENO
# define STDERR_FILENO 2
#endif
@@ -91,6 +86,13 @@ typedef struct sigaltstack stack_t;
#include "c-stack.h"
#include "exitfail.h"
+#if (HAVE_STRUCT_SIGACTION_SA_SIGACTION && defined SA_NODEFER \
+ && defined SA_ONSTACK && defined SA_RESETHAND && defined SA_SIGINFO)
+# define SIGACTION_WORKS 1
+#else
+# define SIGACTION_WORKS 0
+#endif
+
extern char *program_name;
/* The user-specified action to take when a SEGV-related program error
@@ -153,7 +155,7 @@ static union
void *p;
} alternate_signal_stack;
-# if defined SA_ONSTACK && defined SA_SIGINFO && defined _SC_PAGESIZE
+# if SIGACTION_WORKS
/* Handle a segmentation violation and exit. This function is
async-signal-safe. */
@@ -238,9 +240,7 @@ c_stack_action (void (*action) (int))
stack_overflow_message = _("stack overflow");
{
-# if ! (defined SA_ONSTACK && defined SA_SIGINFO && defined _SC_PAGESIZE)
- return signal (SIGSEGV, die) == SIG_ERR ? -1 : 0;
-# else
+# if SIGACTION_WORKS
struct sigaction act;
sigemptyset (&act.sa_mask);
@@ -252,6 +252,8 @@ c_stack_action (void (*action) (int))
act.sa_sigaction = segv_handler;
return sigaction (SIGSEGV, &act, 0);
+# else
+ return signal (SIGSEGV, die) == SIG_ERR ? -1 : 0;
# endif
}
}
@@ -299,6 +301,6 @@ main (int argc __attribute__ ((unused)), char **argv)
/*
Local Variables:
-compile-command: "gcc -DDEBUG -DHAVE_CONFIG_H -I.. -g -O -Wall -W c-stack.c"
+compile-command: "gcc -DDEBUG -g -O -Wall -W c-stack.c"
End:
*/