aboutsummaryrefslogtreecommitdiff
path: root/contrib/bmake/var.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bmake/var.c')
-rw-r--r--contrib/bmake/var.c53
1 files changed, 35 insertions, 18 deletions
diff --git a/contrib/bmake/var.c b/contrib/bmake/var.c
index 43eaf75fb842..54bea0179b72 100644
--- a/contrib/bmake/var.c
+++ b/contrib/bmake/var.c
@@ -1,4 +1,4 @@
-/* $NetBSD: var.c,v 1.1059 2023/06/23 05:21:10 rillig Exp $ */
+/* $NetBSD: var.c,v 1.1064 2023/08/19 19:59:17 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -147,7 +147,7 @@
#include "metachar.h"
/* "@(#)var.c 8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.1059 2023/06/23 05:21:10 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.1064 2023/08/19 19:59:17 rillig Exp $");
/*
* Variables are defined using one of the VAR=value assignments. Their
@@ -1894,7 +1894,20 @@ FormatTime(const char *fmt, time_t t, bool gmt)
time(&t);
if (*fmt == '\0')
fmt = "%c";
- strftime(buf, sizeof buf, fmt, gmt ? gmtime(&t) : localtime(&t));
+ if (gmt && strchr(fmt, 's') != NULL) {
+ /* strftime "%s" only works with localtime, not with gmtime. */
+ const char *prev_tz_env = getenv("TZ");
+ char *prev_tz = prev_tz_env != NULL
+ ? bmake_strdup(prev_tz_env) : NULL;
+ setenv("TZ", "UTC", 1);
+ strftime(buf, sizeof buf, fmt, localtime(&t));
+ if (prev_tz != NULL) {
+ setenv("TZ", prev_tz, 1);
+ free(prev_tz);
+ } else
+ unsetenv("TZ");
+ } else
+ strftime(buf, sizeof buf, fmt, (gmt ? gmtime : localtime)(&t));
buf[sizeof buf - 1] = '\0';
return bmake_strdup(buf);
@@ -2844,17 +2857,17 @@ ApplyModifier_Match(const char **pp, ModChain *ch)
struct ModifyWord_MtimeArgs {
bool error;
- bool fallback;
+ bool use_fallback;
ApplyModifierResult rc;
- time_t t;
+ time_t fallback;
};
static void
ModifyWord_Mtime(Substring word, SepBuf *buf, void *data)
{
- char tbuf[BUFSIZ];
- struct stat st;
struct ModifyWord_MtimeArgs *args = data;
+ struct stat st;
+ char tbuf[21];
if (Substring_IsEmpty(word))
return;
@@ -2867,8 +2880,8 @@ ModifyWord_Mtime(Substring word, SepBuf *buf, void *data)
args->rc = AMR_CLEANUP;
return;
}
- if (args->fallback)
- st.st_mtime = args->t;
+ if (args->use_fallback)
+ st.st_mtime = args->fallback;
else
time(&st.st_mtime);
}
@@ -2887,17 +2900,21 @@ ApplyModifier_Mtime(const char **pp, ModChain *ch)
return AMR_UNKNOWN;
*pp += 5;
p = *pp;
- args.error = args.fallback = false;
+ args.error = false;
+ args.use_fallback = p[0] == '=';
args.rc = AMR_OK;
- if (p[0] == '=') {
+ if (args.use_fallback) {
p++;
- args.fallback = true;
- if (!TryParseTime(&p, &args.t)) {
- if (strncmp(p, "error", 5) == 0) {
- args.error = true;
- p += 5;
- } else
- return AMR_BAD;
+ if (TryParseTime(&p, &args.fallback)) {
+ } else if (strncmp(p, "error", 5) == 0
+ && IsDelimiter(p[5], ch)) {
+ p += 5;
+ args.error = true;
+ } else {
+ Parse_Error(PARSE_FATAL,
+ "Invalid argument '%.*s' for modifier ':mtime'",
+ (int)strcspn(p, ":{}()"), p);
+ return AMR_CLEANUP;
}
*pp = p;
}