X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-debug.c;fp=src%2Fafb-debug.c;h=228f710e2d4be7ab72ccd51d90208c1769f731b7;hb=b2114e0f626ed42a5d6154c681486b4edb19fbbf;hp=5817f17e001695589807005449e23bf34e738ccb;hpb=846e952260278225b79de4062fff1f8f2145a544;p=src%2Fapp-framework-binder.git diff --git a/src/afb-debug.c b/src/afb-debug.c index 5817f17e..228f710e 100644 --- a/src/afb-debug.c +++ b/src/afb-debug.c @@ -25,12 +25,22 @@ #include #include +#include +#include +#include +#include +#include + #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); } }