Remove tailing spaces and TODO file
[src/app-framework-binder.git] / src / afb-trace.c
index bc2de6d..8537081 100644 (file)
@@ -16,7 +16,6 @@
  */
 
 #define _GNU_SOURCE
-#define AFB_BINDING_PRAGMA_NO_VERBOSE_MACRO
 
 #include <assert.h>
 #include <string.h>
@@ -40,6 +39,7 @@
 #include "afb-trace.h"
 
 #include "wrap-json.h"
+#include "verbose.h"
 
 /*******************************************************************************/
 /*****  default names                                                      *****/
@@ -98,6 +98,7 @@ enum trace_type
        Trace_Type_Ditf,        /* ditf hooks */
        Trace_Type_Svc,         /* svc hooks */
        Trace_Type_Evt,         /* evt hooks */
+       Trace_Type_Global,      /* global hooks */
        Trace_Type_Count        /* count of types of hooks */
 };
 
@@ -181,7 +182,7 @@ static const char *verbosity_level_name(int level)
                "debug"
        };
 
-       return level >= 3 && level <= 7 ? names[level - 3] : NULL;
+       return level >= Log_Level_Error && level <= Log_Level_Debug ? names[level - Log_Level_Error] : NULL;
 }
 
 /* generic hook */
@@ -820,6 +821,60 @@ static struct afb_hook_evt_itf hook_evt_itf = {
        .hook_evt_drop = hook_evt_drop
 };
 
+/*******************************************************************************/
+/*****  trace the globals                                                  *****/
+/*******************************************************************************/
+
+static struct flag global_flags[] = { /* must be sorted by names */
+               { "all",                afb_hook_flags_global_all },
+               { "vverbose",           afb_hook_flag_global_vverbose },
+};
+
+/* get the global value for flag of 'name' */
+static int get_global_flag(const char *name)
+{
+       return get_flag(name, global_flags, (int)(sizeof global_flags / sizeof *global_flags));
+}
+
+static void hook_global(void *closure, const struct afb_hookid *hookid, const char *action, const char *format, ...)
+{
+       va_list ap;
+
+       va_start(ap, format);
+       emit(closure, hookid, "global", "{ss}", format, ap, "action", action);
+       va_end(ap);
+}
+
+static void hook_global_vverbose(void *closure, const struct afb_hookid *hookid, int level, const char *file, int line, const char *function, const char *fmt, va_list args)
+{
+       struct json_object *pos;
+       int len;
+       char *msg;
+       va_list ap;
+
+       pos = NULL;
+       msg = NULL;
+
+       va_copy(ap, args);
+       len = vasprintf(&msg, fmt, ap);
+       va_end(ap);
+
+       if (file)
+               wrap_json_pack(&pos, "{ss si ss*}", "file", file, "line", line, "function", function);
+
+       hook_global(closure, hookid, "vverbose", "{si ss* ss? so*}",
+                                       "level", level,
+                                       "type", verbosity_level_name(level),
+                                       len < 0 ? "format" : "message", len < 0 ? fmt : msg,
+                                       "position", pos);
+
+       free(msg);
+}
+
+static struct afb_hook_global_itf hook_global_itf = {
+       .hook_global_vverbose = hook_global_vverbose,
+};
+
 /*******************************************************************************/
 /*****  abstract types                                                     *****/
 /*******************************************************************************/
@@ -856,7 +911,13 @@ abstracting[Trace_Type_Count] =
                .name = "event",
                .unref =  (void(*)(void*))afb_hook_unref_evt,
                .get_flag = get_evt_flag
-       }
+       },
+       [Trace_Type_Global] =
+       {
+               .name = "global",
+               .unref =  (void(*)(void*))afb_hook_unref_global,
+               .get_flag = get_global_flag
+       },
 };
 
 /*******************************************************************************/
@@ -899,7 +960,7 @@ static void trace_cleanup(struct afb_trace *trace)
        psession = &trace->sessions;
        while ((session = *psession)) {
                /* search for session */
-               for (hook = NULL, i = 0 ; !hook && i < Trace_Type_Count ; i++) 
+               for (hook = NULL, i = 0 ; !hook && i < Trace_Type_Count ; i++)
                        for (hook = trace->hooks[i] ; hook && hook->session != session ; hook = hook->next);
                /* keep or free whether used or not */
                if (hook)
@@ -915,7 +976,7 @@ static void trace_cleanup(struct afb_trace *trace)
        ptag = &trace->tags;
        while ((tag = *ptag)) {
                /* search for tag */
-               for (hook = NULL, i = 0 ; !hook && i < Trace_Type_Count ; i++) 
+               for (hook = NULL, i = 0 ; !hook && i < Trace_Type_Count ; i++)
                        for (hook = trace->hooks[i] ; hook && hook->tag != tag ; hook = hook->next);
                /* keep or free whether used or not */
                if (hook)
@@ -929,7 +990,7 @@ static void trace_cleanup(struct afb_trace *trace)
        pevent = &trace->events;
        while ((event = *pevent)) {
                /* search for event */
-               for (hook = NULL, i = 0 ; !hook && i < Trace_Type_Count ; i++) 
+               for (hook = NULL, i = 0 ; !hook && i < Trace_Type_Count ; i++)
                        for (hook = trace->hooks[i] ; hook && hook->event != event ; hook = hook->next);
                /* keep or free whether used or not */
                if (hook)
@@ -1149,6 +1210,9 @@ static void addhook(struct desc *desc, enum trace_type type)
        case Trace_Type_Evt:
                hook->handler = afb_hook_create_evt(desc->pattern, desc->flags[type], &hook_evt_itf, hook);
                break;
+       case Trace_Type_Global:
+               hook->handler = afb_hook_create_global(desc->flags[type], &hook_global_itf, hook);
+               break;
        default:
                break;
        }
@@ -1214,17 +1278,22 @@ static void add_evt_flags(void *closure, struct json_object *object)
        add_flags(closure, object, Trace_Type_Evt);
 }
 
+static void add_global_flags(void *closure, struct json_object *object)
+{
+       add_flags(closure, object, Trace_Type_Global);
+}
+
 /* add hooks */
 static void add(void *closure, struct json_object *object)
 {
        int rc;
        struct desc desc;
-       struct json_object *request, *event, *daemon, *service, *sub;
+       struct json_object *request, *event, *daemon, *service, *sub, *global;
 
        memcpy (&desc, closure, sizeof desc);
-       request = event = daemon = service = sub = NULL;
+       request = event = daemon = service = sub = global = NULL;
 
-       rc = wrap_json_unpack(object, "{s?s s?s s?s s?s s?s s?s s?o s?o s?o s?o s?o}",
+       rc = wrap_json_unpack(object, "{s?s s?s s?s s?s s?s s?s s?o s?o s?o s?o s?o s?o}",
                        "name", &desc.name,
                        "tag", &desc.tag,
                        "api", &desc.api,
@@ -1235,6 +1304,7 @@ static void add(void *closure, struct json_object *object)
                        "daemon", &daemon,
                        "service", &service,
                        "event", &event,
+                       "global", &global,
                        "for", &sub);
 
        if (!rc) {
@@ -1261,6 +1331,9 @@ static void add(void *closure, struct json_object *object)
                if (event)
                        wrap_json_optarray_for_all(event, add_evt_flags, &desc);
 
+               if (global)
+                       wrap_json_optarray_for_all(global, add_global_flags, &desc);
+
                /* apply */
                if (sub)
                        wrap_json_optarray_for_all(sub, add, &desc);