cdr.c File Reference

#include <asterisk/lock.h>
#include <asterisk/channel.h>
#include <asterisk/cdr.h>
#include <asterisk/logger.h>
#include <asterisk/callerid.h>
#include <asterisk/causes.h>
#include <asterisk/options.h>
#include <asterisk/utils.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

Include dependency graph for cdr.c:

Go to the source code of this file.

Data Structures

struct  ast_cdr_beitem

Functions

 AST_MUTEX_DEFINE_STATIC (cdrlock)
int ast_cdr_register (char *name, char *desc, ast_cdrbe be)
 Register a CDR handling engine.
void ast_cdr_unregister (char *name)
 Unregister a CDR handling engine.
void ast_cdr_free (struct ast_cdr *cdr)
 Free a record.
struct ast_cdrast_cdr_alloc (void)
 Allocate a record.
void ast_cdr_start (struct ast_cdr *cdr)
 Start a call.
void ast_cdr_answer (struct ast_cdr *cdr)
 Answer a call.
void ast_cdr_busy (struct ast_cdr *cdr)
 Busy a call.
void ast_cdr_failed (struct ast_cdr *cdr)
 Fail a call.
int ast_cdr_disposition (struct ast_cdr *cdr, int cause)
 Save the result of the call based on the AST_CAUSE_*.
void ast_cdr_setdestchan (struct ast_cdr *cdr, char *chann)
 Set the destination channel, if there was one.
void ast_cdr_setapp (struct ast_cdr *cdr, char *app, char *data)
 Set the last executed application.
int ast_cdr_setcid (struct ast_cdr *cdr, struct ast_channel *c)
 Initialize based on a channel.
int ast_cdr_init (struct ast_cdr *cdr, struct ast_channel *c)
 Initialize based on a channel.
void ast_cdr_end (struct ast_cdr *cdr)
 End a call.
char * ast_cdr_disp2str (int disposition)
 Disposition to a string.
char * ast_cdr_flags2str (int flag)
 Flags to a string.
int ast_cdr_setaccount (struct ast_channel *chan, char *account)
int ast_cdr_setamaflags (struct ast_channel *chan, char *flag)
int ast_cdr_setuserfield (struct ast_channel *chan, char *userfield)
int ast_cdr_appenduserfield (struct ast_channel *chan, char *userfield)
int ast_cdr_update (struct ast_channel *c)
int ast_cdr_amaflags2int (char *flag)
 Convert a string to a detail record AMA flag.
void ast_cdr_post (struct ast_cdr *cdr)
 Post the detail record.
void ast_cdr_reset (struct ast_cdr *cdr, int flags)
 Reset the detail record, optionally posting it first.
struct ast_cdrast_cdr_append (struct ast_cdr *cdr, struct ast_cdr *newcdr)

Variables

int ast_default_amaflags = AST_CDR_DOCUMENTATION
char ast_default_accountcode [20] = ""


Function Documentation

struct ast_cdr* ast_cdr_alloc ( void   )  [read]

Allocate a record.

Returns a malloc'd ast_cdr structure, returns NULL on error (malloc failure)

Definition at line 124 of file cdr.c.

00125 {
00126    struct ast_cdr *cdr;
00127    cdr = malloc(sizeof(struct ast_cdr));
00128    if (cdr) {
00129       memset(cdr, 0, sizeof(struct ast_cdr));
00130    }
00131    return cdr;
00132 }

int ast_cdr_amaflags2int ( char *  flag  ) 

Convert a string to a detail record AMA flag.

Parameters:
flag string form of flag Converts the string form of the flag to the binary form. Returns the binary form of the flag

Definition at line 460 of file cdr.c.

00461 {
00462    if (!strcasecmp(flag, "default"))
00463       return 0;
00464    if (!strcasecmp(flag, "omit"))
00465       return AST_CDR_OMIT;
00466    if (!strcasecmp(flag, "billing"))
00467       return AST_CDR_BILLING;
00468    if (!strcasecmp(flag, "documentation"))
00469       return AST_CDR_DOCUMENTATION;
00470    return -1;
00471 }

