* exceptions.cc (handle_exceptions): Just si_code to SI_KERNEL first and let it

be overridden.
* exceptions.cc (_cygtls::call_signal_handler): Call signal handler with extra
siginfo_t * and void * parameters when SA_SIGINFO flag is set.
* signal.cc (signal): Clear SA_SIGINFO flag.
(sigqueue): Fix incorrect setting of si_code.
* sigproc.cc (signal_fixup_after_exec): Clear SA_SIGINFO flag when setting
handler to SIG_DFL.
This commit is contained in:
Christopher Faylor
2005-09-26 14:51:48 +00:00
parent 683cc8189c
commit d5f4ee62b7
4 changed files with 35 additions and 7 deletions

View File

@@ -63,6 +63,7 @@ signal (int sig, _sig_func_ptr func)
/* SA_RESTART is set to maintain BSD compatible signal behaviour by default.
This is also compatible with the behaviour of signal(2) in Linux. */
global_sigs[sig].sa_flags |= SA_RESTART;
global_sigs[sig].sa_flags &= ~ SA_SIGINFO;
set_sigcatchers (prev, func);
syscall_printf ("%p = signal (%d, %p)", prev, sig, func);
@@ -524,6 +525,10 @@ sigwaitinfo (const sigset_t *set, siginfo_t *info)
return res;
}
/* FIXME: SUSv3 says that this function should block until the signal has
actually been delivered. Currently, this will only happen when sending
signals to the current process. It will not happen when sending signals
to other processes. */
extern "C" int
sigqueue (pid_t pid, int sig, const union sigval value)
{
@@ -535,7 +540,7 @@ sigqueue (pid_t pid, int sig, const union sigval value)
return -1;
}
si.si_signo = sig;
si.si_code = SI_USER;
si.si_code = SI_QUEUE;
si.si_pid = si.si_uid = si.si_errno = 0;
si.si_value = value;
return sig_send (dest, si);