shithub: trueawk

Download patch

ref: c70b9fe8823e8f21628725e634d5db1a6e3948d0
parent: 650d868ec4bbb566255702fef37480438163d3ae
author: pfg <pfg@ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f>
date: Fri Sep 19 14:24:02 EDT 2014

awk: Use random(3) instead of rand(3)

While none of them is considered even near to cryptographic
level, random(3) is a better random generator than rand(3).

Use random(3) for awk as is done in other systems.

Thanks to Chenguang Li for discussing this in the lists
and submitting the patch upstream.

PR:		193147
MFC after:	5 weeks

git-svn-id: svn+ssh://svn.freebsd.org/base/head@271879 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f

--- a/awk.1
+++ b/awk.1
@@ -209,7 +209,7 @@
 if no argument.
 .TP
 .B rand
-random number on (0,1).
+random number on [0,1).
 .TP
 .B srand
 sets seed for
--- a/main.c
+++ b/main.c
@@ -78,7 +78,7 @@
 	/*signal(SIGSEGV, segvcatch); experiment */
 
 	srand_seed = 1;
-	srand(srand_seed);
+	srandom((unsigned long) srand_seed);
 
 	yyin = NULL;
 	symtab = makesymtab(NSYMTAB/NSYMTAB);
--- a/run.c
+++ b/run.c
@@ -1579,8 +1579,10 @@
 		}
 		break;
 	case FRAND:
-		/* in principle, rand() returns something in 0..RAND_MAX */
-		u = (Awkfloat) (rand() % RAND_MAX) / RAND_MAX;
+		/* random() returns numbers in [0..2^31-1]
+		 * in order to get a number in [0, 1), divide it by 2^31
+		 */
+		u = (Awkfloat) random() / (0x7fffffffL + 0x1UL);
 		break;
 	case FSRAND:
 		if (isrec(x))	/* no argument provided */
@@ -1588,7 +1590,7 @@
 		else
 			u = getfval(x);
 		tmp = u;
-		srand((unsigned int) u);
+		srandom((unsigned long) u);
 		u = srand_seed;
 		srand_seed = tmp;
 		break;
--