void ast_cdr_answer ( struct ast_cdr cdr  ) 

Answer a call.

Parameters:
cdr the cdr you wish to associate with the call Starts all CDR stuff necessary for doing CDR when answering a call

Definition at line 150 of file cdr.c.

00151 {
00152    char *chan; 
00153    while (cdr) {
00154       chan = !ast_strlen_zero(cdr->channel) ? cdr->channel : "<unknown>";
00155       if (ast_cdr_has_flag(cdr,AST_CDR_FLAG_POSTED))
00156          ast_log(LOG_WARNING, "CDR on channel '%s' already posted\n", chan);
00157       if (cdr->disposition < AST_CDR_ANSWERED)
00158          cdr->disposition = AST_CDR_ANSWERED;
00159       if (!cdr->answer.tv_sec && !cdr->answer.tv_usec) {
00160          gettimeofday(&cdr->answer, NULL);
00161       }
00162       cdr = cdr->next;
00163    }
00164 }

struct ast_cdr* ast_cdr_append ( struct ast_cdr cdr,
struct ast_cdr newcdr 
) [read]

Definition at line 527 of file cdr.c.

00528 {
00529    struct ast_cdr *ret;
00530    if (cdr) {
00531       ret = cdr;
00532       while(cdr->next)
00533          cdr = cdr->next;
00534       cdr->next = newcdr;
00535    } else {
00536       ret = newcdr;
00537    }
00538    return ret;
00539 }

int ast_cdr_appenduserfield ( struct ast_channel chan,
char *  userfield 
)

Definition at line 404 of file cdr.c.

00405 {
00406    struct ast_cdr *cdr = chan->cdr;
00407 
00408    while (cdr)
00409    {
00410 
00411       int len = strlen(cdr->userfield);
00412       if(!ast_cdr_has_flag(cdr,AST_CDR_FLAG_LOCKED))
00413          strncpy(cdr->userfield+len, userfield, sizeof(cdr->userfield) - len - 1);
00414       cdr = cdr->next;
00415    }
00416    return 0;
00417 }

void ast_cdr_busy ( struct ast_cdr cdr  ) 

Busy a call.

Parameters:
cdr the cdr you wish to associate with the call Returns nothing important

Definition at line 166 of file cdr.c.

00167 {
00168    char *chan; 
00169    while (cdr) {
00170       if (!ast_cdr_has_flag(cdr,AST_CDR_FLAG_LOCKED)) {
00171          chan = !ast_strlen_zero(cdr->channel) ? cdr->channel : "<unknown>";
00172          if (ast_cdr_has_flag(cdr,AST_CDR_FLAG_POSTED))
00173             ast_log(LOG_WARNING, "CDR on channel '%s' already posted\n", chan);
00174          if (cdr->disposition < AST_CDR_BUSY)
00175             cdr->disposition = AST_CDR_BUSY;
00176       }
00177       cdr = cdr->next;
00178    }
00179 }

char* ast_cdr_disp2str ( int  disposition  ) 

Disposition to a string.

Parameters:
flag input binary form Converts the binary form of a disposition to string form. Returns a pointer to the string form

Definition at line 338 of file cdr.c.

00339 {
00340    switch (disposition) {
00341    case AST_CDR_NOANSWER:
00342       return "NO ANSWER";
00343    case AST_CDR_FAILED:
00344       return "FAILED";     
00345    case AST_CDR_BUSY:
00346       return "BUSY";    
00347    case AST_CDR_ANSWERED:
00348       return "ANSWERED";
00349    default:
00350       return "UNKNOWN";
00351    }
00352 }

int ast_cdr_disposition ( struct ast_cdr cdr,
int  cause 
)

Save the result of the call based on the AST_CAUSE_*.

Parameters:
cdr the cdr you wish to associate with the call Returns nothing important
cause the AST_CAUSE_*

Definition at line 194 of file cdr.c.

