Module: kamailio Branch: master Commit: 89334293299f817d4ac2774ae60611839a031c73 URL: https://github.com/kamailio/kamailio/commit/89334293299f817d4ac2774ae6061183...
Author: Huseyin Dikme hueseyin.dikme@1und1.de Committer: Huseyin Dikme hueseyin.dikme@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/89334293299f817d4ac2774ae6061183... Patch: https://github.com/kamailio/kamailio/commit/89334293299f817d4ac2774ae6061183...
---
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);