Hi! ----
Attached is a small (unfinished) prototype toy patch ("ksh93_random_use_dev_urandom001.diff.txt") which switches the discipline functions of ${RANDOM} from |rand()| to /dev/urandom, resulting in a much better random number generation (/dev/random wasn't used because it may block when the system's entropy is used-up and wait until enougth entropy becomes available). Questions: - Can I register a C function which gets called at shell shutdown which can be used to close any file descriptors ? - Would it be usefull/Ok to add ${RANDOM.min} and ${RANDOM.max} to define the upper and lower bounds for a random value ? - How should I handle writing to ${RANDOM} (which normally defines the seed of |rand()|) when /dev/urandom is used ? The device is read-only on Solaris for normal users. Should a write failure (to /dev/urandom) be ignored or handled as error ? ---- Bye, Roland -- __ . . __ (o.\ \/ /.o) roland.mainz at nrubsig.org \__\/\/__/ MPEG specialist, C&&JAVA&&Sun&&Unix programmer /O /==\ O\ TEL +49 641 7950090 (;O/ \/ \O;) -------------- next part -------------- Index: src/lib/libshell/common/sh/init.c =================================================================== --- src/lib/libshell/common/sh/init.c (revision 534) +++ src/lib/libshell/common/sh/init.c (working copy) @@ -552,6 +552,27 @@ np->nvalue.lp = &rp->rand_last; } + +static +int fetch_dev_random(void) +{ + static int randdevfildes = -1; /* bug:we should close this file... */ + int randval = 0; + + if (randdevfildes == -1) + { + randdevfildes = open("/dev/urandom", O_RDONLY); + } + + if (randdevfildes != -1) + { + if (read(randdevfildes, &randval, sizeof(randval)) == sizeof(randval)) + return randval; + } + + return rand(); +} + /* * get random number in range of 0 - 2**15 * never pick same number twice in a row @@ -561,7 +582,7 @@ register long cur, last= *np->nvalue.lp; NOT_USED(fp); do - cur = (rand()>>rand_shift)&RANDMASK; + cur = (fetch_dev_random()>>rand_shift)&RANDMASK; while(cur==last); *np->nvalue.lp = cur; return((Sfdouble_t)cur);