Sat Sep 16 05:47:52 2006

Asterisk developer's documentation


cdr_custom.c File Reference

Custom Comma Separated Value CDR records. More...

#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"

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"


Detailed Description

Custom Comma Separated Value CDR records.

Logs in LOG_DIR/cdr_custom

Definition in file cdr_custom.c.


Define Documentation

#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.


Function Documentation

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.

Returns:
a short description of your 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;
 }

Returns:
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.

Returns:
int Always 0.

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.

Returns:
The return value is not used.

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).

Returns:
Zero on success, or non-zero on error.

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.

Returns:
The module's usecount.

Definition at line 170 of file cdr_custom.c.

00171 {
00172    return 0;
00173 }


Variable Documentation

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.


Generated on Sat Sep 16 05:47:52 2006 for Asterisk - the Open Source PBX by  doxygen 1.4.7