@@ -0,0 +1,85 @@
+Index: variables.c
+===================================================================
+--- variables.c.orig
++++ variables.c
+@@ -1203,6 +1203,7 @@ init_seconds_var ()
+ return v;
+ }
+
++#if !defined(linux)
+ /* The random number seed. You can change this by setting RANDOM. */
+ static unsigned long rseed = 1;
+ static int last_random_value;
+@@ -1256,6 +1257,24 @@ seedrand ()
+ sbrand (tv.tv_sec ^ tv.tv_usec ^ getpid ());
+ }
+
++#else
++
++static int last_sbrand_pid;
++
++static int brand ()
++{
++ return random() & 32767;
++}
++
++static void sbrand (unsigned long seed)
++{
++ srandom(seed);
++}
++
++static void
++seedrand () {}
++#endif
++
+ static SHELL_VAR *
+ assign_random (self, value, unused, key)
+ SHELL_VAR *self;
+@@ -1264,8 +1283,10 @@ assign_random (self, value, unused, key)
+ char *key;
+ {
+ sbrand (strtoul (value, (char **)NULL, 10));
++#if !defined(linux)
+ if (subshell_environment)
+ seeded_subshell = getpid ();
++#endif
+ return (self);
+ }
+
+@@ -1274,6 +1295,7 @@ get_random_number ()
+ {
+ int rv, pid;
+
++#if !defined(linux)
+ /* Reset for command and process substitution. */
+ pid = getpid ();
+ if (subshell_environment && seeded_subshell != pid)
+@@ -1285,6 +1307,18 @@ get_random_number ()
+ do
+ rv = brand ();
+ while (rv == last_random_value);
++#else
++ if (subshell_environment)
++ {
++ int mypid = getpid();
++ if (mypid != last_sbrand_pid)
++ {
++ last_sbrand_pid = mypid;
++ sbrand (mypid + NOW);
++ }
++ }
++ rv = brand();
++#endif
+ return rv;
+ }
+
+@@ -1296,7 +1330,9 @@ get_random (var)
+ char *p;
+
+ rv = get_random_number ();
++#if !defined(linux)
+ last_random_value = rv;
++#endif
+ p = itos (rv);
+
+ FREE (value_cell (var));
|