diff --git a/daemon/call.c b/daemon/call.c index 26f6ce743..64ba52512 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -134,6 +134,13 @@ const char * get_term_reason_text(char *buf, enum termination_reason t) { return buf; } +const char * get_tag_type_text(char *buf, enum tag_type t) { + if (t==FROM_TAG) { buf = "FROM_TAG"; return buf; } + if (t==TO_TAG) { buf = "TO_TAG"; return buf; } + + buf = "UNKNOWN"; + return buf; +} static void determine_handler(struct packet_stream *in, const struct packet_stream *out); @@ -2353,6 +2360,7 @@ void call_destroy(struct call *c) { struct timeval tim_result; static const int CDRBUFLENGTH = 4096*2; char reasonbuf[16]; memset(&reasonbuf,0,16); + char tagtypebuf[16]; memset(&tagtypebuf,0,16); char cdrbuffer[CDRBUFLENGTH]; memset(&cdrbuffer,0,CDRBUFLENGTH); char* cdrbufcur = cdrbuffer; int cdrlinecnt = 0; @@ -2375,7 +2383,7 @@ void call_destroy(struct call *c) { /* CDRs and statistics */ cdrbufcur += sprintf(cdrbufcur,"ci=%s, ",c->callid.s); - cdrbufcur += sprintf(cdrbufcur,"created_from=%s", c->created_from); + cdrbufcur += sprintf(cdrbufcur,"created_from=%s, ", c->created_from); for (l = c->monologues; l; l = l->next) { ml = l->data; if (_log_facility_cdr) { @@ -2386,12 +2394,14 @@ void call_destroy(struct call *c) { "ml%i_duration=%ld.%06ld, " "ml%i_termination=%s, " "ml%i_local_tag=%s, " + "ml%i_local_tag_type=%s, " "ml%i_remote_tag=%s, ", cdrlinecnt, ml->started.tv_sec, ml->started.tv_usec, cdrlinecnt, ml->terminated.tv_sec, ml->terminated.tv_usec, cdrlinecnt, tim_result.tv_sec, tim_result.tv_usec, cdrlinecnt, get_term_reason_text(reasonbuf,ml->term_reason), cdrlinecnt, ml->tag.s, + cdrlinecnt, get_tag_type_text(tagtypebuf,ml->tagtype), cdrlinecnt, ml->active_dialogue ? ml->active_dialogue->tag.s : "(none)"); } diff --git a/daemon/call.h b/daemon/call.h index 31345b56d..9b5ea27da 100644 --- a/daemon/call.h +++ b/daemon/call.h @@ -21,6 +21,12 @@ enum termination_reason { SILENT_TIMEOUT=4 }; +enum tag_type { + UNKNOWN_TAG=0, + FROM_TAG=1, + TO_TAG=2 +}; + enum stream_address_format { SAF_TCP, SAF_UDP, @@ -303,7 +309,8 @@ struct call_media { struct call_monologue { struct call *call; /* RO */ - str tag; + str tag; + enum tag_type tagtype; time_t created; /* RO */ time_t deleted; struct timeval started; /* for CDR */ @@ -502,5 +509,6 @@ INLINE struct packet_stream *packet_stream_sink(struct packet_stream *ps) { return ret; } +const char * get_tag_type_text(char *buf, enum tag_type t); #endif diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index 33e6298d7..d4854aaa7 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -163,6 +163,12 @@ static str *call_update_lookup_udp(char **out, struct callmaster *m, enum call_o if (!monologue) goto ml_fail; + if (!totag.s || totag.len==0) { + monologue->tagtype = FROM_TAG; + } else { + monologue->tagtype = TO_TAG; + } + if (addr_parse_udp(&sp, out)) goto addr_fail; diff --git a/daemon/cli.c b/daemon/cli.c index c25ca4906..f59bacfef 100644 --- a/daemon/cli.c +++ b/daemon/cli.c @@ -33,6 +33,7 @@ static void cli_incoming_list_callid(char* buffer, int len, struct callmaster* m GList *k, *o; char buf[64]; int printlen=0; + char tagtypebuf[16]; memset(&tagtypebuf,0,16); if (len<=1) { printlen = snprintf(replybuffer,(outbufend-replybuffer), "%s\n", "More parameters required."); @@ -56,9 +57,9 @@ static void cli_incoming_list_callid(char* buffer, int len, struct callmaster* m for (l = c->monologues; l; l = l->next) { ml = l->data; - printlen = snprintf(replybuffer,(outbufend-replybuffer), "--- Tag '"STR_FORMAT"', callduration " + printlen = snprintf(replybuffer,(outbufend-replybuffer), "--- Tag '"STR_FORMAT"' type: %s, callduration " "%u:%02u , in dialogue with '"STR_FORMAT"'\n", - STR_FMT(&ml->tag), + STR_FMT(&ml->tag), get_tag_type_text(tagtypebuf,ml->tagtype), (unsigned int) (poller_now - ml->created) / 60, (unsigned int) (poller_now - ml->created) % 60, ml->active_dialogue ? ml->active_dialogue->tag.len : 6,