aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
Diffstat (limited to 'shell')
-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)