summaryrefslogtreecommitdiff
path: root/channels/chan_iax2.c
diff options
context:
space:
mode:
authorMark Spencer <markster@digium.com>2004-11-17 03:10:38 +0000
committerMark Spencer <markster@digium.com>2004-11-17 03:10:38 +0000
commitee47520f28311c6d7e164c52e07035c1a459ef32 (patch)
tree5f09de0c63c3e5dfb630ede8e072960d03174ade /channels/chan_iax2.c
parent13814b20a1424b4954de7ec42eb9efd8eb67f06a (diff)
Merge Tony's uservars (bug #2882)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4267 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels/chan_iax2.c')
-rwxr-xr-xchannels/chan_iax2.c41
1 files changed, 39 insertions, 2 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 747e7328e..1b49dcce3 100755
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -15,6 +15,7 @@
#include <asterisk/frame.h>
#include <asterisk/channel.h>
#include <asterisk/channel_pvt.h>
+#include <asterisk/config_pvt.h>
#include <asterisk/logger.h>
#include <asterisk/module.h>
#include <asterisk/pbx.h>
@@ -207,6 +208,7 @@ struct iax2_user {
struct iax2_user *next;
int notransfer;
int usejitterbuf;
+ struct ast_variable *vars;
};
struct iax2_peer {
@@ -479,6 +481,7 @@ struct chan_iax2_pvt {
struct iax2_dpcache *dpentries;
int notransfer; /* do we want native bridging */
int usejitterbuf; /* use jitter buffer on this channel? */
+ struct ast_variable *vars;
};
static struct ast_iax2_queue {
@@ -1417,8 +1420,13 @@ retry:
if (pvt->reg) {
pvt->reg->callno = 0;
}
- if (!owner)
+ if (!owner) {
+ if (pvt->vars) {
+ ast_destroy_realtime(pvt->vars);
+ pvt->vars = NULL;
+ }
free(pvt);
+ }
}
if (owner) {
ast_mutex_unlock(&owner->lock);
@@ -2672,6 +2680,8 @@ static struct ast_channel *ast_iax2_new(int callno, int state, int capability)
{
struct ast_channel *tmp;
struct chan_iax2_pvt *i;
+ struct ast_variable *v = NULL;
+
/* Don't hold call lock */
ast_mutex_unlock(&iaxsl[callno]);
tmp = ast_channel_alloc(1);
@@ -2737,6 +2747,9 @@ static struct ast_channel *ast_iax2_new(int callno, int state, int capability)
tmp = NULL;
}
}
+ for (v = i->vars ; v ; v = v->next)
+ pbx_builtin_setvar_helper(tmp,v->name,v->value);
+
}
return tmp;
}
@@ -3574,6 +3587,7 @@ static int check_access(int callno, struct sockaddr_in *sin, struct iax_ies *ies
int bestscore = 0;
int gotcapability=0;
char iabuf[INET_ADDRSTRLEN];
+ struct ast_variable *v = NULL, *tmpvar = NULL;
if (!iaxs[callno])
return res;
@@ -3676,7 +3690,14 @@ static int check_access(int callno, struct sockaddr_in *sin, struct iax_ies *ies
}
if (user) {
/* We found our match (use the first) */
-
+ /* copy vars */
+ for (v = user->vars ; v ; v = v->next) {
+ if((tmpvar = ast_new_variable(v->name, v->value))) {
+ tmpvar->next = iaxs[callno]->vars;
+ iaxs[callno]->vars = tmpvar;
+ }
+ }
+
/* Store the requested username if not specified */
if (ast_strlen_zero(iaxs[callno]->username))
strncpy(iaxs[callno]->username, user->name, sizeof(iaxs[callno]->username)-1);
@@ -6573,6 +6594,8 @@ static struct iax2_user *build_user(const char *name, struct ast_variable *v, in
struct iax2_context *oldcon = NULL;
int format;
int found;
+ char *varname = NULL, *varval = NULL;
+ struct ast_variable *tmpvar = NULL;
prev = NULL;
ast_mutex_lock(&userl.lock);
@@ -6626,6 +6649,16 @@ static struct iax2_user *build_user(const char *name, struct ast_variable *v, in
} else if (!strcasecmp(v->name, "permit") ||
!strcasecmp(v->name, "deny")) {
user->ha = ast_append_ha(v->name, v->value, user->ha);
+ } else if (!strcasecmp(v->name, "setvar")) {
+ varname = ast_strdupa(v->value);
+ if (varname && (varval = strchr(varname,'='))) {
+ *varval = '\0';
+ varval++;
+ if((tmpvar = ast_new_variable(varname, varval))) {
+ tmpvar->next = user->vars;
+ user->vars = tmpvar;
+ }
+ }
} else if (!strcasecmp(v->name, "allow")) {
format = ast_getformatbyname(v->value);
if (format < 1)
@@ -6741,6 +6774,10 @@ static void destroy_user(struct iax2_user *user)
{
ast_free_ha(user->ha);
free_context(user->contexts);
+ if(user->vars) {
+ ast_destroy_realtime(user->vars);
+ user->vars = NULL;
+ }
free(user);
}