include $(TOPDIR)/rules.mk
PKG_NAME:=asterisk
-PKG_VERSION:=18.11.2
+PKG_VERSION:=18.14.0
PKG_RELEASE:=$(AUTORELEASE)
PKG_SOURCE:=asterisk-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://downloads.asterisk.org/pub/telephony/asterisk/releases
-PKG_HASH:=b456d19610e53789446e097bb9773a82a04088922de0cfaff2b818326b67296b
+PKG_HASH:=c79a728688e1d8faaf3915be81b88b6e324f314dd377de791e37dfa6d081a246
PKG_BUILD_DEPENDS:=libxml2/host
func-dialplan \
func-enum \
func-env \
+ func-evalexten \
func-extstate \
func-frame-drop \
func-frame-trace \
pgsql \
pjsip \
res-adsi \
+ res-aeap \
res-ael-share \
res-agi \
res-ari \
res-calendar-icalendar \
res-chan-stats \
res-clialiases \
+ res-cliexec \
res-clioriginate \
res-config-ldap \
res-config-mysql \
res-format-attr-siren14 \
res-format-attr-siren7 \
res-format-attr-vp8 \
+ res-geolocation \
res-http-media-cache \
res-http-websocket \
res-limit \
res-mwi-external-ami \
res-parking \
res-phoneprov \
+ res-pjsip-geolocation \
res-pjsip-phoneprov \
res-pjsip-stir-shaken \
res-pjproject \
res-sorcery \
res-sorcery-memory-cache \
res-speech \
+ res-speech-aeap \
res-srtp \
res-stasis \
res-stasis-answer \
PKG_CONFIG_DEPENDS:= \
$(patsubst %,CONFIG_PACKAGE_$(PKG_NAME)-%,$(MODULES_AVAILABLE)) \
$(patsubst %,CONFIG_PACKAGE_$(PKG_NAME)-util-%,$(subst _,-,$(UTILS_AVAILABLE))) \
+ CONFIG_ASTERISK_LIBXSLT_SUPPORT \
CONFIG_ASTERISK_LOW_MEMORY
include $(INCLUDE_DIR)/package.mk
menu "Advanced configuration"
depends on PACKAGE_asterisk
+ config ASTERISK_LIBXSLT_SUPPORT
+ bool "Link Asterisk against libxslt"
+ default y if x86_64
+ help
+ Build Asterisk with libxslt support. This is required for
+ res-geolocation.
+
config ASTERISK_LOW_MEMORY
bool "Optimize Asterisk for low memory usage"
default n
$(call Package/$(PKG_NAME)/Default)
TITLE:=Complete open source PBX, v$(PKG_VERSION)
MENU:=1
- DEPENDS:=+libstdcpp +jansson +libcap +libedit +libopenssl +libsqlite3 +libuuid +libxml2 +zlib
+ DEPENDS:=+ASTERISK_LIBXSLT_SUPPORT:libxslt +libstdcpp +jansson +libcap +libedit +libopenssl +libsqlite3 +libuuid +libxml2 +zlib
USERID:=asterisk=385:asterisk=385
endef
--without-pjproject-bundled \
--with-libedit="$(STAGING_DIR)/usr" \
--with-libxml2 \
- --without-libxslt \
+ $(if $(CONFIG_ASTERISK_LIBXSLT_SUPPORT),--with-libxslt,--without-libxslt) \
$(if $(CONFIG_PACKAGE_$(PKG_NAME)-res-snmp),--with-netsnmp="$(STAGING_DIR)/usr",--without-netsnmp) \
--without-newt \
--without-osptk \
$(eval $(call BuildAsteriskModule,codec-resample,resample sLinear audio,SLIN resampling codec.,,,codec_resample,,))
$(eval $(call BuildAsteriskModule,codec-speex,Speex Coder/Decoder,Speex coder/decoder.,@!SOFT_FLOAT +libspeex +libspeexdsp,,codec_speex,,))
$(eval $(call BuildAsteriskModule,codec-ulaw,Signed linear to ulaw translation,Ulaw coder/decoder.,,,codec_ulaw,,))
-$(eval $(call BuildAsteriskModule,curl,CURL,cURL support,+libcurl,,func_curl res_config_curl res_curl,,))
+$(eval $(call BuildAsteriskModule,curl,CURL,cURL,+libcurl,,func_curl res_config_curl res_curl,,))
$(eval $(call BuildAsteriskModule,format-g719,G.719,ITU G.719.,,,format_g719,,))
$(eval $(call BuildAsteriskModule,format-g723,G.723.1,G.723.1 simple timestamp file format.,,,format_g723,,))
$(eval $(call BuildAsteriskModule,format-g726,G.726,Raw G.726 data.,,,format_g726,,))
$(eval $(call BuildAsteriskModule,format-wav,WAV format (8000hz Signed Linear),Microsoft WAV/WAV16 format.,,,format_wav,,))
$(eval $(call BuildAsteriskModule,format-wav-gsm,WAV format (Proprietary GSM),Microsoft WAV format.,,,format_wav_gsm,,))
$(eval $(call BuildAsteriskModule,func-aes,AES dialplan functions,AES dialplan functions.,,,func_aes,,))
-$(eval $(call BuildAsteriskModule,func-base64,base64 support,Base64 encode/decode dialplan functions.,,,func_base64,,))
+$(eval $(call BuildAsteriskModule,func-base64,base64,Base64 encode/decode dialplan functions.,,,func_base64,,))
$(eval $(call BuildAsteriskModule,func-blacklist,Blacklist on callerid,Look up Caller ID name/number from blacklist database.,,,func_blacklist,,))
$(eval $(call BuildAsteriskModule,func-callcompletion,Call control configuration function,Call control configuration function.,,,func_callcompletion,,))
$(eval $(call BuildAsteriskModule,func-channel,Channel info,Channel information dialplan functions.,,,func_channel,,))
$(eval $(call BuildAsteriskModule,func-dialplan,Dialplan context/extension/priority checking functions,Dialplan context/extension/priority checking functions.,,,func_dialplan,,))
$(eval $(call BuildAsteriskModule,func-enum,ENUM,ENUM related dialplan functions.,,enum.conf,func_enum,,))
$(eval $(call BuildAsteriskModule,func-env,Environment functions,Environment/filesystem dialplan functions.,,,func_env,,))
+$(eval $(call BuildAsteriskModule,func-evalexten,Extension evaluation,Extension evaluation functions.,,,func_evalexten,,))
$(eval $(call BuildAsteriskModule,func-extstate,Hinted extension state,Gets the state of an extension in the dialplan.,,,func_extstate,,))
$(eval $(call BuildAsteriskModule,func-frame-drop,Frame drop,Function to drop frames on a channel.,,,func_frame_drop,,))
$(eval $(call BuildAsteriskModule,func-frame-trace,Frame trace for internal ast_frame debugging,Frame trace for internal ast_frame debugging.,,,func_frame_trace,,))
$(eval $(call BuildAsteriskModule,pgsql,PostgreSQL,PostgreSQL support.,+libpq,cel_pgsql.conf cdr_pgsql.conf res_pgsql.conf,cel_pgsql cdr_pgsql res_config_pgsql,,))
$(eval $(call BuildAsteriskModule,pjsip,pjsip channel,PJSIP SIP stack.,+$(PKG_NAME)-res-http-websocket +$(PKG_NAME)-res-pjproject +$(PKG_NAME)-res-sorcery +libpjsip +libpjmedia +libpjnath +libpjsip-simple +libpjsip-ua +libpjsua +libpjsua2,pjsip.conf pjsip_notify.conf pjsip_wizard.conf,chan_pjsip func_pjsip_aor func_pjsip_contact func_pjsip_endpoint res_pjsip res_pjsip_acl res_pjsip_authenticator_digest res_pjsip_caller_id res_pjsip_config_wizard res_pjsip_dialog_info_body_generator res_pjsip_diversion res_pjsip_dlg_options res_pjsip_dtmf_info res_pjsip_empty_info res_pjsip_endpoint_identifier_anonymous res_pjsip_endpoint_identifier_ip res_pjsip_endpoint_identifier_user res_pjsip_exten_state res_pjsip_header_funcs res_pjsip_history res_pjsip_logger res_pjsip_messaging res_pjsip_mwi res_pjsip_mwi_body_generator res_pjsip_nat res_pjsip_notify res_pjsip_one_touch_record_info res_pjsip_outbound_authenticator_digest res_pjsip_outbound_publish res_pjsip_outbound_registration res_pjsip_path res_pjsip_pidf_body_generator res_pjsip_pidf_digium_body_supplement res_pjsip_pidf_eyebeam_body_supplement res_pjsip_publish_asterisk res_pjsip_pubsub res_pjsip_refer res_pjsip_registrar res_pjsip_rfc3326 res_pjsip_sdp_rtp res_pjsip_send_to_voicemail res_pjsip_session res_pjsip_sips_contact res_pjsip_t38 res_pjsip_transport_websocket res_pjsip_xpidf_body_generator,,))
$(eval $(call BuildAsteriskModule,res-adsi,Provide ADSI,ADSI resource.,,,res_adsi,,))
+$(eval $(call BuildAsteriskModule,res-aeap,Provide AEAP,AEAP resource.,+asterisk-res-http-websocket,aeap.conf,res_aeap,,))
$(eval $(call BuildAsteriskModule,res-ael-share,Shareable AEL code,Shareable code for AEL.,,,res_ael_share,,))
$(eval $(call BuildAsteriskModule,res-agi,Asterisk Gateway Interface,Asterisk Gateway Interface.,+$(PKG_NAME)-res-speech,,res_agi,,))
$(eval $(call BuildAsteriskModule,res-ari,Asterisk RESTful interface,Asterisk RESTful Interface.,+$(PKG_NAME)-res-http-websocket,ari.conf,res_ari,,))
$(eval $(call BuildAsteriskModule,res-calendar-icalendar,iCalendar calendar,Asterisk iCalendar .ics file integration.,+$(PKG_NAME)-res-calendar +libical +libneon,,res_calendar_icalendar,,))
$(eval $(call BuildAsteriskModule,res-chan-stats,statsd channel stats,Example of how to use Stasis.,+$(PKG_NAME)-res-statsd,,res_chan_stats,,))
$(eval $(call BuildAsteriskModule,res-clialiases,CLI aliases,CLI aliases.,,cli_aliases.conf,res_clialiases,,))
+$(eval $(call BuildAsteriskModule,res-cliexec,Execute from CLI,Simple dialplan execution from the CLI.,,,res_cliexec,,))
$(eval $(call BuildAsteriskModule,res-clioriginate,Calls via CLI,Call origination and redirection from the CLI.,,,res_clioriginate,,))
$(eval $(call BuildAsteriskModule,res-config-ldap,LDAP realtime interface,LDAP realtime interface.,+libopenldap,res_ldap.conf,res_config_ldap,,))
$(eval $(call BuildAsteriskModule,res-config-mysql,MySQL CDR backend,MySQL realtime configuration driver.,+libmysqlclient,,res_config_mysql,,))
$(eval $(call BuildAsteriskModule,res-format-attr-siren14,Siren14 format attribute module,Siren14 format attribute module.,,,res_format_attr_siren14,,))
$(eval $(call BuildAsteriskModule,res-format-attr-siren7,Siren7 format attribute module,Siren7 format attribute module.,,,res_format_attr_siren7,,))
$(eval $(call BuildAsteriskModule,res-format-attr-vp8,VP8 format attribute module,VP8 format attribute module.,,,res_format_attr_vp8,,))
+$(eval $(call BuildAsteriskModule,res-geolocation,Geolocation,Geolocation support.,@ASTERISK_LIBXSLT_SUPPORT,geolocation.conf,res_geolocation,,))
$(eval $(call BuildAsteriskModule,res-http-media-cache,HTTP media cache backend,HTTP media cache backend.,+$(PKG_NAME)-curl,,res_http_media_cache,,))
-$(eval $(call BuildAsteriskModule,res-http-websocket,HTTP websocket support,HTTP WebSocket support.,,,res_http_websocket,,))
+$(eval $(call BuildAsteriskModule,res-http-websocket,HTTP websocket,HTTP WebSocket support.,,,res_http_websocket,,))
$(eval $(call BuildAsteriskModule,res-limit,Resource limits,Resource limits.,,,res_limit,,))
$(eval $(call BuildAsteriskModule,res-manager-devicestate,Device state topic forwarder,Manager device state topic forwarder.,,,res_manager_devicestate,,))
$(eval $(call BuildAsteriskModule,res-manager-presencestate,Presence state topic forwarder,Manager presence state topic forwarder.,,,res_manager_presencestate,,))
$(eval $(call BuildAsteriskModule,res-mwi-external-ami,AMI for external MWI,AMI support for external MWI.,+$(PKG_NAME)-res-mwi-external,,res_mwi_external_ami,,))
$(eval $(call BuildAsteriskModule,res-parking,Phone Parking,Call parking resource.,+$(PKG_NAME)-bridge-holding,res_parking.conf,res_parking,,))
$(eval $(call BuildAsteriskModule,res-phoneprov,Phone Provisioning,HTTP phone provisioning.,,phoneprov.conf,res_phoneprov,,))
+$(eval $(call BuildAsteriskModule,res-pjsip-geolocation,PJSIP Geolocation,PJSIP Geolocation support.,+asterisk-pjsip +asterisk-res-geolocation,,res_pjsip_geolocation,,))
$(eval $(call BuildAsteriskModule,res-pjsip-phoneprov,PJSIP Phone Provisioning,PJSIP phone provisioning.,+$(PKG_NAME)-pjsip +$(PKG_NAME)-res-phoneprov,,res_pjsip_phoneprov_provider,,))
$(eval $(call BuildAsteriskModule,res-pjsip-stir-shaken,PJSIP STIR/SHAKEN resource module,PJSIP STIR/SHAKEN resource module.,+$(PKG_NAME)-pjsip +$(PKG_NAME)-res-stir-shaken,,res_pjsip_stir_shaken,,))
$(eval $(call BuildAsteriskModule,res-pjproject,Bridge PJPROJECT to Asterisk logging,PJProject log and utility support.,+asterisk-res-sorcery +libpj +libpjlib-util +libpjmedia +libpjmedia +libpjnath +libpjsip-simple +libpjsip-ua +libpjsip +libpjsua +libpjsua2 +libsrtp2,pjproject.conf,res_pjproject,,))
$(eval $(call BuildAsteriskModule,res-sorcery,Sorcery data layer,Sorcery backend modules for data access intended for using realtime as\nbackend.,,sorcery.conf,res_sorcery_astdb res_sorcery_config res_sorcery_memory res_sorcery_realtime,,))
$(eval $(call BuildAsteriskModule,res-sorcery-memory-cache,Sorcery memory cache object wizard,Sorcery memory cache object wizard.,,,res_sorcery_memory_cache,,))
$(eval $(call BuildAsteriskModule,res-speech,Speech Recognition API,Generic speech recognition API.,,,res_speech,,))
+$(eval $(call BuildAsteriskModule,res-speech-aeap,AEAP Speech Engine,AEAP Speech Engine support.,+asterisk-res-aeap +asterisk-res-speech,,res_speech_aeap,,))
$(eval $(call BuildAsteriskModule,res-srtp,SRTP Support,Secure RTP.,+libsrtp2,,res_srtp,,))
$(eval $(call BuildAsteriskModule,res-stasis,Stasis application,Stasis application support.,,,res_stasis,,))
$(eval $(call BuildAsteriskModule,res-stasis-answer,Stasis application answer,Stasis application answer support.,+$(PKG_NAME)-res-stasis,,res_stasis_answer,,))
--- a/configure.ac
+++ b/configure.ac
-@@ -1260,7 +1260,7 @@ if test "${ac_cv_have_variable_fdset}x"
+@@ -1261,7 +1261,7 @@ if test "${ac_cv_have_variable_fdset}x"
fi
AC_MSG_CHECKING([if we have usable eventfd support])
--- a/configure.ac
+++ b/configure.ac
-@@ -2612,7 +2612,7 @@ if test -z "$__opus_include" -o x"$__opu
+@@ -2613,7 +2613,7 @@ if test -z "$__opus_include" -o x"$__opu
fi
AST_EXT_LIB_CHECK([OPUSFILE], [opusfile], [op_open_callbacks], [opus/opusfile.h], [], [$__opus_include])
--- /dev/null
+Since commit dc701d6 in the OpenWrt packages repo the host libxml2 package
+provides a static lib only. But Asterisk does not check that and calls
+pkg-config without "--static". The result is that menuselect doesn't build.
+
+So don't use pkg-config for the libxml2 detection. Asterisk will resort to
+use xml2-config, which outputs all the flags needed.
+
+--- a/menuselect/configure.ac
++++ b/menuselect/configure.ac
+@@ -91,7 +91,6 @@ else
+ AST_EXT_LIB_CHECK([TINFO], [tinfo], [keypad], [curses.h])
+ fi
+
+-AST_PKG_CONFIG_CHECK([LIBXML2], [libxml-2.0])
+ AST_EXT_TOOL_CHECK([LIBXML2], [xml2-config], , ,
+ [#include <libxml/tree.h>
+ #include <libxml/parser.h>],
+++ /dev/null
-From f50e793665ea66b5cea7c612cc95ca27bf45afb8 Mon Sep 17 00:00:00 2001
-From: Philip Prindeville <philipp@redfish-solutions.com>
-Date: Sun, 13 Feb 2022 12:06:37 -0700
-Subject: [PATCH] time: add support for time64 libcs
-
-Treat time_t's as entirely unique and use the POSIX API's for
-converting to/from strings.
-
-Lastly, a 64-bit integer formats as 20 digits at most in base10.
-Don't need to have any 100 byte buffers to hold that.
-
-ASTERISK-29674 #close
-
-Signed-off-by: Philip Prindeville <philipp@redfish-solutions.com>
-Change-Id: Id7b25bdca8f92e34229f6454f6c3e500f2cd6f56
----
- include/asterisk/time.h | 20 ++++++++++++++++++++
- main/Makefile | 1 +
- main/time.c | 29 +++++++++++++++++++++++++++++
- res/res_calendar_caldav.c | 4 ++--
- res/res_calendar_icalendar.c | 4 ++--
- res/res_http_media_cache.c | 7 ++++---
- res/res_odbc.c | 4 +++-
- res/res_pjsip/location.c | 5 ++++-
- res/res_pjsip/pjsip_options.c | 4 +++-
- res/res_pjsip_history.c | 25 ++++++++++++++-----------
- res/res_pjsip_pubsub.c | 6 +++++-
- res/res_pjsip_registrar.c | 5 +++--
- res/res_stir_shaken.c | 6 ++++--
- 13 files changed, 94 insertions(+), 26 deletions(-)
-
---- a/include/asterisk/time.h
-+++ b/include/asterisk/time.h
-@@ -35,6 +35,13 @@
-
- #include "asterisk/inline_api.h"
-
-+/* A time_t can be represented as an unsigned long long (or uint64_t).
-+ * Formatted in base 10, UINT64_MAX is 20 digits long, plus one for NUL.
-+ * This should be the size of the receiving char buffer for calls to
-+ * ast_time_t_to_string().
-+ */
-+#define AST_TIME_T_LEN 21
-+
- /* We have to let the compiler learn what types to use for the elements of a
- struct timeval since on linux, it's time_t and suseconds_t, but on *BSD,
- they are just a long.
-@@ -316,4 +323,17 @@ struct timeval ast_time_create_by_unit(u
- */
- struct timeval ast_time_create_by_unit_str(unsigned long val, const char *unit);
-
-+/*!
-+ * \brief Converts to a string representation of a time_t as decimal
-+ * seconds since the epoch. Returns -1 on failure, zero otherwise.
-+ *
-+ * The buffer should be at least 22 bytes long.
-+ */
-+int ast_time_t_to_string(time_t time, char *buf, size_t length);
-+
-+/*!
-+ * \brief Returns a time_t from a string containing seconds since the epoch.
-+ */
-+time_t ast_string_to_time_t(const char *str);
-+
- #endif /* _ASTERISK_TIME_H */
---- a/main/Makefile
-+++ b/main/Makefile
-@@ -169,6 +169,7 @@ sched.o: _ASTCFLAGS+=$(call get_menusele
- tcptls.o: _ASTCFLAGS+=$(OPENSSL_INCLUDE) -Wno-deprecated-declarations
- uuid.o: _ASTCFLAGS+=$(UUID_INCLUDE)
- stasis.o: _ASTCFLAGS+=$(call get_menuselect_cflags,AO2_DEBUG)
-+time.o: _ASTCFLAGS+=-D_XOPEN_SOURCE=700
-
-
- OBJS:=$(sort $(OBJS))
---- a/main/time.c
-+++ b/main/time.c
-@@ -25,6 +25,7 @@
-
- #include <inttypes.h>
- #include <string.h>
-+#include <strings.h>
- #include <time.h>
-
- #include "asterisk/time.h"
-@@ -143,3 +144,31 @@ struct timeval ast_time_create_by_unit_s
- {
- return ast_time_create_by_unit(val, ast_time_str_to_unit(unit));
- }
-+
-+/*!
-+ * \brief Returns a string representation of a time_t as decimal seconds
-+ * since the epoch.
-+ */
-+int ast_time_t_to_string(time_t time, char *buf, size_t length)
-+{
-+ struct tm tm;
-+
-+ localtime_r(&time, &tm);
-+ return (strftime(buf, length, "%s", &tm) == 0) ? -1 : 0;
-+}
-+
-+/*!
-+ * \brief Returns a time_t from a string containing seconds since the epoch.
-+ */
-+time_t ast_string_to_time_t(const char *str)
-+{
-+ struct tm tm = { 0, };
-+
-+ /* handle leading spaces */
-+ if (strptime(str, " %s", &tm) == NULL) {
-+ return (time_t)-1;
-+ }
-+ tm.tm_isdst = -1;
-+ return mktime(&tm);
-+}
-+
---- a/res/res_calendar_caldav.c
-+++ b/res/res_calendar_caldav.c
-@@ -404,8 +404,8 @@ static void caldav_add_event(icalcompone
- if (!ast_strlen_zero(event->summary)) {
- ast_string_field_set(event, uid, event->summary);
- } else {
-- char tmp[100];
-- snprintf(tmp, sizeof(tmp), "%ld", event->start);
-+ char tmp[AST_TIME_T_LEN];
-+ ast_time_t_to_string(event->start, tmp, sizeof(tmp));
- ast_string_field_set(event, uid, tmp);
- }
- }
---- a/res/res_calendar_icalendar.c
-+++ b/res/res_calendar_icalendar.c
-@@ -245,8 +245,8 @@ static void icalendar_add_event(icalcomp
- if (!ast_strlen_zero(event->summary)) {
- ast_string_field_set(event, uid, event->summary);
- } else {
-- char tmp[100];
-- snprintf(tmp, sizeof(tmp), "%ld", event->start);
-+ char tmp[AST_TIME_T_LEN];
-+ ast_time_t_to_string(event->start, tmp, sizeof(tmp));
- ast_string_field_set(event, uid, tmp);
- }
- }
---- a/res/res_http_media_cache.c
-+++ b/res/res_http_media_cache.c
-@@ -116,7 +116,7 @@ static size_t curl_body_callback(void *p
- static void bucket_file_set_expiration(struct ast_bucket_file *bucket_file)
- {
- struct ast_bucket_metadata *metadata;
-- char time_buf[32];
-+ char time_buf[32], secs[AST_TIME_T_LEN];
- struct timeval actual_expires = ast_tvnow();
-
- metadata = ast_bucket_file_metadata_get(bucket_file, "cache-control");
-@@ -150,7 +150,8 @@ static void bucket_file_set_expiration(s
- }
-
- /* Use 'now' if we didn't get an expiration time */
-- snprintf(time_buf, sizeof(time_buf), "%30lu", actual_expires.tv_sec);
-+ ast_time_t_to_string(actual_expires.tv_sec, secs, sizeof(secs));
-+ snprintf(time_buf, sizeof(time_buf), "%30s", secs);
-
- ast_bucket_file_metadata_set(bucket_file, "__actual_expires", time_buf);
- }
-@@ -314,7 +315,7 @@ static int bucket_file_expired(struct as
- return 1;
- }
-
-- if (sscanf(metadata->value, "%lu", &expires.tv_sec) != 1) {
-+ if ((expires.tv_sec = ast_string_to_time_t(metadata->value)) == -1) {
- return 1;
- }
-
---- a/res/res_odbc.c
-+++ b/res/res_odbc.c
-@@ -1029,7 +1029,9 @@ static odbc_status odbc_obj_connect(stru
- /* Dont connect while server is marked as unreachable via negative_connection_cache */
- negative_cache_expiration = obj->parent->last_negative_connect.tv_sec + obj->parent->negative_connection_cache.tv_sec;
- if (time(NULL) < negative_cache_expiration) {
-- ast_log(LOG_WARNING, "Not connecting to %s. Negative connection cache for %ld seconds\n", obj->parent->name, negative_cache_expiration - time(NULL));
-+ char secs[AST_TIME_T_LEN];
-+ ast_time_t_to_string(negative_cache_expiration - time(NULL), secs, sizeof(secs));
-+ ast_log(LOG_WARNING, "Not connecting to %s. Negative connection cache for %s seconds\n", obj->parent->name, secs);
- return ODBC_FAIL;
- }
-
---- a/res/res_pjsip/location.c
-+++ b/res/res_pjsip/location.c
-@@ -489,7 +489,10 @@ static int expiration_str2struct(const s
- static int expiration_struct2str(const void *obj, const intptr_t *args, char **buf)
- {
- const struct ast_sip_contact *contact = obj;
-- return (ast_asprintf(buf, "%ld", contact->expiration_time.tv_sec) < 0) ? -1 : 0;
-+ char secs[AST_TIME_T_LEN];
-+
-+ ast_time_t_to_string(contact->expiration_time.tv_sec, secs, sizeof(secs));
-+ return (ast_asprintf(buf, "%s", secs) < 0) ? -1 : 0;
- }
-
- static int permanent_uri_sort_fn(const void *obj_left, const void *obj_right, int flags)
---- a/res/res_pjsip/pjsip_options.c
-+++ b/res/res_pjsip/pjsip_options.c
-@@ -2722,6 +2722,7 @@ int ast_sip_format_contact_ami(void *obj
- struct ast_sip_contact_status *status;
- struct ast_str *buf;
- const struct ast_sip_endpoint *endpoint = ami->arg;
-+ char secs[AST_TIME_T_LEN];
-
- buf = ast_sip_create_ami_event("ContactStatusDetail", ami);
- if (!buf) {
-@@ -2733,7 +2734,8 @@ int ast_sip_format_contact_ami(void *obj
- ast_str_append(&buf, 0, "AOR: %s\r\n", wrapper->aor_id);
- ast_str_append(&buf, 0, "URI: %s\r\n", contact->uri);
- ast_str_append(&buf, 0, "UserAgent: %s\r\n", contact->user_agent);
-- ast_str_append(&buf, 0, "RegExpire: %ld\r\n", contact->expiration_time.tv_sec);
-+ ast_time_t_to_string(contact->expiration_time.tv_sec, secs, sizeof(secs));
-+ ast_str_append(&buf, 0, "RegExpire: %s\r\n", secs);
- if (!ast_strlen_zero(contact->via_addr)) {
- ast_str_append(&buf, 0, "ViaAddress: %s", contact->via_addr);
- if (contact->via_port) {
---- a/res/res_pjsip_history.c
-+++ b/res/res_pjsip_history.c
-@@ -199,7 +199,7 @@ static int evaluate_equal(struct operato
- {
- struct timeval right = { 0, };
-
-- if (sscanf(op_right->field, "%ld", &right.tv_sec) != 1) {
-+ if ((right.tv_sec = ast_string_to_time_t(op_right->field)) == -1) {
- ast_log(LOG_WARNING, "Unable to extract field '%s': not a timestamp\n", op_right->field);
- return -1;
- }
-@@ -270,7 +270,7 @@ static int evaluate_less_than(struct ope
- {
- struct timeval right = { 0, };
-
-- if (sscanf(op_right->field, "%ld", &right.tv_sec) != 1) {
-+ if ((right.tv_sec = ast_string_to_time_t(op_right->field)) == -1) {
- ast_log(LOG_WARNING, "Unable to extract field '%s': not a timestamp\n", op_right->field);
- return -1;
- }
-@@ -319,7 +319,7 @@ static int evaluate_greater_than(struct
- {
- struct timeval right = { 0, };
-
-- if (sscanf(op_right->field, "%ld", &right.tv_sec) != 1) {
-+ if ((right.tv_sec = ast_string_to_time_t(op_right->field)) == -1) {
- ast_log(LOG_WARNING, "Unable to extract field '%s': not a timestamp\n", op_right->field);
- return -1;
- }
-@@ -656,7 +656,7 @@ static struct pjsip_history_entry *pjsip
- /*! \brief Format single line history entry */
- static void sprint_list_entry(struct pjsip_history_entry *entry, char *line, int len)
- {
-- char addr[64];
-+ char addr[64], secs[AST_TIME_T_LEN];
-
- if (entry->transmitted) {
- pj_sockaddr_print(&entry->dst, addr, sizeof(addr), 3);
-@@ -664,22 +664,24 @@ static void sprint_list_entry(struct pjs
- pj_sockaddr_print(&entry->src, addr, sizeof(addr), 3);
- }
-
-+ ast_time_t_to_string(entry->timestamp.tv_sec, secs, sizeof(secs));
-+
- if (entry->msg->type == PJSIP_REQUEST_MSG) {
- char uri[128];
-
- pjsip_uri_print(PJSIP_URI_IN_REQ_URI, entry->msg->line.req.uri, uri, sizeof(uri));
-- snprintf(line, len, "%-5.5d %-10.10ld %-5.5s %-24.24s %.*s %s SIP/2.0",
-+ snprintf(line, len, "%-5.5d %-10.10s %-5.5s %-24.24s %.*s %s SIP/2.0",
- entry->number,
-- entry->timestamp.tv_sec,
-+ secs,
- entry->transmitted ? "* ==>" : "* <==",
- addr,
- (int)pj_strlen(&entry->msg->line.req.method.name),
- pj_strbuf(&entry->msg->line.req.method.name),
- uri);
- } else {
-- snprintf(line, len, "%-5.5d %-10.10ld %-5.5s %-24.24s SIP/2.0 %u %.*s",
-+ snprintf(line, len, "%-5.5d %-10.10s %-5.5s %-24.24s SIP/2.0 %u %.*s",
- entry->number,
-- entry->timestamp.tv_sec,
-+ secs,
- entry->transmitted ? "* ==>" : "* <==",
- addr,
- entry->msg->line.status.code,
-@@ -1149,7 +1151,7 @@ static struct vector_history_t *filter_h
- /*! \brief Print a detailed view of a single entry in the history to the CLI */
- static void display_single_entry(struct ast_cli_args *a, struct pjsip_history_entry *entry)
- {
-- char addr[64];
-+ char addr[64], secs[AST_TIME_T_LEN];
- char *buf;
-
- buf = ast_calloc(1, PJSIP_MAX_PKT_LEN * sizeof(char));
-@@ -1169,11 +1171,12 @@ static void display_single_entry(struct
- pj_sockaddr_print(&entry->src, addr, sizeof(addr), 3);
- }
-
-- ast_cli(a->fd, "<--- History Entry %d %s %s at %-10.10ld --->\n",
-+ ast_time_t_to_string(entry->timestamp.tv_sec, secs, sizeof(secs));
-+ ast_cli(a->fd, "<--- History Entry %d %s %s at %-10.10s --->\n",
- entry->number,
- entry->transmitted ? "Sent to" : "Received from",
- addr,
-- entry->timestamp.tv_sec);
-+ secs);
- ast_cli(a->fd, "%s\n", buf);
-
- ast_free(buf);
---- a/res/res_pjsip_pubsub.c
-+++ b/res/res_pjsip_pubsub.c
-@@ -4872,7 +4872,11 @@ static int persistence_expires_str2struc
- static int persistence_expires_struct2str(const void *obj, const intptr_t *args, char **buf)
- {
- const struct subscription_persistence *persistence = obj;
-- return (ast_asprintf(buf, "%ld", persistence->expires.tv_sec) < 0) ? -1 : 0;
-+ char secs[AST_TIME_T_LEN];
-+
-+ ast_time_t_to_string(persistence->expires.tv_sec, secs, sizeof(secs));
-+
-+ return (ast_asprintf(buf, "%s", secs) < 0) ? -1 : 0;
- }
-
- #define RESOURCE_LIST_INIT_SIZE 4
---- a/res/res_pjsip_registrar.c
-+++ b/res/res_pjsip_registrar.c
-@@ -1365,12 +1365,13 @@ static void *check_expiration_thread(voi
- {
- struct ao2_container *contacts;
- struct ast_variable *var;
-- char *time = alloca(64);
-+ char time[AST_TIME_T_LEN];
-
- while (check_interval) {
- sleep(check_interval);
-
-- sprintf(time, "%ld", ast_tvnow().tv_sec);
-+ ast_time_t_to_string(ast_tvnow().tv_sec, time, sizeof(time));
-+
- var = ast_variable_new("expiration_time <=", time, "");
-
- ast_debug(4, "Woke up at %s Interval: %d\n", time, check_interval);
---- a/res/res_stir_shaken.c
-+++ b/res/res_stir_shaken.c
-@@ -403,7 +403,7 @@ int ast_stir_shaken_add_verification(str
- */
- static void set_public_key_expiration(const char *public_cert_url, const struct curl_cb_data *data)
- {
-- char time_buf[32];
-+ char time_buf[32], secs[AST_TIME_T_LEN];
- char *value;
- struct timeval actual_expires = ast_tvnow();
- char hash[41];
-@@ -441,7 +441,9 @@ static void set_public_key_expiration(co
- actual_expires.tv_sec += EXPIRATION_BUFFER;
- }
-
-- snprintf(time_buf, sizeof(time_buf), "%30lu", actual_expires.tv_sec);
-+ ast_time_t_to_string(actual_expires.tv_sec, secs, sizeof(secs));
-+
-+ snprintf(time_buf, sizeof(time_buf), "%30s", secs);
-
- ast_db_put(hash, "expiration", time_buf);
- }
+++ /dev/null
-From: https://issues.asterisk.org/jira/browse/ASTERISK-29905
-
-From d27d75ad8058f6ed35197737b949bac57202dd54 Mon Sep 17 00:00:00 2001
-From: "Sergey V. Lobanov" <sergey@lobanov.in>
-Date: Wed, 9 Feb 2022 01:29:46 +0300
-Subject: [PATCH] build: fix bininstall launchd issue on cross-platfrom build
-
-configure script detects /sbin/launchd, but the result of this
-check is not used in Makefile (bininstall). Makefile also detects
-/sbin/launchd file to decide if it is required to install
-safe_asterisk.
-
-configure script correctly detects cross compile build and sets
-PBX_LAUNCHD=0
-
-In case of building asterisk on MacOS host for Linux target using
-external toolchain (e.g. OpenWrt toolchain), bininstall does not
-install safe_asterisk (due to /sbin/launchd detection in Makefile),
-but it is required on target (Linux).
-
-This patch adds HAVE_SBIN_LAUNCHD=@PBX_LAUNCHD@ to makeopts.in to
-use the result of /sbin/launchd detection from configure script in
-Makefile.
-Also this patch uses HAVE_SBIN_LAUNCHD in Makefile (bininstall) to
-decide if it is required to install safe_asterisk.
-
-Signed-off-by: Sergey V. Lobanov <sergey@lobanov.in>
----
- Makefile | 6 +++---
- makeopts.in | 2 ++
- 2 files changed, 5 insertions(+), 3 deletions(-)
-
---- a/Makefile
-+++ b/Makefile
-@@ -558,9 +558,9 @@ bininstall: _all installdirs $(SUBDIRS_I
- $(INSTALL) -m 755 contrib/scripts/astversion "$(DESTDIR)$(ASTSBINDIR)/"
- $(INSTALL) -m 755 contrib/scripts/astgenkey "$(DESTDIR)$(ASTSBINDIR)/"
- $(INSTALL) -m 755 contrib/scripts/autosupport "$(DESTDIR)$(ASTSBINDIR)/"
-- if [ ! -f /sbin/launchd ]; then \
-- ./build_tools/install_subst contrib/scripts/safe_asterisk "$(DESTDIR)$(ASTSBINDIR)/safe_asterisk"; \
-- fi
-+ifneq ($(HAVE_SBIN_LAUNCHD),1)
-+ ./build_tools/install_subst contrib/scripts/safe_asterisk "$(DESTDIR)$(ASTSBINDIR)/safe_asterisk";
-+endif
-
- ifneq ($(DISABLE_XMLDOC),yes)
- $(INSTALL) -m 644 doc/core-*.xml "$(DESTDIR)$(ASTDATADIR)/documentation"
---- a/makeopts.in
-+++ b/makeopts.in
-@@ -373,3 +373,5 @@ SNDFILE_LIB=@SNDFILE_LIB@
-
- BEANSTALK_INCLUDE=@BEANSTALK_INCLUDE@
- BEANSTALK_LIB=@BEANSTALK_LIB@
-+
-+HAVE_SBIN_LAUNCHD=@PBX_LAUNCHD@
+++ /dev/null
-From 140c19c2067a5e2dcedfbb4dfa08c57758b822cb Mon Sep 17 00:00:00 2001
-From: Philip Prindeville <philipp@redfish-solutions.com>
-Date: Mon, 21 Feb 2022 18:05:49 -0700
-Subject: [PATCH] logger: workaround woefully small BUFSIZ in MUSL
-
-MUSL defines BUFSIZ as 1024 which is not reasonable for log messages.
-
-More broadly, BUFSIZ is the amount of buffering stdio.h does, which
-is arbitrary and largely orthogonal to what logging should accept
-as the maximum message size.
-
-ASTERISK-29928
-
-Signed-off-by: Philip Prindeville <philipp@redfish-solutions.com>
-Change-Id: Iaa49fbbab029c64ae3d95e4b18270e0442cce170
----
- main/logger.c | 15 ++++++++++-----
- 1 file changed, 10 insertions(+), 5 deletions(-)
-
---- a/main/logger.c
-+++ b/main/logger.c
-@@ -97,6 +97,11 @@ static int logger_queue_limit = 1000;
- static int logger_messages_discarded;
- static unsigned int high_water_alert;
-
-+/* On some platforms, like those with MUSL as the runtime, BUFSIZ is
-+ * unreasonably small (1024). Use a larger value in those environments.
-+ */
-+#define LOGMSG_SIZE MAX(BUFSIZ, 8192)
-+
- static enum rotatestrategy {
- NONE = 0, /* Do not rotate log files at all, instead rely on external mechanisms */
- SEQUENTIAL = 1 << 0, /* Original method - create a new file, in order */
-@@ -1665,7 +1670,7 @@ static struct sigaction handle_SIGXFSZ =
- static void logger_print_normal(struct logmsg *logmsg)
- {
- struct logchannel *chan = NULL;
-- char buf[BUFSIZ];
-+ char buf[LOGMSG_SIZE];
- int level = 0;
-
- AST_RWLIST_RDLOCK(&logchannels);
-@@ -1698,13 +1703,13 @@ static void logger_print_normal(struct l
-
- /* Don't use LOG_MAKEPRI because it's broken in glibc<2.17 */
- syslog_level = chan->facility | syslog_level; /* LOG_MAKEPRI(chan->facility, syslog_level); */
-- if (!chan->formatter.format_log(chan, logmsg, buf, BUFSIZ)) {
-+ if (!chan->formatter.format_log(chan, logmsg, buf, sizeof(buf))) {
- syslog(syslog_level, "%s", buf);
- }
- }
- break;
- case LOGTYPE_CONSOLE:
-- if (!chan->formatter.format_log(chan, logmsg, buf, BUFSIZ)) {
-+ if (!chan->formatter.format_log(chan, logmsg, buf, sizeof(buf))) {
- ast_console_puts_mutable_full(buf, logmsg->level, logmsg->sublevel);
- }
- break;
-@@ -1716,7 +1721,7 @@ static void logger_print_normal(struct l
- continue;
- }
-
-- if (chan->formatter.format_log(chan, logmsg, buf, BUFSIZ)) {
-+ if (chan->formatter.format_log(chan, logmsg, buf, sizeof(buf))) {
- continue;
- }
-
-@@ -1780,7 +1785,7 @@ static struct logmsg * __attribute__((fo
- }
-
- /* Build string */
-- res = ast_str_set_va(&buf, BUFSIZ, fmt, ap);
-+ res = ast_str_set_va(&buf, LOGMSG_SIZE, fmt, ap);
-
- /* If the build failed, then abort and free this structure */
- if (res == AST_DYNSTR_BUILD_FAILED) {