+ /* 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)
+{
+ int ind;
+ struct option *options;
+
+ /* create GNU getopt options from optdefs */
+ options = malloc((sizeof optdefs / sizeof * optdefs) * sizeof * options);
+ for (ind = 0; optdefs[ind].name; ind++) {
+ options[ind].name = optdefs[ind].name;
+ options[ind].has_arg = optdefs[ind].has_arg;
+ options[ind].flag = NULL;
+ options[ind].val = optdefs[ind].id;
+ }
+ memset(&options[ind], 0, sizeof options[ind]);
+
+ /* parse the arguments */
+ parse_arguments_inner(argc, argv, config, options);
+
+ /* release the memory of options */
+ free(options);
+}
+
+static void fulfill_config(struct json_object *config)
+{
+ int i;
+
+ for (i = 0 ; i < sizeof default_optint_values / sizeof * default_optint_values ; i++)
+ if (!config_has(config, default_optint_values[i].optid))
+ config_set_int(config, default_optint_values[i].optid, default_optint_values[i].valdef);
+
+ for (i = 0 ; i < sizeof default_optstr_values / sizeof * default_optstr_values ; i++)
+ if (!config_has(config, default_optstr_values[i].optid))
+ config_set_str(config, default_optstr_values[i].optid, default_optstr_values[i].valdef);
+
+ // default AUTH_TOKEN
+ if (config_has_bool(config, SET_RANDOM_TOKEN))
+ config_del(config, SET_TOKEN);
+
+ if (!config_has(config, ADD_LDPATH) && !config_has(config, ADD_WEAK_LDPATH) && !config_has_bool(config, SET_NO_LDPATH))
+ config_add_str(config, ADD_LDPATH, BINDING_INSTALL_DIR);
+
+#if defined(WITH_MONITORING_OPTION)
+ if (config_has_bool(config, SET_MONITORING) && !config_has_str(config, ADD_ALIAS, MONITORING_ALIAS))
+ config_add_str(config, ADD_ALIAS, MONITORING_ALIAS);
+#endif
+
+#if !defined(REMOVE_LEGACY_TRACE) && 0
+ config->traceapi |= config->traceditf | config->tracesvc;
+#endif
+}
+
+void afb_config_dump(struct json_object *config)
+{
+ dump(config, stderr, "--", "CONFIG");
+}
+
+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)
+ func(config, optid, value);
+}
+
+static void on_environment_enum(struct json_object *config, int optid, const char *name, int (*func)(const char*))
+{
+ char *value = getenv(name);
+
+ if (value) {
+ if (func(value) == -1)
+ WARNING("Unknown value %s for environment variable %s, ignored", value, name);
+ else
+ config_set_str(config, optid, value);
+ }
+}
+
+static void on_environment_bool(struct json_object *config, int optid, const char *name)
+{
+ char *value = getenv(name);
+ int asbool;
+
+ if (value) {
+ asbool = string_to_bool(value);
+ if (asbool < 0)
+ WARNING("Unknown value %s for environment variable %s, ignored", value, name);
+ else
+ config_set_bool(config, optid, asbool);
+ }
+}