comparison random_seed.c @ 956:2894d4c208dc libavutil

Make av_get_random_seed() non-blocking Attempt to read from /dev/urandom and /dev/random with O_NONBLOCK set. If neither succeeds, proceed with fallbacks.
author mru
date Wed, 30 Jun 2010 10:38:04 +0000
parents 1ff442f2660c
children 08c117c60753
comparison
equal deleted inserted replaced
955:040bf8859042 956:2894d4c208dc
22 #include <fcntl.h> 22 #include <fcntl.h>
23 #include "timer.h" 23 #include "timer.h"
24 #include "random_seed.h" 24 #include "random_seed.h"
25 #include "avutil.h" 25 #include "avutil.h"
26 26
27 static int read_random(uint32_t *dst, const char *file)
28 {
29 int fd = open(file, O_RDONLY);
30 int err = -1;
31
32 if (fd == -1)
33 return -1;
34 #if HAVE_FCNTL && defined(O_NONBLOCK)
35 if (fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK) != -1)
36 #endif
37 err = read(fd, dst, sizeof(*dst));
38 close(fd);
39
40 return err;
41 }
42
27 uint32_t av_get_random_seed(void) 43 uint32_t av_get_random_seed(void)
28 { 44 {
29 uint32_t seed; 45 uint32_t seed;
30 int fd; 46 int err;
31 47
32 if ((fd = open("/dev/random", O_RDONLY)) == -1) 48 err = read_random(&seed, "/dev/urandom");
33 fd = open("/dev/urandom", O_RDONLY); 49 if (err != sizeof(seed))
34 if (fd != -1){ 50 err = read_random(&seed, "/dev/random");
35 int err = read(fd, &seed, 4); 51 if (err == sizeof(seed))
36 close(fd); 52 return seed;
37 if (err == 4) 53
38 return seed;
39 }
40 #ifdef AV_READ_TIME 54 #ifdef AV_READ_TIME
41 seed = AV_READ_TIME(); 55 seed = AV_READ_TIME();
42 #endif 56 #endif
43 // XXX what to do ? 57 // XXX what to do ?
44 return seed; 58 return seed;