-
Notifications
You must be signed in to change notification settings - Fork 138
/
entropy.c
79 lines (56 loc) · 1.35 KB
/
entropy.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
* Copyright (C) 2011, Parrot Foundation.
*/
/*
=head1 NAME
src/platform/generic/entropy.c
=head1 DESCRIPTION
Get some entropy from the system.
=head2 Functions
=over 4
=cut
*/
#include "parrot/parrot.h"
/* HEADERIZER HFILE: none */
/*
=item C<void Parrot_get_entropy(PARROT_INTERP)>
Get one INTVAL worth of entropy from the system.
=cut
*/
INTVAL
Parrot_get_entropy(PARROT_INTERP) {
INTVAL entropy;
size_t count;
FILE *urand_fh = fopen("/dev/urandom", "r");
if (!urand_fh) {
const char *msg = "Couldn't open /dev/urandom for reading.";
/* This function is called during interp init, so use the GC registry
* as a way to figure out interp's initializedness.
*/
if (interp->gc_registry)
Parrot_ex_throw_from_c_args(interp, NULL, 1, msg);
else
PANIC(interp, msg);
}
count = fread(&entropy, sizeof (INTVAL), 1, urand_fh);
if (count != 1) {
const char* msg = "Couldn't read from /dev/urandom.";
fclose(urand_fh);
if (interp->gc_registry)
Parrot_ex_throw_from_c_args(interp, NULL, 1, msg);
else
PANIC(interp, msg);
}
fclose(urand_fh);
return entropy;
}
/*
=back
=cut
*/
/*
* Local variables:
* c-file-style: "parrot"
* End:
* vim: expandtab shiftwidth=4 cinoptions='\:2=2' :
*/