hush: add support for $RANDOM. If on:
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 9 Oct 2009 18:59:39 +0000 (20:59 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 9 Oct 2009 18:59:39 +0000 (20:59 +0200)
function                                             old     new   delta
hush_main                                            983    1024     +41
get_local_var_value                                   72     104     +32
block_signals                                        155     161      +6
reset_traps_to_defaults                              211     214      +3
builtin_wait                                         268     271      +3
pseudo_exec_argv                                     198     200      +2
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 6/0 up/down: 87/0)               Total: 87 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/hush.c

index 3028d795ce840a6e6697728b74cb9d92b891098f..b80b6c742b1e24051c0e14562d2883023685090a 100644 (file)
@@ -86,6 +86,9 @@
 #endif
 #include "math.h"
 #include "match.h"
+#if ENABLE_ASH_RANDOM_SUPPORT
+# include "random.h"
+#endif
 #ifndef PIPE_BUF
 # define PIPE_BUF 4096  /* amount of buffering in a pipe */
 #endif
@@ -486,6 +489,9 @@ struct globals {
        pid_t root_pid;
        pid_t root_ppid;
        pid_t last_bg_pid;
+#if ENABLE_HUSH_RANDOM_SUPPORT
+       random_t random_gen;
+#endif
 #if ENABLE_HUSH_JOB
        int run_list_level;
        int last_jobid;
@@ -1311,6 +1317,10 @@ static const char *get_local_var_value(const char *name)
        if (strcmp(name, "PPID") == 0)
                return utoa(G.root_ppid);
        // bash compat: UID? EUID?
+#if ENABLE_HUSH_RANDOM_SUPPORT
+       if (strcmp(name, "RANDOM") == 0)
+               return utoa(next_random(&G.random_gen));
+#endif
        return NULL;
 }
 
@@ -6595,6 +6605,9 @@ int hush_main(int argc, char **argv)
                        if (!G.root_pid) {
                                G.root_pid = getpid();
                                G.root_ppid = getppid();
+#if ENABLE_HUSH_RANDOM_SUPPORT
+                               INIT_RANDOM_T(&G.random_gen, G.root_pid, monotonic_us());
+#endif
                        }
                        G.global_argv = argv + optind;
                        G.global_argc = argc - optind;
@@ -6683,6 +6696,9 @@ int hush_main(int argc, char **argv)
                G.root_pid = getpid();
                G.root_ppid = getppid();
        }
+#if ENABLE_HUSH_RANDOM_SUPPORT
+       INIT_RANDOM_T(&G.random_gen, G.root_pid, monotonic_us());
+#endif
 
        /* If we are login shell... */
        if (argv[0] && argv[0][0] == '-') {