From: Michael Tokarev <mjt@tls.msk.ru>
Date: Sat, 24 Aug 2024 08:00:35 +0300
Updated: Mon, 02 Dec 2024 17:14:04 +0300
Subject: Add OS detection and support for GNU/Hurd
Forwarded: not-needed

Adds minimal (just OS detection) "support" for
GNU/Hurd.  Just a test for now.

diff --git a/configure b/configure
index 0aea9b113b..0648634636 100755
--- a/configure
+++ b/configure
@@ -353,2 +353,4 @@ elif check_define __NetBSD__; then
   host_os=netbsd
+elif check_define __GNU__; then
+  host_os=hurd
 elif check_define __APPLE__; then
diff --git a/meson.build b/meson.build
index 91a0aa64c6..12246a588d 100644
--- a/meson.build
+++ b/meson.build
@@ -46,3 +46,3 @@ qapi_trace_events = []
 bsd_oses = ['gnu/kfreebsd', 'freebsd', 'netbsd', 'openbsd', 'dragonfly', 'darwin']
-supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
+supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux', 'hurd']
 supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64',
diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
index c7053cdc2b..560ed59ac0 100644
--- a/include/qemu/osdep.h
+++ b/include/qemu/osdep.h
@@ -135,4 +135,11 @@ QEMU_EXTERN_C int daemon(int, int);
 
+#if defined(__GNU__) && !defined(PATH_MAX) /* GNU Hurd */
+# define PATH_MAX 4096
+#endif
+
 #ifdef CONFIG_IOVEC
 #include <sys/uio.h>
+# if defined(__GNU__) && !defined(IOV_MAX) /* GNU Hurd */
+#  define IOV_MAX 1024
+# endif
 #endif
diff --git a/block/file-posix.c b/block/file-posix.c
index ff928b5e85..bf165a5a71 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
@@ -85,4 +85,7 @@
 #endif
 #endif
+#ifdef __GNU__
+#include <sys/ioctl.h>
+#endif
 #if defined(CONFIG_FALLOCATE_PUNCH_HOLE) || defined(CONFIG_FALLOCATE_ZERO_RANGE)
 #include <linux/falloc.h>
@@ -2004,4 +2007,5 @@ static int handle_aiocb_write_zeroes_unmap(void *opaque)
 
 #ifndef HAVE_COPY_FILE_RANGE
+#define copy_file_range qemu_copy_file_range
 static off_t copy_file_range(int in_fd, off_t *in_off, int out_fd,
                              off_t *out_off, size_t len, unsigned int flags)
