From d4b74d78e5483b18a6d74212682b1324fe35d1c1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= <revol@free.fr>
Date: Sun, 24 Feb 2019 02:20:34 +0100
Subject: [PATCH 1/3] test for mlock (Haiku does not have it)

---
 cmake/config.cmake | 1 +
 configure.ac       | 6 +++++-
 corelib/mapped.cpp | 4 ++++
 3 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/cmake/config.cmake b/cmake/config.cmake
index d887f13a..e04b0d45 100644
--- a/cmake/config.cmake
+++ b/cmake/config.cmake
@@ -58,6 +58,7 @@ check_function_exists(waitpid HAVE_WAITPID)
 check_function_exists(wait4 HAVE_WAIT4)
 check_function_exists(setgroups HAVE_SETGROUPS)
 check_function_exists(strlcpy HAVE_STRLCPY)
+check_function_exists(mlocl HAVE_MLOCK)
 
 check_include_files(sys/stat.h HAVE_SYS_STAT_H)
 check_include_files(strings.h HAVE_STRINGS_H)
diff --git a/configure.ac b/configure.ac
index 9bcaca5e..77bc9265 100644
--- a/configure.ac
+++ b/configure.ac
@@ -255,6 +255,10 @@ AC_CHECK_LIB($clib, stristr, [
     AC_DEFINE(HAVE_STRISTR, [1], [string istr])
 ])
 
+AC_CHECK_LIB($clib, mlock, [
+    AC_DEFINE(HAVE_MLOCK, [1], [mlock])
+])
+
 AC_CHECK_LIB($clib, sysconf, [
     AC_DEFINE(HAVE_SYSCONF, [1], [system config])
 ])
@@ -347,7 +351,7 @@ if test "$threading" = "none" ; then
     fi
 fi
 
-for func in ftok shm_open nanosleep clock_nanosleep clock_gettime strerror_r localtime_r gmtime_r posix_fadvise ftruncate pwrite setgroups setpgrp setlocale gettext execvp atexit realpath symlink readlink waitpid wait4 endgrent strlcpy; do
+for func in ftok shm_open nanosleep clock_nanosleep clock_gettime strerror_r localtime_r gmtime_r posix_fadvise ftruncate pwrite setgroups setpgrp setlocale gettext execvp atexit realpath symlink readlink waitpid wait4 endgrent strlcpy mlock; do
     found="no"
     AC_CHECK_FUNC($func,[
         found=$func
diff --git a/corelib/mapped.cpp b/corelib/mapped.cpp
index f23e2f8c..87839df1 100644
--- a/corelib/mapped.cpp
+++ b/corelib/mapped.cpp
@@ -354,7 +354,9 @@ void MappedMemory::create(const char *fn, size_t len)
     ::close(fd);
     if(map != (caddr_t)MAP_FAILED) {
         size = mapsize = len;
+#ifdef HAVE_MLOCK
         mlock(map, mapsize);
+#endif
 #if INSERT_OFFSET > 0
         if(prot & PROT_WRITE) {
             size -= INSERT_OFFSET;
@@ -377,7 +379,9 @@ void MappedMemory::release()
     if(size) {
         if(use_mapping) {
             map -= INSERT_OFFSET;
+#ifdef HAVE_MLOCK
             munlock(map, mapsize);
+#endif
             munmap(map, mapsize);
         }
         else
-- 
2.19.1


From 070bfcfe30f6ae94449bf2ab12cf3a73a13d2595 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= <revol@free.fr>
Date: Sun, 24 Feb 2019 02:41:23 +0100
Subject: [PATCH 2/3] use libnetwork on Haiku

---
 cmake/ucommon.cmake | 4 ++++
 configure.ac        | 3 +++
 2 files changed, 7 insertions(+)

diff --git a/cmake/ucommon.cmake b/cmake/ucommon.cmake
index 134c115c..f921f17a 100644
--- a/cmake/ucommon.cmake
+++ b/cmake/ucommon.cmake
@@ -17,6 +17,10 @@ if (NOT UCOMMON_CONFIGURED)
         set(UCOMMON_LIBS ${UCOMMON_LIBS} nsl socket)
     endif()
 
+    if(CMAKE_SYSTEM_NAME MATCHES "Haiku")
+        set(UCOMMON_LIBS ${UCOMMON_LIBS} network)
+    endif()
+
     if(CMAKE_COMPILER_IS_GNUCXX)
         set(UCOMMON_VISIBILITY_FLAG "-fvisibility=hidden")
         if(MINGW OR MSYS OR CMAKE_SYSTEM MATCHES "Windows")
diff --git a/configure.ac b/configure.ac
index 77bc9265..455c31fe 100644
--- a/configure.ac
+++ b/configure.ac
@@ -110,6 +110,9 @@ osf*|cygwin*|mingw*)
 darwin*)
     MODULE_FLAGS="-dynamic -bundle -undefined suppress -flat_namespace -read_only_relocs suppress"
     ;;
+haiku*)
+    UCOMMON_LIBC="-lnetwork"
+    ;;
 esac
 
 AC_ARG_ENABLE(posix-timers,
-- 
2.19.1


From d8c6e7fc8a2f5a2caecf78e3fc1c56debdb3fd73 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= <revol@free.fr>
Date: Sun, 24 Feb 2019 02:41:45 +0100
Subject: [PATCH 3/3] use ifr_name (Haiku doesn't have named unions in ifreq)

---
 corelib/socket.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/corelib/socket.cpp b/corelib/socket.cpp
index 077fe930..4db6bf0b 100644
--- a/corelib/socket.cpp
+++ b/corelib/socket.cpp
@@ -3027,7 +3027,7 @@ int Socket::bindto(socket_t so, const char *host, const char *svc, int protocol)
     if(host && !strchr(host, '.') && !strchr(host, ':')) {
         struct ifreq ifr;
         memset(&ifr, 0, sizeof(ifr));
-        strncpy(ifr.ifr_ifrn.ifrn_name, host, IFNAMSIZ);
+        strncpy(ifr.ifr_name, host, IFNAMSIZ);
         ifr.ifr_name[IFNAMSIZ - 1] = '\0';
         setsockopt(so, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr));
         host = NULL;
-- 
2.19.1

