From c22a0c12e49181d6ea042993e6b4b47db69574b1 Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Tue, 18 Apr 2006 15:16:24 +0000 Subject: Make the probe for RNG sources at runtime since the configure script isn't compatible with cross-compiling. git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@744 fefdeb5f-60dc-0310-8127-8f9354f1896f --- configure.ac | 20 ------------- src/daemon/main.c | 26 ++--------------- src/polypcore/random.c | 77 ++++++++++++++++++++++++++++++++++++++------------ src/polypcore/random.h | 1 + 4 files changed, 62 insertions(+), 62 deletions(-) diff --git a/configure.ac b/configure.ac index c37abfcd..d6239f97 100644 --- a/configure.ac +++ b/configure.ac @@ -396,26 +396,6 @@ AC_SUBST(LIRC_CFLAGS) AC_SUBST(LIRC_LIBS) AM_CONDITIONAL([HAVE_LIRC], [test "x$HAVE_LIRC" = x1]) -### /dev/random ### - -AC_MSG_CHECKING([whether a random device is available]) - -rnd="no" - -if test -e /dev/urandom ; then - rnd=/dev/urandom -else - if test -e /dev/random ; then - rnd=/dev/random - fi -fi - -if test "x$rnd" != "no" ; then - AC_DEFINE_UNQUOTED([RANDOM_DEVICE], ["$rnd"], [Random device]) -fi - -AC_MSG_RESULT([$rnd]) - ################################### # Output # ################################### diff --git a/src/daemon/main.c b/src/daemon/main.c index d783531a..4ae9fbf1 100644 --- a/src/daemon/main.c +++ b/src/daemon/main.c @@ -63,6 +63,7 @@ #include #include #include +#include #include "cmdline.h" #include "cpulimit.h" @@ -135,29 +136,6 @@ static void close_pipe(int p[2]) { p[0] = p[1] = -1; } -static void set_random_seed(void) { - unsigned int seed = 0; - -#ifdef RANDOM_DEVICE - int fd; - - if ((fd = open(RANDOM_DEVICE, O_RDONLY)) >= 0) { - ssize_t r; - - if ((r = pa_loop_read(fd, &seed, sizeof(seed))) < 0 || (size_t) r != sizeof(seed)) { - pa_log_error(__FILE__": failed to read entropy from '"RANDOM_DEVICE"'"); - seed += (unsigned int) time(NULL); - } - - close(fd); - } -#else - seed = (unsigned int) time(NULL); -#endif - - srand(seed); -} - int main(int argc, char *argv[]) { pa_core *c; pa_strbuf *buf = NULL; @@ -203,7 +181,7 @@ int main(int argc, char *argv[]) { } #endif - set_random_seed(); + pa_random_seed(); pa_log_set_ident("polypaudio"); diff --git a/src/polypcore/random.c b/src/polypcore/random.c index ffd40474..ffe24994 100644 --- a/src/polypcore/random.c +++ b/src/polypcore/random.c @@ -36,31 +36,72 @@ #include "random.h" -void pa_random(void *ret_data, size_t length) { - int fd; - ssize_t r = 0; +static int has_whined = 0; + +static const char *devices[] = { "/dev/urandom", "/dev/random", NULL }; + +static int pa_random_proper(void *ret_data, size_t length) { assert(ret_data && length); -#ifdef RANDOM_DEVICE - if ((fd = open(RANDOM_DEVICE, O_RDONLY)) >= 0) { +#ifdef OS_IS_WIN32 - if ((r = pa_loop_read(fd, ret_data, length)) < 0 || (size_t) r != length) - pa_log_error(__FILE__": failed to read entropy from '%s'", RANDOM_DEVICE); + return -1; + +#else /* OS_IS_WIN32 */ + + int fd, ret; + ssize_t r = 0; + const char **device; - close(fd); + device = devices; + + while (*device) { + ret = 0; + + if ((fd = open(*device, O_RDONLY)) >= 0) { + + if ((r = pa_loop_read(fd, ret_data, length)) < 0 || (size_t) r != length) + ret = -1; + + close(fd); + } else + ret = -1; + + if (ret == 0) + break; } -#endif - if ((size_t) r != length) { - uint8_t *p; - size_t l; + return ret; +#endif /* OS_IS_WIN32 */ +} -#ifdef RANDOM_DEVICE - pa_log_warn(__FILE__": WARNING: Failed to open entropy device '"RANDOM_DEVICE"': %s" - ", falling back to unsecure pseudo RNG.\n", strerror(errno)); -#endif +void pa_random_seed() { + unsigned int seed; + + if (pa_random_proper(&seed, sizeof(unsigned int)) < 0) { + if (!has_whined) + pa_log_warn(__FILE__": failed to get proper entropy. Falling back to seeding with current time."); + has_whined = 1; - for (p = ret_data, l = length; l > 0; p++, l--) - *p = (uint8_t) rand(); + seed = (unsigned int) time(NULL); } + + srand(seed); +} + +void pa_random(void *ret_data, size_t length) { + uint8_t *p; + size_t l; + + assert(ret_data && length); + + if (pa_random_proper(ret_data, length) >= 0) + return; + + if (!has_whined) + pa_log_warn(__FILE__": failed to get proper entropy. Falling back to unsecure pseudo RNG."); + has_whined = 1; + + for (p = ret_data, l = length; l > 0; p++, l--) + *p = (uint8_t) rand(); } diff --git a/src/polypcore/random.h b/src/polypcore/random.h index bfb3df08..94a6d505 100644 --- a/src/polypcore/random.h +++ b/src/polypcore/random.h @@ -22,6 +22,7 @@ USA. ***/ +void pa_random_seed(); void pa_random(void *ret_data, size_t length); #endif -- cgit