]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
manager: Restore Originate failure behavior from Asterisk 11 13/4913/3
authorSean Bright <sean.bright@gmail.com>
Thu, 9 Feb 2017 16:01:22 +0000 (11:01 -0500)
committerSean Bright <sean.bright@gmail.com>
Fri, 10 Feb 2017 23:01:54 +0000 (18:01 -0500)
In Asterisk 11, if the 'Originate' AMI command failed to connect the provided
Channel while in extension mode, a 'failed' extension would be looked up and
run. This was, I believe, unintentionally removed in 51b6c49. This patch
restores that behavior.

This also adds an enum for the various 'synchronous' modes in an attempt to
make them meaningful.

ASTERISK-26115 #close
Reported by: Nasir Iqbal

Change-Id: I8afbd06725e99610e02adb529137d4800c05345d

apps/app_originate.c
funcs/func_periodic_hook.c
include/asterisk/pbx.h
main/manager.c
main/pbx.c
pbx/pbx_spool.c
res/res_clioriginate.c

index 15898b2400177a47b45ce0563a70e13dfb3aff96..eb4d634325ffa95802b604f87f3617c8da74c709 100644 (file)
@@ -178,15 +178,15 @@ static int originate_exec(struct ast_channel *chan, const char *data)
                                chantech, chandata, args.arg1, exten, priority);
 
                ast_pbx_outgoing_exten(chantech, cap_slin, chandata,
-                               timeout * 1000, args.arg1, exten, priority, &outgoing_status, 1, NULL,
-                               NULL, NULL, NULL, NULL, 0, NULL);
+                               timeout * 1000, args.arg1, exten, priority, &outgoing_status,
+                               AST_OUTGOING_WAIT, NULL, NULL, NULL, NULL, NULL, 0, NULL);
        } else if (!strcasecmp(args.type, "app")) {
                ast_debug(1, "Originating call to '%s/%s' and connecting them to %s(%s)\n",
                                chantech, chandata, args.arg1, S_OR(args.arg2, ""));
 
                ast_pbx_outgoing_app(chantech, cap_slin, chandata,
-                               timeout * 1000, args.arg1, args.arg2, &outgoing_status, 1, NULL,
-                               NULL, NULL, NULL, NULL, NULL);
+                               timeout * 1000, args.arg1, args.arg2, &outgoing_status,
+                               AST_OUTGOING_WAIT, NULL, NULL, NULL, NULL, NULL, NULL);
        } else {
                ast_log(LOG_ERROR, "Incorrect type, it should be 'exten' or 'app': %s\n",
                                args.type);
index cb019b41e91436ccf7597840daa71e7934ceca15..f459e357683e7306e00b986034f987c4a0e97b1e 100644 (file)
@@ -183,8 +183,8 @@ static void *hook_launch_thread(void *data)
        };
 
        ast_pbx_outgoing_exten("Local", NULL, full_exten_name, 60,
-                       arg->context, arg->exten, 1, NULL, 0, NULL, NULL, &chan_name_var,
-                       NULL, NULL, 1, NULL);
+                       arg->context, arg->exten, 1, NULL, AST_OUTGOING_NO_WAIT,
+                       NULL, NULL, &chan_name_var, NULL, NULL, 1, NULL);
 
        hook_thread_arg_destroy(arg);
 
