xref: /plan9-contrib/sys/src/cmd/random.c (revision acf6de95b6ffd3398ad10f755c8f2060e03260dd)
1*acf6de95SDavid du Colombier /*
2*acf6de95SDavid du Colombier  * random - print a random number or string
3*acf6de95SDavid du Colombier  */
4*acf6de95SDavid du Colombier 
5*acf6de95SDavid du Colombier #include <u.h>
6*acf6de95SDavid du Colombier #include <libc.h>
7*acf6de95SDavid du Colombier #include <mp.h>
8*acf6de95SDavid du Colombier #include <libsec.h>
9*acf6de95SDavid du Colombier 
10*acf6de95SDavid du Colombier static int string, prchars, low, high;
11*acf6de95SDavid du Colombier 
12*acf6de95SDavid du Colombier static void
usage(void)13*acf6de95SDavid du Colombier usage(void)
14*acf6de95SDavid du Colombier {
15*acf6de95SDavid du Colombier 	fprint(2, "usage: %s [-s nch]\n", argv0);
16*acf6de95SDavid du Colombier 	exits("usage");
17*acf6de95SDavid du Colombier }
18*acf6de95SDavid du Colombier 
19*acf6de95SDavid du Colombier void
main(int argc,char * argv[])20*acf6de95SDavid du Colombier main(int argc, char *argv[])
21*acf6de95SDavid du Colombier {
22*acf6de95SDavid du Colombier 	char *buf, *out;
23*acf6de95SDavid du Colombier 
24*acf6de95SDavid du Colombier 	ARGBEGIN {
25*acf6de95SDavid du Colombier 	case 's':
26*acf6de95SDavid du Colombier 		++string;
27*acf6de95SDavid du Colombier 		prchars = atoi(EARGF(usage()));
28*acf6de95SDavid du Colombier 		break;
29*acf6de95SDavid du Colombier 	default:
30*acf6de95SDavid du Colombier 		usage();
31*acf6de95SDavid du Colombier 		break;
32*acf6de95SDavid du Colombier 	} ARGEND
33*acf6de95SDavid du Colombier 
34*acf6de95SDavid du Colombier 	if (!string) {
35*acf6de95SDavid du Colombier 		print("%f\n", (double)ntruerand(~0ul) / (1ull<<32));
36*acf6de95SDavid du Colombier 		exits(0);
37*acf6de95SDavid du Colombier 	}
38*acf6de95SDavid du Colombier 
39*acf6de95SDavid du Colombier 	/* fill buf from /dev/random */
40*acf6de95SDavid du Colombier 	buf = malloc(prchars + 1);
41*acf6de95SDavid du Colombier 	if (buf == nil)
42*acf6de95SDavid du Colombier 		sysfatal("out of memory: %r");
43*acf6de95SDavid du Colombier 	genrandom((uchar *)buf, prchars);
44*acf6de95SDavid du Colombier 	buf[prchars] = '\0';
45*acf6de95SDavid du Colombier 
46*acf6de95SDavid du Colombier 	/* encode as printable (base64) and print truncated */
47*acf6de95SDavid du Colombier 	fmtinstall('[', encodefmt);
48*acf6de95SDavid du Colombier 	out = smprint("%.*[", prchars, buf);
49*acf6de95SDavid du Colombier 	if (out == nil)
50*acf6de95SDavid du Colombier 		sysfatal("out of memory: %r");
51*acf6de95SDavid du Colombier 	print("%.*s\n", prchars, out);
52*acf6de95SDavid du Colombier 	exits(0);
53*acf6de95SDavid du Colombier }
54