diff mbox series

[nfs-utils,1/2] Fix build failure due to glibc <= 2.24 and check for Linux 3.17+

Message ID 20231026114522.567140-1-giulio.benetti@benettiengineering.com (mailing list archive)
State New, archived
Headers show
Series [nfs-utils,1/2] Fix build failure due to glibc <= 2.24 and check for Linux 3.17+ | expand

Commit Message

Giulio Benetti Oct. 26, 2023, 11:45 a.m. UTC
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@benettiengineering.com>
---
 configure.ac                      | 32 +++++++++++++++++++++++++++++++
 support/reexport/backend_sqlite.c | 17 +++++++++++++++-
 2 files changed, 48 insertions(+), 1 deletion(-)

Comments

Petr Vorel Oct. 26, 2023, 7:47 p.m. UTC | #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
Giulio Benetti Oct. 26, 2023, 9:18 p.m. UTC | #2
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.
diff mbox series

Patch

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)