From ce13b7600277478055de0b7c38b483a76145efd2 Mon Sep 17 00:00:00 2001
From: Denis Vlasenko <vda.linux@googlemail.com>
Date: Sun, 29 Jun 2008 02:25:53 +0000
Subject: libbb: shrink monotonic_XXX functions, introduce monotonic_ns (unused
 for now)

function                                             old     new   delta
get_mono                                               -      31     +31
sv_main                                             1228    1234      +6
expand                                              1693    1697      +4
get_address                                          178     181      +3
utoa_to_buf                                          108     110      +2
builtin_exit                                          46      48      +2
qrealloc                                              36      33      -3
qgravechar                                           109     106      -3
ash_main                                            1383    1380      -3
grep_file                                            850     846      -4
popstring                                            140     134      -6
monotonic_us                                          85      60     -25
monotonic_sec                                         41      16     -25
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 5/7 up/down: 48/-69)            Total: -21 bytes
---
 shell/ash.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

(limited to 'shell')

diff --git a/shell/ash.c b/shell/ash.c
index 9c3216243..85064d5af 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -9615,7 +9615,6 @@ setcmd(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
 }
 
 #if ENABLE_ASH_RANDOM_SUPPORT
-/* Roughly copied from bash.. */
 static void
 change_random(const char *value)
 {
@@ -9636,10 +9635,11 @@ change_random(const char *value)
 		if (random_galois_LFSR < 0) /* if we just shifted 1 out of msb... */
 			t ^= MASK;
 		random_galois_LFSR = t;
-		/* Both are weak, xoring them gives better randomness
+		/* Both are weak, combining them gives better randomness
 		 * and ~2^64 period. & 0x7fff is probably bash compat
-		 * for $RANDOM range. */
-		t = (t ^ random_LCG) & 0x7fff;
+		 * for $RANDOM range. Combining with subtraction is
+		 * just for fun. + and ^ would work equally well. */
+		t = (t - random_LCG) & 0x7fff;
 		/* set without recursion */
 		setvar(vrandom.text, utoa(t), VNOFUNC);
 		vrandom.flags &= ~VNOFUNC;
@@ -13432,7 +13432,9 @@ int ash_main(int argc ATTRIBUTE_UNUSED, char **argv)
 	rootpid = getpid();
 
 #if ENABLE_ASH_RANDOM_SUPPORT
-	random_galois_LFSR = random_LCG = rootpid + time(NULL);
+	/* Can use monotonic_ns() for better randomness but for now it is
+	 * not used anywhere else in busybox... so avoid bloat */
+	random_galois_LFSR = random_LCG = rootpid + monotonic_us();
 #endif
 	init();
 	setstackmark(&smark);
-- 
cgit v1.2.3-55-g6feb