=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/plugin/Attic/mysig.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -p -r1.3 -r1.4 --- OpenXM/src/kan96xx/plugin/Attic/mysig.c 2016/03/30 21:34:03 1.3 +++ OpenXM/src/kan96xx/plugin/Attic/mysig.c 2016/03/31 03:22:55 1.4 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/kan96xx/plugin/mysig.c,v 1.2 2016/03/30 09:20:40 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kan96xx/plugin/mysig.c,v 1.3 2016/03/30 21:34:03 takayama Exp $ */ #include #include #include @@ -6,6 +6,7 @@ #include #include "mysig.h" +static void *Old_handler; /* sigset SIGINT, SIGCHLD, SIGUSR1 */ @@ -34,14 +35,33 @@ int block_signal(int sigset[]) { int set_signal(int sig,void (*handler)(int m)) { struct sigaction act; struct sigaction oldact; + int val; act.sa_handler=handler; act.sa_flags=0; act.sa_flags |= SA_RESTART; sigemptyset(&act.sa_mask); - return(sigaction(sig,&act,&oldact)); + val=sigaction(sig,&act,&oldact); + Old_handler = oldact.sa_handler; + return(val); } -int mysignal(int sig,void (*handler)(int m)) { - return(set_signal(sig,handler)); +/* + my own emulation of signal for portability. + */ +void *mysignal(int sig,void (*handler)(int m)) { + int sigset[2]; + if (handler == SIG_IGN) { + /* sigset[0] = sig; sigset[1]=0; + block_signal(sigset); + return(SIG_IGN);*/ + return(signal(sig,handler)); + }else if (handler == SIG_DFL) { + return(signal(sig,handler)); + } + /* on unix system, you may simply call signal(3) here. */ + set_signal(sig,handler); + /* unblock is necessary on cygwin, ... */ + sigset[0] = sig; sigset[1]=0; unblock_signal(sigset); + return((void *)Old_handler); }