head 1.1; access; symbols; locks; strict; comment @ * @; 1.1 date 2026.11.09.05.37.21; author jnemeth; state Exp; branches; next ; commitid nfklAD0yCz3anK2H; desc @@ 1.1 log @comms/asterisk24: import asterisk-24.0.0 Asterisk is a complete PBX in software. It provides all of the features you would expect from a PBX and more. Asterisk does voice over IP in three protocols, and can interoperate with almost all standards-based telephony equipment using relatively inexpensive hardware. Asterisk provides Voicemail services with Directory, Call Conferencing, Interactive Voice Response, Call Queuing. It has support for three-way calling, caller ID services, ADSI, SIP and H.323 (as both client and gateway). This is a Long Term Support version. It is scheduled to go to security fixes only on October 15th, 2030, and EOL on October 15th, 2031. See here for more information about Asterisk versions: https://docs.asterisk.org/About-the-Project/Asterisk-Versions/ @ text @$NetBSD: patch-main_stdtime_localtime.c,v 1.2 2026/04/13 03:47:12 jnemeth Exp $ --- main/stdtime/localtime.c.orig 2026-04-09 16:37:03.000000000 +0000 +++ main/stdtime/localtime.c @@@@ -65,6 +65,10 @@@@ #include #include #endif +#ifdef __sun +#include +#include +#endif #include "private.h" #include "tzfile.h" @@@@ -74,6 +78,7 @@@@ #include "asterisk/localtime.h" #include "asterisk/strings.h" #include "asterisk/linkedlists.h" +#include "asterisk/autoconfig.h" #include "asterisk/utils.h" #include "asterisk/test.h" @@@@ -310,7 +315,7 @@@@ static AST_LIST_HEAD_STATIC(zonelist, state); static void sstate_free(struct state *p); static AST_LIST_HEAD_STATIC(zonelist, state); -#if defined(HAVE_NEWLOCALE) && defined(HAVE_USELOCALE) +#if defined(HAVE_NEWLOCALE) && (defined(HAVE_USELOCALE) || HAVE_STRFTIME_L || HAVE_STRPTIME_L) static AST_LIST_HEAD_STATIC(localelist, locale_entry); #endif @@@@ -731,7 +736,7 @@@@ static void *notify_daemon(void *data) if (st.st_mtime > cur->mtime[0] || lst.st_mtime > cur->mtime[1]) { #ifdef TEST_FRAMEWORK if (test) { - ast_test_status_update(test, "Removing cached TZ entry '%s' because underlying file changed. (%ld != %ld) or (%ld != %ld)\n", name, st.st_mtime, cur->mtime[0], lst.st_mtime, cur->mtime[1]); + ast_test_status_update(test, "Removing cached TZ entry '%s' because underlying file changed. (%jd != %jd) or (%jd != %jd)\n", name, (intmax_t)st.st_mtime, (intmax_t)cur->mtime[0], (intmax_t)lst.st_mtime, (intmax_t)cur->mtime[1]); } else #endif { @@@@ -2362,7 +2367,8 @@@@ struct timeval ast_mktime(struct ast_tm *tmp, const ch return time1(tmp, localsub, 0L, sp); } -#if defined(HAVE_NEWLOCALE) && defined(HAVE_USELOCALE) +#if defined(HAVE_NEWLOCALE) && (defined(HAVE_USELOCALE) || HAVE_STRFTIME_L || HAVE_STRPTIME_L) +#if defined HAVE_USELOCALE static struct locale_entry *find_by_locale(locale_t locale) { struct locale_entry *cur; @@@@ -2373,6 +2379,7 @@@@ static struct locale_entry *find_by_locale(locale_t lo } return NULL; } +#endif static struct locale_entry *find_by_name(const char *name) { @@@@ -2385,6 +2392,23 @@@@ static struct locale_entry *find_by_name(const char *n return NULL; } +#if HAVE_STRFTIME_L || HAVE_STRPTIME_L +static locale_t ast_getlocale(const char *locale) +{ + struct locale_entry *cur; + + AST_LIST_LOCK(&localelist); + if ((cur = find_by_name(locale)) == NULL) { + cur->locale = newlocale(LC_ALL_MASK, locale, NULL); + strcpy(cur->name, locale); /* SAFE */ + AST_LIST_INSERT_TAIL(&localelist, cur, list); + } + AST_LIST_UNLOCK(&localelist); + return cur->locale; +} +#endif + +#if !HAVE_STRFTIME_L || !HAVE_STRPTIME_L static const char *store_by_locale(locale_t prevlocale) { struct locale_entry *cur; @@@@ -2442,6 +2466,7 @@@@ const char *ast_setlocale(const char *locale) AST_LIST_UNLOCK(&localelist); return store_by_locale(prevlocale); } +#endif #else const char *ast_setlocale(const char *unused) { @@@@ -2455,7 +2480,9 @@@@ int ast_strftime_locale(char *buf, size_t len, const c char *format = ast_calloc(1, fmtlen), *fptr = format, *newfmt; int decimals = -1, i, res; long fraction; +#if !HAVE_STRFTIME_L const char *prevlocale; +#endif buf[0] = '\0';/* Ensure the buffer is initialized. */ if (!format) { @@@@ -2510,13 +2537,22 @@@@ defcase: *fptr++ = *tmp; } *fptr = '\0'; #undef strftime +#if HAVE_STRFTIME_L if (locale) { + locale_t l = ast_getlocale(locale); + res = (int)strftime_l(buf, len, format, (struct tm *)tm, l); + } else { + res = (int)strftime(buf, len, format, (struct tm *)tm); + } +#else + if (locale) { prevlocale = ast_setlocale(locale); } res = (int)strftime(buf, len, format, (struct tm *)tm); if (locale) { ast_setlocale(prevlocale); } +#endif ast_free(format); return res; } @@@@ -2530,11 +2566,22 @@@@ char *ast_strptime_locale(const char *s, const char *f { struct tm tm2 = { 0, }; char *res; +#if !HAVE_STRPTIME_L const char *prevlocale; +#endif +#if HAVE_STRPTIME_L + if (locale) { + locale_t l = ast_getlocale(locale); + res = strptime_l(s, format, &tm2, l); + } else { + res = strptime(s, format, &tm2); + } +#else prevlocale = ast_setlocale(locale); res = strptime(s, format, &tm2); ast_setlocale(prevlocale); +#endif /* ast_time and tm are not the same size - tm is a subset of * ast_time. Hence, the size of tm needs to be used for the * memcpy @