diff --git a/src/system/kernel/lib/Jamfile b/src/system/kernel/lib/Jamfile index 6a19e1be30..772216c56e 100644 --- a/src/system/kernel/lib/Jamfile +++ b/src/system/kernel/lib/Jamfile @@ -49,6 +49,8 @@ SEARCH_SOURCE += [ FDirName $(gnuSources) ] ; local muslSources = ffs.c + rand.c + rand_r.c ; SourceHdrs $(muslSources) : @@ -77,7 +79,6 @@ KernelMergeObject kernel_lib_posix.o : bsearch.c merge.c qsort.c - rand.c random.c strtod.c strtol.c @@ -144,6 +145,7 @@ KernelMergeObject kernel_lib_posix.o : ; SEARCH on [ FGristFiles $(muslSources) ] += [ FDirName $(posixSources) musl misc ] ; +SEARCH on [ FGristFiles $(muslSources) ] += [ FDirName $(posixSources) musl prng ] ; # misc diff --git a/src/system/libroot/posix/musl/Jamfile b/src/system/libroot/posix/musl/Jamfile index e244fd8d91..d3d410df59 100644 --- a/src/system/libroot/posix/musl/Jamfile +++ b/src/system/libroot/posix/musl/Jamfile @@ -11,6 +11,7 @@ for architectureObject in [ MultiArchSubDirSetup ] { <$(architecture)>posix_musl_dirent.o <$(architecture)>posix_musl_math.o <$(architecture)>posix_musl_misc.o + <$(architecture)>posix_musl_prng.o <$(architecture)>posix_musl_regex.o <$(architecture)>posix_musl_search.o <$(architecture)>posix_musl_string.o @@ -27,6 +28,7 @@ for arch in $(TARGET_ARCHS) { HaikuSubInclude crypt ; HaikuSubInclude dirent ; HaikuSubInclude misc ; +HaikuSubInclude prng ; HaikuSubInclude regex ; HaikuSubInclude search ; HaikuSubInclude string ; diff --git a/src/system/libroot/posix/musl/prng/Jamfile b/src/system/libroot/posix/musl/prng/Jamfile new file mode 100644 index 0000000000..f12139558a --- /dev/null +++ b/src/system/libroot/posix/musl/prng/Jamfile @@ -0,0 +1,15 @@ +SubDir HAIKU_TOP src system libroot posix musl prng ; + +SubDirSysHdrs [ FDirName $(SUBDIR) .. include ] ; + +local architectureObject ; +for architectureObject in [ MultiArchSubDirSetup ] { + on $(architectureObject) { + local architecture = $(TARGET_PACKAGING_ARCH) ; + + MergeObject <$(architecture)>posix_musl_prng.o : + rand.c + rand_r.c + ; + } +} diff --git a/src/system/libroot/posix/musl/prng/rand.c b/src/system/libroot/posix/musl/prng/rand.c new file mode 100644 index 0000000000..c000cd248c --- /dev/null +++ b/src/system/libroot/posix/musl/prng/rand.c @@ -0,0 +1,15 @@ +#include +#include + +static uint64_t seed; + +void srand(unsigned s) +{ + seed = s-1; +} + +int rand(void) +{ + seed = 6364136223846793005ULL*seed + 1; + return seed>>33; +} diff --git a/src/system/libroot/posix/musl/prng/rand_r.c b/src/system/libroot/posix/musl/prng/rand_r.c new file mode 100644 index 0000000000..638614c867 --- /dev/null +++ b/src/system/libroot/posix/musl/prng/rand_r.c @@ -0,0 +1,15 @@ +#include + +static unsigned temper(unsigned x) +{ + x ^= x>>11; + x ^= x<<7 & 0x9D2C5680; + x ^= x<<15 & 0xEFC60000; + x ^= x>>18; + return x; +} + +int rand_r(unsigned *seed) +{ + return temper(*seed = *seed * 1103515245 + 12345)/2; +} diff --git a/src/system/libroot/posix/stdlib/Jamfile b/src/system/libroot/posix/stdlib/Jamfile index 2beea8ef8c..6ba1421e7f 100644 --- a/src/system/libroot/posix/stdlib/Jamfile +++ b/src/system/libroot/posix/stdlib/Jamfile @@ -27,7 +27,6 @@ for architectureObject in [ MultiArchSubDirSetup ] { pty.cpp qsort.c radixsort.c - rand.c random.c realpath.cpp strfmon.c diff --git a/src/system/libroot/posix/stdlib/rand.c b/src/system/libroot/posix/stdlib/rand.c deleted file mode 100644 index d85fda5733..0000000000 --- a/src/system/libroot/posix/stdlib/rand.c +++ /dev/null @@ -1,165 +0,0 @@ -/*- - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * Posix rand_r function added May 1999 by Wes Peters . - */ - - -//#include "namespace.h" -//#include /* for sranddev() */ -#include -//#include /* for sranddev() */ -#include -//#include /* for sranddev() */ -//#include "un-namespace.h" - -#ifdef TEST -#include -#endif /* TEST */ - -static int -do_rand(unsigned long *ctx) -{ -#ifdef USE_WEAK_SEEDING -/* - * Historic implementation compatibility. - * The random sequences do not vary much with the seed, - * even with overflowing. - */ - return ((*ctx = *ctx * 1103515245 + 12345) % ((u_long)RAND_MAX + 1)); -#else /* !USE_WEAK_SEEDING */ -/* - * Compute x = (7^5 * x) mod (2^31 - 1) - * without overflowing 31 bits: - * (2^31 - 1) = 127773 * (7^5) + 2836 - * From "Random number generators: good ones are hard to find", - * Park and Miller, Communications of the ACM, vol. 31, no. 10, - * October 1988, p. 1195. - */ - long hi, lo, x; - - /* Can't be initialized with 0, so use another value. */ - if (*ctx == 0) - *ctx = 123459876; - hi = *ctx / 127773; - lo = *ctx % 127773; - x = 16807 * lo - 2836 * hi; - if (x < 0) - x += 0x7fffffff; - return ((*ctx = x) % ((u_long)RAND_MAX + 1)); -#endif /* !USE_WEAK_SEEDING */ -} - - -int -rand_r(unsigned int *ctx) -{ - u_long val = (u_long) *ctx; - int r = do_rand(&val); - - *ctx = (unsigned int) val; - return (r); -} - - -static u_long next = 1; - -int -rand() -{ - return (do_rand(&next)); -} - -void -srand(seed) -u_int seed; -{ - next = seed; -} - - -#if 0 -/* - * sranddev: - * - * Many programs choose the seed value in a totally predictable manner. - * This often causes problems. We seed the generator using the much more - * secure random(4) interface. - */ -void -sranddev() -{ - int fd, done; - - done = 0; - fd = _open("/dev/random", O_RDONLY, 0); - if (fd >= 0) { - if (_read(fd, (void *) &next, sizeof(next)) == sizeof(next)) - done = 1; - _close(fd); - } - - if (!done) { - struct timeval tv; - unsigned long junk; - - gettimeofday(&tv, NULL); - srand((getpid() << 16) ^ tv.tv_sec ^ tv.tv_usec ^ junk); - } -} -#endif // 0 - - -#ifdef TEST - -main() -{ - int i; - unsigned myseed; - - printf("seeding rand with 0x19610910: \n"); - srand(0x19610910); - - printf("generating three pseudo-random numbers:\n"); - for (i = 0; i < 3; i++) - { - printf("next random number = %d\n", rand()); - } - - printf("generating the same sequence with rand_r:\n"); - myseed = 0x19610910; - for (i = 0; i < 3; i++) - { - printf("next random number = %d\n", rand_r(&myseed)); - } - - return 0; -} - -#endif /* TEST */ -