X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fsignal.c;h=c3bb718bfb5a274279eb6a1ae257163e573b5fc5;hb=f491ac4fab469421986f77df0bbf79fefc417786;hp=478551ca28d535dc150df4249d516420729c3dcd;hpb=0a217a8df1657b4334b55b0e4a6c7837a8dbcfd9;p=oweals%2Fgnunet.git diff --git a/src/util/signal.c b/src/util/signal.c index 478551ca2..c3bb718bf 100644 --- a/src/util/signal.c +++ b/src/util/signal.c @@ -28,6 +28,9 @@ #include "gnunet_common.h" #include "gnunet_signal_lib.h" +#define LOG(kind,...) GNUNET_log_from (kind, "util", __VA_ARGS__) + + struct GNUNET_SIGNAL_Context { int sig; @@ -39,18 +42,24 @@ struct GNUNET_SIGNAL_Context #endif }; +#ifdef WINDOWS +GNUNET_SIGNAL_Handler w32_sigchld_handler = NULL; +#endif + struct GNUNET_SIGNAL_Context * -GNUNET_SIGNAL_handler_install (int signal, GNUNET_SIGNAL_Handler handler) +GNUNET_SIGNAL_handler_install (int signum, GNUNET_SIGNAL_Handler handler) { struct GNUNET_SIGNAL_Context *ret; + #ifndef MINGW struct sigaction sig; #endif ret = GNUNET_malloc (sizeof (struct GNUNET_SIGNAL_Context)); - ret->sig = signal; + ret->sig = signum; ret->method = handler; #ifndef MINGW + memset (&sig, 0, sizeof (sig)); sig.sa_handler = (void *) handler; sigemptyset (&sig.sa_mask); #ifdef SA_INTERRUPT @@ -58,7 +67,20 @@ GNUNET_SIGNAL_handler_install (int signal, GNUNET_SIGNAL_Handler handler) #else sig.sa_flags = SA_RESTART; #endif - sigaction (signal, &sig, &ret->oldsig); + sigaction (signum, &sig, &ret->oldsig); +#else + if (signum == GNUNET_SIGCHLD) + w32_sigchld_handler = handler; + else + { + __p_sig_fn_t sigret = signal (signum, (__p_sig_fn_t) handler); + + if (sigret == SIG_ERR) + { + LOG (GNUNET_ERROR_TYPE_WARNING, _("signal (%d, %p) returned %d.\n"), + signum, handler, sigret); + } + } #endif return ret; }