diff --git a/libs/pjproject/Makefile b/libs/pjproject/Makefile index 9b5372c..326708c 100644 --- a/libs/pjproject/Makefile +++ b/libs/pjproject/Makefile @@ -11,7 +11,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=pjproject PKG_VERSION:=2.13.1 -PKG_RELEASE:=1 +PKG_RELEASE:=2 PKG_CPE_ID:=cpe:/a:pjsip:pjsip # download "vX.Y.tar.gz" as "pjproject-vX.Y.tar.gz" diff --git a/libs/pjproject/patches/0004-config_site.patch b/libs/pjproject/patches/0004-config_site.patch index 3a1e1b9..d9d67ae 100644 --- a/libs/pjproject/patches/0004-config_site.patch +++ b/libs/pjproject/patches/0004-config_site.patch @@ -1,6 +1,6 @@ --- /dev/null +++ b/pjlib/include/pj/config_site.h -@@ -0,0 +1,83 @@ +@@ -0,0 +1,91 @@ +/* + * Asterisk config_site.h + */ @@ -84,3 +84,11 @@ +#define PJSIP_TSX_UAS_CONTINUE_ON_TP_ERROR 0 +#define PJ_SSL_SOCK_OSSL_USE_THREAD_CB 0 +#define PJSIP_AUTH_ALLOW_MULTIPLE_AUTH_HEADER 1 ++ ++/* ++ * The default is 32 with 8 being used by pjproject itself. ++ * Since this value is used in invites, dialogs, transports ++ * and subscriptions as well as the global pjproject endpoint, ++ * we don't want to increase it too much. ++ */ ++#define PJSIP_MAX_MODULE 38 diff --git a/libs/pjproject/patches/0020-log-dropped-packet-in-debug.patch b/libs/pjproject/patches/0020-log-dropped-packet-in-debug.patch new file mode 100644 index 0000000..e625f2e --- /dev/null +++ b/libs/pjproject/patches/0020-log-dropped-packet-in-debug.patch @@ -0,0 +1,26 @@ +--- a/pjsip/src/pjsip/sip_transport.c ++++ b/pjsip/src/pjsip/sip_transport.c +@@ -2088,15 +2088,17 @@ PJ_DEF(pj_ssize_t) pjsip_tpmgr_receive_p + * which were sent to keep NAT bindings. + */ + if (tmp.slen) { +- PJ_LOG(1, (THIS_FILE, +- "Error processing %d bytes packet from %s %s:%d %.*s:\n" +- "%.*s\n" +- "-- end of packet.", ++ PJ_LOG(2, (THIS_FILE, ++ "Dropping %d bytes packet from %s %s:%d %.*s\n", + msg_fragment_size, + rdata->tp_info.transport->type_name, +- rdata->pkt_info.src_name, ++ rdata->pkt_info.src_name, + rdata->pkt_info.src_port, +- (int)tmp.slen, tmp.ptr, ++ (int)tmp.slen, tmp.ptr)); ++ PJ_LOG(4, (THIS_FILE, ++ "Dropped packet:" ++ "%.*s\n" ++ "-- end of packet.", + (int)msg_fragment_size, + rdata->msg_info.msg_buf)); + } diff --git a/libs/sofia-sip/Makefile b/libs/sofia-sip/Makefile index 7e5e281..d950131 100644 --- a/libs/sofia-sip/Makefile +++ b/libs/sofia-sip/Makefile @@ -9,12 +9,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=sofia-sip -PKG_VERSION:=1.13.16 +PKG_VERSION:=1.13.17 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/freeswitch/$(PKG_NAME)/tar.gz/v${PKG_VERSION}? -PKG_HASH:=125a9653bea1fc1cb275e4aec3445aa2deadf1fe3f1adffae9559d2349bfab36 +PKG_HASH:=daca3d961b6aa2974ad5d3be69ed011726c3e4d511b2a0d4cb6d878821a2de7a # sofia-sip adds a version to include path # need to update this when the version changes diff --git a/net/asterisk-chan-dongle/Makefile b/net/asterisk-chan-dongle/Makefile index 2ccd477..0f41d45 100644 --- a/net/asterisk-chan-dongle/Makefile +++ b/net/asterisk-chan-dongle/Makefile @@ -11,10 +11,10 @@ PKG_NAME:=asterisk-chan-dongle PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://github.com/wdoekes/asterisk-chan-dongle.git -PKG_SOURCE_VERSION:=3d046f7d6842298c6838b5ce5b51d495d383b158 -PKG_SOURCE_DATE=2021-10-06 -PKG_RELEASE:=2 -PKG_MIRROR_HASH:=d485c89a7230ab8c318eed6c3a954b154d7e53cc7a0194abf96f4dcb83e6909c +PKG_SOURCE_VERSION:=503dba87d726854b74b49e70679e64e6e86d5812 +PKG_SOURCE_DATE=2022-11-04 +PKG_RELEASE:=1 +PKG_MIRROR_HASH:=0d585c108ec18d136ce03704b96d0a6769e617c820fc74f735e3e192ad282611 PKG_FIXUP:=autoreconf diff --git a/net/asterisk-chan-dongle/patches/300-use-openwrt-flags.patch b/net/asterisk-chan-dongle/patches/300-use-openwrt-flags.patch index 1dea4b4..981ab99 100644 --- a/net/asterisk-chan-dongle/patches/300-use-openwrt-flags.patch +++ b/net/asterisk-chan-dongle/patches/300-use-openwrt-flags.patch @@ -1,6 +1,6 @@ --- a/configure.ac +++ b/configure.ac -@@ -237,8 +237,6 @@ dnl Apply options to defines +@@ -247,8 +247,6 @@ dnl Apply options to defines if test "x$enable_debug" = "xyes" ; then CFLAGS="$CFLAGS -O0 -g3" AC_DEFINE([__DEBUG__], [1], [Build with debugging]) diff --git a/net/asterisk-chan-dongle/patches/400-time_t.patch b/net/asterisk-chan-dongle/patches/400-time_t.patch new file mode 100644 index 0000000..0b76ad3 --- /dev/null +++ b/net/asterisk-chan-dongle/patches/400-time_t.patch @@ -0,0 +1,16 @@ +--- a/configure.ac ++++ b/configure.ac +@@ -165,11 +165,13 @@ dnl AC_CHECK_TYPE(uint64_t, unsigned lon + + AC_CHECK_SIZEOF(int) + AC_CHECK_SIZEOF(long int) ++AC_CHECK_SIZEOF(long long int) + AC_CHECK_SIZEOF(time_t) + case "$ac_cv_sizeof_time_t" in + ''|0) AC_MSG_ERROR([Could not find time_t type]);; + $ac_cv_sizeof_int) AC_DEFINE([PRI_time_t], ["d"], [printf format for time_t]);; + $ac_cv_sizeof_long_int) AC_DEFINE([PRI_time_t], ["ld"], [printf format for time_t]);; ++$ac_cv_sizeof_long_long_int) AC_DEFINE([PRI_time_t], ["lld"], [printf format for time_t]);; + *) AC_MSG_ERROR([Could not find match size of time_t to printf format]) + esac + diff --git a/net/asterisk/Makefile b/net/asterisk/Makefile index 361928c..e5075ca 100644 --- a/net/asterisk/Makefile +++ b/net/asterisk/Makefile @@ -8,13 +8,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=asterisk -PKG_VERSION:=20.3.0 -PKG_RELEASE:=2 +PKG_VERSION:=20.5.2 +PKG_RELEASE:=1 PKG_CPE_ID:=cpe:/a:digium:asterisk PKG_SOURCE:=asterisk-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://downloads.asterisk.org/pub/telephony/asterisk/releases -PKG_HASH:=2e70b4bb40114966c6572eae38b5106b588a7a759d41f1c90a6032407dd60463 +PKG_HASH:=8f68e1789dfb8aa04b0eba87ea1d599a62e088ddd20926afc997f36b455e1859 PKG_BUILD_DEPENDS:=libxml2/host diff --git a/net/asterisk/patches/130-eventfd.patch b/net/asterisk/patches/130-eventfd.patch index ba54c74..60e7d26 100644 --- a/net/asterisk/patches/130-eventfd.patch +++ b/net/asterisk/patches/130-eventfd.patch @@ -1,6 +1,6 @@ --- a/configure.ac +++ b/configure.ac -@@ -1256,7 +1256,7 @@ if test "${ac_cv_have_variable_fdset}x" +@@ -1257,7 +1257,7 @@ if test "${ac_cv_have_variable_fdset}x" fi AC_MSG_CHECKING([if we have usable eventfd support]) diff --git a/net/asterisk/patches/140-use-default-lua.patch b/net/asterisk/patches/140-use-default-lua.patch index 6d38d18..006a07f 100644 --- a/net/asterisk/patches/140-use-default-lua.patch +++ b/net/asterisk/patches/140-use-default-lua.patch @@ -1,6 +1,6 @@ --- a/configure.ac +++ b/configure.ac -@@ -2616,7 +2616,7 @@ if test -z "$__opus_include" -o x"$__opu +@@ -2608,7 +2608,7 @@ if test -z "$__opus_include" -o x"$__opu fi AST_EXT_LIB_CHECK([OPUSFILE], [opusfile], [op_open_callbacks], [opus/opusfile.h], [], [$__opus_include]) diff --git a/net/asterisk/patches/180-app_queue_time_t.patch b/net/asterisk/patches/180-app_queue_time_t.patch new file mode 100644 index 0000000..d582a39 --- /dev/null +++ b/net/asterisk/patches/180-app_queue_time_t.patch @@ -0,0 +1,17 @@ +--- a/apps/app_queue.c ++++ b/apps/app_queue.c +@@ -4614,8 +4614,12 @@ static int is_longest_waiting_caller(str + * will be unused until the first caller is picked up. + */ + if (ch->start < caller->start && !ch->pending) { +- ast_debug(1, "Queue %s has a call at position %i that's been waiting longer (%li vs %li)\n", +- q->name, ch->pos, ch->start, caller->start); ++ char time1[AST_TIME_T_LEN]; ++ char time2[AST_TIME_T_LEN]; ++ ast_time_t_to_string(ch->start, time1, sizeof(time1)); ++ ast_time_t_to_string(caller->start, time2, sizeof(time2)); ++ ast_debug(1, "Queue %s has a call at position %i that's been waiting longer (%s vs %s)\n", ++ q->name, ch->pos, time1, time2); + is_longest_waiting = 0; + break; + } diff --git a/net/asterisk/patches/180-res_crypto.c-Avoid-using-the-non-portable-ALLPERMS-m.patch b/net/asterisk/patches/180-res_crypto.c-Avoid-using-the-non-portable-ALLPERMS-m.patch deleted file mode 100644 index ff801c6..0000000 --- a/net/asterisk/patches/180-res_crypto.c-Avoid-using-the-non-portable-ALLPERMS-m.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 94c884d5b8afca96164852cfb29fc496bc5b9e0a Mon Sep 17 00:00:00 2001 -From: Sean Bright -Date: Mon, 5 Jun 2023 18:17:47 -0400 -Subject: [PATCH] res_crypto.c: Avoid using the non-portable ALLPERMS macro. - -ALLPERMS is not POSIX and it's trivial enough to not jump through -autoconf hoops to check for it. - -Fixes #149. ---- - res/res_crypto.c | 9 +++++++-- - 1 file changed, 7 insertions(+), 2 deletions(-) - ---- a/res/res_crypto.c -+++ b/res/res_crypto.c -@@ -217,10 +217,15 @@ static struct ast_key *try_load_key(cons - return NULL; - } - -+ /* PERM_MASK is a bitwise OR of all possible file mode bits encoded in the -+ * `st_mode` member of `struct stat`. For POSIX compatible systems this -+ * will be 07777. */ -+#define PERM_MASK (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO) -+ - /* only user read or read/write modes allowed */ - if (ktype == AST_KEY_PRIVATE && -- ((st.st_mode & ALLPERMS) & ~(S_IRUSR | S_IWUSR)) != 0) { -- ast_log(LOG_ERROR, "Private key file has bad permissions: %s: %#4o\n", ffname, st.st_mode & ALLPERMS); -+ ((st.st_mode & PERM_MASK) & ~(S_IRUSR | S_IWUSR)) != 0) { -+ ast_log(LOG_ERROR, "Private key file has bad permissions: %s: %#4o\n", ffname, st.st_mode & PERM_MASK); - fclose(f); - return NULL; - } diff --git a/net/asterisk/patches/190-chan_iax2.c-Avoid-crash-with-IAX2-switch-support.patch b/net/asterisk/patches/190-chan_iax2.c-Avoid-crash-with-IAX2-switch-support.patch deleted file mode 100644 index dc8e180..0000000 --- a/net/asterisk/patches/190-chan_iax2.c-Avoid-crash-with-IAX2-switch-support.patch +++ /dev/null @@ -1,25 +0,0 @@ -From d26a00ef3484f7fa602044e73e31bcefc8ca1917 Mon Sep 17 00:00:00 2001 -From: Sean Bright -Date: Fri, 7 Jul 2023 15:57:39 -0400 -Subject: [PATCH] chan_iax2.c: Avoid crash with IAX2 switch support. - -A change made in 82cebaa0 did not properly handle the case when a -channel was not provided, triggering a crash. ast_check_hangup(...) -does not protect against NULL pointers. - -Fixes #180 ---- - channels/chan_iax2.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/channels/chan_iax2.c -+++ b/channels/chan_iax2.c -@@ -14323,7 +14323,7 @@ static struct iax2_dpcache *find_cache(s - ast_log(LOG_WARNING, "Timeout waiting for %s exten %s\n", data, exten); - } - -- if (ast_check_hangup(chan)) { -+ if (chan && ast_check_hangup(chan)) { - doabort = 1; - } - diff --git a/net/freeswitch/Makefile b/net/freeswitch/Makefile index 96dfe7c..213e45b 100644 --- a/net/freeswitch/Makefile +++ b/net/freeswitch/Makefile @@ -8,13 +8,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=freeswitch -PKG_VERSION:=1.10.10 -PKG_RELEASE:=2 +PKG_VERSION:=1.10.11 +PKG_RELEASE:=1 PKG_MAINTAINER:=Sebastian Kemper PKG_SOURCE:=freeswitch-$(PKG_VERSION).-release.tar.xz PKG_SOURCE_URL:=https://files.freeswitch.org/releases/freeswitch -PKG_HASH:=d2c702c7f4bd6eca539c3981cf859ad5c1846d9283829e24cd75686f2322b9df +PKG_HASH:=7f9603a691220d9f47da42f3b19290b629b69dceb2eee56448f0a7cefcf9d1a1 PKG_CPE_ID:=cpe:/a:freeswitch:freeswitch diff --git a/net/freeswitch/patches/490-build-properly-fix-time_t-issues.patch b/net/freeswitch/patches/490-build-properly-fix-time_t-issues.patch index 395f7ac..9ead97f 100644 --- a/net/freeswitch/patches/490-build-properly-fix-time_t-issues.patch +++ b/net/freeswitch/patches/490-build-properly-fix-time_t-issues.patch @@ -166,7 +166,7 @@ The most portable fix for time_t handling is to always cast it to switch_channel_set_variable(channel, "end_uepoch", tmp); --- a/src/switch_ivr_originate.c +++ b/src/switch_ivr_originate.c -@@ -800,7 +800,7 @@ static uint8_t check_channel_status(orig +@@ -804,7 +804,7 @@ static uint8_t check_channel_status(orig time_t elapsed = switch_epoch_time_now(NULL) - start; oglobals->originate_status[i].per_channel_progress_timelimit_sec = elapsed + extend_timeout; oglobals->originate_status[i].per_channel_timelimit_sec = elapsed + extend_timeout; diff --git a/net/freeswitch/patches/493-core-fix-switch_mprintf-format-string.patch b/net/freeswitch/patches/493-core-fix-switch_mprintf-format-string.patch index effb550..7454977 100644 --- a/net/freeswitch/patches/493-core-fix-switch_mprintf-format-string.patch +++ b/net/freeswitch/patches/493-core-fix-switch_mprintf-format-string.patch @@ -12,7 +12,7 @@ Reported-by: Sebastian Kemper --- a/src/switch_core_sqldb.c +++ b/src/switch_core_sqldb.c -@@ -3551,7 +3551,7 @@ SWITCH_DECLARE(switch_status_t) switch_c +@@ -3553,7 +3553,7 @@ SWITCH_DECLARE(switch_status_t) switch_c if (force) { sql = switch_mprintf("delete from registrations where hostname='%q'", switch_core_get_switchname()); } else { diff --git a/net/freeswitch/patches/500-libvpx-VP8-disallow-thread-count-changes.patch b/net/freeswitch/patches/500-libvpx-VP8-disallow-thread-count-changes.patch deleted file mode 100644 index c857884..0000000 --- a/net/freeswitch/patches/500-libvpx-VP8-disallow-thread-count-changes.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 6f9e72c585265d8def8a613b36cd4f524c201980 Mon Sep 17 00:00:00 2001 -From: Andrey Volk -Date: Wed, 4 Oct 2023 00:47:39 +0300 -Subject: [PATCH] [libvpx] VP8: disallow thread count changes - ---- - libs/libvpx/vp8/encoder/onyx_if.c | 5 +++++ - 1 file changed, 5 insertions(+) - ---- a/libs/libvpx/vp8/encoder/onyx_if.c -+++ b/libs/libvpx/vp8/encoder/onyx_if.c -@@ -1447,6 +1447,11 @@ void vp8_change_config(VP8_COMP *cpi, VP - last_h = cpi->oxcf.Height; - prev_number_of_layers = cpi->oxcf.number_of_layers; - -+ if (cpi->initial_width) { -+ // TODO(https://crbug.com/1486441): Allow changing thread counts; the -+ // allocation is done once in vp8_create_compressor(). -+ oxcf->multi_threaded = cpi->oxcf.multi_threaded; -+ } - cpi->oxcf = *oxcf; - - switch (cpi->oxcf.Mode) { diff --git a/net/freeswitch/patches/501-libvpx-Fix-bug-with-smaller-width-bigger-size.patch b/net/freeswitch/patches/501-libvpx-Fix-bug-with-smaller-width-bigger-size.patch deleted file mode 100644 index 5390dc6..0000000 --- a/net/freeswitch/patches/501-libvpx-Fix-bug-with-smaller-width-bigger-size.patch +++ /dev/null @@ -1,88 +0,0 @@ -From 2ab7a3d323984a4df969ea19dadf86213308a361 Mon Sep 17 00:00:00 2001 -From: Andrey Volk -Date: Fri, 6 Oct 2023 00:42:10 +0300 -Subject: [PATCH] [libvpx] Fix bug with smaller width bigger size - ---- - libs/libvpx/vp9/common/vp9_alloccommon.c | 12 +++++------ - libs/libvpx/vp9/encoder/vp9_encoder.c | 27 ++++++++++++++++++++++-- - 2 files changed, 31 insertions(+), 8 deletions(-) - ---- a/libs/libvpx/vp9/common/vp9_alloccommon.c -+++ b/libs/libvpx/vp9/common/vp9_alloccommon.c -@@ -123,12 +123,6 @@ int vp9_alloc_context_buffers(VP9_COMMON - if (cm->alloc_mi(cm, new_mi_size)) goto fail; - } - -- if (cm->seg_map_alloc_size < cm->mi_rows * cm->mi_cols) { -- // Create the segmentation map structure and set to 0. -- free_seg_map(cm); -- if (alloc_seg_map(cm, cm->mi_rows * cm->mi_cols)) goto fail; -- } -- - if (cm->above_context_alloc_cols < cm->mi_cols) { - vpx_free(cm->above_context); - cm->above_context = (ENTROPY_CONTEXT *)vpx_calloc( -@@ -143,6 +137,12 @@ int vp9_alloc_context_buffers(VP9_COMMON - cm->above_context_alloc_cols = cm->mi_cols; - } - -+ if (cm->seg_map_alloc_size < cm->mi_rows * cm->mi_cols) { -+ // Create the segmentation map structure and set to 0. -+ free_seg_map(cm); -+ if (alloc_seg_map(cm, cm->mi_rows * cm->mi_cols)) goto fail; -+ } -+ - if (vp9_alloc_loop_filter(cm)) goto fail; - - return 0; ---- a/libs/libvpx/vp9/encoder/vp9_encoder.c -+++ b/libs/libvpx/vp9/encoder/vp9_encoder.c -@@ -1915,6 +1915,17 @@ static void alloc_copy_partition_data(VP - } - } - -+static void free_copy_partition_data(VP9_COMP *cpi) { -+ vpx_free(cpi->prev_partition); -+ cpi->prev_partition = NULL; -+ vpx_free(cpi->prev_segment_id); -+ cpi->prev_segment_id = NULL; -+ vpx_free(cpi->prev_variance_low); -+ cpi->prev_variance_low = NULL; -+ vpx_free(cpi->copied_frame_cnt); -+ cpi->copied_frame_cnt = NULL; -+} -+ - void vp9_change_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) { - VP9_COMMON *const cm = &cpi->common; - RATE_CONTROL *const rc = &cpi->rc; -@@ -1999,6 +2010,8 @@ void vp9_change_config(struct VP9_COMP * - new_mi_size = cm->mi_stride * calc_mi_size(cm->mi_rows); - if (cm->mi_alloc_size < new_mi_size) { - vp9_free_context_buffers(cm); -+ vp9_free_pc_tree(&cpi->td); -+ vpx_free(cpi->mbmi_ext_base); - alloc_compressor_data(cpi); - realloc_segmentation_maps(cpi); - cpi->initial_width = cpi->initial_height = 0; -@@ -2014,8 +2027,18 @@ void vp9_change_config(struct VP9_COMP * - update_frame_size(cpi); - - if (last_w != cpi->oxcf.width || last_h != cpi->oxcf.height) { -- memset(cpi->consec_zero_mv, 0, -- cm->mi_rows * cm->mi_cols * sizeof(*cpi->consec_zero_mv)); -+ vpx_free(cpi->consec_zero_mv); -+ CHECK_MEM_ERROR( -+ cm, cpi->consec_zero_mv, -+ vpx_calloc(cm->mi_rows * cm->mi_cols, sizeof(*cpi->consec_zero_mv))); -+ -+ vpx_free(cpi->skin_map); -+ CHECK_MEM_ERROR( -+ cm, cpi->skin_map, -+ vpx_calloc(cm->mi_rows * cm->mi_cols, sizeof(cpi->skin_map[0]))); -+ -+ free_copy_partition_data(cpi); -+ alloc_copy_partition_data(cpi); - if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) - vp9_cyclic_refresh_reset_resize(cpi); - rc->rc_1_frame = 0; diff --git a/net/rtpengine/Makefile b/net/rtpengine/Makefile index ec1aacf..d694d4b 100644 --- a/net/rtpengine/Makefile +++ b/net/rtpengine/Makefile @@ -9,12 +9,12 @@ include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=rtpengine -PKG_VERSION:=11.5.1.12 +PKG_VERSION:=11.5.1.18 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-mr$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/sipwise/rtpengine/tar.gz/mr$(PKG_VERSION)? -PKG_HASH:=76a16d00926838cdb16b0004043c2476115b8481f85eff454d5134204c780d47 +PKG_HASH:=d5b0288ec02164b13730c14976425160d9a0b42b1c74796f8d9e59649e705fa6 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-mr$(PKG_VERSION) @@ -51,6 +51,7 @@ ENGINE_DEPENDS := \ +libpcre2 \ +libwebsockets-openssl \ +libopus \ + +xmlrpc-c \ +xmlrpc-c-client \ +zlib