Thu Oct 11 06:42:55 2012

Asterisk developer's documentation


cdr_custom.c File Reference

Custom Comma Separated Value CDR records. More...

#include "asterisk.h"
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.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 "asterisk/lock.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

static void __reg_module (void)
static void __unreg_module (void)
static int custom_log (struct ast_cdr *cdr)
static int load_config (int reload)
static int load_module (void)
static int reload (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 = "Customizable Comma Separated Values CDR Backend" , .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 = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .reload = reload, }
static const struct
ast_module_info
ast_module_info = &__mod_info
static char format [1024] = ""
static ast_mutex_t lock = ((ast_mutex_t) PTHREAD_MUTEX_INITIALIZER )
static char master [PATH_MAX]
static ast_mutex_t mf_lock = ((ast_mutex_t) PTHREAD_MUTEX_INITIALIZER )
static char * name = "cdr-custom"


Detailed Description

Custom Comma Separated Value CDR records.

Author:
Mark Spencer <markster@digium.com>
Logs in LOG_DIR/cdr_custom

Definition in file cdr_custom.c.


Define Documentation

#define CUSTOM_LOG_DIR   "/cdr_custom"

Definition at line 55 of file cdr_custom.c.

#define DATE_FORMAT   "%Y-%m-%d %T"

Definition at line 57 of file cdr_custom.c.


Function Documentation

static void __reg_module ( void   )  [static]

Definition at line 173 of file cdr_custom.c.

static void __unreg_module ( void   )  [static]

Definition at line 173 of file cdr_custom.c.

static int custom_log ( struct ast_cdr cdr  )  [static]

Definition at line 108 of file cdr_custom.c.

References ast_log(), ast_mutex_lock(), ast_mutex_unlock(), ast_strlen_zero(), ast_channel::cdr, errno, LOG_ERROR, mf_lock, and pbx_substitute_variables_helper().

Referenced by load_module().

00109 {
00110    FILE *mf = NULL;
00111 
00112    /* Make sure we have a big enough buf */
00113    char buf[2048];
00114    struct ast_channel dummy;
00115 
00116    /* Abort if no master file is specified */
00117    if (ast_strlen_zero(master))
00118       return 0;
00119 
00120    memset(buf, 0 , sizeof(buf));
00121    /* Quite possibly the first use of a static struct ast_channel, we need it so the var funcs will work */
00122    memset(&dummy, 0, sizeof(dummy));
00123    dummy.cdr = cdr;
00124    pbx_substitute_variables_helper(&dummy, format, buf, sizeof(buf) - 1);
00125 
00126    /* because of the absolutely unconditional need for the
00127       highest reliability possible in writing billing records,
00128       we open write and close the log file each time */
00129    ast_mutex_lock(&mf_lock);
00130    mf = fopen(master, "a");
00131    if (mf) {
00132       fputs(buf, mf);
00133       fflush(mf); /* be particularly anal here */
00134       fclose(mf);
00135       mf = NULL;
00136       ast_mutex_unlock(&mf_lock);
00137    } else {
00138       ast_log(LOG_ERROR, "Unable to re-open master file %s : %s\n", master, strerror(errno));
00139       ast_mutex_unlock(&mf_lock);
00140    }
00141 
00142    return 0;
00143 }

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_copy_string(), ast_log(), ast_mutex_lock(), ast_mutex_unlock(), ast_strlen_zero(), ast_variable_browse(), ast_variable::lineno, lock, LOG_NOTICE, LOG_WARNING, ast_variable::name, ast_variable::next, ast_variable::value, 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    ast_mutex_lock(&lock);
00076    if((cfg = ast_config_load("cdr_custom.conf"))) {
00077       var = ast_variable_browse(cfg, "mappings");
00078       while(var) {
00079          if (!ast_strlen_zero(var->name) && !ast_strlen_zero(var->value)) {
00080             if (strlen(var->value) > (sizeof(format) - 1))
00081                ast_log(LOG_WARNING, "Format string too long, will be truncated, at line %d\n", var->lineno);
00082             ast_copy_string(format, var->value, sizeof(format) - 1);
00083             strcat(format,"\n");
00084             snprintf(master, sizeof(master),"%s/%s/%s", ast_config_AST_LOG_DIR, name, var->name);
00085             if (var->next) {
00086                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); 
00087                break;
00088             }
00089          } else
00090             ast_log(LOG_NOTICE, "Mapping must have both filename and format at line %d\n", var->lineno);
00091          var = var->next;
00092       }
00093       ast_config_destroy(cfg);
00094       res = 0;
00095    } else {
00096       if (reload)
00097          ast_log(LOG_WARNING, "Failed to reload configuration file.\n");
00098       else
00099          ast_log(LOG_WARNING, "Failed to load configuration file. Module not activated.\n");
00100    }
00101    ast_mutex_unlock(&lock);
00102    
00103    return res;
00104 }

static int load_module ( void   )  [static]

Definition at line 151 of file cdr_custom.c.

References ast_cdr_register(), ast_log(), AST_MODULE_LOAD_DECLINE, custom_log(), load_config(), and LOG_ERROR.

00152 {
00153    int res = 0;
00154 
00155    if (!load_config(0)) {
00156       res = ast_cdr_register(name, ast_module_info->description, custom_log);
00157       if (res)
00158          ast_log(LOG_ERROR, "Unable to register custom CDR handling\n");
00159       return res;
00160    } else 
00161       return AST_MODULE_LOAD_DECLINE;
00162 }

static int reload ( void   )  [static]

Definition at line 164 of file cdr_custom.c.

References load_config().

00165 {
00166    return load_config(1);
00167 }

static int unload_module ( void   )  [static]

Definition at line 145 of file cdr_custom.c.

References ast_cdr_unregister().

00146 {
00147    ast_cdr_unregister(name);
00148    return 0;
00149 }


Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT | AST_MODFLAG_BUILDSUM, .description = "Customizable Comma Separated Values CDR Backend" , .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 = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .reload = reload, } [static]

Definition at line 173 of file cdr_custom.c.

const struct ast_module_info* ast_module_info = &__mod_info [static]

Definition at line 173 of file cdr_custom.c.

char format[1024] = "" [static]

Definition at line 65 of file cdr_custom.c.

ast_mutex_t lock = ((ast_mutex_t) PTHREAD_MUTEX_INITIALIZER ) [static]

Definition at line 59 of file cdr_custom.c.

char master[PATH_MAX] [static]

Definition at line 64 of file cdr_custom.c.

ast_mutex_t mf_lock = ((ast_mutex_t) PTHREAD_MUTEX_INITIALIZER ) [static]

Definition at line 60 of file cdr_custom.c.

char* name = "cdr-custom" [static]

Definition at line 62 of file cdr_custom.c.


Generated on Thu Oct 11 06:42:55 2012 for Asterisk - the Open Source PBX by  doxygen 1.5.6