Files
asterisk/apps/app_forkcdr.c
T

100 lines
2.4 KiB
C
Raw Normal View History

2004-09-24 21:33:48 +00:00
/*
* Asterisk -- An open source telephony toolkit.
2004-09-24 21:33:48 +00:00
*
* Copyright (C) 1999 - 2005, Anthony Minessale anthmct@yahoo.com
2004-09-24 21:33:48 +00:00
* Development of this app Sponsered/Funded by TAAN Softworks Corp
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
*
2004-09-24 21:33:48 +00:00
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*/
/*! \file
*
* \brief Fork CDR application
2005-12-30 21:18:06 +00:00
*
* \author Anthony Minessale anthmct@yahoo.com
*
* \note Development of this app Sponsored/Funded by TAAN Softworks Corp
*
2005-11-06 15:09:47 +00:00
* \ingroup applications
2004-09-24 21:33:48 +00:00
*/
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/file.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/cdr.h"
#include "asterisk/module.h"
2004-09-24 21:33:48 +00:00
static char *app = "ForkCDR";
static char *synopsis =
2004-10-23 12:17:46 +00:00
"Forks the Call Data Record";
static char *descrip =
2005-02-23 22:48:47 +00:00
" ForkCDR([options]): Causes the Call Data Record to fork an additional\n"
"cdr record starting from the time of the fork call\n"
" Options:\n"
" v - If the option is passed all cdr variables will be passed along also.\n";
2004-09-24 21:33:48 +00:00
2005-02-23 22:48:47 +00:00
static void ast_cdr_fork(struct ast_channel *chan)
{
struct ast_cdr *cdr;
struct ast_cdr *newcdr;
struct ast_flags flags = { AST_CDR_FLAG_KEEP_VARS };
2005-11-16 18:21:10 +00:00
cdr = chan->cdr;
while (cdr->next)
cdr = cdr->next;
if (!(newcdr = ast_cdr_dup(cdr)))
return;
ast_cdr_append(cdr, newcdr);
ast_cdr_reset(newcdr, &flags);
if (!ast_test_flag(cdr, AST_CDR_FLAG_KEEP_VARS))
ast_cdr_free_vars(cdr, 0);
ast_set_flag(cdr, AST_CDR_FLAG_CHILD | AST_CDR_FLAG_LOCKED);
2004-09-24 21:33:48 +00:00
}
static int forkcdr_exec(struct ast_channel *chan, void *data)
{
2005-11-16 18:21:10 +00:00
int res = 0;
if (!chan->cdr) {
ast_log(LOG_WARNING, "Channel does not have a CDR\n");
return 0;
}
if (!ast_strlen_zero(data))
2005-11-16 18:21:10 +00:00
ast_set2_flag(chan->cdr, strchr(data, 'v'), AST_CDR_FLAG_KEEP_VARS);
2005-02-23 22:48:47 +00:00
2004-09-24 21:33:48 +00:00
ast_cdr_fork(chan);
return res;
}
static int unload_module(void)
2004-09-24 21:33:48 +00:00
{
return ast_unregister_application(app);
2004-09-24 21:33:48 +00:00
}
static int load_module(void)
2004-09-24 21:33:48 +00:00
{
2004-10-23 12:17:46 +00:00
return ast_register_application(app, forkcdr_exec, synopsis, descrip);
2004-09-24 21:33:48 +00:00
}
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Fork The CDR into 2 separate entities");