Merge "res_rtp_asterisk.c: Fix rtp source address learning for broken clients"
authorJenkins2 <jenkins2@gerrit.asterisk.org>
Mon, 27 Nov 2017 22:33:38 +0000 (16:33 -0600)
committerGerrit Code Review <gerrit2@gerrit.digium.api>
Mon, 27 Nov 2017 22:33:38 +0000 (16:33 -0600)
63 files changed:
.gitreview
README-SERIOUSLY.bestpractices.txt
README.md [moved from README with 56% similarity]
addons/ooh323c/src/ooCalls.c
apps/app_minivm.c
apps/app_skel.c
build_tools/list_valid_installed_externals
channels/chan_sip.c
configs/samples/features.conf.sample
configure
configure.ac
doc/asterisk.8
doc/asterisk.sgml
doc/lang/language-criteria.txt
include/asterisk/autoconfig.h.in
include/asterisk/cli.h
include/asterisk/doxygen/asterisk-git-howto.h [deleted file]
include/asterisk/doxygen/commits.h [deleted file]
include/asterisk/doxygen/releases.h [deleted file]
include/asterisk/doxygen/reviewboard.h [deleted file]
include/asterisk/doxyref.h
include/asterisk/iostream.h
main/Makefile
main/abstract_jb.c
main/acl.c
main/aoc.c
main/app.c
main/asterisk.c
main/bridge_basic.c
main/ccss.c
main/cli.c
main/iostream.c
main/libasteriskssl.c
main/loader.c
makeopts.in
menuselect/autoconfig.h.in
menuselect/configure
menuselect/configure.ac
menuselect/menuselect.c
res/res_fax.c
res/res_format_attr_h263.c
res/res_format_attr_h264.c
res/res_hep_pjsip.c
res/res_hep_rtcp.c
res/res_http_media_cache.c
res/res_mwi_external_ami.c
res/res_parking.c
res/res_pjsip/location.c
res/res_pjsip/pjsip_configuration.c
res/res_pjsip_endpoint_identifier_anonymous.c
res/res_pjsip_endpoint_identifier_user.c
res/res_rtp_asterisk.c
res/snmp/agent.c
tests/test_http_media_cache.c
tests/test_logger.c
tests/test_pbx.c
tests/test_substitution.c
tests/test_utils.c
third-party/Makefile.rules
third-party/pjproject/Makefile
third-party/pjproject/apply_patches
third-party/pjproject/configure.m4
third-party/pjproject/patches/0040-183_without_to_tag.patch [new file with mode: 0644]

index f9ef050..d38061d 100644 (file)
@@ -2,3 +2,4 @@
 host=gerrit.asterisk.org
 port=29418
 project=asterisk.git
+defaultbranch=master
index 0d3e670..7a65602 100644 (file)
@@ -40,7 +40,7 @@ security are listed below.
         http://blogs.digium.com/2009/03/28/sip-security/
 
 * Asterisk VoIP Security (webinar):
-        http://www.asterisk.org/security/webinar/
+        https://www.asterisk.org/security/webinar/
 
 
 ==============
@@ -263,7 +263,7 @@ that contains a weak password that was forgotten prior to putting a system into
 production.
 
 Using a web search you can find several online password generators such as
-http://www.strongpasswordgenerator.com or there are several scripts that can be
+https://www.strongpasswordgenerator.com or there are several scripts that can be
 used to generate a strong password.
 
 
similarity index 56%
rename from README
rename to README.md
index 10f2824..4ed9b3e 100644 (file)
--- a/README
+++ b/README.md
@@ -1,15 +1,9 @@
-===============================================================================
-===                     The Asterisk(R) Open Source PBX
-===
-===                   by Mark Spencer <markster@digium.com>
-===                  and the Asterisk.org developer community
-===
-===                    Copyright (C) 2001-2016 Digium, Inc.
-===                       and other copyright holders.
-===============================================================================
-
--------------------------------------------------------------------------------
---- SECURITY ------------------------------------------------------------------
+# The Asterisk(R) Open Source PBX
+```text
+        By Mark Spencer <markster@digium.com> and the Asterisk.org developer community.
+        Copyright (C) 2001-2016 Digium, Inc. and other copyright holders.
+```
+## SECURITY
 
   It is imperative that you read and fully understand the contents of
 the security information document before you attempt to configure and run
@@ -19,80 +13,62 @@ an Asterisk server.
 version of the documentation in doc/tex/asterisk.pdf.  Alternatively, pull up
 the HTML version of the documentation in doc/tex/asterisk/index.html.  The
 source for the security document is available in doc/tex/security.tex.
--------------------------------------------------------------------------------
 
--------------------------------------------------------------------------------
---- WHAT IS ASTERISK ? --------------------------------------------------------
+## WHAT IS ASTERISK ?
 
   Asterisk is an Open Source PBX and telephony toolkit.  It is, in a
 sense, middleware between Internet and telephony channels on the bottom,
 and Internet and telephony applications at the top.  However, Asterisk supports
 more telephony interfaces than just Internet telephony.  Asterisk also has a
-vast amount of support for traditional PSTN telephony, as well.  For more
-information on the project itself, please visit the Asterisk home page at:
+vast amount of support for traditional PSTN telephony, as well.
 
-           http://www.asterisk.org
-
-  The official Asterisk wiki can be found at:
-
-           https://wiki.asterisk.org
-
-  In addition you'll find lots of information compiled by the Asterisk
-community on this Wiki:
-
-           http://www.voip-info.org/wiki-Asterisk
+  For more information on the project itself, please visit the Asterisk
+[home page] and the official [wiki].  In addition you'll find lots
+of information compiled by the Asterisk community at [voip-info.org].
 
   There is a book on Asterisk published by O'Reilly under the Creative Commons
 License. It is available in book stores as well as in a downloadable version on
-the http://www.asteriskdocs.org web site.
--------------------------------------------------------------------------------
+the [asteriskdocs.org] web site.
+
+## SUPPORTED OPERATING SYSTEMS
 
--------------------------------------------------------------------------------
---- SUPPORTED OPERATING SYSTEMS -----------------------------------------------
+### Linux
 
---- Linux
   The Asterisk Open Source PBX is developed and tested primarily on the
 GNU/Linux operating system, and is supported on every major GNU/Linux
 distribution.
 
---- Others
+### Others
+
   Asterisk has also been 'ported' and reportedly runs properly on other
 operating systems as well, including Sun Solaris, Apple's Mac OS X, Cygwin,
 and the BSD variants.
--------------------------------------------------------------------------------
 
--------------------------------------------------------------------------------
---- GETTING STARTED -----------------------------------------------------------
+## GETTING STARTED
 
   First, be sure you've got supported hardware (but note that you don't need
 ANY special hardware, not even a sound card) to install and run Asterisk.
 
-  Supported telephony hardware includes:
-
-       * All Analog and Digital Interface cards from Digium (www.digium.com)
-       * QuickNet Internet PhoneJack and LineJack (http://www.quicknet.net)
-       * any full duplex sound card supported by ALSA, OSS, or PortAudio
-       * any ISDN card supported by mISDN on Linux
-       * The Xorcom Astribank channel bank
-       * VoiceTronix OpenLine products
-
--------------------------------------------------------------------------------
+Supported telephony hardware includes:
+* All Analog and Digital Interface cards from [Digium]
+* QuickNet Internet PhoneJack and LineJack (http://www.quicknet.net)
+* any full duplex sound card supported by ALSA, OSS, or PortAudio
+* any ISDN card supported by mISDN on Linux
+* The Xorcom Astribank channel bank
+* VoiceTronix OpenLine products
 
--------------------------------------------------------------------------------
---- UPGRADING FROM AN EARLIER VERSION -----------------------------------------
+### UPGRADING FROM AN EARLIER VERSION
 
   If you are updating from a previous version of Asterisk, make sure you
-read the UPGRADE.txt file in the source directory. There are some files
+read the [UPGRADE.txt] file in the source directory. There are some files
 and configuration options that you will have to change, even though we
 made every effort possible to maintain backwards compatibility.
 
   In order to discover new features to use, please check the configuration
-examples in the /configs directory of the source code distribution.  For a
-list of new features in this version of Asterisk, see the CHANGES file.
--------------------------------------------------------------------------------
+examples in the [configs] directory of the source code distribution.  For a
+list of new features in this version of Asterisk, see the [CHANGES] file.
 
--------------------------------------------------------------------------------
---- NEW INSTALLATIONS ---------------------------------------------------------
+### NEW INSTALLATIONS
 
   Ensure that your system contains a compatible compiler and development
 libraries.  Asterisk requires either the GNU Compiler Collection (GCC) version
@@ -101,55 +77,54 @@ the gcc language extensions.  In addition, your system needs to have the C
 library headers available, and the headers and libraries for ncurses.
 
   There are many modules that have additional dependencies.  To see what
-libraries are being looked for, see ./configure --help, or run
-"make menuselect" to view the dependencies for specific modules.
+libraries are being looked for, see `./configure --help`, or run
+`make menuselect` to view the dependencies for specific modules.
 
   On many distributions, these dependencies are installed by packages with names
 like 'glibc-devel', 'ncurses-devel', 'openssl-devel' and 'zlib-devel'
 or similar.
 
-  So, let's proceed:
+So, let's proceed:
+1. Read this file.
 
-1) Read this README file.
-
-  There are more documents than this one in the doc/ directory.  You may also
+  There are more documents than this one in the [doc] directory.  You may also
 want to check the configuration files that contain examples and reference
-guides. They are all in the configs/ directory.
+guides in the [configs] directory.
 
-2) Run "./configure"
+2. Run `./configure`
 
   Execute the configure script to guess values for system-dependent
 variables used during compilation.
 
-3) Run "make menuselect" [optional]
+3. Run `make menuselect` _\[optional]_
 
   This is needed if you want to select the modules that will be compiled and to
 check dependencies for various optional modules.
 
-4) Run "make"
+4. Run `make`
 
-  Assuming the build completes successfully:
+Assuming the build completes successfully:
 
-5) Run "make install"
+5. Run `make install`
 
   If this is your first time working with Asterisk, you may wish to install
 the sample PBX, with demonstration extensions, etc.  If so, run:
 
-6) "make samples"
+6. Run `make samples`
 
   Doing so will overwrite any existing configuration files you have installed.
 
