#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include "asterisk.h"
#include "asterisk/channel.h"
#include "asterisk/cdr.h"
#include "asterisk/module.h"
#include "asterisk/config.h"
#include "asterisk/pbx.h"
#include "asterisk/logger.h"
#include "asterisk/utils.h"
Include dependency graph for cdr_custom.c:
Go to the source code of this file.
Defines | |
#define | CUSTOM_LOG_DIR "/cdr_custom" |
#define | DATE_FORMAT "%Y-%m-%d %T" |
Functions | |
AST_MUTEX_DEFINE_STATIC (lock) | |
static int | custom_log (struct ast_cdr *cdr) |
char * | description (void) |
Provides a description of the module. | |
char * | key () |
Returns the ASTERISK_GPL_KEY. | |
static int | load_config (int reload) |
int | load_module (void) |
Initialize the module. | |
int | reload (void) |
Reload stuff. | |
int | unload_module (void) |
Cleanup all module structures, sockets, etc. | |
int | usecount (void) |
Provides a usecount. | |
Variables | |
static char * | desc = "Customizable Comma Separated Values CDR Backend" |
static char | format [1024] = "" |
static char | master [AST_CONFIG_MAX_PATH] |
static FILE * | mf = NULL |
static char * | name = "cdr-custom" |
Definition in file cdr_custom.c.
#define CUSTOM_LOG_DIR "/cdr_custom" |
Definition at line 52 of file cdr_custom.c.
#define DATE_FORMAT "%Y-%m-%d %T" |
Definition at line 54 of file cdr_custom.c.
AST_MUTEX_DEFINE_STATIC | ( | lock | ) |
static int custom_log | ( | struct ast_cdr * | cdr | ) | [static] |
Definition at line 106 of file cdr_custom.c.
References ast_log(), ast_strlen_zero(), ast_channel::cdr, LOG_ERROR, and pbx_substitute_variables_helper().
Referenced by load_module().
00107 { 00108 /* Make sure we have a big enough buf */ 00109 char buf[2048]; 00110 struct ast_channel dummy; 00111 00112 /* Abort if no master file is specified */ 00113 if (ast_strlen_zero(master)) 00114 return 0; 00115 00116 memset(buf, 0 , sizeof(buf)); 00117 /* Quite possibly the first use of a static struct ast_channel, we need it so the var funcs will work */ 00118 memset(&dummy, 0, sizeof(dummy)); 00119 dummy.cdr = cdr; 00120 pbx_substitute_variables_helper(&dummy, format, buf, sizeof(buf) - 1); 00121 00122 /* because of the absolutely unconditional need for the 00123 highest reliability possible in writing billing records, 00124 we open write and close the log file each time */ 00125 mf = fopen(master, "a"); 00126 if (!mf) { 00127 ast_log(LOG_ERROR, "Unable to re-open master file %s : %s\n", master, strerror(errno)); 00128 } 00129 if (mf) { 00130 fputs(buf, mf); 00131 fflush(mf); /* be particularly anal here */ 00132 fclose(mf); 00133 mf = NULL; 00134 } 00135 return 0; 00136 }
char* description | ( | void | ) |
Provides a description of the module.
Definition at line 138 of file cdr_custom.c.
00139 { 00140 return desc; 00141 }
char* key | ( | void | ) |
Returns the ASTERISK_GPL_KEY.
This returns the ASTERISK_GPL_KEY, signifiying that you agree to the terms of the GPL stated in the ASTERISK_GPL_KEY. Your module will not load if it does not return the EXACT message:
char *key(void) { return ASTERISK_GPL_KEY; }
Definition at line 175 of file cdr_custom.c.
References ASTERISK_GPL_KEY.
00176 { 00177 return ASTERISK_GPL_KEY; 00178 }
static int load_config | ( | int | reload | ) | [static] |
Definition at line 67 of file cdr_custom.c.
References ast_config_AST_LOG_DIR, ast_config_destroy(), ast_config_load(), ast_log(), ast_mutex_lock(), ast_mutex_unlock(), ast_strlen_zero(), ast_variable_browse(), cfg, lock, LOG_NOTICE, LOG_WARNING, and var.
00068 { 00069 struct ast_config *cfg; 00070 struct ast_variable *var; 00071 int res = -1; 00072 00073 strcpy(format, ""); 00074 strcpy(master, ""); 00075 if((cfg = ast_config_load("cdr_custom.conf"))) { 00076 var = ast_variable_browse(cfg, "mappings"); 00077 while(var) { 00078 ast_mutex_lock(&lock); 00079 if (!ast_strlen_zero(var->name) && !ast_strlen_zero(var->value)) { 00080 if (strlen(var->value) > (sizeof(format) - 2)) 00081 ast_log(LOG_WARNING, "Format string too long, will be truncated, at line %d\n", var->lineno); 00082 strncpy(format, var->value, sizeof(format) - 2); 00083 strcat(format,"\n"); 00084 snprintf(master, sizeof(master),"%s/%s/%s", ast_config_AST_LOG_DIR, name, var->name); 00085 ast_mutex_unlock(&lock); 00086 } else 00087 ast_log(LOG_NOTICE, "Mapping must have both filename and format at line %d\n", var->lineno); 00088 if (var->next) 00089 ast_log(LOG_NOTICE, "Sorry, only one mapping is supported at this time, mapping '%s' will be ignored at line %d.\n", var->next->name, var->next->lineno); 00090 var = var->next; 00091 } 00092 ast_config_destroy(cfg); 00093 res = 0; 00094 } else { 00095 if (reload) 00096 ast_log(LOG_WARNING, "Failed to reload configuration file.\n"); 00097 else 00098 ast_log(LOG_WARNING, "Failed to load configuration file. Module not activated.\n"); 00099 } 00100 00101 return res; 00102 }
int load_module | ( | void | ) |
Initialize the module.
Initialize the Agents module. This function is being called by Asterisk when loading the module. Among other thing it registers applications, cli commands and reads the cofiguration file.
Definition at line 151 of file cdr_custom.c.
References ast_cdr_register(), ast_log(), custom_log(), load_config(), and LOG_ERROR.
00152 { 00153 int res = 0; 00154 00155 if (!load_config(0)) { 00156 res = ast_cdr_register(name, desc, custom_log); 00157 if (res) 00158 ast_log(LOG_ERROR, "Unable to register custom CDR handling\n"); 00159 if (mf) 00160 fclose(mf); 00161 } 00162 return res; 00163 }
int reload | ( | void | ) |
Reload stuff.
This function is where any reload routines take place. Re-read config files, change signalling, whatever is appropriate on a reload.
Definition at line 165 of file cdr_custom.c.
References load_config().
00166 { 00167 return load_config(1); 00168 }
int unload_module | ( | void | ) |
Cleanup all module structures, sockets, etc.
This is called at exit. Any registrations and memory allocations need to be unregistered and free'd here. Nothing else will do these for you (until exit).
Definition at line 143 of file cdr_custom.c.
References ast_cdr_unregister().
00144 { 00145 if (mf) 00146 fclose(mf); 00147 ast_cdr_unregister(name); 00148 return 0; 00149 }
int usecount | ( | void | ) |
Provides a usecount.
This function will be called by various parts of asterisk. Basically, all it has to do is to return a usecount when called. You will need to maintain your usecount within the module somewhere. The usecount should be how many channels provided by this module are in use.
Definition at line 170 of file cdr_custom.c.
char* desc = "Customizable Comma Separated Values CDR Backend" [static] |
Definition at line 58 of file cdr_custom.c.
char format[1024] = "" [static] |
Definition at line 65 of file cdr_custom.c.
char master[AST_CONFIG_MAX_PATH] [static] |
Definition at line 64 of file cdr_custom.c.
Referenced by __unload_module(), mutedlevel(), zt_bridge(), zt_link(), and zt_unlink().
FILE* mf = NULL [static] |
Definition at line 62 of file cdr_custom.c.
char* name = "cdr-custom" [static] |
Definition at line 60 of file cdr_custom.c.