mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	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 ........ Merged revisions 415390 from http://svn.asterisk.org/svn/asterisk/branches/11 ........ Merged revisions 415410 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@415411 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -15073,7 +15073,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; | ||||
| 
 | ||||
|   | ||||
| @@ -559,6 +559,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 | ||||
|   | ||||
| @@ -260,9 +260,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); | ||||
|  | ||||
|   | ||||
| @@ -562,6 +562,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; | ||||
|   | ||||
| @@ -2389,6 +2389,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; | ||||
| @@ -2405,6 +2411,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; | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user