Parsee/src/Signal.c

56 lines
1.2 KiB
C

#include <Cytoplasm/HttpServer.h>
#include <Cytoplasm/Log.h>
#include <pthread.h>
#include <signal.h>
#include <XMPP.h>
static ParseeData *data;
static pthread_t xmpp_thr;
static void
SignalHandler(int signal)
{
if (data->server && (signal == SIGTERM || signal == SIGINT))
{
Log(LOG_INFO, "Killing thread...");
pthread_mutex_lock(&data->halt_lock);
data->halted = true;
pthread_mutex_unlock(&data->halt_lock);
XMPPFinishCompStream(data->jabber);
pthread_join(xmpp_thr, NULL);
Log(LOG_INFO, "Stopping server...");
HttpServerStop(data->server);
return;
}
if (signal == SIGPIPE)
{
Log(LOG_DEBUG, "Caught a SIGPIPE...");
return;
}
}
bool
ParseeInitialiseSignals(ParseeData *d, pthread_t xmpp)
{
struct sigaction sa;
data = d;
xmpp_thr = xmpp;
sigfillset(&sa.sa_mask);
sa.sa_handler = SignalHandler;
sa.sa_flags = SA_RESTART;
#define Register(act) (sigaction(act, &sa, NULL) >= 0)
if (!Register(SIGTERM) || !Register(SIGINT) || !Register(SIGPIPE))
{
Log(LOG_ERR, "Couldn't register signals...");
return false;
}
#undef Register
return true;
}