From ee979cdd95acb1a2bfa8b02f67d5386d3c8af5e3 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Tue, 2 Nov 1999 17:36:20 +0000 Subject: Split some more stuff out of psignal.c. --- cpukit/posix/src/psignalchecksignal.c | 90 +++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 cpukit/posix/src/psignalchecksignal.c (limited to 'cpukit/posix/src/psignalchecksignal.c') diff --git a/cpukit/posix/src/psignalchecksignal.c b/cpukit/posix/src/psignalchecksignal.c new file mode 100644 index 0000000000..f733994067 --- /dev/null +++ b/cpukit/posix/src/psignalchecksignal.c @@ -0,0 +1,90 @@ +/* + * $Id$ + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +/*PAGE + * + * _POSIX_signals_Check_signal + */ + +boolean _POSIX_signals_Check_signal( + POSIX_API_Control *api, + int signo, + boolean is_global +) +{ + siginfo_t siginfo_struct; + sigset_t saved_signals_blocked; + + if ( ! _POSIX_signals_Clear_signals( api, signo, &siginfo_struct, + is_global, TRUE ) ) + return FALSE; + + /* + * Since we made a union of these, only one test is necessary but this is + * safer. + */ + + assert( _POSIX_signals_Vectors[ signo ].sa_handler || + _POSIX_signals_Vectors[ signo ].sa_sigaction ); + + /* + * Just to prevent sending a signal which is currently being ignored. + */ + + if ( _POSIX_signals_Vectors[ signo ].sa_handler == SIG_IGN ) + return FALSE; + + /* + * Block the signals requested in sa_mask + */ + + saved_signals_blocked = api->signals_blocked; + api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask; + + /* Here, the signal handler function executes */ + + switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) { + case SA_SIGINFO: +/* + * + * assert( is_global ); + */ + (*_POSIX_signals_Vectors[ signo ].sa_sigaction)( + signo, + &siginfo_struct, + NULL /* context is undefined per 1003.1b-1993, p. 66 */ + ); + break; + default: + (*_POSIX_signals_Vectors[ signo ].sa_handler)( signo ); + break; + } + + /* + * Restore the previous set of blocked signals + */ + + api->signals_blocked = saved_signals_blocked; + + return TRUE; +} + -- cgit v1.2.3