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));