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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux