Merge "channels: Allow updating variable value" into 16

This commit is contained in:
George Joseph 2019-09-13 09:43:58 -05:00 committed by Gerrit Code Review
commit 913c8b48b7
6 changed files with 55 additions and 11 deletions

View File

@ -12777,8 +12777,10 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
struct ast_variable *v, *tmpvar;
for (v = conf->chan.vars ; v ; v = v->next) {
if ((tmpvar = ast_variable_new(v->name, v->value, v->file))) {
tmpvar->next = tmp->vars;
tmp->vars = tmpvar;
if (ast_variable_list_replace(&tmp->vars, tmpvar)) {
tmpvar->next = tmp->vars;
tmp->vars = tmpvar;
}
}
}
}

View File

@ -7916,9 +7916,11 @@ static int check_access(int callno, struct ast_sockaddr *addr, struct iax_ies *i
/* We found our match (use the first) */
/* copy vars */
for (v = user->vars ; v ; v = v->next) {
if((tmpvar = ast_variable_new(v->name, v->value, v->file))) {
tmpvar->next = iaxs[callno]->vars;
iaxs[callno]->vars = tmpvar;
if ((tmpvar = ast_variable_new(v->name, v->value, v->file))) {
if (ast_variable_list_replace(&iaxs[callno]->vars, tmpvar)) {
tmpvar->next = iaxs[callno]->vars;
iaxs[callno]->vars = tmpvar;
}
}
}
/* If a max AUTHREQ restriction is in place, activate it */
@ -13184,9 +13186,11 @@ static struct iax2_user *build_user(const char *name, struct ast_variable *v, st
if ((varval = strchr(varname, '='))) {
*varval = '\0';
varval++;
if((tmpvar = ast_variable_new(varname, varval, ""))) {
tmpvar->next = user->vars;
user->vars = tmpvar;
if ((tmpvar = ast_variable_new(varname, varval, ""))) {
if (ast_variable_list_replace(&user->vars, tmpvar)) {
tmpvar->next = user->vars;
user->vars = tmpvar;
}
}
}
} else if (!strcasecmp(v->name, "allow")) {

View File

@ -31370,8 +31370,10 @@ static struct ast_variable *add_var(const char *buf, struct ast_variable *list)
if ((varval = strchr(varname, '='))) {
*varval++ = '\0';
if ((tmpvar = ast_variable_new(varname, varval, ""))) {
tmpvar->next = list;
list = tmpvar;
if (ast_variable_list_replace(&list, tmpvar)) {
tmpvar->next = list;
list = tmpvar;
}
}
}
return list;

View File

@ -948,6 +948,24 @@ struct ast_variable *ast_variable_list_append_hint(struct ast_variable **head, s
struct ast_variable *new_var);
#define ast_variable_list_append(head, new_var) ast_variable_list_append_hint(head, NULL, new_var)
/*!
* \brief Replace a variable in the given list with a new value
* \since 13.30.0
*
* \param head A pointer to an ast_variable * of the existing variable list head. May NOT be NULL
* but the content may be to initialize a new list. If so, upon return, this parameter will be updated
* with a pointer to the new list head.
* \param replacement The variable that replaces another variable in the list with the
* same name.
*
* \retval 0 if a variable was replaced in the list
* \retval -1 if no replacement occured
*
* \note The variable name comparison is performed case-sensitively
* \note If a variable is replaced, its memory is freed.
*/
int ast_variable_list_replace(struct ast_variable **head, struct ast_variable *replacement);
/*!
* \brief Update variable value within a config
*

View File

@ -665,6 +665,22 @@ struct ast_variable *ast_variable_list_append_hint(struct ast_variable **head, s
return curr;
}
int ast_variable_list_replace(struct ast_variable **head, struct ast_variable *replacement)
{
struct ast_variable *v, **prev = head;
for (v = *head; v; prev = &v->next, v = v->next) {
if (!strcmp(v->name, replacement->name)) {
replacement->next = v->next;
*prev = replacement;
ast_free(v);
return 0;
}
}
return -1;
}
const char *ast_config_option(struct ast_config *cfg, const char *cat, const char *var)
{
const char *tmp;

View File

@ -1044,7 +1044,9 @@ static int set_var_handler(const struct aco_option *opt,
return -1;
}
ast_variable_list_append(&endpoint->channel_vars, new_var);
if (ast_variable_list_replace(&endpoint->channel_vars, new_var)) {
ast_variable_list_append(&endpoint->channel_vars, new_var);
}
return 0;
}