X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-debug.c;h=a9e645ece21b4e4021886b121f4650f55571c081;hb=65353dce81a629e042800bb7b86fcd869a76727e;hp=5817f17e001695589807005449e23bf34e738ccb;hpb=846e952260278225b79de4062fff1f8f2145a544;p=src%2Fapp-framework-binder.git diff --git a/src/afb-debug.c b/src/afb-debug.c index 5817f17e..a9e645ec 100644 --- a/src/afb-debug.c +++ b/src/afb-debug.c @@ -1,5 +1,5 @@ /* - Copyright 2017 IoT.bzh + Copyright (C) 2015-2020 "IoT.bzh" author: José Bollo @@ -25,12 +25,25 @@ #include #include +#include +#include +#include +#include +#include +#if !defined(NO_CALL_PERSONALITY) +#include +#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