[Asterisk-code-review] app_mf, app_sf: Return -1 if channel hangs up. (asterisk[16])

Kevin Harwell asteriskteam at digium.com
Fri Apr 8 16:36:30 CDT 2022


Kevin Harwell has submitted this change. ( https://gerrit.asterisk.org/c/asterisk/+/18284 )

Change subject: app_mf, app_sf: Return -1 if channel hangs up.
......................................................................

app_mf, app_sf: Return -1 if channel hangs up.

The ReceiveMF and ReceiveSF applications currently always
return 0, even if a channel has hung up. The call will still
end but generally applications are expected to return -1 if
the channel has hung up.

We now return -1 if a hangup occured to bring this behavior
in line with this norm. This has no functional impact, but
merely increases conformity with how these modules interact
with the PBX core.

ASTERISK-29951 #close

Change-Id: I234d755050ab8ed58f197c6925b968ba26b14033
---
M apps/app_mf.c
M apps/app_sf.c
2 files changed, 31 insertions(+), 12 deletions(-)

Approvals:
  Joshua Colp: Looks good to me, but someone else must approve
  Kevin Harwell: Looks good to me, approved; Approved for Submit
  Benjamin Keith Ford: Looks good to me, but someone else must approve



diff --git a/apps/app_mf.c b/apps/app_mf.c
index 33c1aaa..eef5419 100644
--- a/apps/app_mf.c
+++ b/apps/app_mf.c
@@ -226,7 +226,7 @@
  * \param maxdigits If greater than 0, only read this many digits no matter what
  *
  * \retval 0 if successful
- * \retval -1 if unsuccessful.
+ * \retval -1 if unsuccessful (including hangup).
  */
 static int read_mf_digits(struct ast_channel *chan, char *buf, int buflen, int timeout, int features, int laxkp, int override, int no_kp, int no_st, int maxdigits) {
 	struct ast_dsp *dsp;
@@ -236,6 +236,7 @@
 	int digits_read = 0;
 	int is_start_digit = 0;
 	char *str = buf;
+	int res = 0;
 
 	if (!(dsp = ast_dsp_new())) {
 		ast_log(LOG_WARNING, "Unable to allocate DSP!\n");
@@ -318,11 +319,12 @@
 			}
 		} else {
 			pbx_builtin_setvar_helper(chan, "RECEIVEMFSTATUS", "HANGUP");
+			res = -1;
 		}
 	}
 	ast_dsp_free(dsp);
 	ast_debug(3, "channel '%s' - event loop stopped { timeout: %d, remaining_time: %d }\n", ast_channel_name(chan), timeout, remaining_time);
-	return 0;
+	return res;
 }
 
 static int read_mf_exec(struct ast_channel *chan, const char *data)
@@ -334,7 +336,7 @@
 	struct ast_flags flags = {0};
 	char *optargs[OPT_ARG_ARRAY_SIZE];
 	char *argcopy = NULL;
-	int features = 0, maxdigits = 0;
+	int res, features = 0, maxdigits = 0;
 
 	AST_DECLARE_APP_ARGS(arglist,
 		AST_APP_ARG(variable);
@@ -392,15 +394,15 @@
 		features |= DSP_DIGITMODE_RELAXDTMF;
 	}
 
-	read_mf_digits(chan, tmp, BUFFER_SIZE, to, features, (ast_test_flag(&flags, OPT_LAX_KP)),
+	res = read_mf_digits(chan, tmp, BUFFER_SIZE, to, features, (ast_test_flag(&flags, OPT_LAX_KP)),
 		(ast_test_flag(&flags, OPT_KP_OVERRIDE)), (ast_test_flag(&flags, OPT_NO_KP)), (ast_test_flag(&flags, OPT_NO_ST)), maxdigits);
 	pbx_builtin_setvar_helper(chan, arglist.variable, tmp);
 	if (!ast_strlen_zero(tmp)) {
 		ast_verb(3, "MF digits received: '%s'\n", tmp);
-	} else {
+	} else if (!res) { /* if channel hung up, don't print anything out */
 		ast_verb(3, "No MF digits received.\n");
 	}
-	return 0;
+	return res;
 }
 
 static int sendmf_exec(struct ast_channel *chan, const char *vdata)
diff --git a/apps/app_sf.c b/apps/app_sf.c
index dadc9cc..70f60d4 100644
--- a/apps/app_sf.c
+++ b/apps/app_sf.c
@@ -155,6 +155,21 @@
 static const char *readsf_name = "ReceiveSF";
 static const char sendsf_name[] = "SendSF";
 