00195 {
00196    int res = 0;
00197    while (cdr) {
00198       switch(cause) {
00199          case AST_CAUSE_BUSY:
00200             ast_cdr_busy(cdr);
00201             break;
00202          case AST_CAUSE_FAILURE:
00203             ast_cdr_failed(cdr);
00204             break;
00205          case AST_CAUSE_NORMAL:
00206             break;
00207          case AST_CAUSE_NOTDEFINED:
00208             res = -1;
00209             break;
00210          default:
00211             res = -1;
00212             ast_log(LOG_WARNING, "We don't handle that cause yet\n");
00213       }
00214       cdr = cdr->next;
00215    }
00216    return res;
00217 }

void ast_cdr_end ( struct ast_cdr cdr  ) 

End a call.

Parameters:
cdr the cdr you have associated the call with Registers the end of call time in the cdr structure. Returns nothing important

Definition at line 323 of file cdr.c.

00324 {
00325    char *chan;
00326    while (cdr) {
00327       chan = !ast_strlen_zero(cdr->channel) ? cdr->channel : "<unknown>";
00328       if (ast_cdr_has_flag(cdr,AST_CDR_FLAG_POSTED))
00329          ast_log(LOG_WARNING, "CDR on channel '%s' already posted\n", chan);
00330       if (!cdr->start.tv_sec && !cdr->start.tv_usec)
00331          ast_log(LOG_WARNING, "CDR on channel '%s' has not started\n", chan);
00332       if (!cdr->end.tv_sec && !cdr->end.tv_usec) 
00333          gettimeofday(&cdr->end, NULL);
00334       cdr = cdr->next;
00335    }
00336 }

void ast_cdr_failed ( struct ast_cdr cdr  ) 

Fail a call.

Parameters:
cdr the cdr you wish to associate with the call Returns nothing important

Definition at line 181 of file cdr.c.

00182 {
00183    char *chan; 
00184    while (cdr) {
00185       chan = !ast_strlen_zero(cdr->channel) ? cdr->channel : "<unknown>";
00186       if (ast_cdr_has_flag(cdr,AST_CDR_FLAG_POSTED))
00187          ast_log(LOG_WARNING, "CDR on channel '%s' already posted\n", chan);
00188       if(!ast_cdr_has_flag(cdr,AST_CDR_FLAG_LOCKED))
00189          cdr->disposition = AST_CDR_FAILED;
00190       cdr = cdr->next;
00191    }
00192 }

char* ast_cdr_flags2str ( int  flags  ) 

Flags to a string.

Parameters:
flags binary flag Converts binary flags to string flags Returns string with flag name

Definition at line 354 of file cdr.c.

00355 {
00356    switch(flag) {
00357    case AST_CDR_OMIT:
00358       return "OMIT";
00359    case AST_CDR_BILLING:
00360       return "BILLING";
00361    case AST_CDR_DOCUMENTATION:
00362       return "DOCUMENTATION";
00363    }
00364    return "Unknown";
00365 }

void ast_cdr_free ( struct ast_cdr cdr  ) 

Free a record.

Definition at line 106 of file cdr.c.

00107 {
00108    char *chan;
00109    struct ast_cdr *next; 
00110    while (cdr) {
00111       next = cdr->next;
00112       chan = !ast_strlen_zero(cdr->channel) ? cdr->channel : "<unknown>";
00113       if (!ast_cdr_has_flag(cdr,AST_CDR_FLAG_POSTED))
00114          ast_log(LOG_WARNING, "CDR on channel '%s' not posted\n", chan);
00115       if (!cdr->end.tv_sec && !cdr->end.tv_usec)
00116          ast_log(LOG_WARNING, "CDR on channel '%s' lacks end\n", chan);
00117       if (!cdr->start.tv_sec && !cdr->start.tv_usec)
00118          ast_log(LOG_WARNING, "CDR on channel '%s' lacks start\n", chan);
00119       free(cdr);
00120       cdr = next;
00121    }
00122 }

int ast_cdr_init ( struct ast_cdr cdr,
struct ast_channel chan 
)

Initialize based on a channel.

Parameters:
cdr Call Detail Record to use for channel
chan Channel to bind CDR with Initializes a CDR and associates it with a particular channel Return is negligible. (returns 0 by default)

Definition at line 277 of file cdr.c.

