From 08b23695b414041dd8da6b9cb84aefcc9adeb89c Mon Sep 17 00:00:00 2001
From: Joshua Colp <jcolp@digium.com>
Date: Thu, 17 Aug 2006 16:29:44 +0000
Subject: [PATCH] Add 'l' option to CDR dialplan function which will cause it
 to pass the last CDR record to getvar instead of the first. (issue #7689
 reported by voipgate)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@40226 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 funcs/func_cdr.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/funcs/func_cdr.c b/funcs/func_cdr.c
index 96a8f7f17f..f3606662ba 100644
--- a/funcs/func_cdr.c
+++ b/funcs/func_cdr.c
@@ -42,9 +42,11 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 enum {
 	OPT_RECURSIVE = (1 << 0),
 	OPT_UNPARSED = (1 << 1),
+	OPT_LAST = (1 << 2),
 } cdr_option_flags;
 
 AST_APP_OPTIONS(cdr_func_options, {
+	AST_APP_OPTION('l', OPT_LAST),
 	AST_APP_OPTION('r', OPT_RECURSIVE),
 	AST_APP_OPTION('u', OPT_UNPARSED),
 });
@@ -54,6 +56,7 @@ static int cdr_read(struct ast_channel *chan, char *cmd, char *parse,
 {
 	char *ret;
 	struct ast_flags flags = { 0 };
+	struct ast_cdr *cdr = chan->cdr;
 	AST_DECLARE_APP_ARGS(args,
 			     AST_APP_ARG(variable);
 			     AST_APP_ARG(options);
@@ -62,7 +65,7 @@ static int cdr_read(struct ast_channel *chan, char *cmd, char *parse,
 	if (ast_strlen_zero(parse))
 		return -1;
 
-	if (!chan->cdr)
+	if (!cdr)
 		return -1;
 
 	AST_STANDARD_APP_ARGS(args, parse);
@@ -70,7 +73,11 @@ static int cdr_read(struct ast_channel *chan, char *cmd, char *parse,
 	if (!ast_strlen_zero(args.options))
 		ast_app_parse_options(cdr_func_options, &flags, NULL, args.options);
 
-	ast_cdr_getvar(chan->cdr, args.variable, &ret, buf, len,
+	if (ast_test_flag(&flags, OPT_LAST))
+		while (cdr->next)
+			cdr = cdr->next;
+
+	ast_cdr_getvar(cdr, args.variable, &ret, buf, len,
 		       ast_test_flag(&flags, OPT_RECURSIVE),
 			   ast_test_flag(&flags, OPT_UNPARSED));
 
-- 
GitLab