Help leanup (bug #2677)
[asterisk/asterisk.git] / apps / app_forkcdr.c
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * Fork CDR application
5  * Copyright Anthony Minessale anthmct@yahoo.com
6  * Development of this app Sponsered/Funded  by TAAN Softworks Corp
7  * 
8  * This program is free software, distributed under the terms of
9  * the GNU General Public License
10  */
11
12 #include <asterisk/file.h>
13 #include <asterisk/logger.h>
14 #include <asterisk/channel.h>
15 #include <asterisk/pbx.h>
16 #include <asterisk/cdr.h>
17 #include <asterisk/module.h>
18 #include <stdlib.h>
19 #include <unistd.h>
20 #include <string.h>
21 #include <pthread.h>
22
23 static char *tdesc = "Fork The CDR into 2 seperate entities.";
24 static char *app = "ForkCDR";
25 static char *synopsis = 
26 "Forks the Call Data Record";
27 static char *descrip = 
28 "  ForkCDR():  Causes the Call Data Record to fork an additional\n"
29         "cdr record starting from the time of the fork call\n";
30
31
32 STANDARD_LOCAL_USER;
33
34 LOCAL_USER_DECL;
35
36
37 static void ast_cdr_clone(struct ast_cdr *cdr) {
38         struct ast_cdr *newcdr = ast_cdr_alloc();
39         memcpy(newcdr,cdr,sizeof(struct ast_cdr));
40         ast_cdr_append(cdr,newcdr);
41         gettimeofday(&newcdr->start, NULL);
42         memset(&newcdr->answer, 0, sizeof(newcdr->answer));
43         ast_cdr_add_flag(cdr,AST_CDR_FLAG_CHILD|AST_CDR_FLAG_LOCKED);
44 }
45
46 static void ast_cdr_fork(struct ast_channel *chan) {
47         if(chan && chan->cdr) {
48                 ast_cdr_clone(chan->cdr);
49         }
50 }
51
52 static int forkcdr_exec(struct ast_channel *chan, void *data)
53 {
54         int res=0;
55         struct localuser *u;
56         LOCAL_USER_ADD(u);
57
58         ast_cdr_fork(chan);
59
60         LOCAL_USER_REMOVE(u);
61         return res;
62 }
63
64 int unload_module(void)
65 {
66         STANDARD_HANGUP_LOCALUSERS;
67         return ast_unregister_application(app);
68 }
69
70 int load_module(void)
71 {
72         return ast_register_application(app, forkcdr_exec, synopsis, descrip);
73 }
74
75 char *description(void)
76 {
77         return tdesc;
78 }
79
80 int usecount(void)
81 {
82         int res;
83         STANDARD_USECOUNT(res);
84         return res;
85 }
86
87 char *key()
88 {
89         return ASTERISK_GPL_KEY;
90 }