00278 {
00279    char *chan;
00280    char *num, *name;
00281    char tmp[AST_MAX_EXTENSION] = "";
00282    while (cdr) {
00283       if(!ast_cdr_has_flag(cdr,AST_CDR_FLAG_LOCKED)) {
00284          chan = !ast_strlen_zero(cdr->channel) ? cdr->channel : "<unknown>";
00285          if (!ast_strlen_zero(cdr->channel)) 
00286             ast_log(LOG_WARNING, "CDR already initialized on '%s'\n", chan); 
00287          strncpy(cdr->channel, c->name, sizeof(cdr->channel) - 1);
00288          /* Grab source from ANI or normal Caller*ID */
00289          if (c->ani)
00290             strncpy(tmp, c->ani, sizeof(tmp) - 1);
00291          else if (c->callerid)
00292             strncpy(tmp, c->callerid, sizeof(tmp) - 1);
00293          if (c->callerid)
00294             strncpy(cdr->clid, c->callerid, sizeof(cdr->clid) - 1);
00295          name = NULL;
00296          num = NULL;
00297          ast_callerid_parse(tmp, &name, &num);
00298          if (num) {
00299             ast_shrink_phone_number(num);
00300             strncpy(cdr->src, num, sizeof(cdr->src) - 1);
00301          }
00302          
00303          if (c->_state == AST_STATE_UP)
00304             cdr->disposition = AST_CDR_ANSWERED;
00305          else
00306             cdr->disposition = AST_CDR_NOANSWER;
00307          if (c->amaflags)
00308             cdr->amaflags = c->amaflags;
00309          else
00310             cdr->amaflags = ast_default_amaflags;
00311          strncpy(cdr->accountcode, c->accountcode, sizeof(cdr->accountcode) - 1);
00312          /* Destination information */
00313          strncpy(cdr->dst, c->exten, sizeof(cdr->dst) - 1);
00314          strncpy(cdr->dcontext, c->context, sizeof(cdr->dcontext) - 1);
00315          /* Unique call identifier */
00316          strncpy(cdr->uniqueid, c->uniqueid, sizeof(cdr->uniqueid) - 1);
00317       }
00318       cdr = cdr->next;
00319    }
00320    return 0;
00321 }

void ast_cdr_post ( struct ast_cdr cdr  ) 

Post the detail record.

Parameters:
cdr Which cdr to post Actually outputs the CDR record to the CDR plugins installed Returns nothing

Definition at line 473 of file cdr.c.

00474 {
00475    char *chan;
00476    struct ast_cdr_beitem *i;
00477    while (cdr) {
00478       chan = !ast_strlen_zero(cdr->channel) ? cdr->channel : "<unknown>";
00479       if (ast_cdr_has_flag(cdr,AST_CDR_FLAG_POSTED))
00480          ast_log(LOG_WARNING, "CDR on channel '%s' already posted\n", chan);
00481       if (!cdr->end.tv_sec && !cdr->end.tv_usec)
00482          ast_log(LOG_WARNING, "CDR on channel '%s' lacks end\n", chan);
00483       if (!cdr->start.tv_sec && !cdr->start.tv_usec)
00484          ast_log(LOG_WARNING, "CDR on channel '%s' lacks start\n", chan);
00485       cdr->duration = cdr->end.tv_sec - cdr->start.tv_sec + (cdr->end.tv_usec - cdr->start.tv_usec) / 1000000;
00486       if (cdr->answer.tv_sec || cdr->answer.tv_usec) {
00487          cdr->billsec = cdr->end.tv_sec - cdr->answer.tv_sec + (cdr->end.tv_usec - cdr->answer.tv_usec) / 1000000;
00488       } else
00489          cdr->billsec = 0;
00490       ast_cdr_add_flag(cdr,AST_CDR_FLAG_POSTED);
00491       ast_mutex_lock(&cdrlock);
00492       i = bes;
00493       while(i) {
00494          i->be(cdr);
00495          i = i->next;
00496       }
00497       ast_mutex_unlock(&cdrlock);
00498       cdr = cdr->next;
00499    }
00500 }

