diff options
Diffstat (limited to 'shell')
-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) |