]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
features.c: Make Bridge application tolerate unspecified channel.
authorRichard Mudgett <rmudgett@digium.com>
Mon, 30 Dec 2019 00:36:54 +0000 (18:36 -0600)
committerRichard Mudgett <rmudgett@digium.com>
Mon, 6 Jan 2020 03:17:06 +0000 (21:17 -0600)
The Bridge application was inconsistent if the channel to bridge with is
not specified.  If no parameters are given then a warning is issued and
the current channel is hung up.  If options are given but no channel is
specified then a warning is issued and the current channel is not hung up.

* Made the Bridge application give a verbose message instead of a warning
if the channel to bridge with is not specified and made not hang up the
current channel.  As a result dialplan no longer needs to check if a
channel name is passed before calling Bridge and simply needs to check the
BRIDGERESULT channel variable instead.  This is something you likely want
your dialplan to do anyway.

* Fixed up L() option warning message.  It is up to the caller to
determine if the channel is hung up because of the warning.  Dial() hangs
up the current channel while Bridge() does not.

Change-Id: I44349a8dc3912397f28852777de04f19e7bb9c73

main/features.c

index 21e6c22b52dea22a5557b6db8b1a9c6782c902a1..d306a13e6febd65f6e83488e26087632c2506a22 100644 (file)
@@ -85,7 +85,9 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
                </synopsis>
                <syntax>
                        <parameter name="channel" required="true">
-                               <para>The current channel is bridged to the specified <replaceable>channel</replaceable>.</para>
+                               <para>The current channel is bridged to the channel
+                               identified by the channel name, channel name prefix, or channel
+                               uniqueid.</para>
                        </parameter>
                        <parameter name="options">
                                <optionlist>
@@ -895,7 +897,7 @@ int ast_bridge_timelimit(struct ast_channel *chan, struct ast_bridge_config *con
                config->warning_freq = atol(warnfreq_str);
 
        if (!config->timelimit) {
-               ast_log(LOG_WARNING, "Bridge does not accept L(%s), hanging up.\n", limit_str);
+               ast_log(LOG_WARNING, "Bridge does not accept L(%s)\n", limit_str);
                config->timelimit = config->play_warning = config->warning_freq = 0;
                config->warning_sound = NULL;
                return -1; /* error */
@@ -998,7 +1000,7 @@ int ast_bridge_timelimit(struct ast_channel *chan, struct ast_bridge_config *con
  */
 static int bridge_exec(struct ast_channel *chan, const char *data)
 {
-       struct ast_channel *current_dest_chan;
+       struct ast_channel *current_dest_chan = NULL;
        char *tmp_data  = NULL;
        struct ast_flags opts = { 0, };
        struct ast_bridge_config bconfig = { { 0, }, };
@@ -1019,22 +1021,20 @@ static int bridge_exec(struct ast_channel *chan, const char *data)
                AST_APP_ARG(options);
        );
 
-       if (ast_strlen_zero(data)) {
-               ast_log(LOG_WARNING, "Bridge require at least 1 argument specifying the other end of the bridge\n");
-               return -1;
-       }
-
-       tmp_data = ast_strdupa(data);
+       tmp_data = ast_strdupa(data ?: "");
        AST_STANDARD_APP_ARGS(args, tmp_data);
-       if (!ast_strlen_zero(args.options))
+       if (!ast_strlen_zero(args.options)) {
                ast_app_parse_options(bridge_exec_options, &opts, opt_args, args.options);
+       }
 
        /* make sure we have a valid end point */
-       current_dest_chan = ast_channel_get_by_name_prefix(args.dest_chan,
-               strlen(args.dest_chan));
+       if (!ast_strlen_zero(args.dest_chan)) {
+               current_dest_chan = ast_channel_get_by_name_prefix(args.dest_chan,
+                       strlen(args.dest_chan));
+       }
        if (!current_dest_chan) {
-               ast_log(LOG_WARNING, "Bridge failed because channel %s does not exist\n",
-                       args.dest_chan);
+               ast_verb(4, "Bridge failed because channel '%s' does not exist\n",
+                       args.dest_chan ?: "");
                pbx_builtin_setvar_helper(chan, "BRIDGERESULT", "NONEXISTENT");
                return 0;
        }