Update copyright dates
[src/app-framework-binder.git] / src / afb-debug.c
index 5817f17..a9e645e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- Copyright 2017 IoT.bzh
+ Copyright (C) 2015-2020 "IoT.bzh"
 
  author: José Bollo <jose.bollo@iot.bzh>
 
 #include <string.h>
 #include <signal.h>
 
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#if !defined(NO_CALL_PERSONALITY)
+#include <sys/personality.h>
+#endif
+
 #include "verbose.h"
 
 static char key_env_break[] = "AFB_DEBUG_BREAK";
 static char key_env_wait[] = "AFB_DEBUG_WAIT";
 static char separs[] = ", \t\n";
 
+/*
+ * Checks whether the 'key' is in the 'list'
+ * Return 1 if it is in or 0 otherwise
+ */
 static int has_key(const char *key, const char *list)
 {
        if (list && key) {
@@ -46,40 +59,73 @@ static int has_key(const char *key, const char *list)
        return 0;
 }
 
+static void indicate(const char *key)
+{
+#if !defined(NO_AFB_DEBUG_FILE_INDICATION)
+       char filename[200];
+       int fd;
+
+       snprintf(filename, sizeof filename, "/tmp/afb-debug-%ld", (long)getpid());
+       if (key) {
+               fd = creat(filename, 0644);
+               write(fd, key, strlen(key));
+               close(fd);
+       } else {
+               unlink(filename);
+       }
+#endif
+}
+
 static void handler(int signum)
 {
 }
 
-void afb_debug(const char *key)
+void afb_debug_wait(const char *key)
 {
-       enum { None, Break, Wait } action;
+       struct sigaction sa, psa;
+       sigset_t ss, oss;
+
+       key = key ?: "NULL";
+       NOTICE("DEBUG WAIT before %s", key);
+       sigfillset(&ss);
+       sigdelset(&ss, SIGINT);
+       sigprocmask(SIG_SETMASK, &ss, &oss);
+       sigemptyset(&ss);
+       sigaddset(&ss, SIGINT);
+       memset(&sa, 0, sizeof sa);
+       sa.sa_handler = handler;
+       sigaction(SIGINT, &sa, &psa);
+       indicate(key);
+       sigwaitinfo(&ss, NULL);
+       sigaction(SIGINT, &psa, NULL);
+       indicate(NULL);
+       sigprocmask(SIG_SETMASK, &oss, NULL);
+       NOTICE("DEBUG WAIT after %s", key);
+#if !defined(NO_CALL_PERSONALITY)
+       personality((unsigned long)-1L);
+#endif
+}
+
+void afb_debug_break(const char *key)
+{
+       struct sigaction sa, psa;
+
+       key = key ?: "NULL";
+       NOTICE("DEBUG BREAK before %s", key);
+       memset(&sa, 0, sizeof sa);
+       sa.sa_handler = handler;
+       sigaction(SIGINT, &sa, &psa);
+       raise(SIGINT);
+       sigaction(SIGINT, &psa, NULL);
+       NOTICE("DEBUG BREAK after %s", key);
+}
 
+void afb_debug(const char *key)
+{
+       if (has_key(key, secure_getenv(key_env_wait)))
+               afb_debug_wait(key);
        if (has_key(key, secure_getenv(key_env_break)))
-               action = Break;
-       else if (has_key(key, secure_getenv(key_env_wait)))
-               action = Wait;
-       else
-               action = None;
-
-       if (action != None) {
-               const char *a = action == Break ? "BREAK" : "WAIT";
-               struct sigaction sa, psa;
-               sigset_t ss;
-
-               NOTICE("DEBUG %s before %s", a, key);
-               memset(&sa, 0, sizeof sa);
-               sa.sa_handler = handler;
-               sigaction(SIGINT, &sa, &psa);
-               if (action == Break) {
-                       raise(SIGINT);
-               } else {
-                       sigemptyset(&ss);
-                       sigaddset(&ss, SIGINT);
-                       sigwaitinfo(&ss, NULL);
-               }
-               sigaction(SIGINT, &psa, NULL);
-               NOTICE("DEBUG %s after %s", a, key);
-       }
+               afb_debug_break(key);
 }
 
 #endif