Add ability to provide binding settings 61/15961/1
authorJosé Bollo <jose.bollo@iot.bzh>
Fri, 27 Jul 2018 15:38:22 +0000 (17:38 +0200)
committerJosé Bollo <jose.bollo@iot.bzh>
Thu, 2 Aug 2018 13:49:43 +0000 (15:49 +0200)
Change-Id: Iab93a26340fa9743a58ca43cd903bbf31c783e5b
Signed-off-by: Jose Bollo <jose.bollo@iot.bzh>
16 files changed:
bindings/samples/hello3.c
coverage/scripts/02-hello.sh
coverage/scripts/run-test.sh
docs/afb-daemon-options.md
docs/reference-v3/func-api.md
include/afb/afb-api-x3-itf.h
include/afb/afb-api-x3.h
include/afb/afb-binding-predefs.h
src/afb-config.c
src/afb-export.c
src/afb-export.h
src/afb-hook-flags.c
src/afb-hook.c
src/afb-hook.h
src/afb-trace.c
src/main-afb-daemon.c

index 7e54e3a..99a3582 100644 (file)
@@ -552,6 +552,13 @@ static void queue(afb_req_t request)
        afb_api_queue_job(afb_req_get_api(request), queue_cb, request, NULL, 0);
 }
 
+static void settings(afb_req_t request)
+{
+       afb_api_t api = afb_req_get_api(request);
+       struct json_object *object = afb_api_settings(api);
+       afb_req_reply(request, json_object_get(object), NULL, NULL);
+}
+
 static void rootdir (afb_req_t request)
 {
        ssize_t s;
@@ -735,6 +742,7 @@ static const struct afb_verb_v3 verbs[]= {
   { .verb="api",         .callback=api},
   { .verb="mute",        .callback=mute},
   { .verb="queue",       .callback=queue},
+  { .verb="settings",    .callback=settings},
   { .verb=NULL}
 };
 
index de6e2de..a490f12 100755 (executable)
@@ -60,6 +60,7 @@ hello getctx
 hello setctx "some-text-2"
 hello getctx
 hello info
+hello settings
 hello verbose {"level":2,"message":"hello"}
 hello eventloop
 hello dbus false
index 5d1b9a9..be08365 100755 (executable)
@@ -122,6 +122,7 @@ $R/bin/afb-daemon-cov \
        --traceevt all \
        --traceglob none \
        --monitoring \
+       --set hello/key:a-kind-of-text \
        --call demat/ping:true \
        --call hello/ping:false \
        --ws-server unix:$R/apis/ws/hello \
index b3a6a18..020991e 100644 (file)
@@ -7,6 +7,7 @@ The launch options for binder **afb-daemon** are:
  -q, --quiet             Quiet Mode, repeat to decrease verbosity
  -l, --log=xxxx          Tune log level
      --foreground        Get all in foreground mode
+     --background        Get all in background mode
      --daemon            Get all in background mode
  -n, --name=xxxx         Set the visible name
  -p, --port=xxxx         HTTP listening TCP port  [default 1234]
@@ -33,15 +34,20 @@ The launch options for binder **afb-daemon** are:
  -A, --auto-api=xxxx     Automatic load of api of the given directory
      --session-max=xxxx  Max count of session simultaneously [default 200]
      --tracereq=xxxx     Log the requests: no, common, extra, all
-     --traceditf=xxxx    Log the daemons: no, common, all
-     --tracesvc=xxxx     Log the services: no, all
      --traceevt=xxxx     Log the events: no, common, extra, all
      --traceses=xxxx     Log the sessions: no, all
      --traceapi=xxxx     Log the apis: no, common, api, event, all
+     --traceglob=xxxx    Log the globals: none, all
+     --traceditf=xxxx    Log the daemons: no, common, all
+     --tracesvc=xxxx     Log the services: no, all
  -c, --call=xxxx         call at start format of val: API/VERB:json-args
      --no-httpd          Forbid HTTP service
  -e, --exec              Execute the remaining arguments
  -M, --monitoring        Enable HTTP monitoring at <ROOT>/monitoring/
+ -C, --config=xxxx       Load options from the given config file
+ -Z, --dump-config       Dump the config to stdout and exit
+ -s, --set=xxxx          Set parameters ([API]/[KEY]:JSON or {"API":{"KEY":JSON}}
+ -o, --output=xxxx       Redirect stdout and stderr to output file
 ```
 
 ## help
@@ -247,3 +253,96 @@ Set the visible name
 
 Automatic activation of api of the given directory when the api is missing.
 
+## config=xxxx
+
+Load options from the given config file
+
+This can be used instead of arguments on the command line.
+
+Example:
+
+       afb-daemon \
+               --no-ldpaths \
+               --binding /home/15646/bindings/binding45.so \
+               --binding /home/15646/bindings/binding3.so \
+               --tracereq common \
+               --port 5555 \
+               --token SPYER \
+               --set api45/key:54027a5e3c6cb2ca5ddb97679ce32f185b067b0a557d16a8333758910bc25a72 \
+               --exec /home/15646/bin/test654 @p @t
+
+is equivalent to:
+
+       afb-daemon --config /home/15646/config1
+
+when the file **/home/15646/config1** is:
+
+       {
+         "no-ldpaths": true,
+         "binding": [
+           "\/home\/15646\/bindings\/binding45.so",
+           "\/home\/15646\/bindings\/binding3.so"
+         ],
+         "tracereq": "common",
+         "port": 5555,
+         "token": "SPYER",
+         "set" : {
+           "api45": {
+             "key": "54027a5e3c6cb2ca5ddb97679ce32f185b067b0a557d16a8333758910bc25a72"
+           }
+         },
+         "exec": [
+           "\/home\/15646\/bin\/test654",
+           "@p",
+           "@t"
+         ]
+       }
+
+The options are the keys of the config object.
+
+See option --dump-config
+
+## dump-config
+
+Output a JSON representation of the configuration resulting from
+environment and options.
+
+## output=xxxx
+
+Redirect stdout and stderr to output file
+
+## set=xxxx
+
+Set values that can be retrieved by bindings.
+
+The set value can have different formats.
+
+The most generic format is **{"API1":{"KEY1":VALUE,"KEY2":VALUE2,...},"API2":...}**
+
+This example set 2 keys for the api *chook*:
+
+       afb-daemon -Z --set '{"chook":{"account":"urn:chook:b2ca5ddb97679","delay":500}}'
+       {
+          "set": {
+            "chook": {
+              "account": "urn:chook:b2ca5ddb97679",
+              "delay": 500
+            }
+          }
+        }
+
+An other format is: **[API]/[KEY]:VALUE**.
+When API is omitted, it take the value "*".
+When KEY is ommitted, it take the value of "*".
+
+The settings for the API \* are globals and apply to all bindings.
+
+The settings for the KEY \* are mixing the value for the API.
+
+The following examples are all setting the same values:
+
+       afb-daemon --set '{"chook":{"account":"urn:chook:b2ca5ddb97679","delay":500}}'
+       afb-daemon --set 'chook/*:{"account":"urn:chook:b2ca5ddb97679","delay":500}'
+       afb-daemon --set 'chook/:{"account":"urn:chook:b2ca5ddb97679","delay":500}'
+       afb-daemon --set 'chook/account:"urn:chook:b2ca5ddb97679"' --set chook/delay:500
+
index 535bff8..ef3816d 100644 (file)
@@ -58,7 +58,7 @@ void afb_api_set_userdata(
  * Check that it requires the API of 'name'.
  * If 'initialized' is not zero it requests the API to be
  * initialized, implying its initialization if needed.
- * 
+ *
  * Calling this function is only allowed within init.
  *
  * A single request allows to require multiple apis.
@@ -255,6 +255,24 @@ int afb_api_rootdir_open_locale(
                        const char *locale);
 ```
 
+### afb_api_settings
+
+```C
+/**
+ * Settings of the api.
+ *
+ * Get the settings of the API. The settings are recorded
+ * as a JSON object. The returned object should not be modified.
+ * It MUST NOT be released using json_object_put.
+ *
+ * @param api the api whose settings are required
+ *
+ * @returns The setting object.
+ */
+struct json_object *afb_api_settings(
+                       struct afb_api_x3 *api);
+```
+
 ## Calls and job functions
 
 ### afb_api_call
index b8cfadf..ca8fa71 100644 (file)
@@ -261,6 +261,10 @@ struct afb_api_x3_itf
        /** delete the api */
        int (*delete_api)(
                struct afb_api_x3 *api);
+
+       /** settings of the api */
+       struct json_object *(*settings)(
+               struct afb_api_x3 *api);
 };
 
 /** @} */
index 0346135..98aaaa1 100644 (file)
@@ -357,7 +357,7 @@ int afb_api_x3_queue_job(
  * Check that it requires the API of 'name'.
  * If 'initialized' is not zero it request the API to be
  * initialized, implying its initialization if needed.
- * 
+ *
  * Calling this function is only allowed within init.
  *
  * A single request allows to require multiple apis.
@@ -581,7 +581,7 @@ struct afb_api_x3 *afb_api_x3_new_api(
  * @see afb_api_x3_add_verb
  * @see afb_api_x3_set_verbs_v3
  */
-static inline 
+static inline
 int afb_api_x3_set_verbs_v2(
                        struct afb_api_x3 *api,
                        const struct afb_verb_v2 *verbs)
@@ -941,4 +941,22 @@ int afb_api_x3_delete_api(
        return api->itf->delete_api(api);
 }
 
+/**
+ * Settings of the api.
+ *
+ * Get the settings of the API. The settings are recorded
+ * as a JSON object. The returned object should not be modified.
+ * It MUST NOT be released using json_object_put.
+ *
+ * @param api the api whose settings are required
+ *
+ * @returns The setting object.
+ */
+static inline
+struct json_object *afb_api_x3_settings(
+                       struct afb_api_x3 *api)
+{
+       return api->itf->settings(api);
+}
+
 /** @} */
index 791374b..56ac504 100644 (file)
 #define afb_api_x3_event_handler_del   afb_api_event_handler_del
 #define afb_api_x3_require_class       afb_api_require_class
 #define afb_api_x3_provide_class       afb_api_provide_class
+#define afb_api_x3_settings            afb_api_settings
 
 #define AFB_API_ERROR                  AFB_API_ERROR_V3
 #define AFB_API_WARNING                        AFB_API_WARNING_V3
index a791969..c10b293 100644 (file)
 #define SET_PORT           'p'
 #define SET_QUIET          'q'
 #define SET_RANDOM_TOKEN   'r'
+#define ADD_SET            's'
 #define SET_TOKEN          't'
 #define SET_UPLOAD_DIR     'u'
 #define GET_VERSION        'V'
 #define SET_VERBOSE        'v'
 #define SET_WORK_DIR       'w'
+#define DUMP_CONFIG        'Z'
 
 /* structure for defining of options */
 struct option_desc {
@@ -213,6 +215,9 @@ static struct option_desc optdefs[] = {
 #endif
 
        {SET_CONFIG,          1, "config",      "Load options from the given config file"},
+       {DUMP_CONFIG,         0, "dump-config", "Dump the config to stdout and exit"},
+
+       {ADD_SET,             1, "set",         "Set parameters ([API]/[KEY]:JSON or {\"API\":{\"KEY\":JSON}}" },
        {SET_OUTPUT,          1, "output",      "Redirect stdout and stderr to output file (when --daemon)"},
 
        {0, 0, NULL, NULL}
@@ -396,6 +401,30 @@ static void printHelp(FILE * file, const char *name)
                name);
 }
 
+static void dump(struct json_object *config, FILE *file, const char *prefix, const char *title)
+{
+       const char *head, *tail;
+
+       if (title)
+               fprintf(file, "%s----BEGIN OF %s-----\n", prefix ?: "", title);
+
+       head = json_object_to_json_string_ext(config, JSON_C_TO_STRING_PRETTY
+               |JSON_C_TO_STRING_SPACED|JSON_C_TO_STRING_NOSLASHESCAPE);
+
+       if (!prefix)
+               fprintf(file, "%s\n", head);
+       else {
+               while(*head) {
+                       for (tail = head ; *tail && *tail != '\n' ; tail++);
+                       fprintf(file, "%s %.*s\n", prefix, (int)(tail - head), head);
+                       head = tail + !!*tail;
+               }
+       }
+
+       if (title)
+               fprintf(file, "%s----END OF %s-----\n", prefix ?: "", title);
+}
+
 /**********************************
 * json helpers
 ***********************************/
@@ -539,8 +568,7 @@ static void config_add(struct json_object *config, int optid, struct json_object
 {
        struct json_object *a;
        if (!json_object_object_get_ex(config, name_of_optid(optid), &a)) {
-               a = json_object_new_array();
-               oomchk(a);
+               a = joomchk(json_object_new_array());
                json_object_object_add(config, name_of_optid(optid), a);
        }
        json_object_array_add(a, val);
@@ -556,6 +584,73 @@ static void config_add_optstr(struct json_object *config, int optid)
        config_add_str(config, optid, get_arg(optid));
 }
 
+static void config_mix2_cb(void *closure, struct json_object *obj, const char *name)
+{
+       struct json_object *dest, *base = closure;
+
+       if (!name)
+               name = "";
+
+       if (!json_object_object_get_ex(base, name, &dest)) {
+               dest = joomchk(json_object_new_object());
+               json_object_object_add(base, name, dest);
+       }
+       if (json_object_is_type(obj, json_type_object))
+               wrap_json_object_add(dest, obj);
+       else
+               json_object_object_add(dest, "", json_object_get(obj));
+}
+
+static void config_mix2(struct json_object *config, int optid, struct json_object *val)
+{
+       struct json_object *obj;
+
+       if (!json_object_object_get_ex(config, name_of_optid(optid), &obj)) {
+               obj = joomchk(json_object_new_object());
+               json_object_object_add(config, name_of_optid(optid), obj);
+       }
+       wrap_json_for_all(val, config_mix2_cb, obj);
+}
+
+static void config_mix2_str(struct json_object *config, int optid, const char *val)
+{
+       size_t st1, st2;
+       const char *api, *key;
+       struct json_object *obj, *sub;
+       enum json_tokener_error jerr;
+
+       st1 = strcspn(val, "/:{[\"");
+       st2 = strcspn(&val[st1], ":{[\"");
+       if (val[st1] != '/' || val[st1 + st2] != ':') {
+               obj = json_tokener_parse_verbose(val, &jerr);
+               if (jerr != json_tokener_success)
+                       obj = json_object_new_string(val);
+       } else {
+               api = st1 == 0 ? "*" : strndupa(val, st1);
+               val += st1 + 1;
+               key = st2 <= 1 || (st2 == 2 && *val == '*') ? NULL : strndupa(val, st2 - 1);
+               val += st2;
+               sub = json_tokener_parse_verbose(val, &jerr);
+               if (jerr != json_tokener_success)
+                       sub = json_object_new_string(val);
+
+               if (key) {
+                       obj = json_object_new_object();
+                       json_object_object_add(obj, key, sub);
+                       sub = obj;
+               }
+               obj = json_object_new_object();
+               json_object_object_add(obj, api, sub);
+       }
+       config_mix2(config, optid, obj);
+       json_object_put(obj);
+}
+
+static void config_mix2_optstr(struct json_object *config, int optid)
+{
+       config_mix2_str(config, optid, get_arg(optid));
+}
+
 /*---------------------------------------------------------
  |   set the log levels
  +--------------------------------------------------------- */
@@ -610,7 +705,7 @@ static void set_log(const char *args)
 static void parse_arguments_inner(int argc, char **argv, struct json_object *config, struct option *options)
 {
        struct json_object *conf;
-       int optid, cind;
+       int optid, cind, dodump = 0;
 
        for (;;) {
                cind = optind;
@@ -672,6 +767,10 @@ static void parse_arguments_inner(int argc, char **argv, struct json_object *con
                        config_add_optstr(config, optid);
                        break;
 
+               case ADD_SET:
+                       config_mix2_optstr(config, optid);
+                       break;
+
 #if defined(WITH_MONITORING_OPTION)
                case SET_MONITORING:
 #endif
@@ -739,6 +838,11 @@ static void parse_arguments_inner(int argc, char **argv, struct json_object *con
                        json_object_put(conf);
                        break;
 
+               case DUMP_CONFIG:
+                       noarg(optid);
+                       dodump = 1;
+                       break;
+
                case GET_VERSION:
                        noarg(optid);
                        printVersion(stdout);
@@ -754,6 +858,11 @@ static void parse_arguments_inner(int argc, char **argv, struct json_object *con
                }
        }
        /* TODO: check for extra value */
+
+       if (dodump) {
+               dump(config, stdout, NULL, NULL);
+               exit(0);
+       }
 }
 
 static void parse_arguments(int argc, char **argv, struct json_object *config)
@@ -807,45 +916,17 @@ static void fulfill_config(struct json_object *config)
 #endif
 }
 
-static void dump(struct json_object *config, FILE *file, const char *prefix, const char *title)
-{
-       char z;
-       const char *head, *tail;
-
-       if (!prefix) {
-               z = 0;
-               prefix = &z;
-       }
-
-       if (title)
-               fprintf(file, "%s----BEGIN OF %s-----\n", prefix, title);
-
-       head = json_object_to_json_string_ext(config, JSON_C_TO_STRING_PRETTY
-               |JSON_C_TO_STRING_SPACED|JSON_C_TO_STRING_NOSLASHESCAPE);
-
-       if (head) {
-               while(*head) {
-                       for (tail = head ; *tail && *tail != '\n' ; tail++);
-                       fprintf(file, "%s %.*s\n", prefix, (int)(tail - head), head);
-                       head = tail + !!*tail;
-               }
-       }
-
-       if (title)
-               fprintf(file, "%s----END OF %s-----\n", prefix, title);
-}
-
 void afb_config_dump(struct json_object *config)
 {
        dump(config, stderr, "--", "CONFIG");
 }
 
-static void on_environment_add(struct json_object *config, int optid, const char *name)
+static void on_environment(struct json_object *config, int optid, const char *name, void (*func)(struct json_object*, int, const char*))
 {
        char *value = getenv(name);
 
        if (value && *value)
-               config_add_str(config, optid, value);
+               func(config, optid, value);
 }
 
 static void on_environment_enum(struct json_object *config, int optid, const char *name, int (*func)(const char*))
@@ -867,7 +948,8 @@ static void parse_environment(struct json_object *config)
        on_environment_enum(config, SET_TRACESES, "AFB_TRACESES", afb_hook_flags_session_from_text);
        on_environment_enum(config, SET_TRACEAPI, "AFB_TRACEAPI", afb_hook_flags_api_from_text);
        on_environment_enum(config, SET_TRACEGLOB, "AFB_TRACEGLOB", afb_hook_flags_global_from_text);
-       on_environment_add(config, ADD_LDPATH, "AFB_LDPATHS");
+       on_environment(config, ADD_LDPATH, "AFB_LDPATHS", config_add_str);
+       on_environment(config, ADD_SET, "AFB_SET", config_mix2_str);
 #if !defined(REMOVE_LEGACY_TRACE)
        on_environment_enum(config, SET_TRACEDITF, "AFB_TRACEDITF", afb_hook_flags_legacy_ditf_from_text);
        on_environment_enum(config, SET_TRACESVC, "AFB_TRACESVC", afb_hook_flags_legacy_svc_from_text);
index e9d5d9a..c1a716f 100644 (file)
@@ -51,6 +51,7 @@
 #include "jobs.h"
 #include "verbose.h"
 #include "sig-monitor.h"
+#include "wrap-json.h"
 
 /*************************************************************************
  * internal types
@@ -139,6 +140,9 @@ struct afb_export
        /* event handler list */
        struct event_handler *event_handlers;
 
+       /* settings */
+       struct json_object *settings;
+
        /* internal descriptors */
        union {
 #if defined(WITH_LEGACY_BINDING_V1)
@@ -195,6 +199,41 @@ struct afb_api_x3 *afb_export_to_api_x3(struct afb_export *export)
        return to_api_x3(export);
 }
 
+/******************************************************************************
+ ******************************************************************************
+ ******************************************************************************
+ ******************************************************************************
+       SETTINGS
+ ******************************************************************************
+ ******************************************************************************
+ ******************************************************************************
+ ******************************************************************************/
+
+static struct json_object *configuration;
+
+void afb_export_set_config(struct json_object *config)
+{
+       struct json_object *save = configuration;
+       configuration = json_object_get(config);
+       json_object_put(save);
+}
+
+static struct json_object *get_settings(const char *name)
+{
+       struct json_object *result;
+       struct json_object *obj;
+
+       if (json_object_object_get_ex(configuration, "*", &obj))
+               result = wrap_json_clone(obj);
+       else
+               result = json_object_new_object();
+
+       if (json_object_object_get_ex(configuration, name, &obj))
+               wrap_json_object_add(result, obj);
+
+       return result;
+}
+
 /******************************************************************************
  ******************************************************************************
  ******************************************************************************
@@ -867,6 +906,17 @@ static int delete_api_cb(struct afb_api_x3 *api)
        return 0;
 }
 
+static struct json_object *settings_cb(struct afb_api_x3 *api)
+{
+       struct afb_export *export = from_api_x3(api);
+       struct json_object *result = export->settings;
+       if (!result) {
+               result = get_settings(export->name);
+               export->settings = result;
+       }
+       return result;
+}
+
 static int hooked_api_set_verbs_v2_cb(
                struct afb_api_x3 *api,
                const struct afb_verb_v2 *verbs)
@@ -980,6 +1030,14 @@ static int hooked_delete_api_cb(struct afb_api_x3 *api)
        return result;
 }
 
+static struct json_object *hooked_settings_cb(struct afb_api_x3 *api)
+{
+       struct afb_export *export = from_api_x3(api);
+       struct json_object *result = settings_cb(api);
+       result = afb_hook_api_settings(export, result);
+       return result;
+}
+
 static const struct afb_api_x3_itf api_x3_itf = {
 
        .vverbose = (void*)vverbose_cb,
@@ -1018,6 +1076,7 @@ static const struct afb_api_x3_itf api_x3_itf = {
        .class_require = class_require_cb,
 
        .delete_api = delete_api_cb,
+       .settings = settings_cb,
 };
 
 static const struct afb_api_x3_itf hooked_api_x3_itf = {
@@ -1058,6 +1117,7 @@ static const struct afb_api_x3_itf hooked_api_x3_itf = {
        .class_require = hooked_class_require_cb,
 
        .delete_api = hooked_delete_api_cb,
+       .settings = hooked_settings_cb,
 };
 
 /******************************************************************************
@@ -1267,6 +1327,7 @@ void afb_export_destroy(struct afb_export *export)
                afb_apiset_unref(export->call_set);
                if (export->api.apiname != export->name)
                        free((void*)export->api.apiname);
+               json_object_put(export->settings);
                free(export);
        }
 }
index be8adfd..0bee174 100644 (file)
@@ -30,6 +30,8 @@ struct afb_api_v3;
 struct afb_api_x3;
 struct afb_event_x2;
 
+extern void afb_export_set_config(struct json_object *config);
+
 extern struct afb_export *afb_export_create_none_for_path(
                                struct afb_apiset *declare_set,
                                struct afb_apiset *call_set,
index 738e54c..5798735 100644 (file)
@@ -112,6 +112,7 @@ static struct flag api_flags[] = { /* must be sorted by names */
                { "require_api",        afb_hook_flag_api_require_api },
                { "rootdir_get_fd",     afb_hook_flag_api_rootdir_get_fd },
                { "rootdir_open_locale",afb_hook_flag_api_rootdir_open_locale },
+               { "settings",           afb_hook_flag_api_settings },
                { "start",              afb_hook_flag_api_start },
                { "vverbose",           afb_hook_flag_api_vverbose },
 };
index 6b65530..592f92a 100644 (file)
@@ -913,6 +913,11 @@ static void hook_api_on_event_handler_after_cb(void *closure, const struct afb_h
        _hook_api_(export, "on_event_handler[%s].after(%s, %d, %s)", pattern, event, event_x2, json_object_to_json_string_ext(object, JSON_C_TO_STRING_NOSLASHESCAPE));
 }
 
+static void hook_api_settings_cb(void *closure, const struct afb_hookid *hookid, const struct afb_export *export, struct json_object *object)
+{
+       _hook_api_(export, "settings -> %s", json_object_to_json_string_ext(object, JSON_C_TO_STRING_NOSLASHESCAPE));
+}
+
 static struct afb_hook_api_itf hook_api_default_itf = {
        .hook_api_event_broadcast_before = hook_api_event_broadcast_before_cb,
        .hook_api_event_broadcast_after = hook_api_event_broadcast_after_cb,
@@ -952,6 +957,7 @@ static struct afb_hook_api_itf hook_api_default_itf = {
        .hook_api_delete_api = hook_api_delete_api_cb,
        .hook_api_on_event_handler_before = hook_api_on_event_handler_before_cb,
        .hook_api_on_event_handler_after = hook_api_on_event_handler_after_cb,
+       .hook_api_settings = hook_api_settings_cb,
 };
 
 /******************************************************************************
@@ -1189,6 +1195,12 @@ void afb_hook_api_on_event_handler_after(const struct afb_export *export, const
        _HOOK_API_2_(on_event_handler, on_event_handler_after, export, event, event_x2, object, pattern);
 }
 
+struct json_object *afb_hook_api_settings(const struct afb_export *export, struct json_object *object)
+{
+       _HOOK_API_(settings, export, object);
+       return object;
+}
+
 /******************************************************************************
  * section: hooking export
  *****************************************************************************/
index f315cc0..76022ed 100644 (file)
@@ -197,6 +197,7 @@ extern struct json_object *afb_hook_xreq_get_client_info(const struct afb_xreq *
 #define afb_hook_flag_api_on_event                     0x04000000
 #define afb_hook_flag_api_legacy_unstore_req           0x08000000
 #define afb_hook_flag_api_on_event_handler             0x10000000
+#define afb_hook_flag_api_settings                     0x20000000
 
 /* common flags */
 /* extra flags */
@@ -208,7 +209,8 @@ extern struct json_object *afb_hook_xreq_get_client_info(const struct afb_xreq *
                                        |afb_hook_flag_api_call\
                                        |afb_hook_flag_api_callsync\
                                        |afb_hook_flag_api_start\
-                                       |afb_hook_flag_api_queue_job)
+                                       |afb_hook_flag_api_queue_job\
+                                       |afb_hook_flag_api_settings)
 
 
 #define afb_hook_flags_api_extra       (afb_hook_flag_api_get_event_loop\
@@ -311,6 +313,7 @@ struct afb_hook_api_itf {
        void (*hook_api_delete_api)(void *closure, const struct afb_hookid *hookid, const struct afb_export *export, int result);
        void (*hook_api_on_event_handler_before)(void *closure, const struct afb_hookid *hookid, const struct afb_export *export, const char *event, int event_x2, struct json_object *object, const char *pattern);
        void (*hook_api_on_event_handler_after)(void *closure, const struct afb_hookid *hookid, const struct afb_export *export, const char *event, int event_x2, struct json_object *object, const char *pattern);
+       void (*hook_api_settings)(void *closure, const struct afb_hookid *hookid, const struct afb_export *export, struct json_object *object);
 };
 
 extern void afb_hook_api_event_broadcast_before(const struct afb_export *export, const char *name, struct json_object *object);
@@ -351,6 +354,7 @@ extern int afb_hook_api_class_require(const struct afb_export *export, int resul
 extern int afb_hook_api_delete_api(const struct afb_export *export, int result);
 extern void afb_hook_api_on_event_handler_before(const struct afb_export *export, const char *event, int event_x2, struct json_object *object, const char *pattern);
 extern void afb_hook_api_on_event_handler_after(const struct afb_export *export, const char *event, int event_x2, struct json_object *object, const char *pattern);
+extern struct json_object *afb_hook_api_settings(const struct afb_export *export, struct json_object *object);
 
 extern int afb_hook_flags_api(const char *api);
 extern struct afb_hook_api *afb_hook_create_api(const char *api, int flags, struct afb_hook_api_itf *itf, void *closure);
index 3f77395..aaa1635 100644 (file)
@@ -717,6 +717,23 @@ static void hook_api_delete_api(void *closure, const struct afb_hookid *hookid,
        hook_api(closure, hookid, export, "delete_api", "{si}",  "status", result);
 }
 
+static void hook_api_on_event_handler_before(void *closure, const struct afb_hookid *hookid, const struct afb_export *export, const char *event, int event_x2, struct json_object *object, const char *pattern)
+{
+       hook_api(closure, hookid, export, "on_event_handler.before",
+               "{ss ss sO?}", "pattern", pattern, "event", event, "data", object);
+}
+
+static void hook_api_on_event_handler_after(void *closure, const struct afb_hookid *hookid, const struct afb_export *export, const char *event, int event_x2, struct json_object *object, const char *pattern)
+{
+       hook_api(closure, hookid, export, "on_event_handler.after",
+               "{ss ss sO?}", "pattern", pattern, "event", event, "data", object);
+}
+
+static void hook_api_settings(void *closure, const struct afb_hookid *hookid, const struct afb_export *export, struct json_object *object)
+{
+       hook_api(closure, hookid, export, "settings", "{sO}", "settings", object);
+}
+
 static struct afb_hook_api_itf hook_api_itf = {
        .hook_api_event_broadcast_before = hook_api_event_broadcast_before,
        .hook_api_event_broadcast_after = hook_api_event_broadcast_after,
@@ -754,6 +771,9 @@ static struct afb_hook_api_itf hook_api_itf = {
        .hook_api_class_provide = hook_api_class_provide,
        .hook_api_class_require = hook_api_class_require,
        .hook_api_delete_api = hook_api_delete_api,
+       .hook_api_on_event_handler_before = hook_api_on_event_handler_before,
+       .hook_api_on_event_handler_after = hook_api_on_event_handler_after,
+       .hook_api_settings = hook_api_settings,
 };
 
 /*******************************************************************************/
index df0efbc..d5d2aae 100644 (file)
@@ -52,6 +52,7 @@
 #include "afb-session.h"
 #include "verbose.h"
 #include "afb-common.h"
+#include "afb-export.h"
 #include "afb-monitor.h"
 #include "afb-hook.h"
 #include "afb-hook-flags.h"
@@ -604,6 +605,7 @@ static void start(int signum, void *arg)
 {
        const char *tracereq, *traceapi, *traceevt, *traceses, *tracesvc, *traceditf, *traceglob;
        const char *workdir, *rootdir, *token, *rootapi;
+       struct json_object *settings;
        struct afb_hsrv *hsrv;
        int max_session_count, session_timeout, api_timeout;
        int no_httpd, http_port;
@@ -617,6 +619,7 @@ static void start(int signum, void *arg)
                exit(1);
        }
 
+       settings = NULL;
        token = rootapi = tracesvc = traceditf = tracereq =
                traceapi = traceevt = traceses = traceglob = NULL;
        no_httpd = http_port = 0;
@@ -624,6 +627,7 @@ static void start(int signum, void *arg)
                        "ss ss s?s"
                        "si si si"
                        "s?b s?i s?s"
+                       "s?o"
 #if !defined(REMOVE_LEGACY_TRACE)
                        "s?s s?s"
 #endif
@@ -642,6 +646,7 @@ static void start(int signum, void *arg)
                        "port", &http_port,
                        "rootapi", &rootapi,
 
+                       "set", &settings,
 #if !defined(REMOVE_LEGACY_TRACE)
                        "tracesvc", &tracesvc,
                        "traceditf", &traceditf,
@@ -669,6 +674,7 @@ static void start(int signum, void *arg)
        }
 
        /* configure the daemon */
+       afb_export_set_config(settings);
        if (afb_session_init(max_session_count, session_timeout, token)) {
                ERROR("initialisation of session manager failed");
                goto error;