Compare commits
127 Commits
Author | SHA1 | Date |
---|---|---|
Asterisk Development Team | 61d8fc4c6c | |
Asterisk Development Team | 4a9f5e7ae6 | |
George Joseph | ff9ab38573 | |
Asterisk Development Team | aecc5448f1 | |
Asterisk Development Team | fefc236e7c | |
Alexandre Fournier | 01b3962201 | |
Joshua C. Colp | b6855755ce | |
Naveen Albert | 2f9cdfbc50 | |
Michael Kuron | 5c114dcb4a | |
Michael Kuron | fee9012fe1 | |
Joshua C. Colp | 564349ff5d | |
Naveen Albert | b9c031c1f8 | |
Marcel Wagner | 58534b309f | |
Naveen Albert | 531eacd6c9 | |
Naveen Albert | b365ea8601 | |
Naveen Albert | 0d6003fa9a | |
Marcel Wagner | b83af13f65 | |
Naveen Albert | 80e6205bb0 | |
Naveen Albert | 406143ae61 | |
Naveen Albert | 83eb113e0f | |
Naveen Albert | b90e57758b | |
Naveen Albert | 52c7d3ed07 | |
Naveen Albert | a4bcdce1db | |
Naveen Albert | 691178c48e | |
Ben Ford | d476994768 | |
George Joseph | 7684c9e907 | |
Mike Bradeen | 81f10e847e | |
Mike Bradeen | eb1d7ab53c | |
Naveen Albert | c7df5ee7c1 | |
Naveen Albert | 5ede4e217a | |
Maximilian Fridrich | 60b81eabe0 | |
Naveen Albert | 2efa290d3c | |
Jaco Kroon | ce2153fc5a | |
Naveen Albert | 002afc3f2a | |
Naveen Albert | 1e77b8c473 | |
Joshua C. Colp | 61922d2934 | |
Naveen Albert | 6e59b01e1a | |
Naveen Albert | 49cfdbbdff | |
Naveen Albert | 8142b313c3 | |
George Joseph | 0c1c623dee | |
Naveen Albert | dfe2f38642 | |
George Joseph | f723b465e5 | |
Mike Bradeen | 50e2921a48 | |
Naveen Albert | afd86b47c1 | |
Igor Goncharovsky | 096529d33f | |
Naveen Albert | ca8900b0f6 | |
Henning Westerholt | 12445040d3 | |
Naveen Albert | 40b52322e5 | |
Naveen Albert | c32b39d123 | |
Frederic LE FOLL | 50a4495799 | |
Naveen Albert | 180ca32565 | |
Naveen Albert | 9258d8212a | |
Naveen Albert | 407216a0a5 | |
Philip Prindeville | d0bea5a725 | |
Mike Bradeen | 907d7e7d7d | |
Naveen Albert | b331caca30 | |
Naveen Albert | e0e7f35730 | |
Naveen Albert | 98fc05f13b | |
Philip Prindeville | ef74ecacc7 | |
Philip Prindeville | 5e2485b5c0 | |
George Joseph | 2a500b325a | |
Maximilian Fridrich | 0d2e140123 | |
Asterisk Development Team | 7f80830ced | |
Holger Hans Peter Freyther | 62881c668b | |
Naveen Albert | 8afb313a43 | |
Naveen Albert | 7335b0cffe | |
Naveen Albert | 407167cc28 | |
Naveen Albert | a5ec60e6c6 | |
Naveen Albert | 1e29607b5c | |
Naveen Albert | 8c791f9a65 | |
Philip Prindeville | 3e7ce90f9c | |
Naveen Albert | 1ed4518328 | |
Maximilian Fridrich | 5bbad0d27c | |
Naveen Albert | 8aae0b9f08 | |
Jaco Kroon | 278c5726ca | |
Naveen Albert | ab1dbfef75 | |
George Joseph | e25b690d10 | |
George Joseph | e33f2dcc0f | |
Philip Prindeville | 026dc08529 | |
Asterisk Development Team | f01ed3eea4 | |
Mike Bradeen | 7a44296ca9 | |
George Joseph | 8cbea1c7ef | |
sungtae kim | 80bc844fd6 | |
Ben Ford | 881a3f2306 | |
Philip Prindeville | 3e054c9ebc | |
Philip Prindeville | 736cdf84f4 | |
Philip Prindeville | 2d7656cb50 | |
Philip Prindeville | 5809d879b0 | |
Philip Prindeville | 2c4c44ca64 | |
Philip Prindeville | b9df2c481b | |
Philip Prindeville | d13afaf302 | |
Naveen Albert | 2dac2bf8dc | |
Naveen Albert | c487425620 | |
Naveen Albert | 205c7c8d21 | |
Naveen Albert | 2de016b181 | |
George Joseph | 05f42806cc | |
George Joseph | c799db6a21 | |
George Joseph | 4ffc5561c4 | |
George Joseph | 2d5a6498dd | |
Joshua C. Colp | f3de933b16 | |
Naveen Albert | c7612521be | |
Joshua C. Colp | a0713a9f70 | |
Naveen Albert | 754346a4a9 | |
Mike Bradeen | 46776c77c4 | |
Sean Bright | 583e017f34 | |
Alexei Gradinari | 12c4c1bf5f | |
Sean Bright | 155c796203 | |
Naveen Albert | 3fa66c92b5 | |
Mike Bradeen | adffb975dc | |
Mike Bradeen | 4fc9e06db1 | |
Naveen Albert | e2e049e473 | |
George Joseph | 8a8416e365 | |
Naveen Albert | ff044c222b | |
Naveen Albert | dc7ec11c26 | |
George Joseph | 30d7a212b0 | |
Naveen Albert | f4a020a45b | |
Naveen Albert | c654486547 | |
Naveen Albert | 5feebc0857 | |
Naveen Albert | 165368bf0b | |
Naveen Albert | 2d8f2696b2 | |
Naveen Albert | 4af881506e | |
Naveen Albert | 83912496ab | |
Naveen Albert | c771e2dd7a | |
Sergey V. Lobanov | f645157a4b | |
Naveen Albert | a9223f210e | |
Naveen Albert | ce18196280 | |
George Joseph | f8000daff5 |
|
@ -1,6 +1,5 @@
|
|||
[gerrit]
|
||||
defaultbranch=master
|
||||
basebranch=master
|
||||
defaultbranch=20
|
||||
#
|
||||
# Intentional padding to ensure it is possible to point a commit
|
||||
# to an alternative gerrit server/repository without breaking
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
40
|
240
CHANGES
240
CHANGES
|
@ -12,10 +12,250 @@
|
|||
===
|
||||
==============================================================================
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
--- Functionality changes from Asterisk 20.0.0 to Asterisk 20.1.0 ------------
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
AMI
|
||||
------------------
|
||||
* The AOCMessage action can now be used to generate AOC-S messages.
|
||||
|
||||
Add support for named capture agent.
|
||||
------------------
|
||||
* A name for the capture agent can now be specified
|
||||
using the capture_name option which, if specified,
|
||||
will be sent to the HEP server.
|
||||
|
||||
app_if
|
||||
------------------
|
||||
* Adds the If, ElseIf, Else, EndIf, and ExitIf applications
|
||||
for conditional execution of a block of code.
|
||||
|
||||
app_mixmonitor
|
||||
------------------
|
||||
* The d option for MixMonitor now allows deleting
|
||||
the original recording when MixMonitor exits,
|
||||
which can be useful when MixMonitor copies it
|
||||
somewhere else before exiting.
|
||||
|
||||
* Adds the c option to use the real Caller ID on
|
||||
the channel in voicemail recordings as opposed
|
||||
to the Connected Line.
|
||||
|
||||
app_voicemail
|
||||
------------------
|
||||
* The voicemail user option attachextrecs can
|
||||
now be set to control whether external recordings
|
||||
trigger voicemail email notifications.
|
||||
|
||||
cdr
|
||||
------------------
|
||||
* Two new options have been added which allow
|
||||
bridging and dial state changes to be ignored
|
||||
in CDRs, which can be useful if a single CDR
|
||||
is desired for a channel.
|
||||
|
||||
chan_dahdi
|
||||
------------------
|
||||
* FXO channels (FXS signaled) that don't use callerid or
|
||||
distinctive ring detection can now be configured
|
||||
to enter the dialplan immediately using immediate=yes,
|
||||
instead of waiting for at least one ring.
|
||||
|
||||
pbx_builtins
|
||||
------------------
|
||||
* It is now possible to not wait for media on
|
||||
a channel when answering it using Answer,
|
||||
by specifying the i option.
|
||||
|
||||
res_pjsip
|
||||
------------------
|
||||
* Added options "security_negotiation" and "security_mechanisms" to pjsip
|
||||
endpoints and registrations. "security_negotiation" can be set to "no" (default)
|
||||
or "mediasec", and "security_mechanisms" can be a list of comma-separated
|
||||
security_mechanisms in the form defined by RFC 3329 section 2.2.
|
||||
|
||||
* A new option named "all_codecs_on_empty_reinvite" has been added to the
|
||||
global section. When this option is enabled, on reception of a re-INVITE
|
||||
without SDP, Asterisk will send an SDP offer in the 200 OK response containing
|
||||
all configured codecs on the endpoint, instead of simply those that have
|
||||
already been negotiated. RFC 3261 specifies this as a SHOULD requirement.
|
||||
The default value is "off".
|
||||
|
||||
res_pjsip_aoc
|
||||
------------------
|
||||
* Added res_pjsip_aoc which gives chan_pjsip the ability to send Advice-of-Charge messages.
|
||||
A new endpoint option, send_aoc, controls this.
|
||||
|
||||
res_pjsip_header_funcs
|
||||
------------------
|
||||
* The new PJSIP_HEADER_PARAM function now fully supports both
|
||||
URI and header parameters. Both reading and writing
|
||||
parameters are supported.
|
||||
|
||||
res_pjsip_logger
|
||||
------------------
|
||||
* SIP messages can now be filtered by SIP request method
|
||||
(INVITE, CANCEL, ACK, BYE, REGISTER, OPTION,
|
||||
SUBSCRIBE, NOTIFY, PUBLISH, INFO, and MESSAGE),
|
||||
allowing for more granular debugging to be done
|
||||
in the CLI. This applies to requests but not responses.
|
||||
|
||||
res_pjsip_notify
|
||||
------------------
|
||||
* Allows using the config options in pjsip_notify.conf
|
||||
from AMI actions as with the existing CLI commands.
|
||||
|
||||
res_tonedetect
|
||||
------------------
|
||||
* The TONE_DETECT function now supports
|
||||
detection of audible ringback tone
|
||||
using the p option.
|
||||
|
||||
xmldocs
|
||||
------------------
|
||||
* The XML documentation can now be reloaded without restarting
|
||||
Asterisk, which makes it possible to load new modules that
|
||||
enforce documentation without restarting Asterisk.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
--- Functionality changes from Asterisk 19.0.0 to Asterisk 20.0.0 ------------
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
New EXPORT function
|
||||
------------------
|
||||
* A new function, EXPORT, allows writing variables
|
||||
and functions on other channels, the complement
|
||||
of the IMPORT function.
|
||||
|
||||
app_amd
|
||||
------------------
|
||||
* An audio file to play during AMD processing can
|
||||
now be specified to the AMD application or configured
|
||||
in the amd.conf configuration file.
|
||||
|
||||
app_bridgewait
|
||||
------------------
|
||||
* Adds the n option to not answer the channel when
|
||||
the BridgeWait application is called.
|
||||
|
||||
features
|
||||
------------------
|
||||
* The Bridge application now has the n "no answer" option
|
||||
that can be used to prevent the channel from being
|
||||
automatically answered prior to bridging.
|
||||
|
||||
func_strings
|
||||
------------------
|
||||
* Three new functions, TRIM, LTRIM, and RTRIM, are
|
||||
now available for trimming leading and trailing
|
||||
whitespace.
|
||||
|
||||
res_pjsip
|
||||
------------------
|
||||
* A new option named "peer_supported" has been added to the endpoint option
|
||||
100rel. When set to this option, Asterisk sends provisional responses
|
||||
reliably if the peer supports it. If the peer does not support reliable
|
||||
provisional responses, Asterisk sends them normally.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
--- Functionality changes from Asterisk 19.0.0 to Asterisk 20.0.0 ------------
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
Transfer feature
|
||||
------------------
|
||||
* The following capabilities have been added to the
|
||||
transfer feature:
|
||||
|
||||
- The transfer initiation announcement prompt can
|
||||
now be customized in features.conf.
|
||||
|
||||
- The TRANSFER_EXTEN variable now can be set on the
|
||||
transferer's channel in order to allow the transfer
|
||||
function to automatically attempt to go to the extension
|
||||
contained in this variable, if it exists. The transfer
|
||||
context behavior is not changed (TRANSFER_CONTEXT is used
|
||||
if it exists; otherwise the default context is used).
|
||||
|
||||
app_confbridge
|
||||
------------------
|
||||
* Adds the end_marked_any option which can be used
|
||||
to kick users from a conference after any
|
||||
marked user leaves (including marked users).
|
||||
|
||||
db
|
||||
------------------
|
||||
* The DBPrefixGet AMI action now allows retrieving
|
||||
all of the DB keys beginning with a particular
|
||||
prefix.
|
||||
|
||||
locks
|
||||
------------------
|
||||
* A new AMI event, DeadlockStart, is now available
|
||||
when Asterisk is compiled with DETECT_DEADLOCKS,
|
||||
and can indicate that a deadlock has occured.
|
||||
|
||||
res_geolocation
|
||||
------------------
|
||||
* * Added processing for the 'confidence' element.
|
||||
* Added documentation to some APIs.
|
||||
* removed a lot of complex code related to the very-off-nominal
|
||||
case of needing to process multiple location info sources.
|
||||
* Create a new 'ast_geoloc_eprofile_to_pidf' API that just takes
|
||||
one eprofile instead of a datastore of multiples.
|
||||
* Plugged a huge leak in XML processing that arose from
|
||||
insufficient documentation by the libxml/libxslt authors.
|
||||
* Refactored stylesheets to be more efficient.
|
||||
* Renamed 'profile_action' to 'profile_precedence' to better
|
||||
reflect it's purpose.
|
||||
* Added the config option for 'allow_routing_use' which
|
||||
sets the value of the 'Geolocation-Routing' header.
|
||||
* Removed the GeolocProfileCreate and GeolocProfileDelete
|
||||
dialplan apps.
|
||||
* Changed the GEOLOC_PROFILE dialplan function as follows:
|
||||
* Removed the 'profile' argument.
|
||||
* Automatically create a profile if it doesn't exist.
|
||||
* Delete a profile if 'inheritable' is set to no.
|
||||
* Fixed various bugs and leaks
|
||||
* Updated Asterisk WiKi documentation.
|
||||
|
||||
Added 4 built-in profiles:
|
||||
"<prefer_config>"
|
||||
"<discard_config>"
|
||||
"<prefer_incoming>"
|
||||
"<discard_incoming>"
|
||||
The profiles are empty except for having their precedence
|
||||
set.
|
||||
|
||||
Added profile parameter "suppress_empty_ca_elements" that
|
||||
will cause Civic Address elements that are empty to be
|
||||
suppressed from the outgoing PIDF-LO document.
|
||||
|
||||
You can now specify the location object's format, location_info,
|
||||
method, location_source and confidence parameters directly on
|
||||
a profile object for simple scenarios where the location
|
||||
information isn't common with any other profiles. This is
|
||||
mutually exclusive with setting location_reference on the
|
||||
profile.
|
||||
|
||||
Added an 'a' option to the GEOLOC_PROFILE function to allow
|
||||
variable lists like location_info_refinement to be appended
|
||||
to instead of replacing the entire list.
|
||||
|
||||
Added an 'r' option to the GEOLOC_PROFILE function to resolve all
|
||||
variables before a read operation and after a Set operation.
|
||||
|
||||
res_musiconhold_answeredonly
|
||||
------------------
|
||||
* This change adds an option, answeredonly, that will prevent music
|
||||
on hold on channels that are not answered.
|
||||
|
||||
res_pjsip
|
||||
------------------
|
||||
* TLS transports in res_pjsip can now reload their TLS certificate
|
||||
and private key files, provided the filename of them has not
|
||||
changed.
|
||||
|
||||
Applications
|
||||
------------------
|
||||
* added support for Danish syntax, playing the correct plural sound file
|
||||
|
|
6
Makefile
6
Makefile
|
@ -561,9 +561,9 @@ bininstall: _all installdirs $(SUBDIRS_INSTALL) main-bininstall
|
|||
$(INSTALL) -m 755 contrib/scripts/astversion "$(DESTDIR)$(ASTSBINDIR)/"
|
||||
$(INSTALL) -m 755 contrib/scripts/astgenkey "$(DESTDIR)$(ASTSBINDIR)/"
|
||||
$(INSTALL) -m 755 contrib/scripts/autosupport "$(DESTDIR)$(ASTSBINDIR)/"
|
||||
if [ ! -f /sbin/launchd ]; then \
|
||||
./build_tools/install_subst contrib/scripts/safe_asterisk "$(DESTDIR)$(ASTSBINDIR)/safe_asterisk"; \
|
||||
fi
|
||||
ifneq ($(HAVE_SBIN_LAUNCHD),1)
|
||||
./build_tools/install_subst contrib/scripts/safe_asterisk "$(DESTDIR)$(ASTSBINDIR)/safe_asterisk";
|
||||
endif
|
||||
|
||||
ifneq ($(DISABLE_XMLDOC),yes)
|
||||
$(INSTALL) -m 644 doc/core-*.xml "$(DESTDIR)$(ASTDATADIR)/documentation"
|
||||
|
|
|
@ -213,10 +213,10 @@ endif
|
|||
# extern const size_t _binary_abc_def_xml_size;
|
||||
%.o: %.xml
|
||||
$(ECHO_PREFIX) echo " [LD] $^ -> $@"
|
||||
$(CMD_PREFIX) $(CC) -g -nostartfiles -nodefaultlibs -nostdlib -r -Wl,-b,binary -o $@ $^
|
||||
$(CMD_PREFIX) $(CC) -g -Wl,-znoexecstack -nostartfiles -nodefaultlibs -nostdlib -r -Wl,-b,binary -o $@ $^
|
||||
|
||||
%.o: %.xslt
|
||||
$(ECHO_PREFIX) echo " [LD] $^ -> $@"
|
||||
$(CMD_PREFIX) $(CC) -g -nostartfiles -nodefaultlibs -nostdlib -r -Wl,-b,binary -o $@ $^
|
||||
$(CMD_PREFIX) $(CC) -g -Wl,-znoexecstack -nostartfiles -nodefaultlibs -nostdlib -r -Wl,-b,binary -o $@ $^
|
||||
|
||||
dist-clean:: clean
|
||||
|
|
23
UPGRADE.txt
23
UPGRADE.txt
|
@ -18,6 +18,29 @@
|
|||
===
|
||||
===========================================================
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
--- Functionality changes from Asterisk 20.0.0 to Asterisk 20.1.0 ------------
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
AMI (Asterisk Manager Interface)
|
||||
------------------
|
||||
* Previously, GetConfig and UpdateConfig were able to access files outside of
|
||||
the Asterisk configuration directory. Now this access is put behind the
|
||||
live_dangerously configuration option in asterisk.conf, which is disabled by
|
||||
default. If access to configuration files outside of the Asterisk configuation
|
||||
directory is required via AMI, then the live_dangerously configuration option
|
||||
must be set to yes.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
--- Functionality changes from Asterisk 19.0.0 to Asterisk 20.0.0 ------------
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
res_crypto
|
||||
------------------
|
||||
* In addition to only paying attention to files ending with .key or .pub
|
||||
in the keys directory, we now also ignore any files which aren't regular
|
||||
files.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
--- New functionality introduced in Asterisk 20.0.0 --------------------------
|
||||
------------------------------------------------------------------------------
|
||||
|
|
|
@ -192,11 +192,13 @@ EXTERN int ooQ931Decode
|
|||
screening indicators ;-) */
|
||||
if(ie->discriminator == Q931CallingPartyNumberIE)
|
||||
{
|
||||
int numoffset=1;
|
||||
OOTRACEDBGB1(" CallingPartyNumber IE = {\n");
|
||||
if(ie->length < OO_MAX_NUMBER_LENGTH)
|
||||
if(!(0x80 & ie->data[0])) numoffset = 2;
|
||||
|
||||
if( (ie->length >= numoffset) &&
|
||||
(ie->length < OO_MAX_NUMBER_LENGTH) )
|
||||
{
|
||||
int numoffset=1;
|
||||
if(!(0x80 & ie->data[0])) numoffset = 2;
|
||||
memcpy(number, ie->data+numoffset,ie->length-numoffset);
|
||||
number[ie->length-numoffset]='\0';
|
||||
OOTRACEDBGB2(" %s\n", number);
|
||||
|
@ -204,7 +206,7 @@ EXTERN int ooQ931Decode
|
|||
ooCallSetCallingPartyNumber(call, number);
|
||||
}
|
||||
else{
|
||||
OOTRACEERR3("Error:Calling party number too long. (%s, %s)\n",
|
||||
OOTRACEERR3("Error:Calling party number outside range. (%s, %s)\n",
|
||||
call->callType, call->callToken);
|
||||
}
|
||||
OOTRACEDBGB1(" }\n");
|
||||
|
@ -214,7 +216,8 @@ EXTERN int ooQ931Decode
|
|||
if(ie->discriminator == Q931CalledPartyNumberIE)
|
||||
{
|
||||
OOTRACEDBGB1(" CalledPartyNumber IE = {\n");
|
||||
if(ie->length < OO_MAX_NUMBER_LENGTH)
|
||||
if( (ie->length >= 1) &&
|
||||
(ie->length < OO_MAX_NUMBER_LENGTH) )
|
||||
{
|
||||
memcpy(number, ie->data+1,ie->length-1);
|
||||
number[ie->length-1]='\0';
|
||||
|
@ -223,7 +226,7 @@ EXTERN int ooQ931Decode
|
|||
ooCallSetCalledPartyNumber(call, number);
|
||||
}
|
||||
else{
|
||||
OOTRACEERR3("Error:Calling party number too long. (%s, %s)\n",
|
||||
OOTRACEERR3("Error:Calling party number outside range. (%s, %s)\n",
|
||||
call->callType, call->callToken);
|
||||
}
|
||||
OOTRACEDBGB1(" }\n");
|
||||
|
|
|
@ -92,6 +92,12 @@
|
|||
<para>Is the maximum duration of a word to accept.</para>
|
||||
<para>If exceeded, then the result is detection as a MACHINE</para>
|
||||
</parameter>
|
||||
<parameter name="audioFile" required="false">
|
||||
<para>Is an audio file to play to the caller while AMD is in progress.</para>
|
||||
<para>By default, no audio file is played.</para>
|
||||
<para>If an audio file is configured in amd.conf, then that file will be used
|
||||
if one is not specified here. That file may be overridden by this argument.</para>
|
||||
</parameter>
|
||||
</syntax>
|
||||
<description>
|
||||
<para>This application attempts to detect answering machines at the beginning
|
||||
|
@ -155,6 +161,9 @@ static int dfltBetweenWordsSilence = 50;
|
|||
static int dfltMaximumNumberOfWords = 2;
|
||||
static int dfltSilenceThreshold = 256;
|
||||
static int dfltMaximumWordLength = 5000; /* Setting this to a large default so it is not used unless specify it in the configs or command line */
|
||||
static char *dfltAudioFile = NULL;
|
||||
|
||||
static ast_mutex_t config_lock;
|
||||
|
||||
/* Set to the lowest ms value provided in amd.conf or application parameters */
|
||||
static int dfltMaxWaitTimeForFrame = 50;
|
||||
|
@ -179,7 +188,7 @@ static void isAnsweringMachine(struct ast_channel *chan, const char *data)
|
|||
char amdCause[256] = "", amdStatus[256] = "";
|
||||
char *parse = ast_strdupa(data);
|
||||
|
||||
/* Lets set the initial values of the variables that will control the algorithm.
|
||||
/* Let's set the initial values of the variables that will control the algorithm.
|
||||
The initial values are the default ones. If they are passed as arguments
|
||||
when invoking the application, then the default values will be overwritten
|
||||
by the ones passed as parameters. */
|
||||
|
@ -193,6 +202,7 @@ static void isAnsweringMachine(struct ast_channel *chan, const char *data)
|
|||
int silenceThreshold = dfltSilenceThreshold;
|
||||
int maximumWordLength = dfltMaximumWordLength;
|
||||
int maxWaitTimeForFrame = dfltMaxWaitTimeForFrame;
|
||||
const char *audioFile = NULL;
|
||||
|
||||
AST_DECLARE_APP_ARGS(args,
|
||||
AST_APP_ARG(argInitialSilence);
|
||||
|
@ -204,8 +214,15 @@ static void isAnsweringMachine(struct ast_channel *chan, const char *data)
|
|||
AST_APP_ARG(argMaximumNumberOfWords);
|
||||
AST_APP_ARG(argSilenceThreshold);
|
||||
AST_APP_ARG(argMaximumWordLength);
|
||||
AST_APP_ARG(audioFile);
|
||||
);
|
||||
|
||||
ast_mutex_lock(&config_lock);
|
||||
if (!ast_strlen_zero(dfltAudioFile)) {
|
||||
audioFile = ast_strdupa(dfltAudioFile);
|
||||
}
|
||||
ast_mutex_unlock(&config_lock);
|
||||
|
||||
ast_verb(3, "AMD: %s %s %s (Fmt: %s)\n", ast_channel_name(chan),
|
||||
S_COR(ast_channel_caller(chan)->ani.number.valid, ast_channel_caller(chan)->ani.number.str, "(N/A)"),
|
||||
S_COR(ast_channel_redirecting(chan)->from.number.valid, ast_channel_redirecting(chan)->from.number.str, "(N/A)"),
|
||||
|
@ -233,6 +250,9 @@ static void isAnsweringMachine(struct ast_channel *chan, const char *data)
|
|||
silenceThreshold = atoi(args.argSilenceThreshold);
|
||||
if (!ast_strlen_zero(args.argMaximumWordLength))
|
||||
maximumWordLength = atoi(args.argMaximumWordLength);
|
||||
if (!ast_strlen_zero(args.audioFile)) {
|
||||
audioFile = args.audioFile;
|
||||
}
|
||||
} else {
|
||||
ast_debug(1, "AMD using the default parameters.\n");
|
||||
}
|
||||
|
@ -280,6 +300,11 @@ static void isAnsweringMachine(struct ast_channel *chan, const char *data)
|
|||
/* Set our start time so we can tie the loop to real world time and not RTP updates */
|
||||
amd_tvstart = ast_tvnow();
|
||||
|
||||
/* Optional audio file to play to caller while AMD is doing its thing. */
|
||||
if (!ast_strlen_zero(audioFile)) {
|
||||
ast_streamfile(chan, audioFile, ast_channel_language(chan));
|
||||
}
|
||||
|
||||
/* Now we go into a loop waiting for frames from the channel */
|
||||
while ((res = ast_waitfor(chan, 2 * maxWaitTimeForFrame)) > -1) {
|
||||
int ms = 0;
|
||||
|
@ -462,10 +487,14 @@ static void isAnsweringMachine(struct ast_channel *chan, const char *data)
|
|||
/* Free the DSP used to detect silence */
|
||||
ast_dsp_free(silenceDetector);
|
||||
|
||||
/* If we were playing something to pass the time, stop it now. */
|
||||
if (!ast_strlen_zero(audioFile)) {
|
||||
ast_stopstream(chan);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
static int amd_exec(struct ast_channel *chan, const char *data)
|
||||
{
|
||||
isAnsweringMachine(chan, data);
|
||||
|
@ -516,7 +545,16 @@ static int load_config(int reload)
|
|||
dfltMaximumNumberOfWords = atoi(var->value);
|
||||
} else if (!strcasecmp(var->name, "maximum_word_length")) {
|
||||
dfltMaximumWordLength = atoi(var->value);
|
||||
|
||||
} else if (!strcasecmp(var->name, "playback_file")) {
|
||||
ast_mutex_lock(&config_lock);
|
||||
if (dfltAudioFile) {
|
||||
ast_free(dfltAudioFile);
|
||||
dfltAudioFile = NULL;
|
||||
}
|
||||
if (!ast_strlen_zero(var->value)) {
|
||||
dfltAudioFile = ast_strdup(var->value);
|
||||
}
|
||||
ast_mutex_unlock(&config_lock);
|
||||
} else {
|
||||
ast_log(LOG_WARNING, "%s: Cat:%s. Unknown keyword %s at line %d of amd.conf\n",
|
||||
app, cat, var->name, var->lineno);
|
||||
|
@ -539,6 +577,12 @@ static int load_config(int reload)
|
|||
|
||||
static int unload_module(void)
|
||||
{
|
||||
ast_mutex_lock(&config_lock);
|
||||
if (dfltAudioFile) {
|
||||
ast_free(dfltAudioFile);
|
||||
}
|
||||
ast_mutex_unlock(&config_lock);
|
||||
ast_mutex_destroy(&config_lock);
|
||||
return ast_unregister_application(app);
|
||||
}
|
||||
|
||||
|
@ -554,6 +598,7 @@ static int unload_module(void)
|
|||
*/
|
||||
static int load_module(void)
|
||||
{
|
||||
ast_mutex_init(&config_lock);
|
||||
if (load_config(0) || ast_register_application_xml(app, amd_exec)) {
|
||||
return AST_MODULE_LOAD_DECLINE;
|
||||
}
|
||||
|
|
|
@ -100,6 +100,9 @@
|
|||
<para>Automatically exit the bridge and return to the PBX after
|
||||
<emphasis>duration</emphasis> seconds.</para>
|
||||
</option>
|
||||
<option name="n">
|
||||
<para>Do not automatically answer the channel.</para>
|
||||
</option>
|
||||
</optionlist>
|
||||
</parameter>
|
||||
</syntax>
|
||||
|
@ -108,7 +111,7 @@
|
|||
The channel will then wait in the holding bridge until some event occurs
|
||||
which removes it from the holding bridge.</para>
|
||||
<note><para>This application will answer calls which haven't already
|
||||
been answered.</para></note>
|
||||
been answered, unless the n option is provided.</para></note>
|
||||
</description>
|
||||
</application>
|
||||
***/
|
||||
|
@ -186,6 +189,7 @@ enum bridgewait_flags {
|
|||
MUXFLAG_MOHCLASS = (1 << 0),
|
||||
MUXFLAG_ENTERTAINMENT = (1 << 1),
|
||||
MUXFLAG_TIMEOUT = (1 << 2),
|
||||
MUXFLAG_NOANSWER = (1 << 3),
|
||||
};
|
||||
|
||||
enum bridgewait_args {
|
||||
|
@ -199,6 +203,7 @@ AST_APP_OPTIONS(bridgewait_opts, {
|
|||
AST_APP_OPTION_ARG('e', MUXFLAG_ENTERTAINMENT, OPT_ARG_ENTERTAINMENT),
|
||||
AST_APP_OPTION_ARG('m', MUXFLAG_MOHCLASS, OPT_ARG_MOHCLASS),
|
||||
AST_APP_OPTION_ARG('S', MUXFLAG_TIMEOUT, OPT_ARG_TIMEOUT),
|
||||
AST_APP_OPTION('n', MUXFLAG_NOANSWER),
|
||||
});
|
||||
|
||||
static int bridgewait_timeout_callback(struct ast_bridge_channel *bridge_channel, void *hook_pvt)
|
||||
|
@ -458,7 +463,7 @@ static int bridgewait_exec(struct ast_channel *chan, const char *data)
|
|||
}
|
||||
|
||||
/* Answer the channel if needed */
|
||||
if (ast_channel_state(chan) != AST_STATE_UP) {
|
||||
if (ast_channel_state(chan) != AST_STATE_UP && !ast_test_flag(&flags, MUXFLAG_NOANSWER)) {
|
||||
ast_answer(chan);
|
||||
}
|
||||
|
||||
|
|
|
@ -393,6 +393,37 @@
|
|||
ConfbridgeListRoomsComplete.</para>
|
||||
</description>
|
||||
</manager>
|
||||
<managerEvent language="en_US" name="ConfbridgeListRooms">
|
||||
<managerEventInstance class="EVENT_FLAG_REPORTING">
|
||||
<synopsis>Raised as part of the ConfbridgeListRooms action response list.</synopsis>
|
||||
<syntax>
|
||||
<parameter name="Conference">
|
||||
<para>The name of the Confbridge conference.</para>
|
||||
</parameter>
|
||||
<parameter name="Parties">
|
||||
<para>Number of users in the conference.</para>
|
||||
<para>This includes both active and waiting users.</para>
|
||||
</parameter>
|
||||
<parameter name="Marked">
|
||||
<para>Number of marked users in the conference.</para>
|
||||
</parameter>
|
||||
<parameter name="Locked">
|
||||
<para>Is the conference locked?</para>
|
||||
<enumlist>
|
||||
<enum name="Yes"/>
|
||||
<enum name="No"/>
|
||||
</enumlist>
|
||||
</parameter>
|
||||
<parameter name="Muted">
|
||||
<para>Is the conference muted?</para>
|
||||
<enumlist>
|
||||
<enum name="Yes"/>
|
||||
<enum name="No"/>
|
||||
</enumlist>
|
||||
</parameter>
|
||||
</syntax>
|
||||
</managerEventInstance>
|
||||
</managerEvent>
|
||||
<manager name="ConfbridgeMute" language="en_US">
|
||||
<synopsis>
|
||||
Mute a Confbridge user.
|
||||
|
@ -3991,6 +4022,7 @@ static int action_confbridgelist_item(struct mansession *s, const char *id_text,
|
|||
"MarkedUser: %s\r\n"
|
||||
"WaitMarked: %s\r\n"
|
||||
"EndMarked: %s\r\n"
|
||||
"EndMarkedAny: %s\r\n"
|
||||
"Waiting: %s\r\n"
|
||||
"Muted: %s\r\n"
|
||||
"Talking: %s\r\n"
|
||||
|
@ -4003,6 +4035,7 @@ static int action_confbridgelist_item(struct mansession *s, const char *id_text,
|
|||
AST_YESNO(ast_test_flag(&user->u_profile, USER_OPT_MARKEDUSER)),
|
||||
AST_YESNO(ast_test_flag(&user->u_profile, USER_OPT_WAITMARKED)),
|
||||
AST_YESNO(ast_test_flag(&user->u_profile, USER_OPT_ENDMARKED)),
|
||||
AST_YESNO(ast_test_flag(&user->u_profile, USER_OPT_ENDMARKEDANY)),
|
||||
AST_YESNO(waiting),
|
||||
AST_YESNO(user->muted),
|
||||
AST_YESNO(user->talking),
|
||||
|
|
|
@ -0,0 +1,383 @@
|
|||
/*
|
||||
* Asterisk -- An open source telephony toolkit.
|
||||
*
|
||||
* Copyright 2022, Naveen Albert <asterisk@phreaknet.org>
|
||||
*
|
||||
* Naveen Albert <asterisk@phreaknet.org>
|
||||
*
|
||||
* See http://www.asterisk.org for more information about
|
||||
* the Asterisk project. Please do not directly contact
|
||||
* any of the maintainers of this project for assistance;
|
||||
* the project provides a web site, mailing lists and IRC
|
||||
* channels for your use.
|
||||
*
|
||||
* This program is free software, distributed under the terms of
|
||||
* the GNU General Public License Version 2. See the LICENSE file
|
||||
* at the top of the source tree.
|
||||
*/
|
||||
|
||||
/*! \file
|
||||
*
|
||||
* \brief If Branch Implementation
|
||||
*
|
||||
* \author Naveen Albert <asterisk@phreaknet.org>
|
||||
*
|
||||
* \ingroup applications
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<support_level>extended</support_level>
|
||||
***/
|
||||
|
||||
#include "asterisk.h"
|
||||
|
||||
#include "asterisk/pbx.h"
|
||||
#include "asterisk/module.h"
|
||||
#include "asterisk/channel.h"
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="If" language="en_US">
|
||||
<synopsis>
|
||||
Start an if branch.
|
||||
</synopsis>
|
||||
<syntax>
|
||||
<parameter name="expr" required="true" />
|
||||
</syntax>
|
||||
<description>
|
||||
<para>Start an If branch. Execution will continue inside the branch
|
||||
if expr is true.</para>
|
||||
<note><para>This application (and related applications) set variables
|
||||
internally during execution.</para></note>
|
||||
</description>
|
||||
<see-also>
|
||||
<ref type="application">ElseIf</ref>
|
||||
<ref type="application">Else</ref>
|
||||
<ref type="application">EndIf</ref>
|
||||
<ref type="application">ExitIf</ref>
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="ElseIf" language="en_US">
|
||||
<synopsis>
|
||||
Start an else if branch.
|
||||
</synopsis>
|
||||
<syntax>
|
||||
<parameter name="expr" required="true" />
|
||||
</syntax>
|
||||
<description>
|
||||
<para>Start an optional ElseIf branch. Execution will continue inside the branch
|
||||
if expr is true and if previous If and ElseIf branches evaluated to false.</para>
|
||||
<para>Please note that execution inside a true If branch will fallthrough into
|
||||
ElseIf unless the If segment is terminated with an ExitIf call. This is only
|
||||
necessary with ElseIf but not with Else.</para>
|
||||
</description>
|
||||
<see-also>
|
||||
<ref type="application">If</ref>
|
||||
<ref type="application">Else</ref>
|
||||
<ref type="application">EndIf</ref>
|
||||
<ref type="application">ExitIf</ref>
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="Else" language="en_US">
|
||||
<synopsis>
|
||||
Define an optional else branch.
|
||||
</synopsis>
|
||||
<syntax>
|
||||
<parameter name="expr" required="true" />
|
||||
</syntax>
|
||||
<description>
|
||||
<para>Start an Else branch. Execution will jump here if all previous
|
||||
If and ElseIf branches evaluated to false.</para>
|
||||
</description>
|
||||
<see-also>
|
||||
<ref type="application">If</ref>
|
||||
<ref type="application">ElseIf</ref>
|
||||
<ref type="application">EndIf</ref>
|
||||
<ref type="application">ExitIf</ref>
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="EndIf" language="en_US">
|
||||
<synopsis>
|
||||
End an if branch.
|
||||
</synopsis>
|
||||
<syntax />
|
||||
<description>
|
||||
<para>Ends the branch begun by the preceding <literal>If()</literal> application.</para>
|
||||
</description>
|
||||
<see-also>
|
||||
<ref type="application">If</ref>
|
||||
<ref type="application">ElseIf</ref>
|
||||
<ref type="application">Else</ref>
|
||||
<ref type="application">ExitIf</ref>
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="ExitIf" language="en_US">
|
||||
<synopsis>
|
||||
End an If branch.
|
||||
</synopsis>
|
||||
<syntax />
|
||||
<description>
|
||||
<para>Exits an <literal>If()</literal> branch, whether or not it has completed.</para>
|
||||
</description>
|
||||
<see-also>
|
||||
<ref type="application">If</ref>
|
||||
<ref type="application">ElseIf</ref>
|
||||
<ref type="application">Else</ref>
|
||||
<ref type="application">EndIf</ref>
|
||||
</see-also>
|
||||
</application>
|
||||
***/
|
||||
|
||||
static char *if_app = "If";
|
||||
static char *elseif_app = "ElseIf";
|
||||
static char *else_app = "Else";
|
||||
static char *stop_app = "EndIf";
|
||||
static char *exit_app = "ExitIf";
|
||||
|
||||
#define VAR_SIZE 64
|
||||
|
||||
static const char *get_index(struct ast_channel *chan, const char *prefix, int idx)
|
||||
{
|
||||
char varname[VAR_SIZE];
|
||||
|
||||
snprintf(varname, VAR_SIZE, "%s_%d", prefix, idx);
|
||||
return pbx_builtin_getvar_helper(chan, varname);
|
||||
}
|
||||
|
||||
static struct ast_exten *find_matching_priority(struct ast_context *c, const char *exten, int priority, const char *callerid)
|
||||
{
|
||||
struct ast_exten *e;
|
||||
struct ast_context *c2;
|
||||
int idx;
|
||||
|
||||
for (e = ast_walk_context_extensions(c, NULL); e; e = ast_walk_context_extensions(c, e)) {
|
||||
if (ast_extension_match(ast_get_extension_name(e), exten)) {
|
||||
int needmatch = ast_get_extension_matchcid(e);
|
||||
if ((needmatch && ast_extension_match(ast_get_extension_cidmatch(e), callerid)) ||
|
||||
(!needmatch)) {
|
||||
/* This is the matching extension we want */
|
||||
struct ast_exten *p;
|
||||
for (p = ast_walk_extension_priorities(e, NULL); p; p = ast_walk_extension_priorities(e, p)) {
|
||||
if (priority != ast_get_extension_priority(p))
|
||||
continue;
|
||||
return p;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* No match; run through includes */
|
||||
for (idx = 0; idx < ast_context_includes_count(c); idx++) {
|
||||
const struct ast_include *i = ast_context_includes_get(c, idx);
|
||||
|
||||
for (c2 = ast_walk_contexts(NULL); c2; c2 = ast_walk_contexts(c2)) {
|
||||
if (!strcmp(ast_get_context_name(c2), ast_get_include_name(i))) {
|
||||
e = find_matching_priority(c2, exten, priority, callerid);
|
||||
if (e)
|
||||
return e;
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int find_matching_endif(struct ast_channel *chan, const char *otherapp)
|
||||
{
|
||||
struct ast_context *c;
|
||||
int res = -1;
|
||||
|
||||
if (ast_rdlock_contexts()) {
|
||||
ast_log(LOG_ERROR, "Failed to lock contexts list\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (c = ast_walk_contexts(NULL); c; c = ast_walk_contexts(c)) {
|
||||
struct ast_exten *e;
|
||||
|
||||
if (!ast_rdlock_context(c)) {
|
||||
if (!strcmp(ast_get_context_name(c), ast_channel_context(chan))) {
|
||||
/* This is the matching context we want */
|
||||
int cur_priority = ast_channel_priority(chan) + 1, level = 1;
|
||||
|
||||
for (e = find_matching_priority(c, ast_channel_exten(chan), cur_priority,
|
||||
S_COR(ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, NULL));
|
||||
e;
|
||||
e = find_matching_priority(c, ast_channel_exten(chan), ++cur_priority,
|
||||
S_COR(ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, NULL))) {
|
||||
if (!strcasecmp(ast_get_extension_app(e), "IF")) {
|
||||
level++;
|
||||
} else if (!strcasecmp(ast_get_extension_app(e), "ENDIF")) {
|
||||
level--;
|
||||
}
|
||||
|
||||
if (!otherapp && level == 0) {
|
||||
res = cur_priority;
|
||||
break;
|
||||
} else if (otherapp && level == 1 && !strcasecmp(ast_get_extension_app(e), otherapp)) {
|
||||
res = cur_priority;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
ast_unlock_context(c);
|
||||
if (res > 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
ast_unlock_contexts();
|
||||
return res;
|
||||
}
|
||||
|
||||
static int if_helper(struct ast_channel *chan, const char *data, int end)
|
||||
{
|
||||
int res = 0;
|
||||
const char *if_pri = NULL;
|
||||
char *my_name = NULL;
|
||||
const char *label = NULL;
|
||||
char varname[VAR_SIZE + 3]; /* + IF_ */
|
||||
char end_varname[sizeof(varname) + 4]; /* + END_ + sizeof(varname) */
|
||||
const char *prefix = "IF";
|
||||
size_t size = 0;
|
||||
int used_index_i = -1, x = 0;
|
||||
char used_index[VAR_SIZE] = "0", new_index[VAR_SIZE] = "0";
|
||||
|
||||
if (!chan) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (x = 0 ;; x++) {
|
||||
if (get_index(chan, prefix, x)) {
|
||||
used_index_i = x;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
snprintf(used_index, sizeof(used_index), "%d", used_index_i);
|
||||
snprintf(new_index, sizeof(new_index), "%d", used_index_i + 1);
|
||||
|
||||
size = strlen(ast_channel_context(chan)) + strlen(ast_channel_exten(chan)) + 32;
|
||||
my_name = ast_alloca(size);
|
||||
memset(my_name, 0, size);
|
||||
snprintf(my_name, size, "%s_%s_%d", ast_channel_context(chan), ast_channel_exten(chan), ast_channel_priority(chan));
|
||||
|
||||
ast_channel_lock(chan);
|
||||
if (end > 1) {
|
||||
label = used_index;
|
||||
} else if (!(label = pbx_builtin_getvar_helper(chan, my_name))) {
|
||||
label = new_index;
|
||||
pbx_builtin_setvar_helper(chan, my_name, label);
|
||||
}
|
||||
snprintf(varname, sizeof(varname), "%s_%s", prefix, label);
|
||||
if ((if_pri = pbx_builtin_getvar_helper(chan, varname)) && !end) {
|
||||
if_pri = ast_strdupa(if_pri);
|
||||
snprintf(end_varname,sizeof(end_varname),"END_%s",varname);
|
||||
}
|
||||
ast_channel_unlock(chan);
|
||||
|
||||
if ((end <= 1 && !pbx_checkcondition(ast_strdupa(data))) || (end > 1)) {
|
||||
/* Condition Met (clean up helper vars) */
|
||||
const char *goto_str;
|
||||
int pri, endifpri;
|
||||
pbx_builtin_setvar_helper(chan, varname, NULL);
|
||||
pbx_builtin_setvar_helper(chan, my_name, NULL);
|
||||
snprintf(end_varname,sizeof(end_varname),"END_%s",varname);
|
||||
ast_channel_lock(chan);
|
||||
endifpri = find_matching_endif(chan, NULL);
|
||||
if ((goto_str = pbx_builtin_getvar_helper(chan, end_varname))) {
|
||||
ast_parseable_goto(chan, goto_str);
|
||||
pbx_builtin_setvar_helper(chan, end_varname, NULL);
|
||||
} else if (end <= 1 && (pri = find_matching_endif(chan, "ElseIf")) > 0 && pri < endifpri) {
|
||||
pri--; /* back up a priority, since it returned the priority after the ElseIf */
|
||||
/* If is false, and ElseIf exists, so jump to ElseIf */
|
||||
ast_verb(3, "Taking conditional false branch, jumping to priority %d\n", pri);
|
||||
ast_channel_priority_set(chan, pri);
|
||||
} else if (end <= 1 && (pri = find_matching_endif(chan, "Else")) > 0 && pri < endifpri) {
|
||||
/* don't need to back up a priority, because we don't actually need to execute Else, just jump to the priority after. Directly executing Else will exit the conditional. */
|
||||
/* If is false, and Else exists, so jump to Else */
|
||||
ast_verb(3, "Taking absolute false branch, jumping to priority %d\n", pri);
|
||||
ast_channel_priority_set(chan, pri);
|
||||
} else {
|
||||
pri = endifpri;
|
||||
if (pri > 0) {
|
||||
ast_verb(3, "Exiting conditional, jumping to priority %d\n", pri);
|
||||
ast_channel_priority_set(chan, pri);
|
||||
} else if (end == 4) { /* Condition added because of end > 0 instead of end == 4 */
|
||||
ast_log(LOG_WARNING, "Couldn't find matching EndIf? (If at %s@%s priority %d)\n", ast_channel_context(chan), ast_channel_exten(chan), ast_channel_priority(chan));
|
||||
}
|
||||
}
|
||||
ast_channel_unlock(chan);
|
||||
return res;
|
||||
}
|
||||
|
||||
if (end <= 1 && !if_pri) {
|
||||
char *goto_str;
|
||||
size = strlen(ast_channel_context(chan)) + strlen(ast_channel_exten(chan)) + 32;
|
||||
goto_str = ast_alloca(size);
|
||||
memset(goto_str, 0, size);
|
||||
snprintf(goto_str, size, "%s,%s,%d", ast_channel_context(chan), ast_channel_exten(chan), ast_channel_priority(chan));
|
||||
pbx_builtin_setvar_helper(chan, varname, goto_str);
|
||||
} else if (end > 1 && if_pri) {
|
||||
/* END of branch */
|
||||
snprintf(end_varname, sizeof(end_varname), "END_%s", varname);
|
||||
if (!pbx_builtin_getvar_helper(chan, end_varname)) {
|
||||
char *goto_str;
|
||||
size = strlen(ast_channel_context(chan)) + strlen(ast_channel_exten(chan)) + 32;
|
||||
goto_str = ast_alloca(size);
|
||||
memset(goto_str, 0, size);
|
||||
snprintf(goto_str, size, "%s,%s,%d", ast_channel_context(chan), ast_channel_exten(chan), ast_channel_priority(chan)+1);
|
||||
pbx_builtin_setvar_helper(chan, end_varname, goto_str);
|
||||
}
|
||||
ast_parseable_goto(chan, if_pri);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static int if_exec(struct ast_channel *chan, const char *data) {
|
||||
return if_helper(chan, data, 0);
|
||||
}
|
||||
|
||||
static int elseif_exec(struct ast_channel *chan, const char *data) {
|
||||
return if_helper(chan, data, 1);
|
||||
}
|
||||
|
||||
static int end_exec(struct ast_channel *chan, const char *data) {
|
||||
return if_helper(chan, data, 2);
|
||||
}
|
||||
|
||||
static int else_exec(struct ast_channel *chan, const char *data) {
|
||||
return if_helper(chan, data, 3);
|
||||
}
|
||||
|
||||
static int exit_exec(struct ast_channel *chan, const char *data) {
|
||||
return if_helper(chan, data, 4);
|
||||
}
|
||||
|
||||
static int unload_module(void)
|
||||
{
|
||||
int res;
|
||||
|
||||
res = ast_unregister_application(if_app);
|
||||
res |= ast_unregister_application(elseif_app);
|
||||
res |= ast_unregister_application(stop_app);
|
||||
res |= ast_unregister_application(else_app);
|
||||
res |= ast_unregister_application(exit_app);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static int load_module(void)
|
||||
{
|
||||
int res;
|
||||
|
||||
res = ast_register_application_xml(if_app, if_exec);
|
||||
res |= ast_register_application_xml(elseif_app, elseif_exec);
|
||||
res |= ast_register_application_xml(stop_app, end_exec);
|
||||
res |= ast_register_application_xml(else_app, else_exec);
|
||||
res |= ast_register_application_xml(exit_app, exit_exec);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "If Branch and Conditional Execution");
|
|
@ -639,6 +639,82 @@
|
|||
</syntax>
|
||||
</managerEventInstance>
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="MeetmeList">
|
||||
<managerEventInstance class="EVENT_FLAG_CALL">
|
||||
<synopsis>Raised in response to a MeetmeList command.</synopsis>
|
||||
<syntax>
|
||||
<parameter name="Conference">
|
||||
<para>Conference ID.</para>
|
||||
</parameter>
|
||||
<parameter name="UserNumber">
|
||||
<para>User ID.</para>
|
||||
</parameter>
|
||||
<parameter name="CallerIDNum">
|
||||
<para>Caller ID number.</para>
|
||||
</parameter>
|
||||
<parameter name="CallerIDName">
|
||||
<para>Caller ID name.</para>
|
||||
</parameter>
|
||||
<parameter name="ConnectedLineNum">
|
||||
<para>Connected Line number.</para>
|
||||
</parameter>
|
||||
<parameter name="ConnectedLineName">
|
||||
<para>Connected Line name.</para>
|
||||
</parameter>
|
||||
<parameter name="Channel">
|
||||
<para>Channel name</para>
|
||||
</parameter>
|
||||
<parameter name="Admin">
|
||||
<para>Whether or not the user is an admin.</para>
|
||||
</parameter>
|
||||
<parameter name="Role">
|
||||
<para>User role. Can be "Listen only", "Talk only", or "Talk and listen".</para>
|
||||
</parameter>
|
||||
<parameter name="MarkedUser">
|
||||
<para>Whether or not the user is a marked user.</para>
|
||||
</parameter>
|
||||
<parameter name="Muted">
|
||||
<para>Whether or not the user is currently muted.</para>
|
||||
</parameter>
|
||||
<parameter name="Talking">
|
||||
<para>Whether or not the user is currently talking.</para>
|
||||
</parameter>
|
||||
</syntax>
|
||||
<see-also>
|
||||
<ref type="manager">MeetmeList</ref>
|
||||
<ref type="application">MeetMe</ref>
|
||||
</see-also>
|
||||
</managerEventInstance>
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="MeetmeListRooms">
|
||||
<managerEventInstance class="EVENT_FLAG_CALL">
|
||||
<synopsis>Raised in response to a MeetmeListRooms command.</synopsis>
|
||||
<syntax>
|
||||
<parameter name="Conference">
|
||||
<para>Conference ID.</para>
|
||||
</parameter>
|
||||
<parameter name="Parties">
|
||||
<para>Number of parties in the conference.</para>
|
||||
</parameter>
|
||||
<parameter name="Marked">
|
||||
<para>Number of marked users in the conference.</para>
|
||||
</parameter>
|
||||
<parameter name="Activity">
|
||||
<para>Total duration of conference in HH:MM:SS format.</para>
|
||||
</parameter>
|
||||
<parameter name="Creation">
|
||||
<para>How the conference was created: "Dyanmic" or "Static".</para>
|
||||
</parameter>
|
||||
<parameter name="Locked">
|
||||
<para>Whether or not the conference is locked.</para>
|
||||
</parameter>
|
||||
</syntax>
|
||||
<see-also>
|
||||
<ref type="manager">MeetmeListRooms</ref>
|
||||
<ref type="application">MeetMe</ref>
|
||||
</see-also>
|
||||
</managerEventInstance>
|
||||
</managerEvent>
|
||||
***/
|
||||
|
||||
#define CONFIG_FILE_NAME "meetme.conf"
|
||||
|
@ -6073,7 +6149,7 @@ struct run_station_args {
|
|||
|
||||
static void answer_trunk_chan(struct ast_channel *chan)
|
||||
{
|
||||
ast_answer(chan);
|
||||
ast_raw_answer(chan);
|
||||
ast_indicate(chan, -1);
|
||||
}
|
||||
|
||||
|
@ -6918,8 +6994,18 @@ static void *dial_trunk(void *data)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
/* Wait for dial to end, while servicing the channel */
|
||||
while (ast_waitfor(trunk_ref->chan, 100)) {
|
||||
unsigned int done = 0;
|
||||
struct ast_frame *fr = ast_read(trunk_ref->chan);
|
||||
|
||||
if (!fr) {
|
||||
ast_debug(1, "Channel %s did not return a frame, must have hung up\n", ast_channel_name(trunk_ref->chan));
|
||||
done = 1;
|
||||
break;
|
||||
}
|
||||
ast_frfree(fr); /* Ignore while dialing */
|
||||
|
||||
switch ((dial_res = ast_dial_state(dial))) {
|
||||
case AST_DIAL_RESULT_ANSWERED:
|
||||
trunk_ref->trunk->chan = ast_dial_answered(dial);
|
||||
|
@ -6956,8 +7042,6 @@ static void *dial_trunk(void *data)
|
|||
last_state = current_state;
|
||||
}
|
||||
|
||||
/* avoid tight loop... sleep for 1/10th second */
|
||||
ast_safe_sleep(trunk_ref->chan, 100);
|
||||
}
|
||||
|
||||
if (!trunk_ref->trunk->chan) {
|
||||
|
@ -7116,8 +7200,10 @@ static int sla_station_exec(struct ast_channel *chan, const char *data)
|
|||
sla_change_trunk_state(trunk_ref->trunk, SLA_TRUNK_STATE_UP, ALL_TRUNK_REFS, NULL);
|
||||
/* Create a thread to dial the trunk and dump it into the conference.
|
||||
* However, we want to wait until the trunk has been dialed and the
|
||||
* conference is created before continuing on here. */
|
||||
ast_autoservice_start(chan);
|
||||
* conference is created before continuing on here.
|
||||
* Don't autoservice the channel or we'll have multiple threads
|
||||
* handling it. dial_trunk services the channel.
|
||||
*/
|
||||
ast_mutex_init(&cond_lock);
|
||||
ast_cond_init(&cond, NULL);
|
||||
ast_mutex_lock(&cond_lock);
|
||||
|
@ -7126,7 +7212,7 @@ static int sla_station_exec(struct ast_channel *chan, const char *data)
|
|||
ast_mutex_unlock(&cond_lock);
|
||||
ast_mutex_destroy(&cond_lock);
|
||||
ast_cond_destroy(&cond);
|
||||
ast_autoservice_stop(chan);
|
||||
|
||||
if (!trunk_ref->trunk->chan) {
|
||||
ast_debug(1, "Trunk didn't get created. chan: %lx\n", (unsigned long) trunk_ref->trunk->chan);
|
||||
pbx_builtin_setvar_helper(chan, "SLASTATION_STATUS", "CONGESTION");
|
||||
|
|
|
@ -90,6 +90,16 @@
|
|||
<para>Play a periodic beep while this call is being recorded.</para>
|
||||
<argument name="interval"><para>Interval, in seconds. Default is 15.</para></argument>
|
||||
</option>
|
||||
<option name="c">
|
||||
<para>Use the real Caller ID from the channel for the voicemail Caller ID.</para>
|
||||
<para>By default, the Connected Line is used. If you want the channel caller's
|
||||
real number, you may need to specify this option.</para>
|
||||
</option>
|
||||
<option name="d">
|
||||
<para>Delete the recording file as soon as MixMonitor is done with it.</para>
|
||||
<para>For example, if you use the m option to dispatch the recording to a voicemail box,
|
||||
you can specify this option to delete the original copy of it afterwards.</para>
|
||||
</option>
|
||||
<option name="v">
|
||||
<para>Adjust the <emphasis>heard</emphasis> volume by a factor of <replaceable>x</replaceable>
|
||||
(range <literal>-4</literal> to <literal>4</literal>)</para>
|
||||
|
@ -407,6 +417,8 @@ enum mixmonitor_flags {
|
|||
MUXFLAG_BEEP_STOP = (1 << 13),
|
||||
MUXFLAG_DEPRECATED_RWSYNC = (1 << 14),
|
||||
MUXFLAG_NO_RWSYNC = (1 << 15),
|
||||
MUXFLAG_AUTO_DELETE = (1 << 16),
|
||||
MUXFLAG_REAL_CALLERID = (1 << 17),
|
||||
};
|
||||
|
||||
enum mixmonitor_args {
|
||||
|
@ -427,6 +439,8 @@ AST_APP_OPTIONS(mixmonitor_opts, {
|
|||
AST_APP_OPTION('a', MUXFLAG_APPEND),
|
||||
AST_APP_OPTION('b', MUXFLAG_BRIDGED),
|
||||
AST_APP_OPTION_ARG('B', MUXFLAG_BEEP, OPT_ARG_BEEP_INTERVAL),
|
||||
AST_APP_OPTION('c', MUXFLAG_REAL_CALLERID),
|
||||
AST_APP_OPTION('d', MUXFLAG_AUTO_DELETE),
|
||||
AST_APP_OPTION('p', MUXFLAG_BEEP_START),
|
||||
AST_APP_OPTION('P', MUXFLAG_BEEP_STOP),
|
||||
AST_APP_OPTION_ARG('v', MUXFLAG_READVOLUME, OPT_ARG_READVOLUME),
|
||||
|
@ -860,6 +874,19 @@ static void *mixmonitor_thread(void *obj)
|
|||
ast_debug(3, "No recipients to forward monitor to, moving on.\n");
|
||||
}
|
||||
|
||||
if (ast_test_flag(mixmonitor, MUXFLAG_AUTO_DELETE)) {
|
||||
ast_debug(3, "Deleting our copies of recording files\n");
|
||||
if (!ast_strlen_zero(fs_ext)) {
|
||||
ast_filedelete(mixmonitor->filename, fs_ext);
|
||||
}
|
||||
if (!ast_strlen_zero(fs_read_ext)) {
|
||||
ast_filedelete(mixmonitor->filename_read, fs_ext);
|
||||
}
|
||||
if (!ast_strlen_zero(fs_write_ext)) {
|
||||
ast_filedelete(mixmonitor->filename_write, fs_ext);
|
||||
}
|
||||
}
|
||||
|
||||
mixmonitor_free(mixmonitor);
|
||||
|
||||
ast_module_unref(ast_module_info->self);
|
||||
|
@ -1015,20 +1042,37 @@ static int launch_monitor_thread(struct ast_channel *chan, const char *filename,
|
|||
|
||||
if (!ast_strlen_zero(recipients)) {
|
||||
char callerid[256];
|
||||
struct ast_party_connected_line *connected;
|
||||
|
||||
ast_channel_lock(chan);
|
||||
|
||||
/* We use the connected line of the invoking channel for caller ID. */
|
||||
/* We use the connected line of the invoking channel for caller ID,
|
||||
* unless we've been told to use the Caller ID.
|
||||
* The initial use for this relied on Connected Line to get the
|
||||
* actual number for recording with Digium phones,
|
||||
* but in generic use the Caller ID is likely what people want.
|
||||
*/
|
||||
|
||||
connected = ast_channel_connected(chan);
|
||||
ast_debug(3, "Connected Line CID = %d - %s : %d - %s\n", connected->id.name.valid,
|
||||
connected->id.name.str, connected->id.number.valid,
|
||||
connected->id.number.str);
|
||||
ast_callerid_merge(callerid, sizeof(callerid),
|
||||
S_COR(connected->id.name.valid, connected->id.name.str, NULL),
|
||||
S_COR(connected->id.number.valid, connected->id.number.str, NULL),
|
||||
"Unknown");
|
||||
if (ast_test_flag(mixmonitor, MUXFLAG_REAL_CALLERID)) {
|
||||
struct ast_party_caller *caller;
|
||||
caller = ast_channel_caller(chan);
|
||||
ast_debug(3, "Caller ID = %d - %s : %d - %s\n", caller->id.name.valid,
|
||||
caller->id.name.str, caller->id.number.valid,
|
||||
caller->id.number.str);
|
||||
ast_callerid_merge(callerid, sizeof(callerid),
|
||||
S_COR(caller->id.name.valid, caller->id.name.str, NULL),
|
||||
S_COR(caller->id.number.valid, caller->id.number.str, NULL),
|
||||
"Unknown");
|
||||
} else {
|
||||
struct ast_party_connected_line *connected;
|
||||
connected = ast_channel_connected(chan);
|
||||
ast_debug(3, "Connected Line CID = %d - %s : %d - %s\n", connected->id.name.valid,
|
||||
connected->id.name.str, connected->id.number.valid,
|
||||
connected->id.number.str);
|
||||
ast_callerid_merge(callerid, sizeof(callerid),
|
||||
S_COR(connected->id.name.valid, connected->id.name.str, NULL),
|
||||
S_COR(connected->id.number.valid, connected->id.number.str, NULL),
|
||||
"Unknown");
|
||||
}
|
||||
|
||||
ast_string_field_set(mixmonitor, call_context, ast_channel_context(chan));
|
||||
ast_string_field_set(mixmonitor, call_macrocontext, ast_channel_macrocontext(chan));
|
||||
|
|
|
@ -101,7 +101,7 @@ static int mp3play(const char *filename, unsigned int sampling_rate, int fd)
|
|||
/* Execute mpg123, but buffer if it's a net connection */
|
||||
if (!strncasecmp(filename, "http://", 7) && strstr(filename, ".m3u")) {
|
||||
char buffer_size_str[8];
|
||||
snprintf(buffer_size_str, 8, "%u", (int) 0.5*2*sampling_rate/1000); // 0.5 seconds for a live stream
|
||||
snprintf(buffer_size_str, 8, "%u", (int) 0.5*2*sampling_rate/1000); /* 0.5 seconds for a live stream */
|
||||
/* Most commonly installed in /usr/local/bin */
|
||||
execl(LOCAL_MPG_123, "mpg123", "-e", "s16", "-q", "-s", "-b", buffer_size_str, "-f", "8192", "--mono", "-r", sampling_rate_str, "-@", filename, (char *)NULL);
|
||||
/* But many places has it in /usr/bin */
|
||||
|
@ -111,7 +111,7 @@ static int mp3play(const char *filename, unsigned int sampling_rate, int fd)
|
|||
}
|
||||
else if (!strncasecmp(filename, "http://", 7)) {
|
||||
char buffer_size_str[8];
|
||||
snprintf(buffer_size_str, 8, "%u", 6*2*sampling_rate/1000); // 6 seconds for a remote MP3 file
|
||||
snprintf(buffer_size_str, 8, "%u", 6*2*sampling_rate/1000); /* 6 seconds for a remote MP3 file */
|
||||
/* Most commonly installed in /usr/local/bin */
|
||||
execl(LOCAL_MPG_123, "mpg123", "-e", "s16", "-q", "-s", "-b", buffer_size_str, "-f", "8192", "--mono", "-r", sampling_rate_str, filename, (char *)NULL);
|
||||
/* But many places has it in /usr/bin */
|
||||
|
|
|
@ -377,6 +377,26 @@ static int pop_exec(struct ast_channel *chan, const char *data)
|
|||
return res;
|
||||
}
|
||||
|
||||
static int frames_left(struct ast_channel *chan)
|
||||
{
|
||||
struct ast_datastore *stack_store;
|
||||
struct gosub_stack_list *oldlist;
|
||||
int exists;
|
||||
|
||||
ast_channel_lock(chan);
|
||||
stack_store = ast_channel_datastore_find(chan, &stack_info, NULL);
|
||||
if (!stack_store) {
|
||||
ast_channel_unlock(chan);
|
||||
return -1;
|
||||
}
|
||||
oldlist = stack_store->data;
|
||||
AST_LIST_LOCK(oldlist);
|
||||
exists = oldlist->first ? 1 : 0;
|
||||
AST_LIST_UNLOCK(oldlist);
|
||||
ast_channel_unlock(chan);
|
||||
return exists;
|
||||
}
|
||||
|
||||
static int return_exec(struct ast_channel *chan, const char *data)
|
||||
{
|
||||
struct ast_datastore *stack_store;
|
||||
|
@ -384,6 +404,7 @@ static int return_exec(struct ast_channel *chan, const char *data)
|
|||
struct gosub_stack_list *oldlist;
|
||||
const char *retval = data;
|
||||
int res = 0;
|
||||
int lastframe;
|
||||
|
||||
ast_channel_lock(chan);
|
||||
if (!(stack_store = ast_channel_datastore_find(chan, &stack_info, NULL))) {
|
||||
|
@ -395,6 +416,7 @@ static int return_exec(struct ast_channel *chan, const char *data)
|
|||
oldlist = stack_store->data;
|
||||
AST_LIST_LOCK(oldlist);
|
||||
oldframe = AST_LIST_REMOVE_HEAD(oldlist, entries);
|
||||
lastframe = oldlist->first ? 0 : 1;
|
||||
AST_LIST_UNLOCK(oldlist);
|
||||
|
||||
if (!oldframe) {
|
||||
|
@ -412,12 +434,19 @@ static int return_exec(struct ast_channel *chan, const char *data)
|
|||
* what was there before. Channels that do not have a PBX may
|
||||
* not have the context or exten set.
|
||||
*/
|
||||
ast_channel_context_set(chan, oldframe->context);
|
||||
ast_channel_exten_set(chan, oldframe->extension);
|
||||
if (ast_test_flag(ast_channel_flags(chan), AST_FLAG_IN_AUTOLOOP)) {
|
||||
--oldframe->priority;
|
||||
if (ast_channel_pbx(chan) || !lastframe) {
|
||||
/* If there's no PBX, the "old location" is simply
|
||||
* the configured context for the device, such as
|
||||
* for pre-dial handlers, and restoring this location
|
||||
* is nonsensical. So if no PBX and there are no further
|
||||
* frames, leave the location as it is. */
|
||||
ast_channel_context_set(chan, oldframe->context);
|
||||
ast_channel_exten_set(chan, oldframe->extension);
|
||||
if (ast_test_flag(ast_channel_flags(chan), AST_FLAG_IN_AUTOLOOP)) {
|
||||
--oldframe->priority;
|
||||
}
|
||||
ast_channel_priority_set(chan, oldframe->priority);
|
||||
}
|
||||
ast_channel_priority_set(chan, oldframe->priority);
|
||||
ast_set2_flag(ast_channel_flags(chan), oldframe->in_subroutine, AST_FLAG_SUBROUTINE_EXEC);
|
||||
|
||||
gosub_release_frame(chan, oldframe);
|
||||
|
@ -1068,15 +1097,18 @@ static int gosub_run(struct ast_channel *chan, const char *sub_args, int ignore_
|
|||
ast_channel_priority(chan), ast_channel_name(chan));
|
||||
}
|
||||
|
||||
/* Did the routine return? */
|
||||
if (ast_channel_priority(chan) == saved_priority
|
||||
/* Did the routine return?
|
||||
* For things like predial where there's no PBX on the channel yet,
|
||||
* the last return leaves the location alone so we can print it out correctly here.
|
||||
* So to ensure we finished properly, make sure there are no frames left in that case. */
|
||||
if ((!ast_channel_pbx(chan) && !frames_left(chan)) || (ast_channel_priority(chan) == saved_priority
|
||||
&& !strcmp(ast_channel_context(chan), saved_context)
|
||||
&& !strcmp(ast_channel_exten(chan), saved_exten)) {
|
||||
&& !strcmp(ast_channel_exten(chan), saved_exten))) {
|
||||
ast_verb(3, "%s Internal %s(%s) complete GOSUB_RETVAL=%s\n",
|
||||
ast_channel_name(chan), app_gosub, sub_args,
|
||||
S_OR(pbx_builtin_getvar_helper(chan, "GOSUB_RETVAL"), ""));
|
||||
} else {
|
||||
ast_log(LOG_NOTICE, "%s Abnormal '%s(%s)' exit. Popping routine return locations.\n",
|
||||
ast_log(LOG_WARNING, "%s Abnormal '%s(%s)' exit. Popping routine return locations.\n",
|
||||
ast_channel_name(chan), app_gosub, sub_args);
|
||||
balance_stack(chan);
|
||||
pbx_builtin_setvar_helper(chan, "GOSUB_RETVAL", "");
|
||||
|
|
|
@ -570,6 +570,7 @@ static AST_LIST_HEAD_STATIC(vmstates, vmstate);
|
|||
#define VM_MOVEHEARD (1 << 16) /*!< Move a "heard" message to Old after listening to it */
|
||||
#define VM_MESSAGEWRAP (1 << 17) /*!< Wrap around from the last message to the first, and vice-versa */
|
||||
#define VM_FWDURGAUTO (1 << 18) /*!< Autoset of Urgent flag on forwarded Urgent messages set globally */
|
||||
#define VM_EMAIL_EXT_RECS (1 << 19) /*!< Send voicemail emails when an external recording is added to a mailbox */
|
||||
#define ERROR_LOCK_PATH -100
|
||||
#define ERROR_MAX_MSGS -101
|
||||
#define OPERATOR_EXIT 300
|
||||
|
@ -1258,6 +1259,8 @@ static void apply_option(struct ast_vm_user *vmu, const char *var, const char *v
|
|||
ast_set2_flag(vmu, ast_true(value), VM_ATTACH);
|
||||
} else if (!strcasecmp(var, "attachfmt")) {
|
||||
ast_copy_string(vmu->attachfmt, value, sizeof(vmu->attachfmt));
|
||||
} else if (!strcasecmp(var, "attachextrecs")) {
|
||||
ast_set2_flag(vmu, ast_true(value), VM_EMAIL_EXT_RECS);
|
||||
} else if (!strcasecmp(var, "serveremail")) {
|
||||
ast_copy_string(vmu->serveremail, value, sizeof(vmu->serveremail));
|
||||
} else if (!strcasecmp(var, "fromstring")) {
|
||||
|
@ -6418,6 +6421,12 @@ static int msg_create_from_file(struct ast_vm_recording_data *recdata)
|
|||
* to do both with one line and is also safe to use with file storage mode. Also, if we are using ODBC, now is a good
|
||||
* time to create the voicemail database entry. */
|
||||
if (ast_fileexists(destination, NULL, NULL) > 0) {
|
||||
struct ast_channel *chan = NULL;
|
||||
char fmt[80];
|
||||
char clid[80];
|
||||
char cidnum[80], cidname[80];
|
||||
int send_email;
|
||||
|
||||
if (ast_check_realtime("voicemail_data")) {
|
||||
get_date(date, sizeof(date));
|
||||
ast_store_realtime("voicemail_data",
|
||||
|
@ -6437,7 +6446,27 @@ static int msg_create_from_file(struct ast_vm_recording_data *recdata)
|
|||
}
|
||||
|
||||
STORE(dir, recipient->mailbox, recipient->context, msgnum, NULL, recipient, fmt, 0, vms, "", msg_id);
|
||||
notify_new_state(recipient);
|
||||
|
||||
send_email = ast_test_flag(recipient, VM_EMAIL_EXT_RECS);
|
||||
|
||||
if (send_email) {
|
||||
/* Send an email if possible, fall back to just notifications if not. */
|
||||
ast_copy_string(fmt, recdata->recording_ext, sizeof(fmt));
|
||||
ast_copy_string(clid, recdata->call_callerid, sizeof(clid));
|
||||
ast_callerid_split(clid, cidname, sizeof(cidname), cidnum, sizeof(cidnum));
|
||||
|
||||
/* recdata->call_callerchan itself no longer exists, so we can't use the real channel. Use a dummy one. */
|
||||
chan = ast_dummy_channel_alloc();
|
||||
}
|
||||
if (chan) {
|
||||
notify_new_message(chan, recipient, NULL, msgnum, duration, fmt, cidnum, cidname, "");
|
||||
ast_channel_unref(chan);
|
||||
} else {
|
||||
if (send_email) { /* We tried and failed. */
|
||||
ast_log(LOG_WARNING, "Failed to allocate dummy channel, email will not be sent\n");
|
||||
}
|
||||
notify_new_state(recipient);
|
||||
}
|
||||
}
|
||||
|
||||
free_user(recipient);
|
||||
|
@ -11197,12 +11226,14 @@ static int vm_authenticate(struct ast_channel *chan, char *mailbox, int mailbox_
|
|||
password[0] = '\0';
|
||||
} else {
|
||||
if (ast_streamfile(chan, vm_password, ast_channel_language(chan))) {
|
||||
ast_log(AST_LOG_WARNING, "Unable to stream password file\n");
|
||||
if (!ast_check_hangup(chan)) {
|
||||
ast_log(AST_LOG_WARNING, "Unable to stream password file\n");
|
||||
}
|
||||
free_user(vmu);
|
||||
return -1;
|
||||
}
|
||||
if (ast_readstring(chan, password, sizeof(password) - 1, 2000, 10000, "#") < 0) {
|
||||
ast_log(AST_LOG_WARNING, "Unable to read password\n");
|
||||
ast_log(AST_LOG_NOTICE, "Unable to read password\n");
|
||||
free_user(vmu);
|
||||
return -1;
|
||||
} else if (password[0] == '*') {
|
||||
|
|
|
@ -120,6 +120,9 @@
|
|||
<configOption name="end_marked">
|
||||
<synopsis>Kick the user from the conference when the last marked user leaves</synopsis>
|
||||
</configOption>
|
||||
<configOption name="end_marked_any">
|
||||
<synopsis>Kick the user from the conference when any marked user leaves</synopsis>
|
||||
</configOption>
|
||||
<configOption name="talk_detection_events">
|
||||
<synopsis>Set whether or not notifications of when a user begins and ends talking should be sent out as events over AMI</synopsis>
|
||||
</configOption>
|
||||
|
@ -1440,10 +1443,7 @@ static int add_menu_entry(struct conf_menu *menu, const char *dtmf, const char *
|
|||
|
||||
/* if adding any of the actions failed, bail */
|
||||
if (res) {
|
||||
struct conf_menu_action *menu_action;
|
||||
while ((menu_action = AST_LIST_REMOVE_HEAD(&menu_entry->actions, action))) {
|
||||
ast_free(menu_action);
|
||||
}
|
||||
conf_menu_entry_destroy(menu_entry);
|
||||
ast_free(menu_entry);
|
||||
return -1;
|
||||
}
|
||||
|
@ -1452,6 +1452,7 @@ static int add_menu_entry(struct conf_menu *menu, const char *dtmf, const char *
|
|||
AST_LIST_TRAVERSE_SAFE_BEGIN(&menu->entries, cur, entry) {
|
||||
if (!strcasecmp(cur->dtmf, menu_entry->dtmf)) {
|
||||
AST_LIST_REMOVE_CURRENT(entry);
|
||||
conf_menu_entry_destroy(cur);
|
||||
ast_free(cur);
|
||||
break;
|
||||
}
|
||||
|
@ -1583,9 +1584,12 @@ static char *handle_cli_confbridge_show_user_profile(struct ast_cli_entry *e, in
|
|||
ast_cli(a->fd,"Wait Marked: %s\n",
|
||||
u_profile.flags & USER_OPT_WAITMARKED ?
|
||||
"enabled" : "disabled");
|
||||
ast_cli(a->fd,"END Marked: %s\n",
|
||||
ast_cli(a->fd,"END Marked (All): %s\n",
|
||||
u_profile.flags & USER_OPT_ENDMARKED ?
|
||||
"enabled" : "disabled");
|
||||
ast_cli(a->fd,"END Marked (Any): %s\n",
|
||||
u_profile.flags & USER_OPT_ENDMARKEDANY ?
|
||||
"enabled" : "disabled");
|
||||
ast_cli(a->fd,"Drop_silence: %s\n",
|
||||
u_profile.flags & USER_OPT_DROP_SILENCE ?
|
||||
"enabled" : "disabled");
|
||||
|
@ -2409,6 +2413,7 @@ int conf_load_config(void)
|
|||
aco_option_register(&cfg_info, "announce_only_user", ACO_EXACT, user_types, "yes", OPT_BOOLFLAG_T, 0, FLDSET(struct user_profile, flags), USER_OPT_NOONLYPERSON);
|
||||
aco_option_register(&cfg_info, "wait_marked", ACO_EXACT, user_types, "no", OPT_BOOLFLAG_T, 1, FLDSET(struct user_profile, flags), USER_OPT_WAITMARKED);
|
||||
aco_option_register(&cfg_info, "end_marked", ACO_EXACT, user_types, "no", OPT_BOOLFLAG_T, 1, FLDSET(struct user_profile, flags), USER_OPT_ENDMARKED);
|
||||
aco_option_register(&cfg_info, "end_marked_any", ACO_EXACT, user_types, "no", OPT_BOOLFLAG_T, 1, FLDSET(struct user_profile, flags), USER_OPT_ENDMARKEDANY);
|
||||
aco_option_register(&cfg_info, "talk_detection_events", ACO_EXACT, user_types, "no", OPT_BOOLFLAG_T, 1, FLDSET(struct user_profile, flags), USER_OPT_TALKER_DETECT);
|
||||
aco_option_register(&cfg_info, "dtmf_passthrough", ACO_EXACT, user_types, "no", OPT_BOOLFLAG_T, 1, FLDSET(struct user_profile, flags), USER_OPT_DTMF_PASS);
|
||||
aco_option_register(&cfg_info, "announce_join_leave", ACO_EXACT, user_types, "no", OPT_BOOLFLAG_T, 1, FLDSET(struct user_profile, flags), USER_OPT_ANNOUNCE_JOIN_LEAVE);
|
||||
|
|
|
@ -14,9 +14,6 @@
|
|||
* This program is free software, distributed under the terms of
|
||||
* the GNU General Public License Version 2. See the LICENSE file
|
||||
* at the top of the source tree.
|
||||
*
|
||||
* Please follow coding guidelines
|
||||
* http://svn.digium.com/view/asterisk/trunk/doc/CODING-GUIDELINES
|
||||
*/
|
||||
|
||||
/*! \file
|
||||
|
|
|
@ -14,9 +14,6 @@
|
|||
* This program is free software, distributed under the terms of
|
||||
* the GNU General Public License Version 2. See the LICENSE file
|
||||
* at the top of the source tree.
|
||||
*
|
||||
* Please follow coding guidelines
|
||||
* http://svn.digium.com/view/asterisk/trunk/doc/CODING-GUIDELINES
|
||||
*/
|
||||
|
||||
/*! \file
|
||||
|
|
|
@ -14,9 +14,6 @@
|
|||
* This program is free software, distributed under the terms of
|
||||
* the GNU General Public License Version 2. See the LICENSE file
|
||||
* at the top of the source tree.
|
||||
*
|
||||
* Please follow coding guidelines
|
||||
* http://svn.digium.com/view/asterisk/trunk/doc/CODING-GUIDELINES
|
||||
*/
|
||||
|
||||
/*! \file
|
||||
|
|
|
@ -14,9 +14,6 @@
|
|||
* This program is free software, distributed under the terms of
|
||||
* the GNU General Public License Version 2. See the LICENSE file
|
||||
* at the top of the source tree.
|
||||
*
|
||||
* Please follow coding guidelines
|
||||
* http://svn.digium.com/view/asterisk/trunk/doc/CODING-GUIDELINES
|
||||
*/
|
||||
|
||||
/*! \file
|
||||
|
|
|
@ -14,9 +14,6 @@
|
|||
* This program is free software, distributed under the terms of
|
||||
* the GNU General Public License Version 2. See the LICENSE file
|
||||
* at the top of the source tree.
|
||||
*
|
||||
* Please follow coding guidelines
|
||||
* http://svn.digium.com/view/asterisk/trunk/doc/CODING-GUIDELINES
|
||||
*/
|
||||
|
||||
/*! \file
|
||||
|
@ -85,37 +82,39 @@ static void leave_marked(struct confbridge_user *user)
|
|||
|
||||
conf_remove_user_marked(user->conference, user);
|
||||
|
||||
if (user->conference->markedusers == 0) {
|
||||
AST_LIST_TRAVERSE_SAFE_BEGIN(&user->conference->active_list, user_iter, list) {
|
||||
/* Kick ENDMARKED cbu_iters */
|
||||
if (ast_test_flag(&user_iter->u_profile, USER_OPT_ENDMARKED) && !user_iter->kicked) {
|
||||
if (ast_test_flag(&user_iter->u_profile, USER_OPT_WAITMARKED)
|
||||
&& !ast_test_flag(&user_iter->u_profile, USER_OPT_MARKEDUSER)) {
|
||||
AST_LIST_REMOVE_CURRENT(list);
|
||||
user_iter->conference->activeusers--;
|
||||
AST_LIST_INSERT_TAIL(&user_iter->conference->waiting_list, user_iter, list);
|
||||
user_iter->conference->waitingusers++;
|
||||
}
|
||||
user_iter->kicked = 1;
|
||||
pbx_builtin_setvar_helper(user_iter->chan, "CONFBRIDGE_RESULT", "ENDMARKED");
|
||||
ast_bridge_remove(user_iter->conference->bridge, user_iter->chan);
|
||||
} else if (ast_test_flag(&user_iter->u_profile, USER_OPT_WAITMARKED)
|
||||
&& !ast_test_flag(&user_iter->u_profile, USER_OPT_MARKEDUSER)) {
|
||||
need_prompt = 1;
|
||||
|
||||
/* If all marked users have left, or we're set to kick if any marked user leaves, then boot everyone */
|
||||
AST_LIST_TRAVERSE_SAFE_BEGIN(&user->conference->active_list, user_iter, list) {
|
||||
if (user->conference->markedusers > 0 && !ast_test_flag(&user_iter->u_profile, USER_OPT_ENDMARKEDANY)) {
|
||||
continue;
|
||||
}
|
||||
/* Kick ENDMARKED cbu_iters */
|
||||
if ((ast_test_flag(&user_iter->u_profile, USER_OPT_ENDMARKED) || ast_test_flag(&user_iter->u_profile, USER_OPT_ENDMARKEDANY)) && !user_iter->kicked) {
|
||||
if (ast_test_flag(&user_iter->u_profile, USER_OPT_WAITMARKED)
|
||||
&& (!ast_test_flag(&user_iter->u_profile, USER_OPT_MARKEDUSER) || ast_test_flag(&user_iter->u_profile, USER_OPT_ENDMARKEDANY))) {
|
||||
AST_LIST_REMOVE_CURRENT(list);
|
||||
user_iter->conference->activeusers--;
|
||||
AST_LIST_INSERT_TAIL(&user_iter->conference->waiting_list, user_iter, list);
|
||||
user_iter->conference->waitingusers++;
|
||||
} else {
|
||||
/* User is neither wait_marked nor end_marked; however, they
|
||||
* should still hear the prompt.
|
||||
*/
|
||||
need_prompt = 1;
|
||||
}
|
||||
user_iter->kicked = 1;
|
||||
pbx_builtin_setvar_helper(user_iter->chan, "CONFBRIDGE_RESULT", "ENDMARKED");
|
||||
ast_bridge_remove(user_iter->conference->bridge, user_iter->chan);
|
||||
} else if (ast_test_flag(&user_iter->u_profile, USER_OPT_WAITMARKED)
|
||||
&& !ast_test_flag(&user_iter->u_profile, USER_OPT_MARKEDUSER)) {
|
||||
need_prompt = 1;
|
||||
|
||||
AST_LIST_REMOVE_CURRENT(list);
|
||||
user_iter->conference->activeusers--;
|
||||
AST_LIST_INSERT_TAIL(&user_iter->conference->waiting_list, user_iter, list);
|
||||
user_iter->conference->waitingusers++;
|
||||
} else {
|
||||
/* User is neither wait_marked nor end_marked nor end_marked_any; however, they
|
||||
* should still hear the prompt.
|
||||
*/
|
||||
need_prompt = 1;
|
||||
}
|
||||
AST_LIST_TRAVERSE_SAFE_END;
|
||||
}
|
||||
AST_LIST_TRAVERSE_SAFE_END;
|
||||
|
||||
switch (user->conference->activeusers) {
|
||||
case 0:
|
||||
|
|
|
@ -14,9 +14,6 @@
|
|||
* This program is free software, distributed under the terms of
|
||||
* the GNU General Public License Version 2. See the LICENSE file
|
||||
* at the top of the source tree.
|
||||
*
|
||||
* Please follow coding guidelines
|
||||
* http://svn.digium.com/view/asterisk/trunk/doc/CODING-GUIDELINES
|
||||
*/
|
||||
|
||||
/*! \file
|
||||
|
|
|
@ -14,9 +14,6 @@
|
|||
* This program is free software, distributed under the terms of
|
||||
* the GNU General Public License Version 2. See the LICENSE file
|
||||
* at the top of the source tree.
|
||||
*
|
||||
* Please follow coding guidelines
|
||||
* http://svn.digium.com/view/asterisk/trunk/doc/CODING-GUIDELINES
|
||||
*/
|
||||
|
||||
/*! \file
|
||||
|
|
|
@ -14,9 +14,6 @@
|
|||
* This program is free software, distributed under the terms of
|
||||
* the GNU General Public License Version 2. See the LICENSE file
|
||||
* at the top of the source tree.
|
||||
*
|
||||
* Please follow coding guidelines
|
||||
* http://svn.digium.com/view/asterisk/trunk/doc/CODING-GUIDELINES
|
||||
*/
|
||||
|
||||
/*! \file
|
||||
|
|
|
@ -71,6 +71,7 @@ enum user_profile_flags {
|
|||
USER_OPT_TEXT_MESSAGING = (1 << 19), /*!< Send text messages to the user */
|
||||
USER_OPT_ANSWER_CHANNEL = (1 << 20), /*!< Sets if the channel should be answered if currently unanswered */
|
||||
USER_OPT_HEAR_OWN_JOIN_SOUND = (1 << 21), /*!< Set if the caller should hear the join sound */
|
||||
USER_OPT_ENDMARKEDANY = (1 << 22), /*!< Set if the user should be kicked after any marked user exits */
|
||||
};
|
||||
|
||||
enum bridge_profile_flags {
|
||||
|
|
|
@ -0,0 +1,279 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><title>Release Summary - asterisk-20.1.0</title><h1 align="center"><a name="top">Release Summary</a></h1><h3 align="center">asterisk-20.1.0</h3><h3 align="center">Date: 2023-01-12</h3><h3 align="center"><asteriskteam@digium.com></h3><hr><h2 align="center">Table of Contents</h2><ol>
|
||||
<li><a href="#summary">Summary</a></li>
|
||||
<li><a href="#contributors">Contributors</a></li>
|
||||
<li><a href="#closed_issues">Closed Issues</a></li>
|
||||
<li><a href="#open_issues">Open Issues</a></li>
|
||||
<li><a href="#commits">Other Changes</a></li>
|
||||
<li><a href="#diffstat">Diffstat</a></li>
|
||||
</ol><hr><a name="summary"><h2 align="center">Summary</h2></a><center><a href="#top">[Back to Top]</a></center><p>This release is a point release of an existing major version. The changes included were made to address problems that have been identified in this release series, or are minor, backwards compatible new features or improvements. Users should be able to safely upgrade to this version if this release series is already in use. Users considering upgrading from a previous version are strongly encouraged to review the UPGRADE.txt document as well as the CHANGES document for information about upgrading to this release series.</p><p>The data in this summary reflects changes that have been made since the previous release, asterisk-20.0.0.</p><hr><a name="contributors"><h2 align="center">Contributors</h2></a><center><a href="#top">[Back to Top]</a></center><p>This table lists the people who have submitted code, those that have tested patches, as well as those that reported issues on the issue tracker that were resolved in this release. For coders, the number is how many of their patches (of any size) were committed into this release. For testers, the number is the number of times their name was listed as assisting with testing a patch. Finally, for reporters, the number is the number of issues that they reported that were affected by commits that went into this release.</p><table width="100%" border="0">
|
||||
<tr><th width="33%">Coders</th><th width="33%">Testers</th><th width="33%">Reporters</th></tr>
|
||||
<tr valign="top"><td width="33%">39 Naveen Albert <asterisk@phreaknet.org><br/>7 George Joseph <gjoseph@digium.com><br/>5 Philip Prindeville <philipp@redfish-solutions.com><br/>4 Asterisk Development Team <asteriskteam@digium.com><br/>4 Mike Bradeen <mbradeen@sangoma.com><br/>3 Maximilian Fridrich <m.fridrich@commend.com><br/>3 Joshua C. Colp <jcolp@sangoma.com><br/>2 Jaco Kroon <jaco@uls.co.za><br/>2 Michael Kuron <m.kuron@gmx.de><br/>2 Marcel Wagner <mwagner@sipgate.de><br/>1 Birger Harzenetter (license 5870)<br/>1 Holger Hans Peter Freyther <holger@moiji-mobile.com><br/>1 Igor Goncharovsky <igor.goncharovsky@gmail.com><br/>1 Frederic LE FOLL <frederic.lefoll@c-s.fr><br/>1 Alexandre Fournier <afournier@wazo.io><br/>1 Ben Ford <bford@digium.com><br/>1 Henning Westerholt <hw@gilawa.com><br/></td><td width="33%">1 inspecting SIP traces.<br/></td><td width="33%">37 N A <asterisk@phreaknet.org><br/>7 George Joseph <gjoseph@digium.com><br/>4 Philip Prindeville <philipp@redfish-solutions.com><br/>3 Matt Jordan <mjordan@digium.com><br/>3 Maximilian Fridrich <m.fridrich@commend.com><br/>2 Michael Bradeen <mbradeen@sangoma.com><br/>2 Marcel Wagner <mwagner@sipgate.de><br/>2 Joshua C. Colp <jcolp@digium.com><br/>1 Igor Yeroshev <igor.yeroshev@kaspi.kz><br/>1 David Uczen <duczen@fluentstream.com><br/>1 Alexandre Fournier <afournier@wazo.io><br/>1 Igor Goncharovsky <igor.goncharovsky@gmail.com><br/>1 Frederic LE FOLL <frederic.lefoll@c-s.fr><br/>1 shawty <shawty.d.ds@googlemail.com><br/>1 David Woolley <forums@david-woolley.me.uk><br/>1 nappsoft <infos@nappsoft.ch><br/>1 Jesse Ross <jesseross92@gmail.com><br/>1 Joeran Vinzens <vinzens@sipgate.de><br/>1 Henning Westerholt <hw@gilawa.com><br/>1 Benjamin Keith Ford <bford@digium.com><br/>1 Saken <saken.tastemirov@kaspi.kz><br/></td></tr>
|
||||
</table><hr><a name="closed_issues"><h2 align="center">Closed Issues</h2></a><center><a href="#top">[Back to Top]</a></center><p>This is a list of all issues from the issue tracker that were closed by changes that went into this release.</p><h3>Security</h3><h4>Category: Addons/chan_ooh323</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30103">ASTERISK-30103</a>: chan_ooh323 Vulnerability in calling/called party IE<br/>Reported by: Michael Bradeen<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=eb1d7ab53cf8ba8c42432cdedd5943102efe5101">[eb1d7ab53c]</a> Mike Bradeen -- ooh323c: not checking for IE minimum length</li>
|
||||
</ul><br><h4>Category: Core/ManagerInterface</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30176">ASTERISK-30176</a>: manager: GetConfig can read files outside of Asterisk<br/>Reported by: shawty<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=81f10e847efdbe8ec264062ee234e1098c29b3f6">[81f10e847e]</a> Mike Bradeen -- manager: prevent file access outside of config dir</li>
|
||||
</ul><br><h4>Category: pjproject/pjsip</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30338">ASTERISK-30338</a>: pjproject: Backport security fixes from 2.13<br/>Reported by: Benjamin Keith Ford<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=d4769947688a54ac926240ed4a68d16a3d1807ba">[d476994768]</a> Ben Ford -- pjproject: 2.13 security fixes</li>
|
||||
</ul><br><h3>Improvement</h3><h4>Category: Applications/app_mixmonitor</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30286">ASTERISK-30286</a>: app_mixmonitor: Add option to use real Caller ID for Caller ID<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=691178c48e58923b7c3b122f90a663a83d9695e1">[691178c48e]</a> Naveen Albert -- app_mixmonitor: Add option to use real Caller ID for voicemail.</li>
|
||||
</ul><br><h4>Category: Core/Bridging</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30223">ASTERISK-30223</a>: features: add no-answer option to Bridge application<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=a5ec60e6c61fd5addb8a2381e944d4a4a42e985e">[a5ec60e6c6]</a> Naveen Albert -- features: Add no answer option to Bridge.</li>
|
||||
</ul><br><h4>Category: Core/General</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30290">ASTERISK-30290</a>: file.c: Don't emit warnings on winks.<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=8142b313c36e96f46c29938ded8fca5494064a80">[8142b313c3]</a> Naveen Albert -- file.c: Don't emit warnings on winks.</li>
|
||||
</ul><br><h4>Category: Core/RTP</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30327">ASTERISK-30327</a>: rtp_engine.h: Remove obsolete example usage<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=a4bcdce1db1aa411b6895456dc939800837437d3">[a4bcdce1db]</a> Naveen Albert -- rtp_engine.h: Update examples using ast_format_set.</li>
|
||||
</ul><br><h4>Category: Documentation</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30328">ASTERISK-30328</a>: Typo in from_domain description on res_pjsip configuration documentation<br/>Reported by: Marcel Wagner<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=58534b309fe0aa212c32c85f1c0497b0738a624b">[58534b309f]</a> Marcel Wagner -- res_pjsip: Fix typo in from_domain documentation</li>
|
||||
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30316">ASTERISK-30316</a>: res_pjsip: Documentation should point out default if contact_user is not being set for outbound registrations<br/>Reported by: Marcel Wagner<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=b83af13f65ba271c041e18fd344bb0b057aa00bc">[b83af13f65]</a> Marcel Wagner -- res_pjsip: Update contact_user to point out default</li>
|
||||
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30289">ASTERISK-30289</a>: xmldoc: Allow XML docs to be reloaded<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=52c7d3ed07a744a2f2a199ba58e3a9896b63af19">[52c7d3ed07]</a> Naveen Albert -- xmldoc: Allow XML docs to be reloaded.</li>
|
||||
</ul><br><h4>Category: PBX/General</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30308">ASTERISK-30308</a>: pbx_builtins: Allow Answer to return immediately<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=c7df5ee7c134606e1dd9b255f4d67012c09b0f8c">[c7df5ee7c1]</a> Naveen Albert -- pbx_builtins: Allow Answer to return immediately.</li>
|
||||
</ul><br><h4>Category: Resources/res_pjsip</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30158">ASTERISK-30158</a>: PJSIP: Add new 100rel option "peer_supported"<br/>Reported by: Maximilian Fridrich<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=5bbad0d27c967a28a5824ae10fdca714e064c46d">[5bbad0d27c]</a> Maximilian Fridrich -- res_pjsip: Add 100rel option "peer_supported".</li>
|
||||
</ul><br><h4>Category: Resources/res_pjsip_geolocation</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30241">ASTERISK-30241</a>: res_pjsip_gelocation: Downgrade some NOTICE scope trace debugs to DEBUG level<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=8afb313a4307dbff8849b036703775d8770d21a9">[8afb313a43]</a> Naveen Albert -- res_pjsip_geolocation: Change some notices to debugs.</li>
|
||||
</ul><br><h4>Category: Tests/General</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30295">ASTERISK-30295</a>: test_json: Remove duplicated static function<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=1e77b8c473c624e0d8c1a1c1ea8ab455d89c7e34">[1e77b8c473]</a> Naveen Albert -- test_json: Remove duplicated static function.</li>
|
||||
</ul><br><h3>Bug</h3><h4>Category: Applications/app_if</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30349">ASTERISK-30349</a>: app_if: Format truncation error<br/>Reported by: George Joseph<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=2f9cdfbc508fe0c1defd2743cee234c424571388">[2f9cdfbc50]</a> Naveen Albert -- app_if: Fix format truncation errors.</li>
|
||||
</ul><br><h4>Category: Applications/app_meetme</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-29998">ASTERISK-29998</a>: sla: deadlock when calling SLAStation application<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=2efa290d3c96cbcfa6095b1361863f7bc19b14a6">[2efa290d3c]</a> Naveen Albert -- sla: Prevent deadlock and crash due to autoservicing.</li>
|
||||
</ul><br><h4>Category: Applications/app_saynumber</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30248">ASTERISK-30248</a>: ast_get_digit_str adds bogus initial delimiter if first character not to be spoken<br/>Reported by: David Woolley<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=407216a0a56afdd692be4f7253ce710eb10d02d2">[407216a0a5]</a> Naveen Albert -- say: Don't prepend ampersand erroneously.</li>
|
||||
</ul><br><h4>Category: Applications/app_stack</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30076">ASTERISK-30076</a>: app_stack: Incorrect exit location in predial handlers logged<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=dfe2f38642099a8797037964c7dff7e15abdff56">[dfe2f38642]</a> Naveen Albert -- app_stack: Print proper exit location for PBXless channels.</li>
|
||||
</ul><br><h4>Category: Applications/app_voicemail</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30283">ASTERISK-30283</a>: app_voicemail: Fix msg_create_from_file not sending email to user<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=b9c031c1f82244e00fddfc9f5e8f0d83e5548b34">[b9c031c1f8]</a> Naveen Albert -- app_voicemail: Fix missing email in msg_create_from_file.</li>
|
||||
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30248">ASTERISK-30248</a>: ast_get_digit_str adds bogus initial delimiter if first character not to be spoken<br/>Reported by: David Woolley<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=407216a0a56afdd692be4f7253ce710eb10d02d2">[407216a0a5]</a> Naveen Albert -- say: Don't prepend ampersand erroneously.</li>
|
||||
</ul><br><h4>Category: Channels/chan_dahdi</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30336">ASTERISK-30336</a>: sig_analog: Fix no timeout duration<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=b90e57758befa4048f3a56493e9ee23afec7eb6b">[b90e57758b]</a> Naveen Albert -- sig_analog: Fix no timeout duration.</li>
|
||||
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30274">ASTERISK-30274</a>: chan_dahdi: Unavailable channels are BUSY<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=180ca32565efbed902463e06d9ee200d4dc25a06">[180ca32565]</a> Naveen Albert -- chan_dahdi: Fix unavailable channels returning busy.</li>
|
||||
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30256">ASTERISK-30256</a>: chan_dahdi: Fix format truncation warnings<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=98fc05f13b0b245d7a5a077153da47229d142323">[98fc05f13b]</a> Naveen Albert -- chan_dahdi: Resolve format truncation warning.</li>
|
||||
</ul><br><h4>Category: Channels/chan_local</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30239">ASTERISK-30239</a>: Prometheus plugin crashes Asterisk when using local channel<br/>Reported by: Joeran Vinzens<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=62881c668b0e7cb097e2c36f0e88d18dcd1aa38d">[62881c668b]</a> Holger Hans Peter Freyther -- res_prometheus: Do not crash on invisible bridges</li>
|
||||
</ul><br><h4>Category: Channels/chan_pjsip</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30184">ASTERISK-30184</a>: res_pjsip_session: re-INVITE after answering results in wrong stream direction of first call leg<br/>Reported by: Maximilian Fridrich<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=60b81eabe080af842d81b9d84d1dcedb24b87398">[60b81eabe0]</a> Maximilian Fridrich -- core & res_pjsip: Improve topology change handling.</li>
|
||||
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30193">ASTERISK-30193</a>: chan_pjsip should return all codecs on a re-INVITE without SDP<br/>Reported by: Henning Westerholt<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=12445040d346805b6b63a171e07855f7662881af">[12445040d3]</a> Henning Westerholt -- res_pjsip: return all codecs on a re-INVITE without SDP</li>
|
||||
</ul><br><h4>Category: Channels/chan_rtp</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30281">ASTERISK-30281</a>: chan_rtp: Local address being used before being set<br/>Reported by: George Joseph<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=f723b465e5baf4c625a986ae7b6513585d15c44a">[f723b465e5]</a> George Joseph -- chan_rtp: Make usage of ast_rtp_instance_get_local_address clearer</li>
|
||||
</ul><br><h4>Category: Core/AstDB</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30245">ASTERISK-30245</a>: db: ListItems is incorrect<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=7335b0cffe6c997eb66de249fd90c7463abd5828">[7335b0cffe]</a> Birger Harzenetter -- db: Fix incorrect DB tree count for AMI.</li>
|
||||
</ul><br><h4>Category: Core/BuildSystem</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30321">ASTERISK-30321</a>: Build: Embedded blobs have executable stacks<br/>Reported by: George Joseph<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=ce2153fc5aa4e1b252d4d9d608748b6615460f30">[ce2153fc5a]</a> Jaco Kroon -- Build system: Avoid executable stack.</li>
|
||||
</ul><br><h4>Category: Core/Dial</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30258">ASTERISK-30258</a>: Dialing API: Cancel a running async thread, does not always cancel all calls<br/>Reported by: Frederic LE FOLL<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=50a4495799fd4e5f15da5695a034b05943858f02">[50a4495799]</a> Frederic LE FOLL -- Dialing API: Cancel a running async thread, may not cancel all calls</li>
|
||||
</ul><br><h4>Category: Core/General</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30278">ASTERISK-30278</a>: tcptls: Abort occurs if SSL error is logged if MALLOC_DEBUG is enabled<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=afd86b47c1e886638454abf041ffa50d914b5c67">[afd86b47c1]</a> Naveen Albert -- tcptls: Prevent crash when freeing OpenSSL errors.</li>
|
||||
</ul><br><h4>Category: Core/HTTP</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30278">ASTERISK-30278</a>: tcptls: Abort occurs if SSL error is logged if MALLOC_DEBUG is enabled<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=afd86b47c1e886638454abf041ffa50d914b5c67">[afd86b47c1]</a> Naveen Albert -- tcptls: Prevent crash when freeing OpenSSL errors.</li>
|
||||
</ul><br><h4>Category: Core/ManagerInterface</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30285">ASTERISK-30285</a>: manager.c: Remove outdated documentation<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=49cfdbbdff315e5a6bb665bb44a09d881f71b52c">[49cfdbbdff]</a> Naveen Albert -- manager: Update ModuleCheck documentation.</li>
|
||||
</ul><br><h4>Category: Functions/General</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30293">ASTERISK-30293</a>: Memory leak in JSON_DECODE<br/>Reported by: David Uczen<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=002afc3f2a4139fae0049c1d9e2fb591ca8ef040">[002afc3f2a]</a> Naveen Albert -- func_json: Fix memory leak.</li>
|
||||
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30220">ASTERISK-30220</a>: func_scramble: Fix segfault due to null pointer deref<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=8aae0b9f083af6de2ad2dfc87d2f1eaf4e20f4a0">[8aae0b9f08]</a> Naveen Albert -- func_scramble: Fix null pointer dereference.</li>
|
||||
</ul><br><h4>Category: Functions/func_logic</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30243">ASTERISK-30243</a>: func_logic: IF function complains if both branches are empty<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=407167cc283ee5cf53ccabe2699f9610b3b768ea">[407167cc28]</a> Naveen Albert -- func_logic: Don't emit warning if both IF branches are empty.</li>
|
||||
</ul><br><h4>Category: Functions/func_presencestate</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30311">ASTERISK-30311</a>: func_presencestate: Fix invalid memory access.<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=83eb113e0f31fa328a85233283854c985c42b064">[83eb113e0f]</a> Naveen Albert -- func_presencestate: Fix invalid memory access.</li>
|
||||
</ul><br><h4>Category: Resources/General</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30239">ASTERISK-30239</a>: Prometheus plugin crashes Asterisk when using local channel<br/>Reported by: Joeran Vinzens<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=62881c668b0e7cb097e2c36f0e88d18dcd1aa38d">[62881c668b]</a> Holger Hans Peter Freyther -- res_prometheus: Do not crash on invisible bridges</li>
|
||||
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30237">ASTERISK-30237</a>: res_prometheus: Crash when scraping bridges<br/>Reported by: Igor Yeroshev<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=62881c668b0e7cb097e2c36f0e88d18dcd1aa38d">[62881c668b]</a> Holger Hans Peter Freyther -- res_prometheus: Do not crash on invisible bridges</li>
|
||||
</ul><br><h4>Category: Resources/res_adsi</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-29793">ASTERISK-29793</a>: adsi: CAS is malformed<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=80e6205bb05f920022b959685155c3b3ce1668ec">[80e6205bb0]</a> Naveen Albert -- res_adsi: Fix major regression caused by media format rearchitecture.</li>
|
||||
</ul><br><h4>Category: Resources/res_agi</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30314">ASTERISK-30314</a>: res_agi: RECORD FILE doesn't respect "transmit_silence" asterisk.conf option<br/>Reported by: Joshua C. Colp<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=61922d293435dc8b5724d1fddb02f47e75d1608a">[61922d2934]</a> Joshua C. Colp -- res_agi: Respect "transmit_silence" option for "RECORD FILE".</li>
|
||||
</ul><br><h4>Category: Resources/res_ari</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30344">ASTERISK-30344</a>: ari: Memory leak in create when specifying JSON<br/>Reported by: Saken<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=564349ff5d4f39ee51b69655babea377e3edb065">[564349ff5d]</a> Joshua C. Colp -- ari: Destroy body variables in channel create.</li>
|
||||
</ul><br><h4>Category: Resources/res_ari_channels</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30237">ASTERISK-30237</a>: res_prometheus: Crash when scraping bridges<br/>Reported by: Igor Yeroshev<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=62881c668b0e7cb097e2c36f0e88d18dcd1aa38d">[62881c668b]</a> Holger Hans Peter Freyther -- res_prometheus: Do not crash on invisible bridges</li>
|
||||
</ul><br><h4>Category: Resources/res_crypto</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30213">ASTERISK-30213</a>: Make crypto_load() reentrant and handle symlinks correctly<br/>Reported by: Philip Prindeville<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=d0bea5a725ecdef00536da8380a805f11b8cefc4">[d0bea5a725]</a> Philip Prindeville -- res_crypto: handle unsafe private key files</li>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=ef74ecacc7ffd81a505154f4590df12b913eed55">[ef74ecacc7]</a> Philip Prindeville -- res_crypto: don't modify fname in try_load_key()</li>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=5e2485b5c0d4a80015ba6f6107f28e3d2bd6480b">[5e2485b5c0]</a> Philip Prindeville -- res_crypto: use ast_file_read_dirs() to iterate</li>
|
||||
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30235">ASTERISK-30235</a>: res_crypto and tests: Memory issues and and uninitialized variable error<br/>Reported by: George Joseph<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=e25b690d1023927f092030d9b743338c5a0e2223">[e25b690d10]</a> George Joseph -- res_crypto: Memory issues and uninitialized variable errors</li>
|
||||
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30226">ASTERISK-30226</a>: REGRESSION: res_crypto complains about the stir_shaken directory in /var/lib/asterisk/keys<br/>Reported by: George Joseph<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=026dc08529254f7088aa77df3f417d6d6304b6b6">[026dc08529]</a> Philip Prindeville -- res_crypto: don't complain about directories</li>
|
||||
</ul><br><h4>Category: Resources/res_geolocation</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30234">ASTERISK-30234</a>: res_geolocation: ...may be used uninitialized error in geoloc_config.c<br/>Reported by: George Joseph<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=e33f2dcc0f37ab7ed294dcd4473ba4735955edcf">[e33f2dcc0f]</a> George Joseph -- res_geolocation: Fix issues exposed by compiling with -O2</li>
|
||||
</ul><br><h4>Category: Resources/res_pjsip</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30369">ASTERISK-30369</a>: res_pjsip: Websockets from same IP shut down when they shouldn't be<br/>Reported by: Joshua C. Colp<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=ff9ab3857392ea58624e2f40b8a5c35e4224ced6">[ff9ab38573]</a> George Joseph -- res_pjsip_transport_websocket: Add remote port to transport</li>
|
||||
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30184">ASTERISK-30184</a>: res_pjsip_session: re-INVITE after answering results in wrong stream direction of first call leg<br/>Reported by: Maximilian Fridrich<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=60b81eabe080af842d81b9d84d1dcedb24b87398">[60b81eabe0]</a> Maximilian Fridrich -- core & res_pjsip: Improve topology change handling.</li>
|
||||
</ul><br><h4>Category: Resources/res_pjsip_exten_state</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30264">ASTERISK-30264</a>: res_pjsip: Subscription handlers do not get cleanly unregistered, causing crash<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=9258d8212a1fd15bd53ab998a7dda709000f1f93">[9258d8212a]</a> Naveen Albert -- res_pjsip_pubsub: Prevent removing subscriptions.</li>
|
||||
</ul><br><h4>Category: Resources/res_pjsip_mwi</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30264">ASTERISK-30264</a>: res_pjsip: Subscription handlers do not get cleanly unregistered, causing crash<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=9258d8212a1fd15bd53ab998a7dda709000f1f93">[9258d8212a]</a> Naveen Albert -- res_pjsip_pubsub: Prevent removing subscriptions.</li>
|
||||
</ul><br><h4>Category: Resources/res_pjsip_outbound_registration</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30217">ASTERISK-30217</a>: Registration do not allow multiple proxies<br/>Reported by: Igor Goncharovsky<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=096529d33fe65a893f6abb420fd4291c36c59be6">[096529d33f]</a> Igor Goncharovsky -- res_pjsip_outbound_registration: Allow to use multiple proxies for registration</li>
|
||||
</ul><br><h4>Category: Resources/res_pjsip_pubsub</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30244">ASTERISK-30244</a>: res_pjsip_pubsub: Occasional crash when TCP/TLS connection terminated and subscription persistence is removed<br/>Reported by: nappsoft<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=7684c9e907fb85f5c58b025d9e385ad2600f12a2">[7684c9e907]</a> George Joseph -- pjsip_transport_events: Fix possible use after free on transport</li>
|
||||
</ul><br><h4>Category: Resources/res_pjsip_session</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30265">ASTERISK-30265</a>: res_pjsip_session: Fix missing PLAR support on INVITEs<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=0d6003fa9a2afb21c8953d5ac7238ea83412086d">[0d6003fa9a]</a> Naveen Albert -- res_pjsip_session.c: Map empty extensions in INVITEs to s.</li>
|
||||
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30184">ASTERISK-30184</a>: res_pjsip_session: re-INVITE after answering results in wrong stream direction of first call leg<br/>Reported by: Maximilian Fridrich<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=60b81eabe080af842d81b9d84d1dcedb24b87398">[60b81eabe0]</a> Maximilian Fridrich -- core & res_pjsip: Improve topology change handling.</li>
|
||||
</ul><br><h4>Category: Tests/General</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30282">ASTERISK-30282</a>: CI: Coredump output isn't saved when running unittests<br/>Reported by: George Joseph<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=0c1c623deed2d8318d3bbd55af810d4243272899">[0c1c623dee]</a> George Joseph -- runUnittests.sh: Save coredumps to proper directory</li>
|
||||
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30232">ASTERISK-30232</a>: Initialize stack-based ast_test_capture structures correctly<br/>Reported by: Philip Prindeville<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=3e7ce90f9c44e1fbd7bdfdb83424c0149eb555d9">[3e7ce90f9c]</a> Philip Prindeville -- test: initialize capture structure before freeing</li>
|
||||
</ul><br><h4>Category: Tests/Portability</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30273">ASTERISK-30273</a>: test_mwi: compilation fails on 32-bit Debian<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=ca8900b0f62edf83b39810c58f7b2445a85b776a">[ca8900b0f6]</a> Naveen Albert -- tests: Fix compilation errors on 32-bit.</li>
|
||||
</ul><br><h4>Category: pjproject/pjsip</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-28689">ASTERISK-28689</a>: res_pjsip: Crash when locking group lock when sending stateful response<br/>Reported by: Jesse Ross<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=50e2921a48c8c3b4bd008aab7d9dc996bcdcced6">[50e2921a48]</a> Mike Bradeen -- res_pjsip: prevent crash on websocket disconnect</li>
|
||||
</ul><br><h3>New Feature</h3><h4>Category: Applications/NewFeature</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-29497">ASTERISK-29497</a>: Add conditional branch applications<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=b365ea86013231c87b7c9b2c0868068e0f68c23b">[b365ea8601]</a> Naveen Albert -- app_if: Adds conditional branch applications</li>
|
||||
</ul><br><h4>Category: Applications/app_amd</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30179">ASTERISK-30179</a>: app_amd: Allow audio to be played while AMD is running<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=8c791f9a656434386136669fb8ae19ea746cf938">[8c791f9a65]</a> Naveen Albert -- app_amd: Add option to play audio during AMD.</li>
|
||||
</ul><br><h4>Category: Applications/app_bridgewait</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30216">ASTERISK-30216</a>: app_bridgewait: Add option for BridgeWait to not answer<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=1e29607b5c66ad45f586069867f649cd2232fd63">[1e29607b5c]</a> Naveen Albert -- app_bridgewait: Add option to not answer channel.</li>
|
||||
</ul><br><h4>Category: Applications/app_mixmonitor</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30284">ASTERISK-30284</a>: app_mixmonitor: Add option to delete recording file when done<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=6e59b01e1a1e4b059df6131b56079ca7a2abf7ca">[6e59b01e1a]</a> Naveen Albert -- app_mixmonitor: Add option to delete files on exit.</li>
|
||||
</ul><br><h4>Category: CDR/General</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30091">ASTERISK-30091</a>: cdr: Allow CDRs to ignore call state changes<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=b331caca30ca8f97011c8045afa2419e1f9243e5">[b331caca30]</a> Naveen Albert -- cdr: Allow bridging and dial state changes to be ignored.</li>
|
||||
</ul><br><h4>Category: Channels/chan_dahdi</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30305">ASTERISK-30305</a>: chan_dahdi: Allow FXO channels to start immediately<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=5ede4e217a8afc179412db2d067ee552d175b97a">[5ede4e217a]</a> Naveen Albert -- chan_dahdi: Allow FXO channels to start immediately.</li>
|
||||
</ul><br><h4>Category: Channels/chan_pjsip</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-21502">ASTERISK-21502</a>: New SIP Channel Driver - add Advice of Charge support<br/>Reported by: Matt Jordan<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=b6855755ce2ca249dc87159ca92aa7be6152712f">[b6855755ce]</a> Joshua C. Colp -- res_pjsip_aoc: Don't assume a body exists on responses.</li>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=5c114dcb4abce26925fa99904969d01935e9a68d">[5c114dcb4a]</a> Michael Kuron -- manager: AOC-S support for AOCMessage</li>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=fee9012fe16cb87ccdf23ea0abdc1885e811ae4b">[fee9012fe1]</a> Michael Kuron -- res_pjsip_aoc: New module for sending advice-of-charge with chan_pjsip</li>
|
||||
</ul><br><h4>Category: Functions/NewFeature</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-29432">ASTERISK-29432</a>: New function to allow access to any channel<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=1ed4518328d1cf3f7903233495eeae4c76fd6a46">[1ed4518328]</a> Naveen Albert -- func_export: Add EXPORT function</li>
|
||||
</ul><br><h4>Category: Functions/func_strings</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30222">ASTERISK-30222</a>: func_strings: Add trim functions<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=ab1dbfef754a321f7ead2163bd8f07e7eec4d30b">[ab1dbfef75]</a> Naveen Albert -- func_strings: Add trim functions.</li>
|
||||
</ul><br><h4>Category: Resources/General</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30254">ASTERISK-30254</a>: res_tonedetect: Add audible ringback detection to TONE_DETECT<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=e0e7f3573012507c535a3728a94e36c022077313">[e0e7f35730]</a> Naveen Albert -- res_tonedetect: Add ringback support to TONE_DETECT.</li>
|
||||
</ul><br><h4>Category: Resources/res_hep</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30322">ASTERISK-30322</a>: res_hep: Add capture agent name support<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=531eacd6c97c2c44e88b0e26c9d5c2acc4d7f463">[531eacd6c9]</a> Naveen Albert -- res_hep: Add support for named capture agents.</li>
|
||||
</ul><br><h4>Category: Resources/res_pjsip</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30032">ASTERISK-30032</a>: Support of mediasec SIP headers and SDP attributes<br/>Reported by: Maximilian Fridrich<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=0d2e1401235da1bfca36a3b8febd0f4198737dc7">[0d2e140123]</a> Maximilian Fridrich -- res_pjsip: Add mediasec capabilities.</li>
|
||||
</ul><br><h4>Category: Resources/res_pjsip_logger</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30146">ASTERISK-30146</a>: res_pjsip_logger: Add method-based log filtering<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=c32b39d123e0c372ae9bd33fc3684baaa54bba80">[c32b39d123]</a> Naveen Albert -- res_pjsip_logger: Add method-based logging option.</li>
|
||||
</ul><br><h4>Category: Resources/res_pjsip_notify</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30263">ASTERISK-30263</a>: res_pjsip_notify: Allow using pjsip_notify.conf from AMI<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=40b52322e554fbf3cfa06dbe92732ffaaa188081">[40b52322e5]</a> Naveen Albert -- res_pjsip_notify: Add option support for AMI.</li>
|
||||
</ul><br><h4>Category: Resources/res_pjsip_session</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30150">ASTERISK-30150</a>: res_pjsip_session: Add support for custom parameters<br/>Reported by: N A<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=406143ae61f7d10c5bef3891e698d9cfb43d4d0a">[406143ae61]</a> Naveen Albert -- res_pjsip_header_funcs: Add custom parameter support.</li>
|
||||
</ul><br><hr><a name="open_issues"><h2 align="center">Open Issues</h2></a><center><a href="#top">[Back to Top]</a></center><p>This is a list of all open issues from the issue tracker that were referenced by changes that went into this release.</p><h3>Bug</h3><h4>Category: Resources/res_geolocation</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30346">ASTERISK-30346</a>: Fix NULL dereferencing issue in Geolocation<br/>Reported by: Alexandre Fournier<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=01b3962201edaa437cc67ff9fe0d80d06e958258">[01b3962201]</a> Alexandre Fournier -- res_geoloc: fix NULL pointer dereference bug</li>
|
||||
</ul><br><h4>Category: Resources/res_stasis_snoop</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30252">ASTERISK-30252</a>: Unidirectional snoop on resampled channel causes garbled audio<br/>Reported by: Michael Bradeen<ul>
|
||||
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=907d7e7d7d2625a065a718f313d9c523e2a0ca55">[907d7e7d7d]</a> Mike Bradeen -- audiohook: add directional awareness</li>
|
||||
</ul><br><hr><a name="commits"><h2 align="center">Commits Not Associated with an Issue</h2></a><center><a href="#top">[Back to Top]</a></center><p>This is a list of all changes that went into this release that did not reference a JIRA issue.</p><table width="100%" border="1">
|
||||
<tr><th>Revision</th><th>Author</th><th>Summary</th></tr>
|
||||
<tr><td><a href="https://code.asterisk.org/code/changelog/asterisk?cs=4a9f5e7ae6c4ac1e9de171c8a7fa54cd5f58a45b">4a9f5e7ae6</a></td><td>Asterisk Development Team</td><td>Update for 20.1.0-rc2</td></tr>
|
||||
<tr><td><a href="https://code.asterisk.org/code/changelog/asterisk?cs=aecc5448f14e6f89fb87f4b46c4808a68ec0b2ff">aecc5448f1</a></td><td>Asterisk Development Team</td><td>Update for 20.1.0-rc1</td></tr>
|
||||
<tr><td><a href="https://code.asterisk.org/code/changelog/asterisk?cs=fefc236e7c606fd61f662a142cc3c9d5e5133494">fefc236e7c</a></td><td>Asterisk Development Team</td><td>Update CHANGES and UPGRADE.txt for 20.1.0</td></tr>
|
||||
<tr><td><a href="https://code.asterisk.org/code/changelog/asterisk?cs=2a500b325a368d063f23dabd957b46633f0d2ade">2a500b325a</a></td><td>George Joseph</td><td>res_geolocation: Update wiki documentation</td></tr>
|
||||
<tr><td><a href="https://code.asterisk.org/code/changelog/asterisk?cs=7f80830ced975337a2cfcf384acfbcead72d94a2">7f80830ced</a></td><td>Asterisk Development Team</td><td>Update CHANGES and UPGRADE.txt for 20.0.0</td></tr>
|
||||
<tr><td><a href="https://code.asterisk.org/code/changelog/asterisk?cs=278c5726ca9d3f3df5b2c6c22e2fbcddcd95f854">278c5726ca</a></td><td>Jaco Kroon</td><td>manager: be more aggressive about purging http sessions.</td></tr>
|
||||
</table><hr><a name="diffstat"><h2 align="center">Diffstat Results</h2></a><center><a href="#top">[Back to Top]</a></center><p>This is a summary of the changes to the source code that went into this release that was generated using the diffstat utility.</p><pre>asterisk-20.0.0-summary.html | 1836 ----
|
||||
asterisk-20.0.0-summary.txt | 3804 ----------
|
||||
b/.version | 2
|
||||
b/CHANGES | 146
|
||||
b/ChangeLog | 1188 +++
|
||||
b/Makefile.rules | 4
|
||||
b/UPGRADE.txt | 13
|
||||
b/addons/ooh323c/src/ooq931.c | 15
|
||||
b/apps/app_amd.c | 51
|
||||
b/apps/app_bridgewait.c | 9
|
||||
b/apps/app_if.c | 383 +
|
||||
b/apps/app_meetme.c | 24
|
||||
b/apps/app_mixmonitor.c | 66
|
||||
b/apps/app_stack.c | 48
|
||||
b/apps/app_voicemail.c | 31
|
||||
b/asterisk-20.1.0-rc2-summary.html | 11
|
||||
b/asterisk-20.1.0-rc2-summary.txt | 82
|
||||
b/channels/chan_dahdi.c | 9
|
||||
b/channels/chan_rtp.c | 2
|
||||
b/channels/sig_analog.c | 28
|
||||
b/configs/samples/amd.conf.sample | 7
|
||||
b/configs/samples/asterisk.conf.sample | 11
|
||||
b/configs/samples/cdr.conf.sample | 11
|
||||
b/configs/samples/chan_dahdi.conf.sample | 9
|
||||
b/configs/samples/geolocation.conf.sample | 2
|
||||
b/configs/samples/hep.conf.sample | 3
|
||||
b/configs/samples/pjsip.conf.sample | 12
|
||||
b/configs/samples/voicemail.conf.sample | 2
|
||||
b/contrib/ast-db-manage/config/versions/417c0247fd7e_add_security_negotiation_and_security_.py | 49
|
||||
b/contrib/ast-db-manage/config/versions/539f68bede2c_add_peer_supported_to_100rel.py | 57
|
||||
b/contrib/ast-db-manage/config/versions/5a2247c957d2_add_aoc_option.py | 38
|
||||
b/contrib/ast-db-manage/config/versions/ccf795ee535f_all_codecs_on_empty_reinvite.py | 37
|
||||
b/contrib/realtime/mysql/mysql_config.sql | 30
|
||||
b/contrib/realtime/postgresql/postgresql_config.sql | 36
|
||||
b/funcs/func_export.c | 107
|
||||
b/funcs/func_json.c | 4
|
||||
b/funcs/func_logic.c | 3
|
||||
b/funcs/func_presencestate.c | 4
|
||||
b/funcs/func_sayfiles.c | 9
|
||||
b/funcs/func_scramble.c | 1
|
||||
b/funcs/func_strings.c | 186
|
||||
b/include/asterisk/audiohook.h | 9
|
||||
b/include/asterisk/cdr.h | 2
|
||||
b/include/asterisk/manager.h | 12
|
||||
b/include/asterisk/res_pjsip.h | 239
|
||||
b/include/asterisk/res_pjsip_session.h | 2
|
||||
b/include/asterisk/rtp_engine.h | 12
|
||||
b/include/asterisk/test.h | 10
|
||||
b/main/audiohook.c | 22
|
||||
b/main/cdr.c | 86
|
||||
b/main/channel.c | 9
|
||||
b/main/config_options.c | 4
|
||||
b/main/db.c | 4
|
||||
b/main/dial.c | 9
|
||||
b/main/features.c | 28
|
||||
b/main/file.c | 1
|
||||
b/main/manager.c | 521 +
|
||||
b/main/options.c | 1
|
||||
b/main/pbx_builtins.c | 17
|
||||
b/main/say.c | 6
|
||||
b/main/tcptls.c | 2
|
||||
b/main/test.c | 9
|
||||
b/main/xmldoc.c | 124
|
||||
b/res/ari/resource_channels.c | 2
|
||||
b/res/prometheus/bridges.c | 12
|
||||
b/res/res_adsi.c | 8
|
||||
b/res/res_agi.c | 15
|
||||
b/res/res_crypto.c | 75
|
||||
b/res/res_geolocation/geoloc_datastore.c | 4
|
||||
b/res/res_geolocation/wiki/AsteriskImplementation.md | 251
|
||||
b/res/res_geolocation/wiki/GML.md | 38
|
||||
b/res/res_geolocation/wiki/Geolocation.md | 2
|
||||
b/res/res_geolocation/wiki/README.txt | 31
|
||||
b/res/res_geolocation/wiki/URI.md | 5
|
||||
b/res/res_hep.c | 22
|
||||
b/res/res_pjsip.c | 47
|
||||
b/res/res_pjsip/config_global.c | 21
|
||||
b/res/res_pjsip/pjsip_config.xml | 60
|
||||
b/res/res_pjsip/pjsip_configuration.c | 45
|
||||
b/res/res_pjsip/pjsip_options.c | 5
|
||||
b/res/res_pjsip/pjsip_transport_events.c | 214
|
||||
b/res/res_pjsip/security_agreements.c | 340
|
||||
b/res/res_pjsip_aoc.c | 698 +
|
||||
b/res/res_pjsip_exten_state.c | 13
|
||||
b/res/res_pjsip_header_funcs.c | 268
|
||||
b/res/res_pjsip_logger.c | 165
|
||||
b/res/res_pjsip_mwi.c | 13
|
||||
b/res/res_pjsip_notify.c | 165
|
||||
b/res/res_pjsip_outbound_authenticator_digest.c | 4
|
||||
b/res/res_pjsip_outbound_registration.c | 253
|
||||
b/res/res_pjsip_pubsub.c | 25
|
||||
b/res/res_pjsip_rfc3329.c | 150
|
||||
b/res/res_pjsip_sdp_rtp.c | 6
|
||||
b/res/res_pjsip_session.c | 118
|
||||
b/res/res_pjsip_transport_websocket.c | 1
|
||||
b/res/res_stasis_snoop.c | 22
|
||||
b/res/res_tonedetect.c | 25
|
||||
b/tests/CI/runUnittests.sh | 8
|
||||
b/tests/test_crypto.c | 19
|
||||
b/tests/test_json.c | 28
|
||||
b/tests/test_mwi.c | 4
|
||||
b/tests/test_stasis.c | 2
|
||||
b/tests/test_stasis_state.c | 8
|
||||
b/third-party/pjproject/patches/0200-potential-buffer-overflow-in-pjlib-scanner-and-pjmedia.patch | 300
|
||||
104 files changed, 6855 insertions(+), 6136 deletions(-)</pre><br></html>
|
|
@ -0,0 +1,768 @@
|
|||
Release Summary
|
||||
|
||||
asterisk-20.1.0
|
||||
|
||||
Date: 2023-01-12
|
||||
|
||||
<asteriskteam@digium.com>
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Table of Contents
|
||||
|
||||
1. Summary
|
||||
2. Contributors
|
||||
3. Closed Issues
|
||||
4. Open Issues
|
||||
5. Other Changes
|
||||
6. Diffstat
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Summary
|
||||
|
||||
[Back to Top]
|
||||
|
||||
This release is a point release of an existing major version. The changes
|
||||
included were made to address problems that have been identified in this
|
||||
release series, or are minor, backwards compatible new features or
|
||||
improvements. Users should be able to safely upgrade to this version if
|
||||
this release series is already in use. Users considering upgrading from a
|
||||
previous version are strongly encouraged to review the UPGRADE.txt
|
||||
document as well as the CHANGES document for information about upgrading
|
||||
to this release series.
|
||||
|
||||
The data in this summary reflects changes that have been made since the
|
||||
previous release, asterisk-20.0.0.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Contributors
|
||||
|
||||
[Back to Top]
|
||||
|
||||
This table lists the people who have submitted code, those that have
|
||||
tested patches, as well as those that reported issues on the issue tracker
|
||||
that were resolved in this release. For coders, the number is how many of
|
||||
their patches (of any size) were committed into this release. For testers,
|
||||
the number is the number of times their name was listed as assisting with
|
||||
testing a patch. Finally, for reporters, the number is the number of
|
||||
issues that they reported that were affected by commits that went into
|
||||
this release.
|
||||
|
||||
Coders Testers Reporters
|
||||
39 Naveen Albert 1 inspecting SIP traces. 37 N A
|
||||
7 George Joseph 7 George Joseph
|
||||
5 Philip Prindeville 4 Philip Prindeville
|
||||
4 Asterisk Development Team 3 Matt Jordan
|
||||
4 Mike Bradeen 3 Maximilian Fridrich
|
||||
3 Maximilian Fridrich 2 Michael Bradeen
|
||||
3 Joshua C. Colp 2 Marcel Wagner
|
||||
2 Jaco Kroon 2 Joshua C. Colp
|
||||
2 Michael Kuron 1 Igor Yeroshev
|
||||
2 Marcel Wagner 1 David Uczen
|
||||
1 Birger Harzenetter 1 Alexandre Fournier
|
||||
(license 5870) 1 Igor Goncharovsky
|
||||
1 Holger Hans Peter 1 Frederic LE FOLL
|
||||
Freyther 1 shawty
|
||||
1 Igor Goncharovsky 1 David Woolley
|
||||
1 Frederic LE FOLL 1 nappsoft
|
||||
1 Alexandre Fournier 1 Jesse Ross
|
||||
1 Ben Ford 1 Joeran Vinzens
|
||||
1 Henning Westerholt 1 Henning Westerholt
|
||||
1 Benjamin Keith Ford
|
||||
1 Saken
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Closed Issues
|
||||
|
||||
[Back to Top]
|
||||
|
||||
This is a list of all issues from the issue tracker that were closed by
|
||||
changes that went into this release.
|
||||
|
||||
Security
|
||||
|
||||
Category: Addons/chan_ooh323
|
||||
|
||||
ASTERISK-30103: chan_ooh323 Vulnerability in calling/called party IE
|
||||
Reported by: Michael Bradeen
|
||||
* [eb1d7ab53c] Mike Bradeen -- ooh323c: not checking for IE minimum
|
||||
length
|
||||
|
||||
Category: Core/ManagerInterface
|
||||
|
||||
ASTERISK-30176: manager: GetConfig can read files outside of Asterisk
|
||||
Reported by: shawty
|
||||
* [81f10e847e] Mike Bradeen -- manager: prevent file access outside of
|
||||
config dir
|
||||
|
||||
Category: pjproject/pjsip
|
||||
|
||||
ASTERISK-30338: pjproject: Backport security fixes from 2.13
|
||||
Reported by: Benjamin Keith Ford
|
||||
* [d476994768] Ben Ford -- pjproject: 2.13 security fixes
|
||||
|
||||
Improvement
|
||||
|
||||
Category: Applications/app_mixmonitor
|
||||
|
||||
ASTERISK-30286: app_mixmonitor: Add option to use real Caller ID for
|
||||
Caller ID
|
||||
Reported by: N A
|
||||
* [691178c48e] Naveen Albert -- app_mixmonitor: Add option to use real
|
||||
Caller ID for voicemail.
|
||||
|
||||
Category: Core/Bridging
|
||||
|
||||
ASTERISK-30223: features: add no-answer option to Bridge application
|
||||
Reported by: N A
|
||||
* [a5ec60e6c6] Naveen Albert -- features: Add no answer option to
|
||||
Bridge.
|
||||
|
||||
Category: Core/General
|
||||
|
||||
ASTERISK-30290: file.c: Don't emit warnings on winks.
|
||||
Reported by: N A
|
||||
* [8142b313c3] Naveen Albert -- file.c: Don't emit warnings on winks.
|
||||
|
||||
Category: Core/RTP
|
||||
|
||||
ASTERISK-30327: rtp_engine.h: Remove obsolete example usage
|
||||
Reported by: N A
|
||||
* [a4bcdce1db] Naveen Albert -- rtp_engine.h: Update examples using
|
||||
ast_format_set.
|
||||
|
||||
Category: Documentation
|
||||
|
||||
ASTERISK-30328: Typo in from_domain description on res_pjsip configuration
|
||||
documentation
|
||||
Reported by: Marcel Wagner
|
||||
* [58534b309f] Marcel Wagner -- res_pjsip: Fix typo in from_domain
|
||||
documentation
|
||||
ASTERISK-30316: res_pjsip: Documentation should point out default if
|
||||
contact_user is not being set for outbound registrations
|
||||
Reported by: Marcel Wagner
|
||||
* [b83af13f65] Marcel Wagner -- res_pjsip: Update contact_user to point
|
||||
out default
|
||||
ASTERISK-30289: xmldoc: Allow XML docs to be reloaded
|
||||
Reported by: N A
|
||||
* [52c7d3ed07] Naveen Albert -- xmldoc: Allow XML docs to be reloaded.
|
||||
|
||||
Category: PBX/General
|
||||
|
||||
ASTERISK-30308: pbx_builtins: Allow Answer to return immediately
|
||||
Reported by: N A
|
||||
* [c7df5ee7c1] Naveen Albert -- pbx_builtins: Allow Answer to return
|
||||
immediately.
|
||||
|
||||
Category: Resources/res_pjsip
|
||||
|
||||
ASTERISK-30158: PJSIP: Add new 100rel option "peer_supported"
|
||||
Reported by: Maximilian Fridrich
|
||||
* [5bbad0d27c] Maximilian Fridrich -- res_pjsip: Add 100rel option
|
||||
"peer_supported".
|
||||
|
||||
Category: Resources/res_pjsip_geolocation
|
||||
|
||||
ASTERISK-30241: res_pjsip_gelocation: Downgrade some NOTICE scope trace
|
||||
debugs to DEBUG level
|
||||
Reported by: N A
|
||||
* [8afb313a43] Naveen Albert -- res_pjsip_geolocation: Change some
|
||||
notices to debugs.
|
||||
|
||||
Category: Tests/General
|
||||
|
||||
ASTERISK-30295: test_json: Remove duplicated static function
|
||||
Reported by: N A
|
||||
* [1e77b8c473] Naveen Albert -- test_json: Remove duplicated static
|
||||
function.
|
||||
|
||||
Bug
|
||||
|
||||
Category: Applications/app_if
|
||||
|
||||
ASTERISK-30349: app_if: Format truncation error
|
||||
Reported by: George Joseph
|
||||
* [2f9cdfbc50] Naveen Albert -- app_if: Fix format truncation errors.
|
||||
|
||||
Category: Applications/app_meetme
|
||||
|
||||
ASTERISK-29998: sla: deadlock when calling SLAStation application
|
||||
Reported by: N A
|
||||
* [2efa290d3c] Naveen Albert -- sla: Prevent deadlock and crash due to
|
||||
autoservicing.
|
||||
|
||||
Category: Applications/app_saynumber
|
||||
|
||||
ASTERISK-30248: ast_get_digit_str adds bogus initial delimiter if first
|
||||
character not to be spoken
|
||||
Reported by: David Woolley
|
||||
* [407216a0a5] Naveen Albert -- say: Don't prepend ampersand
|
||||
erroneously.
|
||||
|
||||
Category: Applications/app_stack
|
||||
|
||||
ASTERISK-30076: app_stack: Incorrect exit location in predial handlers
|
||||
logged
|
||||
Reported by: N A
|
||||
* [dfe2f38642] Naveen Albert -- app_stack: Print proper exit location
|
||||
for PBXless channels.
|
||||
|
||||
Category: Applications/app_voicemail
|
||||
|
||||
ASTERISK-30283: app_voicemail: Fix msg_create_from_file not sending email
|
||||
to user
|
||||
Reported by: N A
|
||||
* [b9c031c1f8] Naveen Albert -- app_voicemail: Fix missing email in
|
||||
msg_create_from_file.
|
||||
ASTERISK-30248: ast_get_digit_str adds bogus initial delimiter if first
|
||||
character not to be spoken
|
||||
Reported by: David Woolley
|
||||
* [407216a0a5] Naveen Albert -- say: Don't prepend ampersand
|
||||
erroneously.
|
||||
|
||||
Category: Channels/chan_dahdi
|
||||
|
||||
ASTERISK-30336: sig_analog: Fix no timeout duration
|
||||
Reported by: N A
|
||||
* [b90e57758b] Naveen Albert -- sig_analog: Fix no timeout duration.
|
||||
ASTERISK-30274: chan_dahdi: Unavailable channels are BUSY
|
||||
Reported by: N A
|
||||
* [180ca32565] Naveen Albert -- chan_dahdi: Fix unavailable channels
|
||||
returning busy.
|
||||
ASTERISK-30256: chan_dahdi: Fix format truncation warnings
|
||||
Reported by: N A
|
||||
* [98fc05f13b] Naveen Albert -- chan_dahdi: Resolve format truncation
|
||||
warning.
|
||||
|
||||
Category: Channels/chan_local
|
||||
|
||||
ASTERISK-30239: Prometheus plugin crashes Asterisk when using local
|
||||
channel
|
||||
Reported by: Joeran Vinzens
|
||||
* [62881c668b] Holger Hans Peter Freyther -- res_prometheus: Do not
|
||||
crash on invisible bridges
|
||||
|
||||
Category: Channels/chan_pjsip
|
||||
|
||||
ASTERISK-30184: res_pjsip_session: re-INVITE after answering results in
|
||||
wrong stream direction of first call leg
|
||||
Reported by: Maximilian Fridrich
|
||||
* [60b81eabe0] Maximilian Fridrich -- core & res_pjsip: Improve topology
|
||||
change handling.
|
||||
ASTERISK-30193: chan_pjsip should return all codecs on a re-INVITE without
|
||||
SDP
|
||||
Reported by: Henning Westerholt
|
||||
* [12445040d3] Henning Westerholt -- res_pjsip: return all codecs on a
|
||||
re-INVITE without SDP
|
||||
|
||||
Category: Channels/chan_rtp
|
||||
|
||||
ASTERISK-30281: chan_rtp: Local address being used before being set
|
||||
Reported by: George Joseph
|
||||
* [f723b465e5] George Joseph -- chan_rtp: Make usage of
|
||||
ast_rtp_instance_get_local_address clearer
|
||||
|
||||
Category: Core/AstDB
|
||||
|
||||
ASTERISK-30245: db: ListItems is incorrect
|
||||
Reported by: N A
|
||||
* [7335b0cffe] Birger Harzenetter -- db: Fix incorrect DB tree count for
|
||||
AMI.
|
||||
|
||||
Category: Core/BuildSystem
|
||||
|
||||
ASTERISK-30321: Build: Embedded blobs have executable stacks
|
||||
Reported by: George Joseph
|
||||
* [ce2153fc5a] Jaco Kroon -- Build system: Avoid executable stack.
|
||||
|
||||
Category: Core/Dial
|
||||
|
||||
ASTERISK-30258: Dialing API: Cancel a running async thread, does not
|
||||
always cancel all calls
|
||||
Reported by: Frederic LE FOLL
|
||||
* [50a4495799] Frederic LE FOLL -- Dialing API: Cancel a running async
|
||||
thread, may not cancel all calls
|
||||
|
||||
Category: Core/General
|
||||
|
||||
ASTERISK-30278: tcptls: Abort occurs if SSL error is logged if
|
||||
MALLOC_DEBUG is enabled
|
||||
Reported by: N A
|
||||
* [afd86b47c1] Naveen Albert -- tcptls: Prevent crash when freeing
|
||||
OpenSSL errors.
|
||||
|
||||
Category: Core/HTTP
|
||||
|
||||
ASTERISK-30278: tcptls: Abort occurs if SSL error is logged if
|
||||
MALLOC_DEBUG is enabled
|
||||
Reported by: N A
|
||||
* [afd86b47c1] Naveen Albert -- tcptls: Prevent crash when freeing
|
||||
OpenSSL errors.
|
||||
|
||||
Category: Core/ManagerInterface
|
||||
|
||||
ASTERISK-30285: manager.c: Remove outdated documentation
|
||||
Reported by: N A
|
||||
* [49cfdbbdff] Naveen Albert -- manager: Update ModuleCheck
|
||||
documentation.
|
||||
|
||||
Category: Functions/General
|
||||
|
||||
ASTERISK-30293: Memory leak in JSON_DECODE
|
||||
Reported by: David Uczen
|
||||
* [002afc3f2a] Naveen Albert -- func_json: Fix memory leak.
|
||||
ASTERISK-30220: func_scramble: Fix segfault due to null pointer deref
|
||||
Reported by: N A
|
||||
* [8aae0b9f08] Naveen Albert -- func_scramble: Fix null pointer
|
||||
dereference.
|
||||
|
||||
Category: Functions/func_logic
|
||||
|
||||
ASTERISK-30243: func_logic: IF function complains if both branches are
|
||||
empty
|
||||
Reported by: N A
|
||||
* [407167cc28] Naveen Albert -- func_logic: Don't emit warning if both
|
||||
IF branches are empty.
|
||||
|
||||
Category: Functions/func_presencestate
|
||||
|
||||
ASTERISK-30311: func_presencestate: Fix invalid memory access.
|
||||
Reported by: N A
|
||||
* [83eb113e0f] Naveen Albert -- func_presencestate: Fix invalid memory
|
||||
access.
|
||||
|
||||
Category: Resources/General
|
||||
|
||||
ASTERISK-30239: Prometheus plugin crashes Asterisk when using local
|
||||
channel
|
||||
Reported by: Joeran Vinzens
|
||||
* [62881c668b] Holger Hans Peter Freyther -- res_prometheus: Do not
|
||||
crash on invisible bridges
|
||||
ASTERISK-30237: res_prometheus: Crash when scraping bridges
|
||||
Reported by: Igor Yeroshev
|
||||
* [62881c668b] Holger Hans Peter Freyther -- res_prometheus: Do not
|
||||
crash on invisible bridges
|
||||
|
||||
Category: Resources/res_adsi
|
||||
|
||||
ASTERISK-29793: adsi: CAS is malformed
|
||||
Reported by: N A
|
||||
* [80e6205bb0] Naveen Albert -- res_adsi: Fix major regression caused by
|
||||
media format rearchitecture.
|
||||
|
||||
Category: Resources/res_agi
|
||||
|
||||
ASTERISK-30314: res_agi: RECORD FILE doesn't respect "transmit_silence"
|
||||
asterisk.conf option
|
||||
Reported by: Joshua C. Colp
|
||||
* [61922d2934] Joshua C. Colp -- res_agi: Respect "transmit_silence"
|
||||
option for "RECORD FILE".
|
||||
|
||||
Category: Resources/res_ari
|
||||
|
||||
ASTERISK-30344: ari: Memory leak in create when specifying JSON
|
||||
Reported by: Saken
|
||||
* [564349ff5d] Joshua C. Colp -- ari: Destroy body variables in channel
|
||||
create.
|
||||
|
||||
Category: Resources/res_ari_channels
|
||||
|
||||
ASTERISK-30237: res_prometheus: Crash when scraping bridges
|
||||
Reported by: Igor Yeroshev
|
||||
* [62881c668b] Holger Hans Peter Freyther -- res_prometheus: Do not
|
||||
crash on invisible bridges
|
||||
|
||||
Category: Resources/res_crypto
|
||||
|
||||
ASTERISK-30213: Make crypto_load() reentrant and handle symlinks correctly
|
||||
Reported by: Philip Prindeville
|
||||
* [d0bea5a725] Philip Prindeville -- res_crypto: handle unsafe private
|
||||
key files
|
||||
* [ef74ecacc7] Philip Prindeville -- res_crypto: don't modify fname in
|
||||
try_load_key()
|
||||
* [5e2485b5c0] Philip Prindeville -- res_crypto: use
|
||||
ast_file_read_dirs() to iterate
|
||||
ASTERISK-30235: res_crypto and tests: Memory issues and and uninitialized
|
||||
variable error
|
||||
Reported by: George Joseph
|
||||
* [e25b690d10] George Joseph -- res_crypto: Memory issues and
|
||||
uninitialized variable errors
|
||||
ASTERISK-30226: REGRESSION: res_crypto complains about the stir_shaken
|
||||
directory in /var/lib/asterisk/keys
|
||||
Reported by: George Joseph
|
||||
* [026dc08529] Philip Prindeville -- res_crypto: don't complain about
|
||||
directories
|
||||
|
||||
Category: Resources/res_geolocation
|
||||
|
||||
ASTERISK-30234: res_geolocation: ...may be used uninitialized error in
|
||||
geoloc_config.c
|
||||
Reported by: George Joseph
|
||||
* [e33f2dcc0f] George Joseph -- res_geolocation: Fix issues exposed by
|
||||
compiling with -O2
|
||||
|
||||
Category: Resources/res_pjsip
|
||||
|
||||
ASTERISK-30369: res_pjsip: Websockets from same IP shut down when they
|
||||
shouldn't be
|
||||
Reported by: Joshua C. Colp
|
||||
* [ff9ab38573] George Joseph -- res_pjsip_transport_websocket: Add
|
||||
remote port to transport
|
||||
ASTERISK-30184: res_pjsip_session: re-INVITE after answering results in
|
||||
wrong stream direction of first call leg
|
||||
Reported by: Maximilian Fridrich
|
||||
* [60b81eabe0] Maximilian Fridrich -- core & res_pjsip: Improve topology
|
||||
change handling.
|
||||
|
||||
Category: Resources/res_pjsip_exten_state
|
||||
|
||||
ASTERISK-30264: res_pjsip: Subscription handlers do not get cleanly
|
||||
unregistered, causing crash
|
||||
Reported by: N A
|
||||
* [9258d8212a] Naveen Albert -- res_pjsip_pubsub: Prevent removing
|
||||
subscriptions.
|
||||
|
||||
Category: Resources/res_pjsip_mwi
|
||||
|
||||
ASTERISK-30264: res_pjsip: Subscription handlers do not get cleanly
|
||||
unregistered, causing crash
|
||||
Reported by: N A
|
||||
* [9258d8212a] Naveen Albert -- res_pjsip_pubsub: Prevent removing
|
||||
subscriptions.
|
||||
|
||||
Category: Resources/res_pjsip_outbound_registration
|
||||
|
||||
ASTERISK-30217: Registration do not allow multiple proxies
|
||||
Reported by: Igor Goncharovsky
|
||||
* [096529d33f] Igor Goncharovsky -- res_pjsip_outbound_registration:
|
||||
Allow to use multiple proxies for registration
|
||||
|
||||
Category: Resources/res_pjsip_pubsub
|
||||
|
||||
ASTERISK-30244: res_pjsip_pubsub: Occasional crash when TCP/TLS connection
|
||||
terminated and subscription persistence is removed
|
||||
Reported by: nappsoft
|
||||
* [7684c9e907] George Joseph -- pjsip_transport_events: Fix possible use
|
||||
after free on transport
|
||||
|
||||
Category: Resources/res_pjsip_session
|
||||
|
||||
ASTERISK-30265: res_pjsip_session: Fix missing PLAR support on INVITEs
|
||||
Reported by: N A
|
||||
* [0d6003fa9a] Naveen Albert -- res_pjsip_session.c: Map empty
|
||||
extensions in INVITEs to s.
|
||||
ASTERISK-30184: res_pjsip_session: re-INVITE after answering results in
|
||||
wrong stream direction of first call leg
|
||||
Reported by: Maximilian Fridrich
|
||||
* [60b81eabe0] Maximilian Fridrich -- core & res_pjsip: Improve topology
|
||||
change handling.
|
||||
|
||||
Category: Tests/General
|
||||
|
||||
ASTERISK-30282: CI: Coredump output isn't saved when running unittests
|
||||
Reported by: George Joseph
|
||||
* [0c1c623dee] George Joseph -- runUnittests.sh: Save coredumps to
|
||||
proper directory
|
||||
ASTERISK-30232: Initialize stack-based ast_test_capture structures
|
||||
correctly
|
||||
Reported by: Philip Prindeville
|
||||
* [3e7ce90f9c] Philip Prindeville -- test: initialize capture structure
|
||||
before freeing
|
||||
|
||||
Category: Tests/Portability
|
||||
|
||||
ASTERISK-30273: test_mwi: compilation fails on 32-bit Debian
|
||||
Reported by: N A
|
||||
* [ca8900b0f6] Naveen Albert -- tests: Fix compilation errors on 32-bit.
|
||||
|
||||
Category: pjproject/pjsip
|
||||
|
||||
ASTERISK-28689: res_pjsip: Crash when locking group lock when sending
|
||||
stateful response
|
||||
Reported by: Jesse Ross
|
||||
* [50e2921a48] Mike Bradeen -- res_pjsip: prevent crash on websocket
|
||||
disconnect
|
||||
|
||||
New Feature
|
||||
|
||||
Category: Applications/NewFeature
|
||||
|
||||
ASTERISK-29497: Add conditional branch applications
|
||||
Reported by: N A
|
||||
* [b365ea8601] Naveen Albert -- app_if: Adds conditional branch
|
||||
applications
|
||||
|
||||
Category: Applications/app_amd
|
||||
|
||||
ASTERISK-30179: app_amd: Allow audio to be played while AMD is running
|
||||
Reported by: N A
|
||||
* [8c791f9a65] Naveen Albert -- app_amd: Add option to play audio during
|
||||
AMD.
|
||||
|
||||
Category: Applications/app_bridgewait
|
||||
|
||||
ASTERISK-30216: app_bridgewait: Add option for BridgeWait to not answer
|
||||
Reported by: N A
|
||||
* [1e29607b5c] Naveen Albert -- app_bridgewait: Add option to not answer
|
||||
channel.
|
||||
|
||||
Category: Applications/app_mixmonitor
|
||||
|
||||
ASTERISK-30284: app_mixmonitor: Add option to delete recording file when
|
||||
done
|
||||
Reported by: N A
|
||||
* [6e59b01e1a] Naveen Albert -- app_mixmonitor: Add option to delete
|
||||
files on exit.
|
||||
|
||||
Category: CDR/General
|
||||
|
||||
ASTERISK-30091: cdr: Allow CDRs to ignore call state changes
|
||||
Reported by: N A
|
||||
* [b331caca30] Naveen Albert -- cdr: Allow bridging and dial state
|
||||
changes to be ignored.
|
||||
|
||||
Category: Channels/chan_dahdi
|
||||
|
||||
ASTERISK-30305: chan_dahdi: Allow FXO channels to start immediately
|
||||
Reported by: N A
|
||||
* [5ede4e217a] Naveen Albert -- chan_dahdi: Allow FXO channels to start
|
||||
immediately.
|
||||
|
||||
Category: Channels/chan_pjsip
|
||||
|
||||
ASTERISK-21502: New SIP Channel Driver - add Advice of Charge support
|
||||
Reported by: Matt Jordan
|
||||
* [b6855755ce] Joshua C. Colp -- res_pjsip_aoc: Don't assume a body
|
||||
exists on responses.
|
||||
* [5c114dcb4a] Michael Kuron -- manager: AOC-S support for AOCMessage
|
||||
* [fee9012fe1] Michael Kuron -- res_pjsip_aoc: New module for sending
|
||||
advice-of-charge with chan_pjsip
|
||||
|
||||
Category: Functions/NewFeature
|
||||
|
||||
ASTERISK-29432: New function to allow access to any channel
|
||||
Reported by: N A
|
||||
* [1ed4518328] Naveen Albert -- func_export: Add EXPORT function
|
||||
|
||||
Category: Functions/func_strings
|
||||
|
||||
ASTERISK-30222: func_strings: Add trim functions
|
||||
Reported by: N A
|
||||
* [ab1dbfef75] Naveen Albert -- func_strings: Add trim functions.
|
||||
|
||||
Category: Resources/General
|
||||
|
||||
ASTERISK-30254: res_tonedetect: Add audible ringback detection to
|
||||
TONE_DETECT
|
||||
Reported by: N A
|
||||
* [e0e7f35730] Naveen Albert -- res_tonedetect: Add ringback support to
|
||||
TONE_DETECT.
|
||||
|
||||
Category: Resources/res_hep
|
||||
|
||||
ASTERISK-30322: res_hep: Add capture agent name support
|
||||
Reported by: N A
|
||||
* [531eacd6c9] Naveen Albert -- res_hep: Add support for named capture
|
||||
agents.
|
||||
|
||||
Category: Resources/res_pjsip
|
||||
|
||||
ASTERISK-30032: Support of mediasec SIP headers and SDP attributes
|
||||
Reported by: Maximilian Fridrich
|
||||
* [0d2e140123] Maximilian Fridrich -- res_pjsip: Add mediasec
|
||||
capabilities.
|
||||
|
||||
Category: Resources/res_pjsip_logger
|
||||
|
||||
ASTERISK-30146: res_pjsip_logger: Add method-based log filtering
|
||||
Reported by: N A
|
||||
* [c32b39d123] Naveen Albert -- res_pjsip_logger: Add method-based
|
||||
logging option.
|
||||
|
||||
Category: Resources/res_pjsip_notify
|
||||
|
||||
ASTERISK-30263: res_pjsip_notify: Allow using pjsip_notify.conf from AMI
|
||||
Reported by: N A
|
||||
* [40b52322e5] Naveen Albert -- res_pjsip_notify: Add option support for
|
||||
AMI.
|
||||
|
||||
Category: Resources/res_pjsip_session
|
||||
|
||||
ASTERISK-30150: res_pjsip_session: Add support for custom parameters
|
||||
Reported by: N A
|
||||
* [406143ae61] Naveen Albert -- res_pjsip_header_funcs: Add custom
|
||||
parameter support.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Open Issues
|
||||
|
||||
[Back to Top]
|
||||
|
||||
This is a list of all open issues from the issue tracker that were
|
||||
referenced by changes that went into this release.
|
||||
|
||||
Bug
|
||||
|
||||
Category: Resources/res_geolocation
|
||||
|
||||
ASTERISK-30346: Fix NULL dereferencing issue in Geolocation
|
||||
Reported by: Alexandre Fournier
|
||||
* [01b3962201] Alexandre Fournier -- res_geoloc: fix NULL pointer
|
||||
dereference bug
|
||||
|
||||
Category: Resources/res_stasis_snoop
|
||||
|
||||
ASTERISK-30252: Unidirectional snoop on resampled channel causes garbled
|
||||
audio
|
||||
Reported by: Michael Bradeen
|
||||
* [907d7e7d7d] Mike Bradeen -- audiohook: add directional awareness
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Commits Not Associated with an Issue
|
||||
|
||||
[Back to Top]
|
||||
|
||||
This is a list of all changes that went into this release that did not
|
||||
reference a JIRA issue.
|
||||
|
||||
+------------------------------------------------------------------------+
|
||||
| Revision | Author | Summary |
|
||||
|------------+----------------------+------------------------------------|
|
||||
| 4a9f5e7ae6 | Asterisk Development | Update for 20.1.0-rc2 |
|
||||
| | Team | |
|
||||
|------------+----------------------+------------------------------------|
|
||||
| aecc5448f1 | Asterisk Development | Update for 20.1.0-rc1 |
|
||||
| | Team | |
|
||||
|------------+----------------------+------------------------------------|
|
||||
| fefc236e7c | Asterisk Development | Update CHANGES and UPGRADE.txt for |
|
||||
| | Team | 20.1.0 |
|
||||
|------------+----------------------+------------------------------------|
|
||||
| 2a500b325a | George Joseph | res_geolocation: Update wiki |
|
||||
| | | documentation |
|
||||
|------------+----------------------+------------------------------------|
|
||||
| 7f80830ced | Asterisk Development | Update CHANGES and UPGRADE.txt for |
|
||||
| | Team | 20.0.0 |
|
||||
|------------+----------------------+------------------------------------|
|
||||
| 278c5726ca | Jaco Kroon | manager: be more aggressive about |
|
||||
| | | purging http sessions. |
|
||||
+------------------------------------------------------------------------+
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Diffstat Results
|
||||
|
||||
[Back to Top]
|
||||
|
||||
This is a summary of the changes to the source code that went into this
|
||||
release that was generated using the diffstat utility.
|
||||
|
||||
asterisk-20.0.0-summary.html | 1836 ----
|
||||
asterisk-20.0.0-summary.txt | 3804 ----------
|
||||
b/.version | 2
|
||||
b/CHANGES | 146
|
||||
b/ChangeLog | 1188 +++
|
||||
b/Makefile.rules | 4
|
||||
b/UPGRADE.txt | 13
|
||||
b/addons/ooh323c/src/ooq931.c | 15
|
||||
b/apps/app_amd.c | 51
|
||||
b/apps/app_bridgewait.c | 9
|
||||
b/apps/app_if.c | 383 +
|
||||
b/apps/app_meetme.c | 24
|
||||
b/apps/app_mixmonitor.c | 66
|
||||
b/apps/app_stack.c | 48
|
||||
b/apps/app_voicemail.c | 31
|
||||
b/asterisk-20.1.0-rc2-summary.html | 11
|
||||
b/asterisk-20.1.0-rc2-summary.txt | 82
|
||||
b/channels/chan_dahdi.c | 9
|
||||
b/channels/chan_rtp.c | 2
|
||||
b/channels/sig_analog.c | 28
|
||||
b/configs/samples/amd.conf.sample | 7
|
||||
b/configs/samples/asterisk.conf.sample | 11
|
||||
b/configs/samples/cdr.conf.sample | 11
|
||||
b/configs/samples/chan_dahdi.conf.sample | 9
|
||||
b/configs/samples/geolocation.conf.sample | 2
|
||||
b/configs/samples/hep.conf.sample | 3
|
||||
b/configs/samples/pjsip.conf.sample | 12
|
||||
b/configs/samples/voicemail.conf.sample | 2
|
||||
b/contrib/ast-db-manage/config/versions/417c0247fd7e_add_security_negotiation_and_security_.py | 49
|
||||
b/contrib/ast-db-manage/config/versions/539f68bede2c_add_peer_supported_to_100rel.py | 57
|
||||
b/contrib/ast-db-manage/config/versions/5a2247c957d2_add_aoc_option.py | 38
|
||||
b/contrib/ast-db-manage/config/versions/ccf795ee535f_all_codecs_on_empty_reinvite.py | 37
|
||||
b/contrib/realtime/mysql/mysql_config.sql | 30
|
||||
b/contrib/realtime/postgresql/postgresql_config.sql | 36
|
||||
b/funcs/func_export.c | 107
|
||||
b/funcs/func_json.c | 4
|
||||
b/funcs/func_logic.c | 3
|
||||
b/funcs/func_presencestate.c | 4
|
||||
b/funcs/func_sayfiles.c | 9
|
||||
b/funcs/func_scramble.c | 1
|
||||
b/funcs/func_strings.c | 186
|
||||
b/include/asterisk/audiohook.h | 9
|
||||
b/include/asterisk/cdr.h | 2
|
||||
b/include/asterisk/manager.h | 12
|
||||
b/include/asterisk/res_pjsip.h | 239
|
||||
b/include/asterisk/res_pjsip_session.h | 2
|
||||
b/include/asterisk/rtp_engine.h | 12
|
||||
b/include/asterisk/test.h | 10
|
||||
b/main/audiohook.c | 22
|
||||
b/main/cdr.c | 86
|
||||
b/main/channel.c | 9
|
||||
b/main/config_options.c | 4
|
||||
b/main/db.c | 4
|
||||
b/main/dial.c | 9
|
||||
b/main/features.c | 28
|
||||
b/main/file.c | 1
|
||||
b/main/manager.c | 521 +
|
||||
b/main/options.c | 1
|
||||
b/main/pbx_builtins.c | 17
|
||||
b/main/say.c | 6
|
||||
b/main/tcptls.c | 2
|
||||
b/main/test.c | 9
|
||||
b/main/xmldoc.c | 124
|
||||
b/res/ari/resource_channels.c | 2
|
||||
b/res/prometheus/bridges.c | 12
|
||||
b/res/res_adsi.c | 8
|
||||
b/res/res_agi.c | 15
|
||||
b/res/res_crypto.c | 75
|
||||
b/res/res_geolocation/geoloc_datastore.c | 4
|
||||
b/res/res_geolocation/wiki/AsteriskImplementation.md | 251
|
||||
b/res/res_geolocation/wiki/GML.md | 38
|
||||
b/res/res_geolocation/wiki/Geolocation.md | 2
|
||||
b/res/res_geolocation/wiki/README.txt | 31
|
||||
b/res/res_geolocation/wiki/URI.md | 5
|
||||
b/res/res_hep.c | 22
|
||||
b/res/res_pjsip.c | 47
|
||||
b/res/res_pjsip/config_global.c | 21
|
||||
b/res/res_pjsip/pjsip_config.xml | 60
|
||||
b/res/res_pjsip/pjsip_configuration.c | 45
|
||||
b/res/res_pjsip/pjsip_options.c | 5
|
||||
b/res/res_pjsip/pjsip_transport_events.c | 214
|
||||
b/res/res_pjsip/security_agreements.c | 340
|
||||
b/res/res_pjsip_aoc.c | 698 +
|
||||
b/res/res_pjsip_exten_state.c | 13
|
||||
b/res/res_pjsip_header_funcs.c | 268
|
||||
b/res/res_pjsip_logger.c | 165
|
||||
b/res/res_pjsip_mwi.c | 13
|
||||
b/res/res_pjsip_notify.c | 165
|
||||
b/res/res_pjsip_outbound_authenticator_digest.c | 4
|
||||
b/res/res_pjsip_outbound_registration.c | 253
|
||||
b/res/res_pjsip_pubsub.c | 25
|
||||
b/res/res_pjsip_rfc3329.c | 150
|
||||
b/res/res_pjsip_sdp_rtp.c | 6
|
||||
b/res/res_pjsip_session.c | 118
|
||||
b/res/res_pjsip_transport_websocket.c | 1
|
||||
b/res/res_stasis_snoop.c | 22
|
||||
b/res/res_tonedetect.c | 25
|
||||
b/tests/CI/runUnittests.sh | 8
|
||||
b/tests/test_crypto.c | 19
|
||||
b/tests/test_json.c | 28
|
||||
b/tests/test_mwi.c | 4
|
||||
b/tests/test_stasis.c | 2
|
||||
b/tests/test_stasis_state.c | 8
|
||||
b/third-party/pjproject/patches/0200-potential-buffer-overflow-in-pjlib-scanner-and-pjmedia.patch | 300
|
||||
104 files changed, 6855 insertions(+), 6136 deletions(-)
|
|
@ -3447,7 +3447,7 @@ struct sig_ss7_callback sig_ss7_callbacks =
|
|||
*/
|
||||
static void notify_message(char *mailbox, int thereornot)
|
||||
{
|
||||
char s[sizeof(mwimonitornotify) + 80];
|
||||
char s[sizeof(mwimonitornotify) + 164];
|
||||
|
||||
if (ast_strlen_zero(mailbox)) {
|
||||
return;
|
||||
|
@ -4115,7 +4115,7 @@ static void dahdi_r2_on_context_log(openr2_context_t *r2context, openr2_log_leve
|
|||
{
|
||||
#define CONTEXT_TAG "Context - "
|
||||
char logmsg[256];
|
||||
char completemsg[sizeof(logmsg) + sizeof(CONTEXT_TAG) - 1];
|
||||
char completemsg[sizeof(logmsg) * 2];
|
||||
vsnprintf(logmsg, sizeof(logmsg), fmt, ap);
|
||||
snprintf(completemsg, sizeof(completemsg), CONTEXT_TAG "%s", logmsg);
|
||||
dahdi_r2_write_log(level, completemsg);
|
||||
|
@ -4128,10 +4128,11 @@ static void dahdi_r2_on_chan_log(openr2_chan_t *r2chan, openr2_log_level_t level
|
|||
{
|
||||
#define CHAN_TAG "Chan "
|
||||
char logmsg[256];
|
||||
char completemsg[sizeof(logmsg) + sizeof(CHAN_TAG) - 1];
|
||||
char completemsg[sizeof(logmsg) * 2];
|
||||
vsnprintf(logmsg, sizeof(logmsg), fmt, ap);
|
||||
snprintf(completemsg, sizeof(completemsg), CHAN_TAG "%d - %s", openr2_chan_get_number(r2chan), logmsg);
|
||||
dahdi_r2_write_log(level, completemsg);
|
||||
#undef CHAN_TAG
|
||||
}
|
||||
|
||||
static int dahdi_r2_on_dnis_digit_received(openr2_chan_t *r2chan, char digit)
|
||||
|
@ -13651,6 +13652,7 @@ static struct ast_channel *dahdi_request(const char *type, struct ast_format_cap
|
|||
struct ast_channel *tmp = NULL;
|
||||
struct dahdi_pvt *exitpvt;
|
||||
int channelmatched = 0;
|
||||
int foundowner = 0;
|
||||
int groupmatched = 0;
|
||||
#if defined(HAVE_PRI) || defined(HAVE_SS7)
|
||||
int transcapdigital = 0;
|
||||
|
@ -13674,6 +13676,10 @@ static struct ast_channel *dahdi_request(const char *type, struct ast_format_cap
|
|||
if (start.roundrobin)
|
||||
round_robin[start.rr_starting_point] = p;
|
||||
|
||||
if (p->owner) {
|
||||
foundowner++;
|
||||
}
|
||||
|
||||
if (is_group_or_channel_match(p, start.span, start.groupmatch, &groupmatched, start.channelmatch, &channelmatched)
|
||||
&& available(&p, channelmatched)) {
|
||||
ast_debug(1, "Using channel %d\n", p->channel);
|
||||
|
@ -13792,7 +13798,7 @@ next:
|
|||
ast_mutex_unlock(&iflock);
|
||||
restart_monitor();
|
||||
if (cause && !tmp) {
|
||||
if (callwait || channelmatched) {
|
||||
if (callwait || (channelmatched && foundowner)) {
|
||||
*cause = AST_CAUSE_BUSY;
|
||||
} else if (groupmatched) {
|
||||
*cause = AST_CAUSE_CONGESTION;
|
||||
|
@ -19411,7 +19417,7 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct
|
|||
report_alarms = REPORT_SPAN_ALARMS;
|
||||
}
|
||||
} else if (!(options & PROC_DAHDI_OPT_NOWARN) )
|
||||
ast_log(LOG_WARNING, "Ignoring any changes to '%s' (on reload) at line %d.\n", v->name, v->lineno);
|
||||
ast_log(LOG_NOTICE, "Ignoring any changes to '%s' (on reload) at line %d.\n", v->name, v->lineno);
|
||||
}
|
||||
|
||||
if (dahdichan) {
|
||||
|
|
|
@ -226,6 +226,16 @@
|
|||
</enum>
|
||||
</enumlist>
|
||||
</info>
|
||||
<info name="Dial_Resource" language="en_US" tech="IAX2">
|
||||
<para>The general syntax is:</para>
|
||||
<para><literal>Dial(IAX2/[username[:password]@]peer[:port][/exten[@context]][/options]</literal></para>
|
||||
<para>IAX2 optionally allows modifiers to be specified after the extension.</para>
|
||||
<enumlist>
|
||||
<enum name="a">
|
||||
<para>Request auto answer (supporting equipment/configuration required)</para>
|
||||
</enum>
|
||||
</enumlist>
|
||||
</info>
|
||||
<manager name="IAXpeers" language="en_US">
|
||||
<synopsis>
|
||||
List IAX peers.
|
||||
|
@ -3407,7 +3417,7 @@ static int send_packet(struct iax_frame *f)
|
|||
|
||||
/* Called with iaxsl held */
|
||||
if (iaxdebug) {
|
||||
ast_debug(3, "Sending %u on %d/%d to %s\n", f->ts, callno, iaxs[callno]->peercallno, ast_sockaddr_stringify(&iaxs[callno]->addr));
|
||||
ast_debug(8, "Sending %u on %d/%d to %s\n", f->ts, callno, iaxs[callno]->peercallno, ast_sockaddr_stringify(&iaxs[callno]->addr));
|
||||
}
|
||||
if (f->transfer) {
|
||||
iax_outputframe(f, NULL, 0, &iaxs[callno]->transfer, f->datalen - sizeof(struct ast_iax2_full_hdr));
|
||||
|
@ -6384,7 +6394,7 @@ static int invalid_key(ast_aes_decrypt_key *ecx)
|
|||
#ifdef HAVE_OPENSSL
|
||||
int i;
|
||||
for (i = 0; i < 60; i++) {
|
||||
if (ecx->rd_key[i]) {
|
||||
if (ecx->raw[i]) {
|
||||
return 0; /* stop if we encounter anything non-zero */
|
||||
}
|
||||
}
|
||||
|
@ -10363,7 +10373,7 @@ static int socket_process_helper(struct iax2_thread *thread)
|
|||
}
|
||||
if (ast_test_flag64(iaxs[fr->callno], IAX_ENCRYPTED) && !decrypted) {
|
||||
if (decrypt_frame(fr->callno, fh, &f, &res)) {
|
||||
ast_log(LOG_NOTICE, "Packet Decrypt Failed!\n");
|
||||
ast_log(LOG_WARNING, "Packet Decrypt Failed!\n");
|
||||
ast_variables_destroy(ies.vars);
|
||||
ast_mutex_unlock(&iaxsl[fr->callno]);
|
||||
return 1;
|
||||
|
@ -12033,7 +12043,7 @@ immediatedial:
|
|||
iaxs[fr->callno]->last = fr->ts;
|
||||
#if 1
|
||||
if (iaxdebug)
|
||||
ast_debug(3, "For call=%d, set last=%u\n", fr->callno, fr->ts);
|
||||
ast_debug(8, "For call=%d, set last=%u\n", fr->callno, fr->ts);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -3009,11 +3009,11 @@ static void chan_pjsip_session_end(struct ast_sip_session *session)
|
|||
|
||||
static void set_sipdomain_variable(struct ast_sip_session *session)
|
||||
{
|
||||
pjsip_sip_uri *sip_ruri = pjsip_uri_get_uri(session->request_uri);
|
||||
size_t size = pj_strlen(&sip_ruri->host) + 1;
|
||||
const pj_str_t *host = ast_sip_pjsip_uri_get_hostname(session->request_uri);
|
||||
size_t size = pj_strlen(host) + 1;
|
||||
char *domain = ast_alloca(size);
|
||||
|
||||
ast_copy_pj_str(domain, &sip_ruri->host, size);
|
||||
ast_copy_pj_str(domain, host, size);
|
||||
|
||||
pbx_builtin_setvar_helper(session->channel, "SIPDOMAIN", domain);
|
||||
return;
|
||||
|
|
|
@ -381,9 +381,9 @@ static struct ast_channel *unicast_rtp_request(const char *type, struct ast_form
|
|||
|
||||
ast_channel_tech_pvt_set(chan, instance);
|
||||
|
||||
ast_rtp_instance_get_local_address(instance, &local_address);
|
||||
pbx_builtin_setvar_helper(chan, "UNICASTRTP_LOCAL_ADDRESS",
|
||||
ast_sockaddr_stringify_addr(&local_address));
|
||||
ast_rtp_instance_get_local_address(instance, &local_address);
|
||||
pbx_builtin_setvar_helper(chan, "UNICASTRTP_LOCAL_PORT",
|
||||
ast_sockaddr_stringify_port(&local_address));
|
||||
|
||||
|
|
|
@ -2138,7 +2138,7 @@ static void *__analog_ss_thread(void *data)
|
|||
/* If starting a threeway call, never timeout on the first digit so someone
|
||||
can use flash-hook as a "hold" feature */
|
||||
if (p->subs[ANALOG_SUB_THREEWAY].owner) {
|
||||
timeout = 999999;
|
||||
timeout = INT_MAX;
|
||||
}
|
||||
while (len < AST_MAX_EXTENSION-1) {
|
||||
int is_exten_parking = 0;
|
||||
|
@ -3731,6 +3731,32 @@ void *analog_handle_init_event(struct analog_pvt *i, int event)
|
|||
/* Handle an event on a given channel for the monitor thread. */
|
||||
switch (event) {
|
||||
case ANALOG_EVENT_WINKFLASH:
|
||||
case ANALOG_EVENT_RINGBEGIN:
|
||||
switch (i->sig) {
|
||||
case ANALOG_SIG_FXSLS:
|
||||
case ANALOG_SIG_FXSGS:
|
||||
case ANALOG_SIG_FXSKS:
|
||||
if (i->immediate) {
|
||||
if (i->use_callerid || i->usedistinctiveringdetection) {
|
||||
ast_log(LOG_WARNING, "Can't start PBX immediately, must wait for Caller ID / distinctive ring\n");
|
||||
} else {
|
||||
/* If we don't care about Caller ID or Distinctive Ring, then there's
|
||||
* no need to wait for anything before accepting the call, as
|
||||
* waiting will buy us nothing.
|
||||
* So if the channel is configured for immediate, actually start immediately
|
||||
* and get the show on the road as soon as possible. */
|
||||
ast_debug(1, "Disabling ring timeout (previously %d) to begin handling immediately\n", i->ringt_base);
|
||||
analog_set_ringtimeout(i, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
/* Fall through */
|
||||
if (!(ISTRUNK(i) && i->immediate && !i->use_callerid && !i->usedistinctiveringdetection)) {
|
||||
break;
|
||||
}
|
||||
case ANALOG_EVENT_RINGOFFHOOK:
|
||||
if (i->inalarm) {
|
||||
break;
|
||||
|
|
|
@ -8,6 +8,11 @@ total_analysis_time = 5000 ; Maximum time allowed for the algorithm to decide
|
|||
silence_threshold = 256 ; If the average level of noise in a sample does not reach
|
||||
; this value, from a scale of 0 to 32767, then we will consider
|
||||
; it to be silence.
|
||||
;playback_file = ; Audio file to play while AMD is running, so the caller
|
||||
; does not just hear silence. Note that specifying this here
|
||||
; will apply to ALL AMD runs, so you may wish to set it
|
||||
; in the dialplan as an argument to AMD() instead.
|
||||
; Default is no audio file (not to play anything).
|
||||
|
||||
; Greeting ;
|
||||
initial_silence = 2500 ; Maximum silence duration before the greeting.
|
||||
|
@ -19,7 +24,7 @@ greeting = 1500 ; Maximum length of a greeting. If exceeded, then the
|
|||
|
||||
; Word detection ;
|
||||
min_word_length = 100 ; Minimum duration of Voice to considered as a word
|
||||
maximum_word_length = 5000 ; Maximum duration of a single Voice utterance allowed.
|
||||
maximum_word_length = 5000 ; Maximum duration of a single Voice utterance allowed.
|
||||
between_words_silence = 50 ; Minimum duration of silence after a word to consider
|
||||
; the audio what follows as a new word
|
||||
|
||||
|
|
|
@ -95,10 +95,13 @@ documentation_language = en_US ; Set the language you want documentation
|
|||
; documented in extensions.conf.sample.
|
||||
; Default gosub.
|
||||
;live_dangerously = no ; Enable the execution of 'dangerous' dialplan
|
||||
; functions from external sources (AMI,
|
||||
; etc.) These functions (such as SHELL) are
|
||||
; considered dangerous because they can allow
|
||||
; privilege escalation.
|
||||
; functions and configuration file access from
|
||||
; external sources (AMI, etc.) These functions
|
||||
; (such as SHELL) are considered dangerous
|
||||
; because they can allow privilege escalation.
|
||||
; Configuration files are considered dangerous
|
||||
; if they exist outside of the Asterisk
|
||||
; configuration directory.
|
||||
; Default no
|
||||
;entityid=00:11:22:33:44:55 ; Entity ID.
|
||||
; This is in the form of a MAC address.
|
||||
|
|
|
@ -32,6 +32,17 @@
|
|||
; is "no".
|
||||
;congestion = no
|
||||
|
||||
; Define whether or not to ignore bridging changes in CDRs. This prevents
|
||||
; bridging changes from resulting in multiple CDRs for different parts of
|
||||
; a call. Default is "no". This setting cannot be changed on a reload.
|
||||
;ignorestatechanges = no
|
||||
|
||||
; Define whether or not to ignore dial updates in CDRs. This prevents
|
||||
; dial updates from resulting in multiple CDRs for different parts of
|
||||
; a call. The last disposition on the channel will be used for the CDR.
|
||||
; Use with caution. Default is "no".
|
||||
;ignoredialchanges = no
|
||||
|
||||
; Normally, CDR's are not closed out until after all extensions are finished
|
||||
; executing. By enabling this option, the CDR will be ended before executing
|
||||
; the "h" extension and hangup handlers so that CDR values such as "end" and
|
||||
|
@ -102,8 +113,6 @@
|
|||
; Here are all the possible back ends:
|
||||
;
|
||||
; csv, custom, manager, odbc, pgsql, radius, sqlite, tds
|
||||
; (also, mysql is available via the asterisk-addons, due to licensing
|
||||
; requirements)
|
||||
; (please note, also, that other backends can be created, by creating
|
||||
; a new backend module in the source cdr/ directory!)
|
||||
;
|
||||
|
|
|
@ -936,8 +936,13 @@ pickupgroup=1
|
|||
; target of the transfer.
|
||||
|
||||
;
|
||||
; Specify whether the channel should be answered immediately or if the simple
|
||||
; switch should provide dialtone, read digits, etc.
|
||||
; On FXS channels (FXO signaled), specifies whether the channel should enter the dialplan
|
||||
; immediately or if the simple switch should provide dialtone, read digits, etc.
|
||||
; On FXO channels (FXS signaled), specifies whether the call should enter the dialplan
|
||||
; immediately or if we should wait for at least one ring. This is required if
|
||||
; Caller ID or distinctive ringing is enabled. If you do not need either, you can
|
||||
; skip waiting for the first ring to begin call processing sooner.
|
||||
;
|
||||
; Note: If immediate=yes the dialplan execution will always start at extension
|
||||
; 's' priority 1 regardless of the dialed number!
|
||||
;
|
||||
|
|
|
@ -58,8 +58,11 @@ type=user
|
|||
; when a channel enters a empty conference. On by default.
|
||||
;wait_marked=yes ; Sets if the user must wait for a marked user to enter before
|
||||
; joining the conference. Off by default.
|
||||
;end_marked=yes ; This option will kick every user with this option set in their
|
||||
; user profile after the last Marked user exists the conference.
|
||||
;end_marked=yes ; This option will kick every non-marked user with this option set in their
|
||||
; user profile after the last marked user exits the conference.
|
||||
;end_marked_any=no ; This option will kick every user with this option set in
|
||||
; their user profile after any marked user exits the conference.
|
||||
; Additionally, note that unlike end_marked, this includes marked users.
|
||||
|
||||
;dsp_drop_silence=yes ; This option drops what Asterisk detects as silence from
|
||||
; entering into the bridge. Enabling this option will drastically
|
||||
|
|
|
@ -6,7 +6,11 @@
|
|||
|
||||
[general]
|
||||
;transferdigittimeout => 3 ; Number of seconds to wait between digits when transferring a call
|
||||
; (default is 3 seconds)
|
||||
; (default is 3 seconds). If the TRANSFER_EXTEN dialplan variable has been set
|
||||
; on the channel of the user that is invoking the transfer feature, then
|
||||
; this option is not used as the user is transferred directly to the extension
|
||||
; specified by TRANSFER_EXTEN (the transfer context remains the context specified
|
||||
; by TRANSFER_CONTEXT, if set, and otherwise the default context).
|
||||
;xfersound = beep ; to indicate an attended transfer is complete
|
||||
;xferfailsound = beeperr ; to indicate a failed transfer
|
||||
;pickupexten = *8 ; Configure the pickup extension. (default is *8)
|
||||
|
@ -26,12 +30,13 @@
|
|||
; By default, this is 2.
|
||||
;transferdialattempts = 3 ; Number of times that a transferer may attempt to dial an extension before
|
||||
; being kicked back to the original call.
|
||||
;transferannouncesound = beep ; Sound to play to a transferer to indicate transfer process has begun. If empty, no sound will be played.
|
||||
;transferretrysound = beep ; Sound to play when a transferer fails to dial a valid extension.
|
||||
;transferinvalidsound = beeperr ; Sound to play when a transferer fails to dial a valid extension and is out of retries.
|
||||
;atxferabort = *1 ; cancel the attended transfer
|
||||
;atxfercomplete = *2 ; complete the attended transfer, dropping out of the call
|
||||
;atxferthreeway = *3 ; complete the attended transfer, but stay in the call. This will turn the call into a multi-party bridge
|
||||
;atxferswap = *4 ; swap to the other party. Once an attended transfer has begun, this options may be used multiple times
|
||||
;atxferswap = *4 ; swap to the other party. Once an attended transfer has begun, this option may be used multiple times
|
||||
|
||||
; Note that the DTMF features listed below only work when two channels have answered and are bridged together.
|
||||
; They can not be used while the remote party is ringing or in progress. If you require this feature you can use
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
;--
|
||||
Geolocation Profile Sample Configuration
|
||||
|
||||
Please see https://wiki.asterisk.org/wiki/display/AST/Geolocation
|
||||
for the most current information.
|
||||
--;
|
||||
|
||||
;--
|
||||
|
@ -134,14 +136,24 @@ allowed. See RFC8787.
|
|||
Example:
|
||||
location_source = sip1.myserver.net
|
||||
|
||||
-- confidence (optional) -----------------------------------------
|
||||
The confidence in the location specified.
|
||||
confidence = pdf=[ unknown | normal | rectangular ], value=<percent_confident>
|
||||
|
||||
Please see RFC7459 for the exact description of this parameter.
|
||||
|
||||
Example:
|
||||
confidence = pdf=normal, value=75
|
||||
|
||||
|
||||
-- Location Example ---------------------------------------------------
|
||||
|
||||
[mylocation]
|
||||
type = location
|
||||
format = civicAddress
|
||||
location_info = country=US
|
||||
location_info = A1="New York", A3="New York", A4=Manhattan
|
||||
location_info = HNO=1633, PRD=W, RD=46th, STS=Street
|
||||
location_info = A1="New York", A3="New York", A4=Manhattan
|
||||
location_info = HNO=1633, PRD=W, RD=46th, STS=Street
|
||||
location_info = PC=10222
|
||||
method = Manual
|
||||
location_source = sip1.myserver.net
|
||||
|
@ -160,9 +172,10 @@ location_source = sip1.myserver.net
|
|||
Defines the object type.
|
||||
type = profile
|
||||
|
||||
-- profile_action (optional) ------------------------------------------
|
||||
-- profile_precedence (optional) --------------------------------------
|
||||
Sets how to reconcile incoming and configured profiles.
|
||||
profile_action = < prefer_incoming | prefer_config | discard_incoming
|
||||
|
||||
profile_precedence = < prefer_incoming | prefer_config | discard_incoming
|
||||
| discard_config >
|
||||
|
||||
On an incoming call leg, "incoming" is the location description
|
||||
|
@ -188,11 +201,13 @@ discard_config: Discard any configured location description. If
|
|||
discard_incoming is the default.
|
||||
|
||||
Example:
|
||||
profile_action = prefer_config
|
||||
profile_precedence = prefer_config
|
||||
|
||||
-- pidf_element (optional) --------------------------------------------
|
||||
PIDF-LO element in which to place the location description.
|
||||
|
||||
pidf_element = < tuple | device | person >
|
||||
Default: device
|
||||
|
||||
If the format is civicAddress or GML, this sets the PIDF element into
|
||||
which the location information will be placed.
|
||||
|
@ -207,10 +222,12 @@ Per [RFC5491], "device" is preferred and therefore the default.
|
|||
Example:
|
||||
pidf_element = tuple
|
||||
|
||||
-- geolocation_routing (optional) -------------------------------------
|
||||
-- allow_routing_use (optional) ---------------------------------------
|
||||
Sets whether the "Geolocation-Routing" header is added to outgoing
|
||||
requests.
|
||||
geolocation_routing = < yes | no >
|
||||
|
||||
allow_routing_use = < yes | no >
|
||||
Default: no
|
||||
|
||||
Set to "yes" to indicate that servers later in the path
|
||||
can use the location information for routing purposes. Set to "no"
|
||||
|
@ -218,7 +235,7 @@ if they should not. If this value isn't specified, no
|
|||
"Geolocation-Routing" header will be added.
|
||||
|
||||
Example:
|
||||
geolocation_routing = yes
|
||||
allow_routing_use = yes
|
||||
|
||||
-- location_reference (optional) --------------------------------------
|
||||
The name of an existing Location object.
|
||||
|
@ -243,7 +260,7 @@ floor and room just for this profile
|
|||
Example:
|
||||
location_info_refinement = floor=20, room=20a2
|
||||
|
||||
-- location_variables -------------------------------------------------
|
||||
-- location_variables (optional) --------------------------------------
|
||||
|
||||
If the referenced Location object uses any replacement variables, they
|
||||
can be assigned here. There is no need to define variables that come
|
||||
|
@ -251,6 +268,33 @@ from the channel using this profile. They get assigned automatically.
|
|||
|
||||
location_variables = myfloor=20, myroom=222
|
||||
|
||||
-- suppress_empty_ca_elements (optional) ------------------------------
|
||||
Sets whether empty values for Civic Address elements should be
|
||||
suppressed from the outgoing PIDF-LO document.
|
||||
|
||||
suppress_empty_ca_elements = < yes | no >
|
||||
Default: no
|
||||
|
||||
Setting to "yes" allows you to define a location info template
|
||||
with channel variables that may or may not exist.
|
||||
|
||||
For example, with:
|
||||
location_info_refinement = FLR=${MyFlr}
|
||||
suppress_empty_ca_elements = no ; the default
|
||||
|
||||
If the MyFlr channel variable weren't set, the outgoing PIDF-LO document
|
||||
would have an empty <FLR/> element in it. If suppress_empty_ca_elements
|
||||
were set to "yes", the FLR element would be dropped from the PIDF-LO
|
||||
document altogether.
|
||||
|
||||
-- format, location_info, location_source, method, confidence ---------
|
||||
You can specify the location object's format, location_info,
|
||||
method, location_source and confidence parameters directly on
|
||||
a profile object for simple scenarios where the location
|
||||
information isn't common with any other profiles. This is
|
||||
mutually exclusive with setting location_reference on the
|
||||
profile.
|
||||
|
||||
-- Profile Example ----------------------------------------------------
|
||||
|
||||
[myprofile]
|
||||
|
@ -262,3 +306,13 @@ profile_action = discard_incoming
|
|||
|
||||
=======================================================================
|
||||
--;
|
||||
|
||||
-- NOTE ---------------------------------------------------------------
|
||||
There are 4 built-in profiles that can be assigned to endpoints:
|
||||
"<prefer_config>"
|
||||
"<discard_config>"
|
||||
"<prefer_incoming>"
|
||||
"<discard_incoming>"
|
||||
The profiles are empty except for having their precedence
|
||||
set.
|
||||
|
||||
|
|
|
@ -22,6 +22,9 @@ capture_password = foo ; If specified, the authorization password
|
|||
capture_id = 1234 ; A unique integer identifier for this
|
||||
; server. This ID will be embedded sent
|
||||
; with each packet from this server.
|
||||
;capture_name = asterisk ; A unique string identifier for this
|
||||
; server. This ID will be embedded sent
|
||||
; with each packet from this server.
|
||||
uuid_type = call-id ; Specify the preferred source for the Homer
|
||||
; correlation UUID. Valid options are:
|
||||
; - 'call-id' for the PJSIP or chan_sip SIP
|
||||
|
|
|
@ -82,6 +82,9 @@ directory=moh
|
|||
; ; in alphabetical order. If 'randstart', the files are sorted
|
||||
; ; in alphabetical order as well, but the first file is chosen
|
||||
; ; at random. If unspecified, the sort order is undefined.
|
||||
;answeredonly=yes ; Only allow answered channels to have music on hold.
|
||||
; Enabling this will prevent MOH on unanswered channels.
|
||||
; (default: "no")
|
||||
|
||||
;[native-alphabetical]
|
||||
;mode=files
|
||||
|
|
|
@ -964,6 +964,11 @@
|
|||
; by the channel driver from the dialplan before they're forwarded
|
||||
; the remote endpoint.
|
||||
;
|
||||
; send_aoc =
|
||||
; This options turns on and off support for sending AOC to endpoints.
|
||||
; AOC updates can be sent using the AOCMessage AMI action or come
|
||||
; from PRI channels.
|
||||
; (default: no)
|
||||
|
||||
|
||||
;==========================AUTH SECTION OPTIONS=========================
|
||||
|
@ -1054,11 +1059,16 @@
|
|||
; and/or "asterisk_ecc.pem" are loaded (certificate, inter-
|
||||
; mediates, private key), to support multiple algorithms for
|
||||
; server authentication (RSA, DSA, ECDSA). If the chains are
|
||||
; different, at least OpenSSL 1.0.2 is required.
|
||||
; different, at least OpenSSL 1.0.2 is required. This option
|
||||
; can be reloaded resulting in an updated certificate if the
|
||||
; filename remains unchanged.
|
||||
; (default: "")
|
||||
;cipher= ; Preferred cryptography cipher names TLS ONLY (default: "")
|
||||
;method= ; Method of SSL transport TLS ONLY (default: "")
|
||||
;priv_key_file= ; Private key file TLS ONLY (default: "")
|
||||
;priv_key_file= ; Private key file TLS ONLY. This option can be reloaded
|
||||
; resulting in an updated private key if the filename remains
|
||||
; unchanged.
|
||||
; (default: "")
|
||||
;verify_client= ; Require verification of client certificate TLS ONLY (default:
|
||||
; "")
|
||||
;verify_server= ; Require verification of server certificate TLS ONLY (default:
|
||||
|
@ -1331,6 +1341,13 @@
|
|||
; creating an implicit subscription (see RFC 4488).
|
||||
; (default: "yes")
|
||||
|
||||
;all_codecs_on_empty_reinvite=yes
|
||||
; On reception of a re-INVITE without SDP Asterisk will send an SDP
|
||||
; offer in the 200 OK response containing all configured codecs on the
|
||||
; endpoint, instead of simply those that have already been negotiated.
|
||||
; RFC 3261 specifies this as a SHOULD requirement.
|
||||
; (default: "no")
|
||||
|
||||
;allow_sending_180_after_183=yes ; Allow Asterisk to send 180 Ringing to an endpoint
|
||||
; after 183 Session Progress has been send.
|
||||
; If disabled Asterisk will instead send only a
|
||||
|
@ -1582,3 +1599,16 @@
|
|||
|
||||
;mailbox_state_filter= ; Optional regular expression used to filter what
|
||||
; mailboxes we accept events for.
|
||||
|
||||
|
||||
;================================TEL URIs=====================================
|
||||
;
|
||||
; Asterisk has TEL URI support, but with limited scope. Support is only for
|
||||
; TEL URIs present in traffic from a remote party. Asterisk does not generate
|
||||
; any TEL URIs of its own.
|
||||
;
|
||||
; Currently, the allowed request types are INVITE, ACK, BYE, and CANCEL. Any
|
||||
; other request type that contains a TEL URI will behave as it did before.
|
||||
; TEL URIs are allowed in the request, From, and To headers.
|
||||
;
|
||||
; You can match a TEL URI From header by IP, header, or auth_username.
|
||||
|
|
|
@ -262,6 +262,8 @@ pagerdateformat=%A, %B %d, %Y at %r
|
|||
; option lets you customize the format sent to particular mailboxes.
|
||||
; Useful if Windows users want wav49, but Linux users want gsm.
|
||||
; [per-mailbox only]
|
||||
; attachextrecs=no ; Whether to attach recordings that are externally added to mailboxes,
|
||||
; such as through MixMonitor. Default is no.
|
||||
; saycid=yes ; Say the caller id information before the message. If not described,
|
||||
; or set to no, it will be in the envelope. When enabled, if a recorded file
|
||||
; with the same name as the caller id exists in
|
||||
|
|
|
@ -711,6 +711,7 @@ AST_RPATH
|
|||
AST_NATIVE_ARCH
|
||||
AST_SHADOW_WARNINGS
|
||||
AST_NO_STRINGOP_TRUNCATION
|
||||
AST_NO_FORMAT_Y2K
|
||||
AST_NO_FORMAT_TRUNCATION
|
||||
AST_NO_STRICT_OVERFLOW
|
||||
AST_FORTIFY_SOURCE
|
||||
|
@ -940,6 +941,10 @@ PBX_POPT
|
|||
POPT_DIR
|
||||
POPT_INCLUDE
|
||||
POPT_LIB
|
||||
PBX_PJSIP_TLS_TRANSPORT_RESTART
|
||||
PJSIP_TLS_TRANSPORT_RESTART_DIR
|
||||
PJSIP_TLS_TRANSPORT_RESTART_INCLUDE
|
||||
PJSIP_TLS_TRANSPORT_RESTART_LIB
|
||||
PBX_PJSIP_OAUTH_AUTHENTICATION
|
||||
PJSIP_OAUTH_AUTHENTICATION_DIR
|
||||
PJSIP_OAUTH_AUTHENTICATION_INCLUDE
|
||||
|
@ -10213,8 +10218,8 @@ printf "%s\n" "$as_me: checking whether system openssl > 1.1.0" >&6;}
|
|||
if test "x${PBX_OPENSSL}" != "x1" -a "${USE_OPENSSL}" != "no"; then
|
||||
|
||||
pkg_failed=no
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for openssl >= 1.1.0" >&5
|
||||
printf %s "checking for openssl >= 1.1.0... " >&6; }
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OPENSSL" >&5
|
||||
printf %s "checking for OPENSSL... " >&6; }
|
||||
|
||||
if test -n "$OPENSSL_CFLAGS"; then
|
||||
pkg_cv_OPENSSL_CFLAGS="$OPENSSL_CFLAGS"
|
||||
|
@ -10254,7 +10259,7 @@ fi
|
|||
|
||||
|
||||
if test $pkg_failed = yes; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||
|
@ -10275,7 +10280,7 @@ fi
|
|||
|
||||
|
||||
elif test $pkg_failed = untried; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
PBX_OPENSSL=0
|
||||
|
@ -10304,8 +10309,8 @@ printf "%s\n" "$as_me: checking whether alternate openssl11 is installed" >&6;}
|
|||
if test "x${PBX_OPENSSL}" != "x1" -a "${USE_OPENSSL}" != "no"; then
|
||||
|
||||
pkg_failed=no
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for openssl11" >&5
|
||||
printf %s "checking for openssl11... " >&6; }
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OPENSSL" >&5
|
||||
printf %s "checking for OPENSSL... " >&6; }
|
||||
|
||||
if test -n "$OPENSSL_CFLAGS"; then
|
||||
pkg_cv_OPENSSL_CFLAGS="$OPENSSL_CFLAGS"
|
||||
|
@ -10345,7 +10350,7 @@ fi
|
|||
|
||||
|
||||
if test $pkg_failed = yes; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||
|
@ -10366,7 +10371,7 @@ fi
|
|||
|
||||
|
||||
elif test $pkg_failed = untried; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
PBX_OPENSSL=0
|
||||
|
@ -10400,8 +10405,8 @@ printf "%s\n" "$as_me: checking fallback system openssl" >&6;}
|
|||
if test "x${PBX_OPENSSL}" != "x1" -a "${USE_OPENSSL}" != "no"; then
|
||||
|
||||
pkg_failed=no
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for openssl" >&5
|
||||
printf %s "checking for openssl... " >&6; }
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OPENSSL" >&5
|
||||
printf %s "checking for OPENSSL... " >&6; }
|
||||
|
||||
if test -n "$OPENSSL_CFLAGS"; then
|
||||
pkg_cv_OPENSSL_CFLAGS="$OPENSSL_CFLAGS"
|
||||
|
@ -10441,7 +10446,7 @@ fi
|
|||
|
||||
|
||||
if test $pkg_failed = yes; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||
|
@ -10462,7 +10467,7 @@ fi
|
|||
|
||||
|
||||
elif test $pkg_failed = untried; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
PBX_OPENSSL=0
|
||||
|
@ -11087,6 +11092,9 @@ printf "%s\n" "#define HAVE_PJSIP_OAUTH_AUTHENTICATION 1" >>confdefs.h
|
|||
printf "%s\n" "#define HAVE_PJPROJECT_ON_VALID_ICE_PAIR_CALLBACK 1" >>confdefs.h
|
||||
|
||||
|
||||
printf "%s\n" "#define HAVE_PJSIP_TLS_TRANSPORT_RESTART 1" >>confdefs.h
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -13162,6 +13170,18 @@ PBX_PJSIP_OAUTH_AUTHENTICATION=0
|
|||
|
||||
|
||||
|
||||
|
||||
PJSIP_TLS_TRANSPORT_RESTART_DESCRIP="PJSIP TLS Transport Restart Support"
|
||||
PJSIP_TLS_TRANSPORT_RESTART_OPTION=pjsip
|
||||
PJSIP_TLS_TRANSPORT_RESTART_DIR=${PJPROJECT_DIR}
|
||||
|
||||
PBX_PJSIP_TLS_TRANSPORT_RESTART=0
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
fi
|
||||
|
||||
|
||||
|
@ -14835,8 +14855,8 @@ fi
|
|||
if test "x${PBX_LIBEDIT}" != "x1" -a "${USE_LIBEDIT}" != "no"; then
|
||||
|
||||
pkg_failed=no
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libedit" >&5
|
||||
printf %s "checking for libedit... " >&6; }
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for LIBEDIT" >&5
|
||||
printf %s "checking for LIBEDIT... " >&6; }
|
||||
|
||||
if test -n "$LIBEDIT_CFLAGS"; then
|
||||
pkg_cv_LIBEDIT_CFLAGS="$LIBEDIT_CFLAGS"
|
||||
|
@ -14876,7 +14896,7 @@ fi
|
|||
|
||||
|
||||
if test $pkg_failed = yes; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||
|
@ -14897,7 +14917,7 @@ fi
|
|||
|
||||
|
||||
elif test $pkg_failed = untried; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
PBX_LIBEDIT=0
|
||||
|
@ -15296,8 +15316,8 @@ if test "$JANSSON_BUNDLED" = "no" ; then
|
|||
if test "x${PBX_JANSSON}" != "x1" -a "${USE_JANSSON}" != "no"; then
|
||||
|
||||
pkg_failed=no
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for jansson >= 2.11" >&5
|
||||
printf %s "checking for jansson >= 2.11... " >&6; }
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for JANSSON" >&5
|
||||
printf %s "checking for JANSSON... " >&6; }
|
||||
|
||||
if test -n "$JANSSON_CFLAGS"; then
|
||||
pkg_cv_JANSSON_CFLAGS="$JANSSON_CFLAGS"
|
||||
|
@ -15337,7 +15357,7 @@ fi
|
|||
|
||||
|
||||
if test $pkg_failed = yes; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||
|
@ -15358,7 +15378,7 @@ fi
|
|||
|
||||
|
||||
elif test $pkg_failed = untried; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
PBX_JANSSON=0
|
||||
|
@ -15614,8 +15634,8 @@ fi
|
|||
if test "x${PBX_LIBXML2}" != "x1" -a "${USE_LIBXML2}" != "no"; then
|
||||
|
||||
pkg_failed=no
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libxml-2.0" >&5
|
||||
printf %s "checking for libxml-2.0... " >&6; }
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for LIBXML2" >&5
|
||||
printf %s "checking for LIBXML2... " >&6; }
|
||||
|
||||
if test -n "$LIBXML2_CFLAGS"; then
|
||||
pkg_cv_LIBXML2_CFLAGS="$LIBXML2_CFLAGS"
|
||||
|
@ -15655,7 +15675,7 @@ fi
|
|||
|
||||
|
||||
if test $pkg_failed = yes; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||
|
@ -15676,7 +15696,7 @@ fi
|
|||
|
||||
|
||||
elif test $pkg_failed = untried; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
PBX_LIBXML2=0
|
||||
|
@ -20930,6 +20950,19 @@ printf "%s\n" "no" >&6; }
|
|||
fi
|
||||
|
||||
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -Wno-format-y2k" >&5
|
||||
printf %s "checking for -Wno-format-y2k... " >&6; }
|
||||
if $(${CC} -Wno-format-y2k -Werror -S -o /dev/null -xc /dev/null > /dev/null 2>&1); then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||
printf "%s\n" "yes" >&6; }
|
||||
AST_NO_FORMAT_Y2K=-Wno-format-y2k
|
||||
else
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
AST_NO_FORMAT_Y2K=
|
||||
fi
|
||||
|
||||
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -Wno-stringop-truncation" >&5
|
||||
printf %s "checking for -Wno-stringop-truncation... " >&6; }
|
||||
if $(${CC} -Wno-stringop-truncation -Werror -S -o /dev/null -xc /dev/null > /dev/null 2>&1); then
|
||||
|
@ -22889,8 +22922,8 @@ if test "${USE_ILBC}" != "no"; then
|
|||
if test "x${PBX_ILBC}" != "x1" -a "${USE_ILBC}" != "no"; then
|
||||
|
||||
pkg_failed=no
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libilbc" >&5
|
||||
printf %s "checking for libilbc... " >&6; }
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ILBC" >&5
|
||||
printf %s "checking for ILBC... " >&6; }
|
||||
|
||||
if test -n "$ILBC_CFLAGS"; then
|
||||
pkg_cv_ILBC_CFLAGS="$ILBC_CFLAGS"
|
||||
|
@ -22930,7 +22963,7 @@ fi
|
|||
|
||||
|
||||
if test $pkg_failed = yes; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||
|
@ -22951,7 +22984,7 @@ fi
|
|||
|
||||
|
||||
elif test $pkg_failed = untried; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
PBX_ILBC=0
|
||||
|
@ -25148,8 +25181,8 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \
|
|||
if test "x${PBX_NETSNMP}" != "x1" -a "${USE_NETSNMP}" != "no"; then
|
||||
|
||||
pkg_failed=no
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for netsnmp-agent" >&5
|
||||
printf %s "checking for netsnmp-agent... " >&6; }
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for NETSNMP" >&5
|
||||
printf %s "checking for NETSNMP... " >&6; }
|
||||
|
||||
if test -n "$NETSNMP_CFLAGS"; then
|
||||
pkg_cv_NETSNMP_CFLAGS="$NETSNMP_CFLAGS"
|
||||
|
@ -25189,7 +25222,7 @@ fi
|
|||
|
||||
|
||||
if test $pkg_failed = yes; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||
|
@ -25210,7 +25243,7 @@ fi
|
|||
|
||||
|
||||
elif test $pkg_failed = untried; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
PBX_NETSNMP=0
|
||||
|
@ -26575,8 +26608,8 @@ if test "$USE_PJPROJECT" != "no" ; then
|
|||
if test "x${PBX_PJPROJECT}" != "x1" -a "${USE_PJPROJECT}" != "no"; then
|
||||
|
||||
pkg_failed=no
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libpjproject" >&5
|
||||
printf %s "checking for libpjproject... " >&6; }
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PJPROJECT" >&5
|
||||
printf %s "checking for PJPROJECT... " >&6; }
|
||||
|
||||
if test -n "$PJPROJECT_CFLAGS"; then
|
||||
pkg_cv_PJPROJECT_CFLAGS="$PJPROJECT_CFLAGS"
|
||||
|
@ -26616,7 +26649,7 @@ fi
|
|||
|
||||
|
||||
if test $pkg_failed = yes; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||
|
@ -26637,7 +26670,7 @@ fi
|
|||
|
||||
|
||||
elif test $pkg_failed = untried; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
PBX_PJPROJECT=0
|
||||
|
@ -27824,6 +27857,102 @@ _ACEOF
|
|||
fi
|
||||
|
||||
|
||||
|
||||
if test "x${PBX_PJSIP_TLS_TRANSPORT_RESTART}" != "x1" -a "${USE_PJSIP_TLS_TRANSPORT_RESTART}" != "no"; then
|
||||
pbxlibdir=""
|
||||
# if --with-PJSIP_TLS_TRANSPORT_RESTART=DIR has been specified, use it.
|
||||
if test "x${PJSIP_TLS_TRANSPORT_RESTART_DIR}" != "x"; then
|
||||
if test -d ${PJSIP_TLS_TRANSPORT_RESTART_DIR}/lib; then
|
||||
pbxlibdir="-L${PJSIP_TLS_TRANSPORT_RESTART_DIR}/lib"
|
||||
else
|
||||
pbxlibdir="-L${PJSIP_TLS_TRANSPORT_RESTART_DIR}"
|
||||
fi
|
||||
fi
|
||||
|
||||
ast_ext_lib_check_save_CFLAGS="${CFLAGS}"
|
||||
CFLAGS="${CFLAGS} $PJPROJECT_CFLAGS"
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pjsip_tls_transport_restart in -lpjsip" >&5
|
||||
printf %s "checking for pjsip_tls_transport_restart in -lpjsip... " >&6; }
|
||||
if test ${ac_cv_lib_pjsip_pjsip_tls_transport_restart+y}
|
||||
then :
|
||||
printf %s "(cached) " >&6
|
||||
else $as_nop
|
||||
ac_check_lib_save_LIBS=$LIBS
|
||||
LIBS="-lpjsip ${pbxlibdir} $PJPROJECT_LIB $LIBS"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
|
||||
/* Override any GCC internal prototype to avoid an error.
|
||||
Use char because int might match the return type of a GCC
|
||||
builtin and then its argument prototype would still apply. */
|
||||
char pjsip_tls_transport_restart ();
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
return pjsip_tls_transport_restart ();
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_c_try_link "$LINENO"
|
||||
then :
|
||||
ac_cv_lib_pjsip_pjsip_tls_transport_restart=yes
|
||||
else $as_nop
|
||||
ac_cv_lib_pjsip_pjsip_tls_transport_restart=no
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext conftest.beam \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
LIBS=$ac_check_lib_save_LIBS
|
||||
fi
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pjsip_pjsip_tls_transport_restart" >&5
|
||||
printf "%s\n" "$ac_cv_lib_pjsip_pjsip_tls_transport_restart" >&6; }
|
||||
if test "x$ac_cv_lib_pjsip_pjsip_tls_transport_restart" = xyes
|
||||
then :
|
||||
AST_PJSIP_TLS_TRANSPORT_RESTART_FOUND=yes
|
||||
else $as_nop
|
||||
AST_PJSIP_TLS_TRANSPORT_RESTART_FOUND=no
|
||||
fi
|
||||
|
||||
CFLAGS="${ast_ext_lib_check_save_CFLAGS}"
|
||||
|
||||
|
||||
# now check for the header.
|
||||
if test "${AST_PJSIP_TLS_TRANSPORT_RESTART_FOUND}" = "yes"; then
|
||||
PJSIP_TLS_TRANSPORT_RESTART_LIB="${pbxlibdir} -lpjsip $PJPROJECT_LIB"
|
||||
# if --with-PJSIP_TLS_TRANSPORT_RESTART=DIR has been specified, use it.
|
||||
if test "x${PJSIP_TLS_TRANSPORT_RESTART_DIR}" != "x"; then
|
||||
PJSIP_TLS_TRANSPORT_RESTART_INCLUDE="-I${PJSIP_TLS_TRANSPORT_RESTART_DIR}/include"
|
||||
fi
|
||||
PJSIP_TLS_TRANSPORT_RESTART_INCLUDE="${PJSIP_TLS_TRANSPORT_RESTART_INCLUDE} $PJPROJECT_CFLAGS"
|
||||
|
||||
# check for the header
|
||||
ast_ext_lib_check_saved_CPPFLAGS="${CPPFLAGS}"
|
||||
CPPFLAGS="${CPPFLAGS} ${PJSIP_TLS_TRANSPORT_RESTART_INCLUDE}"
|
||||
ac_fn_c_check_header_compile "$LINENO" "pjsip.h" "ac_cv_header_pjsip_h" "$ac_includes_default"
|
||||
if test "x$ac_cv_header_pjsip_h" = xyes
|
||||
then :
|
||||
PJSIP_TLS_TRANSPORT_RESTART_HEADER_FOUND=1
|
||||
else $as_nop
|
||||
PJSIP_TLS_TRANSPORT_RESTART_HEADER_FOUND=0
|
||||
fi
|
||||
|
||||
CPPFLAGS="${ast_ext_lib_check_saved_CPPFLAGS}"
|
||||
|
||||
if test "x${PJSIP_TLS_TRANSPORT_RESTART_HEADER_FOUND}" = "x0" ; then
|
||||
PJSIP_TLS_TRANSPORT_RESTART_LIB=""
|
||||
PJSIP_TLS_TRANSPORT_RESTART_INCLUDE=""
|
||||
else
|
||||
|
||||
PBX_PJSIP_TLS_TRANSPORT_RESTART=1
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define HAVE_PJSIP_TLS_TRANSPORT_RESTART 1
|
||||
_ACEOF
|
||||
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
fi
|
||||
fi
|
||||
|
||||
|
@ -27835,8 +27964,8 @@ fi
|
|||
if test "x${PBX_PYTHONDEV}" != "x1" -a "${USE_PYTHONDEV}" != "no"; then
|
||||
|
||||
pkg_failed=no
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for python-2.7" >&5
|
||||
printf %s "checking for python-2.7... " >&6; }
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PYTHONDEV" >&5
|
||||
printf %s "checking for PYTHONDEV... " >&6; }
|
||||
|
||||
if test -n "$PYTHONDEV_CFLAGS"; then
|
||||
pkg_cv_PYTHONDEV_CFLAGS="$PYTHONDEV_CFLAGS"
|
||||
|
@ -27876,7 +28005,7 @@ fi
|
|||
|
||||
|
||||
if test $pkg_failed = yes; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||
|
@ -27897,7 +28026,7 @@ fi
|
|||
|
||||
|
||||
elif test $pkg_failed = untried; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
PBX_PYTHONDEV=0
|
||||
|
@ -27923,8 +28052,8 @@ fi
|
|||
if test "x${PBX_PYTHONDEV}" != "x1" -a "${USE_PYTHONDEV}" != "no"; then
|
||||
|
||||
pkg_failed=no
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for python2" >&5
|
||||
printf %s "checking for python2... " >&6; }
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PYTHONDEV" >&5
|
||||
printf %s "checking for PYTHONDEV... " >&6; }
|
||||
|
||||
if test -n "$PYTHONDEV_CFLAGS"; then
|
||||
pkg_cv_PYTHONDEV_CFLAGS="$PYTHONDEV_CFLAGS"
|
||||
|
@ -27964,7 +28093,7 @@ fi
|
|||
|
||||
|
||||
if test $pkg_failed = yes; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||
|
@ -27985,7 +28114,7 @@ fi
|
|||
|
||||
|
||||
elif test $pkg_failed = untried; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
PBX_PYTHONDEV=0
|
||||
|
@ -28011,8 +28140,8 @@ fi
|
|||
if test "x${PBX_PYTHONDEV}" != "x1" -a "${USE_PYTHONDEV}" != "no"; then
|
||||
|
||||
pkg_failed=no
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for python" >&5
|
||||
printf %s "checking for python... " >&6; }
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PYTHONDEV" >&5
|
||||
printf %s "checking for PYTHONDEV... " >&6; }
|
||||
|
||||
if test -n "$PYTHONDEV_CFLAGS"; then
|
||||
pkg_cv_PYTHONDEV_CFLAGS="$PYTHONDEV_CFLAGS"
|
||||
|
@ -28052,7 +28181,7 @@ fi
|
|||
|
||||
|
||||
if test $pkg_failed = yes; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||
|
@ -28073,7 +28202,7 @@ fi
|
|||
|
||||
|
||||
elif test $pkg_failed = untried; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
PBX_PYTHONDEV=0
|
||||
|
@ -28207,8 +28336,8 @@ fi
|
|||
if test "x${PBX_PORTAUDIO}" != "x1" -a "${USE_PORTAUDIO}" != "no"; then
|
||||
|
||||
pkg_failed=no
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for portaudio-2.0" >&5
|
||||
printf %s "checking for portaudio-2.0... " >&6; }
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PORTAUDIO" >&5
|
||||
printf %s "checking for PORTAUDIO... " >&6; }
|
||||
|
||||
if test -n "$PORTAUDIO_CFLAGS"; then
|
||||
pkg_cv_PORTAUDIO_CFLAGS="$PORTAUDIO_CFLAGS"
|
||||
|
@ -28248,7 +28377,7 @@ fi
|
|||
|
||||
|
||||
if test $pkg_failed = yes; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||
|
@ -28269,7 +28398,7 @@ fi
|
|||
|
||||
|
||||
elif test $pkg_failed = untried; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
PBX_PORTAUDIO=0
|
||||
|
@ -34125,8 +34254,8 @@ for ver in 3.0 2.6 2.4 2.2 2.0; do
|
|||
if test "x${PBX_GMIME}" != "x1" -a "${USE_GMIME}" != "no"; then
|
||||
|
||||
pkg_failed=no
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gmime-$ver" >&5
|
||||
printf %s "checking for gmime-$ver... " >&6; }
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GMIME" >&5
|
||||
printf %s "checking for GMIME... " >&6; }
|
||||
|
||||
if test -n "$GMIME_CFLAGS"; then
|
||||
pkg_cv_GMIME_CFLAGS="$GMIME_CFLAGS"
|
||||
|
@ -34166,7 +34295,7 @@ fi
|
|||
|
||||
|
||||
if test $pkg_failed = yes; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||
|
@ -34187,7 +34316,7 @@ fi
|
|||
|
||||
|
||||
elif test $pkg_failed = untried; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
PBX_GMIME=0
|
||||
|
@ -35485,8 +35614,8 @@ fi
|
|||
if test "x${PBX_GTK2}" != "x1" -a "${USE_GTK2}" != "no"; then
|
||||
|
||||
pkg_failed=no
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gtk+-2.0" >&5
|
||||
printf %s "checking for gtk+-2.0... " >&6; }
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GTK2" >&5
|
||||
printf %s "checking for GTK2... " >&6; }
|
||||
|
||||
if test -n "$GTK2_CFLAGS"; then
|
||||
pkg_cv_GTK2_CFLAGS="$GTK2_CFLAGS"
|
||||
|
@ -35526,7 +35655,7 @@ fi
|
|||
|
||||
|
||||
if test $pkg_failed = yes; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||
|
@ -35547,7 +35676,7 @@ fi
|
|||
|
||||
|
||||
elif test $pkg_failed = untried; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
PBX_GTK2=0
|
||||
|
@ -35596,8 +35725,8 @@ fi
|
|||
if test "x${PBX_SYSTEMD}" != "x1" -a "${USE_SYSTEMD}" != "no"; then
|
||||
|
||||
pkg_failed=no
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libsystemd" >&5
|
||||
printf %s "checking for libsystemd... " >&6; }
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SYSTEMD" >&5
|
||||
printf %s "checking for SYSTEMD... " >&6; }
|
||||
|
||||
if test -n "$SYSTEMD_CFLAGS"; then
|
||||
pkg_cv_SYSTEMD_CFLAGS="$SYSTEMD_CFLAGS"
|
||||
|
@ -35637,7 +35766,7 @@ fi
|
|||
|
||||
|
||||
if test $pkg_failed = yes; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||
|
@ -35658,7 +35787,7 @@ fi
|
|||
|
||||
|
||||
elif test $pkg_failed = untried; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
|
||||
PBX_SYSTEMD=0
|
||||
|
|
12
configure.ac
12
configure.ac
|
@ -589,6 +589,7 @@ AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_INV_ACCEPT_MULTIPLE_SDP_ANSWERS], [PJSIP INVIT
|
|||
AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_ENDPOINT_COMPACT_FORM], [PJSIP Compact Form Support on Endpoint], [PJPROJECT], [pjsip])
|
||||
AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_TRANSPORT_DISABLE_CONNECTION_REUSE], [PJSIP Transport Connection Reuse Disabling], [PJPROJECT], [pjsip])
|
||||
AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_OAUTH_AUTHENTICATION], [PJSIP OAuth Authentication Support], [PJPROJECT], [pjsip])
|
||||
AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_TLS_TRANSPORT_RESTART], [PJSIP TLS Transport Restart Support], [PJPROJECT], [pjsip])
|
||||
fi
|
||||
|
||||
AST_EXT_LIB_SETUP([POPT], [popt], [popt])
|
||||
|
@ -1397,6 +1398,16 @@ else
|
|||
fi
|
||||
AC_SUBST(AST_NO_FORMAT_TRUNCATION)
|
||||
|
||||
AC_MSG_CHECKING(for -Wno-format-y2k)
|
||||
if $(${CC} -Wno-format-y2k -Werror -S -o /dev/null -xc /dev/null > /dev/null 2>&1); then
|
||||
AC_MSG_RESULT(yes)
|
||||
AST_NO_FORMAT_Y2K=-Wno-format-y2k
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
AST_NO_FORMAT_Y2K=
|
||||
fi
|
||||
AC_SUBST(AST_NO_FORMAT_Y2K)
|
||||
|
||||
AC_MSG_CHECKING(for -Wno-stringop-truncation)
|
||||
if $(${CC} -Wno-stringop-truncation -Werror -S -o /dev/null -xc /dev/null > /dev/null 2>&1); then
|
||||
AC_MSG_RESULT(yes)
|
||||
|
@ -2495,6 +2506,7 @@ if test "$USE_PJPROJECT" != "no" ; then
|
|||
AST_EXT_LIB_CHECK([PJSIP_INV_SESSION_REF], [pjsip], [pjsip_inv_add_ref], [pjsip.h], [$PJPROJECT_LIB], [$PJPROJECT_CFLAGS])
|
||||
AST_EXT_LIB_CHECK([PJSIP_AUTH_CLT_DEINIT], [pjsip], [pjsip_auth_clt_deinit], [pjsip.h], [$PJPROJECT_LIB], [$PJPROJECT_CFLAGS])
|
||||
AST_EXT_LIB_CHECK([PJSIP_TSX_LAYER_FIND_TSX2], [pjsip], [pjsip_tsx_layer_find_tsx2], [pjsip.h], [$PJPROJECT_LIB], [$PJPROJECT_CFLAGS])
|
||||
AST_EXT_LIB_CHECK([PJSIP_TLS_TRANSPORT_RESTART], [pjsip], [pjsip_tls_transport_restart], [pjsip.h], [$PJPROJECT_LIB], [$PJPROJECT_CFLAGS])
|
||||
fi
|
||||
fi
|
||||
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
"""add security_negotiation and security_mechanisms to endpoint
|
||||
|
||||
Revision ID: 417c0247fd7e
|
||||
Revises: 539f68bede2c
|
||||
Create Date: 2022-08-08 15:35:31.416964
|
||||
|
||||
"""
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = '417c0247fd7e'
|
||||
down_revision = '539f68bede2c'
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy.dialects.postgresql import ENUM
|
||||
|
||||
SECURITY_NEGOTIATION_NAME = 'security_negotiation_values'
|
||||
SECURITY_NEGOTIATION_VALUES = ['no', 'mediasec']
|
||||
|
||||
def upgrade():
|
||||
context = op.get_context()
|
||||
|
||||
if context.bind.dialect.name == 'postgresql':
|
||||
security_negotiation_values = ENUM(*SECURITY_NEGOTIATION_VALUES, name=SECURITY_NEGOTIATION_NAME)
|
||||
security_negotiation_values.create(op.get_bind(), checkfirst=False)
|
||||
|
||||
op.add_column('ps_endpoints', sa.Column('security_negotiation',
|
||||
ENUM(*SECURITY_NEGOTIATION_VALUES, name=SECURITY_NEGOTIATION_NAME, create_type=False)))
|
||||
op.add_column('ps_endpoints', sa.Column('security_mechanisms', sa.String(512)))
|
||||
|
||||
op.add_column('ps_registrations', sa.Column('security_negotiation',
|
||||
ENUM(*SECURITY_NEGOTIATION_VALUES, name=SECURITY_NEGOTIATION_NAME, create_type=False)))
|
||||
op.add_column('ps_registrations', sa.Column('security_mechanisms', sa.String(512)))
|
||||
|
||||
def downgrade():
|
||||
context = op.get_context()
|
||||
|
||||
if context.bind.dialect.name == 'mssql':
|
||||
op.drop_constraint('ck_ps_endpoints_security_negotiation_security_negotiation_values', 'ps_endpoints')
|
||||
op.drop_constraint('ck_ps_registrations_security_negotiation_security_negotiation_values', 'ps_registrations')
|
||||
|
||||
op.drop_column('ps_endpoints', 'security_negotiation')
|
||||
op.drop_column('ps_endpoints', 'security_mechanisms')
|
||||
op.drop_column('ps_registrations', 'security_negotiation')
|
||||
op.drop_column('ps_registrations', 'security_mechanisms')
|
||||
|
||||
if context.bind.dialect.name == 'postgresql':
|
||||
enum = ENUM(*SECURITY_NEGOTIATION_VALUES, name=SECURITY_NEGOTIATION_NAME)
|
||||
enum.drop(op.get_bind(), checkfirst=False)
|
|
@ -0,0 +1,57 @@
|
|||
"""Add peer_supported to 100rel
|
||||
|
||||
Revision ID: 539f68bede2c
|
||||
Revises: 9f3692b1654b
|
||||
Create Date: 2022-08-10 09:36:16.576049
|
||||
|
||||
"""
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = '539f68bede2c'
|
||||
down_revision = '9f3692b1654b'
|
||||
|
||||
from alembic import op
|
||||
from sqlalchemy.dialects.postgresql import ENUM
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
OLD_ENUM = ['no', 'required', 'yes']
|
||||
NEW_ENUM = ['no', 'required', 'peer_supported', 'yes']
|
||||
|
||||
old_type = sa.Enum(*OLD_ENUM, name='pjsip_100rel_values')
|
||||
new_type = sa.Enum(*NEW_ENUM, name='pjsip_100rel_values_v2')
|
||||
|
||||
def upgrade():
|
||||
context = op.get_context()
|
||||
|
||||
# Upgrading to this revision WILL clear your directmedia values.
|
||||
if context.bind.dialect.name != 'postgresql':
|
||||
op.alter_column('ps_endpoints', '100rel',
|
||||
type_=new_type,
|
||||
existing_type=old_type)
|
||||
else:
|
||||
enum = ENUM(*NEW_ENUM, name='pjsip_100rel_values_v2')
|
||||
enum.create(op.get_bind(), checkfirst=False)
|
||||
|
||||
op.execute('ALTER TABLE ps_endpoints ALTER COLUMN 100rel TYPE'
|
||||
' pjsip_100rel_values_v2 USING'
|
||||
' 100rel::text::pjsip_100rel_values_v2')
|
||||
|
||||
ENUM(name="pjsip_100rel_values").drop(op.get_bind(), checkfirst=False)
|
||||
|
||||
def downgrade():
|
||||
context = op.get_context()
|
||||
|
||||
if context.bind.dialect.name != 'postgresql':
|
||||
op.alter_column('ps_endpoints', '100rel',
|
||||
type_=old_type,
|
||||
existing_type=new_type)
|
||||
else:
|
||||
enum = ENUM(*OLD_ENUM, name='pjsip_100rel_values')
|
||||
enum.create(op.get_bind(), checkfirst=False)
|
||||
|
||||
op.execute('ALTER TABLE ps_endpoints ALTER COLUMN 100rel TYPE'
|
||||
' pjsip_100rel_values USING'
|
||||
' 100rel::text::pjsip_100rel_values')
|
||||
|
||||
ENUM(name="pjsip_100rel_values_v2").drop(op.get_bind(), checkfirst=False)
|
|
@ -0,0 +1,38 @@
|
|||
"""add aoc option
|
||||
|
||||
Revision ID: 5a2247c957d2
|
||||
Revises: ccf795ee535f
|
||||
Create Date: 2022-10-30 12:47:56.173511
|
||||
|
||||
"""
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = '5a2247c957d2'
|
||||
down_revision = 'ccf795ee535f'
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy.dialects.postgresql import ENUM
|
||||
|
||||
AST_BOOL_NAME = 'ast_bool_values'
|
||||
# We'll just ignore the n/y and f/t abbreviations as Asterisk does not write
|
||||
# those aliases.
|
||||
AST_BOOL_VALUES = [ '0', '1',
|
||||
'off', 'on',
|
||||
'false', 'true',
|
||||
'no', 'yes' ]
|
||||
|
||||
def upgrade():
|
||||
############################# Enums ##############################
|
||||
|
||||
# ast_bool_values has already been created, so use postgres enum object
|
||||
# type to get around "already created" issue - works okay with mysql
|
||||
ast_bool_values = ENUM(*AST_BOOL_VALUES, name=AST_BOOL_NAME, create_type=False)
|
||||
|
||||
op.add_column('ps_endpoints', sa.Column('send_aoc', ast_bool_values))
|
||||
|
||||
def downgrade():
|
||||
if op.get_context().bind.dialect.name == 'mssql':
|
||||
op.drop_constraint('ck_ps_endpoints_send_aoc_ast_bool_values', 'ps_endpoints')
|
||||
op.drop_column('ps_endpoints', 'send_aoc')
|
||||
pass
|
|
@ -0,0 +1,58 @@
|
|||
"""Add Stir Shaken Profile and Codec Preference to ps endpoint
|
||||
|
||||
Revision ID: 9f3692b1654b
|
||||
Revises: 7197536bb68d
|
||||
Create Date: 2022-08-17 11:20:56.433088
|
||||
|
||||
"""
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = '9f3692b1654b'
|
||||
down_revision = '7197536bb68d'
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy.dialects.postgresql import ENUM
|
||||
|
||||
PJSIP_INCOMING_CALL_OFFER_PREF_NAME ='pjsip_incoming_call_offer_pref_values'
|
||||
PJSIP_INCOMING_CALL_OFFER_PREF_VALUES = ['local', 'local_first',
|
||||
'remote', 'remote_first']
|
||||
|
||||
PJSIP_OUTGOING_CALL_OFFER_PREF_NAME = 'pjsip_outgoing_call_offer_pref_values'
|
||||
PJSIP_OUTGOING_CALL_OFFER_PREF_VALUES = ['local', 'local_merge', 'local_first',
|
||||
'remote', 'remote_merge', 'remote_first']
|
||||
|
||||
def upgrade():
|
||||
context = op.get_context()
|
||||
|
||||
if context.bind.dialect.name == 'postgresql':
|
||||
enum_in = ENUM(*PJSIP_INCOMING_CALL_OFFER_PREF_VALUES, name=PJSIP_INCOMING_CALL_OFFER_PREF_NAME)
|
||||
enum_out = ENUM(*PJSIP_OUTGOING_CALL_OFFER_PREF_VALUES, name=PJSIP_OUTGOING_CALL_OFFER_PREF_NAME)
|
||||
|
||||
enum_in.create(op.get_bind(), checkfirst=False)
|
||||
enum_out.create(op.get_bind(), checkfirst=False)
|
||||
|
||||
op.add_column('ps_endpoints', sa.Column('incoming_call_offer_pref',
|
||||
sa.Enum(*PJSIP_INCOMING_CALL_OFFER_PREF_VALUES, name=PJSIP_INCOMING_CALL_OFFER_PREF_NAME)))
|
||||
|
||||
op.add_column('ps_endpoints', sa.Column('outgoing_call_offer_pref',
|
||||
sa.Enum(*PJSIP_OUTGOING_CALL_OFFER_PREF_VALUES, name=PJSIP_OUTGOING_CALL_OFFER_PREF_NAME)))
|
||||
|
||||
op.add_column('ps_endpoints', sa.Column('stir_shaken_profile', sa.String(80)))
|
||||
|
||||
def downgrade():
|
||||
context = op.get_context()
|
||||
|
||||
if context.bind.dialect.name == 'mssql':
|
||||
op.drop_constraint('ck_ps_endpoints_incoming_call_offer_pref_pjsip_incoming_call_offer_pref_values', 'ps_endpoints')
|
||||
op.drop_constraint('ck_ps_endpoints_outgoing_call_offer_pref_pjsip_outgoing_call_offer_pref_values', 'ps_endpoints')
|
||||
|
||||
op.drop_column('ps_endpoints', 'outgoing_call_offer_pref')
|
||||
op.drop_column('ps_endpoints', 'incoming_call_offer_pref')
|
||||
op.drop_column('ps_endpoints', 'stir_shaken_profile')
|
||||
|
||||
enums = [PJSIP_INCOMING_CALL_OFFER_PREF_NAME, PJSIP_OUTGOING_CALL_OFFER_PREF_NAME]
|
||||
|
||||
if context.bind.dialect.name == 'postgresql':
|
||||
for e in enums:
|
||||
ENUM(name=e).drop(op.get_bind(), checkfirst=False)
|
|
@ -0,0 +1,37 @@
|
|||
"""all_codecs_on_empty_reinvite
|
||||
|
||||
Revision ID: ccf795ee535f
|
||||
Revises: 539f68bede2c
|
||||
Create Date: 2022-09-28 09:14:36.709781
|
||||
|
||||
"""
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = 'ccf795ee535f'
|
||||
down_revision = '417c0247fd7e'
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy.dialects.postgresql import ENUM
|
||||
|
||||
AST_BOOL_NAME = 'ast_bool_values'
|
||||
# We'll just ignore the n/y and f/t abbreviations as Asterisk does not write
|
||||
# those aliases.
|
||||
AST_BOOL_VALUES = [ '0', '1',
|
||||
'off', 'on',
|
||||
'false', 'true',
|
||||
'no', 'yes' ]
|
||||
|
||||
def upgrade():
|
||||
############################# Enums ##############################
|
||||
|
||||
# ast_bool_values has already been created, so use postgres enum object
|
||||
# type to get around "already created" issue - works okay with mysql
|
||||
ast_bool_values = ENUM(*AST_BOOL_VALUES, name=AST_BOOL_NAME, create_type=False)
|
||||
|
||||
op.add_column('ps_globals', sa.Column('all_codecs_on_empty_reinvite', ast_bool_values))
|
||||
|
||||
def downgrade():
|
||||
if op.get_context().bind.dialect.name == 'mssql':
|
||||
op.drop_constraint('ck_ps_globals_all_codecs_on_empty_reinvite_ast_bool_values', 'ps_globals')
|
||||
op.drop_column('ps_globals', 'all_codecs_on_empty_reinvite')
|
|
@ -0,0 +1,41 @@
|
|||
CREATE TABLE alembic_version (
|
||||
version_num VARCHAR(32) NOT NULL,
|
||||
CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num)
|
||||
);
|
||||
|
||||
-- Running upgrade -> 210693f3123d
|
||||
|
||||
CREATE TABLE cdr (
|
||||
accountcode VARCHAR(20),
|
||||
src VARCHAR(80),
|
||||
dst VARCHAR(80),
|
||||
dcontext VARCHAR(80),
|
||||
clid VARCHAR(80),
|
||||
channel VARCHAR(80),
|
||||
dstchannel VARCHAR(80),
|
||||
lastapp VARCHAR(80),
|
||||
lastdata VARCHAR(80),
|
||||
start DATETIME,
|
||||
answer DATETIME,
|
||||
end DATETIME,
|
||||
duration INTEGER,
|
||||
billsec INTEGER,
|
||||
disposition VARCHAR(45),
|
||||
amaflags VARCHAR(45),
|
||||
userfield VARCHAR(256),
|
||||
uniqueid VARCHAR(150),
|
||||
linkedid VARCHAR(150),
|
||||
peeraccount VARCHAR(20),
|
||||
sequence INTEGER
|
||||
);
|
||||
|
||||
INSERT INTO alembic_version (version_num) VALUES ('210693f3123d');
|
||||
|
||||
-- Running upgrade 210693f3123d -> 54cde9847798
|
||||
|
||||
ALTER TABLE cdr MODIFY accountcode VARCHAR(80) NULL;
|
||||
|
||||
ALTER TABLE cdr MODIFY peeraccount VARCHAR(80) NULL;
|
||||
|
||||
UPDATE alembic_version SET version_num='54cde9847798' WHERE alembic_version.version_num = '210693f3123d';
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,35 @@
|
|||
CREATE TABLE alembic_version (
|
||||
version_num VARCHAR(32) NOT NULL,
|
||||
CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num)
|
||||
);
|
||||
|
||||
-- Running upgrade -> a2e9769475e
|
||||
|
||||
CREATE TABLE voicemail_messages (
|
||||
dir VARCHAR(255) NOT NULL,
|
||||
msgnum INTEGER NOT NULL,
|
||||
context VARCHAR(80),
|
||||
macrocontext VARCHAR(80),
|
||||
callerid VARCHAR(80),
|
||||
origtime INTEGER,
|
||||
duration INTEGER,
|
||||
recording BLOB,
|
||||
flag VARCHAR(30),
|
||||
category VARCHAR(30),
|
||||
mailboxuser VARCHAR(30),
|
||||
mailboxcontext VARCHAR(30),
|
||||
msg_id VARCHAR(40)
|
||||
);
|
||||
|
||||
ALTER TABLE voicemail_messages ADD CONSTRAINT voicemail_messages_dir_msgnum PRIMARY KEY (dir, msgnum);
|
||||
|
||||
CREATE INDEX voicemail_messages_dir ON voicemail_messages (dir);
|
||||
|
||||
INSERT INTO alembic_version (version_num) VALUES ('a2e9769475e');
|
||||
|
||||
-- Running upgrade a2e9769475e -> 39428242f7f5
|
||||
|
||||
ALTER TABLE voicemail_messages MODIFY recording BLOB(4294967295) NULL;
|
||||
|
||||
UPDATE alembic_version SET version_num='39428242f7f5' WHERE alembic_version.version_num = 'a2e9769475e';
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
BEGIN;
|
||||
|
||||
CREATE TABLE alembic_version (
|
||||
version_num VARCHAR(32) NOT NULL,
|
||||
CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num)
|
||||
);
|
||||
|
||||
-- Running upgrade -> 210693f3123d
|
||||
|
||||
CREATE TABLE cdr (
|
||||
accountcode VARCHAR(20),
|
||||
src VARCHAR(80),
|
||||
dst VARCHAR(80),
|
||||
dcontext VARCHAR(80),
|
||||
clid VARCHAR(80),
|
||||
channel VARCHAR(80),
|
||||
dstchannel VARCHAR(80),
|
||||
lastapp VARCHAR(80),
|
||||
lastdata VARCHAR(80),
|
||||
start TIMESTAMP WITHOUT TIME ZONE,
|
||||
answer TIMESTAMP WITHOUT TIME ZONE,
|
||||
"end" TIMESTAMP WITHOUT TIME ZONE,
|
||||
duration INTEGER,
|
||||
billsec INTEGER,
|
||||
disposition VARCHAR(45),
|
||||
amaflags VARCHAR(45),
|
||||
userfield VARCHAR(256),
|
||||
uniqueid VARCHAR(150),
|
||||
linkedid VARCHAR(150),
|
||||
peeraccount VARCHAR(20),
|
||||
sequence INTEGER
|
||||
);
|
||||
|
||||
INSERT INTO alembic_version (version_num) VALUES ('210693f3123d');
|
||||
|
||||
-- Running upgrade 210693f3123d -> 54cde9847798
|
||||
|
||||
ALTER TABLE cdr ALTER COLUMN accountcode TYPE VARCHAR(80);
|
||||
|
||||
ALTER TABLE cdr ALTER COLUMN peeraccount TYPE VARCHAR(80);
|
||||
|
||||
UPDATE alembic_version SET version_num='54cde9847798' WHERE alembic_version.version_num = '210693f3123d';
|
||||
|
||||
COMMIT;
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,39 @@
|
|||
BEGIN;
|
||||
|
||||
CREATE TABLE alembic_version (
|
||||
version_num VARCHAR(32) NOT NULL,
|
||||
CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num)
|
||||
);
|
||||
|
||||
-- Running upgrade -> a2e9769475e
|
||||
|
||||
CREATE TABLE voicemail_messages (
|
||||
dir VARCHAR(255) NOT NULL,
|
||||
msgnum INTEGER NOT NULL,
|
||||
context VARCHAR(80),
|
||||
macrocontext VARCHAR(80),
|
||||
callerid VARCHAR(80),
|
||||
origtime INTEGER,
|
||||
duration INTEGER,
|
||||
recording BYTEA,
|
||||
flag VARCHAR(30),
|
||||
category VARCHAR(30),
|
||||
mailboxuser VARCHAR(30),
|
||||
mailboxcontext VARCHAR(30),
|
||||
msg_id VARCHAR(40)
|
||||
);
|
||||
|
||||
ALTER TABLE voicemail_messages ADD CONSTRAINT voicemail_messages_dir_msgnum PRIMARY KEY (dir, msgnum);
|
||||
|
||||
CREATE INDEX voicemail_messages_dir ON voicemail_messages (dir);
|
||||
|
||||
INSERT INTO alembic_version (version_num) VALUES ('a2e9769475e');
|
||||
|
||||
-- Running upgrade a2e9769475e -> 39428242f7f5
|
||||
|
||||
ALTER TABLE voicemail_messages ALTER COLUMN recording TYPE BYTEA;
|
||||
|
||||
UPDATE alembic_version SET version_num='39428242f7f5' WHERE alembic_version.version_num = 'a2e9769475e';
|
||||
|
||||
COMMIT;
|
||||
|
|
@ -69,10 +69,10 @@
|
|||
<!ATTLIST configInfo name CDATA #REQUIRED>
|
||||
<!ATTLIST configInfo language CDATA #REQUIRED>
|
||||
|
||||
<!ELEMENT configFile (configObject+)>
|
||||
<!ELEMENT configFile (configObject|xi:include)+>
|
||||
<!ATTLIST configFile name CDATA #REQUIRED>
|
||||
|
||||
<!ELEMENT configObject (synopsis?|description?|syntax?|see-also?|configOption)*>
|
||||
<!ELEMENT configObject (synopsis?|description?|syntax?|see-also?|(configOption|xi:include))*>
|
||||
<!ATTLIST configObject name CDATA #REQUIRED>
|
||||
|
||||
<!ELEMENT configOption (synopsis,description?,syntax?,see-also?)*>
|
||||
|
|
|
@ -0,0 +1,107 @@
|
|||
/*
|
||||
* Asterisk -- An open source telephony toolkit.
|
||||
*
|
||||
* Copyright (C) 2021-2022, Naveen Albert
|
||||
*
|
||||
* See http://www.asterisk.org for more information about
|
||||
* the Asterisk project. Please do not directly contact
|
||||
* any of the maintainers of this project for assistance;
|
||||
* the project provides a web site, mailing lists and IRC
|
||||
* channels for your use.
|
||||
*
|
||||
* This program is free software, distributed under the terms of
|
||||
* the GNU General Public License Version 2. See the LICENSE file
|
||||
* at the top of the source tree.
|
||||
*/
|
||||
|
||||
/*! \file
|
||||
*
|
||||
* \brief Set variables and functions on other channels
|
||||
*
|
||||
* \author Naveen Albert <asterisk@phreaknet.org>
|
||||
*
|
||||
* \ingroup functions
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<support_level>extended</support_level>
|
||||
***/
|
||||
|
||||
#include "asterisk.h"
|
||||
|
||||
#include "asterisk/module.h"
|
||||
#include "asterisk/channel.h"
|
||||
#include "asterisk/pbx.h"
|
||||
#include "asterisk/utils.h"
|
||||
#include "asterisk/app.h"
|
||||
#include "asterisk/stringfields.h"
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<function name="EXPORT" language="en_US">
|
||||
<synopsis>
|
||||
Set variables or dialplan functions on any arbitrary channel that exists.
|
||||
</synopsis>
|
||||
<syntax>
|
||||
<parameter name="channel" required="true">
|
||||
<para>The complete channel name: <literal>SIP/12-abcd1234</literal>.</para>
|
||||
</parameter>
|
||||
<parameter name="var" required="true">
|
||||
<para>Variable name</para>
|
||||
</parameter>
|
||||
</syntax>
|
||||
<description>
|
||||
<para>Allows setting variables or functions on any existing channel if it exists.</para>
|
||||
</description>
|
||||
<see-also>
|
||||
<ref type="function">IMPORT</ref>
|
||||
<ref type="function">MASTER_CHANNEL</ref>
|
||||
<ref type="function">SHARED</ref>
|
||||
</see-also>
|
||||
</function>
|
||||
***/
|
||||
|
||||
static int func_export_write(struct ast_channel *chan, const char *function, char *data, const char *value)
|
||||
{
|
||||
struct ast_channel *ochan;
|
||||
|
||||
AST_DECLARE_APP_ARGS(args,
|
||||
AST_APP_ARG(channel);
|
||||
AST_APP_ARG(var);
|
||||
);
|
||||
AST_STANDARD_APP_ARGS(args, data);
|
||||
|
||||
if (!args.channel) {
|
||||
ast_log(LOG_WARNING, "No channel was provided to %s function.\n", function);
|
||||
return -1;
|
||||
}
|
||||
if (!args.var) {
|
||||
ast_log(LOG_WARNING, "No variable name was provided to %s function.\n", function);
|
||||
return -1;
|
||||
}
|
||||
ochan = ast_channel_get_by_name(args.channel);
|
||||
if (!ochan) {
|
||||
ast_log(LOG_WARNING, "Channel '%s' not found! '%s' not set.\n", args.channel, args.var);
|
||||
return -1;
|
||||
}
|
||||
|
||||
pbx_builtin_setvar_helper(ochan, data, value);
|
||||
ast_channel_unref(ochan);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct ast_custom_function export_function = {
|
||||
.name = "EXPORT",
|
||||
.write = func_export_write,
|
||||
};
|
||||
|
||||
static int unload_module(void)
|
||||
{
|
||||
return ast_custom_function_unregister(&export_function);
|
||||
}
|
||||
|
||||
static int load_module(void)
|
||||
{
|
||||
return ast_custom_function_register(&export_function);
|
||||
}
|
||||
|
||||
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Set variables and functions on other channels");
|
|
@ -341,8 +341,7 @@ static void print_frame(struct ast_frame *frame)
|
|||
ast_verbose("SubClass: PVT_CAUSE_CODE\n");
|
||||
break;
|
||||
case AST_CONTROL_MASQUERADE_NOTIFY:
|
||||
/* Should never happen. */
|
||||
ast_assert(0);
|
||||
ast_verbose("SubClass: MASQUERADE_NOTIFY\n");
|
||||
break;
|
||||
case AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE:
|
||||
ast_verbose("SubClass: STREAM_TOPOLOGY_REQUEST_CHANGE\n");
|
||||
|
|
|
@ -115,7 +115,7 @@ static int json_decode_read(struct ast_channel *chan, const char *cmd, char *dat
|
|||
jsonval = ast_json_object_get(json, args.key);
|
||||
if (!jsonval) { /* no error or warning should be thrown */
|
||||
ast_debug(1, "Could not find key '%s' in parsed JSON\n", args.key);
|
||||
ast_json_free(json);
|
||||
ast_json_unref(json);
|
||||
return -1;
|
||||
}
|
||||
switch(ast_json_typeof(jsonval)) {
|
||||
|
@ -134,7 +134,7 @@ static int json_decode_read(struct ast_channel *chan, const char *cmd, char *dat
|
|||
ast_json_free(result2);
|
||||
break;
|
||||
}
|
||||
ast_json_free(json);
|
||||
ast_json_unref(json);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -187,8 +187,7 @@ static int acf_if(struct ast_channel *chan, const char *cmd, char *data, char *b
|
|||
AST_NONSTANDARD_APP_ARGS(args2, args1.remainder, ':');
|
||||
|
||||
if (ast_strlen_zero(args1.expr) || !(args2.iftrue || args2.iffalse)) {
|
||||
ast_log(LOG_WARNING, "Syntax IF(<expr>?[<true>][:<false>]) (expr must be non-null, and either <true> or <false> must be non-null)\n");
|
||||
ast_log(LOG_WARNING, " In this case, <expr>='%s', <true>='%s', and <false>='%s'\n", args1.expr, args2.iftrue, args2.iffalse);
|
||||
ast_debug(1, "<expr>='%s', <true>='%s', and <false>='%s'\n", args1.expr, args2.iftrue, args2.iffalse);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
|
@ -850,8 +850,8 @@ static int load_module(void)
|
|||
for (; db_entry; db_entry = db_entry->next) {
|
||||
const char *dev_name = strrchr(db_entry->key, '/') + 1;
|
||||
enum ast_presence_state state;
|
||||
char *message;
|
||||
char *subtype;
|
||||
char *message = NULL;
|
||||
char *subtype = NULL;
|
||||
if (dev_name <= (const char *) 1) {
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -211,6 +211,15 @@ AST_TEST_DEFINE(test_SAYFILES_function)
|
|||
res = AST_TEST_FAIL;
|
||||
}
|
||||
|
||||
/* + should be ignored and there should not be a leading & */
|
||||
ast_str_set(&expr, 0, "${SAYFILES(+18005551212,digits)}");
|
||||
ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));
|
||||
if (strcmp(ast_str_buffer(result), "digits/1&digits/8&digits/0&digits/0&digits/5&digits/5&digits/5&digits/1&digits/2&digits/1&digits/2") != 0) {
|
||||
ast_test_status_update(test, "SAYFILES(+18005551212,digits) test failed ('%s')\n",
|
||||
ast_str_buffer(result));
|
||||
res = AST_TEST_FAIL;
|
||||
}
|
||||
|
||||
ast_str_set(&expr, 0, "${SAYFILES(35,number)}");
|
||||
ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));
|
||||
if (strcmp(ast_str_buffer(result), "digits/30&digits/5") != 0) {
|
||||
|
|
|
@ -125,6 +125,7 @@ static int scramble_callback(struct ast_audiohook *audiohook, struct ast_channel
|
|||
}
|
||||
|
||||
if (frame->frametype == AST_FRAME_VOICE) { /* only invert voice frequencies */
|
||||
ni = datastore->data;
|
||||
/* Based on direction of frame, and confirm it is applicable */
|
||||
if (!(direction == AST_AUDIOHOOK_DIRECTION_READ ? ni->rx : ni->tx)) {
|
||||
return 0;
|
||||
|
|
|
@ -65,6 +65,16 @@
|
|||
as <literal>getnum</literal>, then it will return the total number of results
|
||||
that are available.</para>
|
||||
</parameter>
|
||||
<parameter name="field" required="false">
|
||||
<para>The field of the result to retrieve.</para>
|
||||
<para>The fields that can be retrieved are:</para>
|
||||
<enumlist>
|
||||
<enum name="host"/>
|
||||
<enum name="port"/>
|
||||
<enum name="priority"/>
|
||||
<enum name="weight"/>
|
||||
</enumlist>
|
||||
</parameter>
|
||||
</syntax>
|
||||
<description>
|
||||
<para>This function will retrieve results from a previous use
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* Copyright (C) 2005-2006, Digium, Inc.
|
||||
* Portions Copyright (C) 2005, Tilghman Lesher. All rights reserved.
|
||||
* Portions Copyright (C) 2005, Anthony Minessale II
|
||||
* Portions Copyright (C) 2021, Naveen Albert
|
||||
* Portions Copyright (C) 2021, 2022, Naveen Albert
|
||||
*
|
||||
* See http://www.asterisk.org for more information about
|
||||
* the Asterisk project. Please do not directly contact
|
||||
|
@ -183,6 +183,51 @@ AST_THREADSTORAGE(tmp_buf);
|
|||
</example>
|
||||
</description>
|
||||
</function>
|
||||
<function name="TRIM" language="en_US">
|
||||
<synopsis>
|
||||
Trim leading and trailing whitespace in a string
|
||||
</synopsis>
|
||||
<syntax>
|
||||
<parameter name="string" required="true" />
|
||||
</syntax>
|
||||
<description>
|
||||
<para>Replaces all leading and trailing whitespace in the provided string.</para>
|
||||
</description>
|
||||
<see-also>
|
||||
<ref type="function">LTRIM</ref>
|
||||
<ref type="function">RTRIM</ref>
|
||||
</see-also>
|
||||
</function>
|
||||
<function name="LTRIM" language="en_US">
|
||||
<synopsis>
|
||||
Trim leading whitespace in a string
|
||||
</synopsis>
|
||||
<syntax>
|
||||
<parameter name="string" required="true" />
|
||||
</syntax>
|
||||
<description>
|
||||
<para>Replaces all leading whitespace in the provided string.</para>
|
||||
</description>
|
||||
<see-also>
|
||||
<ref type="function">TRIM</ref>
|
||||
<ref type="function">RTRIM</ref>
|
||||
</see-also>
|
||||
</function>
|
||||
<function name="RTRIM" language="en_US">
|
||||
<synopsis>
|
||||
Trim trailing whitespace in a string
|
||||
</synopsis>
|
||||
<syntax>
|
||||
<parameter name="string" required="true" />
|
||||
</syntax>
|
||||
<description>
|
||||
<para>Replaces all trailing whitespace in the provided string.</para>
|
||||
</description>
|
||||
<see-also>
|
||||
<ref type="function">TRIM</ref>
|
||||
<ref type="function">LTRIM</ref>
|
||||
</see-also>
|
||||
</function>
|
||||
<function name="PASSTHRU" language="en_US">
|
||||
<synopsis>
|
||||
Pass the given argument back as a value.
|
||||
|
@ -1045,6 +1090,84 @@ static struct ast_custom_function strbetween_function = {
|
|||
.read2 = strbetween,
|
||||
};
|
||||
|
||||
#define ltrim(s) while (isspace(*s)) s++;
|
||||
#define rtrim(s) { \
|
||||
if (s) { \
|
||||
char *back = s + strlen(s); \
|
||||
while (back != s && isspace(*--back)); \
|
||||
if (*s) { \
|
||||
*(back + 1) = '\0'; \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
||||
static int function_trim(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
|
||||
{
|
||||
char *c;
|
||||
|
||||
if (ast_strlen_zero(data)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
c = ast_strdupa(data);
|
||||
ltrim(c);
|
||||
rtrim(c);
|
||||
|
||||
ast_copy_string(buf, c, len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int function_ltrim(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
|
||||
{
|
||||
char *c;
|
||||
|
||||
if (ast_strlen_zero(data)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
c = data;
|
||||
ltrim(c);
|
||||
|
||||
ast_copy_string(buf, c, len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int function_rtrim(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
|
||||
{
|
||||
char *c;
|
||||
|
||||
if (ast_strlen_zero(data)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
c = ast_strdupa(data);
|
||||
rtrim(c);
|
||||
|
||||
ast_copy_string(buf, c, len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#undef ltrim
|
||||
#undef rtrim
|
||||
|
||||
static struct ast_custom_function trim_function = {
|
||||
.name = "TRIM",
|
||||
.read = function_trim,
|
||||
};
|
||||
|
||||
static struct ast_custom_function ltrim_function = {
|
||||
.name = "LTRIM",
|
||||
.read = function_ltrim,
|
||||
};
|
||||
|
||||
static struct ast_custom_function rtrim_function = {
|
||||
.name = "RTRIM",
|
||||
.read = function_rtrim,
|
||||
};
|
||||
|
||||
static int regex(struct ast_channel *chan, const char *cmd, char *parse, char *buf,
|
||||
size_t len)
|
||||
{
|
||||
|
@ -2126,6 +2249,59 @@ AST_TEST_DEFINE(test_STRBETWEEN)
|
|||
|
||||
return res;
|
||||
}
|
||||
|
||||
AST_TEST_DEFINE(test_TRIM)
|
||||
{
|
||||
int i, res = AST_TEST_PASS;
|
||||
struct ast_channel *chan; /* dummy channel */
|
||||
struct ast_str *str; /* fancy string for holding comparing value */
|
||||
|
||||
const char *test_strings[][5] = {
|
||||
{"TRIM", " abcd ", "abcd"},
|
||||
{"LTRIM", " abcd ", "abcd "},
|
||||
{"RTRIM", " abcd ", " abcd"},
|
||||
{"TRIM", "abcd", "abcd"},
|
||||
{"TRIM", " a b c d ", "a b c d"},
|
||||
};
|
||||
|
||||
switch (cmd) {
|
||||
case TEST_INIT:
|
||||
info->name = "func_TRIM";
|
||||
info->category = "/funcs/func_strings/";
|
||||
info->summary = "Test TRIM functions";
|
||||
info->description = "Verify TRIM behavior";
|
||||
return AST_TEST_NOT_RUN;
|
||||
case TEST_EXECUTE:
|
||||
break;
|
||||
}
|
||||
|
||||
if (!(chan = ast_dummy_channel_alloc())) {
|
||||
ast_test_status_update(test, "Unable to allocate dummy channel\n");
|
||||
return AST_TEST_FAIL;
|
||||
}
|
||||
|
||||
if (!(str = ast_str_create(64))) {
|
||||
ast_test_status_update(test, "Unable to allocate dynamic string buffer\n");
|
||||
ast_channel_release(chan);
|
||||
return AST_TEST_FAIL;
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_LEN(test_strings); i++) {
|
||||
char tmp[512], tmp2[512] = "";
|
||||
|
||||
snprintf(tmp, sizeof(tmp), "${%s(%s)}", test_strings[i][0], test_strings[i][1]);
|
||||
ast_str_substitute_variables(&str, 0, chan, tmp);
|
||||
if (strcmp(test_strings[i][2], ast_str_buffer(str))) {
|
||||
ast_test_status_update(test, "Format string '%s' substituted to '%s'. Expected '%s'.\n", test_strings[i][0], tmp2, test_strings[i][2]);
|
||||
res = AST_TEST_FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
ast_free(str);
|
||||
ast_channel_release(chan);
|
||||
|
||||
return res;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int unload_module(void)
|
||||
|
@ -2137,6 +2313,7 @@ static int unload_module(void)
|
|||
AST_TEST_UNREGISTER(test_FILTER);
|
||||
AST_TEST_UNREGISTER(test_STRREPLACE);
|
||||
AST_TEST_UNREGISTER(test_STRBETWEEN);
|
||||
AST_TEST_UNREGISTER(test_TRIM);
|
||||
res |= ast_custom_function_unregister(&fieldqty_function);
|
||||
res |= ast_custom_function_unregister(&fieldnum_function);
|
||||
res |= ast_custom_function_unregister(&filter_function);
|
||||
|
@ -2163,6 +2340,9 @@ static int unload_module(void)
|
|||
res |= ast_custom_function_unregister(&push_function);
|
||||
res |= ast_custom_function_unregister(&unshift_function);
|
||||
res |= ast_custom_function_unregister(&passthru_function);
|
||||
res |= ast_custom_function_unregister(&trim_function);
|
||||
res |= ast_custom_function_unregister(<rim_function);
|
||||
res |= ast_custom_function_unregister(&rtrim_function);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
@ -2176,6 +2356,7 @@ static int load_module(void)
|
|||
AST_TEST_REGISTER(test_FILTER);
|
||||
AST_TEST_REGISTER(test_STRREPLACE);
|
||||
AST_TEST_REGISTER(test_STRBETWEEN);
|
||||
AST_TEST_REGISTER(test_TRIM);
|
||||
res |= ast_custom_function_register(&fieldqty_function);
|
||||
res |= ast_custom_function_register(&fieldnum_function);
|
||||
res |= ast_custom_function_register(&filter_function);
|
||||
|
@ -2202,6 +2383,9 @@ static int load_module(void)
|
|||
res |= ast_custom_function_register(&push_function);
|
||||
res |= ast_custom_function_register(&unshift_function);
|
||||
res |= ast_custom_function_register(&passthru_function);
|
||||
res |= ast_custom_function_register(&trim_function);
|
||||
res |= ast_custom_function_register(<rim_function);
|
||||
res |= ast_custom_function_register(&rtrim_function);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
|
|
@ -37,6 +37,7 @@ int ast_term_init(void); /*!< Provided by term.c */
|
|||
int astdb_init(void); /*!< Provided by db.c */
|
||||
int ast_channels_init(void); /*!< Provided by channel.c */
|
||||
void ast_builtins_init(void); /*!< Provided by cli.c */
|
||||
void ast_cli_channels_init(void); /*!< Provided by cli.c */
|
||||
int ast_cli_perms_init(int reload); /*!< Provided by cli.c */
|
||||
void dnsmgr_start_refresh(void); /*!< Provided by dnsmgr.c */
|
||||
int ast_dns_system_resolver_init(void); /*!< Provided by dns_system_resolver.c */
|
||||
|
|
|
@ -118,6 +118,7 @@ struct ast_audiohook {
|
|||
ast_audiohook_manipulate_callback manipulate_callback; /*!< Manipulation callback */
|
||||
struct ast_audiohook_options options; /*!< Applicable options */
|
||||
unsigned int hook_internal_samp_rate; /*!< internal read/write sample rate on the audiohook.*/
|
||||
enum ast_audiohook_direction direction; /*!< Intended audiohook direction, BOTH by default on init */
|
||||
AST_LIST_ENTRY(ast_audiohook) list; /*!< Linked list information */
|
||||
};
|
||||
|
||||
|
@ -140,6 +141,14 @@ int ast_audiohook_init(struct ast_audiohook *audiohook, enum ast_audiohook_type
|
|||
*/
|
||||
int ast_audiohook_destroy(struct ast_audiohook *audiohook);
|
||||
|
||||
/*! \brief Sets direction on audiohook
|
||||
* \param audiohook
|
||||
* \param direction In which direction should the audiohook feed frames, ie if we are snooping 'in', set direction to READ so that only the 'in' frames are fed to the slin factory
|
||||
* \retval 0 on success
|
||||
* \retval -1 on failure due to audiohook already in use or in shutdown. Can only set direction on NEW audiohooks
|
||||
*/
|
||||
int ast_audiohook_set_frame_feed_direction(struct ast_audiohook *audiohook, enum ast_audiohook_direction direction);
|
||||
|
||||
/*! \brief Writes a frame into the audiohook structure
|
||||
* \param audiohook
|
||||
* \param direction Direction the audio frame came from
|
||||
|
|
|
@ -19,19 +19,14 @@
|
|||
of a mutex to its initializer. */
|
||||
#undef CAN_COMPARE_MUTEX_TO_INIT_VALUE
|
||||
|
||||
/* Define to 1 if the `closedir' function returns void instead of `int'. */
|
||||
/* Define to 1 if the `closedir' function returns void instead of int. */
|
||||
#undef CLOSEDIR_VOID
|
||||
|
||||
/* Some configure tests will unexpectedly fail if configure is run by a
|
||||
non-root user. These may be able to be tested at runtime. */
|
||||
#undef CONFIGURE_RAN_AS_ROOT
|
||||
|
||||
/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
|
||||
systems. This function is required for `alloca.c' support on those systems.
|
||||
*/
|
||||
#undef CRAY_STACKSEG_END
|
||||
|
||||
/* Define to 1 if using `alloca.c'. */
|
||||
/* Define to 1 if using 'alloca.c'. */
|
||||
#undef C_ALLOCA
|
||||
|
||||
/* Define to 1 if anonymous semaphores work. */
|
||||
|
@ -43,11 +38,10 @@
|
|||
/* Define to 1 if you have the `acosl' function. */
|
||||
#undef HAVE_ACOSL
|
||||
|
||||
/* Define to 1 if you have `alloca', as a function or macro. */
|
||||
/* Define to 1 if you have 'alloca', as a function or macro. */
|
||||
#undef HAVE_ALLOCA
|
||||
|
||||
/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
|
||||
*/
|
||||
/* Define to 1 if <alloca.h> works. */
|
||||
#undef HAVE_ALLOCA_H
|
||||
|
||||
/* Define to 1 if you have the Advanced Linux Sound Architecture library. */
|
||||
|
@ -505,12 +499,12 @@
|
|||
/* Define to 1 if you have the `memmove' function. */
|
||||
#undef HAVE_MEMMOVE
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#undef HAVE_MEMORY_H
|
||||
|
||||
/* Define to 1 if you have the `memset' function. */
|
||||
#undef HAVE_MEMSET
|
||||
|
||||
/* Define to 1 if you have the <minix/config.h> header file. */
|
||||
#undef HAVE_MINIX_CONFIG_H
|
||||
|
||||
/* Define to 1 if you have the `mkdir' function. */
|
||||
#undef HAVE_MKDIR
|
||||
|
||||
|
@ -656,6 +650,10 @@
|
|||
/* Define if your system has the PJSIP_TLS_TRANSPORT_PROTO headers. */
|
||||
#undef HAVE_PJSIP_TLS_TRANSPORT_PROTO
|
||||
|
||||
/* Define to 1 if PJPROJECT has the PJSIP TLS Transport Restart Support
|
||||
feature. */
|
||||
#undef HAVE_PJSIP_TLS_TRANSPORT_RESTART
|
||||
|
||||
/* Define if your system has the PJSIP_TRANSPORT_DISABLE_CONNECTION_REUSE
|
||||
headers. */
|
||||
#undef HAVE_PJSIP_TRANSPORT_DISABLE_CONNECTION_REUSE
|
||||
|
@ -1246,6 +1244,9 @@
|
|||
/* Define to 1 if you have the `vprintf' function. */
|
||||
#undef HAVE_VPRINTF
|
||||
|
||||
/* Define to 1 if you have the <wchar.h> header file. */
|
||||
#undef HAVE_WCHAR_H
|
||||
|
||||
/* Define to 1 if you have the <winsock2.h> header file. */
|
||||
#undef HAVE_WINSOCK2_H
|
||||
|
||||
|
@ -1400,10 +1401,13 @@
|
|||
STACK_DIRECTION = 0 => direction of growth unknown */
|
||||
#undef STACK_DIRECTION
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
/* Define to 1 if all of the C90 standard headers exist (not just the ones
|
||||
required in a freestanding environment). This macro is provided for
|
||||
backward compatibility; new code need not use it. */
|
||||
#undef STDC_HEADERS
|
||||
|
||||
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
|
||||
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. This
|
||||
macro is obsolete. */
|
||||
#undef TIME_WITH_SYS_TIME
|
||||
|
||||
/* Define to 1 if your <sys/time.h> declares `struct tm'. */
|
||||
|
@ -1416,32 +1420,93 @@
|
|||
#ifndef _ALL_SOURCE
|
||||
# undef _ALL_SOURCE
|
||||
#endif
|
||||
/* Enable GNU extensions on systems that have them. */
|
||||
#ifndef _GNU_SOURCE
|
||||
# undef _GNU_SOURCE
|
||||
#endif
|
||||
/* Enable threading extensions on Solaris. */
|
||||
#ifndef _POSIX_PTHREAD_SEMANTICS
|
||||
# undef _POSIX_PTHREAD_SEMANTICS
|
||||
#endif
|
||||
/* Enable extensions on HP NonStop. */
|
||||
#ifndef _TANDEM_SOURCE
|
||||
# undef _TANDEM_SOURCE
|
||||
/* Enable general extensions on macOS. */
|
||||
#ifndef _DARWIN_C_SOURCE
|
||||
# undef _DARWIN_C_SOURCE
|
||||
#endif
|
||||
/* Enable general extensions on Solaris. */
|
||||
#ifndef __EXTENSIONS__
|
||||
# undef __EXTENSIONS__
|
||||
#endif
|
||||
/* Enable GNU extensions on systems that have them. */
|
||||
#ifndef _GNU_SOURCE
|
||||
# undef _GNU_SOURCE
|
||||
#endif
|
||||
/* Enable X/Open compliant socket functions that do not require linking
|
||||
with -lxnet on HP-UX 11.11. */
|
||||
#ifndef _HPUX_ALT_XOPEN_SOCKET_API
|
||||
# undef _HPUX_ALT_XOPEN_SOCKET_API
|
||||
#endif
|
||||
/* Identify the host operating system as Minix.
|
||||
This macro does not affect the system headers' behavior.
|
||||
A future release of Autoconf may stop defining this macro. */
|
||||
#ifndef _MINIX
|
||||
# undef _MINIX
|
||||
#endif
|
||||
/* Enable general extensions on NetBSD.
|
||||
Enable NetBSD compatibility extensions on Minix. */
|
||||
#ifndef _NETBSD_SOURCE
|
||||
# undef _NETBSD_SOURCE
|
||||
#endif
|
||||
/* Enable OpenBSD compatibility extensions on NetBSD.
|
||||
Oddly enough, this does nothing on OpenBSD. */
|
||||
#ifndef _OPENBSD_SOURCE
|
||||
# undef _OPENBSD_SOURCE
|
||||
#endif
|
||||
/* Define to 1 if needed for POSIX-compatible behavior. */
|
||||
#ifndef _POSIX_SOURCE
|
||||
# undef _POSIX_SOURCE
|
||||
#endif
|
||||
/* Define to 2 if needed for POSIX-compatible behavior. */
|
||||
#ifndef _POSIX_1_SOURCE
|
||||
# undef _POSIX_1_SOURCE
|
||||
#endif
|
||||
/* Enable POSIX-compatible threading on Solaris. */
|
||||
#ifndef _POSIX_PTHREAD_SEMANTICS
|
||||
# undef _POSIX_PTHREAD_SEMANTICS
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TS 18661-5:2014. */
|
||||
#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
|
||||
# undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TS 18661-1:2014. */
|
||||
#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
|
||||
# undef __STDC_WANT_IEC_60559_BFP_EXT__
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TS 18661-2:2015. */
|
||||
#ifndef __STDC_WANT_IEC_60559_DFP_EXT__
|
||||
# undef __STDC_WANT_IEC_60559_DFP_EXT__
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TS 18661-4:2015. */
|
||||
#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__
|
||||
# undef __STDC_WANT_IEC_60559_FUNCS_EXT__
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TS 18661-3:2015. */
|
||||
#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__
|
||||
# undef __STDC_WANT_IEC_60559_TYPES_EXT__
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TR 24731-2:2010. */
|
||||
#ifndef __STDC_WANT_LIB_EXT2__
|
||||
# undef __STDC_WANT_LIB_EXT2__
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC 24747:2009. */
|
||||
#ifndef __STDC_WANT_MATH_SPEC_FUNCS__
|
||||
# undef __STDC_WANT_MATH_SPEC_FUNCS__
|
||||
#endif
|
||||
/* Enable extensions on HP NonStop. */
|
||||
#ifndef _TANDEM_SOURCE
|
||||
# undef _TANDEM_SOURCE
|
||||
#endif
|
||||
/* Enable X/Open extensions. Define to 500 only if necessary
|
||||
to make mbstate_t available. */
|
||||
#ifndef _XOPEN_SOURCE
|
||||
# undef _XOPEN_SOURCE
|
||||
#endif
|
||||
|
||||
|
||||
/* Define to 1 if running on Darwin. */
|
||||
#undef _DARWIN_UNLIMITED_SELECT
|
||||
|
||||
/* Enable large inode numbers on Mac OS X 10.5. */
|
||||
#ifndef _DARWIN_USE_64_BIT_INODE
|
||||
# define _DARWIN_USE_64_BIT_INODE 1
|
||||
#endif
|
||||
|
||||
/* Number of bits in a file offset, on hosts where this is settable. */
|
||||
#undef _FILE_OFFSET_BITS
|
||||
|
||||
|
@ -1459,16 +1524,6 @@
|
|||
/* Define for large files, on AIX-style hosts. */
|
||||
#undef _LARGE_FILES
|
||||
|
||||
/* Define to 1 if on MINIX. */
|
||||
#undef _MINIX
|
||||
|
||||
/* Define to 2 if the system does not provide POSIX.1 features except with
|
||||
this defined. */
|
||||
#undef _POSIX_1_SOURCE
|
||||
|
||||
/* Define to 1 if you need to in order for `stat' and other things to work. */
|
||||
#undef _POSIX_SOURCE
|
||||
|
||||
/* Define to empty if `const' does not conform to ANSI C. */
|
||||
#undef const
|
||||
|
||||
|
@ -1490,7 +1545,7 @@
|
|||
/* Define to `long int' if <sys/types.h> does not define. */
|
||||
#undef off_t
|
||||
|
||||
/* Define to `int' if <sys/types.h> does not define. */
|
||||
/* Define as a signed integer type capable of holding a process identifier. */
|
||||
#undef pid_t
|
||||
|
||||
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
||||
|
|
|
@ -225,6 +225,8 @@ enum ast_cdr_settings {
|
|||
CDR_INITIATED_SECONDS = 1 << 5, /*!< Include microseconds into the billing time */
|
||||
CDR_DEBUG = 1 << 6, /*!< Enables extra debug statements */
|
||||
CDR_CHANNEL_DEFAULT_ENABLED = 1 << 7, /*!< Whether CDR is enabled for each channel by default */
|
||||
CDR_IGNORE_STATE_CHANGES = 1 << 8, /*!< Whether to ignore bridge and other call state change events */
|
||||
CDR_IGNORE_DIAL_CHANGES = 1 << 9, /*!< Whether to ignore dial state changes */
|
||||
};
|
||||
|
||||
/*! \brief CDR Batch Mode settings */
|
||||
|
|
|
@ -4112,8 +4112,6 @@ struct ast_channel_monitor {
|
|||
};
|
||||
|
||||
/* ACCESSOR FUNCTIONS */
|
||||
/*! \brief Set the channel name */
|
||||
void ast_channel_name_set(struct ast_channel *chan, const char *name);
|
||||
|
||||
#define DECLARE_STRINGFIELD_SETTERS_FOR(field) \
|
||||
void ast_channel_##field##_set(struct ast_channel *chan, const char *field); \
|
||||
|
|
|
@ -30,20 +30,22 @@ extern "C" {
|
|||
#include "asterisk/optional_api.h"
|
||||
#include "asterisk/logger.h"
|
||||
|
||||
#ifdef HAVE_CRYPTO
|
||||
#include "openssl/aes.h"
|
||||
typedef AES_KEY ast_aes_encrypt_key;
|
||||
typedef AES_KEY ast_aes_decrypt_key;
|
||||
#else /* !HAVE_CRYPTO */
|
||||
typedef char ast_aes_encrypt_key;
|
||||
typedef char ast_aes_decrypt_key;
|
||||
#endif /* HAVE_CRYPTO */
|
||||
/* We previously used the key length explicitly; replace with constant.
|
||||
* For now, Asterisk is limited to 1024 bit (128 byte) RSA keys.
|
||||
*/
|
||||
#define AST_CRYPTO_RSA_KEY_BITS 1024
|
||||
#define AST_CRYPTO_AES_BLOCKSIZE 128
|
||||
|
||||
struct aes_key {
|
||||
unsigned char raw[AST_CRYPTO_AES_BLOCKSIZE / 8];
|
||||
};
|
||||
|
||||
typedef struct aes_key ast_aes_encrypt_key;
|
||||
typedef struct aes_key ast_aes_decrypt_key;
|
||||
|
||||
#define AST_KEY_PUBLIC (1 << 0)
|
||||
#define AST_KEY_PRIVATE (1 << 1)
|
||||
|
||||
struct ast_key;
|
||||
|
||||
/*!
|
||||
* \brief Retrieve a key
|
||||
* \param kname Name of the key we are retrieving
|
||||
|
@ -163,23 +165,29 @@ AST_OPTIONAL_API(int, ast_aes_set_decrypt_key,
|
|||
* \param in data to be encrypted
|
||||
* \param out pointer to a buffer to hold the encrypted output
|
||||
* \param ctx address of an aes encryption context filled in with ast_aes_set_encrypt_key
|
||||
* \retval <= 0 failure
|
||||
* \retval otherwise number of bytes in output buffer
|
||||
*/
|
||||
AST_OPTIONAL_API(void, ast_aes_encrypt,
|
||||
(const unsigned char *in, unsigned char *out, const ast_aes_encrypt_key *ctx),
|
||||
{ ast_log(LOG_WARNING, "AES encryption disabled. Install OpenSSL.\n");return; });
|
||||
AST_OPTIONAL_API(int, ast_aes_encrypt,
|
||||
(const unsigned char *in, unsigned char *out, const ast_aes_encrypt_key *key),
|
||||
{ ast_log(LOG_WARNING, "AES encryption disabled. Install OpenSSL.\n");return -1; });
|
||||
|
||||
/*!
|
||||
* \brief AES decrypt data
|
||||
* \param in encrypted data
|
||||
* \param out pointer to a buffer to hold the decrypted output
|
||||
* \param ctx address of an aes encryption context filled in with ast_aes_set_decrypt_key
|
||||
* \retval <= 0 failure
|
||||
* \retval otherwise number of bytes in output buffer
|
||||
*/
|
||||
AST_OPTIONAL_API(void, ast_aes_decrypt,
|
||||
(const unsigned char *in, unsigned char *out, const ast_aes_decrypt_key *ctx),
|
||||
{ ast_log(LOG_WARNING, "AES encryption disabled. Install OpenSSL.\n");return; });
|
||||
AST_OPTIONAL_API(int, ast_aes_decrypt,
|
||||
(const unsigned char *in, unsigned char *out, const ast_aes_decrypt_key *key),
|
||||
{ ast_log(LOG_WARNING, "AES encryption disabled. Install OpenSSL.\n");return -1; });
|
||||
|
||||
AST_OPTIONAL_API(int, ast_crypto_loaded, (void), { return 0; });
|
||||
|
||||
AST_OPTIONAL_API(int, ast_crypto_reload, (void), { return 0; });
|
||||
|
||||
#if defined(__cplusplus) || defined(c_plusplus)
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -72,6 +72,8 @@ struct ast_features_xfer_config {
|
|||
AST_STRING_FIELD(transferretrysound);
|
||||
/*! Sound played when an invalid extension is dialed, and the transferer is being returned to the call. */
|
||||
AST_STRING_FIELD(transferinvalidsound);
|
||||
/*! Sound to play to announce the transfer process has started. */
|
||||
AST_STRING_FIELD_EXTENDED(transferannouncesound);
|
||||
);
|
||||
/*! Seconds allowed between digit presses when dialing transfer destination */
|
||||
unsigned int transferdigittimeout;
|
||||
|
|
|
@ -350,6 +350,18 @@ void astman_send_list_complete_start(struct mansession *s, const struct message
|
|||
*/
|
||||
void astman_send_list_complete_end(struct mansession *s);
|
||||
|
||||
/*!
|
||||
* \brief Enable/disable the inclusion of 'dangerous' configurations outside
|
||||
* of the ast_config_AST_CONFIG_DIR
|
||||
*
|
||||
* This function can globally enable/disable the loading of configuration files
|
||||
* outside of ast_config_AST_CONFIG_DIR.
|
||||
*
|
||||
* \param new_live_dangerously If true, enable the access of files outside
|
||||
* ast_config_AST_CONFIG_DIR from astman.
|
||||
*/
|
||||
void astman_live_dangerously(int new_live_dangerously);
|
||||
|
||||
void __attribute__((format(printf, 2, 3))) astman_append(struct mansession *s, const char *fmt, ...);
|
||||
|
||||
/*! \brief Determine if a manager session ident is authenticated */
|
||||
|
|
|
@ -1432,7 +1432,7 @@ void pbx_substitute_variables_helper_full(struct ast_channel *c, struct varshead
|
|||
/*!
|
||||
* \brief Substitutes variables, similar to pbx_substitute_variables_helper_full, but allows passing the context, extension, and priority in.
|
||||
*/
|
||||
void pbx_substitute_variables_helper_full_location(struct ast_channel *c, struct varshead *headp, const char *cp1, char *cp2, int cp2_size, size_t *used, char *context, char *exten, int pri);
|
||||
void pbx_substitute_variables_helper_full_location(struct ast_channel *c, struct varshead *headp, const char *cp1, char *cp2, int cp2_size, size_t *used, const char *context, const char *exten, int pri);
|
||||
/*! @} */
|
||||
|
||||
/*! @name Substitution routines, using dynamic string buffers
|
||||
|
|
|
@ -29,8 +29,8 @@
|
|||
|
||||
enum ast_geoloc_pidf_element {
|
||||
AST_PIDF_ELEMENT_NONE = 0,
|
||||
AST_PIDF_ELEMENT_TUPLE,
|
||||
AST_PIDF_ELEMENT_DEVICE,
|
||||
AST_PIDF_ELEMENT_TUPLE,
|
||||
AST_PIDF_ELEMENT_PERSON,
|
||||
AST_PIDF_ELEMENT_LAST,
|
||||
};
|
||||
|
@ -43,13 +43,22 @@ enum ast_geoloc_format {
|
|||
AST_GEOLOC_FORMAT_LAST,
|
||||
};
|
||||
|
||||
enum ast_geoloc_action {
|
||||
AST_GEOLOC_ACT_PREFER_INCOMING = 0,
|
||||
AST_GEOLOC_ACT_PREFER_CONFIG,
|
||||
AST_GEOLOC_ACT_DISCARD_INCOMING,
|
||||
AST_GEOLOC_ACT_DISCARD_CONFIG,
|
||||
enum ast_geoloc_precedence {
|
||||
AST_GEOLOC_PRECED_PREFER_INCOMING = 0,
|
||||
AST_GEOLOC_PRECED_PREFER_CONFIG,
|
||||
AST_GEOLOC_PRECED_DISCARD_INCOMING,
|
||||
AST_GEOLOC_PRECED_DISCARD_CONFIG,
|
||||
};
|
||||
|
||||
#define CONFIG_STR_TO_ENUM_DECL(_stem) int ast_geoloc_ ## _stem ## _str_to_enum(const char *str);
|
||||
CONFIG_STR_TO_ENUM_DECL(pidf_element)
|
||||
CONFIG_STR_TO_ENUM_DECL(format);
|
||||
CONFIG_STR_TO_ENUM_DECL(precedence);
|
||||
#define GEOLOC_ENUM_TO_NAME_DECL(_stem) const char * ast_geoloc_ ## _stem ## _to_name(int ix);
|
||||
GEOLOC_ENUM_TO_NAME_DECL(pidf_element)
|
||||
GEOLOC_ENUM_TO_NAME_DECL(format);
|
||||
GEOLOC_ENUM_TO_NAME_DECL(precedence);
|
||||
|
||||
struct ast_geoloc_location {
|
||||
SORCERY_OBJECT(details);
|
||||
AST_DECLARE_STRING_FIELDS(
|
||||
|
@ -58,6 +67,7 @@ struct ast_geoloc_location {
|
|||
);
|
||||
enum ast_geoloc_format format;
|
||||
struct ast_variable *location_info;
|
||||
struct ast_variable *confidence;
|
||||
};
|
||||
|
||||
struct ast_geoloc_profile {
|
||||
|
@ -65,13 +75,19 @@ struct ast_geoloc_profile {
|
|||
AST_DECLARE_STRING_FIELDS(
|
||||
AST_STRING_FIELD(location_reference);
|
||||
AST_STRING_FIELD(notes);
|
||||
AST_STRING_FIELD(method);
|
||||
AST_STRING_FIELD(location_source);
|
||||
);
|
||||
enum ast_geoloc_pidf_element pidf_element;
|
||||
enum ast_geoloc_action action;
|
||||
int geolocation_routing;
|
||||
enum ast_geoloc_precedence precedence;
|
||||
int allow_routing_use;
|
||||
struct ast_variable *location_refinement;
|
||||
struct ast_variable *location_variables;
|
||||
struct ast_variable *usage_rules;
|
||||
int suppress_empty_ca_elements;
|
||||
enum ast_geoloc_format format;
|
||||
struct ast_variable *location_info;
|
||||
struct ast_variable *confidence;
|
||||
};
|
||||
|
||||
struct ast_geoloc_eprofile {
|
||||
|
@ -83,14 +99,16 @@ struct ast_geoloc_eprofile {
|
|||
AST_STRING_FIELD(notes);
|
||||
);
|
||||
enum ast_geoloc_pidf_element pidf_element;
|
||||
enum ast_geoloc_action action;
|
||||
int geolocation_routing;
|
||||
enum ast_geoloc_precedence precedence;
|
||||
int allow_routing_use;
|
||||
enum ast_geoloc_format format;
|
||||
struct ast_variable *location_info;
|
||||
struct ast_variable *location_refinement;
|
||||
struct ast_variable *location_variables;
|
||||
struct ast_variable *effective_location;
|
||||
struct ast_variable *usage_rules;
|
||||
struct ast_variable *confidence;
|
||||
int suppress_empty_ca_elements;
|
||||
};
|
||||
|
||||
/*!
|
||||
|
@ -299,6 +317,15 @@ struct ast_datastore *ast_geoloc_datastore_find(struct ast_channel *chan);
|
|||
*/
|
||||
struct ast_geoloc_eprofile *ast_geoloc_eprofile_alloc(const char *name);
|
||||
|
||||
/*!
|
||||
* \brief Duplicate an effective profile.
|
||||
*
|
||||
* \param src The eprofile to duplicate.
|
||||
*
|
||||
* \return The duplicated effective profile ao2 object.
|
||||
*/
|
||||
struct ast_geoloc_eprofile *ast_geoloc_eprofile_dup(struct ast_geoloc_eprofile *src);
|
||||
|
||||
/*!
|
||||
* \brief Allocate a new effective profile from an existing profile.
|
||||
*
|
||||
|
@ -331,12 +358,45 @@ struct ast_geoloc_eprofile *ast_geoloc_eprofile_create_from_pidf(
|
|||
struct ast_geoloc_eprofile *ast_geoloc_eprofile_create_from_uri(const char *uri,
|
||||
const char *reference_string);
|
||||
|
||||
/*!
|
||||
* \brief Convert a URI eprofile to a URI string
|
||||
*
|
||||
* \param eprofile Effective profile to convert
|
||||
* \param chan Channel to use to resolve variables
|
||||
* \param buf Pointer to ast_str pointer to use for work
|
||||
* \param ref_string An identifying string to use in error messages.
|
||||
*
|
||||
* \return String representation of URI allocated from buf or NULL on failure
|
||||
*/
|
||||
const char *ast_geoloc_eprofile_to_uri(struct ast_geoloc_eprofile *eprofile,
|
||||
struct ast_channel *chan, struct ast_str **buf, const char *ref_string);
|
||||
|
||||
/*!
|
||||
* \brief Convert a datastore containing eprofiles to a PIDF-LO document
|
||||
*
|
||||
* \param ds Datastore containing effective profiles to convert
|
||||
* \param chan Channel to use to resolve variables
|
||||
* \param buf Pointer to ast_str pointer to use for work
|
||||
* \param ref_string An identifying string to use in error messages.
|
||||
*
|
||||
* \return String representation PIDF-LO allocated from buf or NULL on failure.
|
||||
*/
|
||||
const char *ast_geoloc_eprofiles_to_pidf(struct ast_datastore *ds,
|
||||
struct ast_channel *chan, struct ast_str **buf, const char * ref_string);
|
||||
|
||||
/*!
|
||||
* \brief Convert a single eprofile to a PIDF-LO document
|
||||
*
|
||||
* \param eprofile Effective profile to convert
|
||||
* \param chan Channel to use to resolve variables
|
||||
* \param buf Pointer to ast_str pointer to use for work
|
||||
* \param ref_string An identifying string to use in error messages.
|
||||
*
|
||||
* \return String representation PIDF-LO allocated from buf or NULL on failure.
|
||||
*/
|
||||
const char *ast_geoloc_eprofile_to_pidf(struct ast_geoloc_eprofile *eprofile,
|
||||
struct ast_channel *chan, struct ast_str **buf, const char * ref_string);
|
||||
|
||||
/*!
|
||||
* \brief Refresh the effective profile with any changed info.
|
||||
*
|
||||
|
|
|
@ -51,6 +51,11 @@
|
|||
#include "asterisk/stasis_endpoints.h"
|
||||
#include "asterisk/stream.h"
|
||||
|
||||
#ifdef HAVE_PJSIP_TLS_TRANSPORT_RESTART
|
||||
/* Needed for knowing if the cert or priv key files changed */
|
||||
#include <sys/stat.h>
|
||||
#endif
|
||||
|
||||
#define PJSIP_MINVERSION(m,n,p) (((m << 24) | (n << 16) | (p << 8)) >= PJ_VERSION_NUM)
|
||||
|
||||
#ifndef PJSIP_EXPIRES_NOT_SPECIFIED
|
||||
|
@ -82,6 +87,26 @@
|
|||
#define AST_STIR_SHAKEN_RESPONSE_STR_UNSUPPORTED_CREDENTIAL "Unsupported Credential"
|
||||
#define AST_STIR_SHAKEN_RESPONSE_STR_INVALID_IDENTITY_HEADER "Invalid Identity Header"
|
||||
|
||||
/* ":12345" */
|
||||
#define COLON_PORT_STRLEN 6
|
||||
/*
|
||||
* "<ipaddr>:<port>"
|
||||
* PJ_INET6_ADDRSTRLEN includes the NULL terminator
|
||||
*/
|
||||
#define IP6ADDR_COLON_PORT_BUFLEN (PJ_INET6_ADDRSTRLEN + COLON_PORT_STRLEN)
|
||||
|
||||
/*!
|
||||
* \brief Fill a buffer with a pjsip transport's remote ip address and port
|
||||
*
|
||||
* \param transport The pjsip_transport to use
|
||||
* \param dest The destination buffer of at least IP6ADDR_COLON_PORT_BUFLEN bytes
|
||||
*/
|
||||
#define AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR(_transport, _dest) \
|
||||
snprintf(_dest, IP6ADDR_COLON_PORT_BUFLEN, \
|
||||
PJSTR_PRINTF_SPEC ":%d", \
|
||||
PJSTR_PRINTF_VAR(_transport->remote_name.host), \
|
||||
_transport->remote_name.port);
|
||||
|
||||
/* Forward declarations of PJSIP stuff */
|
||||
struct pjsip_rx_data;
|
||||
struct pjsip_module;
|
||||
|
@ -100,6 +125,8 @@ struct pjsip_tpselector;
|
|||
|
||||
AST_VECTOR(ast_sip_service_route_vector, char *);
|
||||
|
||||
static const pj_str_t AST_PJ_STR_EMPTY = { "", 0 };
|
||||
|
||||
/*!
|
||||
* \brief Structure for SIP transport information
|
||||
*/
|
||||
|
@ -184,6 +211,16 @@ struct ast_sip_transport_state {
|
|||
* If true, fail if server certificate cannot verify (TLS only)
|
||||
*/
|
||||
int verify_server;
|
||||
#ifdef HAVE_PJSIP_TLS_TRANSPORT_RESTART
|
||||
/*!
|
||||
* The stats information for the certificate file, if configured
|
||||
*/
|
||||
struct stat cert_file_stat;
|
||||
/*!
|
||||
* The stats information for the private key file, if configured
|
||||
*/
|
||||
struct stat privkey_file_stat;
|
||||
#endif
|
||||
};
|
||||
|
||||
#define ast_sip_transport_is_nonlocal(transport_state, addr) \
|
||||
|
@ -302,6 +339,45 @@ struct ast_sip_nat_hook {
|
|||
void (*outgoing_external_message)(struct pjsip_tx_data *tdata, struct ast_sip_transport *transport);
|
||||
};
|
||||
|
||||
/*!
|
||||
* \brief The kind of security negotiation
|
||||
*/
|
||||
enum ast_sip_security_negotiation {
|
||||
/*! No security mechanism negotiation */
|
||||
AST_SIP_SECURITY_NEG_NONE = 0,
|
||||
/*! Use mediasec security mechanism negotiation */
|
||||
AST_SIP_SECURITY_NEG_MEDIASEC,
|
||||
/* Add RFC 3329 (sec-agree) mechanism negotiation in the future */
|
||||
};
|
||||
|
||||
/*!
|
||||
* \brief The security mechanism type
|
||||
*/
|
||||
enum ast_sip_security_mechanism_type {
|
||||
AST_SIP_SECURITY_MECH_NONE = 0,
|
||||
/* Use msrp-tls as security mechanism */
|
||||
AST_SIP_SECURITY_MECH_MSRP_TLS,
|
||||
/* Use sdes-srtp as security mechanism */
|
||||
AST_SIP_SECURITY_MECH_SDES_SRTP,
|
||||
/* Use dtls-srtp as security mechanism */
|
||||
AST_SIP_SECURITY_MECH_DTLS_SRTP,
|
||||
/* Add RFC 3329 (sec-agree) mechanisms like tle, digest, ipsec-ike in the future */
|
||||
};
|
||||
|
||||
/*!
|
||||
* \brief Structure representing a security mechanism as defined in RFC 3329
|
||||
*/
|
||||
struct ast_sip_security_mechanism {
|
||||
/* Used to determine which security mechanism to use. */
|
||||
enum ast_sip_security_mechanism_type type;
|
||||
/* The preference of this security mechanism. The higher the value, the more preferred. */
|
||||
float qvalue;
|
||||
/* Optional mechanism parameters. */
|
||||
struct ast_vector_string mechanism_parameters;
|
||||
};
|
||||
|
||||
AST_VECTOR(ast_sip_security_mechanism_vector, struct ast_sip_security_mechanism *);
|
||||
|
||||
/*!
|
||||
* \brief Contact associated with an address of record
|
||||
*/
|
||||
|
@ -373,6 +449,13 @@ struct ast_sip_contact_status {
|
|||
);
|
||||
/*! The round trip time in microseconds */
|
||||
int64_t rtt;
|
||||
/*!
|
||||
* The security mechanism list of the contact (RFC 3329).
|
||||
* Stores the values of Security-Server headers in 401/421/494 responses to an
|
||||
* in-dialog request or successful outbound registration which will be used to
|
||||
* set the Security-Verify headers of all subsequent requests to the contact.
|
||||
*/
|
||||
struct ast_sip_security_mechanism_vector security_mechanisms;
|
||||
/*! Current status for a contact (default - unavailable) */
|
||||
enum ast_sip_contact_status_type status;
|
||||
/*! Last status for a contact (default - unavailable) */
|
||||
|
@ -432,6 +515,20 @@ struct ast_sip_contact_wrapper {
|
|||
struct ast_sip_contact *contact;
|
||||
};
|
||||
|
||||
/*!
|
||||
* \brief 100rel modes for SIP endpoints
|
||||
*/
|
||||
enum ast_sip_100rel_mode {
|
||||
/*! Do not support 100rel. (no) */
|
||||
AST_SIP_100REL_UNSUPPORTED = 0,
|
||||
/*! As UAC, indicate 100rel support in Supported header. (yes) */
|
||||
AST_SIP_100REL_SUPPORTED,
|
||||
/*! As UAS, send 1xx responses reliably, if the UAC indicated its support. Otherwise same as AST_SIP_100REL_SUPPORTED. (peer_supported) */
|
||||
AST_SIP_100REL_PEER_SUPPORTED,
|
||||
/*! Require the use of 100rel. (required) */
|
||||
AST_SIP_100REL_REQUIRED,
|
||||
};
|
||||
|
||||
/*!
|
||||
* \brief DTMF modes for SIP endpoints
|
||||
*/
|
||||
|
@ -956,6 +1053,10 @@ struct ast_sip_endpoint {
|
|||
unsigned int suppress_q850_reason_headers;
|
||||
/*! Ignore 183 if no SDP is present */
|
||||
unsigned int ignore_183_without_sdp;
|
||||
/*! Type of security negotiation to use (RFC 3329). */
|
||||
enum ast_sip_security_negotiation security_negotiation;
|
||||
/*! Client security mechanisms (RFC 3329). */
|
||||
struct ast_sip_security_mechanism_vector security_mechanisms;
|
||||
/*! Set which STIR/SHAKEN behaviors we want on this endpoint */
|
||||
unsigned int stir_shaken;
|
||||
/*! Should we authenticate OPTIONS requests per RFC 3261? */
|
||||
|
@ -964,6 +1065,10 @@ struct ast_sip_endpoint {
|
|||
AST_STRING_FIELD_EXTENDED(geoloc_incoming_call_profile);
|
||||
/*! The name of the geoloc profile to apply when Asterisk sends a call to this endpoint */
|
||||
AST_STRING_FIELD_EXTENDED(geoloc_outgoing_call_profile);
|
||||
/*! 100rel mode to use with this endpoint */
|
||||
enum ast_sip_100rel_mode rel100;
|
||||
/*! Send Advice-of-Charge messages */
|
||||
unsigned int send_aoc;
|
||||
};
|
||||
|
||||
/*! URI parameter for symmetric transport */
|
||||
|
@ -1004,6 +1109,87 @@ int ast_sip_are_media_types_equal(pjsip_media_type *a, pjsip_media_type *b);
|
|||
*/
|
||||
int ast_sip_is_media_type_in(pjsip_media_type *a, ...) attribute_sentinel;
|
||||
|
||||
/*!
|
||||
* \brief Add security headers to transmission data
|
||||
*
|
||||
* \param security_mechanisms Vector of security mechanisms.
|
||||
* \param header_name The header name under which to add the security mechanisms.
|
||||
* One of Security-Client, Security-Server, Security-Verify.
|
||||
* \param add_qval If zero, don't add the q-value to the header.
|
||||
* \param tdata The transmission data.
|
||||
* \retval 0 Success
|
||||
* \retval non-zero Failure
|
||||
*/
|
||||
int ast_sip_add_security_headers(struct ast_sip_security_mechanism_vector *security_mechanisms,
|
||||
const char *header_name, int add_qval, pjsip_tx_data *tdata);
|
||||
|
||||
/*!
|
||||
* \brief Append to security mechanism vector from SIP header
|
||||
*
|
||||
* \param hdr The header of the security mechanisms.
|
||||
* \param security_mechanisms Vector of security mechanisms to append to.
|
||||
* Header name must be one of Security-Client, Security-Server, Security-Verify.
|
||||
*/
|
||||
void ast_sip_header_to_security_mechanism(const pjsip_generic_string_hdr *hdr,
|
||||
struct ast_sip_security_mechanism_vector *security_mechanisms);
|
||||
|
||||
/*!
|
||||
* \brief Initialize security mechanism vector from string of security mechanisms.
|
||||
*
|
||||
* \param security_mechanisms Pointer to vector of security mechanisms to initialize.
|
||||
* \param value String of security mechanisms as defined in RFC 3329.
|
||||
* \retval 0 Success
|
||||
* \retval non-zero Failure
|
||||
*/
|
||||
int ast_sip_security_mechanism_vector_init(struct ast_sip_security_mechanism_vector *security_mechanism, const char *value);
|
||||
|
||||
/*!
|
||||
* \brief Removes all headers of a specific name and value from a pjsip_msg.
|
||||
*
|
||||
* \param msg PJSIP message from which to remove headers.
|
||||
* \param hdr_name Name of the header to remove.
|
||||
* \param value Optional string value of the header to remove.
|
||||
* If NULL, remove all headers of given hdr_name.
|
||||
*/
|
||||
void ast_sip_remove_headers_by_name_and_value(pjsip_msg *msg, const pj_str_t *hdr_name, const char* value);
|
||||
|
||||
/*!
|
||||
* \brief Duplicate a security mechanism.
|
||||
*
|
||||
* \param dst Security mechanism to duplicate to.
|
||||
* \param src Security mechanism to duplicate.
|
||||
*/
|
||||
void ast_sip_security_mechanisms_vector_copy(struct ast_sip_security_mechanism_vector *dst,
|
||||
const struct ast_sip_security_mechanism_vector *src);
|
||||
|
||||
/*!
|
||||
* \brief Free contents of a security mechanism vector.
|
||||
*
|
||||
* \param security_mechanisms Vector whose contents are to be freed
|
||||
*/
|
||||
void ast_sip_security_mechanisms_vector_destroy(struct ast_sip_security_mechanism_vector *security_mechanisms);
|
||||
|
||||
/*!
|
||||
* \brief Allocate a security mechanism from a string.
|
||||
*
|
||||
* \param security_mechanism Pointer-pointer to the security mechanism to allocate.
|
||||
* \param value The security mechanism string as defined in RFC 3329 (section 2.2)
|
||||
* \param ... in the form <mechanism_name>;q=<q_value>;<mechanism_parameters>
|
||||
* \retval 0 Success
|
||||
* \retval non-zero Failure
|
||||
*/
|
||||
int ast_sip_str_to_security_mechanism(struct ast_sip_security_mechanism **security_mechanism, const char *value);
|
||||
|
||||
/*!
|
||||
* \brief Set the security negotiation based on a given string.
|
||||
*
|
||||
* \param security_negotiation Security negotiation enum to set.
|
||||
* \param val String that represents a security_negotiation value.
|
||||
* \retval 0 Success
|
||||
* \retval non-zero Failure
|
||||
*/
|
||||
int ast_sip_set_security_negotiation(enum ast_sip_security_negotiation *security_negotiation, const char *val);
|
||||
|
||||
/*!
|
||||
* \brief Initialize an auth vector with the configured values.
|
||||
*
|
||||
|
@ -3581,6 +3767,7 @@ enum ast_transport_monitor_reg {
|
|||
|
||||
/*!
|
||||
* \brief Register a reliable transport shutdown monitor callback.
|
||||
* \deprecated Replaced with ast_sip_transport_monitor_register_key().
|
||||
* \since 13.20.0
|
||||
*
|
||||
* \param transport Transport to monitor for shutdown.
|
||||
|
@ -3598,8 +3785,29 @@ enum ast_transport_monitor_reg {
|
|||
enum ast_transport_monitor_reg ast_sip_transport_monitor_register(pjsip_transport *transport,
|
||||
ast_transport_monitor_shutdown_cb cb, void *ao2_data);
|
||||
|
||||
/*!
|
||||
* \brief Register a reliable transport shutdown monitor callback.
|
||||
*
|
||||
* \param transport_key Key for the transport to monitor for shutdown.
|
||||
* Create the key with AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR.
|
||||
* \param cb Who to call when transport is shutdown.
|
||||
* \param ao2_data Data to pass with the callback.
|
||||
*
|
||||
* \note The data object passed will have its reference count automatically
|
||||
* incremented by this call and automatically decremented after the callback
|
||||
* runs or when the callback is unregistered.
|
||||
*
|
||||
* There is no checking for duplicate registrations.
|
||||
*
|
||||
* \return enum ast_transport_monitor_reg
|
||||
*/
|
||||
enum ast_transport_monitor_reg ast_sip_transport_monitor_register_key(
|
||||
const char *transport_key, ast_transport_monitor_shutdown_cb cb,
|
||||
void *ao2_data);
|
||||
|
||||
/*!
|
||||
* \brief Register a reliable transport shutdown monitor callback replacing any duplicate.
|
||||
* \deprecated Replaced with ast_sip_transport_monitor_register_replace_key().
|
||||
* \since 13.26.0
|
||||
* \since 16.3.0
|
||||
*
|
||||
|
@ -3621,8 +3829,32 @@ enum ast_transport_monitor_reg ast_sip_transport_monitor_register(pjsip_transpor
|
|||
enum ast_transport_monitor_reg ast_sip_transport_monitor_register_replace(pjsip_transport *transport,
|
||||
ast_transport_monitor_shutdown_cb cb, void *ao2_data, ast_transport_monitor_data_matcher matches);
|
||||
|
||||
/*!
|
||||
* \brief Register a reliable transport shutdown monitor callback replacing any duplicate.
|
||||
*
|
||||
* \param transport_key Key for the transport to monitor for shutdown.
|
||||
* Create the key with AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR.
|
||||
* \param cb Who to call when transport is shutdown.
|
||||
* \param ao2_data Data to pass with the callback.
|
||||
* \param matches Matcher function that returns true if data matches a previously
|
||||
* registered data object
|
||||
*
|
||||
* \note The data object passed will have its reference count automatically
|
||||
* incremented by this call and automatically decremented after the callback
|
||||
* runs or when the callback is unregistered.
|
||||
*
|
||||
* This function checks for duplicates, and overwrites/replaces the old monitor
|
||||
* with the given one.
|
||||
*
|
||||
* \return enum ast_transport_monitor_reg
|
||||
*/
|
||||
enum ast_transport_monitor_reg ast_sip_transport_monitor_register_replace_key(
|
||||
const char *transport_key, ast_transport_monitor_shutdown_cb cb,
|
||||
void *ao2_data, ast_transport_monitor_data_matcher matches);
|
||||
|
||||
/*!
|
||||
* \brief Unregister a reliable transport shutdown monitor
|
||||
* \deprecated Replaced with ast_sip_transport_monitor_unregister_key().
|
||||
* \since 13.20.0
|
||||
*
|
||||
* \param transport Transport to monitor for shutdown.
|
||||
|
@ -3638,6 +3870,23 @@ enum ast_transport_monitor_reg ast_sip_transport_monitor_register_replace(pjsip_
|
|||
void ast_sip_transport_monitor_unregister(pjsip_transport *transport,
|
||||
ast_transport_monitor_shutdown_cb cb, void *data, ast_transport_monitor_data_matcher matches);
|
||||
|
||||
/*!
|
||||
* \brief Unregister a reliable transport shutdown monitor
|
||||
*
|
||||
* \param transport_key Key for the transport to monitor for shutdown.
|
||||
* Create the key with AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR.
|
||||
* \param cb The callback that was used for the original register.
|
||||
* \param data Data to pass to the matcher. May be NULL and does NOT need to be an ao2 object.
|
||||
* If NULL, all monitors with the provided callback are unregistered.
|
||||
* \param matches Matcher function that returns true if data matches the previously
|
||||
* registered data object. If NULL, a simple pointer comparison is done.
|
||||
*
|
||||
* \note The data object passed into the original register will have its reference count
|
||||
* automatically decremented.
|
||||
*/
|
||||
void ast_sip_transport_monitor_unregister_key(const char *transport_key,
|
||||
ast_transport_monitor_shutdown_cb cb, void *data, ast_transport_monitor_data_matcher matches);
|
||||
|
||||
/*!
|
||||
* \brief Unregister a transport shutdown monitor from all reliable transports
|
||||
* \since 13.20.0
|
||||
|
@ -3677,4 +3926,72 @@ void ast_sip_transport_state_register(struct ast_sip_tpmgr_state_callback *eleme
|
|||
*/
|
||||
void ast_sip_transport_state_unregister(struct ast_sip_tpmgr_state_callback *element);
|
||||
|
||||
/*!
|
||||
* \brief Check whether a pjsip_uri is SIP/SIPS or not
|
||||
* \since 16.28.0
|
||||
*
|
||||
* \param uri The pjsip_uri to check
|
||||
*
|
||||
* \retval 1 if true
|
||||
* \retval 0 if false
|
||||
*/
|
||||
int ast_sip_is_uri_sip_sips(pjsip_uri *uri);
|
||||
|
||||
/*!
|
||||
* \brief Check whether a pjsip_uri is allowed or not
|
||||
* \since 16.28.0
|
||||
*
|
||||
* \param uri The pjsip_uri to check
|
||||
*
|
||||
* \retva; 1 if allowed
|
||||
* \retval 0 if not allowed
|
||||
*/
|
||||
int ast_sip_is_allowed_uri(pjsip_uri *uri);
|
||||
|
||||
/*!
|
||||
* \brief Get the user portion of the pjsip_uri
|
||||
* \since 16.28.0
|
||||
*
|
||||
* \param uri The pjsip_uri to get the user from
|
||||
*
|
||||
* \note This function will check what kind of URI it receives and return
|
||||
* the user based off of that
|
||||
*
|
||||
* \return User string or empty string if not present
|
||||
*/
|
||||
const pj_str_t *ast_sip_pjsip_uri_get_username(pjsip_uri *uri);
|
||||
|
||||
/*!
|
||||
* \brief Get the host portion of the pjsip_uri
|
||||
* \since 16.28.0
|
||||
*
|
||||
* \param uri The pjsip_uri to get the host from
|
||||
*
|
||||
* \note This function will check what kind of URI it receives and return
|
||||
* the host based off of that
|
||||
*
|
||||
* \return Host string or empty string if not present
|
||||
*/
|
||||
const pj_str_t *ast_sip_pjsip_uri_get_hostname(pjsip_uri *uri);
|
||||
|
||||
/*!
|
||||
* \brief Get the other_param portion of the pjsip_uri
|
||||
* \since 16.28.0
|
||||
*
|
||||
* \param uri The pjsip_uri to get hte other_param from
|
||||
*
|
||||
* \note This function will check what kind of URI it receives and return
|
||||
* the other_param based off of that
|
||||
*
|
||||
* \return other_param or NULL if not present
|
||||
*/
|
||||
struct pjsip_param *ast_sip_pjsip_uri_get_other_param(pjsip_uri *uri, const pj_str_t *param_str);
|
||||
|
||||
/*!
|
||||
* \brief Retrieve the system setting 'all_codecs_on_empty_reinvite'.
|
||||
*
|
||||
* \retval non zero if we should return all codecs on empty re-INVITE
|
||||
*/
|
||||
unsigned int ast_sip_get_all_codecs_on_empty_reinvite(void);
|
||||
|
||||
#endif /* _RES_PJSIP_H */
|
||||
|
|
|
@ -33,6 +33,8 @@
|
|||
/* Needed for pjmedia_sdp_session and pjsip_inv_session */
|
||||
#include <pjsip_ua.h>
|
||||
|
||||
/* Needed for ast_sip_security_mechanism_vector */
|
||||
#include "asterisk/res_pjsip.h"
|
||||
|
||||
/* Forward declarations */
|
||||
struct ast_sip_endpoint;
|
||||
|
|
|
@ -1719,7 +1719,7 @@ void ast_rtp_codecs_payload_formats(struct ast_rtp_codecs *codecs, struct ast_fo
|
|||
* Example usage:
|
||||
*
|
||||
* \code
|
||||
* int payload = ast_rtp_codecs_payload_code(&codecs, 1, ast_format_set(&tmp_fmt, AST_FORMAT_ULAW, 0), 0);
|
||||
* int payload = ast_rtp_codecs_payload_code(&codecs, 1, ast_format_ulaw, 0);
|
||||
* \endcode
|
||||
*
|
||||
* This looks for the numerical payload for ULAW in the codecs structure.
|
||||
|
@ -1788,7 +1788,7 @@ int ast_rtp_codecs_find_payload_code(struct ast_rtp_codecs *codecs, int payload)
|
|||
* Example usage:
|
||||
*
|
||||
* \code
|
||||
* const char *subtype = ast_rtp_lookup_mime_subtype2(1, ast_format_set(&tmp_fmt, AST_FORMAT_ULAW, 0), 0, 0);
|
||||
* const char *subtype = ast_rtp_lookup_mime_subtype2(1, ast_format_ulaw, 0, 0);
|
||||
* \endcode
|
||||
*
|
||||
* This looks up the mime subtype for the ULAW format.
|
||||
|
@ -1816,8 +1816,8 @@ const char *ast_rtp_lookup_mime_subtype2(const int asterisk_format,
|
|||
* char buf[256] = "";
|
||||
* struct ast_format tmp_fmt;
|
||||
* struct ast_format_cap *cap = ast_format_cap_alloc_nolock();
|
||||
* ast_format_cap_append(cap, ast_format_set(&tmp_fmt, AST_FORMAT_ULAW, 0));
|
||||
* ast_format_cap_append(cap, ast_format_set(&tmp_fmt, AST_FORMAT_GSM, 0));
|
||||
* ast_format_cap_append(cap, ast_format_ulaw, 0);
|
||||
* ast_format_cap_append(cap, ast_format_ulaw, 0);
|
||||
* char *mime = ast_rtp_lookup_mime_multiple2(&buf, sizeof(buf), cap, 0, 1, 0);
|
||||
* ast_format_cap_destroy(cap);
|
||||
* \endcode
|
||||
|
@ -2220,7 +2220,7 @@ char *ast_rtp_instance_get_quality(struct ast_rtp_instance *instance, enum ast_r
|
|||
*
|
||||
* \code
|
||||
* struct ast_format tmp_fmt;
|
||||
* ast_rtp_instance_set_read_format(instance, ast_format_set(&tmp_fmt, AST_FORMAT_ULAW, 0));
|
||||
* ast_rtp_instance_set_read_format(instance, ast_format_ulaw);
|
||||
* \endcode
|
||||
*
|
||||
* This requests that the RTP engine provide audio frames in the ULAW format.
|
||||
|
@ -2242,7 +2242,7 @@ int ast_rtp_instance_set_read_format(struct ast_rtp_instance *instance, struct a
|
|||
*
|
||||
* \code
|
||||
* struct ast_format tmp_fmt;
|
||||
* ast_rtp_instance_set_write_format(instance, ast_format_set(&tmp_fmt, AST_FORMAT_ULAW, 0));
|
||||
* ast_rtp_instance_set_write_format(instance, ast_format_ulaw);
|
||||
* \endcode
|
||||
*
|
||||
* This tells the underlying RTP engine that audio frames will be provided to it in ULAW format.
|
||||
|
|
|
@ -265,6 +265,7 @@ enum ast_strsep_flags {
|
|||
\param sep A single character delimiter.
|
||||
\param flags Controls post-processing of the result.
|
||||
AST_STRSEP_TRIM trims all leading and trailing whitespace from the result.
|
||||
If the result containes only whitespace, it'll be passed through unchanged.
|
||||
AST_STRSEP_STRIP does a trim then strips the outermost quotes. You may want
|
||||
to trim again after the strip. Just OR both the TRIM and STRIP flags.
|
||||
AST_STRSEP_UNESCAPE unescapes '\' sequences.
|
||||
|
@ -1370,7 +1371,6 @@ static force_inline char *ast_str_to_upper(char *str)
|
|||
* \return AO2 container for strings
|
||||
* \retval NULL if allocation failed
|
||||
*/
|
||||
//struct ao2_container *ast_str_container_alloc_options(enum ao2_container_opts opts, int buckets);
|
||||
struct ao2_container *ast_str_container_alloc_options(enum ao2_alloc_opts opts, int buckets);
|
||||
|
||||
/*!
|
||||
|
|
|
@ -208,6 +208,27 @@ enum ast_test_command {
|
|||
*/
|
||||
struct ast_test;
|
||||
|
||||
/*!
|
||||
* \brief A capture of running an external process.
|
||||
*
|
||||
* This contains a buffer holding stdout, another containing stderr,
|
||||
* the process id of the child, and its exit code.
|
||||
*/
|
||||
struct ast_test_capture {
|
||||
/*! \brief buffer holding stdout */
|
||||
char *outbuf;
|
||||
/*! \brief length of buffer holding stdout */
|
||||
size_t outlen;
|
||||
/*! \brief buffer holding stderr */
|
||||
char *errbuf;
|
||||
/*! \brief length of buffer holding stderr */
|
||||
size_t errlen;
|
||||
/*! \brief process id of child */
|
||||
pid_t pid;
|
||||
/*! \brief exit code of child */
|
||||
int exitcode;
|
||||
};
|
||||
|
||||
/*!
|
||||
* \brief Contains all the initialization information required to store a new test definition
|
||||
*/
|
||||
|
@ -417,5 +438,50 @@ int __ast_test_status_update(const char *file, const char *func, int line, struc
|
|||
} \
|
||||
})
|
||||
|
||||
/*!
|
||||
* \brief Initialize the capture structure.
|
||||
*
|
||||
* \since 16.30.0, 18.16.0, 19.8.0, 20.1.0
|
||||
*
|
||||
* \param capture The structure describing the child process and its
|
||||
* associated output.
|
||||
*/
|
||||
void ast_test_capture_init(struct ast_test_capture *capture);
|
||||
|
||||
/*!
|
||||
* \brief Release the storage (buffers) associated with capturing
|
||||
* the output of an external child process.
|
||||
*
|
||||
* \since 19.4.0
|
||||
*
|
||||
* \param capture The structure describing the child process and its
|
||||
* associated output.
|
||||
*/
|
||||
void ast_test_capture_free(struct ast_test_capture *capture);
|
||||
|
||||
/*!
|
||||
* \brief Run a child process and capture its output and exit code.
|
||||
*
|
||||
* \!since 19.4.0
|
||||
*
|
||||
* \param capture The structure describing the child process and its
|
||||
* associated output.
|
||||
*
|
||||
* \param file The name of the file to execute (uses $PATH to locate).
|
||||
*
|
||||
* \param argv The NULL-terminated array of arguments to pass to the
|
||||
* child process, starting with the command name itself.
|
||||
*
|
||||
* \param data The buffer of input to be sent to child process's stdin;
|
||||
* optional and may be NULL.
|
||||
*
|
||||
* \param datalen The length of the buffer, if not NULL, otherwise zero.
|
||||
*
|
||||
* \retval 1 for success
|
||||
* \retval other failure
|
||||
*/
|
||||
|
||||
int ast_test_capture_command(struct ast_test_capture *capture, const char *file, char *const argv[], const char *data, unsigned datalen);
|
||||
|
||||
#endif /* TEST_FRAMEWORK */
|
||||
#endif /* _AST_TEST_H */
|
||||
|
|
|
@ -1105,4 +1105,14 @@ int ast_thread_user_interface_set(int is_user_interface);
|
|||
*/
|
||||
int ast_thread_is_user_interface(void);
|
||||
|
||||
/*!
|
||||
* \brief Test for the presence of an executable command in $PATH
|
||||
*
|
||||
* \param cmd Name of command to locate.
|
||||
*
|
||||
* \retval True (non-zero) if command is in $PATH.
|
||||
* \retval False (zero) command not found.
|
||||
*/
|
||||
int ast_check_command_in_path(const char *cmd);
|
||||
|
||||
#endif /* _ASTERISK_UTILS_H */
|
||||
|
|
|
@ -163,6 +163,7 @@ void ast_xml_free_text(const char *text);
|
|||
* \param attrname Attribute name.
|
||||
* \retval NULL on error
|
||||
* \return The attribute value on success.
|
||||
* \note The result must be freed with ast_xml_free_attr().
|
||||
*/
|
||||
const char *ast_xml_get_attribute(struct ast_xml_node *node, const char *attrname);
|
||||
|
||||
|
|
|
@ -167,6 +167,9 @@ lock.o: _ASTCFLAGS+=$(call get_menuselect_cflags,DETECT_DEADLOCKS)
|
|||
options.o: _ASTCFLAGS+=$(call get_menuselect_cflags,REF_DEBUG)
|
||||
sched.o: _ASTCFLAGS+=$(call get_menuselect_cflags,DEBUG_SCHEDULER DUMP_SCHEDULER)
|
||||
tcptls.o: _ASTCFLAGS+=$(OPENSSL_INCLUDE) -Wno-deprecated-declarations
|
||||
# since we're using open_memstream(), we need to release the buffer with
|
||||
# the native free() function or we might get unexpected behavior.
|
||||
test.o: _ASTCFLAGS+=-DASTMM_LIBC=ASTMM_IGNORE
|
||||
uuid.o: _ASTCFLAGS+=$(UUID_INCLUDE)
|
||||
stasis.o: _ASTCFLAGS+=$(call get_menuselect_cflags,AO2_DEBUG)
|
||||
time.o: _ASTCFLAGS+=-D_XOPEN_SOURCE=700
|
||||
|
|
|
@ -4269,6 +4269,7 @@ static void asterisk_daemon(int isroot, const char *runuser, const char *rungrou
|
|||
|
||||
/* loads the cli_permissions.conf file needed to implement cli restrictions. */
|
||||
ast_cli_perms_init(0);
|
||||
ast_cli_channels_init(); /* Not always safe to access CLI commands until startup is complete. */
|
||||
|
||||
ast_stun_init();
|
||||
|
||||
|
|
|
@ -109,6 +109,9 @@ int ast_audiohook_init(struct ast_audiohook *audiohook, enum ast_audiohook_type
|
|||
|
||||
audiohook->init_flags = init_flags;
|
||||
|
||||
/* Set direction to BOTH so that we feed frames in both directions */
|
||||
audiohook->direction = AST_AUDIOHOOK_DIRECTION_BOTH;
|
||||
|
||||
/* initialize internal rate at 8khz, this will adjust if necessary */
|
||||
audiohook_set_internal_rate(audiohook, DEFAULT_INTERNAL_SAMPLE_RATE, 0);
|
||||
|
||||
|
@ -144,6 +147,18 @@ int ast_audiohook_destroy(struct ast_audiohook *audiohook)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int ast_audiohook_set_frame_feed_direction(struct ast_audiohook *audiohook, enum ast_audiohook_direction direction)
|
||||
{
|
||||
/* Only set the direction on new audiohooks */
|
||||
if (audiohook->status != AST_AUDIOHOOK_STATUS_NEW) {
|
||||
ast_debug(3, "Can not set direction on attached Audiohook %p\n", audiohook);
|
||||
return -1;
|
||||
}
|
||||
|
||||
audiohook->direction = direction;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define SHOULD_MUTE(hook, dir) \
|
||||
((ast_test_flag(hook, AST_AUDIOHOOK_MUTE_READ) && (dir == AST_AUDIOHOOK_DIRECTION_READ)) || \
|
||||
(ast_test_flag(hook, AST_AUDIOHOOK_MUTE_WRITE) && (dir == AST_AUDIOHOOK_DIRECTION_WRITE)) || \
|
||||
|
@ -159,6 +174,13 @@ int ast_audiohook_write_frame(struct ast_audiohook *audiohook, enum ast_audiohoo
|
|||
int other_factory_samples;
|
||||
int other_factory_ms;
|
||||
|
||||
/* Don't feed the frame if we are set to read and this is a write frame or if set to
|
||||
write and this is a read frame as we don't want it. Plus, it can cause mis-resampling
|
||||
if the READ and WRITE frames have different bitrates */
|
||||
if (audiohook->direction != AST_AUDIOHOOK_DIRECTION_BOTH && audiohook->direction != direction) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Update last feeding time to be current */
|
||||
*rwtime = ast_tvnow();
|
||||
|
||||
|
|
|
@ -1397,6 +1397,27 @@ static const char *get_transfer_context(struct ast_channel *transferer, const ch
|
|||
return "default";
|
||||
}
|
||||
|
||||
/*!
|
||||
* \internal
|
||||
* \brief Determine the transfer extension to use.
|
||||
*
|
||||
* \param transferer Channel initiating the transfer.
|
||||
* \param extension User supplied extension if available. May be NULL.
|
||||
*
|
||||
* \return The extension to use for the transfer.
|
||||
*/
|
||||
static const char *get_transfer_exten(struct ast_channel *transferer, const char *exten)
|
||||
{
|
||||
if (!ast_strlen_zero(exten)) {
|
||||
return exten;
|
||||
}
|
||||
exten = pbx_builtin_getvar_helper(transferer, "TRANSFER_EXTEN");
|
||||
if (!ast_strlen_zero(exten)) {
|
||||
return exten;
|
||||
}
|
||||
return ""; /* empty default, to get transfer extension from user now */
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Allocate and initialize attended transfer properties
|
||||
*
|
||||
|
@ -3162,10 +3183,25 @@ static int grab_transfer(struct ast_channel *chan, char *exten, size_t exten_len
|
|||
int attempts = 0;
|
||||
int max_attempts;
|
||||
struct ast_features_xfer_config *xfer_cfg;
|
||||
char *retry_sound;
|
||||
char *invalid_sound;
|
||||
char *announce_sound, *retry_sound, *invalid_sound;
|
||||
const char *extenoverride;
|
||||
|
||||
ast_channel_lock(chan);
|
||||
extenoverride = get_transfer_exten(chan, NULL);
|
||||
|
||||
if (!ast_strlen_zero(extenoverride)) {
|
||||
int extenres = ast_exists_extension(chan, context, extenoverride, 1,
|
||||
S_COR(ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, NULL)) ? 1 : 0;
|
||||
if (extenres) {
|
||||
ast_copy_string(exten, extenoverride, exten_len);
|
||||
ast_channel_unlock(chan);
|
||||
ast_verb(3, "Transfering call to '%s@%s'", exten, context);
|
||||
return 0;
|
||||
}
|
||||
ast_log(LOG_WARNING, "Override extension '%s' does not exist in context '%s'\n", extenoverride, context);
|
||||
/* since we didn't get a valid extension from the channel, fall back and grab it from the user as usual now */
|
||||
}
|
||||
|
||||
xfer_cfg = ast_get_chan_features_xfer_config(chan);
|
||||
if (!xfer_cfg) {
|
||||
ast_log(LOG_ERROR, "Channel %s: Unable to get transfer configuration\n",
|
||||
|
@ -3175,21 +3211,24 @@ static int grab_transfer(struct ast_channel *chan, char *exten, size_t exten_len
|
|||
}
|
||||
digit_timeout = xfer_cfg->transferdigittimeout * 1000;
|
||||
max_attempts = xfer_cfg->transferdialattempts;
|
||||
announce_sound = ast_strdupa(xfer_cfg->transferannouncesound);
|
||||
retry_sound = ast_strdupa(xfer_cfg->transferretrysound);
|
||||
invalid_sound = ast_strdupa(xfer_cfg->transferinvalidsound);
|
||||
ao2_ref(xfer_cfg, -1);
|
||||
ast_channel_unlock(chan);
|
||||
|
||||
/* Play the simple "transfer" prompt out and wait */
|
||||
res = ast_stream_and_wait(chan, "pbx-transfer", AST_DIGIT_ANY);
|
||||
ast_stopstream(chan);
|
||||
if (res < 0) {
|
||||
/* Hangup or error */
|
||||
return -1;
|
||||
}
|
||||
if (res) {
|
||||
/* Store the DTMF digit that interrupted playback of the file. */
|
||||
exten[0] = res;
|
||||
if (!ast_strlen_zero(announce_sound)) {
|
||||
res = ast_stream_and_wait(chan, announce_sound, AST_DIGIT_ANY);
|
||||
ast_stopstream(chan);
|
||||
if (res < 0) {
|
||||
/* Hangup or error */
|
||||
return -1;
|
||||
}
|
||||
if (res) {
|
||||
/* Store the DTMF digit that interrupted playback of the file. */
|
||||
exten[0] = res;
|
||||
}
|
||||
}
|
||||
|
||||
/* Drop to dialtone so they can enter the extension they want to transfer to */
|
||||
|
|
86
main/cdr.c
86
main/cdr.c
|
@ -111,6 +111,29 @@
|
|||
to undisable (enable) CDR for a call.</para>
|
||||
</description>
|
||||
</configOption>
|
||||
<configOption name="ignorestatechanges" default="no">
|
||||
<synopsis>Whether CDR is updated or forked by bridging changes.</synopsis>
|
||||
<description><para>Define whether or not CDR should be updated by bridging changes.
|
||||
This includes entering and leaving bridges and call parking.</para>
|
||||
<para>If this is set to "no", bridging changes will be ignored for all CDRs.
|
||||
This should only be done if these events should not affect CDRs and are undesired,
|
||||
such as to use a single CDR for the lifetime of the channel.</para>
|
||||
<para>This setting cannot be changed on a reload.</para>
|
||||
</description>
|
||||
</configOption>
|
||||
<configOption name="ignoredialchanges" default="no">
|
||||
<synopsis>Whether CDR is updated or forked by dial updates.</synopsis>
|
||||
<description><para>Define whether or not CDR should be updated by dial updates.</para>
|
||||
<para>If this is set to "no", a single CDR will be used for the channel, even if
|
||||
multiple endpoints or destinations are dialed sequentially. Note that you will also
|
||||
lose detailed nonanswer dial dispositions if this option is enabled, which may not be acceptable,
|
||||
e.g. instead of detailed no-answer dispositions like BUSY and CONGESTION, the disposition
|
||||
will always be NO ANSWER if the channel was unanswered (it will still be ANSWERED
|
||||
if the channel was answered).</para>
|
||||
<para>This option should be enabled if a single CDR is desired for the lifetime of
|
||||
the channel.</para>
|
||||
</description>
|
||||
</configOption>
|
||||
<configOption name="unanswered">
|
||||
<synopsis>Log calls that are never answered and don't set an outgoing party.</synopsis>
|
||||
<description><para>
|
||||
|
@ -208,6 +231,8 @@
|
|||
#define DEFAULT_END_BEFORE_H_EXTEN "1"
|
||||
#define DEFAULT_INITIATED_SECONDS "0"
|
||||
#define DEFAULT_CHANNEL_ENABLED "1"
|
||||
#define DEFAULT_IGNORE_STATE_CHANGES "0"
|
||||
#define DEFAULT_IGNORE_DIAL_CHANGES "0"
|
||||
|
||||
#define DEFAULT_BATCH_SIZE "100"
|
||||
#define MAX_BATCH_SIZE 1000
|
||||
|
@ -222,6 +247,7 @@
|
|||
} while (0)
|
||||
|
||||
static int cdr_debug_enabled;
|
||||
static int dial_changes_ignored;
|
||||
|
||||
#define CDR_DEBUG(fmt, ...) \
|
||||
do { \
|
||||
|
@ -2170,6 +2196,10 @@ static void handle_dial_message(void *data, struct stasis_subscription *sub, str
|
|||
if (!it_cdr->fn_table->process_dial_begin) {
|
||||
continue;
|
||||
}
|
||||
if (dial_changes_ignored) {
|
||||
CDR_DEBUG("%p - Ignoring Dial Begin message\n", it_cdr);
|
||||
continue;
|
||||
}
|
||||
CDR_DEBUG("%p - Processing Dial Begin message for channel %s, peer %s\n",
|
||||
it_cdr,
|
||||
caller ? caller->base->name : "(none)",
|
||||
|
@ -2181,6 +2211,12 @@ static void handle_dial_message(void *data, struct stasis_subscription *sub, str
|
|||
if (!it_cdr->fn_table->process_dial_end) {
|
||||
continue;
|
||||
}
|
||||
if (dial_changes_ignored) {
|
||||
/* Set the disposition, and do nothing else. */
|
||||
it_cdr->disposition = dial_status_to_disposition(dial_status);
|
||||
CDR_DEBUG("%p - Setting disposition and that's it (%s)\n", it_cdr, dial_status);
|
||||
continue;
|
||||
}
|
||||
CDR_DEBUG("%p - Processing Dial End message for channel %s, peer %s\n",
|
||||
it_cdr,
|
||||
caller ? caller->base->name : "(none)",
|
||||
|
@ -2192,15 +2228,19 @@ static void handle_dial_message(void *data, struct stasis_subscription *sub, str
|
|||
}
|
||||
}
|
||||
|
||||
/* If no CDR handled a dial begin message, make a new one */
|
||||
if (res && ast_strlen_zero(dial_status)) {
|
||||
struct cdr_object *new_cdr;
|
||||
/* If we're ignoring dial changes, don't allow multiple CDRs for this channel. */
|
||||
if (!dial_changes_ignored) {
|
||||
/* If no CDR handled a dial begin message, make a new one */
|
||||
if (res && ast_strlen_zero(dial_status)) {
|
||||
struct cdr_object *new_cdr;
|
||||
|
||||
new_cdr = cdr_object_create_and_append(cdr, stasis_message_timestamp(message));
|
||||
if (new_cdr) {
|
||||
new_cdr->fn_table->process_dial_begin(new_cdr, caller, peer);
|
||||
new_cdr = cdr_object_create_and_append(cdr, stasis_message_timestamp(message));
|
||||
if (new_cdr) {
|
||||
new_cdr->fn_table->process_dial_begin(new_cdr, caller, peer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ao2_unlock(cdr);
|
||||
ao2_cleanup(cdr);
|
||||
}
|
||||
|
@ -4200,6 +4240,8 @@ static char *handle_cli_status(struct ast_cli_entry *e, int cmd, struct ast_cli_
|
|||
ast_cli(a->fd, " Log calls by default: %s\n", ast_test_flag(&mod_cfg->general->settings, CDR_CHANNEL_DEFAULT_ENABLED) ? "Yes" : "No");
|
||||
ast_cli(a->fd, " Log unanswered calls: %s\n", ast_test_flag(&mod_cfg->general->settings, CDR_UNANSWERED) ? "Yes" : "No");
|
||||
ast_cli(a->fd, " Log congestion: %s\n\n", ast_test_flag(&mod_cfg->general->settings, CDR_CONGESTION) ? "Yes" : "No");
|
||||
ast_cli(a->fd, " Ignore bridging changes: %s\n\n", ast_test_flag(&mod_cfg->general->settings, CDR_IGNORE_STATE_CHANGES) ? "Yes" : "No");
|
||||
ast_cli(a->fd, " Ignore dial state changes: %s\n\n", ast_test_flag(&mod_cfg->general->settings, CDR_IGNORE_DIAL_CHANGES) ? "Yes" : "No");
|
||||
if (ast_test_flag(&mod_cfg->general->settings, CDR_BATCHMODE)) {
|
||||
ast_cli(a->fd, "* Batch Mode Settings\n");
|
||||
ast_cli(a->fd, " -------------------\n");
|
||||
|
@ -4379,6 +4421,8 @@ static int process_config(int reload)
|
|||
aco_option_register(&cfg_info, "size", ACO_EXACT, general_options, DEFAULT_BATCH_SIZE, OPT_UINT_T, PARSE_IN_RANGE, FLDSET(struct ast_cdr_config, batch_settings.size), 0, MAX_BATCH_SIZE);
|
||||
aco_option_register(&cfg_info, "time", ACO_EXACT, general_options, DEFAULT_BATCH_TIME, OPT_UINT_T, PARSE_IN_RANGE, FLDSET(struct ast_cdr_config, batch_settings.time), 1, MAX_BATCH_TIME);
|
||||
aco_option_register(&cfg_info, "channeldefaultenabled", ACO_EXACT, general_options, DEFAULT_CHANNEL_ENABLED, OPT_BOOLFLAG_T, 1, FLDSET(struct ast_cdr_config, settings), CDR_CHANNEL_DEFAULT_ENABLED);
|
||||
aco_option_register(&cfg_info, "ignorestatechanges", ACO_EXACT, general_options, DEFAULT_IGNORE_STATE_CHANGES, OPT_BOOLFLAG_T, 1, FLDSET(struct ast_cdr_config, settings), CDR_IGNORE_STATE_CHANGES);
|
||||
aco_option_register(&cfg_info, "ignoredialchanges", ACO_EXACT, general_options, DEFAULT_IGNORE_DIAL_CHANGES, OPT_BOOLFLAG_T, 1, FLDSET(struct ast_cdr_config, settings), CDR_IGNORE_DIAL_CHANGES);
|
||||
}
|
||||
|
||||
if (aco_process_config(&cfg_info, reload) == ACO_PROCESS_ERROR) {
|
||||
|
@ -4541,6 +4585,7 @@ static int unload_module(void)
|
|||
|
||||
static int load_module(void)
|
||||
{
|
||||
struct module_config *mod_cfg = NULL;
|
||||
if (process_config(0)) {
|
||||
return AST_MODULE_LOAD_FAILURE;
|
||||
}
|
||||
|
@ -4561,13 +4606,36 @@ static int load_module(void)
|
|||
return AST_MODULE_LOAD_FAILURE;
|
||||
}
|
||||
|
||||
mod_cfg = ao2_global_obj_ref(module_configs);
|
||||
|
||||
stasis_message_router_add(stasis_router, ast_channel_snapshot_type(), handle_channel_snapshot_update_message, NULL);
|
||||
|
||||
/* Always process dial messages, because even if we ignore most of it, we do want the dial status for the disposition. */
|
||||
stasis_message_router_add(stasis_router, ast_channel_dial_type(), handle_dial_message, NULL);
|
||||
stasis_message_router_add(stasis_router, ast_channel_entered_bridge_type(), handle_bridge_enter_message, NULL);
|
||||
stasis_message_router_add(stasis_router, ast_channel_left_bridge_type(), handle_bridge_leave_message, NULL);
|
||||
stasis_message_router_add(stasis_router, ast_parked_call_type(), handle_parked_call_message, NULL);
|
||||
if (!mod_cfg || !ast_test_flag(&mod_cfg->general->settings, CDR_IGNORE_DIAL_CHANGES)) {
|
||||
dial_changes_ignored = 0;
|
||||
} else {
|
||||
dial_changes_ignored = 1;
|
||||
CDR_DEBUG("Dial messages will be mostly ignored\n");
|
||||
}
|
||||
|
||||
/* If explicitly instructed to ignore call state changes, then ignore bridging events, parking, etc. */
|
||||
if (!mod_cfg || !ast_test_flag(&mod_cfg->general->settings, CDR_IGNORE_STATE_CHANGES)) {
|
||||
stasis_message_router_add(stasis_router, ast_channel_entered_bridge_type(), handle_bridge_enter_message, NULL);
|
||||
stasis_message_router_add(stasis_router, ast_channel_left_bridge_type(), handle_bridge_leave_message, NULL);
|
||||
stasis_message_router_add(stasis_router, ast_parked_call_type(), handle_parked_call_message, NULL);
|
||||
} else {
|
||||
CDR_DEBUG("All bridge and parking messages will be ignored\n");
|
||||
}
|
||||
|
||||
stasis_message_router_add(stasis_router, cdr_sync_message_type(), handle_cdr_sync_message, NULL);
|
||||
|
||||
if (mod_cfg) {
|
||||
ao2_cleanup(mod_cfg);
|
||||
} else {
|
||||
ast_log(LOG_WARNING, "Unable to obtain CDR configuration during module load?\n");
|
||||
}
|
||||
|
||||
active_cdrs_master = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,
|
||||
AST_NUM_CHANNEL_BUCKETS, cdr_master_hash_fn, NULL, cdr_master_cmp_fn);
|
||||
if (!active_cdrs_master) {
|
||||
|
|
|
@ -11163,15 +11163,6 @@ int ast_channel_request_stream_topology_change(struct ast_channel *chan,
|
|||
return -1;
|
||||
}
|
||||
|
||||
if (ast_stream_topology_equal(ast_channel_get_stream_topology(chan), topology)) {
|
||||
ast_debug(2, "%s: Topologies already match. Current: %s Requested: %s\n",
|
||||
ast_channel_name(chan),
|
||||
ast_str_tmp(256, ast_stream_topology_to_str(ast_channel_get_stream_topology(chan), &STR_TMP)),
|
||||
ast_str_tmp(256, ast_stream_topology_to_str(topology, &STR_TMP)));
|
||||
ast_channel_unlock(chan);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ast_channel_internal_set_stream_topology_change_source(chan, change_source);
|
||||
|
||||
res = ast_channel_tech(chan)->indicate(chan, AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE, topology, sizeof(topology));
|
||||
|
|
|
@ -1283,7 +1283,8 @@ struct ast_flags *ast_channel_flags(struct ast_channel *chan)
|
|||
return &chan->flags;
|
||||
}
|
||||
|
||||
static int collect_names_cb(void *obj, void *arg, int flags) {
|
||||
static int collect_names_cb(void *obj, void *arg, int flags)
|
||||
{
|
||||
struct ast_control_pvt_cause_code *cause_code = obj;
|
||||
struct ast_str **str = arg;
|
||||
|
||||
|
|
44
main/cli.c
44
main/cli.c
|
@ -2016,50 +2016,27 @@ static char *handle_help(struct ast_cli_entry *e, int cmd, struct ast_cli_args *
|
|||
static struct ast_cli_entry cli_cli[] = {
|
||||
AST_CLI_DEFINE(handle_commandmatchesarray, "Returns command matches array"),
|
||||
|
||||
AST_CLI_DEFINE(handle_nodebugchan_deprecated, "Disable debugging on channel(s)"),
|
||||
|
||||
AST_CLI_DEFINE(handle_chanlist, "Display information on channels"),
|
||||
|
||||
AST_CLI_DEFINE(handle_showcalls, "Display information on calls"),
|
||||
|
||||
AST_CLI_DEFINE(handle_showchan, "Display information on a specific channel"),
|
||||
|
||||
AST_CLI_DEFINE(handle_core_set_debug_channel, "Enable/disable debugging on a channel"),
|
||||
|
||||
AST_CLI_DEFINE(handle_debug_category, "Enable/disable debugging categories"),
|
||||
|
||||
AST_CLI_DEFINE(handle_debug, "Set level of debug chattiness"),
|
||||
AST_CLI_DEFINE(handle_trace, "Set level of trace chattiness"),
|
||||
AST_CLI_DEFINE(handle_verbose, "Set level of verbose chattiness"),
|
||||
|
||||
AST_CLI_DEFINE(group_show_channels, "Display active channels with group(s)"),
|
||||
|
||||
AST_CLI_DEFINE(handle_help, "Display help list, or specific help on a command"),
|
||||
|
||||
AST_CLI_DEFINE(handle_logger_mute, "Toggle logging output to a console"),
|
||||
|
||||
AST_CLI_DEFINE(handle_modlist, "List modules and info"),
|
||||
|
||||
AST_CLI_DEFINE(handle_load, "Load a module by name"),
|
||||
|
||||
AST_CLI_DEFINE(handle_reload, "Reload configuration for a module"),
|
||||
|
||||
AST_CLI_DEFINE(handle_core_reload, "Global reload"),
|
||||
|
||||
AST_CLI_DEFINE(handle_unload, "Unload a module by name"),
|
||||
|
||||
AST_CLI_DEFINE(handle_refresh, "Completely unloads and loads a module by name"),
|
||||
|
||||
AST_CLI_DEFINE(handle_showuptime, "Show uptime information"),
|
||||
|
||||
AST_CLI_DEFINE(handle_softhangup, "Request a hangup on a given channel"),
|
||||
|
||||
AST_CLI_DEFINE(handle_cli_reload_permissions, "Reload CLI permissions config"),
|
||||
|
||||
AST_CLI_DEFINE(handle_cli_show_permissions, "Show CLI permissions"),
|
||||
|
||||
AST_CLI_DEFINE(handle_cli_check_permissions, "Try a permissions config for a user"),
|
||||
|
||||
AST_CLI_DEFINE(handle_cli_wait_fullybooted, "Wait for Asterisk to be fully booted"),
|
||||
|
||||
#ifdef HAVE_MALLOC_TRIM
|
||||
|
@ -2068,6 +2045,16 @@ static struct ast_cli_entry cli_cli[] = {
|
|||
|
||||
};
|
||||
|
||||
static struct ast_cli_entry cli_channels_cli[] = {
|
||||
AST_CLI_DEFINE(handle_nodebugchan_deprecated, "Disable debugging on channel(s)"),
|
||||
AST_CLI_DEFINE(handle_chanlist, "Display information on channels"),
|
||||
AST_CLI_DEFINE(handle_showcalls, "Display information on calls"),
|
||||
AST_CLI_DEFINE(handle_showchan, "Display information on a specific channel"),
|
||||
AST_CLI_DEFINE(handle_core_set_debug_channel, "Enable/disable debugging on a channel"),
|
||||
AST_CLI_DEFINE(group_show_channels, "Display active channels with group(s)"),
|
||||
AST_CLI_DEFINE(handle_softhangup, "Request a hangup on a given channel"),
|
||||
};
|
||||
|
||||
/*!
|
||||
* Some regexp characters in cli arguments are reserved and used as separators.
|
||||
*/
|
||||
|
@ -2239,6 +2226,11 @@ static void cli_shutdown(void)
|
|||
ast_cli_unregister_multiple(cli_cli, ARRAY_LEN(cli_cli));
|
||||
}
|
||||
|
||||
static void cli_channels_shutdown(void)
|
||||
{
|
||||
ast_cli_unregister_multiple(cli_channels_cli, ARRAY_LEN(cli_channels_cli));
|
||||
}
|
||||
|
||||
/*! \brief initialize the _full_cmd string in * each of the builtins. */
|
||||
void ast_builtins_init(void)
|
||||
{
|
||||
|
@ -2247,6 +2239,12 @@ void ast_builtins_init(void)
|
|||
ast_register_cleanup(cli_shutdown);
|
||||
}
|
||||
|
||||
void ast_cli_channels_init(void)
|
||||
{
|
||||
ast_cli_register_multiple(cli_channels_cli, ARRAY_LEN(cli_channels_cli));
|
||||
ast_register_cleanup(cli_channels_shutdown);
|
||||
}
|
||||
|
||||
/*!
|
||||
* match a word in the CLI entry.
|
||||
* returns -1 on mismatch, 0 on match of an optional word,
|
||||
|
|
|
@ -646,15 +646,16 @@ struct ast_variable *ast_variable_list_sort(struct ast_variable *start)
|
|||
struct ast_variable *ast_variable_list_append_hint(struct ast_variable **head, struct ast_variable *search_hint, struct ast_variable *newvar)
|
||||
{
|
||||
struct ast_variable *curr;
|
||||
struct ast_variable *sh = search_hint;
|
||||
ast_assert(head != NULL);
|
||||
|
||||
if (!*head) {
|
||||
*head = newvar;
|
||||
} else {
|
||||
if (search_hint == NULL) {
|
||||
search_hint = *head;
|
||||
if (sh == NULL) {
|
||||
sh = *head;
|
||||
}
|
||||
for (curr = search_hint; curr->next; curr = curr->next);
|
||||
for (curr = sh; curr->next; curr = curr->next);
|
||||
curr->next = newvar;
|
||||
}
|
||||
|
||||
|
@ -752,12 +753,8 @@ struct ast_variable *ast_variable_list_from_quoted_string(const char *input, con
|
|||
}
|
||||
|
||||
item_value = ast_strsep_quoted(&item, nv_sep, quote, AST_STRSEP_ALL);
|
||||
if (!item_value) {
|
||||
ast_variables_destroy(new_list);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
new_var = ast_variable_new(item_name, item_value, "");
|
||||
new_var = ast_variable_new(item_name, item_value ?: "", "");
|
||||
if (!new_var) {
|
||||
ast_variables_destroy(new_list);
|
||||
return NULL;
|
||||
|
|
|
@ -1099,7 +1099,9 @@ static int xmldoc_update_config_type(const char *module, const char *name, const
|
|||
}
|
||||
|
||||
if (!(results = ast_xmldoc_query("/docs/configInfo[@name='%s']/configFile/configObject[@name='%s']", module, name))) {
|
||||
ast_log(LOG_WARNING, "Cannot update type '%s' in module '%s' because it has no existing documentation!\n", name, module);
|
||||
ast_log(LOG_WARNING, "Cannot update type '%s' in module '%s' because it has no existing documentation!"
|
||||
" If this module was recently built, run 'xmldoc reload' to refresh documentation, then load the module again\n",
|
||||
name, module);
|
||||
return XMLDOC_STRICT ? -1 : 0;
|
||||
}
|
||||
|
||||
|
|
80
main/db.c
80
main/db.c
|
@ -65,6 +65,18 @@
|
|||
<description>
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="DBGetTree" language="en_US">
|
||||
<synopsis>
|
||||
Get DB entries, optionally at a particular family/key
|
||||
</synopsis>
|
||||
<syntax>
|
||||
<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
|
||||
<parameter name="Family" required="false" />
|
||||
<parameter name="Key" required="false" />
|
||||
</syntax>
|
||||
<description>
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="DBPut" language="en_US">
|
||||
<synopsis>
|
||||
Put DB entry.
|
||||
|
@ -979,6 +991,72 @@ static int manager_dbget(struct mansession *s, const struct message *m)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int manager_db_tree_get(struct mansession *s, const struct message *m)
|
||||
{
|
||||
char prefix[MAX_DB_FIELD];
|
||||
char idText[256];
|
||||
const char *id = astman_get_header(m,"ActionID");
|
||||
const char *family = astman_get_header(m, "Family");
|
||||
const char *key = astman_get_header(m, "Key");
|
||||
sqlite3_stmt *stmt = gettree_stmt;
|
||||
int count = 0;
|
||||
|
||||
if (!ast_strlen_zero(family) && !ast_strlen_zero(key)) {
|
||||
/* Family and key tree */
|
||||
snprintf(prefix, sizeof(prefix), "/%s/%s", family, key);
|
||||
} else if (!ast_strlen_zero(family)) {
|
||||
/* Family only */
|
||||
snprintf(prefix, sizeof(prefix), "/%s", family);
|
||||
} else {
|
||||
/* Neither */
|
||||
prefix[0] = '\0';
|
||||
stmt = gettree_all_stmt;
|
||||
}
|
||||
|
||||
idText[0] = '\0';
|
||||
if (!ast_strlen_zero(id)) {
|
||||
snprintf(idText, sizeof(idText) ,"ActionID: %s\r\n", id);
|
||||
}
|
||||
|
||||
ast_mutex_lock(&dblock);
|
||||
if (!ast_strlen_zero(prefix) && (sqlite3_bind_text(stmt, 1, prefix, -1, SQLITE_STATIC) != SQLITE_OK)) {
|
||||
ast_log(LOG_WARNING, "Couldn't bind %s to stmt: %s\n", prefix, sqlite3_errmsg(astdb));
|
||||
sqlite3_reset(stmt);
|
||||
ast_mutex_unlock(&dblock);
|
||||
astman_send_error(s, m, "Unable to search database");
|
||||
return 0;
|
||||
}
|
||||
|
||||
astman_send_listack(s, m, "Result will follow", "start");
|
||||
|
||||
while (sqlite3_step(stmt) == SQLITE_ROW) {
|
||||
const char *key_s, *value_s;
|
||||
if (!(key_s = (const char *) sqlite3_column_text(stmt, 0))) {
|
||||
ast_log(LOG_WARNING, "Skipping invalid key!\n");
|
||||
continue;
|
||||
}
|
||||
if (!(value_s = (const char *) sqlite3_column_text(stmt, 1))) {
|
||||
ast_log(LOG_WARNING, "Skipping invalid value!\n");
|
||||
continue;
|
||||
}
|
||||
astman_append(s, "Event: DBGetTreeResponse\r\n"
|
||||
"Key: %s\r\n"
|
||||
"Val: %s\r\n"
|
||||
"%s"
|
||||
"\r\n",
|
||||
key_s, value_s, idText);
|
||||
count++;
|
||||
}
|
||||
|
||||
sqlite3_reset(stmt);
|
||||
ast_mutex_unlock(&dblock);
|
||||
|
||||
astman_send_list_complete_start(s, m, "DBGetTreeComplete", count);
|
||||
astman_send_list_complete_end(s);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int manager_dbdel(struct mansession *s, const struct message *m)
|
||||
{
|
||||
const char *family = astman_get_header(m, "Family");
|
||||
|
@ -1091,6 +1169,7 @@ static void astdb_atexit(void)
|
|||
{
|
||||
ast_cli_unregister_multiple(cli_database, ARRAY_LEN(cli_database));
|
||||
ast_manager_unregister("DBGet");
|
||||
ast_manager_unregister("DBGetTree");
|
||||
ast_manager_unregister("DBPut");
|
||||
ast_manager_unregister("DBDel");
|
||||
ast_manager_unregister("DBDelTree");
|
||||
|
@ -1126,6 +1205,7 @@ int astdb_init(void)
|
|||
ast_register_atexit(astdb_atexit);
|
||||
ast_cli_register_multiple(cli_database, ARRAY_LEN(cli_database));
|
||||
ast_manager_register_xml_core("DBGet", EVENT_FLAG_SYSTEM | EVENT_FLAG_REPORTING, manager_dbget);
|
||||
ast_manager_register_xml_core("DBGetTree", EVENT_FLAG_SYSTEM | EVENT_FLAG_REPORTING, manager_db_tree_get);
|
||||
ast_manager_register_xml_core("DBPut", EVENT_FLAG_SYSTEM, manager_dbput);
|
||||
ast_manager_register_xml_core("DBDel", EVENT_FLAG_SYSTEM, manager_dbdel);
|
||||
ast_manager_register_xml_core("DBDelTree", EVENT_FLAG_SYSTEM, manager_dbdeltree);
|
||||
|
|
|
@ -1043,8 +1043,17 @@ enum ast_dial_result ast_dial_join(struct ast_dial *dial)
|
|||
ast_channel_unlock(chan);
|
||||
}
|
||||
} else {
|
||||
struct ast_dial_channel *channel = NULL;
|
||||
|
||||
/* Now we signal it with SIGURG so it will break out of it's waitfor */
|
||||
pthread_kill(thread, SIGURG);
|
||||
|
||||
/* pthread_kill may not be enough, if outgoing channel has already got an answer (no more in waitfor) but is not yet running an application. Force soft hangup. */
|
||||
AST_LIST_TRAVERSE(&dial->channels, channel, list) {
|
||||
if (channel->owner) {
|
||||
ast_softhangup(channel->owner, AST_SOFTHANGUP_EXPLICIT);
|
||||
}
|
||||
}
|
||||
}
|
||||
AST_LIST_UNLOCK(&dial->channels);
|
||||
|
||||
|
|
|
@ -164,6 +164,12 @@
|
|||
</variable>
|
||||
</variablelist>
|
||||
</option>
|
||||
<option name="n">
|
||||
<para>Do not answer the channel automatically before bridging.</para>
|
||||
<para>Additionally, to prevent a bridged channel (the target of the Bridge application)
|
||||
from answering, the <literal>BRIDGE_NOANSWER</literal> variable can be set to inhibit
|
||||
answering.</para>
|
||||
</option>
|
||||
<option name="S(x)">
|
||||
<para>Hang up the call after <replaceable>x</replaceable> seconds *after* the called party has answered the call.</para>
|
||||
</option>
|
||||
|
@ -525,7 +531,7 @@ static void bridge_failed_peer_goto(struct ast_channel *chan, struct ast_channel
|
|||
}
|
||||
|
||||
static int pre_bridge_setup(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config,
|
||||
struct ast_bridge_features *chan_features, struct ast_bridge_features *peer_features)
|
||||
struct ast_bridge_features *chan_features, struct ast_bridge_features *peer_features, int noanswer)
|
||||
{
|
||||
int res;
|
||||
SCOPE_TRACE(1, "%s Peer: %s\n", ast_channel_name(chan), ast_channel_name(peer));
|
||||
|
@ -553,7 +559,10 @@ static int pre_bridge_setup(struct ast_channel *chan, struct ast_channel *peer,
|
|||
|
||||
res = 0;
|
||||
|
||||
if (ast_channel_state(chan) != AST_STATE_UP) {
|
||||
if (noanswer) {
|
||||
ast_debug(1, "Skipping answer on %s due to no answer directive\n", ast_channel_name(chan));
|
||||
} else if (ast_channel_state(chan) != AST_STATE_UP) {
|
||||
ast_debug(1, "Answering channel for bridge: %s\n", ast_channel_name(chan));
|
||||
res = ast_raw_answer_with_stream_topology(chan, config->answer_topology);
|
||||
if (res != 0) {
|
||||
return -1;
|
||||
|
@ -627,6 +636,8 @@ int ast_bridge_call_with_flags(struct ast_channel *chan, struct ast_channel *pee
|
|||
struct ast_bridge *bridge;
|
||||
struct ast_bridge_features chan_features;
|
||||
struct ast_bridge_features *peer_features;
|
||||
const char *value;
|
||||
int noanswer;
|
||||
SCOPE_TRACE(1, "%s Peer: %s\n", ast_channel_name(chan), ast_channel_name(peer));
|
||||
|
||||
/* Setup features. */
|
||||
|
@ -639,7 +650,12 @@ int ast_bridge_call_with_flags(struct ast_channel *chan, struct ast_channel *pee
|
|||
return -1;
|
||||
}
|
||||
|
||||
if (pre_bridge_setup(chan, peer, config, &chan_features, peer_features)) {
|
||||
ast_channel_lock(chan);
|
||||
value = pbx_builtin_getvar_helper(chan, "BRIDGE_NOANSWER");
|
||||
noanswer = !ast_strlen_zero(value) ? 1 : 0;
|
||||
ast_channel_unlock(chan);
|
||||
|
||||
if (pre_bridge_setup(chan, peer, config, &chan_features, peer_features, noanswer)) {
|
||||
ast_bridge_features_destroy(peer_features);
|
||||
ast_bridge_features_cleanup(&chan_features);
|
||||
bridge_failed_peer_goto(chan, peer);
|
||||
|
@ -848,6 +864,7 @@ enum {
|
|||
OPT_CALLER_PARK = (1 << 10),
|
||||
OPT_CALLEE_KILL = (1 << 11),
|
||||
OPT_CALLEE_GO_ON = (1 << 12),
|
||||
OPT_NOANSWER = (1 << 13),
|
||||
};
|
||||
|
||||
enum {
|
||||
|
@ -866,6 +883,7 @@ AST_APP_OPTIONS(bridge_exec_options, BEGIN_OPTIONS
|
|||
AST_APP_OPTION('k', OPT_CALLEE_PARK),
|
||||
AST_APP_OPTION('K', OPT_CALLER_PARK),
|
||||
AST_APP_OPTION_ARG('L', OPT_DURATION_LIMIT, OPT_ARG_DURATION_LIMIT),
|
||||
AST_APP_OPTION('n', OPT_NOANSWER),
|
||||
AST_APP_OPTION_ARG('S', OPT_DURATION_STOP, OPT_ARG_DURATION_STOP),
|
||||
AST_APP_OPTION('t', OPT_CALLEE_TRANSFER),
|
||||
AST_APP_OPTION('T', OPT_CALLER_TRANSFER),
|
||||
|
@ -1012,6 +1030,7 @@ static int bridge_exec(struct ast_channel *chan, const char *data)
|
|||
struct ast_bridge_features *peer_features;
|
||||
struct ast_bridge *bridge;
|
||||
struct ast_features_xfer_config *xfer_cfg;
|
||||
int noanswer;
|
||||
|
||||
AST_DECLARE_APP_ARGS(args,
|
||||
AST_APP_ARG(dest_chan);
|
||||
|
@ -1066,6 +1085,7 @@ static int bridge_exec(struct ast_channel *chan, const char *data)
|
|||
ast_set_flag(&(bconfig.features_callee), AST_FEATURE_PARKCALL);
|
||||
if (ast_test_flag(&opts, OPT_CALLER_PARK))
|
||||
ast_set_flag(&(bconfig.features_caller), AST_FEATURE_PARKCALL);
|
||||
noanswer = ast_test_flag(&opts, OPT_NOANSWER);
|
||||
|
||||
/* Setup after bridge goto location. */
|
||||
if (ast_test_flag(&opts, OPT_CALLEE_GO_ON)) {
|
||||
|
@ -1096,7 +1116,7 @@ static int bridge_exec(struct ast_channel *chan, const char *data)
|
|||
goto done;
|
||||
}
|
||||
|
||||
if (pre_bridge_setup(chan, current_dest_chan, &bconfig, &chan_features, peer_features)) {
|
||||
if (pre_bridge_setup(chan, current_dest_chan, &bconfig, &chan_features, peer_features, noanswer)) {
|
||||
ast_bridge_features_destroy(peer_features);
|
||||
ast_bridge_features_cleanup(&chan_features);
|
||||
goto done;
|
||||
|
|
|
@ -143,6 +143,9 @@
|
|||
<configOption name="transferinvalidsound" default="privacy-incorrect">
|
||||
<synopsis>Sound that is played when an incorrect extension is dialed and the transferer has no attempts remaining.</synopsis>
|
||||
</configOption>
|
||||
<configOption name="transferannouncesound" default="pbx-transfer">
|
||||
<synopsis>Sound that is played to the transferer when a transfer is initiated. If empty, no sound will be played.</synopsis>
|
||||
</configOption>
|
||||
</configObject>
|
||||
<configObject name="featuremap">
|
||||
<synopsis>DTMF options that can be triggered during bridged calls</synopsis>
|
||||
|
@ -324,6 +327,7 @@
|
|||
<enum name="transferdialattempts"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='transferdialattempts']/synopsis/text())" /></para></enum>
|
||||
<enum name="transferretrysound"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='transferretrysound']/synopsis/text())" /></para></enum>
|
||||
<enum name="transferinvalidsound"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='transferinvalidsound']/synopsis/text())" /></para></enum>
|
||||
<enum name="transferannouncesound"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='transferannouncesound']/synopsis/text())" /></para></enum>
|
||||
</enumlist>
|
||||
</parameter>
|
||||
</syntax>
|
||||
|
@ -387,6 +391,7 @@
|
|||
#define DEFAULT_TRANSFER_DIAL_ATTEMPTS 3
|
||||
#define DEFAULT_TRANSFER_RETRY_SOUND "pbx-invalid"
|
||||
#define DEFAULT_TRANSFER_INVALID_SOUND "privacy-incorrect"
|
||||
#define DEFAULT_TRANSFER_ANNOUNCE_SOUND "pbx-transfer"
|
||||
|
||||
/*! Default pickup options */
|
||||
#define DEFAULT_PICKUPEXTEN "*8"
|
||||
|
@ -910,6 +915,8 @@ static int xfer_set(struct ast_features_xfer_config *xfer, const char *name,
|
|||
ast_string_field_set(xfer, transferretrysound, value);
|
||||
} else if (!strcasecmp(name, "transferinvalidsound")) {
|
||||
ast_string_field_set(xfer, transferinvalidsound, value);
|
||||
} else if (!strcasecmp(name, "transferannouncesound")) {
|
||||
ast_string_field_set(xfer, transferannouncesound, value);
|
||||
} else {
|
||||
/* Unrecognized option */
|
||||
res = -1;
|
||||
|
@ -1801,6 +1808,8 @@ static int load_config(void)
|
|||
DEFAULT_TRANSFER_RETRY_SOUND, xfer_handler, 0);
|
||||
aco_option_register_custom(&cfg_info, "transferinvalidsound", ACO_EXACT, global_options,
|
||||
DEFAULT_TRANSFER_INVALID_SOUND, xfer_handler, 0);
|
||||
aco_option_register_custom(&cfg_info, "transferannouncesound", ACO_EXACT, global_options,
|
||||
DEFAULT_TRANSFER_ANNOUNCE_SOUND, xfer_handler, 0);
|
||||
|
||||
aco_option_register_custom(&cfg_info, "pickupexten", ACO_EXACT, global_options,
|
||||
DEFAULT_PICKUPEXTEN, pickup_handler, 0);
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue