gs_signal.c

Go to the documentation of this file.
00001 
00006 /* $Id: gs_signal.c,v 1.8 2006/01/30 16:49:48 yarkhan Exp $ */
00007 /* $UTK_Copyright: $ */
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;   /* SunOS 4.x */
00044 #endif
00045   } else {
00046 #ifdef  SA_RESTART
00047     act.sa_flags |= SA_RESTART;     /* SVR4, 44BSD */
00048 #endif
00049   }
00050   if(sigaction(signo, &act, &oact) < 0)
00051     return(SIG_ERR);
00052   return(oact.sa_handler);
00053 
00054 #endif  /* ifdef WIN32 */
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 }