From: Kevin Harwell Date: Fri, 21 Feb 2014 20:21:46 +0000 (+0000) Subject: app_forkcdr: ForkCDR v option does not keep CDR variables for subsequent records X-Git-Tag: 11.9.0-rc1~56 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e2dae45080876f53c5b8008eeba18c518bed2a5a;p=thirdparty%2Fasterisk.git app_forkcdr: ForkCDR v option does not keep CDR variables for subsequent records When the 'v' option is specified to ForkCDR application, AST_CDR_FLAG_KEEP_VARS flag is set only for the first CDR in the chain. So ForkCDR works fine with this option only once. After the second and further calls to ForkCDR, CDR variables get cleared on all CDRs besides the first one and moved to the newly forked CDR. It always sets the KEEP_VARS flag on the first CDR in the chain, instead of the most recent CDR which is used as a base to fork a new CDR. This patch sets KEEP_VARS flag on the most recent CDR on the stack (the CDR used for forking). (closes issue ASTERISK-23260) Reported by: zvision Patches: app_forkcdr.diff uploaded by zvision (license 5755) ........ Merged revisions 408747 from http://svn.asterisk.org/svn/asterisk/branches/1.8 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@408748 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/apps/app_forkcdr.c b/apps/app_forkcdr.c index 354792fb9a..558b1146e7 100644 --- a/apps/app_forkcdr.c +++ b/apps/app_forkcdr.c @@ -239,13 +239,14 @@ static int forkcdr_exec(struct ast_channel *chan, const char *data) { int res = 0; char *argcopy = NULL; + struct ast_cdr *cdr; struct ast_flags flags = {0}; char *opts[OPT_ARG_ARRAY_SIZE]; AST_DECLARE_APP_ARGS(arglist, AST_APP_ARG(options); ); - if (!ast_channel_cdr(chan)) { + if (!(cdr = ast_channel_cdr(chan))) { ast_log(LOG_WARNING, "Channel does not have a CDR\n"); return 0; } @@ -261,9 +262,12 @@ static int forkcdr_exec(struct ast_channel *chan, const char *data) if (!ast_strlen_zero(data)) { int keepvars = ast_test_flag(&flags, OPT_KEEPVARS) ? 1 : 0; - ast_set2_flag(ast_channel_cdr(chan), keepvars, AST_CDR_FLAG_KEEP_VARS); + while (cdr->next) { + cdr = cdr->next; + } + ast_set2_flag(cdr, keepvars, AST_CDR_FLAG_KEEP_VARS); } - + ast_cdr_fork(chan, flags, opts[OPT_ARG_VARSET]); return res;