#include "asterisk.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "asterisk/file.h"
#include "asterisk/logger.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/cdr.h"
#include "asterisk/app.h"
#include "asterisk/module.h"
Go to the source code of this file.
Enumerations | |
enum | { OPT_SETANS = (1 << 0), OPT_SETDISP = (1 << 1), OPT_RESETDEST = (1 << 2), OPT_ENDCDR = (1 << 3), OPT_NORESET = (1 << 4), OPT_KEEPVARS = (1 << 5), OPT_VARSET = (1 << 6), OPT_ANSLOCK = (1 << 7), OPT_DONTOUCH = (1 << 8) } |
enum | { OPT_ARG_VARSET = 0, OPT_ARG_ARRAY_SIZE } |
Functions | |
static void | __reg_module (void) |
static void | __unreg_module (void) |
static void | ast_cdr_fork (struct ast_channel *chan, struct ast_flags optflags, char *set) |
static int | forkcdr_exec (struct ast_channel *chan, void *data) |
static int | load_module (void) |
static int | unload_module (void) |
Variables | |
static struct ast_module_info | __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT | AST_MODFLAG_BUILDSUM, .description = "Fork The CDR into 2 separate entities" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "361d7bb937402d51e4658efb5b4d76e4" , .load = load_module, .unload = unload_module, } |
static char * | app = "ForkCDR" |
static const struct ast_module_info * | ast_module_info = &__mod_info |
static char * | descrip |
static struct ast_app_option | forkcdr_exec_options [128] = { [ 'a' ] = { .flag = OPT_SETANS }, [ 'A' ] = { .flag = OPT_ANSLOCK }, [ 'd' ] = { .flag = OPT_SETDISP }, [ 'D' ] = { .flag = OPT_RESETDEST }, [ 'e' ] = { .flag = OPT_ENDCDR }, [ 'R' ] = { .flag = OPT_NORESET }, [ 's' ] = { .flag = OPT_VARSET , .arg_index = OPT_ARG_VARSET + 1 }, [ 'T' ] = { .flag = OPT_DONTOUCH }, [ 'v' ] = { .flag = OPT_KEEPVARS },} |
static char * | synopsis |
Definition in file app_forkcdr.c.
anonymous enum |
OPT_SETANS | |
OPT_SETDISP | |
OPT_RESETDEST | |
OPT_ENDCDR | |
OPT_NORESET | |
OPT_KEEPVARS | |
OPT_VARSET | |
OPT_ANSLOCK | |
OPT_DONTOUCH |
Definition at line 132 of file app_forkcdr.c.
00132 { 00133 OPT_SETANS = (1 << 0), 00134 OPT_SETDISP = (1 << 1), 00135 OPT_RESETDEST = (1 << 2), 00136 OPT_ENDCDR = (1 << 3), 00137 OPT_NORESET = (1 << 4), 00138 OPT_KEEPVARS = (1 << 5), 00139 OPT_VARSET = (1 << 6), 00140 OPT_ANSLOCK = (1 << 7), 00141 OPT_DONTOUCH = (1 << 8), 00142 };
anonymous enum |
Definition at line 144 of file app_forkcdr.c.
00144 { 00145 OPT_ARG_VARSET = 0, 00146 /* note: this entry _MUST_ be the last one in the enum */ 00147 OPT_ARG_ARRAY_SIZE, 00148 };
static void __reg_module | ( | void | ) | [static] |
Definition at line 267 of file app_forkcdr.c.
static void __unreg_module | ( | void | ) | [static] |
Definition at line 267 of file app_forkcdr.c.
static void ast_cdr_fork | ( | struct ast_channel * | chan, | |
struct ast_flags | optflags, | |||
char * | set | |||
) | [static] |
Definition at line 162 of file app_forkcdr.c.
References ast_cdr_append(), ast_cdr_dup(), ast_cdr_end(), AST_CDR_FLAG_ANSLOCKED, AST_CDR_FLAG_CHILD, AST_CDR_FLAG_DONT_TOUCH, AST_CDR_FLAG_KEEP_VARS, AST_CDR_FLAG_LOCKED, ast_cdr_free_vars(), ast_cdr_reset(), ast_cdr_setvar(), ast_set_flag, ast_strdupa, ast_strlen_zero(), ast_test_flag, ast_tvzero(), ast_channel::cdr, ast_flags::flags, ast_cdr::next, OPT_ANSLOCK, OPT_DONTOUCH, OPT_ENDCDR, OPT_NORESET, OPT_RESETDEST, OPT_SETANS, and OPT_SETDISP.
00163 { 00164 struct ast_cdr *cdr; 00165 struct ast_cdr *newcdr; 00166 struct ast_flags flags = { AST_CDR_FLAG_KEEP_VARS }; 00167 00168 cdr = chan->cdr; 00169 00170 while (cdr->next) 00171 cdr = cdr->next; 00172 00173 if (!(newcdr = ast_cdr_dup(cdr))) 00174 return; 00175 00176 ast_cdr_append(cdr, newcdr); 00177 00178 if (!ast_test_flag(&optflags, OPT_NORESET)) 00179 ast_cdr_reset(newcdr, &flags); 00180 00181 if (!ast_test_flag(cdr, AST_CDR_FLAG_KEEP_VARS)) 00182 ast_cdr_free_vars(cdr, 0); 00183 00184 if (!ast_strlen_zero(set)) { 00185 char *varname = ast_strdupa(set), *varval; 00186 varval = strchr(varname,'='); 00187 if (varval) { 00188 *varval = 0; 00189 varval++; 00190 ast_cdr_setvar(cdr, varname, varval, 0); 00191 } 00192 } 00193 00194 if (ast_test_flag(&optflags, OPT_SETANS) && !ast_tvzero(cdr->answer)) 00195 newcdr->answer = newcdr->start; 00196 00197 if (ast_test_flag(&optflags, OPT_SETDISP)) 00198 newcdr->disposition = cdr->disposition; 00199 00200 if (ast_test_flag(&optflags, OPT_RESETDEST)) 00201 newcdr->dstchannel[0] = 0; 00202 00203 if (ast_test_flag(&optflags, OPT_ENDCDR)) 00204 ast_cdr_end(cdr); 00205 00206 if (ast_test_flag(&optflags, OPT_ANSLOCK)) 00207 ast_set_flag(cdr, AST_CDR_FLAG_ANSLOCKED); 00208 00209 if (ast_test_flag(&optflags, OPT_DONTOUCH)) 00210 ast_set_flag(cdr, AST_CDR_FLAG_DONT_TOUCH); 00211 00212 ast_set_flag(cdr, AST_CDR_FLAG_CHILD | AST_CDR_FLAG_LOCKED); 00213 }
static int forkcdr_exec | ( | struct ast_channel * | chan, | |
void * | data | |||
) | [static] |
Definition at line 215 of file app_forkcdr.c.
References AST_APP_ARG, AST_DECLARE_APP_ARGS, ast_log(), ast_channel::cdr, ast_flags::flags, LOG_WARNING, and OPT_ARG_ARRAY_SIZE.
Referenced by load_module().
00216 { 00217 int res = 0; 00218 struct ast_module_user *u; 00219 char *argcopy = NULL; 00220 struct ast_flags flags = {0}; 00221 char *opts[OPT_ARG_ARRAY_SIZE]; 00222 AST_DECLARE_APP_ARGS(arglist, 00223 AST_APP_ARG(options); 00224 ); 00225 00226 if (!chan->cdr) { 00227 ast_log(LOG_WARNING, "Channel does not have a CDR\n"); 00228 return 0; 00229 } 00230 00231 u = ast_module_user_add(chan); 00232 00233 argcopy = ast_strdupa(data); 00234 00235 AST_STANDARD_APP_ARGS(arglist, argcopy); 00236 00237 opts[OPT_ARG_VARSET] = 0; 00238 00239 if (!ast_strlen_zero(arglist.options)) 00240 ast_app_parse_options(forkcdr_exec_options, &flags, opts, arglist.options); 00241 00242 if (!ast_strlen_zero(data)) 00243 ast_set2_flag(chan->cdr, ast_test_flag(&flags, OPT_KEEPVARS), AST_CDR_FLAG_KEEP_VARS); 00244 00245 ast_cdr_fork(chan, flags, opts[OPT_ARG_VARSET]); 00246 00247 ast_module_user_remove(u); 00248 return res; 00249 }
static int load_module | ( | void | ) | [static] |
Definition at line 262 of file app_forkcdr.c.
References ast_register_application(), and forkcdr_exec().
00263 { 00264 return ast_register_application(app, forkcdr_exec, synopsis, descrip); 00265 }
static int unload_module | ( | void | ) | [static] |
Definition at line 251 of file app_forkcdr.c.
References ast_module_user_hangup_all, and ast_unregister_application().
00252 { 00253 int res; 00254 00255 res = ast_unregister_application(app); 00256 00257 ast_module_user_hangup_all(); 00258 00259 return res; 00260 }
struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT | AST_MODFLAG_BUILDSUM, .description = "Fork The CDR into 2 separate entities" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "361d7bb937402d51e4658efb5b4d76e4" , .load = load_module, .unload = unload_module, } [static] |
Definition at line 267 of file app_forkcdr.c.
char* app = "ForkCDR" [static] |
Definition at line 46 of file app_forkcdr.c.
const struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 267 of file app_forkcdr.c.
char* descrip [static] |
Definition at line 49 of file app_forkcdr.c.
struct ast_app_option forkcdr_exec_options[128] = { [ 'a' ] = { .flag = OPT_SETANS }, [ 'A' ] = { .flag = OPT_ANSLOCK }, [ 'd' ] = { .flag = OPT_SETDISP }, [ 'D' ] = { .flag = OPT_RESETDEST }, [ 'e' ] = { .flag = OPT_ENDCDR }, [ 'R' ] = { .flag = OPT_NORESET }, [ 's' ] = { .flag = OPT_VARSET , .arg_index = OPT_ARG_VARSET + 1 }, [ 'T' ] = { .flag = OPT_DONTOUCH }, [ 'v' ] = { .flag = OPT_KEEPVARS },} [static] |
Definition at line 160 of file app_forkcdr.c.
char* synopsis [static] |