Add the rand48() functions -- needed by zcip

diff --git a/include/stdlib.h b/include/stdlib.h
index 24e7029..7acfa03 100644
--- a/include/stdlib.h
+++ b/include/stdlib.h
@@ -54,4 +54,28 @@
 
 __extern void qsort(void *, size_t, size_t, int (*)(const void *, const void *));
 
+
+__extern long mrand48(unsigned short *);
+__extern long jrand48(void);
+__extern long nrand48(unsigned short *);
+__extern long lrand48(void);
+__extern unsigned short *seed48(const unsigned short *);
+__extern void srand48(long);
+
+#define RAND_MAX 0x7fffffff
+static __inline__ int rand(void) {
+  return (int)lrand48();
+}
+static __inline__ void srand(unsigned int __s) {
+  srand48(__s);
+}
+static __inline__ long random(void)
+{
+  return lrand48();
+}
+static __inline__ void srandom(unsigned int __s)
+{
+  srand48(__s);
+}
+
 #endif /* _STDLIB_H */
diff --git a/klibc/Makefile b/klibc/Makefile
index 730dd49..985b80f 100644
--- a/klibc/Makefile
+++ b/klibc/Makefile
@@ -35,7 +35,7 @@
 	  gethostname.o getdomainname.o getcwd.o seteuid.o setegid.o \
 	  getenv.o setenv.o unsetenv.o getopt.o readdir.o \
 	  time.o fdatasync.o llseek.o select.o nice.o getpriority.o \
-	  qsort.o \
+	  qsort.o lrand48.o srand48.o seed48.o \
 	  inet/inet_ntoa.o inet/inet_aton.o inet/inet_addr.o
 LIB     = libc.a
 
diff --git a/klibc/include/stdlib.h b/klibc/include/stdlib.h
index 24e7029..7acfa03 100644
--- a/klibc/include/stdlib.h
+++ b/klibc/include/stdlib.h
@@ -54,4 +54,28 @@
 
 __extern void qsort(void *, size_t, size_t, int (*)(const void *, const void *));
 
+
+__extern long mrand48(unsigned short *);
+__extern long jrand48(void);
+__extern long nrand48(unsigned short *);
+__extern long lrand48(void);
+__extern unsigned short *seed48(const unsigned short *);
+__extern void srand48(long);
+
+#define RAND_MAX 0x7fffffff
+static __inline__ int rand(void) {
+  return (int)lrand48();
+}
+static __inline__ void srand(unsigned int __s) {
+  srand48(__s);
+}
+static __inline__ long random(void)
+{
+  return lrand48();
+}
+static __inline__ void srandom(unsigned int __s)
+{
+  srand48(__s);
+}
+
 #endif /* _STDLIB_H */
