From aa06c6ea297ccb82ae30a11f66f523dc1b18652c Mon Sep 17 00:00:00 2001
From: Frederic LE FOLL <frederic.lefoll@c-s.fr>
Date: Wed, 27 Nov 2019 18:34:24 +0100
Subject: [PATCH] app_chanisavail/cdr: ChanIsAvail sometimes fails to
 deactivate CDR.

Temporary channel lifespan is very short and CDR deactivation request
through ast_cdr_set_property() may happen when CDR is not available
yet. Use CDR_PROP() dialplan function instead, it will first wait
for pending CDR insertion requests to be processed.

ASTERISK-28636

Change-Id: I1cbe09e8d2169c0962c1195133ff260d291f2074
---
 apps/app_chanisavail.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/apps/app_chanisavail.c b/apps/app_chanisavail.c
index 446bce1b01..1c7c1ec3bf 100644
--- a/apps/app_chanisavail.c
+++ b/apps/app_chanisavail.c
@@ -134,6 +134,8 @@ static int chanavail_exec(struct ast_channel *chan, const char *data)
 	}
 	peers = args.reqchans;
 	if (peers) {
+		struct ast_custom_function *cdr_prop_func = ast_custom_function_find("CDR_PROP");
+
 		cur = peers;
 		do {
 			/* remember where to start next time */
@@ -179,7 +181,9 @@ static int chanavail_exec(struct ast_channel *chan, const char *data)
 					ast_str_append(&tmp_availcause, 0, "%s%s", ast_str_strlen(tmp_availcause) ? "&" : "", tmp);
 
 					/* Disable CDR for this temporary channel. */
-					ast_cdr_set_property(ast_channel_name(tempchan), AST_CDR_FLAG_DISABLE_ALL);
+					if (cdr_prop_func) {
+						ast_func_write(tempchan, "CDR_PROP(disable)", "1");
+					}
 
 					ast_hangup(tempchan);
 					tempchan = NULL;
@@ -212,4 +216,9 @@ static int load_module(void)
 		AST_MODULE_LOAD_DECLINE : AST_MODULE_LOAD_SUCCESS;
 }
 
-AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Check channel availability");
+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Check channel availability",
+	.support_level = AST_MODULE_SUPPORT_EXTENDED,
+	.load = load_module,
+	.unload = unload_module,
+	.optional_modules = "func_cdr"
+);
-- 
GitLab