return MM_ERROR_NONE;
}
-void __session_signal_handler(int signo)
+void __session_signal_handler(int signo, siginfo_t *siginfo, void *context)
{
char filename[MAX_FILE_LENGTH];
char str_error[256];
switch (signo) {
case SIGINT:
- sigaction(SIGINT, &session_int_old_action, NULL);
- raise(signo);
+ if (session_int_old_action.sa_sigaction)
+ session_int_old_action.sa_sigaction(signo, siginfo, context);
+ else
+ sigaction(signo, &session_int_old_action, NULL);
break;
case SIGABRT:
- sigaction(SIGABRT, &session_abrt_old_action, NULL);
- raise(signo);
+ if (session_abrt_old_action.sa_sigaction)
+ session_abrt_old_action.sa_sigaction(signo, siginfo, context);
+ else
+ sigaction(signo, &session_abrt_old_action, NULL);
break;
case SIGSEGV:
- sigaction(SIGSEGV, &session_segv_old_action, NULL);
- raise(signo);
+ if (session_segv_old_action.sa_sigaction)
+ session_segv_old_action.sa_sigaction(signo, siginfo, context);
+ else
+ sigaction(signo, &session_segv_old_action, NULL);
break;
case SIGTERM:
- sigaction(SIGTERM, &session_term_old_action, NULL);
- raise(signo);
+ if (session_term_old_action.sa_sigaction)
+ session_term_old_action.sa_sigaction(signo, siginfo, context);
+ else
+ sigaction(signo, &session_term_old_action, NULL);
break;
case SIGSYS:
- sigaction(SIGSYS, &session_sys_old_action, NULL);
- raise(signo);
+ if (session_sys_old_action.sa_sigaction)
+ session_sys_old_action.sa_sigaction(signo, siginfo, context);
+ else
+ sigaction(signo, &session_sys_old_action, NULL);
break;
case SIGXCPU:
- sigaction(SIGXCPU, &session_xcpu_old_action, NULL);
- raise(signo);
+ if (session_xcpu_old_action.sa_sigaction)
+ session_xcpu_old_action.sa_sigaction(signo, siginfo, context);
+ else
+ sigaction(signo, &session_xcpu_old_action, NULL);
break;
default:
break;
void __mmsession_initialize(void)
{
struct sigaction session_action;
- session_action.sa_handler = __session_signal_handler;
- session_action.sa_flags = SA_NOCLDSTOP;
+ session_action.sa_sigaction = __session_signal_handler;
+ session_action.sa_flags = SA_NOCLDSTOP | SA_SIGINFO;
debug_fenter();