diff --git a/library/platform/native/errors.factor b/library/platform/native/errors.factor index 7c75435c2c..e47bcdd1c4 100644 --- a/library/platform/native/errors.factor +++ b/library/platform/native/errors.factor @@ -64,6 +64,7 @@ USE: vectors "Overflow" "Incomparable types: " "Float format: " + "Signal " ] ?nth ; : ?kernel-error ( cons -- error# param ) diff --git a/native/error.h b/native/error.h index a86ad3dab4..900e4e938c 100644 --- a/native/error.h +++ b/native/error.h @@ -7,6 +7,7 @@ #define ERROR_OVERFLOW (6<<3) #define ERROR_INCOMPARABLE (7<<3) #define ERROR_FLOAT_FORMAT (8<<3) +#define ERROR_SIGNAL (9<<3) void fatal_error(char* msg, CELL tagged); void critical_error(char* msg, CELL tagged); diff --git a/native/factor.c b/native/factor.c index a7944e418e..f6efd025f4 100644 --- a/native/factor.c +++ b/native/factor.c @@ -15,6 +15,7 @@ int main(int argc, char** argv) init_stacks(); init_iomux(); init_io(); + init_signals(); run(); diff --git a/native/factor.h b/native/factor.h index 9b186f89aa..59b2314faa 100644 --- a/native/factor.h +++ b/native/factor.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include diff --git a/native/run.c b/native/run.c index 9401e3e08f..4aa28c83c7 100644 --- a/native/run.c +++ b/native/run.c @@ -1,5 +1,21 @@ #include "factor.h" +void signal_handler(int signal, siginfo_t* siginfo, void* uap) +{ + general_error(ERROR_SIGNAL,tag_fixnum(signal)); +} + +void init_signals(void) +{ + struct sigaction custom_sigaction; + custom_sigaction.sa_sigaction = signal_handler; + custom_sigaction.sa_flags = SA_SIGINFO; + sigaction(SIGABRT,&custom_sigaction,NULL); + sigaction(SIGFPE,&custom_sigaction,NULL); + sigaction(SIGBUS,&custom_sigaction,NULL); + sigaction(SIGSEGV,&custom_sigaction,NULL); +} + void clear_environment(void) { int i; diff --git a/native/run.h b/native/run.h index 82bd4b50ac..844d1567d4 100644 --- a/native/run.h +++ b/native/run.h @@ -33,6 +33,8 @@ typedef struct { ENV env; +void init_signals(void); + void clear_environment(void); INLINE CELL dpop(void)