summaryrefslogtreecommitdiffstats
path: root/sal/typesconfig/typesconfig.c
diff options
context:
space:
mode:
Diffstat (limited to 'sal/typesconfig/typesconfig.c')
-rw-r--r--sal/typesconfig/typesconfig.c98
1 files changed, 27 insertions, 71 deletions
diff --git a/sal/typesconfig/typesconfig.c b/sal/typesconfig/typesconfig.c
index 1077df4e3b54..be02052378ae 100644
--- a/sal/typesconfig/typesconfig.c
+++ b/sal/typesconfig/typesconfig.c
@@ -28,13 +28,6 @@
*
************************************************************************/
-/* POSIX defines that a program is undefined after a SIG_SEGV. The
- * code stopped working on Linux Kernel 2.6 so I have moved this back to
- * use FORK.
- * If at a later time the signals work correctly with the Linux Kernel 2.6
- * then this change may be reverted although not strictly posix safe. */
-#define USE_FORK_TO_CHECK 1
-
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
@@ -43,20 +36,10 @@
#include <unistd.h>
#include <sys/types.h>
-#define I_STDARG
-#ifdef I_STDARG
#include <stdarg.h>
-#else
-#include <varargs.h>
-#endif
-#define NO_USE_FORK_TO_CHECK
-#ifdef USE_FORK_TO_CHECK
-#include <sys/wait.h>
-#else
#include <signal.h>
#include <setjmp.h>
-#endif
#define printTypeSize(Type,Name) printf( "sizeof(%s)\t\t= %d\n", Name, (int) sizeof (Type) )
@@ -99,22 +82,12 @@ typedef int (*TestFunc)( Type, void* );
|* Letzte Aenderung
|*
*************************************************************************/
-#ifdef I_STDARG
void PrintArgs( int p, ... )
-#else
-void PrintArgs( p, va_alist )
-int p;
-va_dcl
-#endif
{
int value;
va_list ap;
-#ifdef I_STDARG
va_start( ap, p );
-#else
- va_start( ap );
-#endif
printf( "value = %d", p );
@@ -125,7 +98,6 @@ va_dcl
va_end(ap);
}
-#ifndef USE_FORK_TO_CHECK
/*************************************************************************
|*
|* SignalHdl()
@@ -136,18 +108,16 @@ va_dcl
|* Letzte Aenderung
|*
*************************************************************************/
-static jmp_buf check_env;
-static int bSignal;
+
+static sigjmp_buf jmpbuf;
+static volatile sig_atomic_t hit;
+
void SignalHdl( int sig )
{
- bSignal = 1;
-
- fprintf( stderr, "Signal %d caught\n", sig );
- signal( SIGSEGV, SIG_DFL );
- signal( SIGBUS, SIG_DFL );
- siglongjmp( check_env, sig );
+ (void) sig; // ignored
+ hit = 1;
+ siglongjmp(jmpbuf, 0);
}
-#endif
/*************************************************************************
|*
@@ -161,40 +131,26 @@ void SignalHdl( int sig )
*************************************************************************/
int check( TestFunc func, Type eT, void* p )
{
-#ifdef USE_FORK_TO_CHECK
- pid_t nChild = fork();
- if ( nChild )
- {
- int exitVal;
- wait( &exitVal );
- if ( exitVal & 0xff )
- return -1;
- else
- return exitVal >> 8;
- }
- else
- {
- exit( func( eT, p ) );
- }
-#else
- int result;
-
- bSignal = 0;
-
- if ( !sigsetjmp( check_env, 1 ) )
- {
- signal( SIGSEGV, SignalHdl );
- signal( SIGBUS, SignalHdl );
- result = func( eT, p );
- signal( SIGSEGV, SIG_DFL );
- signal( SIGBUS, SIG_DFL );
- }
-
- if ( bSignal )
- return -1;
- else
- return 0;
-#endif
+ hit = 0;
+ if (sigsetjmp(jmpbuf, 1) == 0) {
+ struct sigaction sa;
+ sa.sa_handler = SignalHdl;
+ sigemptyset(&sa.sa_mask);
+ sa.sa_flags = 0;
+ if (sigaction(SIGBUS, &sa, NULL) != 0 ||
+ sigaction(SIGSEGV, &sa, NULL) != 0)
+ {
+ abort();
+ }
+ func(eT, p);
+ sa.sa_handler = SIG_DFL;
+ if (sigaction(SIGBUS, &sa, NULL) != 0 ||
+ sigaction(SIGSEGV, &sa, NULL) != 0)
+ {
+ abort();
+ }
+ }
+ return hit ? -1 : 0;
}
/*************************************************************************