From 28f95eb001a47056287c8adf07c2638746ad8e48 Mon Sep 17 00:00:00 2001 From: me0wmix Date: Thu, 21 Jan 2016 11:18:26 -0700 Subject: [PATCH] OpenBSD support for Monero. --- CMakeLists.txt | 21 ++++++++++++++++----- contrib/epee/include/console_handler.h | 7 +++++++ src/blockchain_db/berkeleydb/db_bdb.cpp | 4 +++- src/common/int-util.h | 2 ++ src/crypto/crypto.cpp | 2 +- src/crypto/oaes_lib.c | 12 ++++++------ src/crypto/slow-hash.c | 2 +- src/crypto/tree-hash.c | 2 +- tests/performance_tests/performance_utils.h | 4 ++-- tests/unit_tests/slow_memmem.cpp | 4 ++-- 10 files changed, 41 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 64b9f3e62..07ccc7197 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -139,12 +139,16 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly.*|FreeBSD") set(FREEBSD TRUE) endif() -# TODO: check bsdi, NetBSD, OpenBSD, to see if they need the same FreeBSD changes +# Check if we're on OpenBSD. Compile with gcc 4.9 from packages. +# Use "env CC=egcc CXX=eg++ CPP=ecpp make release-static-64" or similar. +if(CMAKE_SYSTEM_NAME MATCHES "kOpenBSD.*|OpenBSD.*") + set(OPENBSD TRUE) +endif() + +# TODO: check bsdi, NetBSD, to see if they need the same FreeBSD changes # # elseif(CMAKE_SYSTEM_NAME MATCHES "kNetBSD.*|NetBSD.*") # set(NETBSD TRUE) -# elseif(CMAKE_SYSTEM_NAME MATCHES "kOpenBSD.*|OpenBSD.*") -# set(OPENBSD TRUE) # elseif(CMAKE_SYSTEM_NAME MATCHES ".*BSDI.*") # set(BSDI TRUE) @@ -385,11 +389,18 @@ else() endif() endif() + if(OPENBSD) + # This works around some bugs in the gcc 4.9 package as well as forces Boost to use the multithreaded libs + set(CMAKE_AR "ar") + set(CMAKE_RANLIB "ranlib") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") + endif() + set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${DEBUG_FLAGS}") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${DEBUG_FLAGS}") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${RELEASE_FLAGS}") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${RELEASE_FLAGS}") - if(STATIC AND NOT APPLE AND NOT FREEBSD) + if(STATIC AND NOT APPLE AND NOT FREEBSD AND NOT OPENBSD) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++") endif() endif() @@ -421,7 +432,7 @@ endif() include_directories(SYSTEM ${Boost_INCLUDE_DIRS}) if(MINGW) set(EXTRA_LIBRARIES mswsock;ws2_32;iphlpapi) -elseif(APPLE OR FREEBSD) +elseif(APPLE OR FREEBSD OR OPENBSD) set(EXTRA_LIBRARIES "") elseif(NOT MSVC) find_library(RT rt) diff --git a/contrib/epee/include/console_handler.h b/contrib/epee/include/console_handler.h index 685f0cc7b..5c63556ae 100644 --- a/contrib/epee/include/console_handler.h +++ b/contrib/epee/include/console_handler.h @@ -33,6 +33,9 @@ #include #include #include +#ifdef __OpenBSD__ +#include +#endif namespace epee { @@ -129,7 +132,11 @@ namespace epee bool wait_stdin_data() { #if !defined(WIN32) + #ifdef __OpenBSD__ + int stdin_fileno = fileno(stdin); + #else int stdin_fileno = ::fileno(stdin); + #endif while (m_run.load(std::memory_order_relaxed)) { diff --git a/src/blockchain_db/berkeleydb/db_bdb.cpp b/src/blockchain_db/berkeleydb/db_bdb.cpp index 1ccb6be12..02fdaba2f 100644 --- a/src/blockchain_db/berkeleydb/db_bdb.cpp +++ b/src/blockchain_db/berkeleydb/db_bdb.cpp @@ -783,9 +783,11 @@ void BlockchainBDB::open(const std::string& filename, const int db_flags) m_env->set_lk_max_locks(DB_MAX_LOCKS); m_env->set_lk_max_lockers(DB_MAX_LOCKS); m_env->set_lk_max_objects(DB_MAX_LOCKS); - + + #ifndef __OpenBSD__ //OpenBSD's DB package is too old to support this feature if(m_auto_remove_logs) m_env->log_set_config(DB_LOG_AUTO_REMOVE, 1); + #endif // last parameter left 0, files will be created with default rw access m_env->open(filename.c_str(), db_env_open_flags, 0); diff --git a/src/common/int-util.h b/src/common/int-util.h index 45ee5ef70..e9eddee9c 100644 --- a/src/common/int-util.h +++ b/src/common/int-util.h @@ -137,6 +137,7 @@ static inline uint32_t div128_32(uint64_t dividend_hi, uint64_t dividend_lo, uin static inline uint32_t ident32(uint32_t x) { return x; } static inline uint64_t ident64(uint64_t x) { return x; } +#ifndef __OpenBSD__ static inline uint32_t swap32(uint32_t x) { x = ((x & 0x00ff00ff) << 8) | ((x & 0xff00ff00) >> 8); return (x << 16) | (x >> 16); @@ -146,6 +147,7 @@ static inline uint64_t swap64(uint64_t x) { x = ((x & 0x0000ffff0000ffff) << 16) | ((x & 0xffff0000ffff0000) >> 16); return (x << 32) | (x >> 32); } +#endif #if defined(__GNUC__) #define UNUSED __attribute__((unused)) diff --git a/src/crypto/crypto.cpp b/src/crypto/crypto.cpp index 1e39a8b04..fa7b1b580 100644 --- a/src/crypto/crypto.cpp +++ b/src/crypto/crypto.cpp @@ -41,7 +41,7 @@ #include "crypto.h" #include "hash.h" -#ifndef __FreeBSD__ +#if !defined(__FreeBSD__) && !defined(__OpenBSD__) #include #else #include diff --git a/src/crypto/oaes_lib.c b/src/crypto/oaes_lib.c index c86b8caa0..7fbe96e4c 100644 --- a/src/crypto/oaes_lib.c +++ b/src/crypto/oaes_lib.c @@ -37,13 +37,13 @@ static const char _NR[] = { #include #include -// Both OS X and FreeBSD don't need malloc.h -#if !defined(__APPLE__) && !defined(__FreeBSD__) +// OS X, FreeBSD, and OpenBSD don't need malloc.h +#if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__OpenBSD__) #include #endif -// FreeBSD also doesn't need timeb.h -#ifndef __FreeBSD__ +// FreeBSD, and OpenBSD also don't need timeb.h +#if !defined(__FreeBSD__) && !defined(__OpenBSD__) #include #else #include @@ -470,7 +470,7 @@ OAES_RET oaes_sprintf( #ifdef OAES_HAVE_ISAAC static void oaes_get_seed( char buf[RANDSIZ + 1] ) { - #ifndef __FreeBSD__ + #if !defined(__FreeBSD__) && !defined(__OpenBSD__) struct timeb timer; struct tm *gmTimer; char * _test = NULL; @@ -502,7 +502,7 @@ static void oaes_get_seed( char buf[RANDSIZ + 1] ) #else static uint32_t oaes_get_seed(void) { - #ifndef __FreeBSD__ + #if !defined(__FreeBSD__) && !defined(__OpenBSD__) struct timeb timer; struct tm *gmTimer; char * _test = NULL; diff --git a/src/crypto/slow-hash.c b/src/crypto/slow-hash.c index 544083fb0..903a3792f 100644 --- a/src/crypto/slow-hash.c +++ b/src/crypto/slow-hash.c @@ -421,7 +421,7 @@ void slow_hash_allocate_state(void) hp_state = (uint8_t *) VirtualAlloc(hp_state, MEMORY, MEM_LARGE_PAGES | MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); #else -#if defined(__APPLE__) || defined(__FreeBSD__) +#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) hp_state = mmap(0, MEMORY, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, 0, 0); #else diff --git a/src/crypto/tree-hash.c b/src/crypto/tree-hash.c index e90b23841..7a128e4b0 100644 --- a/src/crypto/tree-hash.c +++ b/src/crypto/tree-hash.c @@ -34,7 +34,7 @@ #include "hash-ops.h" -#ifndef __FreeBSD__ +#if !defined(__FreeBSD__) && !defined(__OpenBSD__) #include #else #include diff --git a/tests/performance_tests/performance_utils.h b/tests/performance_tests/performance_utils.h index fc9f8612d..ba2b71740 100644 --- a/tests/performance_tests/performance_utils.h +++ b/tests/performance_tests/performance_utils.h @@ -40,7 +40,7 @@ void set_process_affinity(int core) { -#if defined (__APPLE__) || defined(__FreeBSD__) +#if defined (__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) return; #elif defined(BOOST_WINDOWS) DWORD_PTR mask = 1; @@ -62,7 +62,7 @@ void set_process_affinity(int core) void set_thread_high_priority() { -#if defined(__APPLE__) || defined(__FreeBSD__) +#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) return; #elif defined(BOOST_WINDOWS) ::SetPriorityClass(::GetCurrentProcess(), HIGH_PRIORITY_CLASS); diff --git a/tests/unit_tests/slow_memmem.cpp b/tests/unit_tests/slow_memmem.cpp index 8da58eaf4..a14e01885 100644 --- a/tests/unit_tests/slow_memmem.cpp +++ b/tests/unit_tests/slow_memmem.cpp @@ -35,8 +35,8 @@ #include #include "gtest/gtest.h" -// Both OS X and FreeBSD don't need malloc.h -#if !defined(__APPLE__) && !defined(__FreeBSD__) +// OS X, FreeBSD, and OpenBSD don't need malloc.h +#if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__OpenBSD__) #include #endif