+/*----------------------------------------------------------
+ | timeout signalQuit
+ +--------------------------------------------------------- */
+void signalQuit (int signum)
+{
+ fprintf(stderr, "Terminating signal received %s\n", strsignal(signum));
+ exit(1);
+}
+
+
+/*----------------------------------------------------------
+ | Error signals
+ |
+ +--------------------------------------------------------- */
+__thread sigjmp_buf *error_handler;
+static void signalError(int signum)
+{
+ sigset_t sigset;
+
+ // unlock signal to allow a new signal to come
+ if (error_handler != NULL) {
+ sigemptyset(&sigset);
+ sigaddset(&sigset, signum);
+ sigprocmask(SIG_UNBLOCK, &sigset, 0);
+ longjmp(*error_handler, signum);
+ }
+ if (signum == SIGALRM)
+ return;
+ fprintf(stderr, "Unmonitored signal received %s\n", strsignal(signum));
+ exit(2);
+}
+
+static void install_error_handlers()
+{
+ int i, signals[] = { SIGALRM, SIGSEGV, SIGFPE, 0 };
+
+ for (i = 0; signals[i] != 0; i++) {
+ if (signal(signals[i], signalError) == SIG_ERR) {
+ fprintf(stderr, "Signal handler error\n");
+ exit(1);
+ }
+ }
+}
+
+/*----------------------------------------------------------
+ | daemonize
+ | set the process in background
+ +--------------------------------------------------------- */
+static void daemonize(struct afb_config *config)
+{