Skip to content
Snippets Groups Projects
app_forkcdr.c 2.68 KiB
Newer Older
  • Learn to ignore specific revisions
  • Anthony Minessale II's avatar
    Anthony Minessale II committed
    /*
    
     * Asterisk -- An open source telephony toolkit.
    
    Anthony Minessale II's avatar
    Anthony Minessale II committed
     *
    
     * Copyright (C) 1999 - 2005, Anthony Minessale anthmct@yahoo.com
    
    Anthony Minessale II's avatar
    Anthony Minessale II committed
     * 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.
     *
    
    Anthony Minessale II's avatar
    Anthony Minessale II committed
     * 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.
     */
    
    
     * \brief Fork CDR application
    
     *
     * \author Anthony Minessale anthmct@yahoo.com
     *
     * \note Development of this app Sponsered/Funded  by TAAN Softworks Corp
    
    Russell Bryant's avatar
    Russell Bryant committed
     * \ingroup applications
    
    #include <stdlib.h>
    
    #include <stdio.h>
    
    #include <string.h>
    
    #include <unistd.h>
    
    
    #include "asterisk.h"
    
    ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
    
    
    #include "asterisk/file.h"
    #include "asterisk/logger.h"
    #include "asterisk/channel.h"
    #include "asterisk/pbx.h"
    #include "asterisk/cdr.h"
    #include "asterisk/module.h"
    
    Anthony Minessale II's avatar
    Anthony Minessale II committed
    
    static char *app = "ForkCDR";
    static char *synopsis = 
    
    Mark Spencer's avatar
    Mark Spencer committed
    "Forks the Call Data Record";
    static char *descrip = 
    
    "  ForkCDR([options]):  Causes the Call Data Record to fork an additional\n"
    	"cdr record starting from the time of the fork call\n"
    "If the option 'v' is passed all cdr variables will be passed along also.\n"
    "";
    
    Anthony Minessale II's avatar
    Anthony Minessale II committed
    
    LOCAL_USER_DECL;
    
    
    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 };
    
    
    Kevin P. Fleming's avatar
    Kevin P. Fleming committed
    	cdr = chan->cdr;
    
    	while (cdr->next)
    		cdr = cdr->next;
    
    	if (!(newcdr = ast_cdr_dup(cdr)))
    		return;
    
    	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);
    
    Anthony Minessale II's avatar
    Anthony Minessale II committed
    }
    
    static int forkcdr_exec(struct ast_channel *chan, void *data)
    {
    
    Kevin P. Fleming's avatar
    Kevin P. Fleming committed
    	int res = 0;
    
    Anthony Minessale II's avatar
    Anthony Minessale II committed
    	struct localuser *u;
    
    Kevin P. Fleming's avatar
    Kevin P. Fleming committed
    
    	if (!chan->cdr) {
    		ast_log(LOG_WARNING, "Channel does not have a CDR\n");
    		return 0;
    	}
    
    
    Anthony Minessale II's avatar
    Anthony Minessale II committed
    	LOCAL_USER_ADD(u);
    
    Kevin P. Fleming's avatar
    Kevin P. Fleming committed
    
    
    	if (!ast_strlen_zero(data))
    
    Kevin P. Fleming's avatar
    Kevin P. Fleming committed
    		ast_set2_flag(chan->cdr, strchr(data, 'v'), AST_CDR_FLAG_KEEP_VARS);
    
    Anthony Minessale II's avatar
    Anthony Minessale II committed
    	ast_cdr_fork(chan);
    
    	LOCAL_USER_REMOVE(u);
    	return res;
    }
    
    
    static int unload_module(void *mod)
    
    Anthony Minessale II's avatar
    Anthony Minessale II committed
    {
    
    Anthony Minessale II's avatar
    Anthony Minessale II committed
    	STANDARD_HANGUP_LOCALUSERS;
    
    static int load_module(void *mod)
    
    Anthony Minessale II's avatar
    Anthony Minessale II committed
    {
    
    Mark Spencer's avatar
    Mark Spencer committed
    	return ast_register_application(app, forkcdr_exec, synopsis, descrip);
    
    static const char *description(void)
    
    Anthony Minessale II's avatar
    Anthony Minessale II committed
    {
    
    	return "Fork The CDR into 2 separate entities.";
    
    static const char *key(void)
    
    Anthony Minessale II's avatar
    Anthony Minessale II committed
    {
    	return ASTERISK_GPL_KEY;
    }