diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-01-16 08:38:59 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-01-16 08:38:59 +0000 |
commit | 4373b2af1324baceb226714e35640af07eedc5b9 (patch) | |
tree | d59470d07f7dce94e52073d498c2569145c29fa8 /channels/iax2-parser.c | |
parent | 7106c73282ff24a165af4076b81401abb2bb46a7 (diff) |
IAX2 remote variables - Bug 7619
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@51123 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/iax2-parser.c')
-rw-r--r-- | channels/iax2-parser.c | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/channels/iax2-parser.c b/channels/iax2-parser.c index 1a5f4d9f8..5e76dd850 100644 --- a/channels/iax2-parser.c +++ b/channels/iax2-parser.c @@ -39,6 +39,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/frame.h" #include "asterisk/utils.h" #include "asterisk/unaligned.h" +#include "asterisk/config.h" #include "asterisk/lock.h" #include "asterisk/threadstorage.h" @@ -262,6 +263,7 @@ static struct iax2_ie { { IAX_IE_RR_DELAY, "RR_DELAY", dump_short }, { IAX_IE_RR_DROPPED, "RR_DROPPED", dump_int }, { IAX_IE_RR_OOO, "RR_OUTOFORDER", dump_int }, + { IAX_IE_VARIABLE, "VARIABLE", dump_string }, }; static struct iax2_ie prov_ies[] = { @@ -613,7 +615,8 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen) /* Parse data into information elements */ int len; int ie; - char tmp[256]; + char tmp[256], *tmp2; + struct ast_variable *var, *var2, *prev; memset(ies, 0, (int)sizeof(struct iax_ies)); ies->msgcount = -1; ies->firmwarever = -1; @@ -898,6 +901,35 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen) ies->rr_ooo = ntohl(get_unaligned_uint32(data + 2)); } break; + case IAX_IE_VARIABLE: + ast_copy_string(tmp, (char *)data + 2, len + 1); + tmp2 = strchr(tmp, '='); + if (tmp2) + *tmp2++ = '\0'; + else + tmp2 = ""; + /* Existing variable or new variable? */ + for (var2 = ies->vars, prev = NULL; var2; prev = var2, var2 = var2->next) { + if (strcmp(tmp, var2->name) == 0) { + int len = strlen(var2->value) + strlen(tmp2) + 1; + char *tmp3 = alloca(len); + snprintf(tmp3, len, "%s%s", var2->value, tmp2); + var = ast_variable_new(tmp, tmp3); + var->next = var2->next; + if (prev) + prev->next = var; + else + ies->vars = var; + free(var2); + break; + } + } + if (!var2) { + var = ast_variable_new(tmp, tmp2); + var->next = ies->vars; + ies->vars = var; + } + break; default: snprintf(tmp, (int)sizeof(tmp), "Ignoring unknown information element '%s' (%d) of length %d\n", iax_ie2str(ie), ie, len); outputf(tmp); |