-  Finally, you can launch Asterisk in the foreground mode (not a daemon) with:
-
-# asterisk -vvvc
-
+7. Finally, you can launch Asterisk in the foreground mode (not a daemon) with:
+```
+        # asterisk -vvvc
+```
   You'll see a bunch of verbose messages fly by your screen as Asterisk
 initializes (that's the "very very verbose" mode).  When it's ready, if
 you specified the "c" then you'll get a command line console, that looks
 like this:
-
-*CLI>
-
+```
+        *CLI>
+```
   You can type "core show help" at any time to get help with the system.  For help
 with a specific command, type "core show help <command>".  To start the PBX using
 your sound card, you can type "console dial" to dial the PBX.  Then you can use
@@ -162,12 +137,10 @@ then it won't work right (not yet).
 information on how to start and stop Asterisk, as well as all the command
 line options for starting Asterisk.
 
-  Feel free to look over the configuration files in /etc/asterisk, where you
+  Feel free to look over the configuration files in `/etc/asterisk`, where you
 will find a lot of information about what you can do with Asterisk.
--------------------------------------------------------------------------------
 
--------------------------------------------------------------------------------
---- ABOUT CONFIGURATION FILES -------------------------------------------------
+### ABOUT CONFIGURATION FILES
 
   All Asterisk configuration files share a common format.  Comments are
 delimited by ';' (since '#' of course, being a DTMF digit, may occur in
@@ -179,20 +152,21 @@ they're used only to help make the configuration file easier to
 understand, and do not affect how it is actually parsed.
 
   Entries of the form 'variable=value' set the value of some parameter in
-asterisk.  For example, in dahdi.conf, one might specify:
-
+asterisk.  For example, in [chan_dahdi.conf], one might specify:
+```
        switchtype=national
-
+```
   In order to indicate to Asterisk that the switch they are connecting to is
 of the type "national".  In general, the parameter will apply to
 instantiations which occur below its specification.  For example, if the
 configuration file read:
-
+```
        switchtype = national
        channel => 1-4
        channel => 10-12
        switchtype = dms100
        channel => 25-47
+```
 
   The "national" switchtype would be applied to channels one through
 four and channels 10 through 12, whereas the "dms100" switchtype would
@@ -202,16 +176,14 @@ apply to channels 25 through 47.
 parameters.  For example, the line "channel => 25-47" creates objects for
 the channels 25 through 47 of the card, obtaining the settings
 from the variables specified above.
--------------------------------------------------------------------------------
 
--------------------------------------------------------------------------------
---- SPECIAL NOTE ON TIME ------------------------------------------------------
+### SPECIAL NOTE ON TIME
 
   Those using SIP phones should be aware that Asterisk is sensitive to
 large jumps in time.  Manually changing the system time using date(1)
 (or other similar commands) may cause SIP registrations and other
 internal processes to fail.  If your system cannot keep accurate time
-by itself use NTP (http://www.ntp.org/) to keep the system clock
+by itself use [NTP] to keep the system clock
 synchronized to "real time".  NTP is designed to keep the system clock
 synchronized by speeding up or slowing down the system clock until it
 is synchronized to "real time" rather than by jumping the time and
@@ -228,10 +200,8 @@ on UTC.  UTC does not use daylight savings time.
 
   Also note that this issue is separate from the clocking of TDM
 channels, and is known to at least affect SIP registrations.
--------------------------------------------------------------------------------
 
--------------------------------------------------------------------------------
---- FILE DESCRIPTORS ----------------------------------------------------------
+### FILE DESCRIPTORS
 
   Depending on the size of your system and your configuration,
 Asterisk can consume a large number of file descriptors.  In UNIX,
@@ -247,50 +217,56 @@ calls that your system can handle.  For example, if the limit is set
 at 1024 (a common default value) Asterisk can handle approximately 150
 SIP calls simultaneously.  To change the number of file descriptors
 follow the instructions for your system below:
--------------------------------------------------------------------------------
 
--------------------------------------------------------------------------------
---- PAM-based Linux System ----------------------------------------------------
+#### PAM-BASED LINUX SYSTEM
 
   If your system uses PAM (Pluggable Authentication Modules) edit
-/etc/security/limits.conf.  Add these lines to the bottom of the file:
-
+`/etc/security/limits.conf`.  Add these lines to the bottom of the file:
+```text
 root            soft    nofile          4096
 root            hard    nofile          8196
 asterisk        soft    nofile          4096
 asterisk        hard    nofile          8196
+```
 
 (adjust the numbers to taste).  You may need to reboot the system for
 these changes to take effect.
 
-== Generic UNIX System ==
+#### GENERIC UNIX SYSTEM
 
   If there are no instructions specifically adapted to your system
-above you can try adding the command "ulimit -n 8192" to the script
+above you can try adding the command `ulimit -n 8192` to the script
 that starts Asterisk.
--------------------------------------------------------------------------------
 
--------------------------------------------------------------------------------
---- MORE INFORMATION ----------------------------------------------------------
+## MORE INFORMATION
 
-  See the doc directory for more documentation on various features. Again,
-please read all the configuration samples that include documentation on
-the configuration options.
+  See the [doc] directory for more documentation on various features.
+Again, please read all the configuration samples that include documentation
+on the configuration options.
 
-  If this release of Asterisk was downloaded from a tarball, then some
-additional documentation should have been included.
-     * doc/tex/asterisk.pdf --- PDF version of the documentation
-     * doc/tex/asterisk/index.html --- HTML version of the documentation
+  Finally, you may wish to visit the [support] site and join the [mailing
+list] if you're interested in getting more information.
 
-  Finally, you may wish to visit the web site and join the mailing list if
-you're interested in getting more information.
+Welcome to the growing worldwide community of Asterisk users!
+```
+        Mark Spencer, and the Asterisk.org development community
+```
 
-   http://www.asterisk.org/support
+---
 
-  Welcome to the growing worldwide community of Asterisk users!
--------------------------------------------------------------------------------
+Asterisk is a trademark of Digium, Inc.
 
---- Mark Spencer, and the Asterisk.org development community
+[home page]: https://www.asterisk.org
+[support]: https://www.asterisk.org/support
+[wiki]: https://wiki.asterisk.org/
+[mailing list]: http://lists.digium.com/mailman/listinfo/asterisk-users
+[chan_dahdi.conf]: configs/samples/chan_dahdi.conf.sample
+[voip-info.org]: http://www.voip-info.org/wiki-Asterisk
+[asteriskdocs.org]: http://www.asteriskdocs.org
+[NTP]: http://www.ntp.org/
+[Digium]: https://www.digium.com/
+[UPGRADE.txt]: UPGRADE.txt
+[CHANGES]: CHANGES
+[configs]: configs
+[doc]: doc
 
--------------------------------------------------------------------------------
-Asterisk is a trademark of Digium, Inc.
index 26dc63e..c920e6a 100644 (file)
@@ -29,6 +29,7 @@
 #include "ooGkClient.h"
 #include "ooh323ep.h"
 #include "ooCalls.h"
+#include "ooCmdChannel.h"
 
 /** Global endpoint structure */
 extern OOH323EndPoint gH323ep;
@@ -173,6 +174,7 @@ OOH323CallData* ooCreateCall(char* type, char*callToken)
    call->msdRetries = 0;
    call->pFastStartRes = NULL;
    call->usrData = NULL;
+   ooCreateCallCmdConnection(call);
    OOTRACEINFO3("Created a new call (%s, %s)\n", call->callType, 
                  call->callToken);
    /* Add new call to calllist */
index 0d7a5f4..8f920e0 100644 (file)
@@ -1252,7 +1252,7 @@ static int sendmail(struct minivm_template *template, struct minivm_account *vmu
        struct ast_channel *chan = NULL;
        char *fromaddress;
        char *fromemail;
-       int res;
+       int res = -1;
 
        if (!str1 || !str2) {
                return -1;
index 0dbd4c5..b3c8876 100644 (file)
@@ -755,10 +755,9 @@ error:
        return AST_MODULE_LOAD_DECLINE;
 }
 
-AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Skeleton (sample) Application",
+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Skeleton (sample) Application",
        .support_level = AST_MODULE_SUPPORT_CORE,
        .load = load_module,
        .unload = unload_module,
        .reload = reload_module,
-       .load_pri = AST_MODPRI_DEFAULT,
 );
index ed36274..c371022 100755 (executable)
@@ -6,7 +6,7 @@ fi
 set -e
 
 ASTTOPDIR=${ASTTOPDIR:-.}
-export make=`sed -n -r -e "s/^MAKE\s*=\s*//gp" ${ASTTOPDIR}/makeopts`
+export make=`sed -n -e "s/^MAKE\s*=\s*//gp" ${ASTTOPDIR}/makeopts`
 
 getvar() {
        $make --quiet --no-print-directory -f- <<EOF
index bd68ec0..a829e20 100644 (file)
@@ -13055,7 +13055,7 @@ static void add_ice_to_sdp(struct ast_rtp_instance *instance, struct ast_str **a
 
        while ((candidate = ao2_iterator_next(&i))) {
                ast_str_append(a_buf, 0, "a=candidate:%s %u %s %d ", candidate->foundation, candidate->id, candidate->transport, candidate->priority);
-               ast_str_append(a_buf, 0, "%s ", ast_sockaddr_stringify_host(&candidate->address));
+               ast_str_append(a_buf, 0, "%s ", ast_sockaddr_stringify_addr_remote(&candidate->address));
 
                ast_str_append(a_buf, 0, "%s typ ", ast_sockaddr_stringify_port(&candidate->address));
 
@@ -13068,7 +13068,7 @@ static void add_ice_to_sdp(struct ast_rtp_instance *instance, struct ast_str **a
                }
 
                if (!ast_sockaddr_isnull(&candidate->relay_address)) {
-                       ast_str_append(a_buf, 0, " raddr %s ", ast_sockaddr_stringify_host(&candidate->relay_address));
+                       ast_str_append(a_buf, 0, " raddr %s ", ast_sockaddr_stringify_addr_remote(&candidate->relay_address));
                        ast_str_append(a_buf, 0, "rport %s", ast_sockaddr_stringify_port(&candidate->relay_address));
                }
 
index 223d693..5806e4c 100644 (file)
@@ -72,8 +72,8 @@
 ;                   means run the application on the opposite channel from the one that
 ;                   has activated the feature.
 ;  ActivatedBy   -> ActivatedBy is no longer honored.  The feature is activated by which
-;                   channel DYNAMIC_FEATURES includes the feature is on.  Use predial
-;                   to set different values of DYNAMIC_FEATURES on the channels.
+;                   channel DYNAMIC_FEATURES includes the feature is on.  Use a pre-dial
+;                   handler to set different values for DYNAMIC_FEATURES on the channels.
 ;                   Historic values are: "caller", "callee", and "both".
 ;  Application   -> This is the application to execute.
 ;  AppArguments  -> These are the arguments to be passed into the application.  If you need
index 358e626..7411f71 100755 (executable)
--- a/configure
+++ b/configure
@@ -952,10 +952,6 @@ PBX_PJSIP_TSX_LAYER_FIND_TSX2
 PJSIP_TSX_LAYER_FIND_TSX2_DIR
 PJSIP_TSX_LAYER_FIND_TSX2_INCLUDE
 PJSIP_TSX_LAYER_FIND_TSX2_LIB
-PBX_PJSIP_EVSUB_SET_UAS_TIMEOUT
-PJSIP_EVSUB_SET_UAS_TIMEOUT_DIR
-PJSIP_EVSUB_SET_UAS_TIMEOUT_INCLUDE
-PJSIP_EVSUB_SET_UAS_TIMEOUT_LIB
 PBX_PJSIP_AUTH_CLT_DEINIT
 PJSIP_AUTH_CLT_DEINIT_DIR
 PJSIP_AUTH_CLT_DEINIT_INCLUDE
@@ -1281,6 +1277,7 @@ COMPRESS
 FIND
 PYTHON
 FLEX
+CUT
 CAT
 CMP
 BISON
@@ -6871,6 +6868,47 @@ $as_echo "no" >&6; }
 fi
 
 
+# Extract the first word of "cut", so it can be a program name with args.
+set dummy cut; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_CUT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $CUT in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_CUT="$CUT" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_CUT="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_CUT" && ac_cv_path_CUT=":"
+  ;;
+esac
+fi
+CUT=$ac_cv_path_CUT
+if test -n "$CUT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CUT" >&5
+$as_echo "$CUT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
 # Extract the first word of "flex", so it can be a program name with args.
 set dummy flex; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
@@ -9349,6 +9387,12 @@ $as_echo "configuring" >&6; }
        if test "${CAT}" = ":" ; then
                as_fn_error $? "cat is required to build bundled pjproject" "$LINENO" 5
        fi
+       if test "${CUT}" = ":" ; then
+               as_fn_error $? "cut is required to build bundled pjproject" "$LINENO" 5
+       fi
+       if test "${GREP}" = ":" ; then
+               as_fn_error $? "grep is required to build bundled pjproject" "$LINENO" 5
+       fi
 
 
        this_host=$(./config.sub $(./config.guess))
@@ -9359,7 +9403,7 @@ $as_echo "configuring" >&6; }
                PJPROJECT_CONFIGURE_OPTS+=" --host=$host"
        fi
 
-       export TAR PATCH SED NM EXTERNALS_CACHE_DIR AST_DOWNLOAD_CACHE DOWNLOAD_TO_STDOUT DOWNLOAD_TIMEOUT DOWNLOAD MD5 CAT
+       export TAR PATCH SED NM EXTERNALS_CACHE_DIR AST_DOWNLOAD_CACHE DOWNLOAD_TO_STDOUT DOWNLOAD_TIMEOUT DOWNLOAD MD5 CAT CUT GREP
        export NOISY_BUILD
        ${GNU_MAKE} --quiet --no-print-directory -C ${PJPROJECT_DIR} \
                PJPROJECT_CONFIGURE_OPTS="$PJPROJECT_CONFIGURE_OPTS" \
@@ -9418,9 +9462,6 @@ $as_echo "#define HAVE_PJSIP_INV_SESSION_REF 1" >>confdefs.h
 $as_echo "#define HAVE_PJSIP_AUTH_CLT_DEINIT 1" >>confdefs.h
 
 
-$as_echo "#define HAVE_PJSIP_EVSUB_SET_UAS_TIMEOUT 1" >>confdefs.h
-
-
 $as_echo "#define HAVE_PJSIP_TSX_LAYER_FIND_TSX2 1" >>confdefs.h
 
 
@@ -11683,18 +11724,6 @@ PBX_PJSIP_AUTH_CLT_DEINIT=0
 
 
 
-PJSIP_EVSUB_SET_UAS_TIMEOUT_DESCRIP="PJSIP EVSUB Set UAS Timeout support"
-PJSIP_EVSUB_SET_UAS_TIMEOUT_OPTION=pjsip
-PJSIP_EVSUB_SET_UAS_TIMEOUT_DIR=${PJPROJECT_DIR}
-
-PBX_PJSIP_EVSUB_SET_UAS_TIMEOUT=0
-
-
-
-
-
-
-
 PJSIP_TSX_LAYER_FIND_TSX2_DESCRIP="pjsip_tsx_layer_find_tsx2 support"
 PJSIP_TSX_LAYER_FIND_TSX2_OPTION=pjsip
 PJSIP_TSX_LAYER_FIND_TSX2_DIR=${PJPROJECT_DIR}
index 47c6b26..170694d 100644 (file)
@@ -264,6 +264,7 @@ AC_SUBST(GNU_LD)
 AC_PATH_PROG([BISON], [bison], :)
 AC_PATH_PROG([CMP], [cmp], :)
 AC_PATH_PROG([CAT], [cat], :)
+AC_PATH_PROG([CUT], [cut], :)
 AC_PATH_PROG([FLEX], [flex], :)
 AC_PATH_PROG([GREP], [grep], :)
 AC_PATH_PROG([PYTHON], [python], :)
@@ -521,7 +522,6 @@ AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_TLS_TRANSPORT_PROTO], [PJSIP TLS Transport pro
 AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_EVSUB_GRP_LOCK], [PJSIP EVSUB Group Lock support], [PJPROJECT], [pjsip])
 AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_INV_SESSION_REF], [PJSIP INVITE Session Reference Count support], [PJPROJECT], [pjsip])
 AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_AUTH_CLT_DEINIT], [pjsip_auth_clt_deinit support], [PJPROJECT], [pjsip])
-AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_EVSUB_SET_UAS_TIMEOUT], [PJSIP EVSUB Set UAS Timeout support], [PJPROJECT], [pjsip])
 AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_TSX_LAYER_FIND_TSX2], [pjsip_tsx_layer_find_tsx2 support], [PJPROJECT], [pjsip])
 fi
 
index 3f49a34..1cb909a 100644 (file)
@@ -243,13 +243,13 @@ Enables executing of includes via \fB#exec\fR directive inside
 .SH BUGS
 Bug reports and feature requests may be filed at https://issues.asterisk.org
 .SH "SEE ALSO"
-http://www.asterisk.org - The Asterisk Home Page
+https://www.asterisk.org - The Asterisk Home Page
 .PP
 http://www.asteriskdocs.org - The Asterisk Documentation Project
 .PP
-http://wiki.asterisk.org - The Asterisk Wiki
+https://wiki.asterisk.org - The Asterisk Wiki
 .PP
-http://www.digium.com/ - Asterisk is sponsored by Digium
+https://www.digium.com/ - Asterisk is sponsored by Digium
 .SH AUTHOR
 Mark Spencer <markster@digium.com>
 .PP
index df1b9e4..c684d22 100644 (file)
  <refsect1>
   <title>SEE ALSO</title>
   <para>
-   http://www.asterisk.org - The Asterisk Home Page
+   https://www.asterisk.org - The Asterisk Home Page
   </para>
   <para>
    http://www.asteriskdocs.org - The Asterisk Documentation Project
   </para>
   <para>
-   http://wiki.asterisk.org - The Asterisk Wiki
+   https://wiki.asterisk.org - The Asterisk Wiki
   </para>
   <para>
-   http://www.digium.com/ - Asterisk is sponsored by Digium
+   https://www.digium.com/ - Asterisk is sponsored by Digium
   </para>
  </refsect1>
  <refsect1>
index c8d21bd..2ad5ab1 100644 (file)
@@ -14,7 +14,7 @@ inclusion of soundfiles in multiple languages.
 Criteria for language submission:
 
 1) Creative Commons Attribution-Share Alike 3.0
