From 3c9ab22f9323726710b931ed478e6d5dd81dca2e Mon Sep 17 00:00:00 2001
From: "A. Wilcox" <AWilcox@Wilcox-Tech.com>
Date: Sun, 18 Aug 2024 03:09:47 -0500
Subject: [PATCH 22/34] Port to musl strptime
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 8bit

This cannot be upstreamed.

Signed-off-by: Alexander Miroshnichenko <alex@millerson.name>
---
 src/basic/time-util.c  | 25 ++++++++++++++++++++-----
 src/import/curl-util.c |  6 +++---
 2 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/src/basic/time-util.c b/src/basic/time-util.c
index b94f37c31c31..1200833a88c5 100644
--- a/src/basic/time-util.c
+++ b/src/basic/time-util.c
@@ -915,6 +915,7 @@ parse_usec:
 from_tm:
         assert(plus == 0);
         assert(minus == 0);
+        tm.tm_wday = weekday;
 
         if (weekday >= 0 && tm.tm_wday != weekday)
                 return -EINVAL;
@@ -1003,9 +1004,12 @@ int parse_timestamp(const char *t, usec_t *ret) {
                 return parse_timestamp_impl(t, t_len - 1, /* utc = */ true, /* isdst = */ -1, /* gmtoff = */ 0, ret);
 
         if (t_len > 7 && IN_SET(t[t_len - 6], '+', '-') && t[t_len - 7] != ' ') {  /* RFC3339-style welded offset: "1990-12-31T15:59:60-08:00" */
-                k = strptime(&t[t_len - 6], "%z", &tm);
-                if (k && *k == '\0')
+                k = strptime(&t[t_len - 5], "%R", &tm);
+                if (k && *k == '\0') {
+                        tm.tm_gmtoff = ((tm.tm_hour * 60) + tm.tm_min) * 60;
+                        if (t[t_len - 6] == '-') tm.tm_gmtoff *= -1;
                         return parse_timestamp_impl(t, t_len - 6, /* utc = */ true, /* isdst = */ -1, /* gmtoff = */ tm.tm_gmtoff, ret);
+                }
         }
 
         tz = strrchr(t, ' ');
@@ -1022,9 +1026,20 @@ int parse_timestamp(const char *t, usec_t *ret) {
         /* If the timezone is compatible with RFC-822/ISO 8601 (e.g. +06, or -03:00) then parse the string as
          * UTC and shift the result. Note, this must be earlier than the timezone check with tzname[], as
          * tzname[] may be in the same format. */
-        k = strptime(tz, "%z", &tm);
-        if (k && *k == '\0')
-                return parse_timestamp_impl(t, max_len, /* utc = */ true, /* isdst = */ -1, /* gmtoff = */ tm.tm_gmtoff, ret);
+        if (*tz == '+' || *tz == '-') {
+                k = strptime(tz+1, "%R", &tm);
+                if (k && *k == '\0') {
+                        tm.tm_gmtoff = ((tm.tm_hour * 60) + tm.tm_min) * 60;
+                        if (*tz == '-') tm.tm_gmtoff *= -1;
+                        return parse_timestamp_impl(t, max_len, /* utc = */ true, /* isdst = */ -1, /* gmtoff = */ tm.tm_gmtoff, ret);
+                }
+                k = strptime(tz+1, "%H", &tm);
+                if (k && *k == '\0') {
+                        tm.tm_gmtoff = tm.tm_hour * 3600;
+                        if (*tz == '-') tm.tm_gmtoff *= -1;
+                        return parse_timestamp_impl(t, max_len, /* utc = */ true, /* isdst = */ -1, /* gmtoff = */ tm.tm_gmtoff, ret);
+                }
+        }
 
         /* If the last word is not a timezone file (e.g. Asia/Tokyo), then let's check if it matches
          * tzname[] of the local timezone, e.g. JST or CEST. */
diff --git a/src/import/curl-util.c b/src/import/curl-util.c
index 1628f833a970..4a3003b3e848 100644
--- a/src/import/curl-util.c
+++ b/src/import/curl-util.c
@@ -396,13 +396,13 @@ int curl_parse_http_time(const char *t, usec_t *ret) {
                 return -errno;
 
         /* RFC822 */
-        e = strptime_l(t, "%a, %d %b %Y %H:%M:%S %Z", &tm, loc);
+        e = strptime(t, "%a, %d %b %Y %H:%M:%S %Z", &tm);
         if (!e || *e != 0)
                 /* RFC 850 */
-                e = strptime_l(t, "%A, %d-%b-%y %H:%M:%S %Z", &tm, loc);
+                e = strptime(t, "%A, %d-%b-%y %H:%M:%S %Z", &tm);
         if (!e || *e != 0)
                 /* ANSI C */
-                e = strptime_l(t, "%a %b %d %H:%M:%S %Y", &tm, loc);
+                e = strptime(t, "%a %b %d %H:%M:%S %Y", &tm);
         if (!e || *e != 0)
                 return -EINVAL;
 
-- 
2.41.0

