From bce37d3b2f515d36a7e79e399b08f61190cf4a8f Mon Sep 17 00:00:00 2001 From: Naveen Albert Date: Tue, 30 Sep 2025 10:25:01 -0400 Subject: [PATCH] app_dial: Allow fractional seconds for dial timeouts. Even though Dial() internally uses milliseconds for its dial timeouts, this capability has been mostly obscured from users as the argument is only parsed as an integer, thus forcing the use of whole seconds for timeouts. Parse it as a decimal instead so that timeouts can now truly have millisecond precision. Resolves: #1487 UserNote: The answer and progress dial timeouts now have millisecond precision, instead of having to be whole numbers. --- apps/app_dial.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/apps/app_dial.c b/apps/app_dial.c index cdcdf0af4c..64ed151767 100644 --- a/apps/app_dial.c +++ b/apps/app_dial.c @@ -97,6 +97,7 @@ If a second argument is specified, this controls the number of seconds we attempt to dial the specified devices without receiving early media or ringing. If neither progress, ringing, nor voice frames have been received when this timeout expires, the call will be treated as a CHANUNAVAIL. This can be used to skip destinations that may not be responsive. + The timeouts need not be whole numbers; both arguments accept fractional seconds. @@ -3000,22 +3001,23 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast to_answer = -1; to_progress = -1; } else { + double tmp; char *anstimeout = strsep(&args.timeout, "^"); if (!ast_strlen_zero(anstimeout)) { - to_answer = atoi(anstimeout); - if (to_answer > 0) { - to_answer *= 1000; + if (sscanf(anstimeout, "%30lf", &tmp) == 1 && tmp > 0) { + to_answer = tmp * 1000; + ast_debug(3, "Dial timeout set to %d ms\n", to_answer); } else { - ast_log(LOG_WARNING, "Invalid answer timeout specified: '%s'. Setting timeout to infinite\n", args.timeout); + ast_log(LOG_WARNING, "Invalid answer timeout specified: '%s'. Setting timeout to infinite\n", anstimeout); to_answer = -1; } } else { to_answer = -1; } if (!ast_strlen_zero(args.timeout)) { - to_progress = atoi(args.timeout); - if (to_progress > 0) { - to_progress *= 1000; + if (sscanf(args.timeout, "%30lf", &tmp) == 1 && tmp > 0) { + to_progress = tmp * 1000; + ast_debug(3, "Dial progress timeout set to %d ms\n", to_progress); } else { ast_log(LOG_WARNING, "Invalid progress timeout specified: '%s'. Setting timeout to infinite\n", args.timeout); to_progress = -1;