70 lines
1.2 KiB
Diff
70 lines
1.2 KiB
Diff
|
--- variables.c
|
||
|
+++ variables.c Wed Aug 21 12:14:18 2002
|
||
|
@@ -1035,6 +1035,7 @@
|
||
|
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;
|
||
|
@@ -1060,6 +1061,21 @@
|
||
|
last_random_value = 0;
|
||
|
}
|
||
|
|
||
|
+#else
|
||
|
+
|
||
|
+static int last_sbrand_pid;
|
||
|
+
|
||
|
+static int brand ()
|
||
|
+{
|
||
|
+ return random() & 32767;
|
||
|
+}
|
||
|
+
|
||
|
+static void sbrand (unsigned long seed)
|
||
|
+{
|
||
|
+ srandom(seed);
|
||
|
+}
|
||
|
+#endif
|
||
|
+
|
||
|
static SHELL_VAR *
|
||
|
assign_random (self, value, unused)
|
||
|
SHELL_VAR *self;
|
||
|
@@ -1075,6 +1091,7 @@
|
||
|
{
|
||
|
int rv;
|
||
|
|
||
|
+#if !defined(linux)
|
||
|
/* Reset for command and process substitution. */
|
||
|
if (subshell_environment)
|
||
|
sbrand (rseed + getpid() + NOW);
|
||
|
@@ -1082,6 +1099,18 @@
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
@@ -1093,7 +1122,9 @@
|
||
|
char *p;
|
||
|
|
||
|
rv = get_random_number ();
|
||
|
+#if !defined(linux)
|
||
|
last_random_value = rv;
|
||
|
+#endif
|
||
|
p = itos (rv);
|
||
|
|
||
|
FREE (value_cell (var));
|