Go to the documentation of this file.00001
00006
00007
00008
00009 #include <signal.h>
00010
00011 #include "utility.h"
00012
00027 Sigfunc *
00028 gs_signal(int signo, Sigfunc *func)
00029 {
00030 #ifdef WIN32
00031
00032 signal(signo, func);
00033 return func;
00034
00035 #else
00036 struct sigaction act, oact;
00037
00038 act.sa_handler = func;
00039 sigemptyset(&act.sa_mask);
00040 act.sa_flags = 0;
00041 if (signo == SIGALRM) {
00042 #ifdef SA_INTERRUPT
00043 act.sa_flags |= SA_INTERRUPT;
00044 #endif
00045 } else {
00046 #ifdef SA_RESTART
00047 act.sa_flags |= SA_RESTART;
00048 #endif
00049 }
00050 if(sigaction(signo, &act, &oact) < 0)
00051 return(SIG_ERR);
00052 return(oact.sa_handler);
00053
00054 #endif
00055 }
00056
00066 int
00067 gs_setup_signal_handlers(Sigfunc *func)
00068 {
00069 int failure_seen = 0;
00070
00071 #define gs_do_setup(s, f) \
00072 if(gs_signal(s, f) == SIG_ERR) { \
00073 failure_seen = 1; \
00074 ERRPRINTF("Warning: could not set up signal handler (sig = %d)\n",s); \
00075 }
00076
00077 #ifdef SIGHUP
00078 gs_do_setup(SIGHUP, func);
00079 #endif
00080 #ifdef SIGINT
00081 gs_do_setup(SIGINT, func);
00082 #endif
00083 #ifdef SIGQUIT
00084 gs_do_setup(SIGQUIT, func);
00085 #endif
00086 #ifdef SIGILL
00087 gs_do_setup(SIGILL, func);
00088 #endif
00089 #ifdef SIGTRAP
00090 gs_do_setup(SIGTRAP, func);
00091 #endif
00092 #ifdef SIGABRT
00093 gs_do_setup(SIGABRT, func);
00094 #endif
00095 #ifdef SIGEMT
00096 gs_do_setup(SIGEMT, func);
00097 #endif
00098 #ifdef SIGFPE
00099 gs_do_setup(SIGFPE, func);
00100 #endif
00101 #ifdef SIGBUS
00102 gs_do_setup(SIGBUS, func);
00103 #endif
00104 #ifdef SIGSEGV
00105 gs_do_setup(SIGSEGV, func);
00106 #endif
00107 #ifdef SIGSYS
00108 gs_do_setup(SIGSYS, func);
00109 #endif
00110 #ifdef SIGPIPE
00111 gs_do_setup(SIGPIPE, func);
00112 #endif
00113 #ifdef SIGALRM
00114 gs_do_setup(SIGALRM, func);
00115 #endif
00116 #ifdef SIGTERM
00117 gs_do_setup(SIGTERM, func);
00118 #endif
00119 #ifdef SIGTSTP
00120 gs_do_setup(SIGTSTP, func);
00121 #endif
00122 #ifdef SIGTTIN
00123 gs_do_setup(SIGTTIN, func);
00124 #endif
00125 #ifdef SIGTTOU
00126 gs_do_setup(SIGTTOU, func);
00127 #endif
00128 #ifdef SIGXCPU
00129 gs_do_setup(SIGXCPU, func);
00130 #endif
00131 #ifdef SIGXFSZ
00132 gs_do_setup(SIGXFSZ, func);
00133 #endif
00134 #ifdef SIGVTALRM
00135 gs_do_setup(SIGVTALRM, func);
00136 #endif
00137 #ifdef SIGPROF
00138 gs_do_setup(SIGPROF, func);
00139 #endif
00140 #ifdef SIGUSR1
00141 gs_do_setup(SIGUSR1, func);
00142 #endif
00143 #ifdef SIGUSR2
00144 gs_do_setup(SIGUSR2, func);
00145 #endif
00146
00147 return failure_seen;
00148 }