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 <[email protected]>
---
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
Signed-off-by: Giulio Benetti <[email protected]>
---
support/reexport/fsidd.c | 1 -
support/reexport/reexport.c | 1 -
2 files changed, 2 deletions(-)
diff --git a/support/reexport/fsidd.c b/support/reexport/fsidd.c
index d4b245e8..352de1be 100644
--- a/support/reexport/fsidd.c
+++ b/support/reexport/fsidd.c
@@ -10,7 +10,6 @@
#include <limits.h>
#include <stdint.h>
#include <stdio.h>
-#include <sys/random.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
diff --git a/support/reexport/reexport.c b/support/reexport/reexport.c
index d9a700af..c59e6b2f 100644
--- a/support/reexport/reexport.c
+++ b/support/reexport/reexport.c
@@ -7,7 +7,6 @@
#endif
#include <stdint.h>
#include <stdio.h>
-#include <sys/random.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/vfs.h>
--
2.34.1
interesting, I yesterday sent patch [1] solving the same problem (although it
might not be that obvious from the patchset name). Let's see which one will be
taken.
Kind regards,
Petr
[1] https://lore.kernel.org/linux-nfs/20231025205720.GB460410@pevik/T/#m4c02286afae09318f6b95ff837750708d5065cd5
Hi Petr,
On 26/10/23 21:47, Petr Vorel wrote:
> interesting, I yesterday sent patch [1] solving the same problem (although it
> might not be that obvious from the patchset name). Let's see which one will be
> taken.
>
> Kind regards,
> Petr
>
> [1] https://lore.kernel.org/linux-nfs/20231025205720.GB460410@pevik/T/#m4c02286afae09318f6b95ff837750708d5065cd5
I totally forgotten to check Patchwork before working on it. Your patch
looks good, better than mine. Maybe you can improve the part of the
syscall because it's not always available. You can then send a patch for
Buildroot too with the patch you've pointed since there you're
nfs-utils package Maintainer too.
--
Giulio Benetti
CEO&CTO@Benetti Engineering sas