chan_sip: Fix order of variables specified in SIPNotify action

Prior to this patch, sequential variables would be ordered in reverse
from the order specified in the manager action.

Review: https://reviewboard.asterisk.org/r/3588/
........

Merged revisions 415359 from http://svn.asterisk.org/svn/asterisk/branches/1.8


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@415390 65c4cc65-6c06-0410-ace0-fbb531ad65f3
changes/61/61/1
Jonathan Rose 11 years ago
parent 4cc6c7683c
commit a92d272d2f

@ -14919,7 +14919,7 @@ static int transmit_notify_with_sipfrag(struct sip_pvt *p, int cseq, char *messa
static int manager_sipnotify(struct mansession *s, const struct message *m)
{
const char *channame = astman_get_header(m, "Channel");
struct ast_variable *vars = astman_get_variables(m);
struct ast_variable *vars = astman_get_variables_order(m, ORDER_NATURAL);
struct sip_pvt *p;
struct ast_variable *header, *var;

@ -473,6 +473,16 @@ int ast_realtime_enabled(void);
*/
struct ast_variable *ast_variables_dup(struct ast_variable *var);
/*!
* \brief Reverse a variable list
* \param var the linked list of variables to reverse
* \return The head of the reversed variable list
*
* \note The variable list var is not preserved in this function and should
* not be used after reversing it.
*/
struct ast_variable *ast_variables_reverse(struct ast_variable *var);
/*!
* \brief Free variable list
* \param var the linked list of variables to free

@ -257,9 +257,21 @@ int __ast_manager_event_multichan(int category, const char *event, int chancount
/*! \brief Get header from mananger transaction */
const char *astman_get_header(const struct message *m, char *var);
/*! \brief Get a linked list of the Variable: headers */
/*! \brief Get a linked list of the Variable: headers
*
* \note Order of variables is reversed from the order they are specified in
* the manager message
*/
struct ast_variable *astman_get_variables(const struct message *m);
enum variable_orders {
ORDER_NATURAL,
ORDER_REVERSE
};
/*! \brief Get a linked list of the Variable: headers with order specified */
struct ast_variable *astman_get_variables_order(const struct message *m, enum variable_orders order);
/*! \brief Send error in manager transaction */
void astman_send_error(struct mansession *s, const struct message *m, char *error);

@ -561,6 +561,30 @@ struct ast_variable *ast_variables_dup(struct ast_variable *var)
return cloned;
}
struct ast_variable *ast_variables_reverse(struct ast_variable *var)
{
struct ast_variable *var1, *var2;
var1 = var;
if (!var1 || !var1->next) {
return var1;
}
var2 = var1->next;
var1->next = NULL;
while (var2) {
struct ast_variable *next = var2->next;
var2->next = var1;
var1 = var2;
var2 = next;
}
return var1;
}
void ast_variables_destroy(struct ast_variable *v)
{
struct ast_variable *vn;

@ -2096,6 +2096,12 @@ static struct ast_variable *man_do_variable_value(struct ast_variable *head, con
}
struct ast_variable *astman_get_variables(const struct message *m)
{
return astman_get_variables_order(m, ORDER_REVERSE);
}
struct ast_variable *astman_get_variables_order(const struct message *m,
enum variable_orders order)
{
int varlen;
int x;
@ -2112,6 +2118,10 @@ struct ast_variable *astman_get_variables(const struct message *m)
head = man_do_variable_value(head, m->headers[x] + varlen);
}
if (order == ORDER_NATURAL) {
head = ast_variables_reverse(head);
}
return head;
}

Loading…
Cancel
Save