aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2019-04-15 10:52:05 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2019-04-16 18:29:52 +0200
commit1d37186fe2361f80c821e334cc61f41e2f4eeb72 (patch)
tree2bc64cbfd1864b446ecd0e1bc2de35d8ef8ed7eb
parentd96c69d87619e62a88cad1eeda795ac36b417c1c (diff)
downloadbusybox-w32-1d37186fe2361f80c821e334cc61f41e2f4eeb72.tar.gz
busybox-w32-1d37186fe2361f80c821e334cc61f41e2f4eeb72.tar.bz2
busybox-w32-1d37186fe2361f80c821e334cc61f41e2f4eeb72.zip
ash: add bash-compatible EPOCH variables
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 change_epoch - 78 +78 .rodata 175167 175235 +68 varinit_data 264 312 +48 change_seconds - 24 +24 change_realtime - 24 +24 ------------------------------------------------------------------------------ (add/remove: 3/0 grow/shrink: 2/0 up/down: 242/0) Total: 242 bytes text data bss dec hex filename 938508 4203 1888 944599 e69d7 busybox_old 938702 4203 1888 944793 e6a99 busybox_unstripped v2: Cast tv_sec and tv_usec to unsigned quantities. Add brackets to macros. Signed-off-by: Ron Yorston <rmy@pobox.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--shell/ash.c77
1 files changed, 56 insertions, 21 deletions
diff --git a/shell/ash.c b/shell/ash.c
index 255d57e62..b707d00d0 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -220,6 +220,7 @@
220#define BASH_SOURCE ENABLE_ASH_BASH_COMPAT 220#define BASH_SOURCE ENABLE_ASH_BASH_COMPAT
221#define BASH_PIPEFAIL ENABLE_ASH_BASH_COMPAT 221#define BASH_PIPEFAIL ENABLE_ASH_BASH_COMPAT
222#define BASH_HOSTNAME_VAR ENABLE_ASH_BASH_COMPAT 222#define BASH_HOSTNAME_VAR ENABLE_ASH_BASH_COMPAT
223#define BASH_EPOCH_VARS ENABLE_ASH_BASH_COMPAT
223#define BASH_SHLVL_VAR ENABLE_ASH_BASH_COMPAT 224#define BASH_SHLVL_VAR ENABLE_ASH_BASH_COMPAT
224#define BASH_XTRACEFD ENABLE_ASH_BASH_COMPAT 225#define BASH_XTRACEFD ENABLE_ASH_BASH_COMPAT
225#define BASH_READ_D ENABLE_ASH_BASH_COMPAT 226#define BASH_READ_D ENABLE_ASH_BASH_COMPAT
@@ -2053,6 +2054,10 @@ static void changepath(const char *) FAST_FUNC;
2053#if ENABLE_ASH_RANDOM_SUPPORT 2054#if ENABLE_ASH_RANDOM_SUPPORT
2054static void change_random(const char *) FAST_FUNC; 2055static void change_random(const char *) FAST_FUNC;
2055#endif 2056#endif
2057#if BASH_EPOCH_VARS
2058static void change_seconds(const char *) FAST_FUNC;
2059static void change_realtime(const char *) FAST_FUNC;
2060#endif
2056 2061
2057static const struct { 2062static const struct {
2058 int flags; 2063 int flags;
@@ -2079,6 +2084,10 @@ static const struct {
2079#if ENABLE_ASH_RANDOM_SUPPORT 2084#if ENABLE_ASH_RANDOM_SUPPORT
2080 { VSTRFIXED|VTEXTFIXED|VUNSET|VDYNAMIC, "RANDOM", change_random }, 2085 { VSTRFIXED|VTEXTFIXED|VUNSET|VDYNAMIC, "RANDOM", change_random },
2081#endif 2086#endif
2087#if BASH_EPOCH_VARS
2088 { VSTRFIXED|VTEXTFIXED|VUNSET|VDYNAMIC, "EPOCHSECONDS", change_seconds },
2089 { VSTRFIXED|VTEXTFIXED|VUNSET|VDYNAMIC, "EPOCHREALTIME", change_realtime },
2090#endif
2082#if ENABLE_LOCALE_SUPPORT 2091#if ENABLE_LOCALE_SUPPORT
2083 { VSTRFIXED|VTEXTFIXED|VUNSET, "LC_ALL" , change_lc_all }, 2092 { VSTRFIXED|VTEXTFIXED|VUNSET, "LC_ALL" , change_lc_all },
2084 { VSTRFIXED|VTEXTFIXED|VUNSET, "LC_CTYPE" , change_lc_ctype }, 2093 { VSTRFIXED|VTEXTFIXED|VUNSET, "LC_CTYPE" , change_lc_ctype },
@@ -2110,26 +2119,26 @@ extern struct globals_var *BB_GLOBAL_CONST ash_ptr_to_globals_var;
2110#define linenovar (G_var.linenovar ) 2119#define linenovar (G_var.linenovar )
2111#define vifs varinit[0] 2120#define vifs varinit[0]
2112#if ENABLE_ASH_MAIL 2121#if ENABLE_ASH_MAIL
2113# define vmail (&vifs)[1] 2122# define vmail varinit[1]
2114# define vmpath (&vmail)[1] 2123# define vmpath varinit[2]
2115# define vpath (&vmpath)[1] 2124#endif
2116#else 2125#define VAR_OFFSET1 (ENABLE_ASH_MAIL*2)
2117# define vpath (&vifs)[1] 2126#define vpath varinit[VAR_OFFSET1 + 1]
2118#endif 2127#define vps1 varinit[VAR_OFFSET1 + 2]
2119#define vps1 (&vpath)[1] 2128#define vps2 varinit[VAR_OFFSET1 + 3]
2120#define vps2 (&vps1)[1] 2129#define vps4 varinit[VAR_OFFSET1 + 4]
2121#define vps4 (&vps2)[1]
2122#if ENABLE_ASH_GETOPTS 2130#if ENABLE_ASH_GETOPTS
2123# define voptind (&vps4)[1] 2131# define voptind varinit[VAR_OFFSET1 + 5]
2124# define vlineno (&voptind)[1] 2132#endif
2125# if ENABLE_ASH_RANDOM_SUPPORT 2133#define VAR_OFFSET2 (VAR_OFFSET1 + ENABLE_ASH_GETOPTS)
2126# define vrandom (&vlineno)[1] 2134#define vlineno varinit[VAR_OFFSET2 + 5]
2127# endif 2135#if ENABLE_ASH_RANDOM_SUPPORT
2128#else 2136# define vrandom varinit[VAR_OFFSET2 + 6]
2129# define vlineno (&vps4)[1] 2137#endif
2130# if ENABLE_ASH_RANDOM_SUPPORT 2138#define VAR_OFFSET3 (VAR_OFFSET2 + ENABLE_ASH_RANDOM_SUPPORT)
2131# define vrandom (&vlineno)[1] 2139#if BASH_EPOCH_VARS
2132# endif 2140# define vepochs varinit[VAR_OFFSET3 + 6]
2141# define vepochr varinit[VAR_OFFSET3 + 7]
2133#endif 2142#endif
2134#define INIT_G_var() do { \ 2143#define INIT_G_var() do { \
2135 unsigned i; \ 2144 unsigned i; \
@@ -2268,7 +2277,7 @@ lookupvar(const char *name)
2268 2277
2269 v = *findvar(hashvar(name), name); 2278 v = *findvar(hashvar(name), name);
2270 if (v) { 2279 if (v) {
2271#if ENABLE_ASH_RANDOM_SUPPORT 2280#if ENABLE_ASH_RANDOM_SUPPORT || BASH_EPOCH_VARS
2272 /* 2281 /*
2273 * Dynamic variables are implemented roughly the same way they are 2282 * Dynamic variables are implemented roughly the same way they are
2274 * in bash. Namely, they're "special" so long as they aren't unset. 2283 * in bash. Namely, they're "special" so long as they aren't unset.
@@ -2364,7 +2373,7 @@ setvareq(char *s, int flags)
2364 } 2373 }
2365 2374
2366 flags |= vp->flags & ~(VTEXTFIXED|VSTACK|VNOSAVE|VUNSET); 2375 flags |= vp->flags & ~(VTEXTFIXED|VSTACK|VNOSAVE|VUNSET);
2367#if ENABLE_ASH_RANDOM_SUPPORT 2376#if ENABLE_ASH_RANDOM_SUPPORT || BASH_EPOCH_VARS
2368 if (flags & VUNSET) 2377 if (flags & VUNSET)
2369 flags &= ~VDYNAMIC; 2378 flags &= ~VDYNAMIC;
2370#endif 2379#endif
@@ -11249,6 +11258,32 @@ change_random(const char *value)
11249} 11258}
11250#endif 11259#endif
11251 11260
11261#if BASH_EPOCH_VARS
11262static void FAST_FUNC
11263change_epoch(struct var *vepoch, const char *fmt)
11264{
11265 struct timeval tv;
11266 char buffer[sizeof("%lu.nnnnnn") + sizeof(long)*3];
11267
11268 gettimeofday(&tv, NULL);
11269 sprintf(buffer, fmt, (unsigned long)tv.tv_sec, (unsigned)tv.tv_usec);
11270 setvar(vepoch->var_text, buffer, VNOFUNC);
11271 vepoch->flags &= ~VNOFUNC;
11272}
11273
11274static void FAST_FUNC
11275change_seconds(const char *value UNUSED_PARAM)
11276{
11277 change_epoch(&vepochs, "%lu");
11278}
11279
11280static void FAST_FUNC
11281change_realtime(const char *value UNUSED_PARAM)
11282{
11283 change_epoch(&vepochr, "%lu.%06u");
11284}
11285#endif
11286
11252#if ENABLE_ASH_GETOPTS 11287#if ENABLE_ASH_GETOPTS
11253static int 11288static int
11254getopts(char *optstr, char *optvar, char **optfirst) 11289getopts(char *optstr, char *optvar, char **optfirst)