diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 850c8a1341b..b8f238e7774 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,10 @@ +2018-08-13 Janne Blomqvist + + * configure.ac: Check for getentropy. + * intrinsics/random.c (getosrandom): Use getentropy if available. + * config.h.in: Regenerated. + * configure: Regenerated. + 2018-07-31 Andre Vieira Revert 'AsyncI/O patch committed' diff --git a/libgfortran/config.h.in b/libgfortran/config.h.in index 0274e5d9c4c..9ad64d57ab9 100644 --- a/libgfortran/config.h.in +++ b/libgfortran/config.h.in @@ -453,6 +453,9 @@ /* Define to 1 if you have the `getegid' function. */ #undef HAVE_GETEGID +/* Define to 1 if you have the `getentropy' function. */ +#undef HAVE_GETENTROPY + /* Define to 1 if you have the `geteuid' function. */ #undef HAVE_GETEUID diff --git a/libgfortran/configure b/libgfortran/configure index 91fce8fecd0..42b4c0b5cb4 100755 --- a/libgfortran/configure +++ b/libgfortran/configure @@ -2570,6 +2570,7 @@ as_fn_append ac_func_list " snprintf" as_fn_append ac_func_list " ftruncate" as_fn_append ac_func_list " chsize" as_fn_append ac_func_list " chdir" +as_fn_append ac_func_list " getentropy" as_fn_append ac_func_list " getlogin" as_fn_append ac_func_list " gethostname" as_fn_append ac_func_list " kill" @@ -12512,7 +12513,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 12515 "configure" +#line 12516 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -12618,7 +12619,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 12621 "configure" +#line 12622 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -16775,6 +16776,8 @@ done + + diff --git a/libgfortran/configure.ac b/libgfortran/configure.ac index bf6d3634dda..900c7466dec 100644 --- a/libgfortran/configure.ac +++ b/libgfortran/configure.ac @@ -312,7 +312,8 @@ if test "${hardwire_newlib:-0}" -eq 1; then fi else AC_CHECK_FUNCS_ONCE(getrusage times mkstemp strtof strtold snprintf \ - ftruncate chsize chdir getlogin gethostname kill link symlink sleep ttyname \ + ftruncate chsize chdir getentropy getlogin gethostname kill link symlink \ + sleep ttyname \ alarm access fork setmode fcntl \ gettimeofday stat fstat lstat getpwuid vsnprintf dup \ getcwd localtime_r gmtime_r getpwuid_r ttyname_r clock_gettime \ diff --git a/libgfortran/intrinsics/random.c b/libgfortran/intrinsics/random.c index 234c5ff95fd..229fa6995c0 100644 --- a/libgfortran/intrinsics/random.c +++ b/libgfortran/intrinsics/random.c @@ -310,11 +310,10 @@ getosrandom (void *buf, size_t buflen) rand_s (&b[i]); return buflen; #else - /* - TODO: When glibc adds a wrapper for the getrandom() system call - on Linux, one could use that. - - TODO: One could use getentropy() on OpenBSD. */ +#ifdef HAVE_GETENTROPY + if (getentropy (buf, buflen) == 0) + return 0; +#endif int flags = O_RDONLY; #ifdef O_CLOEXEC flags |= O_CLOEXEC;