int ast_cdr_register ( char *  name,
char *  desc,
ast_cdrbe  be 
)

Register a CDR handling engine.

Parameters:
name name associated with the particular CDR handler
desc description of the CDR handler
be function pointer to a CDR handler Used to register a Call Detail Record handler. Returns -1 on error, 0 on success.

Definition at line 49 of file cdr.c.

00050 {
00051    struct ast_cdr_beitem *i;
00052    if (!name)
00053       return -1;
00054    if (!be) {
00055       ast_log(LOG_WARNING, "CDR engine '%s' lacks backend\n", name);
00056       return -1;
00057    }
00058    ast_mutex_lock(&cdrlock);
00059    i = bes;
00060    while(i) {
00061       if (!strcasecmp(name, i->name))
00062          break;
00063       i = i->next;
00064    }
00065    ast_mutex_unlock(&cdrlock);
00066    if (i) {
00067       ast_log(LOG_WARNING, "Already have a CDR backend called '%s'\n", name);
00068       return -1;
00069    }
00070    i = malloc(sizeof(struct ast_cdr_beitem));
00071    if (!i)  
00072       return -1;
00073    memset(i, 0, sizeof(struct ast_cdr_beitem));
00074    strncpy(i->name, name, sizeof(i->name) - 1);
00075    strncpy(i->desc, desc, sizeof(i->desc) - 1);
00076    i->be = be;
00077    ast_mutex_lock(&cdrlock);
00078    i->next = bes;
00079    bes = i;
00080    ast_mutex_unlock(&cdrlock);
00081    return 0;
00082 }

void ast_cdr_reset ( struct ast_cdr cdr,
int  flags 
)

Reset the detail record, optionally posting it first.

Parameters:
cdr which cdr to act upon
flags |AST_CDR_FLAG_POSTED whether or not to post the cdr first before resetting it |AST_CDR_FLAG_LOCKED whether or not to reset locked CDR's

Definition at line 502 of file cdr.c.

00503 {
00504    while (cdr) {
00505       /* Post if requested */
00506       if (ast_cdr_compare_flag(flags,AST_CDR_FLAG_LOCKED) || !ast_cdr_has_flag(cdr,AST_CDR_FLAG_LOCKED)) {
00507          if (ast_cdr_compare_flag(flags,AST_CDR_FLAG_POSTED)) {
00508             ast_cdr_end(cdr);
00509             ast_cdr_post(cdr);
00510          }
00511          /* Reset to initial state */
00512          cdr->flags=0;
00513          memset(&cdr->start, 0, sizeof(cdr->start));
00514          memset(&cdr->end, 0, sizeof(cdr->end));
00515          memset(&cdr->answer, 0, sizeof(cdr->answer));
00516          cdr->billsec = 0;
00517          cdr->duration = 0;
00518          ast_cdr_start(cdr);
00519          cdr->disposition = AST_CDR_NOANSWER;
00520       }
00521          
00522       cdr = cdr->next;
00523    }
00524    
00525 }

int ast_cdr_setaccount ( struct ast_channel chan,
char *  account 
)

Definition at line 367 of file cdr.c.

00368 {
00369    struct ast_cdr *cdr = chan->cdr;
00370 
00371    strncpy(chan->accountcode, account, sizeof(chan->accountcode) - 1);
00372    while (cdr) {
00373       if(!ast_cdr_has_flag(cdr,AST_CDR_FLAG_LOCKED))
00374          strncpy(cdr->accountcode, chan->accountcode, sizeof(cdr->accountcode) - 1);
00375       cdr = cdr->next;
00376    }
00377    return 0;
00378 }

int ast_cdr_setamaflags ( struct ast_channel chan,
char *  flag 
)

Definition at line 380 of file cdr.c.

00381 {
00382    struct ast_cdr *cdr = chan->cdr;
00383    int newflag;
00384 
00385    newflag = ast_cdr_amaflags2int(flag);
00386    if (newflag) {
00387       cdr->amaflags = newflag;
00388    }
00389    return 0;
00390 }

void ast_cdr_setapp ( struct ast_cdr cdr,
char *  app,
char *  data 
)

