Last active
March 5, 2021 09:39
-
-
Save extrowerk/6c5a56edfdce8e0cd782755be854ce33 to your computer and use it in GitHub Desktop.
Kodi git patches
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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