summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
Diffstat (limited to 'main')
-rw-r--r--main/aoc.c14
-rw-r--r--main/asterisk.c6
-rw-r--r--main/bridge.c12
-rw-r--r--main/features.c14
-rw-r--r--main/manager.c91
-rw-r--r--main/manager_bridges.c46
-rw-r--r--main/manager_channels.c56
-rw-r--r--main/pbx.c8
-rw-r--r--main/rtp_engine.c6
-rw-r--r--main/sorcery.c134
-rw-r--r--main/stasis.c1
-rw-r--r--main/stasis_bridges.c6
-rw-r--r--main/utils.c12
13 files changed, 330 insertions, 76 deletions
diff --git a/main/aoc.c b/main/aoc.c
index 54edafad6..cd9c461c1 100644
--- a/main/aoc.c
+++ b/main/aoc.c
@@ -85,6 +85,10 @@ ASTERISK_REGISTER_FILE();
</parameter>
<parameter name="SpecialCode" />
</syntax>
+ <see-also>
+ <ref type="managerEvent">AOC-D</ref>
+ <ref type="managerEvent">AOC-E</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
<managerEvent language="en_US" name="AOC-D">
@@ -138,6 +142,11 @@ ASTERISK_REGISTER_FILE();
<parameter name="NumberOf" />
<parameter name="TypeOf" />
</syntax>
+ <see-also>
+ <ref type="manager">AOCMessage</ref>
+ <ref type="managerEvent">AOC-S</ref>
+ <ref type="managerEvent">AOC-E</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
<managerEvent language="en_US" name="AOC-E">
@@ -151,6 +160,11 @@ ASTERISK_REGISTER_FILE();
<parameter name="ID" />
<xi:include xpointer="xpointer(/docs/managerEvent[@name='AOC-D']/managerEventInstance/syntax/parameter)" />
</syntax>
+ <see-also>
+ <ref type="manager">AOCMessage</ref>
+ <ref type="managerEvent">AOC-S</ref>
+ <ref type="managerEvent">AOC-D</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
***/
diff --git a/main/asterisk.c b/main/asterisk.c
index 50d8af24a..3c2ca259e 100644
--- a/main/asterisk.c
+++ b/main/asterisk.c
@@ -3661,10 +3661,10 @@ static void ast_readconfig(void)
} else if (!strcasecmp(v->name, "entityid")) {
struct ast_eid tmp_eid;
if (!ast_str_to_eid(&tmp_eid, v->value)) {
- ast_verbose("Successfully set global EID to '%s'\n", v->value);
ast_eid_default = tmp_eid;
- } else
- ast_verbose("Invalid Entity ID '%s' provided\n", v->value);
+ } else {
+ ast_log(LOG_WARNING, "Invalid Entity ID '%s' provided\n", v->value);
+ }
} else if (!strcasecmp(v->name, "lightbackground")) {
ast_set2_flag(&ast_options, ast_true(v->value), AST_OPT_FLAG_LIGHT_BACKGROUND);
} else if (!strcasecmp(v->name, "forceblackbackground")) {
diff --git a/main/bridge.c b/main/bridge.c
index 68ac24bba..e92875d17 100644
--- a/main/bridge.c
+++ b/main/bridge.c
@@ -38,6 +38,10 @@
<description>
<para>Returns detailed information about the available bridging technologies.</para>
</description>
+ <see-also>
+ <ref type="manager">BridgeTechnologySuspend</ref>
+ <ref type="manager">BridgeTechnologyUnsuspend</ref>
+ </see-also>
</manager>
<manager name="BridgeTechnologySuspend" language="en_US">
<synopsis>
@@ -52,6 +56,10 @@
<description>
<para>Marks a bridging technology as suspended, which prevents subsequently created bridges from using it.</para>
</description>
+ <see-also>
+ <ref type="manager">BridgeTechnologySuspend</ref>
+ <ref type="manager">BridgeTechnologyUnsuspend</ref>
+ </see-also>
</manager>
<manager name="BridgeTechnologyUnsuspend" language="en_US">
<synopsis>
@@ -66,6 +74,10 @@
<description>
<para>Clears a previously suspended bridging technology, which allows subsequently created bridges to use it.</para>
</description>
+ <see-also>
+ <ref type="manager">BridgeTechnologyList</ref>
+ <ref type="manager">BridgeTechnologySuspend</ref>
+ </see-also>
</manager>
***/
diff --git a/main/features.c b/main/features.c
index 4062e96ce..0af5a78e3 100644
--- a/main/features.c
+++ b/main/features.c
@@ -202,6 +202,11 @@ ASTERISK_REGISTER_FILE()
</variable>
</variablelist>
</description>
+ <see-also>
+ <ref type="manager">Bridge</ref>
+ <ref type="managerEvent">BridgeCreate</ref>
+ <ref type="managerEvent">BridgeEnter</ref>
+ </see-also>
</application>
<manager name="Bridge" language="en_US">
<synopsis>
@@ -228,6 +233,15 @@ ASTERISK_REGISTER_FILE()
<description>
<para>Bridge together two channels already in the PBX.</para>
</description>
+ <see-also>
+ <ref type="application">Bridge</ref>
+ <ref type="managerEvent">BridgeCreate</ref>
+ <ref type="managerEvent">BridgeEnter</ref>
+ <ref type="manager">BridgeDestroy</ref>
+ <ref type="manager">BridgeInfo</ref>
+ <ref type="manager">BridgeKick</ref>
+ <ref type="manager">BridgeList</ref>
+ </see-also>
</manager>
***/
diff --git a/main/manager.c b/main/manager.c
index 029da70f7..32322b8c5 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -149,6 +149,9 @@ ASTERISK_REGISTER_FILE()
<description>
<para>Logoff the current manager session.</para>
</description>
+ <see-also>
+ <ref type="manager">Login</ref>
+ </see-also>
</manager>
<manager name="Login" language="en_US">
<synopsis>
@@ -168,6 +171,9 @@ ASTERISK_REGISTER_FILE()
<description>
<para>Login Manager.</para>
</description>
+ <see-also>
+ <ref type="manager">Logoff</ref>
+ </see-also>
</manager>
<manager name="Challenge" language="en_US">
<synopsis>
@@ -329,6 +335,9 @@ ASTERISK_REGISTER_FILE()
<para>If a channel name is not provided then the variable is considered global.</para>
</note>
</description>
+ <see-also>
+ <ref type="manager">Getvar</ref>
+ </see-also>
</manager>
<manager name="Getvar" language="en_US">
<synopsis>
@@ -349,6 +358,9 @@ ASTERISK_REGISTER_FILE()
<para>If a channel name is not provided then the variable is considered global.</para>
</note>
</description>
+ <see-also>
+ <ref type="manager">Setvar</ref>
+ </see-also>
</manager>
<manager name="GetConfig" language="en_US">
<synopsis>
@@ -381,6 +393,12 @@ ASTERISK_REGISTER_FILE()
In the case where a category name is non-unique, a filter may be specified
to match only categories with matching variable values.</para>
</description>
+ <see-also>
+ <ref type="manager">GetConfigJSON</ref>
+ <ref type="manager">UpdateConfig</ref>
+ <ref type="manager">CreateConfig</ref>
+ <ref type="manager">ListCategories</ref>
+ </see-also>
</manager>
<manager name="GetConfigJSON" language="en_US">
<synopsis>
@@ -405,6 +423,12 @@ ASTERISK_REGISTER_FILE()
In the case where a category name is non-unique, a filter may be specified
to match only categories with matching variable values.</para>
</description>
+ <see-also>
+ <ref type="manager">GetConfig</ref>
+ <ref type="manager">UpdateConfig</ref>
+ <ref type="manager">CreateConfig</ref>
+ <ref type="manager">ListCategories</ref>
+ </see-also>
</manager>
<manager name="UpdateConfig" language="en_US">
<synopsis>
@@ -496,6 +520,12 @@ ASTERISK_REGISTER_FILE()
<para>This action will modify, create, or delete configuration elements
in Asterisk configuration files.</para>
</description>
+ <see-also>
+ <ref type="manager">GetConfig</ref>
+ <ref type="manager">GetConfigJSON</ref>
+ <ref type="manager">CreateConfig</ref>
+ <ref type="manager">ListCategories</ref>
+ </see-also>
</manager>
<manager name="CreateConfig" language="en_US">
<synopsis>
@@ -512,6 +542,12 @@ ASTERISK_REGISTER_FILE()
directory. This action is intended to be used before an UpdateConfig
action.</para>
</description>
+ <see-also>
+ <ref type="manager">GetConfig</ref>
+ <ref type="manager">GetConfigJSON</ref>
+ <ref type="manager">UpdateConfig</ref>
+ <ref type="manager">ListCategories</ref>
+ </see-also>
</manager>
<manager name="ListCategories" language="en_US">
<synopsis>
@@ -526,6 +562,12 @@ ASTERISK_REGISTER_FILE()
<description>
<para>This action will dump the categories in a given file.</para>
</description>
+ <see-also>
+ <ref type="manager">GetConfig</ref>
+ <ref type="manager">GetConfigJSON</ref>
+ <ref type="manager">UpdateConfig</ref>
+ <ref type="manager">CreateConfig</ref>
+ </see-also>
</manager>
<manager name="Redirect" language="en_US">
<synopsis>
@@ -561,6 +603,9 @@ ASTERISK_REGISTER_FILE()
<description>
<para>Redirect (transfer) a call.</para>
</description>
+ <see-also>
+ <ref type="manager">BlindTransfer</ref>
+ </see-also>
</manager>
<manager name="Atxfer" language="en_US">
<synopsis>
@@ -581,6 +626,9 @@ ASTERISK_REGISTER_FILE()
<description>
<para>Attended transfer.</para>
</description>
+ <see-also>
+ <ref type="managerEvent">AttendedTransfer</ref>
+ </see-also>
</manager>
<manager name="Originate" language="en_US">
<synopsis>
@@ -705,6 +753,9 @@ ASTERISK_REGISTER_FILE()
<para>Will return an <literal>Extension Status</literal> message. The response will include
the hint for the extension and the status.</para>
</description>
+ <see-also>
+ <ref type="managerEvent">ExtensionStatus</ref>
+ </see-also>
</manager>
<manager name="PresenceState" language="en_US">
<synopsis>
@@ -721,6 +772,9 @@ ASTERISK_REGISTER_FILE()
<para>Will return a <literal>Presence State</literal> message. The response will include the
presence state and, if set, a presence subtype and custom message.</para>
</description>
+ <see-also>
+ <ref type="managerEvent">PresenceStatus</ref>
+ </see-also>
</manager>
<manager name="AbsoluteTimeout" language="en_US">
<synopsis>
@@ -758,6 +812,9 @@ ASTERISK_REGISTER_FILE()
<para>Waiting: <literal>0</literal> if messages waiting, <literal>1</literal>
if no messages waiting.</para>
</description>
+ <see-also>
+ <ref type="manager">MailboxCount</ref>
+ </see-also>
</manager>
<manager name="MailboxCount" language="en_US">
<synopsis>
@@ -778,6 +835,9 @@ ASTERISK_REGISTER_FILE()
<para>NewMessages: <replaceable>count</replaceable></para>
<para>OldMessages: <replaceable>count</replaceable></para>
</description>
+ <see-also>
+ <ref type="manager">MailboxStatus</ref>
+ </see-also>
</manager>
<manager name="ListCommands" language="en_US">
<synopsis>
@@ -827,6 +887,10 @@ ASTERISK_REGISTER_FILE()
<description>
<para>Send an event to manager sessions.</para>
</description>
+ <see-also>
+ <ref type="managerEvent">UserEvent</ref>
+ <ref type="application">UserEvent</ref>
+ </see-also>
</manager>
<manager name="WaitEvent" language="en_US">
<synopsis>
@@ -879,6 +943,9 @@ ASTERISK_REGISTER_FILE()
<description>
<para>Send a reload event.</para>
</description>
+ <see-also>
+ <ref type="manager">ModuleLoad</ref>
+ </see-also>
</manager>
<managerEvent language="en_US" name="CoreShowChannel">
<managerEventInstance class="EVENT_FLAG_CALL">
@@ -991,6 +1058,10 @@ ASTERISK_REGISTER_FILE()
<description>
<para>Loads, unloads or reloads an Asterisk module in a running system.</para>
</description>
+ <see-also>
+ <ref type="manager">Reload</ref>
+ <ref type="manager">ModuleCheck</ref>
+ </see-also>
</manager>
<manager name="ModuleCheck" language="en_US">
<synopsis>
@@ -1006,6 +1077,9 @@ ASTERISK_REGISTER_FILE()
<para>Checks if Asterisk module is loaded. Will return Success/Failure.
For success returns, the module revision number is included.</para>
</description>
+ <see-also>
+ <ref type="manager">ModuleLoad</ref>
+ </see-also>
</manager>
<manager name="AOCMessage" language="en_US">
<synopsis>
@@ -1112,6 +1186,10 @@ ASTERISK_REGISTER_FILE()
<description>
<para>Generates an AOC-D or AOC-E message on a channel.</para>
</description>
+ <see-also>
+ <ref type="managerEvent">AOC-D</ref>
+ <ref type="managerEvent">AOC-E</ref>
+ </see-also>
</manager>
<function name="AMI_CLIENT" language="en_US">
<synopsis>
@@ -1171,6 +1249,9 @@ ASTERISK_REGISTER_FILE()
this command can be used to create filters that may bypass
filters defined in manager.conf</para>
</description>
+ <see-also>
+ <ref type="manager">FilterList</ref>
+ </see-also>
</manager>
<manager name="FilterList" language="en_US">
<synopsis>
@@ -1180,6 +1261,9 @@ ASTERISK_REGISTER_FILE()
<para>The filters displayed are for the current session. Only those filters defined in
manager.conf will be present upon starting a new session.</para>
</description>
+ <see-also>
+ <ref type="manager">Filter</ref>
+ </see-also>
</manager>
<manager name="BlindTransfer" language="en_US">
<synopsis>
@@ -1198,6 +1282,7 @@ ASTERISK_REGISTER_FILE()
</description>
<see-also>
<ref type="manager">Redirect</ref>
+ <ref type="managerEvent">BlindTransfer</ref>
</see-also>
</manager>
<managerEvent name="ExtensionStatus" language="en_US">
@@ -1275,6 +1360,9 @@ ASTERISK_REGISTER_FILE()
</enumlist>
</parameter>
</syntax>
+ <see-also>
+ <ref type="manager">ExtensionState</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
<managerEvent name="PresenceStatus" language="en_US">
@@ -1288,6 +1376,9 @@ ASTERISK_REGISTER_FILE()
<parameter name="Subtype" />
<parameter name="Message" />
</syntax>
+ <see-also>
+ <ref type="manager">PresenceState</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
***/
diff --git a/main/manager_bridges.c b/main/manager_bridges.c
index 2069d507c..b6aaa550e 100644
--- a/main/manager_bridges.c
+++ b/main/manager_bridges.c
@@ -42,6 +42,11 @@ static struct stasis_message_router *bridge_state_router;
<syntax>
<bridge_snapshot/>
</syntax>
+ <see-also>
+ <ref type="managerEvent">BridgeDestroy</ref>
+ <ref type="managerEvent">BridgeEnter</ref>
+ <ref type="managerEvent">BridgeLeave</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
<managerEvent language="en_US" name="BridgeDestroy">
@@ -50,6 +55,11 @@ static struct stasis_message_router *bridge_state_router;
<syntax>
<bridge_snapshot/>
</syntax>
+ <see-also>
+ <ref type="managerEvent">BridgeCreate</ref>
+ <ref type="managerEvent">BridgeEnter</ref>
+ <ref type="managerEvent">BridgeLeave</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
<managerEvent language="en_US" name="BridgeEnter">
@@ -62,6 +72,11 @@ static struct stasis_message_router *bridge_state_router;
<para>The uniqueid of the channel being swapped out of the bridge</para>
</parameter>
</syntax>
+ <see-also>
+ <ref type="managerEvent">BridgeCreate</ref>
+ <ref type="managerEvent">BridgeDestroy</ref>
+ <ref type="managerEvent">BridgeLeave</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
<managerEvent language="en_US" name="BridgeLeave">
@@ -71,6 +86,11 @@ static struct stasis_message_router *bridge_state_router;
<bridge_snapshot/>
<channel_snapshot/>
</syntax>
+ <see-also>
+ <ref type="managerEvent">BridgeCreate</ref>
+ <ref type="managerEvent">BridgeDestroy</ref>
+ <ref type="managerEvent">BridgeEnter</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
<manager name="BridgeList" language="en_US">
@@ -86,6 +106,12 @@ static struct stasis_message_router *bridge_state_router;
<description>
<para>Returns a list of bridges, optionally filtering on a bridge type.</para>
</description>
+ <see-also>
+ <ref type="manager">Bridge</ref>
+ <ref type="manager">BridgeDestroy</ref>
+ <ref type="manager">BridgeInfo</ref>
+ <ref type="manager">BridgeKick</ref>
+ </see-also>
</manager>
<manager name="BridgeInfo" language="en_US">
<synopsis>
@@ -100,6 +126,12 @@ static struct stasis_message_router *bridge_state_router;
<description>
<para>Returns detailed information about a bridge and the channels in it.</para>
</description>
+ <see-also>
+ <ref type="manager">Bridge</ref>
+ <ref type="manager">BridgeDestroy</ref>
+ <ref type="manager">BridgeKick</ref>
+ <ref type="manager">BridgeList</ref>
+ </see-also>
<responses>
<list-elements>
<managerEvent language="en_US" name="BridgeInfoChannel">
@@ -134,6 +166,13 @@ static struct stasis_message_router *bridge_state_router;
<description>
<para>Deletes the bridge, causing channels to continue or hang up.</para>
</description>
+ <see-also>
+ <ref type="manager">Bridge</ref>
+ <ref type="manager">BridgeInfo</ref>
+ <ref type="manager">BridgeKick</ref>
+ <ref type="manager">BridgeList</ref>
+ <ref type="managerEvent">BridgeDestroy</ref>
+ </see-also>
</manager>
<manager name="BridgeKick" language="en_US">
<synopsis>
@@ -153,6 +192,13 @@ static struct stasis_message_router *bridge_state_router;
<description>
<para>The channel is removed from the bridge.</para>
</description>
+ <see-also>
+ <ref type="manager">Bridge</ref>
+ <ref type="manager">BridgeDestroy</ref>
+ <ref type="manager">BridgeInfo</ref>
+ <ref type="manager">BridgeList</ref>
+ <ref type="managerEvent">BridgeLeave</ref>
+ </see-also>
</manager>
***/
diff --git a/main/manager_channels.c b/main/manager_channels.c
index ec1f807dc..ce0e38d9c 100644
--- a/main/manager_channels.c
+++ b/main/manager_channels.c
@@ -44,6 +44,10 @@ ASTERISK_REGISTER_FILE()
<syntax>
<channel_snapshot/>
</syntax>
+ <see-also>
+ <ref type="managerEvent">Newstate</ref>
+ <ref type="managerEvent">Hangup</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
<managerEvent language="en_US" name="Newstate">
@@ -52,6 +56,10 @@ ASTERISK_REGISTER_FILE()
<syntax>
<channel_snapshot/>
</syntax>
+ <see-also>
+ <ref type="managerEvent">Newchannel</ref>
+ <ref type="managerEvent">Hangup</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
<managerEvent language="en_US" name="Hangup">
@@ -66,6 +74,12 @@ ASTERISK_REGISTER_FILE()
<para>A description of why the channel was hung up.</para>
</parameter>
</syntax>
+ <see-also>
+ <ref type="managerEvent">Newchannel</ref>
+ <ref type="managerEvent">SoftHangupRequest</ref>
+ <ref type="managerEvent">HangupRequest</ref>
+ <ref type="managerEvent">Newstate</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
<managerEvent language="en_US" name="HangupRequest">
@@ -75,6 +89,10 @@ ASTERISK_REGISTER_FILE()
<channel_snapshot/>
<xi:include xpointer="xpointer(/docs/managerEvent[@name='Hangup']/managerEventInstance/syntax/parameter[@name='Cause'])" />
</syntax>
+ <see-also>
+ <ref type="managerEvent">SoftHangupRequest</ref>
+ <ref type="managerEvent">Hangup</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
<managerEvent language="en_US" name="SoftHangupRequest">
@@ -84,6 +102,10 @@ ASTERISK_REGISTER_FILE()
<channel_snapshot/>
<xi:include xpointer="xpointer(/docs/managerEvent[@name='Hangup']/managerEventInstance/syntax/parameter[@name='Cause'])" />
</syntax>
+ <see-also>
+ <ref type="managerEvent">HangupRequest</ref>
+ <ref type="managerEvent">Hangup</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
<managerEvent language="en_US" name="NewExten">
@@ -114,6 +136,9 @@ ASTERISK_REGISTER_FILE()
<para>A description of the Caller ID presentation.</para>
</parameter>
</syntax>
+ <see-also>
+ <ref type="function">CALLERID</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
<managerEvent language="en_US" name="NewAccountCode">
@@ -125,6 +150,9 @@ ASTERISK_REGISTER_FILE()
<para>The channel's previous account code</para>
</parameter>
</syntax>
+ <see-also>
+ <ref type="function">CHANNEL</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
<managerEvent language="en_US" name="DialBegin">
@@ -139,6 +167,9 @@ ASTERISK_REGISTER_FILE()
</syntax>
<see-also>
<ref type="application">Dial</ref>
+ <ref type="application">Originate</ref>
+ <ref type="manager">Originate</ref>
+ <ref type="managerEvent">DialEnd</ref>
</see-also>
</managerEventInstance>
</managerEvent>
@@ -219,6 +250,9 @@ ASTERISK_REGISTER_FILE()
</syntax>
<see-also>
<ref type="application">Dial</ref>
+ <ref type="application">Originate</ref>
+ <ref type="manager">Originate</ref>
+ <ref type="managerEvent">DialBegin</ref>
</see-also>
</managerEventInstance>
</managerEvent>
@@ -231,6 +265,9 @@ ASTERISK_REGISTER_FILE()
<para>The suggested MusicClass, if provided.</para>
</parameter>
</syntax>
+ <see-also>
+ <ref type="managerEvent">Unhold</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
<managerEvent language="en_US" name="Unhold">
@@ -239,6 +276,9 @@ ASTERISK_REGISTER_FILE()
<syntax>
<channel_snapshot/>
</syntax>
+ <see-also>
+ <ref type="managerEvent">Hold</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
<managerEvent language="en_US" name="ChanSpyStart">
@@ -249,7 +289,8 @@ ASTERISK_REGISTER_FILE()
<channel_snapshot prefix="Spyee"/>
</syntax>
<see-also>
- <ref type="application">ChanSpyStop</ref>
+ <ref type="managerEvent">ChanSpyStop</ref>
+ <ref type="application">ChanSpy</ref>
</see-also>
</managerEventInstance>
</managerEvent>
@@ -261,7 +302,8 @@ ASTERISK_REGISTER_FILE()
<channel_snapshot prefix="Spyee"/>
</syntax>
<see-also>
- <ref type="application">ChanSpyStart</ref>
+ <ref type="managerEvent">ChanSpyStart</ref>
+ <ref type="application">ChanSpy</ref>
</see-also>
</managerEventInstance>
</managerEvent>
@@ -274,6 +316,9 @@ ASTERISK_REGISTER_FILE()
<para>Hangup handler parameter string passed to the Gosub application.</para>
</parameter>
</syntax>
+ <see-also>
+ <ref type="function">CHANNEL</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
<managerEvent language="en_US" name="HangupHandlerPop">
@@ -380,6 +425,7 @@ ASTERISK_REGISTER_FILE()
</syntax>
<see-also>
<ref type="managerEvent">MusicOnHoldStop</ref>
+ <ref type="application">StartMusicOnHold</ref>
<ref type="application">MusicOnHold</ref>
</see-also>
</managerEventInstance>
@@ -856,6 +902,9 @@ static void channel_dtmf_begin_cb(void *data, struct stasis_subscription *sub,
</enumlist>
</parameter>
</syntax>
+ <see-also>
+ <ref type="managerEvent">DTMFEnd</ref>
+ </see-also>
</managerEventInstance>
***/
manager_event(EVENT_FLAG_DTMF, "DTMFBegin",
@@ -902,6 +951,9 @@ static void channel_dtmf_end_cb(void *data, struct stasis_subscription *sub,
</enumlist>
</parameter>
</syntax>
+ <see-also>
+ <ref type="managerEvent">DTMFBegin</ref>
+ </see-also>
</managerEventInstance>
***/
manager_event(EVENT_FLAG_DTMF, "DTMFEnd",
diff --git a/main/pbx.c b/main/pbx.c
index 3705ea127..63385f91f 100644
--- a/main/pbx.c
+++ b/main/pbx.c
@@ -5033,9 +5033,11 @@ int ast_context_remove_extension_callerid2(struct ast_context *con, const char *
/* scan the extension list to find first matching extension-registrar */
for (exten = con->root; exten; prev_exten = exten, exten = exten->next) {
if (!strcmp(exten->exten, ex.exten) &&
- (!registrar || !strcmp(exten->registrar, registrar)) &&
- (!matchcallerid || (!ast_strlen_zero(callerid) && !ast_strlen_zero(exten->cidmatch) && !strcmp(exten->cidmatch, callerid)) || (ast_strlen_zero(callerid) && ast_strlen_zero(exten->cidmatch))))
+ (!matchcallerid ||
+ (!ast_strlen_zero(ex.cidmatch) && !ast_strlen_zero(exten->cidmatch) && !strcmp(exten->cidmatch, ex.cidmatch)) ||
+ (ast_strlen_zero(ex.cidmatch) && ast_strlen_zero(exten->cidmatch)))) {
break;
+ }
}
if (!exten) {
/* we can't find right extension */
@@ -5047,7 +5049,7 @@ int ast_context_remove_extension_callerid2(struct ast_context *con, const char *
/* scan the priority list to remove extension with exten->priority == priority */
for (peer = exten, next_peer = exten->peer ? exten->peer : exten->next;
peer && !strcmp(peer->exten, ex.exten) &&
- (!callerid || (!matchcallerid && !peer->matchcid) || (matchcallerid && peer->matchcid && !strcmp(peer->cidmatch, callerid))) ;
+ (!callerid || (!matchcallerid && !peer->matchcid) || (matchcallerid && peer->matchcid && !strcmp(peer->cidmatch, ex.cidmatch))) ;
peer = next_peer, next_peer = next_peer ? (next_peer->peer ? next_peer->peer : next_peer->next) : NULL) {
if ((priority == 0 || peer->priority == priority) &&
diff --git a/main/rtp_engine.c b/main/rtp_engine.c
index c2b1c8c2b..0671374ef 100644
--- a/main/rtp_engine.c
+++ b/main/rtp_engine.c
@@ -102,6 +102,9 @@
and sending this report.</para>
</parameter>
</syntax>
+ <see-also>
+ <ref type="managerEvent">RTCPReceived</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
<managerEvent language="en_US" name="RTCPReceived">
@@ -131,6 +134,9 @@
<xi:include xpointer="xpointer(/docs/managerEvent[@name='RTCPSent']/managerEventInstance/syntax/parameter[@name='SentOctets'])" />
<xi:include xpointer="xpointer(/docs/managerEvent[@name='RTCPSent']/managerEventInstance/syntax/parameter[contains(@name, 'ReportX')])" />
</syntax>
+ <see-also>
+ <ref type="managerEvent">RTCPSent</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
***/
diff --git a/main/sorcery.c b/main/sorcery.c
index a739f5eb8..55ee830b7 100644
--- a/main/sorcery.c
+++ b/main/sorcery.c
@@ -508,13 +508,15 @@ int ast_sorcery_init(void)
};
ast_assert(wizards == NULL);
- if (!(threadpool = ast_threadpool_create("Sorcery", NULL, &options))) {
- threadpool = NULL;
+ threadpool = ast_threadpool_create("Sorcery", NULL, &options);
+ if (!threadpool) {
return -1;
}
- if (!(wizards = ao2_container_alloc(WIZARD_BUCKETS, sorcery_wizard_hash, sorcery_wizard_cmp))) {
- ast_threadpool_shutdown(threadpool);
+ wizards = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, WIZARD_BUCKETS,
+ sorcery_wizard_hash, NULL, sorcery_wizard_cmp);
+ if (!wizards) {
+ sorcery_cleanup();
return -1;
}
@@ -524,8 +526,8 @@ int ast_sorcery_init(void)
return -1;
}
- instances = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_RWLOCK, INSTANCE_BUCKETS,
- sorcery_instance_hash, sorcery_instance_cmp);
+ instances = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_RWLOCK, 0, INSTANCE_BUCKETS,
+ sorcery_instance_hash, NULL, sorcery_instance_cmp);
if (!instances) {
sorcery_cleanup();
return -1;
@@ -606,7 +608,7 @@ static int sorcery_generic_observer_remove(void *obj, void *arg, int flags)
{
const struct sorcery_global_observer *observer = obj;
- return (observer->callbacks == arg) ? CMP_MATCH | CMP_STOP : 0;
+ return (observer->callbacks == arg) ? CMP_MATCH : 0;
}
int ast_sorcery_global_observer_add(const struct ast_sorcery_global_observer *callbacks)
@@ -842,23 +844,30 @@ static struct ast_sorcery_object_type *sorcery_object_type_alloc(const char *typ
return NULL;
}
- if (!(object_type->fields = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_NOLOCK, OBJECT_FIELD_BUCKETS,
- object_type_field_hash, object_type_field_cmp))) {
+ object_type->fields = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_NOLOCK, 0,
+ OBJECT_FIELD_BUCKETS, object_type_field_hash, NULL, object_type_field_cmp);
+ if (!object_type->fields) {
ao2_ref(object_type, -1);
return NULL;
}
- if (!(object_type->observers = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_RWLOCK, 1, NULL, NULL))) {
+ object_type->observers = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_RWLOCK, 0,
+ NULL, NULL);
+ if (!object_type->observers) {
ao2_ref(object_type, -1);
return NULL;
}
- if (!(object_type->info = ast_calloc(1, sizeof(*object_type->info) + 2 * sizeof(object_type->info->files[0])))) {
+ object_type->info = ast_calloc(1,
+ sizeof(*object_type->info) + 2 * sizeof(object_type->info->files[0]));
+ if (!object_type->info) {
ao2_ref(object_type, -1);
return NULL;
}
- if (!(object_type->file = ast_calloc(1, sizeof(*object_type->file) + 2 * sizeof(object_type->file->types[0])))) {
+ object_type->file = ast_calloc(1,
+ sizeof(*object_type->file) + 2 * sizeof(object_type->file->types[0]));
+ if (!object_type->file) {
ao2_ref(object_type, -1);
return NULL;
}
@@ -1343,8 +1352,10 @@ static void sorcery_observer_invocation_destroy(void *obj)
/*! \brief Allocator function for observer invocation */
static struct sorcery_observer_invocation *sorcery_observer_invocation_alloc(struct ast_sorcery_object_type *object_type, void *object)
{
- struct sorcery_observer_invocation *invocation = ao2_alloc(sizeof(*invocation), sorcery_observer_invocation_destroy);
+ struct sorcery_observer_invocation *invocation;
+ invocation = ao2_alloc_options(sizeof(*invocation),
+ sorcery_observer_invocation_destroy, AO2_ALLOC_OPT_LOCK_NOLOCK);
if (!invocation) {
return NULL;
}
@@ -1969,11 +1980,8 @@ struct ao2_container *ast_sorcery_retrieve_by_regex(const struct ast_sorcery *so
}
/*! \brief Internal function which returns if the wizard has created the object */
-static int sorcery_wizard_create(void *obj, void *arg, int flags)
+static int sorcery_wizard_create(const struct ast_sorcery_object_wizard *object_wizard, const struct sorcery_details *details)
{
- const struct ast_sorcery_object_wizard *object_wizard = obj;
- const struct sorcery_details *details = arg;
-
if (!object_wizard->wizard->callbacks.create) {
ast_debug(5, "Sorcery wizard '%s' does not support creation\n", object_wizard->wizard->callbacks.name);
return 0;
@@ -2028,7 +2036,8 @@ int ast_sorcery_create(const struct ast_sorcery *sorcery, void *object)
AST_VECTOR_RW_RDLOCK(&object_type->wizards);
for (i = 0; i < AST_VECTOR_SIZE(&object_type->wizards); i++) {
found_wizard = AST_VECTOR_GET(&object_type->wizards, i);
- if (!found_wizard->caching && sorcery_wizard_create(found_wizard, &sdetails, 0) == CMP_MATCH) {
+ if (!found_wizard->caching
+ && sorcery_wizard_create(found_wizard, &sdetails) == CMP_MATCH) {
object_wizard = found_wizard;
}
}
@@ -2037,14 +2046,14 @@ int ast_sorcery_create(const struct ast_sorcery *sorcery, void *object)
for (i = 0; i < AST_VECTOR_SIZE(&object_type->wizards); i++) {
found_wizard = AST_VECTOR_GET(&object_type->wizards, i);
if (found_wizard->caching) {
- sorcery_wizard_create(found_wizard, &sdetails, 0);
+ sorcery_wizard_create(found_wizard, &sdetails);
}
}
if (ao2_container_count(object_type->observers)) {
- struct sorcery_observer_invocation *invocation = sorcery_observer_invocation_alloc(
- object_type, object);
+ struct sorcery_observer_invocation *invocation;
+ invocation = sorcery_observer_invocation_alloc(object_type, object);
if (invocation
&& ast_taskprocessor_push(object_type->serializer, sorcery_observers_notify_create,
invocation)) {
@@ -2082,11 +2091,8 @@ static int sorcery_observers_notify_update(void *data)
}
/*! \brief Internal function which returns if a wizard has updated the object */
-static int sorcery_wizard_update(void *obj, void *arg, int flags)
+static int sorcery_wizard_update(const struct ast_sorcery_object_wizard *object_wizard, const struct sorcery_details *details)
{
- const struct ast_sorcery_object_wizard *object_wizard = obj;
- const struct sorcery_details *details = arg;
-
if (!object_wizard->wizard->callbacks.update) {
ast_debug(5, "Sorcery wizard '%s' does not support updating\n", object_wizard->wizard->callbacks.name);
return 0;
@@ -2118,7 +2124,8 @@ int ast_sorcery_update(const struct ast_sorcery *sorcery, void *object)
AST_VECTOR_RW_RDLOCK(&object_type->wizards);
for (i = 0; i < AST_VECTOR_SIZE(&object_type->wizards); i++) {
found_wizard = AST_VECTOR_GET(&object_type->wizards, i);
- if (!found_wizard->caching && sorcery_wizard_update(found_wizard, &sdetails, 0) == CMP_MATCH) {
+ if (!found_wizard->caching
+ && sorcery_wizard_update(found_wizard, &sdetails) == CMP_MATCH) {
object_wizard = found_wizard;
}
}
@@ -2127,14 +2134,14 @@ int ast_sorcery_update(const struct ast_sorcery *sorcery, void *object)
for (i = 0; i < AST_VECTOR_SIZE(&object_type->wizards); i++) {
found_wizard = AST_VECTOR_GET(&object_type->wizards, i);
if (found_wizard->caching) {
- sorcery_wizard_update(found_wizard, &sdetails, 0);
+ sorcery_wizard_update(found_wizard, &sdetails);
}
}
if (ao2_container_count(object_type->observers)) {
- struct sorcery_observer_invocation *invocation = sorcery_observer_invocation_alloc(
- object_type, object);
+ struct sorcery_observer_invocation *invocation;
+ invocation = sorcery_observer_invocation_alloc(object_type, object);
if (invocation
&& ast_taskprocessor_push(object_type->serializer, sorcery_observers_notify_update,
invocation)) {
@@ -2172,11 +2179,8 @@ static int sorcery_observers_notify_delete(void *data)
}
/*! \brief Internal function which returns if a wizard has deleted the object */
-static int sorcery_wizard_delete(void *obj, void *arg, int flags)
+static int sorcery_wizard_delete(const struct ast_sorcery_object_wizard *object_wizard, const struct sorcery_details *details)
{
- const struct ast_sorcery_object_wizard *object_wizard = obj;
- const struct sorcery_details *details = arg;
-
if (!object_wizard->wizard->callbacks.delete) {
ast_debug(5, "Sorcery wizard '%s' does not support deletion\n", object_wizard->wizard->callbacks.name);
return 0;
@@ -2208,7 +2212,8 @@ int ast_sorcery_delete(const struct ast_sorcery *sorcery, void *object)
AST_VECTOR_RW_RDLOCK(&object_type->wizards);
for (i = 0; i < AST_VECTOR_SIZE(&object_type->wizards); i++) {
found_wizard = AST_VECTOR_GET(&object_type->wizards, i);
- if (!found_wizard->caching && sorcery_wizard_delete(found_wizard, &sdetails, 0) == CMP_MATCH) {
+ if (!found_wizard->caching
+ && sorcery_wizard_delete(found_wizard, &sdetails) == CMP_MATCH) {
object_wizard = found_wizard;
}
}
@@ -2217,14 +2222,14 @@ int ast_sorcery_delete(const struct ast_sorcery *sorcery, void *object)
for (i = 0; i < AST_VECTOR_SIZE(&object_type->wizards); i++) {
found_wizard = AST_VECTOR_GET(&object_type->wizards, i);
if (found_wizard->caching) {
- sorcery_wizard_delete(found_wizard, &sdetails, 0);
+ sorcery_wizard_delete(found_wizard, &sdetails);
}
}
if (ao2_container_count(object_type->observers)) {
- struct sorcery_observer_invocation *invocation = sorcery_observer_invocation_alloc(
- object_type, object);
+ struct sorcery_observer_invocation *invocation;
+ invocation = sorcery_observer_invocation_alloc(object_type, object);
if (invocation
&& ast_taskprocessor_push(object_type->serializer, sorcery_observers_notify_delete,
invocation)) {
@@ -2368,7 +2373,7 @@ static int sorcery_observer_remove(void *obj, void *arg, int flags)
{
const struct ast_sorcery_object_type_observer *observer = obj;
- return (observer->callbacks == arg) ? CMP_MATCH | CMP_STOP : 0;
+ return (observer->callbacks == arg) ? CMP_MATCH : 0;
}
void ast_sorcery_observer_remove(const struct ast_sorcery *sorcery, const char *type, const struct ast_sorcery_observer *callbacks)
@@ -2390,18 +2395,20 @@ void ast_sorcery_observer_remove(const struct ast_sorcery *sorcery, const char *
int ast_sorcery_object_id_sort(const void *obj, const void *arg, int flags)
{
+ const void *object_left = obj;
+ const void *object_right = arg;
const char *right_key = arg;
int cmp;
switch (flags & OBJ_SEARCH_MASK) {
case OBJ_SEARCH_OBJECT:
- right_key = ast_sorcery_object_get_id(arg);
+ right_key = ast_sorcery_object_get_id(object_right);
/* Fall through */
case OBJ_SEARCH_KEY:
- cmp = strcmp(ast_sorcery_object_get_id(obj), right_key);
+ cmp = strcmp(ast_sorcery_object_get_id(object_left), right_key);
break;
case OBJ_SEARCH_PARTIAL_KEY:
- cmp = strncmp(ast_sorcery_object_get_id(obj), right_key, strlen(right_key));
+ cmp = strncmp(ast_sorcery_object_get_id(object_left), right_key, strlen(right_key));
break;
default:
cmp = 0;
@@ -2412,37 +2419,32 @@ int ast_sorcery_object_id_sort(const void *obj, const void *arg, int flags)
int ast_sorcery_object_id_compare(void *obj, void *arg, int flags)
{
- const char *right_key = arg;
- int cmp = 0;
+ int cmp;
+
+ cmp = ast_sorcery_object_id_sort(obj, arg, flags);
+ if (cmp) {
+ return 0;
+ }
+ return CMP_MATCH;
+}
+
+int ast_sorcery_object_id_hash(const void *obj, int flags)
+{
+ const char *key;
switch (flags & OBJ_SEARCH_MASK) {
- case OBJ_SEARCH_OBJECT:
- right_key = ast_sorcery_object_get_id(arg);
- /* Fall through */
case OBJ_SEARCH_KEY:
- if (strcmp(ast_sorcery_object_get_id(obj), right_key) == 0) {
- cmp = CMP_MATCH | CMP_STOP;
- }
+ key = obj;
break;
- case OBJ_SEARCH_PARTIAL_KEY:
- if (strncmp(ast_sorcery_object_get_id(obj), right_key, strlen(right_key)) == 0) {
- cmp = CMP_MATCH;
- }
+ case OBJ_SEARCH_OBJECT:
+ key = ast_sorcery_object_get_id(obj);
break;
default:
- cmp = 0;
- break;
- }
- return cmp;
-}
-
-int ast_sorcery_object_id_hash(const void *obj, int flags) {
- if (flags & OBJ_SEARCH_OBJECT) {
- return ast_str_hash(ast_sorcery_object_get_id(obj));
- } else if (flags & OBJ_SEARCH_KEY) {
- return ast_str_hash(obj);
+ /* Hash can only work on something with a full key. */
+ ast_assert(0);
+ return 0;
}
- return -1;
+ return ast_str_hash(key);
}
struct ast_sorcery_object_type *ast_sorcery_get_object_type(const struct ast_sorcery *sorcery,
@@ -2459,7 +2461,7 @@ static int is_registered_cb(void *obj, void *arg, int flags)
if (object_field->name_regex
&& !regexec(object_field->name_regex, name, 0, NULL, 0)) {
- rc = CMP_MATCH | CMP_STOP;
+ rc = CMP_MATCH;
}
return rc;
diff --git a/main/stasis.c b/main/stasis.c
index 91ad94e76..e04d92a4f 100644
--- a/main/stasis.c
+++ b/main/stasis.c
@@ -59,6 +59,7 @@ ASTERISK_REGISTER_FILE();
</description>
<see-also>
<ref type="application">UserEvent</ref>
+ <ref type="managerEvent">UserEvent</ref>
</see-also>
</managerEventInstance>
</managerEvent>
diff --git a/main/stasis_bridges.c b/main/stasis_bridges.c
index 0e46edbea..a5f29c74e 100644
--- a/main/stasis_bridges.c
+++ b/main/stasis_bridges.c
@@ -79,6 +79,9 @@ ASTERISK_REGISTER_FILE()
<para>Destination extension for the blind transfer.</para>
</parameter>
</syntax>
+ <see-also>
+ <ref type="manager">BlindTransfer</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
<managerEvent language="en_US" name="AttendedTransfer">
@@ -131,6 +134,9 @@ ASTERISK_REGISTER_FILE()
<para> <replaceable>SecondTransfererChannel</replaceable>: Alice's channel in the bridge with Bob.</para>
<para> <replaceable>SecondBridgeUniqueid</replaceable>: The bridge between Alice and Bob.</para>
</description>
+ <see-also>
+ <ref type="manager">AtxFer</ref>
+ </see-also>
</managerEventInstance>
</managerEvent>
***/
diff --git a/main/utils.c b/main/utils.c
index 46edf43ea..1d2aa0b27 100644
--- a/main/utils.c
+++ b/main/utils.c
@@ -2488,7 +2488,7 @@ void ast_set_default_eid(struct ast_eid *eid)
return;
}
for (x = 0; x < MAXIF; x++) {
- static const char *prefixes[] = { "eth", "em" };
+ static const char *prefixes[] = { "eth", "em", "eno", "ens" };
unsigned int i;
for (i = 0; i < ARRAY_LEN(prefixes); i++) {
@@ -2539,7 +2539,7 @@ void ast_set_default_eid(struct ast_eid *eid)
}
#endif
#endif
- ast_debug(1, "No ethernet interface found for seeding global EID. You will have to set it manually.\n");
+ ast_log(LOG_WARNING, "No ethernet interface found for seeding global EID. You will have to set it manually.\n");
}
int ast_str_to_eid(struct ast_eid *eid, const char *s)
@@ -2564,6 +2564,14 @@ int ast_eid_cmp(const struct ast_eid *eid1, const struct ast_eid *eid2)
return memcmp(eid1, eid2, sizeof(*eid1));
}
+int ast_eid_is_empty(const struct ast_eid *eid)
+{
+ struct ast_eid empty_eid;
+
+ memset(&empty_eid, 0, sizeof(empty_eid));
+ return memcmp(eid, &empty_eid, sizeof(empty_eid)) ? 0 : 1;
+}
+
int ast_file_is_readable(const char *filename)
{
#if defined(HAVE_EACCESS) || defined(HAVE_EUIDACCESS)