Set the last executed application.

Parameters:
cdr which cdr to act upon
app the name of the app you wish to change it to
data the data you want in the data field of app you set it to Changes the value of the last executed app Returns nothing

Definition at line 232 of file cdr.c.

00233 {
00234    char *chan; 
00235    while (cdr) {
00236       if(!ast_cdr_has_flag(cdr,AST_CDR_FLAG_LOCKED)) {
00237          chan = !ast_strlen_zero(cdr->channel) ? cdr->channel : "<unknown>";
00238          if (ast_cdr_has_flag(cdr,AST_CDR_FLAG_POSTED))
00239             ast_log(LOG_WARNING, "CDR on channel '%s' already posted\n", chan);
00240          if (!app)
00241             app = "";
00242          strncpy(cdr->lastapp, app, sizeof(cdr->lastapp) - 1);
00243          if (!data)
00244             data = "";
00245          strncpy(cdr->lastdata, data, sizeof(cdr->lastdata) - 1);
00246       }
00247       cdr = cdr->next;
00248    }
00249 }

int ast_cdr_setcid ( struct ast_cdr cdr,
struct ast_channel chan 
)

Initialize based on a channel.

Parameters:
cdr Call Detail Record to use for channel
chan Channel to bind CDR with Initializes a CDR and associates it with a particular channel Return is negligible. (returns 0 by default)

Definition at line 251 of file cdr.c.

00252 {
00253    char tmp[AST_MAX_EXTENSION] = "";
00254    char *num, *name;
00255    while (cdr) {
00256       if(!ast_cdr_has_flag(cdr,AST_CDR_FLAG_LOCKED)) {
00257          /* Grab source from ANI or normal Caller*ID */
00258          if (c->ani)
00259             strncpy(tmp, c->ani, sizeof(tmp) - 1);
00260          else if (c->callerid)
00261             strncpy(tmp, c->callerid, sizeof(tmp) - 1);
00262          if (c->callerid)
00263             strncpy(cdr->clid, c->callerid, sizeof(cdr->clid) - 1);
00264          name = NULL;
00265          num = NULL;
00266          ast_callerid_parse(tmp, &name, &num);
00267          if (num) {
00268             ast_shrink_phone_number(num);
00269             strncpy(cdr->src, num, sizeof(cdr->src) - 1);
00270          }
00271       }
00272       cdr = cdr->next;
00273    }
00274    return 0;
00275 }

void ast_cdr_setdestchan ( struct ast_cdr cdr,
char *  chan 
)

Set the destination channel, if there was one.

Parameters:
cdr Which cdr it's applied to Sets the destination channel the CDR is applied to Returns nothing

Definition at line 219 of file cdr.c.

00220 {
00221    char *chan; 
00222    while (cdr) {
00223       chan = !ast_strlen_zero(cdr->channel) ? cdr->channel : "<unknown>";
00224       if (ast_cdr_has_flag(cdr,AST_CDR_FLAG_POSTED))
00225          ast_log(LOG_WARNING, "CDR on channel '%s' already posted\n", chan);
00226       if(!ast_cdr_has_flag(cdr,AST_CDR_FLAG_LOCKED))
00227          strncpy(cdr->dstchannel, chann, sizeof(cdr->dstchannel) - 1);
00228       cdr = cdr->next;
00229    }
00230 }

int ast_cdr_setuserfield ( struct ast_channel chan,
char *  userfield 
)

Definition at line 392 of file cdr.c.

00393 {
00394    struct ast_cdr *cdr = chan->cdr;
00395 
00396    while (cdr) {
00397       if(!ast_cdr_has_flag(cdr,AST_CDR_FLAG_LOCKED)) 
00398          strncpy(cdr->userfield, userfield, sizeof(cdr->userfield) - 1);
00399       cdr = cdr->next;
00400    }
00401    return 0;
00402 }

void ast_cdr_start ( struct ast_cdr cdr  ) 

Start a call.

Parameters:
cdr the cdr you wish to associate with the call Starts all CDR stuff necessary for monitoring a call Returns nothing important

Definition at line 134 of file cdr.c.