diff --git a/klibc/lrand48.c b/klibc/lrand48.c
new file mode 100644
index 0000000..5405cd5
--- /dev/null
+++ b/klibc/lrand48.c
@@ -0,0 +1,42 @@
+/*
+ * lrand48.c
+ */
+
+#include <stdlib.h>
+#include <stdint.h>
+
+unsigned short __rand48_seed[3];
+
+long mrand48(unsigned short xsubi[3])
+{
+  uint64_t x;
+
+  /* The xsubi[] array is littleendian by spec */
+  x = (uint64_t)xsubi[0] +
+    ((uint64_t)xsubi[1] << 16) +
+    ((uint64_t)xsubi[2] << 32);
+
+  x = (0x5deece66dULL * x) + 0xb;
+  
+  xsubi[0] = (unsigned short)x;
+  xsubi[1] = (unsigned short)(x >> 16);
+  xsubi[2] = (unsigned short)(x >> 32);
+
+  return (long)(uint32_t)(x >> 16);
+}
+
+long jrand48(void)
+{
+  return mrand48(__rand48_seed);
+}
+
+long nrand48(unsigned short xsubi[3])
+{
+  return mrand48(xsubi) & 0x7fffffff;
+}
+
+long lrand48(void)
+{
+  return nrand48(__rand48_seed);
+}
+
diff --git a/klibc/seed48.c b/klibc/seed48.c
new file mode 100644
index 0000000..ba36932
--- /dev/null
+++ b/klibc/seed48.c
@@ -0,0 +1,18 @@
+/*
+ * seed48.c
+ */
+
+#include <stdlib.h>
+#include <stdint.h>
+
+extern unsigned short __rand48_seed[3];
+
+unsigned short *seed48(const unsigned short xsubi[3])
+{
+  static unsigned short oldseed[3];
+  memcpy(oldseed, __rand48_seed, sizeof __rand48_seed);
+  memcpy(__rand48_seed, xsubi, sizeof __rand48_seed);
+  
+  return oldseed;
+}
+
diff --git a/klibc/srand48.c b/klibc/srand48.c
new file mode 100644
index 0000000..a3df16d
--- /dev/null
+++ b/klibc/srand48.c
@@ -0,0 +1,16 @@
+/*
+ * srand48.c
+ */
+
+#include <stdlib.h>
+#include <stdint.h>
+
+extern unsigned short __rand48_seed[3];
+
+
+void srand48(long seedval)
+{
+  __rand48_seed[0] = 0x330e;
+  __rand48_seed[1] = (unsigned short)seedval;
+  __rand48_seed[2] = (unsigned short)((uint32_t)seedval >> 16);
+}
diff --git a/lrand48.c b/lrand48.c
new file mode 100644
index 0000000..5405cd5
--- /dev/null
+++ b/lrand48.c
@@ -0,0 +1,42 @@
+/*
+ * lrand48.c
+ */
+
+#include <stdlib.h>
+#include <stdint.h>
+
+unsigned short __rand48_seed[3];
+
+long mrand48(unsigned short xsubi[3])
+{
+  uint64_t x;
+
+  /* The xsubi[] array is littleendian by spec */
+  x = (uint64_t)xsubi[0] +
+    ((uint64_t)xsubi[1] << 16) +
+    ((uint64_t)xsubi[2] << 32);
+
+  x = (0x5deece66dULL * x) + 0xb;
+  
+  xsubi[0] = (unsigned short)x;
+  xsubi[1] = (unsigned short)(x >> 16);
+  xsubi[2] = (unsigned short)(x >> 32);
+
+  return (long)(uint32_t)(x >> 16);
+}
+
+long jrand48(void)
+{
+  return mrand48(__rand48_seed);
+}
+
+long nrand48(unsigned short xsubi[3])
+{
+  return mrand48(xsubi) & 0x7fffffff;
+}
+
+long lrand48(void)
+{
+  return nrand48(__rand48_seed);
+}
+
diff --git a/seed48.c b/seed48.c
new file mode 100644
index 0000000..ba36932
--- /dev/null
+++ b/seed48.c
@@ -0,0 +1,18 @@
+/*
+ * seed48.c
+ */
+
+#include <stdlib.h>
+#include <stdint.h>
+
+extern unsigned short __rand48_seed[3];
+
+unsigned short *seed48(const unsigned short xsubi[3])
+{
+  static unsigned short oldseed[3];
+  memcpy(oldseed, __rand48_seed, sizeof __rand48_seed);
+  memcpy(__rand48_seed, xsubi, sizeof __rand48_seed);
+  
+  return oldseed;
+}
+
diff --git a/srand48.c b/srand48.c
new file mode 100644
index 0000000..a3df16d
--- /dev/null
+++ b/srand48.c
@@ -0,0 +1,16 @@
+/*
+ * srand48.c
+ */
+
+#include <stdlib.h>
+#include <stdint.h>
+
+extern unsigned short __rand48_seed[3];
+
+
+void srand48(long seedval)
+{
+  __rand48_seed[0] = 0x330e;
+  __rand48_seed[1] = (unsigned short)seedval;
+  __rand48_seed[2] = (unsigned short)((uint32_t)seedval >> 16);
+}