If /dev/urandom cannot be opened or read, just fail the plugin initialization, as it is very unlikely that a fully working Linux system does not have a working /dev/urandom. This also simplifies the code logic. --- plugins/autopair.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/plugins/autopair.c b/plugins/autopair.c index e6e5035..266b695 100644 --- a/plugins/autopair.c +++ b/plugins/autopair.c @@ -29,6 +29,7 @@ #include <stdlib.h> #include <fcntl.h> #include <unistd.h> +#include <errno.h> #include <bluetooth/bluetooth.h> #include <glib.h> @@ -149,19 +150,27 @@ static int autopair_init(void) { /* Initialize the random seed from /dev/urandom */ unsigned int seed; - int fd; + int fd, err; + ssize_t n; fd = open("/dev/urandom", O_RDONLY); - if (fd >= 0) { - ssize_t n; - - n = read(fd, &seed, sizeof(seed)); - if (n < (ssize_t) sizeof(seed)) - seed = time(NULL); + if (fd < 0) { + err = -errno; + error("Failed to open /dev/urandom: %s (%d)", strerror(-err), + -err); + return err; + } + n = read(fd, &seed, sizeof(seed)); + if (n < (ssize_t) sizeof(seed)) { + err = (n == -1) ? -errno : -EIO; + error("Failed to read %d bytes from /dev/urandom", + sizeof(seed)); close(fd); - } else - seed = time(NULL); + return err; + } + + close(fd); srand(seed); -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html