Module: kamailio
Branch: master
Commit: 89334293299f817d4ac2774ae60611839a031c73
URL:
https://github.com/kamailio/kamailio/commit/89334293299f817d4ac2774ae606118…
Author: Huseyin Dikme <hueseyin.dikme(a)1und1.de>
Committer: Huseyin Dikme <hueseyin.dikme(a)1und1.de>
Date: 2017-07-04T14:40:12+02:00
core: cfg_get_default_value_by_name function has been implemented
- As cfg_get_by_name function uses handle to reach variable values,
this function will use instead orig_handle in order to reach
the initial values when the config group was registered. Read-only
variables will not be returned since cfg_reset function uses this function
in order to set back the default values, and this cannot be implemented on read-only
variables.
---
Modified: src/core/cfg/cfg_ctx.c
Modified: src/core/cfg/cfg_ctx.h
---
Diff:
https://github.com/kamailio/kamailio/commit/89334293299f817d4ac2774ae606118…
Patch:
https://github.com/kamailio/kamailio/commit/89334293299f817d4ac2774ae606118…
---
diff --git a/src/core/cfg/cfg_ctx.c b/src/core/cfg/cfg_ctx.c
index 87ccda81c4..4c07996950 100644
--- a/src/core/cfg/cfg_ctx.c
+++ b/src/core/cfg/cfg_ctx.c
@@ -1359,6 +1359,74 @@ int cfg_get_by_name(cfg_ctx_t *ctx, str *group_name, unsigned int
*group_id, str
return 0;
}
+/* retrieves the default value of a variable
+ * Return value:
+ * 0 - success
+ * -1 - error
+ * 1 - variable exists, but it is not readable
+ */
+int cfg_get_default_value_by_name(cfg_ctx_t *ctx, str *group_name, unsigned int
*group_id, str *var_name,
+ void **val, unsigned int *val_type)
+{
+ cfg_group_t *group;
+ cfg_mapping_t *var;
+ void *p;
+ static str s; /* we need the value even
+ after the function returns */
+ cfg_group_inst_t *group_inst;
+
+ /* verify the context even if we do not need it now
+ to make sure that a cfg driver has called the function
+ (very very weak security) */
+ if (!ctx) {
+ LOG(L_ERR, "ERROR: cfg_get_by_name(): context is undefined\n");
+ return -1;
+ }
+
+ /* look-up the group and the variable */
+ if (cfg_lookup_var(group_name, var_name, &group, &var))
+ return -1;
+ else
+ {
+ if(var->def->type & CFG_READONLY) /* if variables exist then prevents
resetting the read-only ones */
+ return -1;
+ }
+
+ if (var->def->on_change_cb) {
+ /* The variable cannot be retrieved, because the fixup
+ function may have changed it, and it is better to return
+ an error than an incorrect value */
+ return 1;
+ }
+
+ /* use the module's orig_handle to access the default registered value of the
variable for any group*/
+ p = (group->orig_handle) + var->offset;
+
+ switch (CFG_VAR_TYPE(var)) {
+ case CFG_VAR_INT:
+ *val = (void *)(long)*(int *)p;
+ break;
+
+ case CFG_VAR_STRING:
+ *val = (void *)*(char **)p;
+ break;
+
+ case CFG_VAR_STR:
+ memcpy(&s, p, sizeof(str));
+ *val = (void *)&s;
+ break;
+
+ case CFG_VAR_POINTER:
+ *val = *(void **)p;
+ break;
+
+ }
+ *val_type = CFG_VAR_TYPE(var);
+
+ return 0;
+}
+
+
/* returns the description of a variable */
int cfg_help(cfg_ctx_t *ctx, str *group_name, str *var_name,
char **ch, unsigned int *input_type)
diff --git a/src/core/cfg/cfg_ctx.h b/src/core/cfg/cfg_ctx.h
index 9401daed77..2ecae7deaf 100644
--- a/src/core/cfg/cfg_ctx.h
+++ b/src/core/cfg/cfg_ctx.h
@@ -119,6 +119,9 @@ int cfg_rollback(cfg_ctx_t *ctx);
int cfg_get_by_name(cfg_ctx_t *ctx, str *group_name, unsigned int *group_id, str
*var_name,
void **val, unsigned int *val_type);
+int cfg_get_default_value_by_name(cfg_ctx_t *ctx, str *group_name, unsigned int
*group_id, str *var_name,
+ void **val, unsigned int *val_type);
+
/*! \brief returns the description of a variable */
int cfg_help(cfg_ctx_t *ctx, str *group_name, str *var_name,
char **ch, unsigned int *input_type);