From d4a0132415ea461501255906b7455279ac6b71f4 Mon Sep 17 00:00:00 2001
From: Anthony Minessale <anthm@freeswitch.org>
Date: Thu, 16 Sep 2010 18:11:55 -0500
Subject: [PATCH] reverse the linked list in ivr menus to support accidental
 feature of multiple entries for the same keys

---
 src/switch_ivr_menu.c | 22 ++++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/src/switch_ivr_menu.c b/src/switch_ivr_menu.c
index 4883326e4f..255ab61c76 100644
--- a/src/switch_ivr_menu.c
+++ b/src/switch_ivr_menu.c
@@ -214,12 +214,11 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_menu_init(switch_ivr_menu_t ** new_me
 
 SWITCH_DECLARE(switch_status_t) switch_ivr_menu_bind_action(switch_ivr_menu_t *menu, switch_ivr_action_t ivr_action, const char *arg, const char *bind)
 {
-	switch_ivr_menu_action_t *action;
+	switch_ivr_menu_action_t *action, *ap;
 	uint32_t len;
 
 	if ((action = switch_core_alloc(menu->pool, sizeof(*action)))) {
 		action->bind = switch_core_strdup(menu->pool, bind);
-		action->next = menu->actions;
 		action->arg = switch_core_strdup(menu->pool, arg);
 		if (*action->bind == '/') {
 			action->re = 1;
@@ -230,7 +229,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_menu_bind_action(switch_ivr_menu_t *m
 			}
 		}
 		action->ivr_action = ivr_action;
+
+		if (menu->actions) {
+			for(ap = menu->actions; ap && ap->next; ap = ap->next);
+			ap->next = action;
+		} else {
 		menu->actions = action;
+		}
+
 		return SWITCH_STATUS_SUCCESS;
 	}
 
@@ -240,13 +246,13 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_menu_bind_action(switch_ivr_menu_t *m
 SWITCH_DECLARE(switch_status_t) switch_ivr_menu_bind_function(switch_ivr_menu_t *menu,
 															  switch_ivr_menu_action_function_t *function, const char *arg, const char *bind)
 {
-	switch_ivr_menu_action_t *action;
+	switch_ivr_menu_action_t *action, *ap;
 	uint32_t len;
 
 	if ((action = switch_core_alloc(menu->pool, sizeof(*action)))) {
 		action->bind = switch_core_strdup(menu->pool, bind);
-		action->next = menu->actions;
 		action->arg = switch_core_strdup(menu->pool, arg);
+
 		if (*action->bind == '/') {
 			action->re = 1;
 		} else {
@@ -255,8 +261,16 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_menu_bind_function(switch_ivr_menu_t
 				menu->inlen = len;
 			}
 		}
+
 		action->function = function;
+		
+		if (menu->actions) {
+			for(ap = menu->actions; ap && ap->next; ap = ap->next);
+			ap->next = action;
+		} else {
 		menu->actions = action;
+		}
+
 		return SWITCH_STATUS_SUCCESS;
 	}