=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/plugin/Attic/mysig.c,v retrieving revision 1.1 retrieving revision 1.4 diff -u -p -r1.1 -r1.4 --- OpenXM/src/kan96xx/plugin/Attic/mysig.c 2016/03/30 08:25:43 1.1 +++ OpenXM/src/kan96xx/plugin/Attic/mysig.c 2016/03/31 03:22:55 1.4 @@ -1,4 +1,4 @@ -/* $OpenXM$ */ +/* $OpenXM: OpenXM/src/kan96xx/plugin/mysig.c,v 1.3 2016/03/30 21:34:03 takayama Exp $ */ #include #include #include @@ -6,25 +6,62 @@ #include #include "mysig.h" -int unblock_sigchild_sigint(void) { +static void *Old_handler; +/* + sigset SIGINT, SIGCHLD, SIGUSR1 + */ +int unblock_signal(int sigset[]) { struct sigaction act; sigset_t set; sigset_t oldset; + int i; sigemptyset(&set); - sigaddset(&set,SIGINT); - sigaddset(&set,SIGCHLD); + for (i=0; sigset[i] > 0; i++) sigaddset(&set,sigset[i]); sigprocmask(SIG_UNBLOCK,&set,&oldset); return(0); } +/* Add (or) blocked signals, see sigprocmask */ +int block_signal(int sigset[]) { + struct sigaction act; + sigset_t set; + sigset_t oldset; + int i; + sigemptyset(&set); + for (i=0; sigset[i] > 0; i++) sigaddset(&set,sigset[i]); + sigprocmask(SIG_BLOCK,&set,&oldset); + return(0); +} -int set_sigchild(void (*handler)(void)) { +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(SIGCHLD,&act,&oldact)); + val=sigaction(sig,&act,&oldact); + Old_handler = oldact.sa_handler; + return(val); +} +/* + 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); }