]> sjero.net Git - wget/blobdiff - src/cmpt.c
[svn] Check for random.
[wget] / src / cmpt.c
index bfc7b2c9ab06275ab043062187f5becd594fba43..542151315174cd1d5b8c036e6840fc8532457116 100644 (file)
@@ -1206,3 +1206,54 @@ strptime (buf, format, tm)
   return strptime_internal (buf, format, tm, &decided);
 }
 #endif /* not HAVE_STRPTIME */
+
+
+#ifndef HAVE_USLEEP
+/* A simple usleep implementation based on select().  This will
+   probably not work on Windows.  */
+
+int
+usleep (unsigned long usec)
+{
+  struct timeval tm;
+  tm.tv_sec = 0;
+  tm.tv_usec = usec;
+  select (0, NULL, NULL, NULL, &tm);
+  return 0;
+}
+#endif /* not HAVE_USLEEP */
+
+
+#ifndef HAVE_RANDOM
+/* For the systems without random: a really simple congruential RNG,
+   only good enough for what Wget uses it for.  Before you panic: this
+   is not used for any kind of cryptography.  */
+
+static long random_seed;
+
+#define RANDOM_A 9301
+#define RANDOM_C 49297
+#define RANDOM_M 233280
+
+static int
+random_1 (void)
+{
+  if (!random_seed)
+    random_seed = time (NULL);
+  random_seed = (random_seed * RANDOM_A + RANDOM_C) % RANDOM_M;
+  return random_seed;
+}
+
+long
+random (void)
+{
+  /* Upper bits of random() are a bit more random.  Compose random()
+     from higher bits of three call to random().  */
+  unsigned r1 = random_1 () >> 8;
+  unsigned r2 = random_1 () >> 4;
+  unsigned r3 = random_1 ();
+  long result = r1 ^ r2 ^ r3;
+
+  return result;
+}
+#endif /* not HAVE_RANDOM */