+/*!
+ * \brief Detects SF digits on channel using DSP
+ *
+ * \param chan channel on which to read digits
+ * \param buf Buffer in which to store digits
+ * \param buflen Size of buffer
+ * \param timeout ms to wait for all digits before giving up
+ * \param maxdigits Maximum number of digits
+ * \param freq Frequency to use
+ * \param features DSP features
+ * \param extrapulses Whether to recognize extra pulses
+ *
+ * \retval 0 if successful
+ * \retval -1 if unsuccessful (including hangup).
+ */
 static int read_sf_digits(struct ast_channel *chan, char *buf, int buflen, int timeout, int maxdigits, int freq, int features, int extrapulses) {
 	/* Bell System Technical Journal 39 (Nov. 1960) */
 	#define SF_MIN_OFF 25
@@ -169,6 +184,7 @@
 	char *str = buf;
 	int hits = 0, digits_read = 0;
 	unsigned short int sf_on = 0;
+	int res = 0;
 
 	if (!(dsp = ast_dsp_new())) {
 		ast_log(LOG_WARNING, "Unable to allocate DSP!\n");
@@ -261,7 +277,7 @@
 								ast_debug(2, "Got more than 10 pulses, truncating to 10\n");
 								hits = 0; /* 10 dial pulses = digit 0 */
 								*str++ = hits + '0';
-								}
+							}
 						} else {
 							if (hits == 10) {
 								hits = 0; /* 10 dial pulses = digit 0 */
@@ -281,13 +297,14 @@
 			ast_frfree(frame);
 		} else {
 			pbx_builtin_setvar_helper(chan, "RECEIVESFSTATUS", "HANGUP");
+			res = -1;
 		}
 	}
 	if (dsp) {
 		ast_dsp_free(dsp);
 	}
 	ast_debug(3, "channel '%s' - event loop stopped { timeout: %d, remaining_time: %d }\n", ast_channel_name(chan), timeout, remaining_time);
-	return 0;
+	return res;
 }
 
 static int read_sf_exec(struct ast_channel *chan, const char *data)
@@ -297,7 +314,7 @@
 	double tosec;
 	struct ast_flags flags = {0};
 	char *argcopy = NULL;
-	int features = 0, digits = 0, to = 0, freq = 2600;
+	int res, features = 0, digits = 0, to = 0, freq = 2600;
 
 	AST_DECLARE_APP_ARGS(arglist,
 		AST_APP_ARG(variable);
@@ -360,14 +377,14 @@
 		features |= DSP_DIGITMODE_RELAXDTMF;
 	}
 
-	read_sf_digits(chan, tmp, BUFFER_SIZE, to, digits, freq, features, ast_test_flag(&flags, OPT_EXTRAPULSES));
+	res = read_sf_digits(chan, tmp, BUFFER_SIZE, to, digits, freq, features, ast_test_flag(&flags, OPT_EXTRAPULSES));
 	pbx_builtin_setvar_helper(chan, arglist.variable, tmp);
 	if (!ast_strlen_zero(tmp)) {
 		ast_verb(3, "SF digits received: '%s'\n", tmp);
-	} else {
+	} else if (!res) { /* if channel hung up, don't print anything out */
 		ast_verb(3, "No SF digits received.\n");
 	}
-	return 0;
+	return res;
 }
 
 static int sendsf_exec(struct ast_channel *chan, const char *vdata)

-- 
To view, visit https://gerrit.asterisk.org/c/asterisk/+/18284
To unsubscribe, or for help writing mail filters, visit https://gerrit.asterisk.org/settings

Gerrit-Project: asterisk
Gerrit-Branch: 16
Gerrit-Change-Id: I234d755050ab8ed58f197c6925b968ba26b14033
Gerrit-Change-Number: 18284
Gerrit-PatchSet: 5
Gerrit-Owner: N A <mail at interlinked.x10host.com>
Gerrit-Reviewer: Benjamin Keith Ford <bford at digium.com>
Gerrit-Reviewer: Friendly Automation
Gerrit-Reviewer: Joshua Colp <jcolp at sangoma.com>
Gerrit-Reviewer: Kevin Harwell <kharwell at digium.com>
Gerrit-MessageType: merged
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-code-review/attachments/20220408/bc894330/attachment-0001.html>


More information about the asterisk-code-review mailing list