diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2014-10-11 14:34:02 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2014-10-11 14:37:14 +0200 |
commit | e4011615394437153fe32d3c75dd45f5f364ed7e (patch) | |
tree | aeab2487c308c1a04f609edb175e78fff6fb3a68 | |
parent | b22cbb28db997447cca0720422a77acddf4be3da (diff) | |
download | gnutls-e4011615394437153fe32d3c75dd45f5f364ed7e.tar.gz |
rnd: if RUSAGE_THREAD fails try RUSAGE_SELF
-rw-r--r-- | lib/nettle/rnd-common.c | 23 |
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"); |