Skip to content

Instantly share code, notes, and snippets.

@extrowerk
Last active March 5, 2021 09:39
Show Gist options
  • Save extrowerk/6c5a56edfdce8e0cd782755be854ce33 to your computer and use it in GitHub Desktop.
Save extrowerk/6c5a56edfdce8e0cd782755be854ce33 to your computer and use it in GitHub Desktop.
Kodi git patches
cmake .. -DENABLE_DVDCSS=OFF -DENABLE_OPTICAL=OFF -DENABLE_PYTHON=OFF -DENABLE_TESTING=OFF -DENABLE_UPNP=OFF -DENABLE_AIRTUNES=OFF -DENABLE_INTERNAL_FMT=ON
----------------------------------------------------
From f5cee36d81fbf70287cfa69daf0c88e410efd576 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Zolt=C3=A1n=20Mizsei?= <zmizsei@extrowerk.com>
Date: Fri, 5 Mar 2021 10:35:47 +0100
Subject: [PATCH] Haiku preliminary patches
---
cmake/platform/haiku/defines.txt | 1 +
cmake/platform/haiku/haiku.cmake | 2 +
cmake/scripts/haiku/ArchSetup.cmake | 15 +
cmake/scripts/haiku/ExtraTargets.cmake | 2 +
cmake/scripts/haiku/Install.cmake | 59 ++++
cmake/scripts/haiku/Macros.cmake | 95 +++++++
cmake/scripts/haiku/PathSetup.cmake | 32 +++
cmake/treedata/haiku/subdirs.txt | 14 +
.../Source/System/Bsd/NptBsdNetwork.cpp | 4 +
.../TexturePacker/src/TexturePacker.cpp | 23 +-
xbmc/cores/DllLoader/exports/emu_msvcrt.cpp | 14 +-
xbmc/cores/DllLoader/exports/emu_msvcrt.h | 2 +-
xbmc/cores/DllLoader/exports/wrapper.c | 2 +-
xbmc/music/Album.cpp | 2 +
xbmc/network/TCPServer.cpp | 6 +-
xbmc/platform/haiku/CMakeLists.txt | 28 ++
xbmc/platform/haiku/CPUInfoFreebsd.cpp | 256 ++++++++++++++++++
xbmc/platform/haiku/CPUInfoFreebsd.h | 24 ++
xbmc/platform/haiku/MemUtils.cpp | 83 ++++++
xbmc/platform/haiku/OptionalsReg.cpp | 23 ++
xbmc/platform/haiku/OptionalsReg.h | 18 ++
xbmc/platform/haiku/PlatformFreebsd.cpp | 124 +++++++++
xbmc/platform/haiku/PlatformFreebsd.h | 26 ++
xbmc/platform/haiku/network/CMakeLists.txt | 4 +
.../platform/haiku/network/NetworkFreebsd.cpp | 248 +++++++++++++++++
xbmc/platform/haiku/network/NetworkFreebsd.h | 42 +++
xbmc/platform/posix/PlatformDefs.h | 11 +-
xbmc/platform/posix/network/NetworkPosix.h | 2 +
28 files changed, 1136 insertions(+), 26 deletions(-)
create mode 100644 cmake/platform/haiku/defines.txt
create mode 100644 cmake/platform/haiku/haiku.cmake
create mode 100644 cmake/scripts/haiku/ArchSetup.cmake
create mode 100644 cmake/scripts/haiku/ExtraTargets.cmake
create mode 100644 cmake/scripts/haiku/Install.cmake
create mode 100644 cmake/scripts/haiku/Macros.cmake
create mode 100644 cmake/scripts/haiku/PathSetup.cmake
create mode 100644 cmake/treedata/haiku/subdirs.txt
create mode 100644 xbmc/platform/haiku/CMakeLists.txt
create mode 100644 xbmc/platform/haiku/CPUInfoFreebsd.cpp
create mode 100644 xbmc/platform/haiku/CPUInfoFreebsd.h
create mode 100644 xbmc/platform/haiku/MemUtils.cpp
create mode 100644 xbmc/platform/haiku/OptionalsReg.cpp
create mode 100644 xbmc/platform/haiku/OptionalsReg.h
create mode 100644 xbmc/platform/haiku/PlatformFreebsd.cpp
create mode 100644 xbmc/platform/haiku/PlatformFreebsd.h
create mode 100644 xbmc/platform/haiku/network/CMakeLists.txt
create mode 100644 xbmc/platform/haiku/network/NetworkFreebsd.cpp
create mode 100644 xbmc/platform/haiku/network/NetworkFreebsd.h
diff --git a/cmake/platform/haiku/defines.txt b/cmake/platform/haiku/defines.txt
new file mode 100644
index 0000000..99a7a97
--- /dev/null
+++ b/cmake/platform/haiku/defines.txt
@@ -0,0 +1 @@
+-DTARGET_POSIX -DTARGET_HAIKU
diff --git a/cmake/platform/haiku/haiku.cmake b/cmake/platform/haiku/haiku.cmake
new file mode 100644
index 0000000..fbe8d96
--- /dev/null
+++ b/cmake/platform/haiku/haiku.cmake
@@ -0,0 +1,2 @@
+set(PLATFORM_REQUIRED_DEPS OpenGl Sdl)
+set(APP_RENDER_SYSTEM gl)
diff --git a/cmake/scripts/haiku/ArchSetup.cmake b/cmake/scripts/haiku/ArchSetup.cmake
new file mode 100644
index 0000000..9cb6824
--- /dev/null
+++ b/cmake/scripts/haiku/ArchSetup.cmake
@@ -0,0 +1,15 @@
+set(CORE_MAIN_SOURCE ${CMAKE_SOURCE_DIR}/xbmc/platform/posix/main.cpp)
+
+set(ARCH_DEFINES -DTARGET_POSIX -DTARGET_HAIKU)
+set(SYSTEM_DEFINES -D_REENTRANT -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE
+ -D__STDC_CONSTANT_MACROS)
+set(PLATFORMDEFS_DIR platform/posix)
+
+
+
+# Additional SYSTEM_DEFINES
+list(APPEND SYSTEM_DEFINES -DHAS_POSIX_NETWORK -DHAS_SDL -DHAS_FREEBSD_NETWORK)
+
+list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${NATIVEPREFIX})
+
+include(cmake/scripts/haiku/Macros.cmake)
diff --git a/cmake/scripts/haiku/ExtraTargets.cmake b/cmake/scripts/haiku/ExtraTargets.cmake
new file mode 100644
index 0000000..a077f45
--- /dev/null
+++ b/cmake/scripts/haiku/ExtraTargets.cmake
@@ -0,0 +1,2 @@
+# XBMCHelper
+
diff --git a/cmake/scripts/haiku/Install.cmake b/cmake/scripts/haiku/Install.cmake
new file mode 100644
index 0000000..2ae41f5
--- /dev/null
+++ b/cmake/scripts/haiku/Install.cmake
@@ -0,0 +1,59 @@
+# OSX packaging
+
+set(PACKAGE_OUTPUT_DIR ${CMAKE_BINARY_DIR}/build/${CORE_BUILD_CONFIG})
+
+configure_file(${CMAKE_SOURCE_DIR}/xbmc/platform/darwin/osx/Info.plist.in
+ ${CMAKE_BINARY_DIR}/xbmc/platform/darwin/osx/Info.plist @ONLY)
+execute_process(COMMAND perl -p -i -e "s/r####/${APP_SCMID}/" ${CMAKE_BINARY_DIR}/xbmc/platform/darwin/osx/Info.plist)
+
+add_custom_target(bundle
+ COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${APP_NAME_LC}> ${PACKAGE_OUTPUT_DIR}/${APP_NAME}
+ COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/DllPaths_generated.h
+ ${CMAKE_BINARY_DIR}/xbmc/DllPaths_generated.h
+ COMMAND "ACTION=build"
+ "TARGET_BUILD_DIR=${PACKAGE_OUTPUT_DIR}"
+ "TARGET_NAME=${APP_NAME}.app"
+ "APP_NAME=${APP_NAME}"
+ "SRCROOT=${CMAKE_BINARY_DIR}"
+ ${CMAKE_SOURCE_DIR}/tools/darwin/Support/CopyRootFiles-osx.command
+ COMMAND "XBMC_DEPENDS=${DEPENDS_PATH}"
+ "TARGET_BUILD_DIR=${PACKAGE_OUTPUT_DIR}"
+ "TARGET_NAME=${APP_NAME}.app"
+ "APP_NAME=${APP_NAME}"
+ "FULL_PRODUCT_NAME=${APP_NAME}.app"
+ "SRCROOT=${CMAKE_BINARY_DIR}"
+ "PYTHON_VERSION=${PYTHON_VERSION}"
+ ${CMAKE_SOURCE_DIR}/tools/darwin/Support/copyframeworks-osx.command)
+set_target_properties(bundle PROPERTIES FOLDER "Build Utilities")
+add_dependencies(bundle ${APP_NAME_LC})
+
+configure_file(${CMAKE_SOURCE_DIR}/tools/darwin/packaging/osx/mkdmg-osx.sh.in
+ ${CMAKE_BINARY_DIR}/tools/darwin/packaging/osx/mkdmg-osx.sh @ONLY)
+
+string(TOLOWER ${CORE_BUILD_CONFIG} CORE_BUILD_CONFIG_LOWERCASED)
+if(${CORE_BUILD_CONFIG_LOWERCASED} STREQUAL "release")
+ set(ALLOW_DEBUGGER "false")
+else()
+ set(ALLOW_DEBUGGER "true")
+endif()
+configure_file(${CMAKE_SOURCE_DIR}/tools/darwin/packaging/osx/Kodi.entitlements.in
+ ${CMAKE_BINARY_DIR}/tools/darwin/packaging/osx/Kodi.entitlements @ONLY)
+
+add_custom_target(dmg
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/tools/darwin/packaging/osx/
+ ${CMAKE_BINARY_DIR}/tools/darwin/packaging/osx/
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/tools/darwin/packaging/media/osx/
+ ${CMAKE_BINARY_DIR}/tools/darwin/packaging/media/osx/
+ COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/tools/darwin/Support/Codesign.command
+ ${CMAKE_BINARY_DIR}/tools/darwin/packaging/osx/Codesign.command
+ COMMAND "CODESIGNING_FOLDER_PATH=${PACKAGE_OUTPUT_DIR}/${APP_NAME}.app"
+ "DEV_ACCOUNT=${DEV_ACCOUNT}"
+ "DEV_ACCOUNT_PASSWORD=${DEV_ACCOUNT_PASSWORD}"
+ "DEV_TEAM=${DEV_TEAM}"
+ "EXPANDED_CODE_SIGN_IDENTITY_NAME=${CODE_SIGN_IDENTITY}"
+ "PLATFORM_NAME=${PLATFORM}"
+ "XCODE_BUILDTYPE=${CMAKE_CFG_INTDIR}"
+ ./mkdmg-osx.sh ${CORE_BUILD_CONFIG_LOWERCASED}
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/tools/darwin/packaging/osx)
+set_target_properties(dmg PROPERTIES FOLDER "Build Utilities")
+add_dependencies(dmg bundle)
diff --git a/cmake/scripts/haiku/Macros.cmake b/cmake/scripts/haiku/Macros.cmake
new file mode 100644
index 0000000..ef5aed3
--- /dev/null
+++ b/cmake/scripts/haiku/Macros.cmake
@@ -0,0 +1,95 @@
+function(core_link_library lib wraplib)
+ set(export -Wl,--unresolved-symbols=ignore-all
+ `cat ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/cores/dll-loader/exports/wrapper.def`
+ ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/cores/dll-loader/exports/CMakeFiles/wrapper.dir/wrapper.c.o)
+ set(check_arg "")
+ if(TARGET ${lib})
+ set(target ${lib})
+ set(link_lib $<TARGET_FILE:${lib}>)
+ set(check_arg ${ARGV2})
+ set(data_arg ${ARGV3})
+ else()
+ set(target ${ARGV2})
+ set(link_lib ${lib})
+ set(check_arg ${ARGV3})
+ set(data_arg ${ARGV4})
+ endif()
+
+ # wrapper has to be adapted in order to support coverage.
+ if(CMAKE_BUILD_TYPE STREQUAL Coverage)
+ set(export "")
+ endif()
+
+ if(check_arg STREQUAL export)
+ set(export ${export}
+ -Wl,--version-script=${ARGV3})
+ elseif(check_arg STREQUAL extras)
+ foreach(arg ${data_arg})
+ list(APPEND export ${arg})
+ endforeach()
+ elseif(check_arg STREQUAL archives)
+ set(extra_libs ${data_arg})
+ endif()
+
+ string(REGEX REPLACE "[ ]+" ";" _flags "${CMAKE_SHARED_LINKER_FLAGS}")
+ get_filename_component(dir ${wraplib} DIRECTORY)
+ add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX}
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${dir}
+ COMMAND ${CMAKE_C_COMPILER}
+ ARGS ${_flags} -Wl,--whole-archive
+ "${link_lib}" ${extra_libs}
+ -Wl,--no-whole-archive -lm
+ -Wl,-soname,${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX}
+ -shared -o ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX}
+ ${export}
+ DEPENDS ${target} wrapper.def wrapper)
+
+ get_filename_component(libname ${wraplib} NAME_WE)
+ add_custom_target(wrap_${libname} ALL DEPENDS ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX})
+ set_target_properties(wrap_${libname} PROPERTIES FOLDER lib/wrapped)
+ add_dependencies(${APP_NAME_LC}-libraries wrap_${libname})
+
+ set(LIBRARY_FILES ${LIBRARY_FILES} ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX} CACHE STRING "" FORCE)
+endfunction()
+
+function(find_soname lib)
+ cmake_parse_arguments(arg "REQUIRED" "" "" ${ARGN})
+
+ string(TOLOWER ${lib} liblow)
+ if(${lib}_LDFLAGS)
+ set(link_lib "${${lib}_LDFLAGS}")
+ else()
+ if(IS_ABSOLUTE "${${lib}_LIBRARIES}")
+ set(link_lib "${${lib}_LIBRARIES}")
+ else()
+ set(link_lib -l${${lib}_LIBRARIES})
+ endif()
+ endif()
+ execute_process(COMMAND ${CMAKE_C_COMPILER} -nostdlib -o /dev/null -Wl,-M ${link_lib}
+ COMMAND grep LOAD.*${liblow}
+ ERROR_QUIET
+ OUTPUT_VARIABLE ${lib}_FILENAME)
+ string(REPLACE "LOAD " "" ${lib}_FILENAME "${${lib}_FILENAME}")
+ string(STRIP "${${lib}_FILENAME}" ${lib}_FILENAME)
+ if(NOT ${lib}_FILENAME)
+ execute_process(COMMAND ${CMAKE_C_COMPILER} -nostdlib -o /dev/null -Wl,-t ${link_lib}
+ ERROR_QUIET
+ OUTPUT_VARIABLE _TMP_FILENAME)
+ string(REGEX MATCH ".*lib${liblow}.so" ${lib}_FILENAME ${_TMP_FILENAME})
+ endif()
+ if(${lib}_FILENAME)
+ execute_process(COMMAND ${CMAKE_OBJDUMP} -p ${${lib}_FILENAME}
+ COMMAND grep SONAME.*${liblow}
+ ERROR_QUIET
+ OUTPUT_VARIABLE ${lib}_SONAME)
+ string(REPLACE "SONAME " "" ${lib}_SONAME ${${lib}_SONAME})
+ string(STRIP ${${lib}_SONAME} ${lib}_SONAME)
+ if(VERBOSE)
+ message(STATUS "${lib} soname: ${${lib}_SONAME}")
+ endif()
+ set(${lib}_SONAME ${${lib}_SONAME} PARENT_SCOPE)
+ endif()
+ if(arg_REQUIRED AND NOT ${lib}_SONAME)
+ message(FATAL_ERROR "Could not find dynamically loadable library ${lib}")
+ endif()
+endfunction()
diff --git a/cmake/scripts/haiku/PathSetup.cmake b/cmake/scripts/haiku/PathSetup.cmake
new file mode 100644
index 0000000..ddb4176
--- /dev/null
+++ b/cmake/scripts/haiku/PathSetup.cmake
@@ -0,0 +1,32 @@
+if(NOT prefix)
+ set(prefix ${DEPENDS_PATH})
+endif()
+if(NOT exec_prefix)
+ set(exec_prefix ${prefix})
+endif()
+if(NOT libdir)
+ set(libdir ${prefix}/lib)
+endif()
+if(NOT bindir)
+ set(bindir ${prefix}/bin)
+endif()
+if(NOT includedir)
+ set(includedir ${prefix}/include)
+endif()
+if(NOT datarootdir)
+ set(datarootdir ${prefix}/share)
+endif()
+if(NOT datadir)
+ set(datadir ${datarootdir})
+endif()
+
+list(APPEND final_message "-- PATH config --")
+list(APPEND final_message "Prefix: ${prefix}")
+list(APPEND final_message "Libdir: ${libdir}")
+list(APPEND final_message "Bindir: ${bindir}")
+list(APPEND final_message "Includedir: ${includedir}")
+list(APPEND final_message "Datarootdir: ${datarootdir}")
+list(APPEND final_message "Datadir: ${datadir}")
+
+set(PATH_DEFINES -DBIN_INSTALL_PATH=\"${libdir}/${APP_NAME_LC}\"
+ -DINSTALL_PATH=\"${datarootdir}/${APP_NAME_LC}\")
diff --git a/cmake/treedata/haiku/subdirs.txt b/cmake/treedata/haiku/subdirs.txt
new file mode 100644
index 0000000..a7433a5
--- /dev/null
+++ b/cmake/treedata/haiku/subdirs.txt
@@ -0,0 +1,14 @@
+xbmc/input/touch input/touch
+xbmc/input/touch/generic input/touch/generic
+xbmc/platform/freebsd platform/freebsd
+xbmc/platform/freebsd/network platform/freebsd/network
+xbmc/platform/linux/input platform/linux/input
+xbmc/platform/linux/peripherals platform/linux/peripherals
+xbmc/platform/linux/powermanagement platform/linux/powermanagement
+xbmc/platform/linux/sse4 platform/linux/sse4
+xbmc/platform/linux/storage platform/linux/storage
+xbmc/platform/posix platform/posix
+xbmc/platform/posix/filesystem platform/posix/filesystem
+xbmc/platform/posix/network platform/posix/network
+xbmc/platform/posix/utils platform/posix/utils
+xbmc/windowing/linux windowing/linux
diff --git a/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdNetwork.cpp b/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdNetwork.cpp
index 6208185..b246638 100644
--- a/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdNetwork.cpp
+++ b/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdNetwork.cpp
@@ -43,6 +43,10 @@
#include <ifaddrs.h>
#endif
+#ifdef __HAIKU__
+#include <sys/sockio.h>
+#endif
+
/*----------------------------------------------------------------------
| platform adaptation
+---------------------------------------------------------------------*/
diff --git a/tools/depends/native/TexturePacker/src/TexturePacker.cpp b/tools/depends/native/TexturePacker/src/TexturePacker.cpp
index 94c421a..40dc727 100644
--- a/tools/depends/native/TexturePacker/src/TexturePacker.cpp
+++ b/tools/depends/native/TexturePacker/src/TexturePacker.cpp
@@ -93,17 +93,18 @@ void CreateSkeletonHeaderImpl(CXBTFWriter& xbtfWriter,
std::string fileN = fullPath + "/" + dp->d_name;
if (stat(fileN.c_str(), &stat_p) == 0)
{
- if (dp->d_type == DT_DIR || stat_p.st_mode & S_IFDIR)
- {
- std::string tmpPath = relativePath;
- if (tmpPath.size() > 0)
- {
- tmpPath += "/";
- }
-
- CreateSkeletonHeaderImpl(xbtfWriter, fullPath + DIR_SEPARATOR + dp->d_name, tmpPath + dp->d_name);
- }
- else if (DecoderManager::IsSupportedGraphicsFile(dp->d_name))
+// if (dp->d_type == DT_DIR || stat_p.st_mode & S_IFDIR)
+// {
+// std::string tmpPath = relativePath;
+// if (tmpPath.size() > 0)
+// {
+// tmpPath += "/";
+// }
+//
+// CreateSkeletonHeaderImpl(xbtfWriter, fullPath + DIR_SEPARATOR + dp->d_name, tmpPath + dp->d_name);
+// }
+// else
+ if (DecoderManager::IsSupportedGraphicsFile(dp->d_name))
{
std::string fileName = "";
if (relativePath.size() > 0)
diff --git a/xbmc/cores/DllLoader/exports/emu_msvcrt.cpp b/xbmc/cores/DllLoader/exports/emu_msvcrt.cpp
index b7585e5..aee9776 100644
--- a/xbmc/cores/DllLoader/exports/emu_msvcrt.cpp
+++ b/xbmc/cores/DllLoader/exports/emu_msvcrt.cpp
@@ -16,13 +16,13 @@
#include <process.h>
#include <errno.h>
#else
-#if !defined(TARGET_DARWIN) && !defined(TARGET_FREEBSD)
+#if !defined(TARGET_DARWIN) && !defined(TARGET_FREEBSD) && !defined(TARGET_HAIKU)
#include <mntent.h>
#endif
#endif
#include <sys/stat.h>
#include <sys/types.h>
-#if !defined(TARGET_FREEBSD) && (!defined(TARGET_ANDROID) && defined(__LP64__))
+#if !defined(TARGET_FREEBSD) && (!defined(TARGET_ANDROID) && defined(__LP64__)) && !defined(TARGET_HAIKU)
#include <sys/timeb.h>
#endif
#ifdef HAS_DVD_DRIVE
@@ -1319,7 +1319,7 @@ extern "C"
CLog::Log(LOGWARNING, "msvcrt.dll: dll_telli64 called, TODO: add 'int64 -> long' type checking"); //warning
#ifndef TARGET_POSIX
return static_cast<long long>(tell(fd));
-#elif defined(TARGET_DARWIN) || defined(TARGET_FREEBSD) || defined(TARGET_ANDROID)
+#elif defined(TARGET_DARWIN) || defined(TARGET_FREEBSD) || defined(TARGET_ANDROID) || defined(TARGET_HAIKU)
return lseek(fd, 0, SEEK_CUR);
#else
return lseek64(fd, 0, SEEK_CUR);
@@ -1479,7 +1479,7 @@ extern "C"
int ret;
ret = dll_fgetpos64(stream, &tmpPos);
-#if !defined(TARGET_POSIX) || defined(TARGET_DARWIN) || defined(TARGET_FREEBSD) || defined(TARGET_ANDROID)
+#if !defined(TARGET_POSIX) || defined(TARGET_DARWIN) || defined(TARGET_FREEBSD) || defined(TARGET_ANDROID) || defined(TARGET_HAIKU)
*pos = (fpos_t)tmpPos;
#else
pos->__pos = (off_t)tmpPos.__pos;
@@ -1492,7 +1492,7 @@ extern "C"
CFile* pFile = g_emuFileWrapper.GetFileXbmcByStream(stream);
if (pFile != NULL)
{
-#if !defined(TARGET_POSIX) || defined(TARGET_DARWIN) || defined(TARGET_FREEBSD) || defined(TARGET_ANDROID)
+#if !defined(TARGET_POSIX) || defined(TARGET_DARWIN) || defined(TARGET_FREEBSD) || defined(TARGET_ANDROID) || defined(TARGET_HAIKU)
*pos = pFile->GetPosition();
#else
pos->__pos = pFile->GetPosition();
@@ -1508,7 +1508,7 @@ extern "C"
int fd = g_emuFileWrapper.GetDescriptorByStream(stream);
if (fd >= 0)
{
-#if !defined(TARGET_POSIX) || defined(TARGET_DARWIN) || defined(TARGET_FREEBSD) || defined(TARGET_ANDROID)
+#if !defined(TARGET_POSIX) || defined(TARGET_DARWIN) || defined(TARGET_FREEBSD) || defined(TARGET_ANDROID) || defined(TARGET_HAIKU)
if (dll_lseeki64(fd, *pos, SEEK_SET) >= 0)
#else
if (dll_lseeki64(fd, (__off64_t)pos->__pos, SEEK_SET) >= 0)
@@ -1531,7 +1531,7 @@ extern "C"
if (fd >= 0)
{
fpos64_t tmpPos;
-#if !defined(TARGET_POSIX) || defined(TARGET_DARWIN) || defined(TARGET_FREEBSD) || defined(TARGET_ANDROID)
+#if !defined(TARGET_POSIX) || defined(TARGET_DARWIN) || defined(TARGET_FREEBSD) || defined(TARGET_ANDROID) || defined(TARGET_HAIKU)
tmpPos= *pos;
#else
tmpPos.__pos = (off64_t)(pos->__pos);
diff --git a/xbmc/cores/DllLoader/exports/emu_msvcrt.h b/xbmc/cores/DllLoader/exports/emu_msvcrt.h
index 7869dc2..1faf1c3 100644
--- a/xbmc/cores/DllLoader/exports/emu_msvcrt.h
+++ b/xbmc/cores/DllLoader/exports/emu_msvcrt.h
@@ -17,7 +17,7 @@
#define _onexit_t void*
#endif
-#if defined(TARGET_DARWIN) || defined(TARGET_FREEBSD) || defined(TARGET_ANDROID)
+#if defined(TARGET_DARWIN) || defined(TARGET_FREEBSD) || defined(TARGET_ANDROID) || defined(TARGET_HAIKU)
typedef off_t __off_t;
typedef int64_t off64_t;
typedef off64_t __off64_t;
diff --git a/xbmc/cores/DllLoader/exports/wrapper.c b/xbmc/cores/DllLoader/exports/wrapper.c
index 33ab343..200b114 100644
--- a/xbmc/cores/DllLoader/exports/wrapper.c
+++ b/xbmc/cores/DllLoader/exports/wrapper.c
@@ -23,7 +23,7 @@
#include <dirent.h>
#include <dlfcn.h>
-#if defined(TARGET_DARWIN) || defined(TARGET_FREEBSD) || defined(TARGET_ANDROID)
+#if defined(TARGET_DARWIN) || defined(TARGET_FREEBSD) || defined(TARGET_ANDROID) || defined(TARGET_HAIKU)
typedef off_t __off_t;
typedef int64_t off64_t;
typedef off64_t __off64_t;
diff --git a/xbmc/music/Album.cpp b/xbmc/music/Album.cpp
index 6561632..2fd8e15 100644
--- a/xbmc/music/Album.cpp
+++ b/xbmc/music/Album.cpp
@@ -20,6 +20,8 @@
#include <algorithm>
+
+
using namespace MUSIC_INFO;
typedef struct ReleaseTypeInfo {
diff --git a/xbmc/network/TCPServer.cpp b/xbmc/network/TCPServer.cpp
index 2a40b15..4883013 100644
--- a/xbmc/network/TCPServer.cpp
+++ b/xbmc/network/TCPServer.cpp
@@ -34,7 +34,7 @@ static const uint32_t bt_service_guid[] = {0x65AE4CC0, 0x775D11E0, 0xBE16CE28, 0
#include "platform/win32/CharsetConverter.h"
#endif
-#ifdef HAVE_LIBBLUETOOTH
+#if defined(HAVE_LIBBLUETOOTH) && !defined(__HAIKU__)
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>
#include <bluetooth/sdp.h>
@@ -338,7 +338,7 @@ bool CTCPServer::InitializeBlue()
return true;
#endif
-#ifdef HAVE_LIBBLUETOOTH
+#if defined(HAVE_LIBBLUETOOTH) && !defined(__HAIKU__)
SOCKET fd = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
if (fd == INVALID_SOCKET)
@@ -478,7 +478,7 @@ void CTCPServer::Deinitialize()
m_servers.clear();
-#ifdef HAVE_LIBBLUETOOTH
+#if defined(HAVE_LIBBLUETOOTH) && !defined(__HAIKU__)
if (m_sdpd)
sdp_close((sdp_session_t*)m_sdpd);
m_sdpd = NULL;
diff --git a/xbmc/platform/haiku/CMakeLists.txt b/xbmc/platform/haiku/CMakeLists.txt
new file mode 100644
index 0000000..5e77b01
--- /dev/null
+++ b/xbmc/platform/haiku/CMakeLists.txt
@@ -0,0 +1,28 @@
+set(SOURCES CPUInfoFreebsd.cpp
+ OptionalsReg.cpp
+ ../linux/OptionalsReg.cpp
+ ../linux/TimeUtils.cpp
+ MemUtils.cpp
+ PlatformFreebsd.cpp)
+
+set(HEADERS CPUInfoFreebsd.h
+ OptionalsReg.h
+ ../linux/OptionalsReg.h
+ ../linux/TimeUtils.h
+ PlatformFreebsd.h)
+
+if(ALSA_FOUND)
+ list(APPEND SOURCES ../linux/FDEventMonitor.cpp)
+ list(APPEND HEADERS ../linux/FDEventMonitor.h)
+endif()
+
+if(DBUS_FOUND)
+ list(APPEND SOURCES ../linux/DBusMessage.cpp
+ ../linux/DBusReserve.cpp
+ ../linux/DBusUtil.cpp)
+ list(APPEND HEADERS ../linux/DBusMessage.h
+ ../linux/DBusReserve.h
+ ../linux/DBusUtil.h)
+endif()
+
+core_add_library(freebsdsupport)
diff --git a/xbmc/platform/haiku/CPUInfoFreebsd.cpp b/xbmc/platform/haiku/CPUInfoFreebsd.cpp
new file mode 100644
index 0000000..48176a1
--- /dev/null
+++ b/xbmc/platform/haiku/CPUInfoFreebsd.cpp
@@ -0,0 +1,256 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "CPUInfoFreebsd.h"
+
+#include "utils/Temperature.h"
+#include "utils/log.h"
+
+#include <array>
+#include <vector>
+
+#if defined(__i386__) || defined(__x86_64__)
+#include <cpuid.h>
+#elif __has_include(<sys/auxv.h>)
+#include <sys/auxv.h>
+#endif
+
+#include <sys/resource.h>
+#include <sys/sysctl.h>
+#include <sys/types.h>
+
+namespace
+{
+
+struct CpuData
+{
+public:
+ std::size_t GetActiveTime() const { return state[CP_USER] + state[CP_NICE] + state[CP_SYS]; }
+
+ std::size_t GetIdleTime() const { return state[CP_INTR] + state[CP_IDLE]; }
+
+ std::size_t GetTotalTime() const { return GetActiveTime() + GetIdleTime(); }
+
+ std::size_t state[CPUSTATES];
+};
+
+} // namespace
+
+std::shared_ptr<CCPUInfo> CCPUInfo::GetCPUInfo()
+{
+ return std::make_shared<CCPUInfoFreebsd>();
+}
+
+CCPUInfoFreebsd::CCPUInfoFreebsd()
+{
+ int count = 0;
+ size_t countLength = sizeof(count);
+ if (sysctlbyname("hw.ncpu", &count, &countLength, nullptr, 0) == 0)
+ m_cpuCount = count;
+ else
+ m_cpuCount = 1;
+
+ std::array<char, 512> cpuModel;
+ size_t length = cpuModel.size();
+ if (sysctlbyname("hw.model", cpuModel.data(), &length, nullptr, 0) == 0)
+ m_cpuModel = cpuModel.data();
+
+ for (size_t i = 0; i < m_cpuCount; i++)
+ {
+ CoreInfo core;
+ core.m_id = i;
+ m_cores.emplace_back(core);
+ }
+#if defined(__i386__) || defined(__x86_64__)
+ uint32_t eax, ebx, ecx, edx;
+
+ m_cpuVendor.clear();
+
+ if (__get_cpuid(CPUID_INFOTYPE_MANUFACTURER, &eax, &ebx, &ecx, &edx))
+ {
+ m_cpuVendor.append(reinterpret_cast<const char*>(&ebx), 4);
+ m_cpuVendor.append(reinterpret_cast<const char*>(&edx), 4);
+ m_cpuVendor.append(reinterpret_cast<const char*>(&ecx), 4);
+ }
+
+ if (__get_cpuid(CPUID_INFOTYPE_EXTENDED_IMPLEMENTED, &eax, &ebx, &ecx, &edx))
+ {
+ if (eax >= CPUID_INFOTYPE_PROCESSOR_3)
+ {
+ m_cpuModel.clear();
+
+ if (__get_cpuid(CPUID_INFOTYPE_PROCESSOR_1, &eax, &ebx, &ecx, &edx))
+ {
+ m_cpuModel.append(reinterpret_cast<const char*>(&eax), 4);
+ m_cpuModel.append(reinterpret_cast<const char*>(&ebx), 4);
+ m_cpuModel.append(reinterpret_cast<const char*>(&ecx), 4);
+ m_cpuModel.append(reinterpret_cast<const char*>(&edx), 4);
+ }
+
+ if (__get_cpuid(CPUID_INFOTYPE_PROCESSOR_2, &eax, &ebx, &ecx, &edx))
+ {
+ m_cpuModel.append(reinterpret_cast<const char*>(&eax), 4);
+ m_cpuModel.append(reinterpret_cast<const char*>(&ebx), 4);
+ m_cpuModel.append(reinterpret_cast<const char*>(&ecx), 4);
+ m_cpuModel.append(reinterpret_cast<const char*>(&edx), 4);
+ }
+
+ if (__get_cpuid(CPUID_INFOTYPE_PROCESSOR_3, &eax, &ebx, &ecx, &edx))
+ {
+ m_cpuModel.append(reinterpret_cast<const char*>(&eax), 4);
+ m_cpuModel.append(reinterpret_cast<const char*>(&ebx), 4);
+ m_cpuModel.append(reinterpret_cast<const char*>(&ecx), 4);
+ m_cpuModel.append(reinterpret_cast<const char*>(&edx), 4);
+ }
+ }
+ }
+
+ if (__get_cpuid(CPUID_INFOTYPE_STANDARD, &eax, &eax, &ecx, &edx))
+ {
+ if (edx & CPUID_00000001_EDX_MMX)
+ m_cpuFeatures |= CPU_FEATURE_MMX;
+
+ // Set MMX2 when SSE is present as SSE is a superset of MMX2 and Intel doesn't set the MMX2 cap
+ if (edx & CPUID_00000001_EDX_SSE)
+ m_cpuFeatures |= (CPU_FEATURE_SSE | CPU_FEATURE_MMX2);
+
+ if (edx & CPUID_00000001_EDX_SSE2)
+ m_cpuFeatures |= CPU_FEATURE_SSE2;
+
+ if (ecx & CPUID_00000001_ECX_SSE3)
+ m_cpuFeatures |= CPU_FEATURE_SSE3;
+
+ if (ecx & CPUID_00000001_ECX_SSSE3)
+ m_cpuFeatures |= CPU_FEATURE_SSSE3;
+
+ if (ecx & CPUID_00000001_ECX_SSE4)
+ m_cpuFeatures |= CPU_FEATURE_SSE4;
+
+ if (ecx & CPUID_00000001_ECX_SSE42)
+ m_cpuFeatures |= CPU_FEATURE_SSE42;
+ }
+
+ if (__get_cpuid(CPUID_INFOTYPE_EXTENDED_IMPLEMENTED, &eax, &eax, &ecx, &edx))
+ {
+ if (eax >= CPUID_INFOTYPE_EXTENDED)
+ {
+ if (edx & CPUID_80000001_EDX_MMX)
+ m_cpuFeatures |= CPU_FEATURE_MMX;
+
+ if (edx & CPUID_80000001_EDX_MMX2)
+ m_cpuFeatures |= CPU_FEATURE_MMX2;
+
+ if (edx & CPUID_80000001_EDX_3DNOW)
+ m_cpuFeatures |= CPU_FEATURE_3DNOW;
+
+ if (edx & CPUID_80000001_EDX_3DNOWEXT)
+ m_cpuFeatures |= CPU_FEATURE_3DNOWEXT;
+ }
+ }
+#endif
+
+#if defined(HAS_NEON)
+#if defined(__ARM_NEON)
+ m_cpuFeatures |= CPU_FEATURE_NEON;
+#elif __has_include(<sys/auxv.h>)
+ unsigned long hwcap = 0;
+ elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap));
+ if (hwcap & HWCAP_NEON)
+ m_cpuFeatures |= CPU_FEATURE_NEON;
+#endif
+#endif
+}
+
+int CCPUInfoFreebsd::GetUsedPercentage()
+{
+ if (!m_nextUsedReadTime.IsTimePast())
+ return m_lastUsedPercentage;
+
+ size_t len = sizeof(long);
+
+ if (sysctlbyname("kern.cp_times", nullptr, &len, nullptr, 0) != 0)
+ return false;
+
+ std::vector<long> cptimes(len);
+ size_t cptimesLength = cptimes.size();
+ if (sysctlbyname("kern.cp_times", cptimes.data(), &cptimesLength, nullptr, 0) != 0)
+ return false;
+
+ size_t activeTime{0};
+ size_t idleTime{0};
+ size_t totalTime{0};
+
+ std::vector<CpuData> cpuData;
+
+ for (size_t i = 0; i < m_cpuCount; i++)
+ {
+ CpuData info;
+
+ for (size_t state = 0; state < CPUSTATES; state++)
+ {
+ info.state[state] = cptimes[i * CPUSTATES + state];
+ }
+
+ activeTime += info.GetActiveTime();
+ idleTime += info.GetIdleTime();
+ totalTime += info.GetTotalTime();
+
+ cpuData.emplace_back(info);
+ }
+
+ activeTime -= m_activeTime;
+ idleTime -= m_idleTime;
+ totalTime -= m_totalTime;
+
+ m_activeTime += activeTime;
+ m_idleTime += idleTime;
+ m_totalTime += totalTime;
+
+ m_lastUsedPercentage = activeTime * 100.0f / totalTime;
+ m_nextUsedReadTime.Set(MINIMUM_TIME_BETWEEN_READS);
+
+ for (size_t core = 0; core < cpuData.size(); core++)
+ {
+ auto activeTime = cpuData[core].GetActiveTime() - m_cores[core].m_activeTime;
+ auto idleTime = cpuData[core].GetIdleTime() - m_cores[core].m_idleTime;
+ auto totalTime = cpuData[core].GetTotalTime() - m_cores[core].m_totalTime;
+
+ m_cores[core].m_usagePercent = activeTime * 100.0f / totalTime;
+
+ m_cores[core].m_activeTime += activeTime;
+ m_cores[core].m_idleTime += idleTime;
+ m_cores[core].m_totalTime += totalTime;
+ }
+
+ return static_cast<int>(m_lastUsedPercentage);
+}
+
+float CCPUInfoFreebsd::GetCPUFrequency()
+{
+ int hz = 0;
+ size_t len = sizeof(hz);
+ if (sysctlbyname("dev.cpu.0.freq", &hz, &len, nullptr, 0) != 0)
+ hz = 0;
+
+ return static_cast<float>(hz);
+}
+
+
+bool CCPUInfoFreebsd::GetTemperature(CTemperature& temperature)
+{
+ int value;
+ size_t len = sizeof(value);
+
+ /* Temperature is in Kelvin * 10 */
+ if (sysctlbyname("dev.cpu.0.temperature", &value, &len, nullptr, 0) != 0)
+ return CCPUInfoPosix::GetTemperature(temperature);
+ temperature = CTemperature::CreateFromKelvin(static_cast<double>(value) / 10.0);
+ temperature.SetValid(true);
+
+ return true;
+}
diff --git a/xbmc/platform/haiku/CPUInfoFreebsd.h b/xbmc/platform/haiku/CPUInfoFreebsd.h
new file mode 100644
index 0000000..f1743ce
--- /dev/null
+++ b/xbmc/platform/haiku/CPUInfoFreebsd.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#pragma once
+
+#include "utils/Temperature.h"
+
+#include "platform/posix/CPUInfoPosix.h"
+
+class CCPUInfoFreebsd : public CCPUInfoPosix
+{
+public:
+ CCPUInfoFreebsd();
+ ~CCPUInfoFreebsd() = default;
+
+ int GetUsedPercentage() override;
+ float GetCPUFrequency() override;
+ bool GetTemperature(CTemperature& temperature) override;
+};
diff --git a/xbmc/platform/haiku/MemUtils.cpp b/xbmc/platform/haiku/MemUtils.cpp
new file mode 100644
index 0000000..de3e42c
--- /dev/null
+++ b/xbmc/platform/haiku/MemUtils.cpp
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "utils/MemUtils.h"
+
+#include <array>
+#include <cstdlib>
+#include <cstring>
+#include <stdio.h>
+
+#include <unistd.h> /* FreeBSD can't write standalone headers */
+#include <sys/sysctl.h> /* FreeBSD can't write standalone headers */
+#include <sys/types.h>
+
+namespace KODI
+{
+namespace MEMORY
+{
+
+void* AlignedMalloc(size_t s, size_t alignTo)
+{
+ void* p;
+ posix_memalign(&p, alignTo, s);
+
+ return p;
+}
+
+void AlignedFree(void* p)
+{
+ free(p);
+}
+
+void GetMemoryStatus(MemoryStatus* buffer)
+{
+ if (!buffer)
+ return;
+
+ /* sysctl hw.physmem */
+ size_t len = 0;
+
+ /* physmem */
+ size_t physmem = 0;
+ len = sizeof(physmem);
+ if (sysctlbyname("hw.physmem", &physmem, &len, NULL, 0) == 0)
+ {
+ buffer->totalPhys = physmem;
+ }
+
+ /* pagesize */
+ size_t pagesize = 0;
+ len = sizeof(pagesize);
+ if (sysctlbyname("hw.pagesize", &pagesize, &len, NULL, 0) != 0)
+ pagesize = 4096;
+
+ /* mem_inactive */
+ size_t mem_inactive = 0;
+ len = sizeof(mem_inactive);
+ if (sysctlbyname("vm.stats.vm.v_inactive_count", &mem_inactive, &len, NULL, 0) == 0)
+ mem_inactive *= pagesize;
+
+ /* mem_cache */
+ size_t mem_cache = 0;
+ len = sizeof(mem_cache);
+ if (sysctlbyname("vm.stats.vm.v_cache_count", &mem_cache, &len, NULL, 0) == 0)
+ mem_cache *= pagesize;
+
+ /* mem_free */
+ size_t mem_free = 0;
+ len = sizeof(mem_free);
+ if (sysctlbyname("vm.stats.vm.v_free_count", &mem_free, &len, NULL, 0) == 0)
+ mem_free *= pagesize;
+
+ /* mem_avail = mem_inactive + mem_cache + mem_free */
+ buffer->availPhys = mem_inactive + mem_cache + mem_free;
+}
+
+}
+}
diff --git a/xbmc/platform/haiku/OptionalsReg.cpp b/xbmc/platform/haiku/OptionalsReg.cpp
new file mode 100644
index 0000000..ed414f1
--- /dev/null
+++ b/xbmc/platform/haiku/OptionalsReg.cpp
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2005-2019 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "OptionalsReg.h"
+
+
+//-----------------------------------------------------------------------------
+// OSS
+//-----------------------------------------------------------------------------
+
+#ifdef HAS_OSS
+#include "cores/AudioEngine/Sinks/AESinkOSS.h"
+bool OPTIONALS::OSSRegister()
+{
+ CAESinkOSS::Register();
+ return true;
+}
+#endif
diff --git a/xbmc/platform/haiku/OptionalsReg.h b/xbmc/platform/haiku/OptionalsReg.h
new file mode 100644
index 0000000..36837d0
--- /dev/null
+++ b/xbmc/platform/haiku/OptionalsReg.h
@@ -0,0 +1,18 @@
+/*
+ * Copyright (C) 2005-2019 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#pragma once
+
+//-----------------------------------------------------------------------------
+// OSS
+//-----------------------------------------------------------------------------
+
+namespace OPTIONALS
+{
+bool OSSRegister();
+}
diff --git a/xbmc/platform/haiku/PlatformFreebsd.cpp b/xbmc/platform/haiku/PlatformFreebsd.cpp
new file mode 100644
index 0000000..17829a9
--- /dev/null
+++ b/xbmc/platform/haiku/PlatformFreebsd.cpp
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2016-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "PlatformFreebsd.h"
+
+#include "utils/StringUtils.h"
+
+#include "platform/freebsd/OptionalsReg.h"
+#include "platform/linux/powermanagement/LinuxPowerSyscall.h"
+
+// clang-format off
+#if defined(HAS_GLES)
+#if defined(HAVE_WAYLAND)
+#include "windowing/wayland/WinSystemWaylandEGLContextGLES.h"
+#endif
+#if defined(HAVE_X11)
+#include "windowing/X11/WinSystemX11GLESContext.h"
+#endif
+#if defined(HAVE_GBM)
+#include "windowing/gbm/WinSystemGbmGLESContext.h"
+#endif
+#endif
+
+#if defined(HAS_GL)
+#if defined(HAVE_WAYLAND)
+#include "windowing/wayland/WinSystemWaylandEGLContextGL.h"
+#endif
+#if defined(HAVE_X11)
+#include "windowing/X11/WinSystemX11GLContext.h"
+#endif
+#if defined(HAVE_GBM)
+#include "windowing/gbm/WinSystemGbmGLContext.h"
+#endif
+#endif
+// clang-format on
+
+#include <cstdlib>
+
+CPlatform* CPlatform::CreateInstance()
+{
+ return new CPlatformFreebsd();
+}
+
+bool CPlatformFreebsd::Init()
+{
+ if (!CPlatformPosix::Init())
+ return false;
+
+ setenv("OS", "Linux", true); // for python scripts that check the OS
+
+#if defined(HAS_GLES)
+#if defined(HAVE_WAYLAND)
+ KODI::WINDOWING::WAYLAND::CWinSystemWaylandEGLContextGLES::Register();
+#endif
+#if defined(HAVE_X11)
+ KODI::WINDOWING::X11::CWinSystemX11GLESContext::Register();
+#endif
+#if defined(HAVE_GBM)
+ KODI::WINDOWING::GBM::CWinSystemGbmGLESContext::Register();
+#endif
+#endif
+
+#if defined(HAS_GL)
+#if defined(HAVE_WAYLAND)
+ KODI::WINDOWING::WAYLAND::CWinSystemWaylandEGLContextGL::Register();
+#endif
+#if defined(HAVE_X11)
+ KODI::WINDOWING::X11::CWinSystemX11GLContext::Register();
+#endif
+#if defined(HAVE_GBM)
+ KODI::WINDOWING::GBM::CWinSystemGbmGLContext::Register();
+#endif
+#endif
+
+ CLinuxPowerSyscall::Register();
+
+ std::string envSink;
+ if (getenv("KODI_AE_SINK"))
+ envSink = getenv("KODI_AE_SINK");
+
+ if (StringUtils::EqualsNoCase(envSink, "ALSA"))
+ {
+ OPTIONALS::ALSARegister();
+ }
+ else if (StringUtils::EqualsNoCase(envSink, "PULSE"))
+ {
+ OPTIONALS::PulseAudioRegister();
+ }
+ else if (StringUtils::EqualsNoCase(envSink, "OSS"))
+ {
+ OPTIONALS::OSSRegister();
+ }
+ else if (StringUtils::EqualsNoCase(envSink, "SNDIO"))
+ {
+ OPTIONALS::SndioRegister();
+ }
+ else if (StringUtils::EqualsNoCase(envSink, "ALSA+PULSE"))
+ {
+ OPTIONALS::ALSARegister();
+ OPTIONALS::PulseAudioRegister();
+ }
+ else
+ {
+ if (!OPTIONALS::PulseAudioRegister())
+ {
+ if (!OPTIONALS::ALSARegister())
+ {
+ if (!OPTIONALS::SndioRegister())
+ {
+ OPTIONALS::OSSRegister();
+ }
+ }
+ }
+ }
+
+ m_lirc.reset(OPTIONALS::LircRegister());
+
+ return true;
+}
diff --git a/xbmc/platform/haiku/PlatformFreebsd.h b/xbmc/platform/haiku/PlatformFreebsd.h
new file mode 100644
index 0000000..6538c04
--- /dev/null
+++ b/xbmc/platform/haiku/PlatformFreebsd.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2016-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#pragma once
+
+#include "platform/linux/OptionalsReg.h"
+#include "platform/posix/PlatformPosix.h"
+
+#include <memory>
+
+class CPlatformFreebsd : public CPlatformPosix
+{
+public:
+ CPlatformFreebsd() = default;
+ ~CPlatformFreebsd() override = default;
+
+ bool Init() override;
+
+private:
+ std::unique_ptr<OPTIONALS::CLircContainer, OPTIONALS::delete_CLircContainer> m_lirc;
+};
diff --git a/xbmc/platform/haiku/network/CMakeLists.txt b/xbmc/platform/haiku/network/CMakeLists.txt
new file mode 100644
index 0000000..25d8ee8
--- /dev/null
+++ b/xbmc/platform/haiku/network/CMakeLists.txt
@@ -0,0 +1,4 @@
+set(SOURCES NetworkFreebsd.cpp)
+set(HEADERS NetworkFreebsd.h)
+
+core_add_library(platform_freebsd_network)
diff --git a/xbmc/platform/haiku/network/NetworkFreebsd.cpp b/xbmc/platform/haiku/network/NetworkFreebsd.cpp
new file mode 100644
index 0000000..c2a533b
--- /dev/null
+++ b/xbmc/platform/haiku/network/NetworkFreebsd.cpp
@@ -0,0 +1,248 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "NetworkFreebsd.h"
+
+#include "utils/StringUtils.h"
+#include "utils/log.h"
+
+#include <errno.h>
+
+#include <arpa/inet.h>
+#include <ifaddrs.h>
+#include <net/if.h>
+#include <net/if_arp.h>
+#include <net/if_dl.h>
+#include <net/route.h>
+#include <netinet/if_ether.h>
+#include <netinet/in.h>
+#include <resolv.h>
+#include <sys/sockio.h>
+#include <sys/wait.h>
+
+#define ARRAY_SIZE(X) (sizeof(X) / sizeof((X)[0]))
+
+CNetworkInterfaceFreebsd::CNetworkInterfaceFreebsd(CNetworkPosix* network,
+ std::string interfaceName,
+ char interfaceMacAddrRaw[6])
+ : CNetworkInterfacePosix(network, interfaceName, interfaceMacAddrRaw)
+{
+}
+
+std::string CNetworkInterfaceFreebsd::GetCurrentDefaultGateway() const
+{
+ std::string result;
+
+ size_t needed;
+ int mib[6];
+ char *buf, *next, *lim;
+ char line[16];
+ struct rt_msghdr* rtm;
+ struct sockaddr* sa;
+ struct sockaddr_in* sockin;
+
+ mib[0] = CTL_NET;
+ mib[1] = PF_ROUTE;
+ mib[2] = 0;
+ mib[3] = 0;
+ mib[4] = NET_RT_DUMP;
+ mib[5] = 0;
+ if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0)
+ return result;
+
+ if ((buf = (char*)malloc(needed)) == NULL)
+ return result;
+
+ if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0)
+ {
+ free(buf);
+ return result;
+ }
+
+ lim = buf + needed;
+ for (next = buf; next < lim; next += rtm->rtm_msglen)
+ {
+ rtm = (struct rt_msghdr*)next;
+ sa = (struct sockaddr*)(rtm + 1);
+ sa = (struct sockaddr*)(SA_SIZE(sa) + (char*)sa);
+ sockin = (struct sockaddr_in*)sa;
+ if (inet_ntop(AF_INET, &sockin->sin_addr.s_addr, line, sizeof(line)) == NULL)
+ {
+ free(buf);
+ return result;
+ }
+ result = line;
+ break;
+ }
+ free(buf);
+
+ return result;
+}
+
+bool CNetworkInterfaceFreebsd::GetHostMacAddress(unsigned long host_ip, std::string& mac) const
+{
+ bool ret = false;
+ size_t needed;
+ char *buf, *next;
+ struct rt_msghdr* rtm;
+ struct sockaddr_inarp* sin;
+ struct sockaddr_dl* sdl;
+ int mib[6];
+
+ mac = "";
+
+ mib[0] = CTL_NET;
+ mib[1] = PF_ROUTE;
+ mib[2] = 0;
+ mib[3] = AF_INET;
+ mib[4] = NET_RT_FLAGS;
+ mib[5] = RTF_LLINFO;
+
+ if (sysctl(mib, ARRAY_SIZE(mib), NULL, &needed, NULL, 0) == 0)
+ {
+ buf = (char*)malloc(needed);
+ if (buf)
+ {
+ if (sysctl(mib, ARRAY_SIZE(mib), buf, &needed, NULL, 0) == 0)
+ {
+ for (next = buf; next < buf + needed; next += rtm->rtm_msglen)
+ {
+
+ rtm = (struct rt_msghdr*)next;
+ sin = (struct sockaddr_inarp*)(rtm + 1);
+ sdl = (struct sockaddr_dl*)(sin + 1);
+
+ if (host_ip != sin->sin_addr.s_addr || sdl->sdl_alen < 6)
+ continue;
+
+ u_char* cp = (u_char*)LLADDR(sdl);
+
+ mac = StringUtils::Format("%02X:%02X:%02X:%02X:%02X:%02X", cp[0], cp[1], cp[2], cp[3],
+ cp[4], cp[5]);
+ ret = true;
+ break;
+ }
+ }
+ free(buf);
+ }
+ }
+ return ret;
+}
+
+CNetworkFreebsd::CNetworkFreebsd() : CNetworkPosix()
+{
+ queryInterfaceList();
+}
+
+void CNetworkFreebsd::GetMacAddress(const std::string& interfaceName, char rawMac[6])
+{
+ memset(rawMac, 0, 6);
+
+#if !defined(IFT_ETHER)
+#define IFT_ETHER 0x6 /* Ethernet CSMACD */
+#endif
+ const struct sockaddr_dl* dlAddr = NULL;
+ const uint8_t* base = NULL;
+ // Query the list of interfaces.
+ struct ifaddrs* list;
+ struct ifaddrs* interface;
+
+ if (getifaddrs(&list) < 0)
+ {
+ return;
+ }
+
+ for (interface = list; interface != NULL; interface = interface->ifa_next)
+ {
+ if (interfaceName == interface->ifa_name)
+ {
+ if ((interface->ifa_addr->sa_family == AF_LINK) &&
+ (((const struct sockaddr_dl*)interface->ifa_addr)->sdl_type == IFT_ETHER))
+ {
+ dlAddr = (const struct sockaddr_dl*)interface->ifa_addr;
+ base = (const uint8_t*)&dlAddr->sdl_data[dlAddr->sdl_nlen];
+
+ if (dlAddr->sdl_alen > 5)
+ {
+ memcpy(rawMac, base, 6);
+ }
+ }
+ break;
+ }
+ }
+
+ freeifaddrs(list);
+}
+
+void CNetworkFreebsd::queryInterfaceList()
+{
+ char macAddrRaw[6];
+ m_interfaces.clear();
+
+ // Query the list of interfaces.
+ struct ifaddrs* list;
+ if (getifaddrs(&list) < 0)
+ return;
+
+ struct ifaddrs* cur;
+ for (cur = list; cur != NULL; cur = cur->ifa_next)
+ {
+ if (cur->ifa_addr->sa_family != AF_INET)
+ continue;
+
+ GetMacAddress(cur->ifa_name, macAddrRaw);
+
+ // only add interfaces with non-zero mac addresses
+ if (macAddrRaw[0] || macAddrRaw[1] || macAddrRaw[2] || macAddrRaw[3] || macAddrRaw[4] ||
+ macAddrRaw[5])
+ // Add the interface.
+ m_interfaces.push_back(new CNetworkInterfaceFreebsd(this, cur->ifa_name, macAddrRaw));
+ }
+
+ freeifaddrs(list);
+}
+
+std::vector<std::string> CNetworkFreebsd::GetNameServers()
+{
+ std::vector<std::string> result;
+
+ res_init();
+
+ for (int i = 0; i < _res.nscount; i++)
+ {
+ std::string ns = inet_ntoa(_res.nsaddr_list[i].sin_addr);
+ result.push_back(ns);
+ }
+
+ return result;
+}
+
+bool CNetworkFreebsd::PingHost(unsigned long remote_ip, unsigned int timeout_ms)
+{
+ char cmd_line[64];
+
+ struct in_addr host_ip;
+ host_ip.s_addr = remote_ip;
+
+ sprintf(cmd_line, "ping -c 1 -t %d %s", timeout_ms / 1000 + (timeout_ms % 1000) != 0,
+ inet_ntoa(host_ip));
+
+ int status = -1;
+ status = system(cmd_line);
+ int result = WIFEXITED(status) ? WEXITSTATUS(status) : -1;
+
+ // http://linux.about.com/od/commands/l/blcmdl8_ping.htm ;
+ // 0 reply
+ // 1 no reply
+ // else some error
+
+ if (result < 0 || result > 1)
+ CLog::Log(LOGERROR, "Ping fail : status = %d, errno = %d : '%s'", status, errno, cmd_line);
+
+ return result == 0;
+}
diff --git a/xbmc/platform/haiku/network/NetworkFreebsd.h b/xbmc/platform/haiku/network/NetworkFreebsd.h
new file mode 100644
index 0000000..585d64e
--- /dev/null
+++ b/xbmc/platform/haiku/network/NetworkFreebsd.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#pragma once
+
+#include "platform/posix/network/NetworkPosix.h"
+
+#include <string>
+#include <vector>
+
+class CNetworkInterfaceFreebsd : public CNetworkInterfacePosix
+{
+public:
+ CNetworkInterfaceFreebsd(CNetworkPosix* network,
+ std::string interfaceName,
+ char interfaceMacAddrRaw[6]);
+ ~CNetworkInterfaceFreebsd() override = default;
+
+ std::string GetCurrentDefaultGateway() const override;
+ bool GetHostMacAddress(unsigned long host, std::string& mac) const override;
+};
+
+class CNetworkFreebsd : public CNetworkPosix
+{
+public:
+ CNetworkFreebsd();
+ ~CNetworkFreebsd() override = default;
+
+ bool PingHost(unsigned long host, unsigned int timeout_ms = 2000) override;
+ std::vector<std::string> GetNameServers() override;
+
+private:
+ void GetMacAddress(const std::string& interfaceName, char macAddrRaw[6]) override;
+ void queryInterfaceList() override;
+};
+
+using CNetwork = CNetworkFreebsd;
diff --git a/xbmc/platform/posix/PlatformDefs.h b/xbmc/platform/posix/PlatformDefs.h
index e6e59fe..03efa2e 100644
--- a/xbmc/platform/posix/PlatformDefs.h
+++ b/xbmc/platform/posix/PlatformDefs.h
@@ -30,8 +30,13 @@
#elif defined(TARGET_FREEBSD)
#include <stdio.h>
#include <sys/sysctl.h>
-#else
-#include <sys/sysinfo.h>
+//#else
+//#include <sys/sysinfo.h>
+#endif
+
+#if defined(TARGET_HAIKU)
+#include <stdio.h>
+#include <sched.h>
#endif
#include <sys/time.h>
@@ -105,7 +110,7 @@ typedef int (*LPTHREAD_START_ROUTINE)(void *);
#define _O_RDONLY O_RDONLY
#define _O_WRONLY O_WRONLY
-#if defined(TARGET_DARWIN) || defined(TARGET_FREEBSD)
+#if defined(TARGET_DARWIN) || defined(TARGET_FREEBSD) || defined(TARGET_HAIKU)
#define stat64 stat
#define __stat64 stat
#define fstat64 fstat
diff --git a/xbmc/platform/posix/network/NetworkPosix.h b/xbmc/platform/posix/network/NetworkPosix.h
index be807a2..d639ff3 100644
--- a/xbmc/platform/posix/network/NetworkPosix.h
+++ b/xbmc/platform/posix/network/NetworkPosix.h
@@ -64,6 +64,8 @@ private:
#include "platform/linux/network/NetworkLinux.h"
#elif defined(HAS_FREEBSD_NETWORK)
#include "platform/freebsd/network/NetworkFreebsd.h"
+#elif defined(__HAIKU__)
+#include "platform/haiku/network/NetworkFreebsd.h"
#elif defined(HAS_OSX_NETWORK)
#include "platform/darwin/osx/network/NetworkOsx.h"
#endif
--
2.30.0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment