aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authoroej <oej@f38db490-d61c-443f-a65b-d21fe96a405b>2009-01-29 13:21:31 +0000
committeroej <oej@f38db490-d61c-443f-a65b-d21fe96a405b>2009-01-29 13:21:31 +0000
commit7ad1a935c89e6f9173866140f81b6f98c8c4c1d1 (patch)
tree6b8c5d709dac29067781e8d11c487a36e1490343 /channels
parent97b25e2c2f3e8f1247fda20817c340678c902074 (diff)
- Make sure we set setvar= variables on outbound calls too, not only inbound calls.
- Also, change a function in app.c to return a userful value instead of always returning 0. Patch by fnordian, changed by Corydon76 and myself. This does not close the bug report, as fnordian had an additional change we're still discussing. (related to issue #14059) Reported by: fnordian Patches: chan_sip_hfield.patch uploaded by fnordian (license 110) 20090116__bug14059.diff.txt uploaded by Corydon76 (license 14) Tested by: fnordian, Corydon76, oej git-svn-id: http://svn.digium.com/svn/asterisk/trunk@172268 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_sip.c46
1 files changed, 27 insertions, 19 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index bc6decfa5..2fbb77e65 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -2317,6 +2317,7 @@ static int expire_register(const void *data);
static void *do_monitor(void *data);
static int restart_monitor(void);
static void peer_mailboxes_to_str(struct ast_str **mailbox_str, struct sip_peer *peer);
+static struct ast_variable *copy_vars(struct ast_variable *src);
/* static int sip_addrcmp(char *name, struct sockaddr_in *sin); Support for peer matching */
static int sip_refer_allocate(struct sip_pvt *p);
static void ast_quiet_chan(struct ast_channel *chan);
@@ -2692,6 +2693,21 @@ static struct ast_rtp_protocol sip_rtp = {
.get_codec = sip_get_codec,
};
+/*!
+ * duplicate a list of channel variables, \return the copy.
+ */
+static struct ast_variable *copy_vars(struct ast_variable *src)
+{
+ struct ast_variable *res = NULL, *tmp, *v = NULL;
+
+ for (v = src ; v ; v = v->next) {
+ if ((tmp = ast_variable_new(v->name, v->value, v->file))) {
+ tmp->next = res;
+ res = tmp;
+ }
+ }
+ return res;
+}
/*! \brief SIP TCP connection handler */
static void *sip_tcp_worker_fn(void *data)
@@ -4650,6 +4666,7 @@ static void copy_socket_data(struct sip_socket *to_sock, const struct sip_socket
*/
static int create_addr_from_peer(struct sip_pvt *dialog, struct sip_peer *peer)
{
+
/* this checks that the dialog is contacting the peer on a valid
* transport type based on the peers transport configuration,
* otherwise, this function bails out */
@@ -4778,6 +4795,8 @@ static int create_addr_from_peer(struct sip_pvt *dialog, struct sip_peer *peer)
if (peer->call_limit)
ast_set_flag(&dialog->flags[0], SIP_CALL_LIMIT);
+ dialog->chanvars = copy_vars(peer->chanvars);
+
return 0;
}
@@ -6222,8 +6241,10 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, const char *tit
pbx_builtin_setvar_helper(tmp, "_T38CALL", "1");
/* Set channel variables for this call from configuration */
- for (v = i->chanvars ; v ; v = v->next)
- pbx_builtin_setvar_helper(tmp, v->name, v->value);
+ for (v = i->chanvars ; v ; v = v->next) {
+ char valuebuf[1024];
+ pbx_builtin_setvar_helper(tmp, v->name, ast_get_encoded_str(v->value, valuebuf, sizeof(valuebuf)));
+ }
if (state != AST_STATE_DOWN && ast_pbx_start(tmp)) {
ast_log(LOG_WARNING, "Unable to start PBX on %s\n", tmp->name);
@@ -12688,21 +12709,6 @@ static int get_rpid_num(const char *input, char *output, int maxlen)
return 0;
}
-/*!
- * duplicate a list of channel variables, \return the copy.
- */
-static struct ast_variable *copy_vars(struct ast_variable *src)
-{
- struct ast_variable *res = NULL, *tmp, *v = NULL;
-
- for (v = src ; v ; v = v->next) {
- if ((tmp = ast_variable_new(v->name, v->value, v->file))) {
- tmp->next = res;
- res = tmp;
- }
- }
- return res;
-}
/*! \brief helper function for check_{user|peer}_ok() */
static void replace_cid(struct sip_pvt *p, const char *rpid_num, const char *calleridname)
@@ -16109,9 +16115,11 @@ static int function_sippeer(struct ast_channel *chan, const char *cmd, char *dat
struct ast_variable *v;
chanvar = strsep(&chanvar, "]");
- for (v = peer->chanvars ; v ; v = v->next)
- if (!strcasecmp(v->name, chanvar))
+ for (v = peer->chanvars ; v ; v = v->next) {
+ if (!strcasecmp(v->name, chanvar)) {
ast_copy_string(buf, v->value, len);
+ }
+ }
} else if (!strncasecmp(colname, "codec[", 6)) {
char *codecnum;
int codec = 0;