Description: Fixes multiplie channel variables with the same name Author: Michael Goryainov Fix for chan_sip and chan_iax2 drivers. Also adds ability to print user variables in "iax2 show peer " output. --- a/channels/chan_sip.c 2014-05-13 21:40:00.000000000 +0400 +++ b/channels/chan_sip.c 2014-05-30 19:20:42.084581700 +0400 @@ -30477,6 +30477,20 @@ if ((varval = strchr(varname, '='))) { *varval++ = '\0'; + struct ast_variable *prev = NULL; + for (tmpvar = list; tmpvar; prev = tmpvar,tmpvar = tmpvar->next){ + if(!strcmp(varname, tmpvar->name)) { + /* for duplicate entries use last in the list */ + if(prev == NULL){ + list = tmpvar->next; + }else{ + prev->next = tmpvar->next; + } + free(tmpvar); + break; + } + } + tmpvar = NULL; if ((tmpvar = ast_variable_new(varname, varval, ""))) { tmpvar->next = list; list = tmpvar; --- a/channels/chan_iax2.c 2014-05-10 02:28:40.000000000 +0400 +++ b/channels/chan_iax2.c 2014-06-06 12:51:44.790803834 +0400 @@ -540,6 +540,7 @@ struct ast_event_sub *mwi_event_sub; + struct ast_variable *vars; struct ast_acl_list *acl; enum calltoken_peer_enum calltoken_required; /*!< Is calltoken validation required or not, can be YES, NO, or AUTO */ }; @@ -3932,6 +3933,13 @@ ast_cli(a->fd, " Addr->IP : %s Port %d\n", peer_addr.sin_addr.s_addr ? ast_inet_ntoa(peer_addr.sin_addr) : "(Unspecified)", ntohs(peer_addr.sin_port)); ast_cli(a->fd, " Defaddr->IP : %s Port %d\n", ast_inet_ntoa(peer->defaddr.sin_addr), ntohs(peer->defaddr.sin_port)); ast_cli(a->fd, " Username : %s\n", peer->username); + if (peer->vars) { + ast_cli(a->fd, " Variables :\n"); + struct ast_variable *v; + for (v = peer->vars ; v ; v = v->next) + ast_cli(a->fd, " %s = %s\n", v->name, v->value); + } + ast_cli(a->fd, " Codecs : "); iax2_getformatname_multiple(codec_buf, sizeof(codec_buf) -1, peer->capability); ast_cli(a->fd, "%s\n", codec_buf); @@ -13031,6 +13039,29 @@ } else { ast_log(LOG_WARNING, "requirecalltoken must be set to a valid value. at line %d\n", v->lineno); } + } else if (!strcasecmp(v->name, "setvar")) { + char *varname = ast_strdupa(v->value); + char *varval; + if ((varval = strchr(varname, '='))) { + *varval++ = '\0'; + struct ast_variable *cur = NULL,*prev = NULL,*tmpvar = NULL; + for (cur = peer->vars; cur; prev = cur,cur = cur->next){ + if(!strcmp(varname, cur->name)) { + /* for duplicate entries use last in the user */ + if(prev == NULL) + peer->vars = cur->next; + else + prev->next = cur->next; + free(cur); + break; + } + } + if((tmpvar = ast_variable_new(varname, varval, ""))) { + tmpvar->next = peer->vars; + peer->vars = tmpvar; + } + } + } /* else if (strcasecmp(v->name,"type")) */ /* ast_log(LOG_WARNING, "Ignoring %s\n", v->name); */ v = v->next; @@ -13159,8 +13190,19 @@ } else if (!strcasecmp(v->name, "setvar")) { varname = ast_strdupa(v->value); if ((varval = strchr(varname, '='))) { - *varval = '\0'; - varval++; + *varval++ = '\0'; + struct ast_variable *cur = NULL,*prev = NULL; + for (cur = user->vars; cur; prev = cur,cur = cur->next){ + if(!strcmp(varname, cur->name)) { + /* for duplicate entries use last in the user */ + if(prev == NULL) + user->vars = cur->next; + else + prev->next = cur->next; + free(cur); + break; + } + } if((tmpvar = ast_variable_new(varname, varval, ""))) { tmpvar->next = user->vars; user->vars = tmpvar;