Function getrandom() is present only with glibc 2.24+ so add a direct syscall otherwise. This is only possible with Linux 3.17+ so let's also check for it and in case emit error on autotools configure. Signed-off-by: Giulio Benetti <giulio.benetti@xxxxxxxxxxxxxxxxxxxxxx> --- configure.ac | 32 +++++++++++++++++++++++++++++++ support/reexport/backend_sqlite.c | 17 +++++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 6fbcb974..7efca90c 100644 --- a/configure.ac +++ b/configure.ac @@ -328,6 +328,38 @@ AC_CHECK_HEADERS([sched.h], [], []) AC_CHECK_FUNCS([unshare fstatat statx], [] , []) AC_LIBPTHREAD([]) +AC_MSG_CHECKING([for getrandom (Linux 3.17+, glibc 2.25+)]) +AC_LINK_IFELSE([AC_LANG_SOURCE([ + #include <stdlib.h> /* for NULL */ + #include <sys/random.h> + int main() { + return getrandom(NULL, 0U, 0U); + } +])], [ + AC_DEFINE([HAVE_GETRANDOM], [1], + [Define to 1 if you have the `getrandom' function.]) + AC_MSG_RESULT([yes]) +], [ + AC_MSG_RESULT([no]) + + AC_MSG_CHECKING([for syscall SYS_getrandom (Linux 3.17+)]) + AC_LINK_IFELSE([AC_LANG_SOURCE([ + #include <stdlib.h> /* for NULL */ + #include <unistd.h> /* for syscall */ + #include <sys/syscall.h> /* for SYS_getrandom */ + int main() { + syscall(SYS_getrandom, NULL, 0, 0); + return 0; + } + ])], [ + AC_DEFINE([HAVE_SYSCALL_GETRANDOM], [1], + [Define to 1 if you have `syscall' and `SYS_getrandom'.]) + AC_MSG_RESULT([yes]) + ], [ + AC_MSG_ERROR(['syscall' and 'SYS_getrandom' not found.]) + ]) +]) + # rpc/rpc.h can come from the glibc or from libtirpc nfsutils_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${CPPFLAGS} ${TIRPC_CFLAGS}" diff --git a/support/reexport/backend_sqlite.c b/support/reexport/backend_sqlite.c index 132f30c4..f1e390bc 100644 --- a/support/reexport/backend_sqlite.c +++ b/support/reexport/backend_sqlite.c @@ -7,13 +7,28 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <sys/random.h> #include <unistd.h> #include "conffile.h" #include "reexport_backend.h" #include "xlog.h" +/* Fix up glibc <= 2.24 not having getrandom() */ +#if defined HAVE_GETRANDOM +#include <sys/random.h> +#else +#include <sys/syscall.h> +static ssize_t getrandom(void *buffer, size_t length, unsigned flags) +{ +# if defined(__NR_getrandom) + return syscall(__NR_getrandom, buffer, length, flags); +# else + errno = ENOSYS; + return -1; +# endif +} +#endif + #define REEXPDB_DBFILE NFS_STATEDIR "/reexpdb.sqlite3" #define REEXPDB_DBFILE_WAIT_USEC (5000) -- 2.34.1