Fixes #1213.
sig = sigwaitinfo(&set, NULL);
if (sig == -1)
{
+ if (errno == EINTR)
+ { /* ignore signals we didn't wait for */
+ continue;
+ }
DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno));
return 1;
}
charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig);
return 1;
}
- default:
- {
- DBG1(DBG_DMN, "unknown signal %d received. Ignored", sig);
- break;
- }
}
}
}
sig = sigwaitinfo(&set, NULL);
if (sig == -1)
{
+ if (errno == EINTR)
+ { /* ignore signals we didn't wait for */
+ continue;
+ }
DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno));
return;
}
charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig);
return;
}
- default:
- {
- DBG1(DBG_DMN, "unknown signal %d received. Ignored", sig);
- break;
- }
}
}
}
sig = sigwaitinfo(&set, NULL);
if (sig == -1)
{
+ if (errno == EINTR)
+ { /* ignore signals we didn't wait for */
+ continue;
+ }
DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno));
return SS_RC_INITIALIZATION_FAILED;
}
charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig);
return 0;
}
- default:
- {
- DBG1(DBG_DMN, "unknown signal %d received. Ignored", sig);
- break;
- }
}
}
}
sig = sigwaitinfo(&set, NULL);
if (sig == -1)
{
+ if (errno == EINTR)
+ { /* ignore signals we didn't wait for */
+ continue;
+ }
DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno));
return;
}
charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig);
return;
}
- default:
- {
- DBG1(DBG_DMN, "unknown signal %d received. Ignored", sig);
- break;
- }
}
}
}
{
sigset_t set;
- /* handle SIGINT, SIGHUP ans SIGTERM in this handler */
+ /* handle SIGINT, SIGHUP and SIGTERM in this handler */
sigemptyset(&set);
sigaddset(&set, SIGINT);
sigaddset(&set, SIGHUP);
sig = sigwaitinfo(&set, NULL);
if (sig == -1)
{
+ if (errno == EINTR)
+ { /* ignore signals we didn't wait for */
+ continue;
+ }
DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno));
return;
}
charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig);
return;
}
- default:
- {
- DBG1(DBG_DMN, "unknown signal %d received. Ignored", sig);
- break;
- }
}
}
}
sigaddset(&set, SIGTERM);
sigprocmask(SIG_BLOCK, &set, NULL);
- while ((sig = sigwaitinfo(&set, NULL)) != -1)
+ while ((sig = sigwaitinfo(&set, NULL)) != -1 || errno == EINTR)
{
switch (sig)
{
sig = sigwaitinfo(&set, NULL);
if (sig == -1)
{
+ if (errno == EINTR)
+ { /* ignore signals we didn't wait for */
+ continue;
+ }
DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno));
return 1;
}
DBG1(DBG_DMN, "signal of type SIGTERM received. Shutting down");
charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig);
return 0;
- default:
- DBG1(DBG_DMN, "unknown signal %d received. Ignored", sig);
- break;
}
}
}
#include <fcgiapp.h>
#include <signal.h>
#include <unistd.h>
+#include <errno.h>
#include <utils/debug.h>
#include <threading/thread.h>
sigaddset(&set, SIGTERM);
sigaddset(&set, SIGHUP);
sigprocmask(SIG_BLOCK, &set, NULL);
- sigwaitinfo(&set, NULL);
+ while (sigwaitinfo(&set, NULL) == -1 && errno == EINTR)
+ {
+ /* wait for signal */
+ }
}
METHOD(fast_dispatcher_t, destroy, void,
sigaddset(&set, SIGTERM);
sigprocmask(SIG_BLOCK, &set, NULL);
- sigwaitinfo(&set, NULL);
+ while (sigwaitinfo(&set, NULL) == -1 && errno == EINTR)
+ {
+ /* wait for signal */
+ }
}
#ifndef HAVE_SIGWAITINFO