debug: Create a file indicating the waiting point
authorJosé Bollo <jose.bollo@iot.bzh>
Thu, 6 Jul 2017 08:59:14 +0000 (10:59 +0200)
committerJosé Bollo <jose.bollo@iot.bzh>
Tue, 11 Jul 2017 15:12:08 +0000 (17:12 +0200)
When AFB_DEBUG_WAIT is used, the file /tmp/afb-debug-<PID>
is created and contains the name of the awaiting point
(without tailing new line)

Signals other than SIGINT are ignored when waiting
for SIGINT. This improves the cleaning up. Example:
the signal SIGTERM is delayed until after removal of
the debugging indication file.

Change-Id: I5c896e4d9a3a098affc18d4282e260d9bb253611
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
src/CMakeLists.txt
src/afb-debug.c

index 31fcd51..7d2db4a 100644 (file)
@@ -28,6 +28,7 @@ ADD_SUBDIRECTORY(tests)
 ADD_DEFINITIONS(-DBINDING_INSTALL_DIR="${binding_install_dir}")
 # Always add INFER_EXTENSION (more details in afb-hreq.c)
 ADD_DEFINITIONS(-DINFER_EXTENSION)
+ADD_DEFINITIONS(-DAGL_DEVEL)
 
 ADD_LIBRARY(afb-lib STATIC
        afb-api.c
index 5817f17..228f710 100644 (file)
 #include <string.h>
 #include <signal.h>
 
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
 #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,39 +56,56 @@ 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)
 {
-       enum { None, Break, Wait } action;
+       struct sigaction sa, psa;
+       sigset_t ss, oss;
 
-       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);
+       if (has_key(key, secure_getenv(key_env_break))) {
+               NOTICE("DEBUG BREAK before %s", 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);
-               }
+               raise(SIGINT);
+               sigaction(SIGINT, &psa, NULL);
+               NOTICE("DEBUG BREAK after %s", key);
+       } else if (has_key(key, secure_getenv(key_env_wait))) {
+               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);
-               NOTICE("DEBUG %s after %s", a, key);
+               indicate(NULL);
+               sigprocmask(SIG_SETMASK, &oss, NULL);
+               NOTICE("DEBUG WAIT after %s", key);
        }
 }