00135 {
00136    char *chan; 
00137    while (cdr) {
00138       if (!ast_cdr_has_flag(cdr,AST_CDR_FLAG_LOCKED)) {
00139          chan = !ast_strlen_zero(cdr->channel) ? cdr->channel : "<unknown>";
00140          if (ast_cdr_has_flag(cdr,AST_CDR_FLAG_POSTED))
00141             ast_log(LOG_WARNING, "CDR on channel '%s' already posted\n", chan);
00142          if (cdr->start.tv_sec || cdr->start.tv_usec)
00143             ast_log(LOG_WARNING, "CDR on channel '%s' already started\n", chan);
00144          gettimeofday(&cdr->start, NULL);
00145       }
00146          cdr = cdr->next;
00147    }
00148 }

void ast_cdr_unregister ( char *  name  ) 

Unregister a CDR handling engine.

Parameters:
name name of CDR handler to unregister Unregisters a CDR by it's name

Definition at line 84 of file cdr.c.

00085 {
00086    struct ast_cdr_beitem *i, *prev = NULL;
00087    ast_mutex_lock(&cdrlock);
00088    i = bes;
00089    while(i) {
00090       if (!strcasecmp(name, i->name)) {
00091          if (prev)
00092             prev->next = i->next;
00093          else
00094             bes = i->next;
00095          break;
00096       }
00097       i = i->next;
00098    }
00099    if (option_verbose > 1)
00100       ast_verbose(VERBOSE_PREFIX_2 "Unregistered '%s' CDR backend\n", name);
00101    ast_mutex_unlock(&cdrlock);
00102    if (i) 
00103       free(i);
00104 }

int ast_cdr_update ( struct ast_channel c  ) 

Definition at line 419 of file cdr.c.

00420 {
00421    struct ast_cdr *cdr = c->cdr;
00422    char *name, *num;
00423    char tmp[AST_MAX_EXTENSION] = "";
00424    /* Grab source from ANI or normal Caller*ID */
00425    while (cdr) {
00426       if(!ast_cdr_has_flag(cdr,AST_CDR_FLAG_LOCKED)) {
00427          if (c->ani)
00428             strncpy(tmp, c->ani, sizeof(tmp) - 1);
00429          else if (c->callerid && !ast_strlen_zero(c->callerid))
00430             strncpy(tmp, c->callerid, sizeof(tmp) - 1);
00431          if (c->callerid && !ast_strlen_zero(c->callerid))
00432             strncpy(cdr->clid, c->callerid, sizeof(cdr->clid) - 1);
00433          else
00434             cdr->clid[0] = '\0';
00435          name = NULL;
00436          num = NULL;
00437          ast_callerid_parse(tmp, &name, &num);
00438          if (num) {
00439             ast_shrink_phone_number(num);
00440             strncpy(cdr->src, num, sizeof(cdr->src) - 1);
00441          }
00442          /* Copy account code et-al */ 
00443          strncpy(cdr->accountcode, c->accountcode, sizeof(cdr->accountcode) - 1);
00444          /* Destination information */
00445          if (ast_strlen_zero(c->macroexten))
00446             strncpy(cdr->dst, c->exten, sizeof(cdr->dst) - 1);
00447          else
00448             strncpy(cdr->dst, c->macroexten, sizeof(cdr->dst) - 1);
00449          if (ast_strlen_zero(c->macrocontext))
00450             strncpy(cdr->dcontext, c->context, sizeof(cdr->dcontext) - 1);
00451          else
00452             strncpy(cdr->dcontext, c->macrocontext, sizeof(cdr->dcontext) - 1);
00453       }
00454       cdr = cdr->next;
00455    }
00456 
00457    return 0;
00458 }

AST_MUTEX_DEFINE_STATIC ( cdrlock   ) 


Variable Documentation

char ast_default_accountcode[20] = ""

Definition at line 30 of file cdr.c.

int ast_default_amaflags = AST_CDR_DOCUMENTATION

Definition at line 29 of file cdr.c.


Generated on Wed Oct 28 17:00:50 2009 for Asterisk by  doxygen 1.5.6