summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/asterisk/pbx.h60
-rw-r--r--main/manager.c3
-rw-r--r--main/pbx.c2
3 files changed, 57 insertions, 8 deletions
diff --git a/include/asterisk/pbx.h b/include/asterisk/pbx.h
index 825dae7bd..54e116ae0 100644
--- a/include/asterisk/pbx.h
+++ b/include/asterisk/pbx.h
@@ -1083,13 +1083,59 @@ 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);
-/*! Synchronously or asynchronously make an outbound call and send it to a
- particular extension */
-int ast_pbx_outgoing_exten(const char *type, struct ast_format_cap *cap, const char *addr, int timeout, const char *context, const char *exten, int priority, int *reason, int sync, const char *cid_num, const char *cid_name, struct ast_variable *vars, const char *account, struct ast_channel **locked_channel, int early_media);
-
-/*! Synchronously or asynchronously make an outbound call and send it to a
- particular application with given extension */
-int ast_pbx_outgoing_app(const char *type, struct ast_format_cap *cap, const char *addr, int timeout, const char *app, const char *appdata, int *reason, int sync, const char *cid_num, const char *cid_name, struct ast_variable *vars, const char *account, struct ast_channel **locked_channel);
+/*! \brief Synchronously or asynchronously make an outbound call and send it to a
+ * particular extension
+ *
+ * \param type The channel technology to create
+ * \param cap The format capabilities for the channel
+ * \param addr Address data to pass to the channel technology driver
+ * \param timeout How long we should attempt to dial the outbound channel
+ * \param context The destination context for the outbound channel
+ * \param exten The destination extension for the outbound channel
+ * \param priority The destination priority for the outbound channel
+ * \param reason Optional. If provided, the hangup cause code of the outbound channel if
+ * it failed
+ * \param sync If non-zero, block until the outbound channel answers
+ * \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
+ * \param account The accountcode for the outbound channel
+ * \param locked_channel Optional. The outbound channel that was created. This is returned
+ * both locked and reference bumped. If a caller provides a channel parameter, it must
+ * unlock the channel and decrement the reference count.
+ * \param early_media If non-zero, allow early-media on the originated channel
+ */
+int ast_pbx_outgoing_exten(const char *type, struct ast_format_cap *cap, const char *addr,
+ int timeout, const char *context, const char *exten, int priority, int *reason,
+ int sync, const char *cid_num, const char *cid_name, struct ast_variable *vars,
+ const char *account, struct ast_channel **locked_channel, int early_media);
+
+/*! \brief Synchronously or asynchronously make an outbound call and execute an
+ * application on the channel.
+ *
+ * Note that when the application stops executing, the channel is hungup.
+ *
+ * \param type The channel technology to create
+ * \param cap The format capabilities for the channel
+ * \param addr Address data to pass to the channel technology driver
+ * \param timeout How long we should attempt to dial the outbound channel
+ * \param app The name of the application to execute
+ * \param appdata Data to pass to the application
+ * \param reason Optional. If provided, the hangup cause code of the outbound channel if
+ * it failed
+ * \param sync If non-zero, block until the outbound channel answers
+ * \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
+ * \param account The accountcode for the outbound channel
+ * \param locked_channel Optional. The outbound channel that was created. This is returned
+ * both locked and reference bumped. If a caller provides a channel parameter, it must
+ * unlock the channel and decrement the reference count.
+ */
+int ast_pbx_outgoing_app(const char *type, struct ast_format_cap *cap, const char *addr,
+ int timeout, const char *app, const char *appdata, int *reason, int sync,
+ const char *cid_num, const char *cid_name, struct ast_variable *vars,
+ const char *account, struct ast_channel **locked_channel);
/*!
* \brief Evaluate a condition
diff --git a/main/manager.c b/main/manager.c
index 7e5b1080c..ec031303b 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -4329,9 +4329,10 @@ static void *fast_originate(void *data)
S_OR(in->cid_name, "<unknown>")
);
- /* Locked by ast_pbx_outgoing_exten or ast_pbx_outgoing_app */
+ /* Locked and ref'd by ast_pbx_outgoing_exten or ast_pbx_outgoing_app */
if (chan) {
ast_channel_unlock(chan);
+ ast_channel_unref(chan);
}
destroy_fast_originate_helper(in);
return NULL;
diff --git a/main/pbx.c b/main/pbx.c
index db737327f..8079edc62 100644
--- a/main/pbx.c
+++ b/main/pbx.c
@@ -9967,6 +9967,7 @@ static int pbx_outgoing_attempt(const char *type, struct ast_format_cap *cap, co
if (channel) {
*channel = dialed;
+ ast_channel_ref(*channel);
ast_channel_lock(*channel);
}
@@ -9981,6 +9982,7 @@ static int pbx_outgoing_attempt(const char *type, struct ast_format_cap *cap, co
ast_log(LOG_WARNING, "Unable to spawn dialing thread for '%s/%s'\n", type, addr);
if (channel) {
ast_channel_unlock(*channel);
+ ast_channel_unref(*channel);
}
ao2_ref(outgoing, -1);
return -1;