#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 | |
AST_APP_OPTIONS (forkcdr_exec_options,{AST_APP_OPTION('a', OPT_SETANS), AST_APP_OPTION('A', OPT_ANSLOCK), AST_APP_OPTION('d', OPT_SETDISP), AST_APP_OPTION('D', OPT_RESETDEST), AST_APP_OPTION('e', OPT_ENDCDR), AST_APP_OPTION('R', OPT_NORESET), AST_APP_OPTION_ARG('s', OPT_VARSET, OPT_ARG_VARSET), AST_APP_OPTION('T', OPT_DONTOUCH), AST_APP_OPTION('v', OPT_KEEPVARS),}) | |
static void | ast_cdr_fork (struct ast_channel *chan, struct ast_flags optflags, char *set) |
AST_MODULE_INFO_STANDARD (ASTERISK_GPL_KEY,"Fork The CDR into 2 separate entities") | |
static int | forkcdr_exec (struct ast_channel *chan, void *data) |
static int | load_module (void) |
static int | unload_module (void) |
Variables | |
static char * | app = "ForkCDR" |
static char * | descrip |
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 };
AST_APP_OPTIONS | ( | forkcdr_exec_options | ) |
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_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 }
AST_MODULE_INFO_STANDARD | ( | ASTERISK_GPL_KEY | , | |
"Fork The CDR into 2 separate entities" | ||||
) |
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 }
char* app = "ForkCDR" [static] |
Definition at line 46 of file app_forkcdr.c.
char* descrip [static] |
Definition at line 49 of file app_forkcdr.c.
char* synopsis [static] |