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