index 1fc8df8c9f510979c09ed10e36ffe05cc99dbe6f..770a1a9843534e4deee899ff649451a2d5abd25b 100644 (file)
@@ -1130,6 +1130,12 @@ int ast_async_goto(struct ast_channel *chan, const char *context, const char *ex
  */
 int ast_async_goto_by_name(const char *chan, const char *context, const char *exten, int priority);
 
+enum ast_pbx_outgoing_sync {
+       AST_OUTGOING_NO_WAIT = 0,       /*!< Don't wait for originated call to answer */
+       AST_OUTGOING_WAIT = 1,          /*!< Wait for originated call to answer */
+       AST_OUTGOING_WAIT_COMPLETE = 2, /*!< Wait for originated call to answer and hangup */
+};
+
 /*!
  * \brief Synchronously or asynchronously make an outbound call and send it to a
  * particular extension
@@ -1143,11 +1149,15 @@ int ast_async_goto_by_name(const char *chan, const char *context, const char *ex
  * \param priority The destination priority for the outbound channel
  * \param reason Optional.  If provided, the dialed status of the outgoing channel.
  *        Codes are AST_CONTROL_xxx values.  Valid only if synchronous is non-zero.
- * \param synchronous If zero then don't wait for anything.
- *        If one then block until the outbound channel answers or the call fails.
- *        If greater than one then wait for the call to complete or if the call doesn't
- *        answer and failed@context exists then run a channel named OutgoingSpoolFailed
- *        at failed@context.
+ * \param synchronous defined by the ast_pbx_outgoing_sync enum.
+ *        If \c AST_OUTGOING_NO_WAIT then don't wait for anything.
+ *        If \c AST_OUTGOING_WAIT then block until the outbound channel answers or
+ *        the call fails.
+ *        If \c AST_OUTGOING_WAIT_COMPLETE then wait for the call to complete or
+ *        fail.
+ *        If \c AST_OUTGOING_WAIT or \c AST_OUTGOING_WAIT_COMPLETE is specified,
+ *        the call doesn't answer, and \c failed@context exists then run a channel
+ *        named \c OutgoingSpoolFailed at \c failed@context.
  * \param cid_num The caller ID number to set on the outbound channel
  * \param cid_name The caller ID name to set on the outbound channel
  * \param vars Variables to set on the outbound channel
@@ -1181,9 +1191,12 @@ int ast_pbx_outgoing_exten(const char *type, struct ast_format_cap *cap, const c
  * \param appdata Data to pass to the application
  * \param reason Optional.  If provided, the dialed status of the outgoing channel.
  *        Codes are AST_CONTROL_xxx values.  Valid only if synchronous is non-zero.
- * \param synchronous If zero then don't wait for anything.
- *        If one then block until the outbound channel answers or the call fails.
- *        If greater than one then wait for the call to complete.
+ * \param synchronous defined by the ast_pbx_outgoing_sync enum.
+ *        If \c AST_OUTGOING_NO_WAIT then don't wait for anything.
+ *        If \c AST_OUTGOING_WAIT then block until the outbound channel answers or
+ *        the call fails.
+ *        If \c AST_OUTGOING_WAIT_COMPLETE then wait for the call to complete or
+ *        fail.
  * \param cid_num The caller ID number to set on the outbound channel
  * \param cid_name The caller ID name to set on the outbound channel
  * \param vars Variables to set on the outbound channel
index 251085a81301ae60b68d327b3ed3d97ce6a90920..00e8420c3097daad0d05e451493bf17b87ace7c2 100644 (file)
@@ -5096,13 +5096,15 @@ static void *fast_originate(void *data)
 
        if (!ast_strlen_zero(in->app)) {
                res = ast_pbx_outgoing_app(in->tech, in->cap, in->data,
-                       in->timeout, in->app, in->appdata, &reason, 1,
+                       in->timeout, in->app, in->appdata, &reason,
+                       AST_OUTGOING_WAIT,
                        S_OR(in->cid_num, NULL),
                        S_OR(in->cid_name, NULL),
                        in->vars, in->account, &chan, &assignedids);
        } else {
                res = ast_pbx_outgoing_exten(in->tech, in->cap, in->data,
-                       in->timeout, in->context, in->exten, in->priority, &reason, 1,
+                       in->timeout, in->context, in->exten, in->priority, &reason,
+                       AST_OUTGOING_WAIT,
                        S_OR(in->cid_num, NULL),
                        S_OR(in->cid_name, NULL),
                        in->vars, in->account, &chan, in->early_media, &assignedids);
@@ -5573,11 +5575,16 @@ static int action_originate(struct mansession *s, const struct message *m)
                        }
                }
        } else if (!ast_strlen_zero(app)) {
-               res = ast_pbx_outgoing_app(tech, cap, data, to, app, appdata, &reason, 1, l, n, vars, account, NULL, assignedids.uniqueid ? &assignedids : NULL);
+               res = ast_pbx_outgoing_app(tech, cap, data, to, app, appdata, &reason,
+                               AST_OUTGOING_WAIT, l, n, vars, account, NULL,
+                               assignedids.uniqueid ? &assignedids : NULL);
                ast_variables_destroy(vars);
        } else {
                if (exten && context && pi) {
-                       res = ast_pbx_outgoing_exten(tech, cap, data, to, context, exten, pi, &reason, 1, l, n, vars, account, NULL, bridge_early, assignedids.uniqueid ? &assignedids : NULL);
+                       res = ast_pbx_outgoing_exten(tech, cap, data, to,
+                                       context, exten, pi, &reason, AST_OUTGOING_WAIT,
+                                       l, n, vars, account, NULL, bridge_early,
+                                       assignedids.uniqueid ? &assignedids : NULL);
                        ast_variables_destroy(vars);
                } else {
                        astman_send_error(s, m, "Originate with 'Exten' requires 'Context' and 'Priority'");
index 5002999b4fb0a71030eb8444a89db701a9ff9cc2..5ac97aad4a146664570d316a44cf1236af86afb7 100644 (file)
@@ -7768,7 +7768,7 @@ int ast_pbx_outgoing_exten(const char *type, struct ast_format_cap *cap, const c
                early_media, assignedids);
 
        if (res < 0 /* Call failed to get connected for some reason. */
-               && 1 < synchronous
+               && 0 < synchronous
                && ast_exists_extension(NULL, context, "failed", 1, NULL)) {
                struct ast_channel *failed;
 
index 4228be9b09ee34d591bed9a996f5d20ee87a11dc..444f74d8b7477e9113d4212eecf737648f1bd63e 100644 (file)
@@ -399,15 +399,17 @@ static void *attempt_thread(void *data)
        int res, reason;
        if (!ast_strlen_zero(o->app)) {
                ast_verb(3, "Attempting call on %s/%s for application %s(%s) (Retry %d)\n", o->tech, o->dest, o->app, o->data, o->retries);
-               res = ast_pbx_outgoing_app(o->tech, o->capabilities, o->dest, o->waittime * 1000,
-                       o->app, o->data, &reason, 2 /* wait to finish */, o->cid_num, o->cid_name,
+               res = ast_pbx_outgoing_app(o->tech, o->capabilities, o->dest,
+                       o->waittime * 1000, o->app, o->data, &reason,
+                       AST_OUTGOING_WAIT_COMPLETE, o->cid_num, o->cid_name,
                        o->vars, o->account, NULL, NULL);
        } else {
                ast_verb(3, "Attempting call on %s/%s for %s@%s:%d (Retry %d)\n", o->tech, o->dest, o->exten, o->context,o->priority, o->retries);
                res = ast_pbx_outgoing_exten(o->tech, o->capabilities, o->dest,
                        o->waittime * 1000, o->context, o->exten, o->priority, &reason,
-                       2 /* wait to finish */, o->cid_num, o->cid_name, o->vars, o->account, NULL,
-                       ast_test_flag(&o->options, SPOOL_FLAG_EARLY_MEDIA), NULL);
+                       AST_OUTGOING_WAIT_COMPLETE, o->cid_num, o->cid_name,
+                       o->vars, o->account, NULL, ast_test_flag(&o->options, SPOOL_FLAG_EARLY_MEDIA),
+                       NULL);
        }
        if (res) {
                ast_log(LOG_NOTICE, "Call failed to go through, reason (%d) %s\n", reason, ast_channel_reason2str(reason));
index 3903b6c3b8a5e0f2da13191d6c0e5c5707e67002..4303711f1281222d97e920f0744be960a25a054b 100644 (file)
@@ -74,7 +74,9 @@ static char *orig_app(int fd, const char *chan, const char *app, const char *app
                return CLI_FAILURE;
        }
        ast_format_cap_append(cap, ast_format_slin, 0);
-       ast_pbx_outgoing_app(chantech, cap, chandata, TIMEOUT * 1000, app, appdata, &reason, 0, NULL, NULL, NULL, NULL, NULL, NULL);
+       ast_pbx_outgoing_app(chantech, cap, chandata, TIMEOUT * 1000, app, appdata,
+                       &reason, AST_OUTGOING_NO_WAIT, NULL, NULL, NULL, NULL,
+                       NULL, NULL);
        ao2_ref(cap, -1);
 
        return CLI_SUCCESS;
@@ -118,7 +120,9 @@ static char *orig_exten(int fd, const char *chan, const char *data)
                return CLI_FAILURE;
        }
        ast_format_cap_append(cap, ast_format_slin, 0);
-       ast_pbx_outgoing_exten(chantech, cap, chandata, TIMEOUT * 1000, context, exten, 1, &reason, 0, NULL, NULL, NULL, NULL, NULL, 0, NULL);
+       ast_pbx_outgoing_exten(chantech, cap, chandata, TIMEOUT * 1000, context,
+                       exten, 1, &reason, AST_OUTGOING_NO_WAIT, NULL, NULL,
+                       NULL, NULL, NULL, 0, NULL);
        ao2_ref(cap, -1);
 
        return CLI_SUCCESS;