diff options
Diffstat (limited to 'contrib/bmake/var.c')
-rw-r--r-- | contrib/bmake/var.c | 53 |
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; } |