diff options
author | Ron Yorston <rmy@pobox.com> | 2019-04-15 10:52:05 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2019-04-16 18:29:52 +0200 |
commit | 1d37186fe2361f80c821e334cc61f41e2f4eeb72 (patch) | |
tree | 2bc64cbfd1864b446ecd0e1bc2de35d8ef8ed7eb | |
parent | d96c69d87619e62a88cad1eeda795ac36b417c1c (diff) | |
download | busybox-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.c | 77 |
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 |
2054 | static void change_random(const char *) FAST_FUNC; | 2055 | static void change_random(const char *) FAST_FUNC; |
2055 | #endif | 2056 | #endif |
2057 | #if BASH_EPOCH_VARS | ||
2058 | static void change_seconds(const char *) FAST_FUNC; | ||
2059 | static void change_realtime(const char *) FAST_FUNC; | ||
2060 | #endif | ||
2056 | 2061 | ||
2057 | static const struct { | 2062 | static 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 | ||
11262 | static void FAST_FUNC | ||
11263 | change_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 | |||
11274 | static void FAST_FUNC | ||
11275 | change_seconds(const char *value UNUSED_PARAM) | ||
11276 | { | ||
11277 | change_epoch(&vepochs, "%lu"); | ||
11278 | } | ||
11279 | |||
11280 | static void FAST_FUNC | ||
11281 | change_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 |
11253 | static int | 11288 | static int |
11254 | getopts(char *optstr, char *optvar, char **optfirst) | 11289 | getopts(char *optstr, char *optvar, char **optfirst) |