diff --git a/src/host.cpp b/src/host.cpp index 5ad82e585..9b3003641 100644 --- a/src/host.cpp +++ b/src/host.cpp @@ -419,8 +419,7 @@ struct init_data *common_preinit(int argc, char *argv[]) open_all("ultragrid_*.so", init.opened_libs); // load modules } - // init_rng in rtp.c added also hostname to the seed - ug_srand((getpid() * 42) ^ get_time_in_ns()); + ug_rand_init(); #ifdef __linux__ mtrace(); diff --git a/src/utils/random.c b/src/utils/random.c index cdd673fce..0fbd79ee5 100644 --- a/src/utils/random.c +++ b/src/utils/random.c @@ -1,6 +1,6 @@ /** - * @file utils/random.h - * @author Martin Pulec + * @file utils/random.c + * @author Martin Pulec */ /* * Copyright (c) 2023 CESNET, z. s. p. o. @@ -34,22 +34,46 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/** + * @file + * @note + * Remarks (possible improvements): + * - lbl_random reads from '/dev/urandom' instead if available (so Linux only) + * and HAVE_DEV_URANDOM defined (which isn't) + * - init_rng() in rtp.c used also hostname for seeding (but there may not be + * reasonable value, eg. '::1' if no host given to rcvr) + */ +#ifndef _WIN32 +#include +#include +#endif #define _CRT_RAND_S // request rand_s (Win) #include #include "random.h" +#include "tv.h" /** + * @note + * Windows rand_s() is not supposed to be seeded * @remark * thread-safe */ void -ug_srand(uint32_t seed) +ug_rand_init(void) { -#ifdef _WIN32 - (void) seed; -#else +#ifndef _WIN32 + unsigned seed = + (getpid() * 42) ^ (unsigned) get_time_in_ns() ^ (unsigned) clock(); + FILE *dev_r = fopen("/dev/random", "rb"); + if (dev_r != NULL) { + unsigned seed_dev_r = 0; + if (fread(&seed_dev_r, sizeof seed_dev_r, 1, dev_r) == 1) { + seed ^= seed_dev_r; + } + fclose(dev_r); + } srandom(seed); #endif } diff --git a/src/utils/random.h b/src/utils/random.h index 010966bf6..f17695401 100644 --- a/src/utils/random.h +++ b/src/utils/random.h @@ -1,6 +1,6 @@ /** * @file utils/random.h - * @author Martin Pulec + * @author Martin Pulec */ /* * Copyright (c) 2023 CESNET, z. s. p. o. @@ -43,7 +43,7 @@ extern "C" { #endif // functions documented at definition -void ug_srand(uint32_t seed); +void ug_rand_init(void); uint32_t ug_rand(void); double ug_drand(void);