summaryrefslogtreecommitdiffstats
path: root/src/parse.c
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2024-03-07 16:18:32 -0500
committerTavian Barnes <tavianator@tavianator.com>2024-03-07 16:26:25 -0500
commit43cd776d7dc8ac573262f8459edeb1c1f5f3cd09 (patch)
tree4aae15ba3afb55506e43faf3dd36076f504fb793 /src/parse.c
parent416ca3b557055efa5746a4d40d927391c59a9292 (diff)
downloadbfs-43cd776d7dc8ac573262f8459edeb1c1f5f3cd09.tar.xz
xtime: Call tzset() from main() instead of lazily
POSIX specifies[1] that If a thread accesses tzname, daylight, or timezone directly while another thread is in a call to tzset(), or to any function that is required or allowed to set timezone information as if by calling tzset(), the behavior is undefined. So calling it lazily from arbitrary threads is risky. [1]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/tzset.html
Diffstat (limited to 'src/parse.c')
-rw-r--r--src/parse.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/parse.c b/src/parse.c
index 5d0f333..b26a50f 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -1086,8 +1086,8 @@ static struct bfs_expr *parse_const(struct bfs_parser *parser, int value, int ar
*/
static struct bfs_expr *parse_daystart(struct bfs_parser *parser, int arg1, int arg2) {
struct tm tm;
- if (xlocaltime(&parser->now.tv_sec, &tm) != 0) {
- parse_perror(parser, "xlocaltime()");
+ if (!localtime_r(&parser->now.tv_sec, &tm)) {
+ parse_perror(parser, "localtime_r()");
return NULL;
}
@@ -1708,8 +1708,8 @@ static int parse_reftime(const struct bfs_parser *parser, struct bfs_expr *expr)
fprintf(stderr, "Supported timestamp formats are ISO 8601-like, e.g.\n\n");
struct tm tm;
- if (xlocaltime(&parser->now.tv_sec, &tm) != 0) {
- parse_perror(parser, "xlocaltime()");
+ if (!localtime_r(&parser->now.tv_sec, &tm)) {
+ parse_perror(parser, "localtime_r()");
return -1;
}
@@ -1728,8 +1728,8 @@ static int parse_reftime(const struct bfs_parser *parser, struct bfs_expr *expr)
fprintf(stderr, " - %04d-%02d-%02dT%02d:%02d:%02d%+03d:%02d\n",
year, month, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, tz_hour, tz_min);
- if (xgmtime(&parser->now.tv_sec, &tm) != 0) {
- parse_perror(parser, "xgmtime()");
+ if (!gmtime_r(&parser->now.tv_sec, &tm)) {
+ parse_perror(parser, "gmtime_r()");
return -1;
}