+static volatile g_interrupted = 0;
+
+#if HAVE_SIGACTION
+static void signal_handler(int signum)
+{
+ g_interrupted = 1;
+}
+static void handle_signals(void)
+{
+ int i, sigs[] = { SIGINT, SIGHUP, SIGTERM };
+ for (i = 0; i < sizeof(sigs)/sizeof(sigs[0]); ++i) {
+ struct sigaction sa = { 0 };
+ sa.sa_handler = signal_handler;
+ sa.sa_flags |= SA_RESTART;
+ sigaction(sigs[i], &sa, 0);
+ }
+}
+#elif defined(_WIN32)
+static BOOL WINAPI signal_handler(DWORD type)
+{
+ g_interrupted = 1;
+ return TRUE;
+}
+
+static void handle_signals(void)
+{
+ SetConsoleCtrlHandler(signal_handler, TRUE);
+}
+#else
+static void handle_signals(void)
+{
+}
+#endif
+