Mercurial > libavutil.hg
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; |