-(http://creativecommons.org/licenses/by-sa/3.0/us/) for all
+(https://creativecommons.org/licenses/by-sa/3.0/us/) for all
 soundfiles, and the actual artist who performs the prompts must be the
 one who approves (in writing) the CCBYSAv3 license.  Print out the
 license, have the artist sign, and fax to Digium (+1-256-428-6217
@@ -86,9 +86,9 @@ artist as a URL and/or email address.
 Example:
  bash-3.2# more CREDITS
  Recorded by:
- Allison Smith (http://www.theivrvoice.com)
+ Allison Smith (https://www.theivrvoice.com)
  
- Financial Contributions by: Digium, Inc. (http://www.digium.com)
+ Financial Contributions by: Digium, Inc. (https://www.digium.com)
  bash-3.2#
 
 5) Create a file called "LICENSE" and include the license text (listed
@@ -107,7 +107,7 @@ import to UTF-8 format.
 7) Use "tar" to create a single file of your sounds and the three text
 files.
 
-8) Create an account on http://issues.asterisk.org/ if you do not
+8) Create an account on https://issues.asterisk.org/ if you do not
 already have one, and submit the file via that interface.  In order to
 eliminate confusion, you should also complete the license agreement on
 that system, which is an electronic license agreement.  You will
@@ -486,7 +486,7 @@ Creative Commons Notice
      time.  For the avoidance of doubt, this trademark restriction
      does not form part of this License.
 
-     Creative Commons may be contacted at http://creativecommons.org/
+     Creative Commons may be contacted at https://creativecommons.org/
 
 
  -- end printout --
index 4700d40..f8bd0e3 100644 (file)
 /* Define to 1 if PJPROJECT has the PJSIP EVSUB Group Lock support feature. */
 #undef HAVE_PJSIP_EVSUB_GRP_LOCK
 
-/* Define to 1 if PJPROJECT has the PJSIP EVSUB Set UAS Timeout support
-   feature. */
-#undef HAVE_PJSIP_EVSUB_SET_UAS_TIMEOUT
-
 /* Define to 1 if PJPROJECT has the PJSIP External Resolver Support feature.
    */
 #undef HAVE_PJSIP_EXTERNAL_RESOLVER
index c79a4e9..c75fc29 100644 (file)
@@ -287,6 +287,9 @@ int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len);
  * Useful for readline, that's about it
  * \retval 0 on success
  * \retval -1 on failure
+ *
+ * Only call this function to proxy the CLI generator to
+ * another.
  */
 char *ast_cli_generator(const char *, const char *, int);
 
@@ -302,10 +305,54 @@ int ast_cli_generatornummatches(const char *, const char *);
  * Subsequent entries are all possible values, followed by a NULL.
  * All strings and the array itself are malloc'ed and must be freed
  * by the caller.
+ *
+ * \warning This function cannot be called recursively so it will always
+ *          fail if called from a CLI_GENERATE callback.
  */
 char **ast_cli_completion_matches(const char *, const char *);
 
 /*!
+ * \brief Generates a vector of strings for CLI completion.
+ *
+ * \param text Complete input being matched.
+ * \param word Current word being matched
+ *
+ * The results contain strings that both:
+ * 1) Begin with the string in \a word.
+ * 2) Are valid in a command after the string in \a text.
+ *
+ * The first entry (offset 0) of the result is the longest common substring
+ * in the results, useful to extend the string that has been completed.
+ * Subsequent entries are all possible values.
+ *
+ * \note All strings and the vector itself are malloc'ed and must be freed
+ *       by the caller.
+ *
+ * \note The vector is sorted and does not contain any duplicates.
+ *
+ * \warning This function cannot be called recursively so it will always
+ *          fail if called from a CLI_GENERATE callback.
+ */
+struct ast_vector_string *ast_cli_completion_vector(const char *text, const char *word);
+
+/*!
+ * \brief Add a result to a request for completion options.
+ *
+ * \param value A completion option text.
+ *
+ * \retval 0 Success
+ * \retval -1 Failure
+ *
+ * This is an alternative to returning individual values from CLI_GENERATE.  Instead
+ * of repeatedly being asked for the next match and having to start over, you can
+ * call this function repeatedly from your own stateful loop.  When all matches have
+ * been added you can return NULL from the CLI_GENERATE function.
+ *
+ * \note This function always eventually results in calling ast_free on \a value.
+ */
+int ast_cli_completion_add(char *value);
+
+/*!
  * \brief Command completion for the list of active channels.
  *
  * This can be called from a CLI command completion function that wants to
diff --git a/include/asterisk/doxygen/asterisk-git-howto.h b/include/asterisk/doxygen/asterisk-git-howto.h
deleted file mode 100644 (file)
index 1ecce15..0000000
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 1999 - 2009, Digium, Inc.
- *
- * 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
- */
-
-/*!
- * \page AsteriskGitHowto How to setup a local GIT mirror of the Asterisk SVN repository
- *
- * <hr>
- *
- * \section Introduction Introduction
- * This document will instruct you how to setup a local git mirror of the 
- * Asterisk SVN repository.
- * 
- * Why would you want that? for starters, it's a fast repository browser
- * and works well even when offline. More on why and why not at 'Pros and Cons'
- * in the end of this document. 
- * <hr>
- *
- * \section Setup Setup
- *
- * Make sure you have the package
- *
- \verbatim
-  git-svn
- \endverbatim
- *
- * installed. It is part of the standard git distribution and included in
- * any recent Linux distribution.
- *
- * Next, get the files from this repository: 
- *
- \verbatim
-  git clone http://git.tzafrir.org.il/git/asterisk-tools.git
- \endverbatim
- *
- * Which will create the subdirectory 'asterisk-tools' under your working 
- * directory. For the purpose of this HOWTO I assume that you will later 
- * download Asterisk under the same directory.
- * 
- * Now let's get Asterisk:
- * 
- \verbatim
-  git svn clone -s http://svn.digium.com/svn/asterisk
- \endverbatim
- * 
- * This will download the whole /trunk , /tags and /branches hirarchies
- * to a new git repository under asterisk/ .
- * This will take a   L  O  N  G   time. In the order of magnitude of a
- * day. If it stops in the middle:
- *
- \verbatim
-  # cd asterisk; git svn fetch --fetch-all
- \endverbatim
- *
- * All commands as of this point are run from the newly-created subdirectory
- * 'asterisk'
- *
- \verbatim
-  cd asterisk
- \endverbatim
- *
- * Next make your repository more compact:
- * 
- * \note FIXME: I now get a .git subdirectory of the size of 135MB. This seems
- *       overly large considering what I got a few monthes ago.
- *
- \verbatim
-  git repack -a
- \endverbatim
- *
- * Now fix the menuselect bits. One possible venue is to use submodules.
- * This would require setting a separate menuselect repository . And
- * fixing the submodule references in every new tag to point to the right
- * place. I gave up at this stage, and instead reimplememented menuselect
- *
- \verbatim
-  cp -a ../asterisk-tools/menuselect menuselect
-  make -C menuselect dummies
-  chmod +x menuselect/menuselect
- \endverbatim
- * 
- * Next thing to do is ignore generated files. .gitignore is somewhat
- * like svn:ignore . Though it is possible to use one at the top
- * directory. Hence I decided to make it ignore itself as well:
- *
- \verbatim
-  cp ../asterisk-tools/asterisk_gitignore .gitignore
- \endverbatim
- * 
- * Now let's generate tags that will point to the tags/* branches.
- * e.g. tag 'v1.4.8' will point to the head of branch tags/1.4.8 .
- * If you don't like the extra 'v', just edit the sed command.
- *
- \verbatim
-  ../asterisk-tools/update_tags
- \endverbatim
- * 
- * Example configuration (refer to menuselect/menuselelct for more
- * information). For instance: res_snmp breaks building 1.4 from git:
- *
- \verbatim
-  echo 'exclude res_snmp' >build_tools/conf
- \endverbatim
- *
- * <hr>
- *
- * \section Update Update
- * The main Asterisk repository tends to get new commits occasionally. I
- * suppose you want those updates in your local copy. The following command
- * should normally be done from the master branch. If you actually use branches, 
- * it is recommended to switch to it beforehand:
- *
- \verbatim
-  git checkout master
- \endverbatim
- *
- * Next, get all updates.
- * <hr>
- *
- * \section Usage Usage
- *
- * If you use git from the command-line, it is highly recommended to enable
- * programmable bash completion. The git command-line is way more complex
- * than svn, but the completion makes it usable:
- *
- *
- \verbatim
-  asterisk$ git show v1.2.28<tab><tab>
-  v1.2.28     v1.2.28.1
-
-  asterisk$ git show v1.2.28:c<tab><tab>
-  callerid.c     channel.c      cli.c          coef_out.h     contrib/
-  cdr/           channels/      codecs/        config.c       cryptostub.c
-  cdr.c          chanvars.c     coef_in.h      configs/       cygwin/
-
-  asterisk$ git svn<tab><tab>
-  clone            fetch            log              set-tree
-  commit-diff      find-rev         propget          show-externals
-  create-ignore    info             proplist         show-ignore
-  dcommit          init             rebase
-
-  asterisk$ git svn rebase --f
-  --fetch-all       --follow-parent
- \endverbatim
- * 
- * Some useful commands:
- *
- \verbatim
-  git svn rebase --fetch-all # pull updates from upstream
-  man git-FOO                # documentation for 'git FOO'
-  # <tree> is any place on graph of branches: HEAD, name of a branch or
-  # a tag, commit ID, and some others
-  git show <tree>            # The top commit in this tree (log + diff)
-  git show <tree>:directory  # directory listing
-  git show <tree>:some/file  # get that file
-  git log <tree>             # commit log up to that point
-  git branch                 # shows local branches and in which one you are
-  git branch -r              # List remote branches. Such are SVN ones.
- \endverbatim
- *
- * For more information, see the man page gittutorial as well as
- * \arg http://git-scm.com/documentation
- *
- \verbatim
-  git svn rebase --fetch-all
- \endverbatim
- *
- * <hr>
- *
- * \section ProsAndCons Pros and Cons
- *
- * \subsection TheGood The Good
- *
- * Working off-line:
- *  If you want to be able to use 'svn log' and 'svn diff' to a different
- *  branch, now you can.
- *
- * Efficient repository browser:
- *  With git you can effectively browse commit logs and working copies of
- *  various branches. In fact, using it merely as a logs and versions
- *  browser can be useful on its own.
- *
- * Branches really work:
- *  With SVN merging a branch is complicated. Partially because lack of
- *  separate merge tracking.With git you don't need the extra svnmerge:
- *  changes that don't collide with your branch merge in a quick merge
- *  operation.
- *
- * \subsection Limitations Limitations
- * 
- * svn:externals :
- *  does not really work well with git-svn (and similar systems: svk,
- *  bzr-svn and hg-svn). Git has something called submodules that allows
- *  emulating the basic functionality of svn:externals, but is not as
- *  transparent.
- *
- * Commiting:
- *  Not sure how safe it is to commit from such a copy. In most places I
- *  see that it is not recommended to commit directly from git-svn. OTOH,
- *  git has some tools that make it easy to prepare a patch set out of a
- *  branch (e.g. git format-patch).
- *
- *  IIRC there are also some issues for git-svn with https certificate
- *  authentication in the first place.
- *
- * Tags:
- *  /tags are branches. SVN tags are really branches that we pretend not
- *  to change. And in fact in Asterisk we practically do change. But see
- *  workaround below to generate tags from the tag branches.
- *
- * /team branches::
- *  At least with git 1.5.x you can't easily follow all the team branches.
- *  This is due to a bug in their handling of wildcards in branches
- *  description. I believe this has been resolved in 1.6 but I didn't get
- *  to test that. Even if it will, it will require an extra step of manual
- *  editing.
- *
- * <hr>
- */
diff --git a/include/asterisk/doxygen/commits.h b/include/asterisk/doxygen/commits.h
deleted file mode 100644 (file)
index 032bfc5..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 1999 - 2009, Digium, Inc.
- *
- * 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
- */
-
-/*!
- * \page CommitMessages Guidelines for Commit Messages
- *
- * <hr>
- *
- * \section CommitMsgFormatting Commit Message Formatting
- *
- * The following illustrates the basic outline for commit messages:
- *
- * \verbatim
- * <One-liner summary of changes>
- *
- * <Empty Line> 
- *
- * <Verbose description of the changes>
- *
- * <Empty Line> 
- *
- * <Special Tags>
- * \endverbatim
- *
- * Some commit history viewers treat the first line of commit messages as the
- * summary for the commit.  So, an effort should be made to format our commit
- * messages in that fashion.  The verbose description may contain multiple 
- * paragraphs, itemized lists, etc. Always end the first sentence (and any
- * subsequent sentences) with punctuation.
- *
- * Commit messages should be wrapped at 80 %columns.
- *
- * \note For trivial commits, such as "fix the build", or "fix spelling mistake",
- *       the verbose description may not be necessary.
- *
- * <hr>
- *
- * \section CommitMsgTags Special Tags for Commit Messages
- *
- * \subsection MantisTags Mantis (https://issues.asterisk.org/)
- *
- * To have a commit noted in an issue, use a tag of the form: 
- * \arg (issue #1234)
- *
- * To have a commit automatically close an issue, use a tag of the form:
- * \arg (closes issue #1234)
- *
- * When making a commit for a mantis issue, it is easiest to use the
- * provided commit %message template functionality.  It will format the
- * special tags appropriately, and will also include information about who
- * reported the issue, which patches are being applied, and who did testing.
- * 
- * Assuming that you have bug marshal access (and if you have commit access,
- * it is pretty safe to assume that you do), you will find the commit %message
- * template section directly below the issue details section and above the
- * issue relationships section.  You will have to click the '+' next to
- * "Commit message template" to make the contents of the section visible.
- *
- * Here is an example of what the template will generate for you:
- *
- * \verbatim
- * (closes issue #1234)
- * Reported by: SomeGuy
- * Patches:
- *      fix_bug_1234.diff uploaded by SomeDeveloper (license 5678)
- * \endverbatim
- *
- * If the patch being committed was written by the person doing the commit,
- * and is not available to reference as an upload to the issue, there is no
- * need to include something like "fixed by me", as that will be the default
- * assumption when a specific patch is not referenced.
- *
- * \subsection ReviewBoardTags Review Board (https://reviewboard.asterisk.org/)
- *
- * To have a commit set a review request as submitted, include the full URL
- * to the review request.  For example:
- * \arg Review: %https://reviewboard.asterisk.org/r/95/
- *
- * \note The trailing slash in the review URL is required.
- *
- * <hr>
- *
- * \section CommitMsgSvnmerge Commit Messages with svnmerge
- *
- * When using the svnmerge tool for merging changes between branches, use the
- * commit %message generated by svnmerge.  The '-f' option to svnmerge allows
- * you to specify a file for svnmerge to write out a commit %message to.  The
- * '-F' option to svn commit allows you to specify a file that contains the
- * commit %message.
- *
- * If you are using the expect script wrappers for svnmerge from repotools,
- * a commit %message is automatically placed in the file '../merge.msg'.
- *
- * For more detailed information about working with branches and merging,
- * see the following page on %asterisk.org:
- * \arg https://wiki.asterisk.org/wiki/display/AST/Subversion+Usage
- */
diff --git a/include/asterisk/doxygen/releases.h b/include/asterisk/doxygen/releases.h
deleted file mode 100644 (file)
index d1b33ff..0000000
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 1999 - 2009, Digium, Inc.
- *
- * 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
- */
-
-/*!
- * \page ReleaseStatus Asterisk Release Status
- *
- * \section warranty Warranty
- * The following warranty applies to all open source releases of Asterisk:
- *
- * NO WARRANTY
- *
- * BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
- * FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
- * OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
- * PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
- * OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
- * TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
- * PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
- * REPAIR OR CORRECTION.
-
- * IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
- * WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
- * REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
- * INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
- * OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
- * TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
- * YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
- * PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES.
- *
- * \section releasestatustypes Release Status Types
- *
- * Release management is a essentially an agreement between the development
- * community and the %user community on what kind of updates can be expected
- * for Asterisk releases, and what types of changes these updates will contain.
- * Once these policies are established, the development community works very
- * hard to adhere to them.  However, the development community does reserve
- * the right to make exceptions to these rules for special cases as the need
- * arises.
- *
- * Asterisk releases are in various states of maintenance.  The states are
- * defined here:
- *
- * \arg <b>None</b> - This release series is receiving no updates whatsoever.
- * \arg <b>Security-Only</b> - This release series is receiving updates, but
- *      only to address security issues.  Security issues found and fixed in
- *      this release series will be accompanied by a published security advisory
- *      from the Asterisk project.
- * \arg <b>Full-Support</b> - This release series is receiving updates for all
- *      types of bugs.
- * \arg <b>Full-Development</b> - Changes in this part of Asterisk include bug
- *      fixes, as well as new %features and architectural improvements.
- *
- * \section AsteriskReleases Asterisk Maintenance Levels
- *
- * \htmlonly
- * <table border="1">
- *  <tr>
- *   <td><b>Name</b></td>
- *   <td><b>SVN Branch</b></td>
- *   <td><b>Status</b></td>
- *   <td><b>Notes</b></td>
- *  </tr>
- *  <tr>
- *   <td>Asterisk 1.0</td>
- *   <td>/branches/1.0</td>
- *   <td>None</td>
- *  </tr>
- *  <tr>
- *   <td>Asterisk 1.2</td>
- *   <td>/branches/1.2</td>
- *   <td>Security-Only</td>
- *  </tr>
- *  <tr>
- *   <td>Asterisk 1.4</td>
- *   <td>/branches/1.4</td>
- *   <td>Full-Support</td>
- *  </tr>
- *  <tr>
- *   <td>Asterisk 1.6.0</td>
- *   <td>/branches/1.6.0</td>
- *   <td>Full-Support</td>
- *  </tr>
- *  <tr>
- *   <td>Asterisk 1.6.1</td>
- *   <td>/branches/1.6.1</td>
- *   <td>Full-Support</td>
- *   <td>Still in beta</td>
- *  </tr>
- *  <tr>
- *   <td>Asterisk trunk</td>
- *   <td>/trunk</td>
- *   <td>Full-Development</td>
- *   <td>No releases are made directly from trunk.</td>
- *  </tr>
- * </table>
- * \endhtmlonly
- *
- * For more information on how and when Asterisk releases are made, see the
- * release policies page:
- * \arg \ref ReleasePolicies
- */
-
-/*!
- * \page ReleasePolicies Asterisk Release and Commit Policies
- *
- * \section releasestatus Asterisk Release Status
- *
- * For more information on the current status of each Asterisk release series,
- * please see the Asterisk Release Status page:
- *
- * \arg \ref ReleaseStatus
- *
- * <hr>
- *
- * \section commitmonitoring Commit Monitoring
- *
- * To monitor commits to Asterisk and related projects, visit 
- * <a href="http://lists.digium.com/">http://lists.digium.com</a>.  The Digium
- * mailing list server hosts a %number of mailing lists for commits.
- *
- * <hr>
- *
- * \section ast10policy Asterisk 1.0
- *
- * \subsection svnbranch SVN Branch
- *
- * \arg /branches/1.0
- *
- * \subsection ast10releases Release and Commit Policy
- * No more releases of Asterisk 1.0 will be made for any reason.
- *
- * No commits should be made to the Asterisk 1.0 branch.
- * 
- * <hr>
- *
- * \section ast12policy Asterisk 1.2
- *
- * \subsection svnbranch SVN Branch
- *
- * \arg /branches/1.2
- *
- * \subsection ast12releases Release and Commit Policy
- *
- * There will be no more scheduled releases of Asterisk 1.2.
- * 
- * Commits to the Asterisk 1.2 branch should only address security issues or
- * regressions introduced by previous security fixes.  For a security issue, the
- * commit should be accompanied by an 
- * <a href="http://downloads.asterisk.org/pub/security/">Asterisk Security Advisory</a>
- * and an immediate release.  When a commit goes in to fix a regression, the previous
- * security advisory that is related to the change that introduced the bug should get
- * updated to indicate that there is an updated version of the fix.  A release should
- * be made immediately for these regression fixes, as well.
- *
- * \subsection ast12releasenumbers Release Numbering
- *
- *  - 1.2.X - a release that contains new security fixes
- *  - 1.2.X.Y - a release that contains fixes to the security patches released in
- *    version 1.2.X
- *
- * <hr>
- *
- * \section ast14policy Asterisk 1.4
- *
- * \subsection svnbranch SVN Branch
- *
- * \arg /branches/1.4
- *
- * \subsection ast14releases Release and Commit Policy
- *
- * Asterisk 1.4 is receiving regular bug fix release updates.  An attempt is made to
- * make releases of every four to six weeks.  Since this release series is receiving
- * changes for all types of bugs, the number of changes in a single release can be
- * significant.  1.4.X releases go through a release candidate testing cycle to help
- * catch any regressions that may have been introduced.
- *
- * Commits to Asterisk 1.4 must be to address bugs only.  No new %features should be
- * introduced into Asterisk 1.4 to reduce the %number of changes to this established
- * release series.  The only exceptions to this %rule are for cases where something
- * that may be considered a feature is needed to address a bug or security issue.
- *
- * \subsection ast14releasenumbers Release Numbering
- *
- *  - 1.4.X - a release that contains new bug fixes to the 1.4 release series
- *  - 1.4.X.Y - a release that contains very few changes on top of 1.4.X.  This
- *    may be for a security patch, or for a regression introduced in 1.4.X.
- *
- * <hr>
- *
- * \section ast16policy Asterisk 1.6
- *
- * \subsection svnbranch SVN Branch
- *
- * \arg /branches/1.6.*
- *
- * \subsection ast16releases Release and Commit Policy
- *
- * Asterisk 1.6 is managed in a different way than previous Asterisk release series.
- * From a high level, it was inspired by the release model used for Linux 2.6.
- * The intended time frame for 1.6.X releases is every 2 or 3 months.  Each 1.6.X
- * release gets its own branch.  The 1.6.X branches are branches off of trunk.
- * Once the branch is created, it only receives bug fixes.  Each 1.6.X release goes
- * through a beta and release candidate testing cycle.
- *
- * After a 1.6.X release is published, it will be maintained until 1.6.[X + 3] is
- * released.  While a 1.6.X release branch is still maintained, it will receive only
- * bug fixes.  Periodic maintenance releases will be made and labeled as 1.6.X.Y.
- * 1.6.X.Y releases should go through a release candidate test cycle before being
- * published.
- *
- * For now, all previous 1.6 release will be maintained for security issues.  Once
- * we have more 1.6 releases to deal with, this part of the policy will likely change.
- * 
- * For some history on the motivations for Asterisk 1.6 release management, see the
- * first two sections of this
- * <a href="http://lists.digium.com/pipermail/asterisk-dev/2007-October/030083.html">mailing list post</a>.
- *
- * \subsection ast16releasenumbers Release Numbering
- *
- *  - 1.6.X - a release that includes new functionality
- *  - 1.6.X.Y - a release that contains fixes for bugs or security issues identified
- *    in the 1.6.X release series.
- *
- * <hr>
- *
- * \section asttrunk Asterisk Trunk
- *
- * \subsection svnbranch SVN Branch
- *
- * \arg /trunk
- *
- * \subsection asttrunkpolicy Release and Commit Policy
- *
- * No releases are ever made directly from Asterisk trunk.
- *
- * Asterisk trunk is used as the main development area for upcoming Asterisk 1.6 
- * releases.  Commits to Asterisk trunk are not limited.  They can be bug fixes,
- * new %features, and architectural improvements.  However, for larger sets
- * of changes, developers should work with the Asterisk project leaders to
- * schedule them for inclusion.  Care is taken not to include too many invasive
- * sets of changes for each new Asterisk 1.6 release.
- *
- * No changes should go into Asterisk trunk that are not ready to go into a
- * release.  While the upcoming release will go through a beta and release
- * candidate test cycle, code should not be in trunk until the code has been
- * tested and reviewed such that there is reasonable belief that the code
- * is ready to go.
- *
- * <hr>
- *
- * \section astteam Asterisk Team Branches
- *
- * \subsection svnbranch SVN Branch
- *
- * \arg /team/&lt;developername&gt;
- *
- * \subsection astteampolicy Release and Commit Policy
- *
- * The Asterisk subversion repository has a special directory called "team"
- * where developers can make their own personal development branches.  This is
- * where new %features, bug fixes, and architectural improvements are developed
- * while they are in %progress.
- *
- * Just about anything goes as far as commits to this area goes.  However,
- * developers should keep in mind that anything committed here, as well as
- * anywhere else on Digium's SVN server, falls under the contributor license
- * agreement.
- *
- * In addition to each developer having their own space for working on projects,
- * there is also a team/group folder where %group development efforts take place.
- *
- * Finally, in each developer folder, there is a folder called "private".  This
- * is where developers can create branches for working on things that they are
- * not ready for the whole world to see.
- */
diff --git a/include/asterisk/doxygen/reviewboard.h b/include/asterisk/doxygen/reviewboard.h
deleted file mode 100644 (file)
index 59ab852..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
-* Asterisk -- An open source telephony toolkit.
-*
-* Copyright (C) 1999 - 2009, Digium, Inc.
-*
-* 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
-*/
-
-/*!
- * \page Reviewboard Reviewboard Usage and Guidelines
- *
- * <hr>
- *
- * \section ReviewboardGuidelines Usage Guidelines
- *
- * Mantis (https://issues.asterisk.org) and Reviewboard (https://reviewboard.asterisk.org)
- * are both utilities that the Asterisk development community uses to help
- * track and review code being written for Asterisk.  Since both systems
- * are used for posting patches, it is worth discussing when it is appropriate
- * to use reviewboard and when not.
- *
- * Here are the situations in which it is appropriate to post code to reviewboard:
- *  - A committer has a patch that they would like to get some feedback on before
- *    merging into one of the main branches.
- *  - A committer or bug marshal has requested a contributor to post their patch
- *    from Mantis on reviewboard to aid in the review process.  This typically
- *    happens with complex code contributions where reviewboard can help aid in
- *    providing feedback.
- *
- * We do encourage all interested parties to participate in the review process.
- * However, aside from the cases mentioned above, we prefer that all code
- * submissions first go through Mantis.
- *
- * \note It is acceptable for a committer to post patches to reviewboard before
- * they are complete to get some feedback on the approach being taken.  However,
- * if the code is not yet ready to be merged, it \b must be documented as such.
- * A review request with a patch proposed for merging should have documented
- * testing and should not have blatant coding guidelines violations.  Lack of
- * these things is careless and shows disrespect for those reviewing your code.
- *
- * <hr>
- *
- * \section ReviewboardPosting Posting Code to Reviewboard
- *
- * \subsection postreview Using post-review
- *
- * The easiest way to post a patch to reviewboard is by using the
- * post-review tool.  We have post-review in our repotools svn repository.
- *
- * \verbatim
- * $ svn co http://svn.digium.com/svn/repotools
- * \endverbatim
- *
- * Essentially, post-review is a script that will take the output of "svn
- * diff" and create a review request out of it for you.  So, once you have
- * a working copy with the changes you expect in the output of "svn diff",
- * you just run the following command:
- *
- * \verbatim
- * $ post-review
- * \endverbatim
- * 
- * If it complains about not knowing which reviewboard server to use, add
- * the server option:
- * 
- * \verbatim
- * $ post-review --server=https://reviewboard.asterisk.org
- * \endverbatim
- *
- * \subsection postreviewnewfiles Dealing with New Files
- * 
- * I have one final note about an oddity with using post-review.  If you
- * maintain your code in a team branch, and the new code includes new
- * files, there are some additional steps you must take to get post-review
- * to behave properly.
- * 
- * You would start by getting your changes applied to a trunk working copy:
- * 
- * \verbatim
- * $ cd .../trunk
- * \endverbatim
- * 
- * Then, apply the changes from your branch:
- * 
- * \verbatim
- * $ svn merge .../trunk .../team/group/my_new_code
- * \endverbatim
- * 
- * Now, the code is merged into your working copy.  However, for a new
- * file, subversion treats it as a copy of existing content and not new
- * content, so new files don't show up in "svn diff" at this point.  To get
- * it to show up in the diff, use the following commands so svn treats it
- * as new content and publishes it in the diff:
- * 
- * \verbatim
- * $ svn revert my_new_file.c
- * $ svn add my_new_file.c
- * \endverbatim
- * 
- * Now, it should work, and you can run "post-review" as usual.
- *
- * \subsection postreviewupdate Updating Patch on Existing Review Request
- *
- * Most of the time, a patch on reviewboard will require multiple iterations
- * before other sign off on it being ready to be merged.  To update the diff
- * for an existing review request, you can use post-review and the -r option.
- * Apply the current version of the diff to a working copy as described above,
- * and then run the following command:
- * 
- * \verbatim
- * $ post-review -r <review request number>
- * \endverbatim
- */
index 5550023..f5a8768 100644 (file)
  *
  * \section devpolicy Development and Release Policies
  * \arg \ref CodeGuide : The must-read document for all developers
- * \arg \ref CommitMessages : Information on formatting and special tags for commit messages
- * \arg \ref ReleaseStatus : The current support level for various Asterisk releases
- * \arg \ref ReleasePolicies : Asterisk Release and Commit Policies
- * \arg \ref Reviewboard : Reviewboard Usage and Guidelines
- * \arg \ref MantisWorkflow : Workflow Guidelines for Asterisk Open Source Issue Tracker
- * \arg \ref AsteriskGitHowto : How to setup a local GIT mirror of the Asterisk SVN repository
  * \arg \ref AstCREDITS : A Thank You to contributors (unfortunately out of date)
  *
  * \section apisandinterfaces Asterisk APIs and Interfaces
  * \arg \ref SoundFiles included in the Asterisk distribution
  *
  * \section weblinks Web sites
- * \arg \b Main:  Asterisk Developer's website http://www.asterisk.org/developers/
+ * \arg \b Main:  Asterisk Developer's website https://www.asterisk.org/developers/
  * \arg \b Bugs: The Issue Tracker https://issues.asterisk.org
  * \arg \b Lists: List Server http://lists.digium.com
- * \arg \b Wiki: The Asterisk Wiki     http://wiki.asterisk..org
+ * \arg \b Wiki: The Asterisk Wiki     https://wiki.asterisk..org
  * \arg \b Docs: The Asterisk Documentation Project http://www.asteriskdocs.org
- * \arg \b Digium: The Asterisk Company http://www.digium.com
+ * \arg \b Digium: The Asterisk Company https://www.digium.com
  */
 
 /*! 
index c641ffb..e9816ac 100644 (file)
@@ -109,7 +109,8 @@ ssize_t ast_iostream_read(struct ast_iostream *stream, void *buf, size_t count);
 ssize_t ast_iostream_gets(struct ast_iostream *stream, char *buf, size_t count);
 ssize_t ast_iostream_discard(struct ast_iostream *stream, size_t count);
 ssize_t ast_iostream_write(struct ast_iostream *stream, const void *buf, size_t count);
-ssize_t ast_iostream_printf(struct ast_iostream *stream, const void *fmt, ...);
+ssize_t __attribute__((format(printf, 2, 3))) ast_iostream_printf(
+       struct ast_iostream *stream, const char *fmt, ...);
 
 struct ast_iostream* ast_iostream_from_fd(int *fd);
 int ast_iostream_start_tls(struct ast_iostream **stream, SSL_CTX *ctx, int client);
index 08d1f65..c724e20 100644 (file)
@@ -273,7 +273,7 @@ endif
 
 $(ASTPJ_LIB).$(ASTPJ_SO_VERSION): _ASTLDFLAGS+=-Wl,-soname=$(ASTPJ_LIB).$(ASTPJ_SO_VERSION) $(PJ_LDFLAGS)
 $(ASTPJ_LIB).$(ASTPJ_SO_VERSION): _ASTCFLAGS+=-fPIC -DAST_MODULE=\"asteriskpj\" -DAST_NOT_MODULE $(PJ_CFLAGS)
-$(ASTPJ_LIB).$(ASTPJ_SO_VERSION): LIBS+=$(PJPROJECT_LDLIBS) -lssl -lcrypto -luuid -lm -lpthread $(RT_LIB)
+$(ASTPJ_LIB).$(ASTPJ_SO_VERSION): LIBS+=$(PJPROJECT_LDLIBS) $(OPENSSL_LIB) $(UUID_LIB) -lm -lpthread $(RT_LIB)
 ifeq ($(GNU_LD),1)
     $(ASTPJ_LIB).$(ASTPJ_SO_VERSION): SO_SUPPRESS_SYMBOLS=-Wl,--version-script,libasteriskpj.exports,--warn-common
 endif
@@ -298,7 +298,7 @@ ASTPJ_LIB:=libasteriskpj.dylib
 # /lib or /usr/lib
 $(ASTPJ_LIB): _ASTLDFLAGS+=-dynamiclib -install_name $(ASTLIBDIR)/$(ASTPJ_LIB) $(PJ_LDFLAGS)
 $(ASTPJ_LIB): _ASTCFLAGS+=-fPIC -DAST_MODULE=\"asteriskpj\" $(PJ_CFLAGS) -DAST_NOT_MODULE
-$(ASTPJ_LIB): LIBS+=$(PJPROJECT_LIBS)  -lssl -lcrypto -luuid -lm -lpthread $(RT_LIB)
+$(ASTPJ_LIB): LIBS+=$(PJPROJECT_LIBS)  $(OPENSSL_LIB) $(UUID_LIB) -lm -lpthread $(RT_LIB)
 $(ASTPJ_LIB): SOLINK=$(DYLINK)
 
 # Special rules for building a shared library (not a dynamically loadable module)
index 0f0e661..b375739 100644 (file)
@@ -443,7 +443,7 @@ static int create_jb(struct ast_channel *chan, struct ast_frame *frr)
 
        /* Create a frame log file */
        if (ast_test_flag(jbconf, AST_JB_LOG)) {
-               RAII_VAR(struct ast_channel *, bridged, ast_channel_bridge_peer(chan), ast_channel_cleanup);
+               struct ast_channel *bridged = ast_channel_bridge_peer(chan);
                char safe_logfile[30] = "/tmp/logfile-XXXXXX";
                int safe_fd;
 
@@ -479,6 +479,8 @@ static int create_jb(struct ast_channel *chan, struct ast_frame *frr)
                        jb_framelog("JB_PUT_FIRST {now=%ld}: Dropped frame with ts=%ld and len=%ld\n",
                                now, frr->ts, frr->len);
                }
+
+               ast_channel_cleanup(bridged);
        }
 
        ast_verb(3, "%s jitterbuffer created on channel %s\n", jbimpl->name, ast_channel_name(chan));
index 6868ea1..bcb3f63 100644 (file)
@@ -281,6 +281,12 @@ struct ast_ha *ast_duplicate_ha_list(struct ast_ha *original)
 
        while (start) {
                current = ast_duplicate_ha(start);  /* Create copy of this object */
+               if (!current) {
+                       ast_free_ha(ret);
+
+                       return NULL;
+               }
+
                if (prev) {
                        prev->next = current;           /* Link previous to this object */
                }
@@ -318,7 +324,7 @@ struct ast_acl_list *ast_duplicate_acl_list(struct ast_acl_list *original)
        }
 
        if (!(clone = ast_calloc(1, sizeof(*clone)))) {
-               ast_log(LOG_WARNING, "Failed to allocate ast_acl_list struct while cloning an ACL\n");
+               ast_log(LOG_ERROR, "Failed to allocate ast_acl_list struct while cloning an ACL\n");
                return NULL;
        }
        AST_LIST_HEAD_INIT(clone);
@@ -327,8 +333,10 @@ struct ast_acl_list *ast_duplicate_acl_list(struct ast_acl_list *original)
 
        AST_LIST_TRAVERSE(original, current_cursor, list) {
                if ((acl_new(&current_clone, current_cursor->name))) {
-                       ast_log(LOG_WARNING, "Failed to allocate ast_acl struct while cloning an ACL.");
-                       continue;
+                       ast_log(LOG_ERROR, "Failed to allocate ast_acl struct while cloning an ACL.\n");
+                       ast_free_acl_list(clone);
+                       clone = NULL;
+                       break;
                }
 
                /* Copy data from original ACL to clone ACL */
@@ -338,6 +346,15 @@ struct ast_acl_list *ast_duplicate_acl_list(struct ast_acl_list *original)
                current_clone->is_realtime = current_cursor->is_realtime;
 
                AST_LIST_INSERT_TAIL(clone, current_clone, list);
+
+               if (current_cursor->acl && !current_clone->acl) {
+                       /* Deal with failure after adding to clone so we don't have to free
+                        * current_clone separately. */
+                       ast_log(LOG_ERROR, "Failed to duplicate HA list while cloning ACL.\n");
+                       ast_free_acl_list(clone);
+                       clone = NULL;
+                       break;
+               }
        }
 
        AST_LIST_UNLOCK(original);
@@ -448,6 +465,8 @@ void ast_append_acl(const char *sense, const char *stuff, struct ast_acl_list **
                                if (error) {
                                        *error = 1;
                                }
+                               AST_LIST_UNLOCK(working_list);
+                               return;
                        }
                        // Need to INSERT the ACL at the head here.
                        AST_LIST_INSERT_HEAD(working_list, acl, list);
@@ -477,7 +496,8 @@ void ast_append_acl(const char *sense, const char *stuff, struct ast_acl_list **
                AST_LIST_TRAVERSE(working_list, current, list) {
                        if (!strcasecmp(current->name, tmp)) { /* ACL= */
                                /* Inclusion of the same ACL multiple times isn't a catastrophic error, but it will raise the error flag and skip the entry. */
-                               ast_log(LOG_ERROR, "Named ACL '%s' occurs multiple times in ACL definition. Please update your ACL configuration.", tmp);
+                               ast_log(LOG_ERROR, "Named ACL '%s' occurs multiple times in ACL definition. "
+                                                  "Please update your ACL configuration.\n", tmp);
                                if (error) {
                                        *error = 1;
                                }
@@ -536,6 +556,22 @@ int ast_acl_list_is_empty(struct ast_acl_list *acl_list)
        return 1;
 }
 
+/*!
+ * \internal
+ * \brief Used by ast_append_ha to avoid ast_strdupa in a loop.
+ *
+ * \note This function is only called at debug level 3 and higher.
+ */
+static void debug_ha_sense_appended(struct ast_ha *ha)
+{
+       const char *parsed_mask = ast_strdupa(ast_sockaddr_stringify(&ha->netmask));
+
+       ast_log(LOG_DEBUG, "%s/%s sense %u appended to ACL\n",
+               ast_sockaddr_stringify(&ha->addr),
+               parsed_mask,
+               ha->sense);
+}
+
 struct ast_ha *ast_append_ha(const char *sense, const char *stuff, struct ast_ha *path, int *error)
 {
        struct ast_ha *ha;
@@ -545,7 +581,6 @@ struct ast_ha *ast_append_ha(const char *sense, const char *stuff, struct ast_ha
        char *address = NULL, *mask = NULL;
        int addr_is_v4;
        int allowing = strncasecmp(sense, "p", 1) ? AST_SENSE_DENY : AST_SENSE_ALLOW;
-       const char *parsed_addr, *parsed_mask;
 
        ret = path;
        while (path) {
@@ -653,10 +688,9 @@ struct ast_ha *ast_append_ha(const char *sense, const char *stuff, struct ast_ha
                }
                prev = ha;
 
-               parsed_addr = ast_strdupa(ast_sockaddr_stringify(&ha->addr));
-               parsed_mask = ast_strdupa(ast_sockaddr_stringify(&ha->netmask));
-
-               ast_debug(3, "%s/%s sense %u appended to ACL\n", parsed_addr, parsed_mask, ha->sense);
+               if (DEBUG_ATLEAST(3)) {
+                       debug_ha_sense_appended(ha);
+               }
        }
 
        return ret;
@@ -665,10 +699,11 @@ struct ast_ha *ast_append_ha(const char *sense, const char *stuff, struct ast_ha
 void ast_ha_join(const struct ast_ha *ha, struct ast_str **buf)
 {
        for (; ha; ha = ha->next) {
-               const char *addr = ast_strdupa(ast_sockaddr_stringify_addr(&ha->addr));
-               ast_str_append(buf, 0, "%s%s/%s",
-                              ha->sense == AST_SENSE_ALLOW ? "!" : "",
-                              addr, ast_sockaddr_stringify_addr(&ha->netmask));
+               ast_str_append(buf, 0, "%s%s/",
+                       ha->sense == AST_SENSE_ALLOW ? "!" : "",
+                       ast_sockaddr_stringify_addr(&ha->addr));
+               /* Separated to avoid duplicating stringified addresses. */
+               ast_str_append(buf, 0, "%s", ast_sockaddr_stringify_addr(&ha->netmask));
                if (ha->next) {
                        ast_str_append(buf, 0, ",");
                }
index 3487948..253c745 100644 (file)
@@ -1663,7 +1663,7 @@ static struct ast_json *currency_to_json(const char *name, int cost,
 
 static struct ast_json *charge_to_json(const struct ast_aoc_decoded *decoded)
 {
-       RAII_VAR(struct ast_json *, obj, NULL, ast_json_unref);
+       struct ast_json *obj;
        const char *obj_type;
 
        if (decoded->charge_type != AST_AOC_CHARGE_CURRENCY &&
@@ -1685,7 +1685,7 @@ static struct ast_json *charge_to_json(const struct ast_aoc_decoded *decoded)
                "Type", aoc_charge_type_str(decoded->charge_type),
                "BillingID", aoc_billingid_str(decoded->billing_id),
                "TotalType", aoc_type_of_totaling_str(decoded->total_type),
-               obj_type, ast_json_ref(obj));
+               obj_type, obj);
 }
 
 static struct ast_json *association_to_json(const struct ast_aoc_decoded *decoded)
@@ -1714,8 +1714,8 @@ static struct ast_json *s_to_json(const struct ast_aoc_decoded *decoded)
 
        for (i = 0; i < decoded->aoc_s_count; ++i) {
                struct ast_json *rate;
-               RAII_VAR(struct ast_json *, type, NULL, ast_json_unref);
-               RAII_VAR(struct ast_json *, currency, NULL, ast_json_unref);
+               struct ast_json *type = NULL;
+               struct ast_json *currency;
                const char *charge_item = aoc_charged_item_str(
                        decoded->aoc_s_entries[i].charged_item);
 
@@ -1730,8 +1730,8 @@ static struct ast_json *s_to_json(const struct ast_aoc_decoded *decoded)
                switch (decoded->aoc_s_entries[i].rate_type) {
                case AST_AOC_RATE_TYPE_DURATION:
                {
-                       RAII_VAR(struct ast_json *, time, NULL, ast_json_unref);
-                       RAII_VAR(struct ast_json *, granularity, NULL, ast_json_unref);
+                       struct ast_json *time;
+                       struct ast_json *granularity = NULL;
 
                        currency = currency_to_json(
                                decoded->aoc_s_entries[i].rate.duration.currency_name,
@@ -1749,11 +1749,11 @@ static struct ast_json *s_to_json(const struct ast_aoc_decoded *decoded)
                        }
 
                        type = ast_json_pack("{s:o, s:s, s:o, s:o}",
-                               "Currency", ast_json_ref(currency),
+                               "Currency", currency,
                                "ChargingType", decoded->aoc_s_entries[i].rate.duration.charging_type
                                        ? "StepFunction" : "ContinuousCharging",
-                               "Time", ast_json_ref(time),
-                               "Granularity", granularity ? ast_json_ref(granularity) : ast_json_null());
+                               "Time", time,
+                               "Granularity", granularity ?: ast_json_null());
 
                        break;
                }
@@ -1763,7 +1763,7 @@ static struct ast_json *s_to_json(const struct ast_aoc_decoded *decoded)
                                decoded->aoc_s_entries[i].rate.flat.amount,
                                decoded->aoc_s_entries[i].rate.flat.multiplier);
 
-                       type = ast_json_pack("{s:o}", "Currency", ast_json_ref(currency));
+                       type = ast_json_pack("{s:o}", "Currency", currency);
                        break;
                case AST_AOC_RATE_TYPE_VOLUME:
                        currency = currency_to_json(
@@ -1774,7 +1774,7 @@ static struct ast_json *s_to_json(const struct ast_aoc_decoded *decoded)
                        type = ast_json_pack("{s:s, s:o}",
                                "Unit", aoc_volume_unit_str(
                                        decoded->aoc_s_entries[i].rate.volume.volume_unit),
-                               "Currency", ast_json_ref(currency));
+                               "Currency", currency);
                        break;
                case AST_AOC_RATE_TYPE_SPECIAL_CODE:
                        type = ast_json_pack("{s:i}",
@@ -1786,7 +1786,7 @@ static struct ast_json *s_to_json(const struct ast_aoc_decoded *decoded)
 
                rate = ast_json_pack("{s:s, s:o}",
                        "Chargeable", charge_item,
-                       aoc_rate_type_str(decoded->aoc_s_entries[i].rate_type), ast_json_ref(type));
+                       aoc_rate_type_str(decoded->aoc_s_entries[i].rate_type), type);
                if (ast_json_array_append(rates, rate)) {
                        break;
                }
index 69c96c0..f35c4b7 100644 (file)
@@ -3138,7 +3138,7 @@ struct stasis_topic *ast_mwi_topic(const char *uniqueid)
 
 struct ast_mwi_state *ast_mwi_create(const char *mailbox, const char *context)
 {
-       RAII_VAR(struct ast_mwi_state *, mwi_state, NULL, ao2_cleanup);
+       struct ast_mwi_state *mwi_state;
 
        ast_assert(!ast_strlen_zero(mailbox));
 
@@ -3148,6 +3148,7 @@ struct ast_mwi_state *ast_mwi_create(const char *mailbox, const char *context)
        }
 
        if (ast_string_field_init(mwi_state, 256)) {
+               ao2_ref(mwi_state, -1);
                return NULL;
        }
        if (!ast_strlen_zero(context)) {
@@ -3156,7 +3157,6 @@ struct ast_mwi_state *ast_mwi_create(const char *mailbox, const char *context)
                ast_string_field_set(mwi_state, uniqueid, mailbox);
        }
 
-       ao2_ref(mwi_state, +1);
        return mwi_state;
 }
 
@@ -3329,8 +3329,8 @@ struct stasis_message *ast_mwi_blob_create(struct ast_mwi_state *mwi_state,
                                               struct stasis_message_type *message_type,
                                               struct ast_json *blob)
 {
-       RAII_VAR(struct ast_mwi_blob *, obj, NULL, ao2_cleanup);
-       RAII_VAR(struct stasis_message *, msg, NULL, ao2_cleanup);
+       struct ast_mwi_blob *obj;
+       struct stasis_message *msg;
 
        ast_assert(blob != NULL);
 
@@ -3349,11 +3349,8 @@ struct stasis_message *ast_mwi_blob_create(struct ast_mwi_state *mwi_state,
 
        /* This is not a normal MWI event.  Only used by the MinivmNotify app. */
        msg = stasis_message_create(message_type, obj);
-       if (!msg) {
-               return NULL;
-       }
+       ao2_ref(obj, -1);
 
-       ao2_ref(msg, +1);
        return msg;
 }
 
index 77046f2..db80670 100644 (file)
@@ -3001,121 +3001,70 @@ static char *cli_prompt(EditLine *editline)
        return ast_str_buffer(prompt);
 }
 
-static void destroy_match_list(char **match_list, int matches)
+static struct ast_vector_string *ast_el_strtoarr(char *buf)
 {
-       if (match_list) {
-               int idx;
+       char *retstr;
+       struct ast_vector_string *vec = ast_calloc(1, sizeof(*vec));
 
-               for (idx = 0; idx < matches; ++idx) {
-                       ast_free(match_list[idx]);
-               }
-               ast_free(match_list);
+       if (!vec) {
+               return NULL;
        }
-}
-
-static char **ast_el_strtoarr(char *buf)
-{
-       char *retstr;
-       char **match_list = NULL;
-       char **new_list;
-       size_t match_list_len = 1;
-       int matches = 0;
 
        while ((retstr = strsep(&buf, " "))) {
                if (!strcmp(retstr, AST_CLI_COMPLETE_EOF)) {
                        break;
                }
-               if (matches + 1 >= match_list_len) {
-                       match_list_len <<= 1;
-                       new_list = ast_realloc(match_list, match_list_len * sizeof(char *));
-                       if (!new_list) {
-                               destroy_match_list(match_list, matches);
-                               return NULL;
-                       }
-                       match_list = new_list;
+
+               /* Older daemons sent duplicates. */
+               if (AST_VECTOR_GET_CMP(vec, retstr, strcasecmp)) {
+                       continue;
                }
 
                retstr = ast_strdup(retstr);
-               if (!retstr) {
-                       destroy_match_list(match_list, matches);
-                       return NULL;
+               /* Older daemons sent unsorted. */
+               if (!retstr || AST_VECTOR_ADD_SORTED(vec, retstr, strcasecmp)) {
+                       ast_free(retstr);
+                       goto vector_cleanup;
                }
-               match_list[matches++] = retstr;
        }
 
-       if (!match_list) {
-               return NULL;
+       if (!AST_VECTOR_SIZE(vec)) {
+               goto vector_cleanup;
        }
 
-       if (matches >= match_list_len) {
-               new_list = ast_realloc(match_list, (match_list_len + 1) * sizeof(char *));
-               if (!new_list) {
-                       destroy_match_list(match_list, matches);
-                       return NULL;
-               }
-               match_list = new_list;
-       }
+       return vec;
 
-       match_list[matches] = NULL;
+vector_cleanup:
+       AST_VECTOR_CALLBACK_VOID(vec, ast_free);
+       AST_VECTOR_PTR_FREE(vec);
 
-       return match_list;
-}
-
-static int ast_el_sort_compare(const void *i1, const void *i2)
-{
-       char *s1, *s2;
-
-       s1 = ((char **)i1)[0];
-       s2 = ((char **)i2)[0];
-
-       return strcasecmp(s1, s2);
+       return NULL;
 }
 
-static int ast_cli_display_match_list(char **matches, int len, int max)
+static void ast_cli_display_match_list(struct ast_vector_string *matches, int max)
 {
-       int i, idx, limit, count;
-       int screenwidth = 0;
-       int numoutput = 0, numoutputline = 0;
-
-       screenwidth = ast_get_termcols(STDOUT_FILENO);
-
+       int idx = 1;
        /* find out how many entries can be put on one line, with two spaces between strings */
-       limit = screenwidth / (max + 2);
-       if (limit == 0)
-               limit = 1;
-
-       /* how many lines of output */
-       count = len / limit;
-       if (count * limit < len)
-               count++;
+       int limit = ast_get_termcols(STDOUT_FILENO) / (max + 2);
 
-       idx = 1;
-
-       qsort(&matches[0], (size_t)(len), sizeof(char *), ast_el_sort_compare);
-
-       for (; count > 0; count--) {
-               numoutputline = 0;
-               for (i = 0; i < limit && matches[idx]; i++, idx++) {
+       if (limit == 0) {
+               limit = 1;
+       }
 
-                       /* Don't print dupes */
-                       if ( (matches[idx+1] != NULL && strcmp(matches[idx], matches[idx+1]) == 0 ) ) {
-                               i--;
-                               ast_free(matches[idx]);
-                               matches[idx] = NULL;
-                               continue;
-                       }
+       for (;;) {
+               int numoutputline;
 
-                       numoutput++;
+               for (numoutputline = 0; numoutputline < limit && idx < AST_VECTOR_SIZE(matches); idx++) {
                        numoutputline++;
-                       fprintf(stdout, "%-*s  ", max, matches[idx]);
-                       ast_free(matches[idx]);
-                       matches[idx] = NULL;
+                       fprintf(stdout, "%-*s  ", max, AST_VECTOR_GET(matches, idx));
+               }
+
+               if (!numoutputline) {
+                       break;
                }
-               if (numoutputline > 0)
-                       fprintf(stdout, "\n");
-       }
 
-       return numoutput;
+               fprintf(stdout, "\n");
+       }
 }
 
 
@@ -3123,10 +3072,9 @@ static char *cli_complete(EditLine *editline, int ch)
 {
        int len = 0;
        char *ptr;
-       int nummatches = 0;
-       char **matches;
+       struct ast_vector_string *matches;
        int retval = CC_ERROR;
-       char buf[2048], savechr;
+       char savechr;
        int res;
 
        LineInfo *lf = (LineInfo *)el_line(editline);
@@ -3147,96 +3095,90 @@ static char *cli_complete(EditLine *editline, int ch)
        len = lf->cursor - ptr;
 
        if (ast_opt_remote) {
-               snprintf(buf, sizeof(buf), "_COMMAND NUMMATCHES \"%s\" \"%s\"", lf->buffer, ptr);
-               fdsend(ast_consock, buf);
-               if ((res = read(ast_consock, buf, sizeof(buf) - 1)) < 0) {
-                       return (char*)(CC_ERROR);
+#define CMD_MATCHESARRAY "_COMMAND MATCHESARRAY \"%s\" \"%s\""
+               char *mbuf;
+               char *new_mbuf;
+               int mlen = 0, maxmbuf = 2048;
+
+               /* Start with a 2048 byte buffer */
+               mbuf = ast_malloc(maxmbuf);
+
+               /* This will run snprintf twice at most. */
+               while (mbuf && (mlen = snprintf(mbuf, maxmbuf, CMD_MATCHESARRAY, lf->buffer, ptr)) > maxmbuf) {
+                       /* Return value does not include space for NULL terminator. */
+                       maxmbuf = mlen + 1;
+                       ast_free(mbuf);
+                       mbuf = ast_malloc(maxmbuf);
                }
-               buf[res] = '\0';
-               nummatches = atoi(buf);
-
-               if (nummatches > 0) {
-                       char *mbuf;
-                       char *new_mbuf;
-                       int mlen = 0, maxmbuf = 2048;
-
-                       /* Start with a 2048 byte buffer */
-                       if (!(mbuf = ast_malloc(maxmbuf))) {
-                               *((char *) lf->cursor) = savechr;
-                               return (char *)(CC_ERROR);
-                       }
-                       snprintf(buf, sizeof(buf), "_COMMAND MATCHESARRAY \"%s\" \"%s\"", lf->buffer, ptr);
-                       fdsend(ast_consock, buf);
-                       res = 0;
-                       mbuf[0] = '\0';
-                       while (!strstr(mbuf, AST_CLI_COMPLETE_EOF) && res != -1) {
-                               if (mlen + 1024 > maxmbuf) {
-                                       /* Every step increment buffer 1024 bytes */
-                                       maxmbuf += 1024;
-                                       new_mbuf = ast_realloc(mbuf, maxmbuf);
-                                       if (!new_mbuf) {
-                                               ast_free(mbuf);
-                                               *((char *) lf->cursor) = savechr;
-                                               return (char *)(CC_ERROR);
-                                       }
-                                       mbuf = new_mbuf;
+
+               if (!mbuf) {
+                       *((char *) lf->cursor) = savechr;
+
+                       return (char *)(CC_ERROR);
+               }
+
+               fdsend(ast_consock, mbuf);
+               res = 0;
+               mlen = 0;
+               mbuf[0] = '\0';
+
+               while (!strstr(mbuf, AST_CLI_COMPLETE_EOF) && res != -1) {
+                       if (mlen + 1024 > maxmbuf) {
+                               /* Expand buffer to the next 1024 byte increment. */
+                               maxmbuf = mlen + 1024;
+                               new_mbuf = ast_realloc(mbuf, maxmbuf);
+                               if (!new_mbuf) {
+                                       ast_free(mbuf);
+                                       *((char *) lf->cursor) = savechr;
+
+                                       return (char *)(CC_ERROR);
                                }
-                               /* Only read 1024 bytes at a time */
-                               res = read(ast_consock, mbuf + mlen, 1024);
-                               if (res > 0)
-                                       mlen += res;
+                               mbuf = new_mbuf;
                        }
-                       mbuf[mlen] = '\0';
+                       /* Only read 1024 bytes at a time */
+                       res = read(ast_consock, mbuf + mlen, 1024);
+                       if (res > 0) {
+                               mlen += res;
+                       }
+               }
+               mbuf[mlen] = '\0';
 
-                       matches = ast_el_strtoarr(mbuf);
-                       ast_free(mbuf);
-               } else
-                       matches = (char **) NULL;
+               matches = ast_el_strtoarr(mbuf);
+               ast_free(mbuf);
        } else {
-               char **p, *oldbuf=NULL;
-               nummatches = 0;
-               matches = ast_cli_completion_matches((char *)lf->buffer,ptr);
-               for (p = matches; p && *p; p++) {
-                       if (!oldbuf || strcmp(*p,oldbuf))
-                               nummatches++;
-                       oldbuf = *p;
-               }
+               matches = ast_cli_completion_vector((char *)lf->buffer, ptr);
        }
 
        if (matches) {
                int i;
-               int matches_num, maxlen, match_len;
+               int maxlen, match_len;
+               const char *best_match = AST_VECTOR_GET(matches, 0);
 
-               if (matches[0][0] != '\0') {
+               if (!ast_strlen_zero(best_match)) {
                        el_deletestr(editline, (int) len);
-                       el_insertstr(editline, matches[0]);
+                       el_insertstr(editline, best_match);
                        retval = CC_REFRESH;
                }
 
-               if (nummatches == 1) {
+               if (AST_VECTOR_SIZE(matches) == 2) {
                        /* Found an exact match */
                        el_insertstr(editline, " ");
                        retval = CC_REFRESH;
                } else {
                        /* Must be more than one match */
-                       for (i = 1, maxlen = 0; matches[i]; i++) {
-                               match_len = strlen(matches[i]);
-                               if (match_len > maxlen)
+                       for (i = 1, maxlen = 0; i < AST_VECTOR_SIZE(matches); i++) {
+                               match_len = strlen(AST_VECTOR_GET(matches, i));
+                               if (match_len > maxlen) {
                                        maxlen = match_len;
+                               }
                        }
-                       matches_num = i - 1;
-                       if (matches_num >1) {
-                               fprintf(stdout, "\n");
-                               ast_cli_display_match_list(matches, nummatches, maxlen);
-                               retval = CC_REDISPLAY;
-                       } else {
-                               el_insertstr(editline," ");
-                               retval = CC_REFRESH;
-                       }
+
+                       fprintf(stdout, "\n");
+                       ast_cli_display_match_list(matches, maxlen);
+                       retval = CC_REDISPLAY;
                }
-               for (i = 0; matches[i]; i++)
-                       ast_free(matches[i]);
-               ast_free(matches);
+               AST_VECTOR_CALLBACK_VOID(matches, ast_free);
+               AST_VECTOR_PTR_FREE(matches);
        }
 
        *((char *) lf->cursor) = savechr;
index e31f385..fd6bac0 100644 (file)
@@ -1547,6 +1547,23 @@ static void stimulate_attended_transfer(struct attended_transfer_properties *pro
        ao2_unlock(props);
 }
 
+static void remove_attended_transfer_stimulus(struct attended_transfer_properties *props,
+               enum attended_transfer_stimulus stimulus)
+{
+       struct stimulus_list *list;
+
+       ao2_lock(props);
+       AST_LIST_TRAVERSE_SAFE_BEGIN(&props->stimulus_queue, list, next) {
+               if (list->stimulus == stimulus) {
+                       AST_LIST_REMOVE_CURRENT(next);
+                       ast_free(list);
+                       break;
+               }
+       }
+       AST_LIST_TRAVERSE_SAFE_END;
+       ao2_unlock(props);
+}
+
 /*!
  * \brief Get a desired transfer party for a bridge the transferer is not in.
  *
@@ -2339,6 +2356,10 @@ static enum attended_transfer_state blond_nonfinal_exit(struct attended_transfer
                return TRANSFER_RESUME;
        case STIMULUS_TIMEOUT:
                ast_softhangup(props->recall_target, AST_SOFTHANGUP_EXPLICIT);
+               /* It is possible before we hung them up that they queued up a recall target answer
+                * so we remove it if present as it should not exist.
+                */
+               remove_attended_transfer_stimulus(props, STIMULUS_RECALL_TARGET_ANSWER);
        case STIMULUS_RECALL_TARGET_HANGUP:
                props->recall_target = ast_channel_unref(props->recall_target);
                return TRANSFER_RECALLING;
@@ -2803,7 +2824,8 @@ static struct ast_frame *transfer_target_framehook_cb(struct ast_channel *chan,
 
        if (event == AST_FRAMEHOOK_EVENT_READ &&
                        frame && frame->frametype == AST_FRAME_CONTROL &&
-                       frame->subclass.integer == AST_CONTROL_ANSWER) {
+                       frame->subclass.integer == AST_CONTROL_ANSWER &&
+                       !ast_check_hangup(chan)) {
 
                ast_debug(1, "Detected an answer for recall attempt on attended transfer %p\n", props);
                if (props->superstate == SUPERSTATE_TRANSFER) {
index a9d15b0..445de93 100644 (file)
@@ -1022,9 +1022,9 @@ void ast_set_cc_callback_sub(struct ast_cc_config_params *config, const char * c
 
 static int cc_publish(struct stasis_message_type *message_type, int core_id, struct ast_json *extras)
 {
-       RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
-       RAII_VAR(struct ast_json_payload *, payload, NULL, ao2_cleanup);
-       RAII_VAR(struct stasis_message *, message, NULL, ao2_cleanup);
+       struct ast_json *blob;
+       struct ast_json_payload *payload;
+       struct stasis_message *message;
 
        if (!message_type) {
                return -1;
@@ -1040,121 +1040,138 @@ static int cc_publish(struct stasis_message_type *message_type, int core_id, str
                ast_json_object_update(blob, extras);
        }
 
-       if (!(payload = ast_json_payload_create(blob))) {
+       payload = ast_json_payload_create(blob);
+       ast_json_unref(blob);
+
+       if (!payload) {
                return -1;
        }
 
-       if (!(message = stasis_message_create(message_type, payload))) {
+       message = stasis_message_create(message_type, payload);
+       ao2_ref(payload, -1);
+
+       if (!message) {
                return -1;
        }
 
        stasis_publish(ast_system_topic(), message);
+       ao2_ref(message, -1);
 
        return 0;
 }
 
 static void cc_publish_available(int core_id, const char *callee, const char *service)
 {
-       RAII_VAR(struct ast_json *, extras, NULL, ast_json_unref);
+       struct ast_json *extras;
 
        extras = ast_json_pack("{s: s, s: s}",
                "callee", callee,
                "service", service);
 
        cc_publish(ast_cc_available_type(), core_id, extras);
+       ast_json_unref(extras);
 }
 
 static void cc_publish_offertimerstart(int core_id, const char *caller, unsigned int expires)
 {
-       RAII_VAR(struct ast_json *, extras, NULL, ast_json_unref);
+       struct ast_json *extras;
 
        extras = ast_json_pack("{s: s, s: i}",
                "caller", caller,
                "expires", expires);
 
        cc_publish(ast_cc_offertimerstart_type(), core_id, extras);
+       ast_json_unref(extras);
 }
 
 static void cc_publish_requested(int core_id, const char *caller, const char *callee)
 {
-       RAII_VAR(struct ast_json *, extras, NULL, ast_json_unref);
+       struct ast_json *extras;
 
        extras = ast_json_pack("{s: s, s: s}",
                "caller", caller,
                "callee", callee);
 
        cc_publish(ast_cc_requested_type(), core_id, extras);
+       ast_json_unref(extras);
 }
 
 static void cc_publish_requestacknowledged(int core_id, const char *caller)
 {
-       RAII_VAR(struct ast_json *, extras, NULL, ast_json_unref);
+       struct ast_json *extras;
 
        extras = ast_json_pack("{s: s}",
                "caller", caller);
 
        cc_publish(ast_cc_requestacknowledged_type(), core_id, extras);
+       ast_json_unref(extras);
 }
 
 static void cc_publish_callerstopmonitoring(int core_id, const char *caller)
 {
-       RAII_VAR(struct ast_json *, extras, NULL, ast_json_unref);
+       struct ast_json *extras;
 
        extras = ast_json_pack("{s: s}",
                "caller", caller);
 
        cc_publish(ast_cc_callerstopmonitoring_type(), core_id, extras);
+       ast_json_unref(extras);
 }
 
 static void cc_publish_callerstartmonitoring(int core_id, const char *caller)
 {
-       RAII_VAR(struct ast_json *, extras, NULL, ast_json_unref);
+       struct ast_json *extras;
 
        extras = ast_json_pack("{s: s}",
                "caller", caller);
 
        cc_publish(ast_cc_callerstartmonitoring_type(), core_id, extras);
+       ast_json_unref(extras);
 }
 
 static void cc_publish_callerrecalling(int core_id, const char *caller)
 {
-       RAII_VAR(struct ast_json *, extras, NULL, ast_json_unref);
+       struct ast_json *extras;
 
        extras = ast_json_pack("{s: s}",
                "caller", caller);
 
        cc_publish(ast_cc_callerrecalling_type(), core_id, extras);
+       ast_json_unref(extras);
 }
 
 static void cc_publish_recallcomplete(int core_id, const char *caller)
 {
-       RAII_VAR(struct ast_json *, extras, NULL, ast_json_unref);
+       struct ast_json *extras;
 
        extras = ast_json_pack("{s: s}",
                "caller", caller);
 
        cc_publish(ast_cc_recallcomplete_type(), core_id, extras);
+       ast_json_unref(extras);
 }
 
 static void cc_publish_failure(int core_id, const char *caller, const char *reason)
 {
-       RAII_VAR(struct ast_json *, extras, NULL, ast_json_unref);
+       struct ast_json *extras;
 
        extras = ast_json_pack("{s: s, s: s}",
                "caller", caller,
                "reason", reason);
 
        cc_publish(ast_cc_failure_type(), core_id, extras);
+       ast_json_unref(extras);
 }
 
 static void cc_publish_monitorfailed(int core_id, const char *callee)
 {
-       RAII_VAR(struct ast_json *, extras, NULL, ast_json_unref);
+       struct ast_json *extras;
 
        extras = ast_json_pack("{s: s}",
                "callee", callee);
 
        cc_publish(ast_cc_monitorfailed_type(), core_id, extras);
+       ast_json_unref(extras);
 }
 
 struct cc_monitor_backend {
index 5c16e8b..0f023b2 100644 (file)
@@ -959,7 +959,7 @@ static char *handle_chanlist(struct ast_cli_entry *e, int cmd, struct ast_cli_ar
 #define VERBOSE_FORMAT_STRING  "%-20.20s %-20.20s %-16.16s %4d %-7.7s %-12.12s %-25.25s %-15.15s %8.8s %-11.11s %-11.11s %-20.20s\n"
 #define VERBOSE_FORMAT_STRING2 "%-20.20s %-20.20s %-16.16s %-4.4s %-7.7s %-12.12s %-25.25s %-15.15s %8.8s %-11.11s %-11.11s %-20.20s\n"
 
-       RAII_VAR(struct ao2_container *, channels, NULL, ao2_cleanup);
+       struct ao2_container *channels;
        struct ao2_iterator it_chans;
        struct stasis_message *msg;
        int numchans = 0, concise = 0, verbose = 0, count = 0;
@@ -1073,6 +1073,7 @@ static char *handle_chanlist(struct ast_cli_entry *e, int cmd, struct ast_cli_ar
 
                ast_cli(a->fd, "%d call%s processed\n", ast_processed_calls(), ESS(ast_processed_calls()));
        }
+       ao2_ref(channels, -1);
 
        return CLI_SUCCESS;
 
@@ -1685,7 +1686,7 @@ char *ast_cli_complete(const char *word, const char * const choices[], int state
 char *ast_complete_channels(const char *line, const char *word, int pos, int state, int rpos)
 {
        int wordlen = strlen(word), which = 0;
-       RAII_VAR(struct ao2_container *, cached_channels, NULL, ao2_cleanup);
+       struct ao2_container *cached_channels;
        char *ret = NULL;
        struct ao2_iterator iter;
        struct stasis_message *msg;
@@ -1709,6 +1710,7 @@ char *ast_complete_channels(const char *line, const char *word, int pos, int sta
                }
        }
        ao2_iterator_destroy(&iter);
+       ao2_ref(cached_channels, -1);
 
        return ret;
 }
@@ -2473,91 +2475,163 @@ static char *parse_args(const char *s, int *argc, const char *argv[], int max, i
 /*! \brief Return the number of unique matches for the generator */
 int ast_cli_generatornummatches(const char *text, const char *word)
 {
-       int matches = 0, i = 0;
-       char *buf = NULL, *oldbuf = NULL;
+       int matches;
+       struct ast_vector_string *vec = ast_cli_completion_vector(text, word);
 
-       while ((buf = ast_cli_generator(text, word, i++))) {
-               if (!oldbuf || strcmp(buf,oldbuf))
-                       matches++;
-               if (oldbuf)
-                       ast_free(oldbuf);
-               oldbuf = buf;
+       if (!vec) {
+               return 0;
        }
-       if (oldbuf)
-               ast_free(oldbuf);
+
+       matches = AST_VECTOR_SIZE(vec) - 1;
+       AST_VECTOR_CALLBACK_VOID(vec, ast_free);
+       AST_VECTOR_PTR_FREE(vec);
+
        return matches;
 }
 
-static void destroy_match_list(char **match_list, int matches)
+char **ast_cli_completion_matches(const char *text, const char *word)
+{
+       struct ast_vector_string *vec = ast_cli_completion_vector(text, word);
+       char **match_list;
+
+       if (!vec) {
+               return NULL;
+       }
+
+       if (AST_VECTOR_APPEND(vec, NULL)) {
+               /* We failed to NULL terminate the elements */
+               AST_VECTOR_CALLBACK_VOID(vec, ast_free);
+               AST_VECTOR_PTR_FREE(vec);
+
+               return NULL;
+       }
+
+       match_list = AST_VECTOR_STEAL_ELEMENTS(vec);
+       AST_VECTOR_PTR_FREE(vec);
+
+       return match_list;
+}
+
+AST_THREADSTORAGE_RAW(completion_storage);
+
+/*!
+ * \internal
+ * \brief Add a value to the vector.
+ *
+ * \param vec Vector to add \a value to. Must be from threadstorage.
+ * \param value The value to add.
+ *
+ * \retval 0 Success
+ * \retval -1 Failure
+ */
+static int cli_completion_vector_add(struct ast_vector_string *vec, char *value)
 {
-       if (match_list) {
-               int idx;
+       if (!value) {
+               return 0;
+       }
+
+       if (!vec || AST_VECTOR_ADD_SORTED(vec, value, strcasecmp)) {
+               if (vec) {
+                       ast_threadstorage_set_ptr(&completion_storage, NULL);
 
-               for (idx = 1; idx < matches; ++idx) {
-                       ast_free(match_list[idx]);
+                       AST_VECTOR_CALLBACK_VOID(vec, ast_free);
+                       AST_VECTOR_FREE(vec);
                }
-               ast_free(match_list);
+               ast_free(value);
+
+               return -1;
        }
+
+       return 0;
 }
 
-char **ast_cli_completion_matches(const char *text, const char *word)
+int ast_cli_completion_add(char *value)
 {
-       char **match_list = NULL, *retstr, *prevstr;
-       char **new_list;
-       size_t match_list_len, max_equal, which, i;
-       int matches = 0;
+       return cli_completion_vector_add(ast_threadstorage_get_ptr(&completion_storage), value);
+}
 
-       /* leave entry 0 free for the longest common substring */
-       match_list_len = 1;
-       while ((retstr = ast_cli_generator(text, word, matches)) != NULL) {
-               if (matches + 1 >= match_list_len) {
-                       match_list_len <<= 1;
-                       new_list = ast_realloc(match_list, match_list_len * sizeof(*match_list));
-                       if (!new_list) {
-                               destroy_match_list(match_list, matches);
-                               return NULL;
-                       }
-                       match_list = new_list;
+struct ast_vector_string *ast_cli_completion_vector(const char *text, const char *word)
+{
+       char *retstr, *prevstr;
+       size_t max_equal;
+       size_t which = 0;
+       struct ast_vector_string *vec = ast_calloc(1, sizeof(*vec));
+
+       /* Recursion into this function is a coding error. */
+       ast_assert(!ast_threadstorage_get_ptr(&completion_storage));
+
+       if (!vec) {
+               return NULL;
+       }
+
+       if (ast_threadstorage_set_ptr(&completion_storage, vec)) {
+               ast_log(LOG_ERROR, "Failed to initialize threadstorage for completion.\n");
+               ast_free(vec);
+
+               return NULL;
+       }
+
+       while ((retstr = ast_cli_generator(text, word, which)) != NULL) {
+               if (cli_completion_vector_add(vec, retstr)) {
+                       ast_threadstorage_set_ptr(&completion_storage, NULL);
+
+                       goto vector_cleanup;
                }
-               match_list[++matches] = retstr;
+
+               ++which;
        }
 
-       if (!match_list) {
-               return match_list; /* NULL */
+       ast_threadstorage_set_ptr(&completion_storage, NULL);
+
+       if (!AST_VECTOR_SIZE(vec)) {
+               AST_VECTOR_PTR_FREE(vec);
+
+               return NULL;
        }
 
+       prevstr = AST_VECTOR_GET(vec, 0);
+       max_equal = strlen(prevstr);
+       which = 1;
+
        /* Find the longest substring that is common to all results
         * (it is a candidate for completion), and store a copy in entry 0.
         */
-       prevstr = match_list[1];
-       max_equal = strlen(prevstr);
-       for (which = 2; which <= matches; which++) {
-               for (i = 0; i < max_equal && toupper(prevstr[i]) == toupper(match_list[which][i]); i++)
+       while (which < AST_VECTOR_SIZE(vec)) {
+               size_t i = 0;
+
+               retstr = AST_VECTOR_GET(vec, which);
+               /* Check for and remove duplicate strings. */
+               if (!strcasecmp(prevstr, retstr)) {
+                       AST_VECTOR_REMOVE(vec, which, 1);
+                       ast_free(retstr);
+
                        continue;
+               }
+
+               while (i < max_equal && toupper(prevstr[i]) == toupper(retstr[i])) {
+                       i++;
+               }
+
                max_equal = i;
+               prevstr = retstr;
+               ++which;
        }
 
-       retstr = ast_malloc(max_equal + 1);
-       if (!retstr) {
-               destroy_match_list(match_list, matches);
-               return NULL;
-       }
-       ast_copy_string(retstr, match_list[1], max_equal + 1);
-       match_list[0] = retstr;
+       /* Insert longest match to position 0. */
+       retstr = ast_strndup(AST_VECTOR_GET(vec, 0), max_equal);
+       if (!retstr || AST_VECTOR_INSERT_AT(vec, 0, retstr)) {
+               ast_free(retstr);
 
-       /* ensure that the array is NULL terminated */
-       if (matches + 1 >= match_list_len) {
-               new_list = ast_realloc(match_list, (match_list_len + 1) * sizeof(*match_list));
-               if (!new_list) {
-                       ast_free(retstr);
-                       destroy_match_list(match_list, matches);
-                       return NULL;
-               }
-               match_list = new_list;
+               goto vector_cleanup;
        }
-       match_list[matches + 1] = NULL;
 
-       return match_list;
+       return vec;
+
+vector_cleanup:
+       AST_VECTOR_CALLBACK_VOID(vec, ast_free);
+       AST_VECTOR_PTR_FREE(vec);
+
+       return NULL;
 }
 
 /*! \brief returns true if there are more words to match */
index 2a2601d..d918633 100644 (file)
@@ -443,7 +443,7 @@ ssize_t ast_iostream_write(struct ast_iostream *stream, const void *buf, size_t
        }
 }
 
-ssize_t ast_iostream_printf(struct ast_iostream *stream, const void *fmt, ...)
+ssize_t ast_iostream_printf(struct ast_iostream *stream, const char *fmt, ...)
 {
        char sbuf[512], *buf = sbuf;
        int len, len2, ret = -1;
index 8b19e24..e2e256f 100644 (file)
@@ -37,7 +37,7 @@
 #endif
 
 #if defined(HAVE_OPENSSL) && \
-       !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
+       (!defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER))
 
 #include <dlfcn.h>
 
index add6a42..2238975 100644 (file)
@@ -117,14 +117,20 @@ static int modules_loaded;
 
 struct ast_module {
        const struct ast_module_info *info;
-       /* Used to get module references into refs log */
+       /*! Used to get module references into refs log */
        void *ref_debug;
-       void *lib;                                      /* the shared lib, or NULL if embedded */
-       int usecount;                                   /* the number of 'users' currently in this module */
-       struct module_user_list users;                  /* the list of users in the module */
+       /*! The shared lib. */
+       void *lib;
+       /*! Number of 'users' and other references currently holding the module. */
+       int usecount;
+       /*! List of users holding the module. */
+       struct module_user_list users;
        struct {
+               /*! The module running and ready to accept requests. */
                unsigned int running:1;
+               /*! The module has declined to start. */
                unsigned int declined:1;
+               /*! This module is being held open until it's time to shutdown. */
                unsigned int keepuntilshutdown:1;
        } flags;
        AST_LIST_ENTRY(ast_module) list_entry;
index 1d31c29..fcda752 100644 (file)
@@ -49,6 +49,7 @@ PATCH=@PATCH@
 SED=@SED@
 NM=@NM@
 CAT=@CAT@
+CUT=@CUT@
 
 BUILD_PLATFORM=@BUILD_PLATFORM@
 BUILD_CPU=@BUILD_CPU@
@@ -73,7 +74,6 @@ CONFIG_LDFLAGS=@CONFIG_LDFLAGS@
 CONFIG_SIGNED_CHAR=@CONFIG_SIGNED_CHAR@
 
 GNU_LD=@GNU_LD@
-WEAKREF=@PBX_WEAKREF@
 HAVE_DYNAMIC_LIST=@PBX_DYNAMIC_LIST@
 
 prefix = @prefix@
index 9cafa56..590ce61 100644 (file)
 /* Define to 1 if you have the `asprintf' function. */
 #undef HAVE_ASPRINTF
 
-/* Define to 1 if your GCC C compiler supports the 'weak' attribute. */
-#undef HAVE_ATTRIBUTE_weak
-
-/* Define to 1 if your GCC C compiler supports the 'weak_import' attribute. */
-#undef HAVE_ATTRIBUTE_weak_import
-
-/* Define to 1 if your GCC C compiler supports the 'weakref' attribute. */
-#undef HAVE_ATTRIBUTE_weakref
-
 /* Define to 1 if you have the curses library. */
 #undef HAVE_CURSES
 
index 4235ea0..13a330b 100755 (executable)
@@ -1,5 +1,4 @@
 #! /bin/sh
-# From configure.ac Revision.
 # Guess values for system-dependent variables and create Makefiles.
 # Generated by GNU Autoconf 2.69.
 #
@@ -655,7 +654,6 @@ ALLOCA
 EGREP
 GREP
 CPP
-PBX_WEAKREF
 MENUSELECT_DEBUG
 GNU_MAKE
 OBJEXT
@@ -2218,7 +2216,6 @@ ac_config_headers="$ac_config_headers autoconfig.h"
 
 
 
-
 ac_aux_dir=
 for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
   if test -f "$ac_dir/install-sh"; then
@@ -3194,305 +3191,6 @@ fi
 
 
 
-# Support weak symbols on a platform specific basis.  The Mac OS X
-# (Darwin) support must be isolated from the other platforms because
-# it has caused other platforms to fail.
-#
-case "${OSARCH}" in
-       darwin*)
-       # Allow weak symbol support on Darwin platforms only because there
-       # is active community support for it.
-       # However, Darwin seems to break weak symbols for each new version.
-       #
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiler 'attribute weak_import' support" >&5
-$as_echo_n "checking for compiler 'attribute weak_import' support... " >&6; }
-saved_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -Wall -Wno-unused -Werror"
-PBX_WEAKREF=0
-
-if test "x" = "x"
-then
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
- void __attribute__((weak_import)) *test(void *muffin, ...) {return (void *) 0;}
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-       PBX_WEAKREF=1
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_ATTRIBUTE_weak_import 1
-_ACEOF
-
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-else
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
- void __attribute__(()) *test(void *muffin, ...) ;
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-       PBX_WEAKREF=1
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_ATTRIBUTE_weak_import 1
-_ACEOF
-
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CFLAGS="$saved_CFLAGS"
-
-
-
-       # Several other platforms including Linux have GCC versions that
-       # define the weak attribute.  However, this attribute is only
-       # setup for use in the code by Darwin.
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiler 'attribute weak' support" >&5
-$as_echo_n "checking for compiler 'attribute weak' support... " >&6; }
-saved_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -Wall -Wno-unused -Werror"
-PBX_WEAKREF=0
-
-if test "x" = "x"
-then
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
- void __attribute__((weak)) *test(void *muffin, ...) {return (void *) 0;}
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-       PBX_WEAKREF=1
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_ATTRIBUTE_weak 1
-_ACEOF
-
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-else
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
- void __attribute__(()) *test(void *muffin, ...) ;
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-       PBX_WEAKREF=1
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_ATTRIBUTE_weak 1
-_ACEOF
-
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CFLAGS="$saved_CFLAGS"
-
-
-       ;;
-       linux-gnu)
-       # Primarily support weak symbols on Linux platforms.
-       #
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiler 'attribute weakref' support" >&5
-$as_echo_n "checking for compiler 'attribute weakref' support... " >&6; }
-saved_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -Wall -Wno-unused -Werror"
-PBX_WEAKREF=0
-
-if test "xweakref("foo")" = "x"
-then
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-static void __attribute__((weakref)) *test(void *muffin, ...) {return (void *) 0;}
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-       PBX_WEAKREF=1
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_ATTRIBUTE_weakref 1
-_ACEOF
-
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-else
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-static void __attribute__((weakref("foo"))) *test(void *muffin, ...) ;
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-       PBX_WEAKREF=1
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_ATTRIBUTE_weakref 1
-_ACEOF
-
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CFLAGS="$saved_CFLAGS"
-
-
-       ;;
-       *)
-       # Allow weak symbols on other platforms.  However, any problems
-       # with this feature on other platforms must be fixed by the
-       # community.
-       #
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiler 'attribute weakref' support" >&5
-$as_echo_n "checking for compiler 'attribute weakref' support... " >&6; }
-saved_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -Wall -Wno-unused -Werror"
-PBX_WEAKREF=0
-
-if test "xweakref("foo")" = "x"
-then
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-static void __attribute__((weakref)) *test(void *muffin, ...) {return (void *) 0;}
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-       PBX_WEAKREF=1
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_ATTRIBUTE_weakref 1
-_ACEOF
-
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-else
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-static void __attribute__((weakref("foo"))) *test(void *muffin, ...) ;
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-       PBX_WEAKREF=1
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_ATTRIBUTE_weakref 1
-_ACEOF
-
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CFLAGS="$saved_CFLAGS"
-
-
-       ;;
-esac
 
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
index 29c43cb..5945f5c 100644 (file)
@@ -15,7 +15,6 @@ AC_CONFIG_SRCDIR([menuselect.c])
 AC_CONFIG_HEADER(autoconfig.h)
 
 AC_COPYRIGHT("Menuselect")
-AC_REVISION($Revision$)
 
 AC_CANONICAL_BUILD
 AC_CANONICAL_HOST
@@ -81,37 +80,6 @@ AC_ARG_ENABLE([debug],
     esac])
 AC_SUBST(MENUSELECT_DEBUG)
 
-# Support weak symbols on a platform specific basis.  The Mac OS X
-# (Darwin) support must be isolated from the other platforms because
-# it has caused other platforms to fail.
-#
-case "${OSARCH}" in
-       darwin*)
-       # Allow weak symbol support on Darwin platforms only because there
-       # is active community support for it.
-       # However, Darwin seems to break weak symbols for each new version.
-       #
-       AST_GCC_ATTRIBUTE(weak_import, [], [], PBX_WEAKREF)
-
-       # Several other platforms including Linux have GCC versions that
-       # define the weak attribute.  However, this attribute is only
-       # setup for use in the code by Darwin.
-       AST_GCC_ATTRIBUTE(weak, [], [], PBX_WEAKREF)
-       ;;
-       linux-gnu)
-       # Primarily support weak symbols on Linux platforms.
-       #
-       AST_GCC_ATTRIBUTE(weakref, [weakref("foo")], static, PBX_WEAKREF)
-       ;;
-       *)
-       # Allow weak symbols on other platforms.  However, any problems
-       # with this feature on other platforms must be fixed by the
-       # community.
-       #
-       AST_GCC_ATTRIBUTE(weakref, [weakref("foo")], static, PBX_WEAKREF)
-       ;;
-esac
-
 AC_FUNC_ALLOCA
 AC_CHECK_FUNCS([asprintf getloadavg setenv strcasestr strndup strnlen strsep unsetenv vasprintf])
 
index 689cebf..83f6098 100644 (file)
@@ -986,8 +986,12 @@ static int match_member_relations(void)
                }
        }
 
-       /* If weak linking is not supported, move module uses which are other modules to the dependency list */
-#if !defined(HAVE_ATTRIBUTE_weak_import) && !defined(HAVE_ATTRIBUTE_weakref) && !defined(HAVE_ATTRIBUTE_weak)
+/*
+ * BUGBUG:
+ * This doesn't work, the only way we can fix this is to remove OPTIONAL_API
+ * toggle from menuselect and add a command-line argument to ./configure.
+ */
+#if 0
        AST_LIST_TRAVERSE(&categories, cat, list) {
                AST_LIST_TRAVERSE(&cat->members, mem, list) {
                        if (mem->is_separator) {
index b25b6d1..4a1c084 100644 (file)
@@ -4561,12 +4561,7 @@ static int acf_faxopt_write(struct ast_channel *chan, const char *cmd, char *dat
                                        unsigned int gwtimeout;
 
                                        if (sscanf(timeout, "%30u", &gwtimeout) == 1) {
-                                               if (gwtimeout >= 0) {
-                                                       details->gateway_timeout = gwtimeout * 1000;
-                                               } else {
-                                                       ast_log(LOG_WARNING, "%s(%s) timeout cannot be negative.  Ignoring timeout\n",
-                                                               cmd, data);
-                                               }
+                                               details->gateway_timeout = gwtimeout * 1000;
                                        } else {
                                                ast_log(LOG_WARNING, "Unsupported timeout '%s' passed to FAXOPT(%s).\n", timeout, data);
                                        }
@@ -4605,13 +4600,7 @@ static int acf_faxopt_write(struct ast_channel *chan, const char *cmd, char *dat
                        if (details->faxdetect_id < 0) {
                                if (timeout) {
                                        if (sscanf(timeout, "%30u", &fdtimeout) == 1) {
-                                               if (fdtimeout >= 0) {
-                                                       fdtimeout *= 1000;
-                                               } else {
-                                                       ast_log(LOG_WARNING, "%s(%s) timeout cannot be negative.  Ignoring timeout\n",
-                                                               cmd, data);
-                                                       fdtimeout = 0;
-                                               }
+                                               fdtimeout *= 1000;
                                        } else {
                                                ast_log(LOG_WARNING, "Unsupported timeout '%s' passed to FAXOPT(%s).\n",
                                                        timeout, data);
index a32f40f..b49f1d6 100644 (file)
@@ -269,9 +269,8 @@ static int load_module(void)
        return AST_MODULE_LOAD_SUCCESS;
 }
 
-AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "H.263 Format Attribute Module",
+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "H.263 Format Attribute Module",
        .support_level = AST_MODULE_SUPPORT_CORE,
        .load = load_module,
        .unload = unload_module,
-       .load_pri = AST_MODPRI_DEFAULT,
 );
index fa33395..682b871 100644 (file)
@@ -330,9 +330,8 @@ static int load_module(void)
        return AST_MODULE_LOAD_SUCCESS;
 }
 
-AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "H.264 Format Attribute Module",
+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "H.264 Format Attribute Module",
        .support_level = AST_MODULE_SUPPORT_CORE,
        .load = load_module,
        .unload = unload_module,
-       .load_pri = AST_MODPRI_DEFAULT,
 );
index b5be4a1..6283efc 100644 (file)
@@ -249,9 +249,8 @@ static int unload_module(void)
        return 0;
 }
 
-AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "PJSIP HEPv3 Logger",
+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "PJSIP HEPv3 Logger",
        .support_level = AST_MODULE_SUPPORT_EXTENDED,
        .load = load_module,
        .unload = unload_module,
-       .load_pri = AST_MODPRI_DEFAULT,
 );
index 31b9c48..afad0c8 100644 (file)
@@ -180,9 +180,8 @@ static int unload_module(void)
        return 0;
 }
 
-AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "RTCP HEPv3 Logger",
+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "RTCP HEPv3 Logger",
        .support_level = AST_MODULE_SUPPORT_EXTENDED,
        .load = load_module,
        .unload = unload_module,
-       .load_pri = AST_MODPRI_DEFAULT,
 );
index 175f24c..918686e 100644 (file)
@@ -437,9 +437,8 @@ static int load_module(void)
        return AST_MODULE_LOAD_SUCCESS;
 }
 
-AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "HTTP Media Cache Backend",
+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "HTTP Media Cache Backend",
                .support_level = AST_MODULE_SUPPORT_CORE,
                .load = load_module,
                .unload = unload_module,
-               .load_pri = AST_MODPRI_DEFAULT,
        );
index 516969b..80d47d7 100644 (file)
@@ -366,7 +366,7 @@ static int load_module(void)
        return AST_MODULE_LOAD_SUCCESS;
 }
 
-AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "AMI support for external MWI",
+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "AMI support for external MWI",
        .support_level = AST_MODULE_SUPPORT_CORE,
        .load = load_module,
        .unload = unload_module,
index 94cdb0e..2dbe6f7 100644 (file)
@@ -1293,4 +1293,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Call Parking Resource
        .load = load_module,
        .unload = unload_module,
        .reload = reload_module,
+       .load_pri = AST_MODPRI_DEVSTATE_PROVIDER,
 );
index 0d7b3da..299fdb7 100644 (file)
@@ -82,16 +82,17 @@ static void aor_deleted_observer(const void *object)
 {
        const struct ast_sip_aor *aor = object;
        const char *aor_id = ast_sorcery_object_get_id(object);
-       /* Give enough space for ^ at the beginning and ;@ at the end, since that is our object naming scheme */
-       char regex[strlen(aor_id) + 4];
+       /* Give enough space for ;@ at the end, since that is our object naming scheme */
+       size_t prefix_len = strlen(aor_id) + sizeof(";@") - 1;
+       char prefix[prefix_len + 1];
        struct ao2_container *contacts;
 
        if (aor->permanent_contacts) {
                ao2_callback(aor->permanent_contacts, OBJ_NODATA | OBJ_MULTIPLE | OBJ_UNLINK, destroy_contact, NULL);
        }
 
-       snprintf(regex, sizeof(regex), "^%s;@", aor_id);
-       if (!(contacts = ast_sorcery_retrieve_by_regex(ast_sip_get_sorcery(), "contact", regex))) {
+       sprintf(prefix, "%s;@", aor_id); /* Safe */
+       if (!(contacts = ast_sorcery_retrieve_by_prefix(ast_sip_get_sorcery(), "contact", prefix, prefix_len))) {
                return;
        }
        /* Destroy any contacts that may still exist that were made for this AoR */
@@ -223,13 +224,13 @@ struct ao2_container *ast_sip_location_retrieve_aor_contacts_nolock(const struct
 struct ao2_container *ast_sip_location_retrieve_aor_contacts_nolock_filtered(const struct ast_sip_aor *aor,
        unsigned int flags)
 {
-       /* Give enough space for ^ at the beginning and ;@ at the end, since that is our object naming scheme */
-       char regex[strlen(ast_sorcery_object_get_id(aor)) + 4];
+       /* Give enough space for ;@ at the end, since that is our object naming scheme */
+       size_t prefix_len = strlen(ast_sorcery_object_get_id(aor)) + sizeof(";@") - 1;
+       char prefix[prefix_len + 1];
        struct ao2_container *contacts;
 
-       snprintf(regex, sizeof(regex), "^%s;@", ast_sorcery_object_get_id(aor));
-
-       if (!(contacts = ast_sorcery_retrieve_by_regex(ast_sip_get_sorcery(), "contact", regex))) {
+       sprintf(prefix, "%s;@", ast_sorcery_object_get_id(aor)); /* Safe */
+       if (!(contacts = ast_sorcery_retrieve_by_prefix(ast_sip_get_sorcery(), "contact", prefix, prefix_len))) {
                return NULL;
        }
 
index 168d869..e63e158 100644 (file)
@@ -366,7 +366,7 @@ static int contact_acl_to_str(const void *obj, const intptr_t *args, char **buf)
 static int dtmf_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
 {
        struct ast_sip_endpoint *endpoint = obj;
-       enum ast_sip_dtmf_mode dtmf = ast_sip_str_to_dtmf(var->value);
+       int dtmf = ast_sip_str_to_dtmf(var->value);
 
        if (dtmf == -1) {
                return -1;
index a529466..b47aefa 100644 (file)
@@ -56,9 +56,11 @@ static int find_transport_state_in_use(void *obj, void *arg, int flags)
        return 0;
 }
 
+#define DOMAIN_NAME_LEN 255
+
 static struct ast_sip_endpoint *anonymous_identify(pjsip_rx_data *rdata)
 {
-       char domain_name[64], id[AST_UUID_STR_LEN];
+       char domain_name[DOMAIN_NAME_LEN + 1];
        struct ast_sip_endpoint *endpoint;
        RAII_VAR(struct ast_sip_domain_alias *, alias, NULL, ao2_cleanup);
        RAII_VAR(struct ao2_container *, transport_states, NULL, ao2_cleanup);
@@ -70,6 +72,8 @@ static struct ast_sip_endpoint *anonymous_identify(pjsip_rx_data *rdata)
        }
 
        if (!ast_sip_get_disable_multi_domain()) {
+               char id[sizeof("anonymous@") + DOMAIN_NAME_LEN];
+
                /* Attempt to find the endpoint given the name and domain provided */
                snprintf(id, sizeof(id), "anonymous@%s", domain_name);
                if ((endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", id))) {
@@ -124,9 +128,8 @@ static int unload_module(void)
        return 0;
 }
 
-AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "PJSIP Anonymous endpoint identifier",
+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "PJSIP Anonymous endpoint identifier",
        .support_level = AST_MODULE_SUPPORT_CORE,
        .load = load_module,
        .unload = unload_module,
-       .load_pri = AST_MODPRI_DEFAULT,
 );
index 369cb62..ff97a62 100644 (file)
@@ -74,10 +74,12 @@ static int find_transport_state_in_use(void *obj, void *arg, int flags)
        return 0;
 }
 
+#define DOMAIN_NAME_LEN 255
+#define USERNAME_LEN    255
+
 static struct ast_sip_endpoint *find_endpoint(pjsip_rx_data *rdata, char *endpoint_name,
        char *domain_name)
 {
-       char id[AST_UUID_STR_LEN];
        struct ast_sip_endpoint *endpoint;
        RAII_VAR(struct ast_sip_domain_alias *, alias, NULL, ao2_cleanup);
        RAII_VAR(struct ao2_container *, transport_states, NULL, ao2_cleanup);
@@ -85,6 +87,8 @@ static struct ast_sip_endpoint *find_endpoint(pjsip_rx_data *rdata, char *endpoi
        RAII_VAR(struct ast_sip_transport *, transport, NULL, ao2_cleanup);
 
        if (!ast_sip_get_disable_multi_domain()) {
+               char id[DOMAIN_NAME_LEN + USERNAME_LEN + sizeof("@")];
+
                /* Attempt to find the endpoint given the name and domain provided */
                snprintf(id, sizeof(id), "%s@%s", endpoint_name, domain_name);
                if ((endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", id))) {
@@ -116,8 +120,8 @@ static struct ast_sip_endpoint *find_endpoint(pjsip_rx_data *rdata, char *endpoi
 
 static struct ast_sip_endpoint *username_identify(pjsip_rx_data *rdata)
 {
-       char username[64];
-       char domain[64];
+       char username[USERNAME_LEN + 1];
+       char domain[DOMAIN_NAME_LEN + 1];
        struct ast_sip_endpoint *endpoint;
 
        if (get_from_header(rdata, username, sizeof(username), domain, sizeof(domain))) {
@@ -149,7 +153,7 @@ static struct ast_sip_endpoint *username_identify(pjsip_rx_data *rdata)
 
 static struct ast_sip_endpoint *auth_username_identify(pjsip_rx_data *rdata)
 {
-       char username[64], realm[64];
+       char username[USERNAME_LEN + 1], realm[DOMAIN_NAME_LEN + 1];
        struct ast_sip_endpoint *endpoint;
        pjsip_authorization_hdr *auth_header = NULL;
 
index e28eb0a..2730611 100644 (file)
@@ -3211,8 +3211,8 @@ static void rtp_add_candidates_to_ice(struct ast_rtp_instance *instance, struct
        }
 
        /* If configured to use a STUN server to get our external mapped address do so */
-       if (stunaddr.sin_addr.s_addr && count && ast_sockaddr_is_ipv4(addr)
-               && !stun_address_is_blacklisted(addr)) {
+       if (count && stunaddr.sin_addr.s_addr && !stun_address_is_blacklisted(addr) &&
+               (ast_sockaddr_is_ipv4(addr) || ast_sockaddr_is_any(addr))) {
                struct sockaddr_in answer;
                int rsp;
 
@@ -3226,27 +3226,40 @@ static void rtp_add_candidates_to_ice(struct ast_rtp_instance *instance, struct
                ao2_lock(instance);
                if (!rsp) {
                        pj_sockaddr base;
-                       pj_sockaddr ext;
-                       pj_str_t mapped = pj_str(ast_strdupa(ast_inet_ntoa(answer.sin_addr)));
-                       int srflx = 1;
 
-                       /* Use the first local host candidate as the base */
-                       pj_sockaddr_cp(&base, &address[basepos]);
-
-                       pj_sockaddr_init(pj_AF_INET(), &ext, &mapped, ntohs(answer.sin_port));
-
-                       /* If the returned address is the same as one of our host candidates, don't send the srflx */
-                       for (pos = 0; pos < count; pos++) {
-                               if ((pj_sockaddr_cmp(&address[pos], &ext) == 0) && !rtp_address_is_ice_blacklisted(&address[pos])) {
-                                       srflx = 0;
+                       /* Use the first local IPv4 host candidate as the base */
+                       for (pos = basepos; pos < count; pos++) {
+                               if (address[pos].addr.sa_family == PJ_AF_INET &&
+                                       !rtp_address_is_ice_blacklisted(&address[pos])) {
+                                       pj_sockaddr_cp(&base, &address[pos]);
                                        break;
                                }
                        }
 
-                       if (srflx) {
-                               ast_rtp_ice_add_cand(instance, rtp, component, transport,
-                                       PJ_ICE_CAND_TYPE_SRFLX, 65535, &ext, &base, &base,
-                                       pj_sockaddr_get_len(&ext));
+                       if (pos < count) {
+                               pj_sockaddr ext;
+                               pj_str_t mapped = pj_str(ast_strdupa(ast_inet_ntoa(answer.sin_addr)));
+                               int srflx = 1;
+
+                               pj_sockaddr_init(pj_AF_INET(), &ext, &mapped, ntohs(answer.sin_port));
+
+                               /*
+                                * If the returned address is the same as one of our host
+                                * candidates, don't send the srflx
+                                */
+                               for (pos = 0; pos < count; pos++) {
+                                       if (pj_sockaddr_cmp(&address[pos], &ext) == 0 &&
+                                               !rtp_address_is_ice_blacklisted(&address[pos])) {
+                                               srflx = 0;
+                                               break;
+                                       }
+                               }
+
+                               if (srflx) {
+                                       ast_rtp_ice_add_cand(instance, rtp, component, transport,
+                                               PJ_ICE_CAND_TYPE_SRFLX, 65535, &ext, &base, &base,
+                                               pj_sockaddr_get_len(&ext));
+                               }
                        }
                }
        }
index 7ff78d5..b8fcb07 100644 (file)
 #include <net-snmp/net-snmp-includes.h>
 #include <net-snmp/agent/net-snmp-agent-includes.h>
 
+#if !defined(RONLY) && defined(NETSNMP_OLDAPI_RONLY)
+#define RONLY NETSNMP_OLDAPI_RONLY
+#endif
+
 #include "asterisk/paths.h"    /* need ast_config_AST_SOCKET */
 #include "asterisk/channel.h"
 #include "asterisk/logger.h"
index 23ebbdf..2a3398f 100644 (file)
@@ -692,10 +692,9 @@ static int unload_module(void)
        return 0;
 }
 
-AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "HTTP Media Cache Backend Tests",
+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "HTTP Media Cache Backend Tests",
                .support_level = AST_MODULE_SUPPORT_CORE,
                .load = load_module,
                .reload = reload_module,
                .unload = unload_module,
-               .load_pri = AST_MODPRI_DEFAULT,
        );
index 59ee3e6..6cbddb9 100644 (file)
@@ -190,7 +190,7 @@ static char *handle_cli_performance_test(struct ast_cli_entry *e, int cmd, struc
 
 static char *handle_cli_queue_test(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 {
-       unsigned int level;
+       int level;
        int current_queue_limit;
        unsigned int x;
        struct timeval start, end;
@@ -220,7 +220,7 @@ static char *handle_cli_queue_test(struct ast_cli_entry *e, int cmd, struct ast_
                ast_cli(a->fd, "Test: Failed, could not register level 'queuetest'.\n");
                return CLI_SUCCESS;
        }
-       ast_cli(a->fd, "Test: got level %u for 'queuetest'.\n", level);
+       ast_cli(a->fd, "Test: got level %d for 'queuetest'.\n", level);
 
        if (ast_logger_create_channel(tmppath, "queuetest") != AST_LOGGER_SUCCESS) {
                ast_cli(a->fd, "Test: Unable to create logger channel '%s'\n", tmppath);
index 00fa411..155bec9 100644 (file)
@@ -37,6 +37,8 @@
 #include "asterisk/pbx.h"
 #include "asterisk/test.h"
 
+#include <signal.h>
+
 /*!
  * If we determine that we really need
  * to be able to register more than 10
index 3a1dc1f..8b9a164 100644 (file)
@@ -43,6 +43,7 @@
 #include "asterisk/stringfields.h"
 #include "asterisk/threadstorage.h"
 #include "asterisk/test.h"
+#include "asterisk/vector.h"
 
 static enum ast_test_result_state test_chan_integer(struct ast_test *test,
                struct ast_channel *c, int *ifield, const char *expression)
@@ -225,6 +226,7 @@ AST_TEST_DEFINE(test_substitution)
        struct ast_channel *c;
        int i;
        enum ast_test_result_state res = AST_TEST_PASS;
+       struct ast_vector_string *funcs;
 
        switch (cmd) {
        case TEST_INIT:
@@ -302,11 +304,12 @@ AST_TEST_DEFINE(test_substitution)
 #undef TEST
 
        /* For testing dialplan functions */
-       for (i = 0; ; i++) {
-               char *cmd = ast_cli_generator("core show function", "", i);
-               if (cmd == NULL) {
-                       break;
-               }
+       funcs = ast_cli_completion_vector("core show function", "");
+
+       /* Skip "best match" element 0 */
+       for (i = 1; funcs && i < AST_VECTOR_SIZE(funcs); i++) {
+               char *cmd = AST_VECTOR_GET(funcs, i);
+
                if (strcmp(cmd, "CHANNEL") && strcmp(cmd, "CALLERID") && strncmp(cmd, "CURL", 4) &&
                                strncmp(cmd, "AES", 3) && strncmp(cmd, "BASE64", 6) &&
                                strcmp(cmd, "CDR") && strcmp(cmd, "ENV") && strcmp(cmd, "GLOBAL") &&
@@ -321,10 +324,14 @@ AST_TEST_DEFINE(test_substitution)
                                }
                        }
                }
-               ast_free(cmd);
        }
 
+       if (funcs) {
+               AST_VECTOR_CALLBACK_VOID(funcs, ast_free);
+               AST_VECTOR_PTR_FREE(funcs);
+       }
        ast_hangup(c);
+
        return res;
 }
 
index 072cf0a..68a2857 100644 (file)
@@ -324,20 +324,6 @@ AST_TEST_DEFINE(crypto_loaded_test)
                break;
        }
 
-#if 0 /* Not defined on Solaris */
-       ast_test_status_update(test,
-                              "address of __stub__ast_crypto_loaded is %p\n",
-                              __stub__ast_crypto_loaded);
-#ifndef HAVE_ATTRIBUTE_weak_import
-       ast_test_status_update(test,
-                              "address of __ref__ast_crypto_loaded is %p\n",
-                              __ref__ast_crypto_loaded);
-#endif
-       ast_test_status_update(test,
-                              "pointer to ast_crypto_loaded is %p\n",
-                              ast_crypto_loaded);
-#endif
-
        return ast_crypto_loaded() ? AST_TEST_PASS : AST_TEST_FAIL;
 }
 
@@ -388,20 +374,6 @@ AST_TEST_DEFINE(agi_loaded_test)
                break;
        }
 
-#if 0
-       ast_test_status_update(test,
-                              "address of __stub__ast_agi_register is %p\n",
-                              __stub__ast_agi_register);
-#ifndef HAVE_ATTRIBUTE_weak_import
-       ast_test_status_update(test,
-                              "address of __ref__ast_agi_register is %p\n",
-                              __ref__ast_agi_register);
-#endif
-       ast_test_status_update(test,
-                              "pointer to ast_agi_register is %p\n",
-                              ast_agi_register);
-#endif
-
        if (ast_agi_register(ast_module_info->self, &noop_command) == AST_OPTIONAL_API_UNAVAILABLE) {
                ast_test_status_update(test, "Unable to register testnoop command, because res_agi is not loaded.\n");
                return AST_TEST_FAIL;
index f8b72ba..8306869 100644 (file)
@@ -28,6 +28,8 @@ export SED
 export NM
 export MD5
 export CAT
+export CUT
+export GREP
 export DOWNLOAD
 export DOWNLOAD_TO_STDOUT
 export DOWNLOAD_TIMEOUT
index 9d5a9cb..f7b9f0c 100644 (file)
@@ -96,9 +96,9 @@ endef
 
 define verify_tarball
        ($(SHELL_ECHO_PREFIX) Verifying $(TARBALL) &&\
-       tarball_sum=$$($(CAT) $(TARBALL) | $(MD5) | $(SED) -n -r -e "s/^([^ ]+)\s+.*/\1/gp") ;\
-       required_sum=$$($(SED) -n -r -e "s/^([^ ]+)\s+$(TARBALL_FILE)/\1/gp" $(PJMD5SUM)) ;\
-       if [ "$$tarball_sum" != "$$required_sum" ] ; then $(SHELL_ECHO_PREFIX) Verify failed ; exit 1 ;\
+       tarball_sum=$$($(CAT) $(TARBALL) | $(MD5) | $(CUT) -d' ' -f1) ;\
+       required_sum=$$($(GREP) -e $(TARBALL_FILE) $(PJMD5SUM) | $(CUT) -d' ' -f1) ;\
+       if [ -z "$$required_sum" -o "$$tarball_sum" != "$$required_sum" ] ; then $(SHELL_ECHO_PREFIX) Verify failed ; exit 1 ;\
        else $(SHELL_ECHO_PREFIX) Verify successful ; exit 0 ; fi; )
 endef
 
@@ -130,8 +130,8 @@ source/.unpacked: $(DOWNLOAD_DIR)/pjproject-$(PJPROJECT_VERSION).tar.bz2
        -@rm -rf source pjproject-* >/dev/null 2>&1
        $(CMD_PREFIX) $(TAR) -xjf $<
        @mv pjproject-$(PJPROJECT_VERSION) source
-       $(ECHO_PREFIX) Applying patches
-       $(CMD_PREFIX) ./apply_patches $(QUIET_CONFIGURE) patches source
+       $(ECHO_PREFIX) Applying patches "$(realpath patches)" "$(realpath .)/source"
+       $(CMD_PREFIX) ./apply_patches $(QUIET_CONFIGURE) "$(realpath patches)" "$(realpath .)/source"
        -@touch source/.unpacked
 
 source/version.mak: source/.unpacked
@@ -153,7 +153,8 @@ source/build.mak: Makefile.rules source/version.mak source/user.mak $(addprefix
        $(CMD_PREFIX) (cd source ; ./aconfigure $(QUIET_CONFIGURE) $(PJPROJECT_CONFIG_OPTS))
 
 build.mak: source/build.mak
-       $(CMD_PREFIX) $(SED) -r -e "/prefix|export PJ_SHARED_LIBRARIES|MACHINE_NAME|OS_NAME|HOST_NAME|CC_NAME|CROSS_COMPILE|LINUX_POLL/d" source/build.mak > build.mak
+       $(CMD_PREFIX) $(GREP) -v -e prefix -e "export PJ_SHARED_LIBRARIES" -e MACHINE_NAME \
+               -e OS_NAME -e HOST_NAME -e CC_NAME -e CROSS_COMPILE -e LINUX_POLL $< > $@
 
 configure: source/build.mak
 
index 5f9fde2..134bd30 100755 (executable)
@@ -10,9 +10,6 @@ PATCH=${PATCH:-patch}
 patchdir=${1:?You must supply a patches directory}
 sourcedir=${2?:You must supply a source directory}
 
-patchdir=`readlink -f $patchdir`
-sourcedir=`readlink -f $sourcedir`
-
 if [ ! -d "$patchdir" ] ; then
        echo "$patchdir is not a directory" >&2
        exit 1
index 2d33534..c1edaf9 100644 (file)
@@ -39,6 +39,12 @@ AC_DEFUN([_PJPROJECT_CONFIGURE],
        if test "${CAT}" = ":" ; then
                AC_MSG_ERROR(cat is required to build bundled pjproject)
        fi
+       if test "${CUT}" = ":" ; then
+               AC_MSG_ERROR(cut is required to build bundled pjproject)
+       fi
+       if test "${GREP}" = ":" ; then
+               AC_MSG_ERROR(grep is required to build bundled pjproject)
+       fi
 
        AC_ARG_VAR([PJPROJECT_CONFIGURE_OPTS],[Additional configure options to pass to bundled pjproject])
        this_host=$(./config.sub $(./config.guess))
@@ -49,7 +55,7 @@ AC_DEFUN([_PJPROJECT_CONFIGURE],
                PJPROJECT_CONFIGURE_OPTS+=" --host=$host"
        fi
 
-       export TAR PATCH SED NM EXTERNALS_CACHE_DIR AST_DOWNLOAD_CACHE DOWNLOAD_TO_STDOUT DOWNLOAD_TIMEOUT DOWNLOAD MD5 CAT
+       export TAR PATCH SED NM EXTERNALS_CACHE_DIR AST_DOWNLOAD_CACHE DOWNLOAD_TO_STDOUT DOWNLOAD_TIMEOUT DOWNLOAD MD5 CAT CUT GREP
        export NOISY_BUILD
        ${GNU_MAKE} --quiet --no-print-directory -C ${PJPROJECT_DIR} \
                PJPROJECT_CONFIGURE_OPTS="$PJPROJECT_CONFIGURE_OPTS" \
@@ -80,7 +86,6 @@ AC_DEFUN([_PJPROJECT_CONFIGURE],
        AC_DEFINE([HAVE_PJSIP_EVSUB_GRP_LOCK], 1, [Define if your system has PJSIP_EVSUB_GRP_LOCK])
        AC_DEFINE([HAVE_PJSIP_INV_SESSION_REF], 1, [Define if your system has PJSIP_INV_SESSION_REF])
        AC_DEFINE([HAVE_PJSIP_AUTH_CLT_DEINIT], 1, [Define if your system has pjsip_auth_clt_deinit declared.])
-       AC_DEFINE([HAVE_PJSIP_EVSUB_SET_UAS_TIMEOUT], 1, [Define if your system has pjsip_evsub_set_uas_timeout declared.])
        AC_DEFINE([HAVE_PJSIP_TSX_LAYER_FIND_TSX2], 1, [Define if your system has pjsip_tsx_layer_find_tsx2 declared.])
 
        AC_SUBST([PJPROJECT_BUNDLED])
diff --git a/third-party/pjproject/patches/0040-183_without_to_tag.patch b/third-party/pjproject/patches/0040-183_without_to_tag.patch
new file mode 100644 (file)
index 0000000..e8692fe
--- /dev/null
@@ -0,0 +1,17 @@
+diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c
+index c9686a0..fc52a63 100644
+--- a/pjsip/src/pjsip-ua/sip_inv.c
++++ b/pjsip/src/pjsip-ua/sip_inv.c
+@@ -4156,9 +4156,10 @@ static void inv_on_state_calling( pjsip_inv_session *inv, pjsip_event *e)
+                   status = pjsip_inv_send_msg(inv, cancel);
+           }
+-          if (dlg->remote.info->tag.slen) {
++          if (tsx->status_code != 100) {
+-              inv_set_state(inv, PJSIP_INV_STATE_EARLY, e);
++              if (dlg->remote.info->tag.slen)
++                  inv_set_state(inv, PJSIP_INV_STATE_EARLY, e);
+               inv_check_sdp_in_incoming_msg(inv, tsx, 
+                                             e->body.tsx_state.src.rdata);