[git commit] hush: add bash-compatible EPOCH variables

Denys Vlasenko vda.linux at googlemail.com
Tue Apr 16 16:29:52 UTC 2019


commit: https://git.busybox.net/busybox/commit/?id=a81700bc0810b2cad59d450a380ece20a8eb96a4
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

Bash 5.0 added the dynamic variable EPOCHSECONDS and EPOCHREALTIME
which return the number of seconds since the Unix Epoch as an
integer or float.  These are useful for logging or tracing.

function                                             old     new   delta
get_local_var_value                                  207     302     +95
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 95/0)               Total: 95 bytes
   text	   data	    bss	    dec	    hex	filename
 938702	   4203	   1888	 944793	  e6a99	busybox_old
 938797	   4203	   1888	 944888	  e6af8	busybox_unstripped

Signed-off-by: Ron Yorston <rmy at pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 shell/hush.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

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
@@ -2227,6 +2231,22 @@ static const char* FAST_FUNC get_local_var_value(const char *name)
 #if ENABLE_HUSH_RANDOM_SUPPORT
 	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;
 }


More information about the busybox-cvs mailing list