summaryrefslogtreecommitdiff
path: root/channels/iax2-parser.c
diff options
context:
space:
mode:
authorTilghman Lesher <tilghman@meg.abyt.es>2007-01-16 08:38:59 +0000
committerTilghman Lesher <tilghman@meg.abyt.es>2007-01-16 08:38:59 +0000
commit3d91c0a0c01474336aba0342a3d10c301f19d93f (patch)
treed59470d07f7dce94e52073d498c2569145c29fa8 /channels/iax2-parser.c
parentbf5c607c6992359b00892e46156c3ea57cdae54a (diff)
IAX2 remote variables - Bug 7619
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@51123 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels/iax2-parser.c')
-rw-r--r--channels/iax2-parser.c34
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);