aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--shell/hush.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/shell/hush.c b/shell/hush.c
index fa9afa38e..d745148f4 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -379,6 +379,7 @@
#define BASH_SUBSTR ENABLE_HUSH_BASH_COMPAT
#define BASH_SOURCE ENABLE_HUSH_BASH_COMPAT
#define BASH_HOSTNAME_VAR ENABLE_HUSH_BASH_COMPAT
+#define BASH_EPOCH_VARS ENABLE_HUSH_BASH_COMPAT
#define BASH_TEST2 (ENABLE_HUSH_BASH_COMPAT && ENABLE_HUSH_TEST)
#define BASH_READ_D ENABLE_HUSH_BASH_COMPAT
@@ -1011,6 +1012,9 @@ struct globals {
int debug_indent;
#endif
struct sigaction sa;
+#if BASH_EPOCH_VARS
+ char epoch_buf[sizeof("%lu.nnnnnn") + sizeof(long)*3];
+#endif
#if ENABLE_FEATURE_EDITING
char user_input_buf[CONFIG_FEATURE_EDITING_MAX_LEN];
#endif
@@ -2228,6 +2232,22 @@ static const char* FAST_FUNC get_local_var_value(const char *name)
if (strcmp(name, "RANDOM") == 0)
return utoa(next_random(&G.random_gen));
#endif
+#if BASH_EPOCH_VARS
+ {
+ const char *fmt = NULL;
+ if (strcmp(name, "EPOCHSECONDS") == 0)
+ fmt = "%lu";
+ else if (strcmp(name, "EPOCHREALTIME") == 0)
+ fmt = "%lu.%06u";
+ if (fmt) {
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ sprintf(G.epoch_buf, fmt, (unsigned long)tv.tv_sec,
+ (unsigned)tv.tv_usec);
+ return G.epoch_buf;
+ }
+ }
+#endif
return NULL;
}