summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES5
-rw-r--r--configs/cdr.conf.sample9
-rw-r--r--include/asterisk/options.h2
-rw-r--r--main/cdr.c8
4 files changed, 23 insertions, 1 deletions
diff --git a/CHANGES b/CHANGES
index 38c21f590..c032471d0 100644
--- a/CHANGES
+++ b/CHANGES
@@ -209,6 +209,11 @@ Miscellaneous
operator. This is most helpful when working with long SQL queries in
func_odbc.conf, as the queries no longer need to be specified on a single
line.
+ * CDR config file, cdr.conf, has an added option, "initiatedseconds",
+ which will add a second to the billsec when the ending
+ time is set, if the number in the microseconds field of the end time is
+ greater than the number of microseconds in the answer time. This allows
+ users to count the 'initiated' seconds in their billing records.
------------------------------------------------------------------------------
--- Functionality changes from Asterisk 1.4.X to Asterisk 1.6.0 -------------
diff --git a/configs/cdr.conf.sample b/configs/cdr.conf.sample
index 693b28092..195f88f32 100644
--- a/configs/cdr.conf.sample
+++ b/configs/cdr.conf.sample
@@ -65,6 +65,15 @@
; retrieved inside of of this extension.
;endbeforehexten=no
+; Normally, the 'billsec' field logged to the backends (text files or databases)
+; is simply the end time (hangup time) minus the answer time in seconds. Internally,
+; asterisk stores the time in terms of microseconds and seconds. By setting
+; initiatedseconds to 'yes', you can force asterisk to report any seconds
+; that were initiated (a sort of round up method). Technically, this is
+; when the microsecond part of the end time is greater than the microsecond
+; part of the answer time, then the billsec time is incremented one second.
+;initiatedseconds=no
+
;
;
; CHOOSING A CDR "BACKEND" (what kind of output to generate)
diff --git a/include/asterisk/options.h b/include/asterisk/options.h
index 19fb3ab59..35f42fb25 100644
--- a/include/asterisk/options.h
+++ b/include/asterisk/options.h
@@ -84,6 +84,8 @@ enum ast_option_flags {
AST_OPT_FLAG_VERBOSE_FILE = (1 << 24),
/*! Terminal colors should be adjusted for a light-colored background */
AST_OPT_FLAG_LIGHT_BACKGROUND = (1 << 25),
+ /*! Count Initiated seconds in CDR's */
+ AST_OPT_FLAG_INITIATED_SECONDS = (1 << 26),
};
/*! These are the options that set by default when Asterisk starts */
diff --git a/main/cdr.c b/main/cdr.c
index 6bf60b8a7..111c3daf0 100644
--- a/main/cdr.c
+++ b/main/cdr.c
@@ -874,8 +874,11 @@ void ast_cdr_end(struct ast_cdr *cdr)
ast_log(LOG_WARNING, "CDR on channel '%s' has no answer time but is 'ANSWERED'\n", S_OR(cdr->channel, "<unknown>"));
cdr->disposition = AST_CDR_FAILED;
}
- } else
+ } else {
cdr->billsec = cdr->end.tv_sec - cdr->answer.tv_sec;
+ if (ast_test_flag(&ast_options, AST_OPT_FLAG_INITIATED_SECONDS))
+ cdr->billsec += cdr->end.tv_usec > cdr->answer.tv_usec ? 1 : 0;
+ }
}
}
@@ -1386,6 +1389,7 @@ static int do_reload(int reload)
const char *size_value;
const char *time_value;
const char *end_before_h_value;
+ const char *initiatedseconds_value;
int cfg_size;
int cfg_time;
int was_enabled;
@@ -1444,6 +1448,8 @@ static int do_reload(int reload)
}
if ((end_before_h_value = ast_variable_retrieve(config, "general", "endbeforehexten")))
ast_set2_flag(&ast_options, ast_true(end_before_h_value), AST_OPT_FLAG_END_CDR_BEFORE_H_EXTEN);
+ if ((initiatedseconds_value = ast_variable_retrieve(config, "general", "initiatedseconds")))
+ ast_set2_flag(&ast_options, ast_true(initiatedseconds_value), AST_OPT_FLAG_INITIATED_SECONDS);
}
if (enabled && !batchmode) {