summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2014-10-11 14:34:02 +0200
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2014-10-11 14:37:14 +0200
commite4011615394437153fe32d3c75dd45f5f364ed7e (patch)
treeaeab2487c308c1a04f609edb175e78fff6fb3a68
parentb22cbb28db997447cca0720422a77acddf4be3da (diff)
downloadgnutls-e4011615394437153fe32d3c75dd45f5f364ed7e.tar.gz
rnd: if RUSAGE_THREAD fails try RUSAGE_SELF
-rw-r--r--lib/nettle/rnd-common.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/lib/nettle/rnd-common.c b/lib/nettle/rnd-common.c
index 0a015d5aa0..64832bf0e5 100644
--- a/lib/nettle/rnd-common.c
+++ b/lib/nettle/rnd-common.c
@@ -48,6 +48,8 @@
# endif
#endif
+static int rusage_arg = ARG_RUSAGE;
+
void _rnd_get_event(struct event_st *e)
{
static unsigned count = 0;
@@ -55,10 +57,11 @@ void _rnd_get_event(struct event_st *e)
gettime(&e->now);
#ifdef HAVE_GETRUSAGE
- if (getrusage(ARG_RUSAGE, &e->rusage) < 0) {
- _gnutls_debug_log("getrusage failed: %s\n",
+ if (rusage_arg != -1) {
+ if (getrusage(rusage_arg, &e->rusage) < 0) {
+ _gnutls_debug_log("getrusage failed: %s\n",
strerror(errno));
- abort();
+ }
}
#endif
@@ -189,7 +192,19 @@ get_entropy_func _rnd_get_system_entropy = NULL;
int _rnd_system_entropy_init(void)
{
int old;
-
+
+#ifdef HAVE_GETRUSAGE
+ {
+ struct rusage usage;
+ if (getrusage(rusage_arg, &usage) < 0) {
+ rusage_arg = RUSAGE_SELF;
+ if (getrusage(rusage_arg, &usage) < 0) {
+ rusage_arg = -1;
+ }
+ }
+ }
+#endif
+
device_fd = open("/dev/urandom", O_RDONLY);
if (device_fd < 0) {
_gnutls_debug_log("Cannot open urandom!\n");