|
|
|
@ -133,15 +133,27 @@ static void Cleanup_handler_generic(int signum)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static char *Cleanup_signo_to_name(int signo) |
|
|
|
|
{ |
|
|
|
|
int i; |
|
|
|
|
for(i= 0; i < signal_list_count; i++) |
|
|
|
|
if(signal_list[i] == signo) |
|
|
|
|
return(signal_name_list[i]); |
|
|
|
|
return(""); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int Cleanup_set_handlers(void *handle, Cleanup_app_handler_T handler, int flag) |
|
|
|
|
/*
|
|
|
|
|
bit0= set to default handlers |
|
|
|
|
bit1= set to ignore |
|
|
|
|
bit2= set cleanup_perform_app_handler_first |
|
|
|
|
bit3= set SIGABRT to handler (makes sense with bits 0 or 1) |
|
|
|
|
bit8= set SIGPIPE to SIGIGN |
|
|
|
|
*/ |
|
|
|
|
{ |
|
|
|
|
int i,j,max_sig= -1,min_sig= 0x7fffffff; |
|
|
|
|
char *sig_name; |
|
|
|
|
sighandler_t sig_handler; |
|
|
|
|
|
|
|
|
|
cleanup_msg[0]= 0; |
|
|
|
@ -172,8 +184,17 @@ int Cleanup_set_handlers(void *handle, Cleanup_app_handler_T handler, int flag)
|
|
|
|
|
if(i==non_signal_list[j]) |
|
|
|
|
break; |
|
|
|
|
if(j>=non_signal_list_count) { |
|
|
|
|
if(i==SIGABRT && (flag&8)) |
|
|
|
|
/* Avoid to use particular SIG macros which might not be defined.
|
|
|
|
|
If ithey are defined, then their names are in the name list. |
|
|
|
|
*/ |
|
|
|
|
if(flag & (8 | 256)) |
|
|
|
|
sig_name= Cleanup_signo_to_name(i); |
|
|
|
|
else |
|
|
|
|
sig_name= ""; |
|
|
|
|
if((flag & 8) && strcmp(sig_name, "SIGABRT") == 0) |
|
|
|
|
signal(i,Cleanup_handler_generic); |
|
|
|
|
else if((flag & 256) && strcmp(sig_name, "SIGPIPE") == 0) |
|
|
|
|
signal(i, SIG_IGN); |
|
|
|
|
else |
|
|
|
|
signal(i,sig_handler); |
|
|
|
|
} |
|
|
|
|