1 /*
2 * dev_arandom
3 *
4 * See copyright in copyright.h and the accompanying file COPYING
5 *
6 */
7
8 #include <dieharder/libdieharder.h>
9
10 static unsigned long int dev_arandom_get (void *vstate);
11 static double dev_arandom_get_double (void *vstate);
12 static void dev_arandom_set (void *vstate, unsigned long int s);
13
14 typedef struct
15 {
16 FILE *fp;
17 }
18 dev_arandom_state_t;
19
20 static unsigned long int
dev_arandom_get(void * vstate)21 dev_arandom_get (void *vstate)
22 {
23 dev_arandom_state_t *state = (dev_arandom_state_t *) vstate;
24 unsigned long int j;
25
26 if(state->fp != NULL) {
27 fread(&j,sizeof(j),1,state->fp);
28 return j;
29 } else {
30 fprintf(stderr,"Error: /dev/arandom not open. Exiting.\n");
31 exit(0);
32 }
33
34 }
35
36 static double
dev_arandom_get_double(void * vstate)37 dev_arandom_get_double (void *vstate)
38 {
39 return dev_arandom_get (vstate) / (double) UINT_MAX;
40 }
41
42 static void
dev_arandom_set(void * vstate,unsigned long int s)43 dev_arandom_set (void *vstate, unsigned long int s)
44 {
45 dev_arandom_state_t *state = (dev_arandom_state_t *) vstate;
46
47 if ((state->fp = fopen("/dev/arandom","r")) == NULL) {
48 fprintf(stderr,"Error: Cannot open /dev/arandom, exiting.\n");
49 fprintf(stderr,"/dev/arandom may only be available on BSD systems.\n");
50 exit(0);
51 }
52
53 return;
54
55 }
56
57 static const gsl_rng_type dev_arandom_type =
58 {"/dev/arandom", /* name */
59 UINT_MAX, /* RAND_MAX */
60 0, /* RAND_MIN */
61 sizeof (dev_arandom_state_t),
62 &dev_arandom_set,
63 &dev_arandom_get,
64 &dev_arandom_get_double};
65
66 const gsl_rng_type *gsl_rng_dev_arandom = &dev_arandom_type;
67