* [musl] strptime("UTC", "%Z", &tm) in musl
@ 2025-04-06 19:57 Alejandro Colomar
2025-04-06 20:05 ` [musl] " Alejandro Colomar
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Alejandro Colomar @ 2025-04-06 19:57 UTC (permalink / raw)
To: Rich Felker; +Cc: ipedrosa, musl, ~hallyn/shadow
[-- Attachment #1: Type: text/plain, Size: 1429 bytes --]
Hi Rich,
I was trying to develop a function that parses a UTC date in the shadow
project, and I came up with this:
<https://github.com/shadow-maint/shadow/pull/1217/>
$ grepc -htfd get_date .
static long
get_date(const char *s)
{
struct tm tm;
const char *p;
bzero(&tm, sizeof(tm));
p = strptime("UTC", "%Z", &tm);
if (p == NULL || !streq(p, ""))
return -1;
p = strptime(s, "%F", &tm);
if (p == NULL || !streq(p, ""))
return -1;
return dategm(&tm);
}
Which works fine in glibc, but fails in musl.
$ grepc -tfd strptime . | sed -n '/case .Z.:/,/break/p'
case 'Z':
if (!strncmp(s, tzname[0], len = strlen(tzname[0]))) {
tm->tm_isdst = 0;
s += len;
} else if (!strncmp(s, tzname[1], len=strlen(tzname[1]))) {
tm->tm_isdst = 1;
s += len;
} else {
/* FIXME: is this supposed to be an error? */
while ((*s|32)-'a' <= 'z'-'a') s++;
}
break;
It seems "%Z" only accepts the timezone specified in the current locale
(via tzname), but doesn't accept parsing a different timezone (in this
case, I want specifically UTC, regardless of the locale). I'd say this
is a bug, and an important limitation, BTW.
Is there any way I can workaround this for musl?
Have a lovely day!
Alex
--
<https://www.alejandro-colomar.es/>
<https://www.alejandro-colomar.es:8443/>
<http://www.alejandro-colomar.es:8080/>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* [musl] Re: strptime("UTC", "%Z", &tm) in musl
2025-04-06 19:57 [musl] strptime("UTC", "%Z", &tm) in musl Alejandro Colomar
@ 2025-04-06 20:05 ` Alejandro Colomar
2025-04-06 20:55 ` [musl] " Haelwenn (lanodan) Monnier
2025-04-07 2:45 ` Rich Felker
2 siblings, 0 replies; 7+ messages in thread
From: Alejandro Colomar @ 2025-04-06 20:05 UTC (permalink / raw)
To: Rich Felker, libc-alpha; +Cc: ipedrosa, musl, ~hallyn/shadow
[-- Attachment #1: Type: text/plain, Size: 2092 bytes --]
[Add libc-alpha@]
On Sun, Apr 06, 2025 at 09:57:39PM +0200, Alejandro Colomar wrote:
> Hi Rich,
>
> I was trying to develop a function that parses a UTC date in the shadow
> project, and I came up with this:
> <https://github.com/shadow-maint/shadow/pull/1217/>
>
> $ grepc -htfd get_date .
> static long
> get_date(const char *s)
> {
> struct tm tm;
> const char *p;
>
> bzero(&tm, sizeof(tm));
>
> p = strptime("UTC", "%Z", &tm);
> if (p == NULL || !streq(p, ""))
> return -1;
>
> p = strptime(s, "%F", &tm);
> if (p == NULL || !streq(p, ""))
> return -1;
>
> return dategm(&tm);
> }
>
> Which works fine in glibc, but fails in musl.
Actually, I've now read the glibc sources, and it seems even worse in
glibc. glibc ignores the parsed timezone at all.
So, both glibc and musl have a bug here, I think.
Is there any way to parse a UTC date? That is, parse a "YYYY-MM-DD"
date that is not in local time, but in UTC time.
Have a lovely night!
Alex
>
> $ grepc -tfd strptime . | sed -n '/case .Z.:/,/break/p'
> case 'Z':
> if (!strncmp(s, tzname[0], len = strlen(tzname[0]))) {
> tm->tm_isdst = 0;
> s += len;
> } else if (!strncmp(s, tzname[1], len=strlen(tzname[1]))) {
> tm->tm_isdst = 1;
> s += len;
> } else {
> /* FIXME: is this supposed to be an error? */
> while ((*s|32)-'a' <= 'z'-'a') s++;
> }
> break;
>
> It seems "%Z" only accepts the timezone specified in the current locale
> (via tzname), but doesn't accept parsing a different timezone (in this
> case, I want specifically UTC, regardless of the locale). I'd say this
> is a bug, and an important limitation, BTW.
>
> Is there any way I can workaround this for musl?
>
>
> Have a lovely day!
> Alex
>
> --
> <https://www.alejandro-colomar.es/>
> <https://www.alejandro-colomar.es:8443/>
> <http://www.alejandro-colomar.es:8080/>
--
<https://www.alejandro-colomar.es/>
<https://www.alejandro-colomar.es:8443/>
<http://www.alejandro-colomar.es:8080/>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [musl] strptime("UTC", "%Z", &tm) in musl
2025-04-06 19:57 [musl] strptime("UTC", "%Z", &tm) in musl Alejandro Colomar
2025-04-06 20:05 ` [musl] " Alejandro Colomar
@ 2025-04-06 20:55 ` Haelwenn (lanodan) Monnier
2025-04-06 23:54 ` Alejandro Colomar
2025-04-07 2:45 ` Rich Felker
2 siblings, 1 reply; 7+ messages in thread
From: Haelwenn (lanodan) Monnier @ 2025-04-06 20:55 UTC (permalink / raw)
To: musl; +Cc: Rich Felker, ipedrosa, ~hallyn/shadow, libc-alpha
[2025-04-06 21:57:35+0200] Alejandro Colomar:
>I was trying to develop a function that parses a UTC date in the shadow
>project, and I came up with this:
><https://github.com/shadow-maint/shadow/pull/1217/>
>
> $ grepc -htfd get_date .
> static long
> get_date(const char *s)
> {
> struct tm tm;
> const char *p;
>
> bzero(&tm, sizeof(tm));
>
> p = strptime("UTC", "%Z", &tm);
> if (p == NULL || !streq(p, ""))
> return -1;
That bzero seems like a bit of a bad idea, `struct tm` can have some extra
fields where 0 isn't the correct value.
Quite like how `tm_isdst` uses -1 for unknown state, 0 for no-DST, 1 for DST.
Could probably use `if(!gmtime_r(0, &tm)) { /* handle err */ }` instead
which also has the nice effect of initializing tm for UTC,
allowing to skip the problematic strptime %Z.
Best regards
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [musl] strptime("UTC", "%Z", &tm) in musl
2025-04-06 20:55 ` [musl] " Haelwenn (lanodan) Monnier
@ 2025-04-06 23:54 ` Alejandro Colomar
2025-04-07 17:01 ` Haelwenn (lanodan) Monnier
0 siblings, 1 reply; 7+ messages in thread
From: Alejandro Colomar @ 2025-04-06 23:54 UTC (permalink / raw)
To: musl, Rich Felker, ipedrosa, ~hallyn/shadow, libc-alpha
[-- Attachment #1: Type: text/plain, Size: 5366 bytes --]
Hi Haelwenn,
On Sun, Apr 06, 2025 at 10:55:46PM +0200, Haelwenn (lanodan) Monnier wrote:
> [2025-04-06 21:57:35+0200] Alejandro Colomar:
> > I was trying to develop a function that parses a UTC date in the shadow
> > project, and I came up with this:
> > <https://github.com/shadow-maint/shadow/pull/1217/>
> >
> > $ grepc -htfd get_date .
> > static long
> > get_date(const char *s)
> > {
> > struct tm tm;
> > const char *p;
> >
> > bzero(&tm, sizeof(tm));
> >
> > p = strptime("UTC", "%Z", &tm);
> > if (p == NULL || !streq(p, ""))
> > return -1;
>
> That bzero seems like a bit of a bad idea, `struct tm` can have some extra
> fields where 0 isn't the correct value.
> Quite like how `tm_isdst` uses -1 for unknown state, 0 for no-DST, 1 for DST.
>
> Could probably use `if(!gmtime_r(0, &tm)) { /* handle err */ }` instead
> which also has the nice effect of initializing tm for UTC,
> allowing to skip the problematic strptime %Z.
Thanks! This is quite clever. I've changed this to my patch:
diff --git i/lib/strtoday.c w/lib/strtoday.c
index 2d88e8b6..ab03b921 100644
--- i/lib/strtoday.c
+++ w/lib/strtoday.c
@@ -47,13 +47,13 @@ strtoday(const char *str)
static long
get_date(const char *s)
{
+ time_t t;
struct tm tm;
const char *p;
- bzero(&tm, sizeof(tm));
-
- p = strptime("UTC", "%Z", &tm);
- if (p == NULL || !streq(p, ""))
+ // Set timezone to UTC
+ t = 0;
+ if (gmtime_r(&t, &tm) == NULL)
return -1;
p = strptime(s, "%F", &tm);
If you don't mind, I'd like to add you as a co-author of the patch, and
assign you copyright in that file. Please sign the following commit, if
you approve it.
Have a lovely night!
Alex
---
<https://github.com/shadow-maint/shadow/pull/1217>
Author: Alejandro Colomar <alx@kernel.org>
Date: Tue Feb 18 23:25:29 2025 +0100
lib/getdate.c: Use strptime(3) to simplify
The following trick:
t = 0;
gmtime_r(&t, &tm);
is a clever way to clear the tm(3type) structure, and set it to use UTC.
We need to set it to set UTC with this trick, because strptime(3)
doesn't set the timezone. I (Alex) tried previously using
bzero(&tm, sizeof(tm));
strptime("UTC", "%Z", &tm);
but glibc ignores the timezone, and musl (at least I tried in an Alpine
container) seems to report an error.
The idea to use gmtime_r(3) was from lanodan.
Link: <https://inbox.sourceware.org/libc-alpha/Z_LqUgildoq33vI-@cloudsdale.the-delta.net.eu.org/T/#u>
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: Rich Felker <dalias@libc.org>
Co-authored-by: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
diff --git a/lib/getdate.c b/lib/getdate.c
index 31a5c25b..fa2df83e 100644
--- a/lib/getdate.c
+++ b/lib/getdate.c
@@ -1,81 +1,31 @@
// SPDX-FileCopyrightText: 2025, Alejandro Colomar <alx@kernel.org>
+// SPDX-FileCopyrightText: 2025, "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
// SPDX-License-Identifier: BSD-3-Clause
#include <config.h>
-#include <errno.h>
-#include <limits.h>
#include <stddef.h>
-#include <string.h>
#include <time.h>
-#include "atoi/a2i/a2s.h"
#include "getdate.h"
-#include "string/strchr/strchrcnt.h"
#include "string/strcmp/streq.h"
-#include "string/strcmp/strprefix.h"
-#include "string/strcmp/strsuffix.h"
-#include "string/strspn/stpspn.h"
-
-
-#define TM_YEAR_ORIGIN 1900
-
-
-static long yyDay;
-static long yyMonth;
-static long yyYear;
-
-
-static int parse_date(const char *s);
time_t
-get_date(const char *s);
+get_date(const char *s)
{
- struct tm tm;
+ time_t t;
+ struct tm tm;
+ const char *p;
- if (parse_date(p) == -1)
+ t = 0;
+ if (gmtime_r(&t, &tm) == NULL)
return -1;
- tm.tm_year = yyYear - TM_YEAR_ORIGIN;
- tm.tm_mon = yyMonth - 1;
- tm.tm_mday = yyDay;
- tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
- tm.tm_isdst = 0;
+ p = strptime(s, "%F", &tm);
+ if (p == NULL || !streq(p, ""))
+ return -1;
return timegm(&tm);
}
-
-
-static int
-parse_date(const char *s)
-{
- long n;
-
- if (!streq(stpspn(s, "0123456789-"), "")
- || strchrcnt(s, '-') != 2
- || strprefix(s, "-")
- || strsuffix(s, "-")
- || strstr(s, "--"))
- {
- return -1;
- }
-
- if (a2sl(&yyYear, s, &s, 10, LONG_MIN, LONG_MAX) == -1 && errno != ENOTSUP)
- return -1;
-
- if (!strprefix(s++, "-"))
- return -1;
-
- if (a2sl(&yyMonth, s, &s, 10, LONG_MIN, LONG_MAX) == -1 && errno != ENOTSUP)
- return -1;
-
- if (!strprefix(s++, "-"))
- return -1;
-
- if (a2sl(&yyDay, s, NULL, 10, LONG_MIN, LONG_MAX) == -1)
- return -1;
-
- return 0;
-}
--
<https://www.alejandro-colomar.es/>
<https://www.alejandro-colomar.es:8443/>
<http://www.alejandro-colomar.es:8080/>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [musl] strptime("UTC", "%Z", &tm) in musl
2025-04-06 19:57 [musl] strptime("UTC", "%Z", &tm) in musl Alejandro Colomar
2025-04-06 20:05 ` [musl] " Alejandro Colomar
2025-04-06 20:55 ` [musl] " Haelwenn (lanodan) Monnier
@ 2025-04-07 2:45 ` Rich Felker
2 siblings, 0 replies; 7+ messages in thread
From: Rich Felker @ 2025-04-07 2:45 UTC (permalink / raw)
To: Alejandro Colomar; +Cc: ipedrosa, musl
On Sun, Apr 06, 2025 at 09:57:35PM +0200, Alejandro Colomar wrote:
> Hi Rich,
>
> I was trying to develop a function that parses a UTC date in the shadow
> project, and I came up with this:
> <https://github.com/shadow-maint/shadow/pull/1217/>
>
> $ grepc -htfd get_date .
> static long
> get_date(const char *s)
> {
> struct tm tm;
> const char *p;
>
> bzero(&tm, sizeof(tm));
>
> p = strptime("UTC", "%Z", &tm);
> if (p == NULL || !streq(p, ""))
> return -1;
>
> p = strptime(s, "%F", &tm);
> if (p == NULL || !streq(p, ""))
> return -1;
>
> return dategm(&tm);
> }
>
> Which works fine in glibc, but fails in musl.
>
> $ grepc -tfd strptime . | sed -n '/case .Z.:/,/break/p'
> case 'Z':
> if (!strncmp(s, tzname[0], len = strlen(tzname[0]))) {
> tm->tm_isdst = 0;
> s += len;
> } else if (!strncmp(s, tzname[1], len=strlen(tzname[1]))) {
> tm->tm_isdst = 1;
> s += len;
> } else {
> /* FIXME: is this supposed to be an error? */
> while ((*s|32)-'a' <= 'z'-'a') s++;
> }
> break;
>
> It seems "%Z" only accepts the timezone specified in the current locale
> (via tzname), but doesn't accept parsing a different timezone (in this
> case, I want specifically UTC, regardless of the locale). I'd say this
> is a bug, and an important limitation, BTW.
>
> Is there any way I can workaround this for musl?
See commit fced99e93daeefb0192fd16304f978d4401d1d77. The newly added
specifiers were added only with their POSIX-specified behavior, not
anything else. I don't think the POSIX-specified behavior is terribly
useful, but it's indicative that there's not consensus on any behavior
beyond that, and that programs that depend on any particular
implementation behavior beyond what's specified are likely not
portable.
I'm not sure what you're trying to achieve so I don't know what
alternative I'd recommend.
Rich
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [musl] strptime("UTC", "%Z", &tm) in musl
2025-04-06 23:54 ` Alejandro Colomar
@ 2025-04-07 17:01 ` Haelwenn (lanodan) Monnier
2025-04-07 21:23 ` Alejandro Colomar
0 siblings, 1 reply; 7+ messages in thread
From: Haelwenn (lanodan) Monnier @ 2025-04-07 17:01 UTC (permalink / raw)
To: musl; +Cc: Rich Felker, ipedrosa, ~hallyn/shadow, libc-alpha
[2025-04-07 01:54:14+0200] Alejandro Colomar:
>Hi Haelwenn,
>
>On Sun, Apr 06, 2025 at 10:55:46PM +0200, Haelwenn (lanodan) Monnier wrote:
>> [2025-04-06 21:57:35+0200] Alejandro Colomar:
>> > I was trying to develop a function that parses a UTC date in the shadow
>> > project, and I came up with this:
>> > <https://github.com/shadow-maint/shadow/pull/1217/>
>> >
>> > $ grepc -htfd get_date .
>> > static long
>> > get_date(const char *s)
>> > {
>> > struct tm tm;
>> > const char *p;
>> >
>> > bzero(&tm, sizeof(tm));
>> >
>> > p = strptime("UTC", "%Z", &tm);
>> > if (p == NULL || !streq(p, ""))
>> > return -1;
>>
>> That bzero seems like a bit of a bad idea, `struct tm` can have some extra
>> fields where 0 isn't the correct value.
>> Quite like how `tm_isdst` uses -1 for unknown state, 0 for no-DST, 1 for DST.
>>
>> Could probably use `if(!gmtime_r(0, &tm)) { /* handle err */ }` instead
>> which also has the nice effect of initializing tm for UTC,
>> allowing to skip the problematic strptime %Z.
>
>Thanks! This is quite clever. I've changed this to my patch:
>
> diff --git i/lib/strtoday.c w/lib/strtoday.c
> index 2d88e8b6..ab03b921 100644
> --- i/lib/strtoday.c
> +++ w/lib/strtoday.c
> @@ -47,13 +47,13 @@ strtoday(const char *str)
> static long
> get_date(const char *s)
> {
> + time_t t;
> struct tm tm;
> const char *p;
>
> - bzero(&tm, sizeof(tm));
> -
> - p = strptime("UTC", "%Z", &tm);
> - if (p == NULL || !streq(p, ""))
> + // Set timezone to UTC
> + t = 0;
> + if (gmtime_r(&t, &tm) == NULL)
> return -1;
>
> p = strptime(s, "%F", &tm);
>
>If you don't mind, I'd like to add you as a co-author of the patch, and
>assign you copyright in that file. Please sign the following commit, if
>you approve it.
Yeah, looks good to me. And I guess Signed-off-by is the correct field for this.
Signed-off-by: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Best regards
>Have a lovely night!
>Alex
>
>
>---
>
><https://github.com/shadow-maint/shadow/pull/1217>
>
>Author: Alejandro Colomar <alx@kernel.org>
>Date: Tue Feb 18 23:25:29 2025 +0100
>
> lib/getdate.c: Use strptime(3) to simplify
>
> The following trick:
>
> t = 0;
> gmtime_r(&t, &tm);
>
> is a clever way to clear the tm(3type) structure, and set it to use UTC.
>
> We need to set it to set UTC with this trick, because strptime(3)
> doesn't set the timezone. I (Alex) tried previously using
>
> bzero(&tm, sizeof(tm));
> strptime("UTC", "%Z", &tm);
>
> but glibc ignores the timezone, and musl (at least I tried in an Alpine
> container) seems to report an error.
>
> The idea to use gmtime_r(3) was from lanodan.
>
> Link: <https://inbox.sourceware.org/libc-alpha/Z_LqUgildoq33vI-@cloudsdale.the-delta.net.eu.org/T/#u>
> Cc: Iker Pedrosa <ipedrosa@redhat.com>
> Cc: Serge Hallyn <serge@hallyn.com>
> Cc: Rich Felker <dalias@libc.org>
> Co-authored-by: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
> Signed-off-by: Alejandro Colomar <alx@kernel.org>
>
>diff --git a/lib/getdate.c b/lib/getdate.c
>index 31a5c25b..fa2df83e 100644
>--- a/lib/getdate.c
>+++ b/lib/getdate.c
>@@ -1,81 +1,31 @@
> // SPDX-FileCopyrightText: 2025, Alejandro Colomar <alx@kernel.org>
>+// SPDX-FileCopyrightText: 2025, "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
> // SPDX-License-Identifier: BSD-3-Clause
>
>
> #include <config.h>
>
>-#include <errno.h>
>-#include <limits.h>
> #include <stddef.h>
>-#include <string.h>
> #include <time.h>
>
>-#include "atoi/a2i/a2s.h"
> #include "getdate.h"
>-#include "string/strchr/strchrcnt.h"
> #include "string/strcmp/streq.h"
>-#include "string/strcmp/strprefix.h"
>-#include "string/strcmp/strsuffix.h"
>-#include "string/strspn/stpspn.h"
>-
>-
>-#define TM_YEAR_ORIGIN 1900
>-
>-
>-static long yyDay;
>-static long yyMonth;
>-static long yyYear;
>-
>-
>-static int parse_date(const char *s);
>
>
> time_t
>-get_date(const char *s);
>+get_date(const char *s)
> {
>- struct tm tm;
>+ time_t t;
>+ struct tm tm;
>+ const char *p;
>
>- if (parse_date(p) == -1)
>+ t = 0;
>+ if (gmtime_r(&t, &tm) == NULL)
> return -1;
>
>- tm.tm_year = yyYear - TM_YEAR_ORIGIN;
>- tm.tm_mon = yyMonth - 1;
>- tm.tm_mday = yyDay;
>- tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
>- tm.tm_isdst = 0;
>+ p = strptime(s, "%F", &tm);
>+ if (p == NULL || !streq(p, ""))
>+ return -1;
>
> return timegm(&tm);
> }
>-
>-
>-static int
>-parse_date(const char *s)
>-{
>- long n;
>-
>- if (!streq(stpspn(s, "0123456789-"), "")
>- || strchrcnt(s, '-') != 2
>- || strprefix(s, "-")
>- || strsuffix(s, "-")
>- || strstr(s, "--"))
>- {
>- return -1;
>- }
>-
>- if (a2sl(&yyYear, s, &s, 10, LONG_MIN, LONG_MAX) == -1 && errno != ENOTSUP)
>- return -1;
>-
>- if (!strprefix(s++, "-"))
>- return -1;
>-
>- if (a2sl(&yyMonth, s, &s, 10, LONG_MIN, LONG_MAX) == -1 && errno != ENOTSUP)
>- return -1;
>-
>- if (!strprefix(s++, "-"))
>- return -1;
>-
>- if (a2sl(&yyDay, s, NULL, 10, LONG_MIN, LONG_MAX) == -1)
>- return -1;
>-
>- return 0;
>-}
>
>--
><https://www.alejandro-colomar.es/>
><https://www.alejandro-colomar.es:8443/>
><http://www.alejandro-colomar.es:8080/>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [musl] strptime("UTC", "%Z", &tm) in musl
2025-04-07 17:01 ` Haelwenn (lanodan) Monnier
@ 2025-04-07 21:23 ` Alejandro Colomar
0 siblings, 0 replies; 7+ messages in thread
From: Alejandro Colomar @ 2025-04-07 21:23 UTC (permalink / raw)
To: musl, Rich Felker, ipedrosa, ~hallyn/shadow, libc-alpha
[-- Attachment #1: Type: text/plain, Size: 345 bytes --]
Hi,
On Mon, Apr 07, 2025 at 07:01:35PM +0200, Haelwenn (lanodan) Monnier wrote:
> Yeah, looks good to me. And I guess Signed-off-by is the correct field for this.
>
> Signed-off-by: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
>
> Best regards
Thanks! Have a lovely night!
Alex
--
<https://www.alejandro-colomar.es/>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-04-07 21:24 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-04-06 19:57 [musl] strptime("UTC", "%Z", &tm) in musl Alejandro Colomar
2025-04-06 20:05 ` [musl] " Alejandro Colomar
2025-04-06 20:55 ` [musl] " Haelwenn (lanodan) Monnier
2025-04-06 23:54 ` Alejandro Colomar
2025-04-07 17:01 ` Haelwenn (lanodan) Monnier
2025-04-07 21:23 ` Alejandro Colomar
2025-04-07 2:45 ` Rich Felker
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/musl/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).