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: */