New mode bit8 with burn_set_signal_handling() to particularly ignore SIGPIPE

This commit is contained in:
Thomas Schmitt 2013-07-01 16:00:28 +00:00
parent 4c6fa3a86a
commit 533585e9e0
4 changed files with 27 additions and 3 deletions

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2013.06.28.104316" #define Cdrskin_timestamP "2013.07.01.155958"

View File

@ -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) int Cleanup_set_handlers(void *handle, Cleanup_app_handler_T handler, int flag)
/* /*
bit0= set to default handlers bit0= set to default handlers
bit1= set to ignore bit1= set to ignore
bit2= set cleanup_perform_app_handler_first bit2= set cleanup_perform_app_handler_first
bit3= set SIGABRT to handler (makes sense with bits 0 or 1) 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; int i,j,max_sig= -1,min_sig= 0x7fffffff;
char *sig_name;
sighandler_t sig_handler; sighandler_t sig_handler;
cleanup_msg[0]= 0; 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]) if(i==non_signal_list[j])
break; break;
if(j>=non_signal_list_count) { 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); signal(i,Cleanup_handler_generic);
else if((flag & 256) && strcmp(sig_name, "SIGPIPE") == 0)
signal(i, SIG_IGN);
else else
signal(i,sig_handler); signal(i,sig_handler);
} }

View File

@ -549,7 +549,7 @@ void burn_set_signal_handling(void *handle, burn_abort_handler_t handler,
if(burn_builtin_signal_action == 0) if(burn_builtin_signal_action == 0)
burn_builtin_signal_action = 1; burn_builtin_signal_action = 1;
Cleanup_set_handlers(handle, (Cleanup_app_handler_T) handler, Cleanup_set_handlers(handle, (Cleanup_app_handler_T) handler,
(mode & 15) | 4); (mode & 15) | 4 | (mode & 256));
burn_global_signal_handle = handle; burn_global_signal_handle = handle;
burn_global_signal_handler = handler; burn_global_signal_handler = handler;
} }

View File

@ -3771,6 +3771,9 @@ typedef int (*burn_abort_handler_t)(void *handle, int signum, int flag);
drives to become idle. E.g. by calling burn_abort(>0). drives to become idle. E.g. by calling burn_abort(>0).
4 Like 3, but without calling burn_abort(-1). Only the 4 Like 3, but without calling burn_abort(-1). Only the
indicator of burn_is_aborting() gets set. indicator of burn_is_aborting() gets set.
bit8: @since 1.3.2
try to ignore SIGPIPE (regardless of bit0 - bit3)
@since 0.2.6 @since 0.2.6
*/ */
void burn_set_signal_handling(void *handle, burn_abort_handler_t handler, void burn_set_signal_handling(void *handle, burn_abort_handler_t handler,