From 1fc649fe351919c60c7e1e5044bd6fb00ce59edd Mon Sep 17 00:00:00 2001
From: Jim Harris <james.r.harris@intel.com>
Date: Fri, 12 Aug 2022 05:00:25 +0000
Subject: [PATCH] configure: add CONFIG_HAVE_ARC4RANDOM

glibc 2.36 added arc4random(), which breaks
the SPDK iSCSI build since it always implements its
own arc4random() implementation on non-FreeBSD OS
(meaning always on Linux).

So instead add a CONFIG_HAVE_ARC4RANDOM and remove
the explicit FreeBSD dependency - this will work on
FreeBSD as well as Linux with >= glibc 2.36.

Also fix check_format.sh, so that it does not
enforce spdk/stdinc.h checks on code snippets in
the configure file.

Fixes issue #2637.

Reported-by: Karl Bonde Torp <k.torp@samsung.com>
Signed-off-by: Jim Harris <james.r.harris@intel.com>
Change-Id: Iab9da8ae30d62a56869530846372ffddf7138eed
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14028
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Dong Yi <dongx.yi@intel.com>

Confilict: file CONFIG context is inconsistent
---
 CONFIG                  | 3 +++
 configure               | 5 +++++
 lib/iscsi/iscsi.c       | 5 ++---
 scripts/check_format.sh | 2 +-
 4 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/CONFIG b/CONFIG
index 214e59e..b8dde2e 100644
--- a/CONFIG
+++ b/CONFIG
@@ -171,3 +171,6 @@ CONFIG_RAID5=n
 
 # Build with IDXD support
 CONFIG_IDXD=n
+
+# arc4random is available in stdlib.h
+CONFIG_HAVE_ARC4RANDOM=n
diff --git a/configure b/configure
index 01db27a..376019c 100755
--- a/configure
+++ b/configure
@@ -750,6 +750,11 @@ if [[ "${CONFIG[TSAN]}" = "y" ]]; then
 	fi
 fi
 
+if echo -e '#include <stdlib.h>\nint main(void) { arc4random(); return 0; }\n' \
+	| "${BUILD_CMD[@]}" - 2> /dev/null; then
+	CONFIG[HAVE_ARC4RANDOM]="y"
+fi
+
 if [[ "${CONFIG[OCF]}" = "y" ]]; then
 	# If OCF_PATH is a file, assume it is a library and use it to compile with
 	if [ -f ${CONFIG[OCF_PATH]} ]; then
diff --git a/lib/iscsi/iscsi.c b/lib/iscsi/iscsi.c
index 4bca616..48e548a 100644
--- a/lib/iscsi/iscsi.c
+++ b/lib/iscsi/iscsi.c
@@ -64,7 +64,6 @@
 
 #ifdef __FreeBSD__
 #define HAVE_SRANDOMDEV 1
-#define HAVE_ARC4RANDOM 1
 #endif
 
 struct spdk_iscsi_globals g_iscsi = {
@@ -99,7 +98,7 @@ srandomdev(void)
 }
 #endif /* HAVE_SRANDOMDEV */
 
-#ifndef HAVE_ARC4RANDOM
+#ifndef SPDK_CONFIG_HAVE_ARC4RANDOM
 static int g_arc4random_initialized = 0;
 
 static uint32_t
@@ -117,7 +116,7 @@ arc4random(void)
 	r = (r1 << 16) | r2;
 	return r;
 }
-#endif /* HAVE_ARC4RANDOM */
+#endif /* SPDK_CONFIG_HAVE_ARC4RANDOM */
 
 static void
 gen_random(uint8_t *buf, size_t len)
diff --git a/scripts/check_format.sh b/scripts/check_format.sh
index b522115..8c242a7 100755
--- a/scripts/check_format.sh
+++ b/scripts/check_format.sh
@@ -240,7 +240,7 @@ function check_posix_includes() {
 	local rc=0
 
 	echo -n "Checking for POSIX includes..."
-	git grep -I -i -f scripts/posix.txt -- './*' ':!include/spdk/stdinc.h' ':!include/linux/**' ':!lib/rte_vhost*/**' ':!scripts/posix.txt' ':!*.patch' > scripts/posix.log || true
+	git grep -I -i -f scripts/posix.txt -- './*' ':!include/spdk/stdinc.h' ':!include/linux/**' ':!lib/rte_vhost*/**' ':!scripts/posix.txt' ':!*.patch' ':!configure' > scripts/posix.log || true
 	if [ -s scripts/posix.log ]; then
 		echo "POSIX includes detected. Please include spdk/stdinc.h instead."
 		cat scripts/posix.log
-- 
2.33.0

