From 163be8a6d0d4cb73fd2e45a7ec34db756d6a46f7 Mon Sep 17 00:00:00 2001 From: vogel76 Date: Mon, 3 Mar 2014 11:30:23 +0100 Subject: [PATCH 01/14] [BW]: [NIP] Added public_key::to_base58 text conversion to simplify contact display_name generation at bts side. --- include/fc/crypto/elliptic.hpp | 4 ++++ src/crypto/elliptic.cpp | 17 ++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/include/fc/crypto/elliptic.hpp b/include/fc/crypto/elliptic.hpp index d507051..ac411a0 100644 --- a/include/fc/crypto/elliptic.hpp +++ b/include/fc/crypto/elliptic.hpp @@ -57,6 +57,10 @@ namespace fc { { return a.serialize() != b.serialize(); } + + /// Allows to convert current public key object into base58 number. + std::string to_base58() const; + private: friend class private_key; fc::fwd my; diff --git a/src/crypto/elliptic.cpp b/src/crypto/elliptic.cpp index 9654096..dda84f2 100644 --- a/src/crypto/elliptic.cpp +++ b/src/crypto/elliptic.cpp @@ -1,8 +1,12 @@ #include + +#include +#include + #include #include #include -#include + #include namespace fc { namespace ecc { @@ -257,6 +261,17 @@ namespace fc { namespace ecc { } FC_RETHROW_EXCEPTIONS( debug, "digest: ${digest}", ("digest",digest) ); } + std::string public_key::to_base58() const + { + public_key_data key = serialize(); + uint32_t check = uint32_t(city_hash64(key.data, sizeof(key))); + assert(key.size() + sizeof(check) == 37); + array data; + memcpy(data.data, key.begin(), key.size()); + memcpy(data.begin() + key.size(), (const char*)&check, sizeof(check)); + return fc::to_base58(data.begin(), data.size()); + } + private_key::private_key() {} From f5249dc2d62767bac895fd2d87a5b8489142eac0 Mon Sep 17 00:00:00 2001 From: vogel76 Date: Tue, 4 Mar 2014 18:23:35 +0100 Subject: [PATCH 02/14] [BW]: [Ign] Workaround for missing template aliasing feature in VS 2012 to make bts_wallet compiling. --- include/fc/signals.hpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/include/fc/signals.hpp b/include/fc/signals.hpp index 82f8a04..a322c1e 100644 --- a/include/fc/signals.hpp +++ b/include/fc/signals.hpp @@ -8,6 +8,17 @@ namespace fc { template using signal = boost::signals2::signal; #else + /** Workaround for missing Template Aliases feature in the VS 2012. + \warning Class defined below cannot have defined constructor (even base class has it) + since it is impossible to reference directly template class arguments outside this class. + This code will work until someone will use non-default constructor as it is defined in + boost::signals2::signal. + */ + template + class signal : public boost::signals2::signal + { + public: + }; #endif template From 07ba2d6d95db2fe437f37da7c9f931a9cf22191b Mon Sep 17 00:00:00 2001 From: vogel76 Date: Sat, 8 Mar 2014 03:20:09 +0100 Subject: [PATCH 03/14] [BW]: [Fix] Include directories shall be specified through target_include_directories not just include_directories call. --- CMakeLists.txt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index df294ed..e770c0c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,10 +57,6 @@ ELSE(WIN32) SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.so") - include_directories( ${Boost_INCLUDE_DIR} ) - include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/vendor/salsa20 ) - include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/include ) - include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/vendor/easylzma/src ) IF(NOT APPLE ) # then unix # Unix build: SET(SALSA_SRC vendor/salsa20/salsa20.s) @@ -174,7 +170,7 @@ IF(WIN32) # Needed to disable MSVC autolinking feature (#pragma comment) BOOST_ALL_NO_LIB ) - # Activate C++ exception handling inc. SEH to catch GPFs + # Activate C++ exception handling with SEH to allow catch GPFs target_compile_options(fc PUBLIC /EHa) ELSE() SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -Wall" ) From fdbaf88e5e30b95be85c08f8c4cc2857420a62d9 Mon Sep 17 00:00:00 2001 From: Eric Frias Date: Sat, 8 Mar 2014 18:48:19 -0500 Subject: [PATCH 04/14] Provide a way to intercept Win32 structured exceptions in async tasks Something about the stacks created by boost::context prevents global structured exception handlers from being called. This allows the user to register a handler which will be called when there is an unhandled structured exception in async task. --- CMakeLists.txt | 4 ++-- include/fc/thread/task.hpp | 2 ++ include/fc/thread/thread.hpp | 24 ++++++++++++++++++++++++ src/thread/task.cpp | 16 ++++++++++++++++ src/thread/thread.cpp | 18 ++++++++++++++++-- 5 files changed, 60 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index df294ed..bcef70b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -174,8 +174,8 @@ IF(WIN32) # Needed to disable MSVC autolinking feature (#pragma comment) BOOST_ALL_NO_LIB ) - # Activate C++ exception handling inc. SEH to catch GPFs - target_compile_options(fc PUBLIC /EHa) + # Activate C++ exception handling, assume extern C calls don't throw + target_compile_options(fc PUBLIC /EHsc) ELSE() SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -Wall" ) diff --git a/include/fc/thread/task.hpp b/include/fc/thread/task.hpp index 664a5db..5c1b30e 100644 --- a/include/fc/thread/task.hpp +++ b/include/fc/thread/task.hpp @@ -33,6 +33,8 @@ namespace fc { void* _functor; void (*_destroy_functor)(void*); void (*_run_functor)(void*, void* ); + + void run_impl(); }; namespace detail { diff --git a/include/fc/thread/thread.hpp b/include/fc/thread/thread.hpp index eec4f72..ec0f029 100644 --- a/include/fc/thread/thread.hpp +++ b/include/fc/thread/thread.hpp @@ -175,5 +175,29 @@ namespace fc { auto async( Functor&& f, const char* desc ="", priority prio = priority()) -> fc::future { return fc::thread::current().async( fc::forward(f), desc, prio ); } + +} // end namespace fc + +#ifdef _MSC_VER +struct _EXCEPTION_POINTERS; + +namespace fc { + /* There's something about the setup of the stacks created for fc::async tasks + * that screws up the global structured exception filters installed by + * SetUnhandledExceptionFilter(). The only way I've found to catch an + * unhaldned structured exception thrown in an async task is to put a + * __try/__except block inside the async task. + * We do just that, and if a SEH escapes outside the function running + * in the async task, fc will call an exception filter privided by + * set_unhandled_structured_exception_filter(), passing as arguments + * the result of GetExceptionCode() and GetExceptionInformation(). + * + * Right now there is only one global exception filter, used for any + * async task. + */ + typedef int (*unhandled_exception_filter_type)(unsigned, _EXCEPTION_POINTERS*); + void set_unhandled_structured_exception_filter(unhandled_exception_filter_type new_filter); + unhandled_exception_filter_type get_unhandled_structured_exception_filter(); +#endif } diff --git a/src/thread/task.cpp b/src/thread/task.cpp index b963f2c..98edbd3 100644 --- a/src/thread/task.cpp +++ b/src/thread/task.cpp @@ -7,6 +7,11 @@ #include #include +#ifdef _MSC_VER +# include +# include +#endif + namespace fc { task_base::task_base(void* func) : @@ -18,6 +23,17 @@ namespace fc { } void task_base::run() { +#ifdef _MSC_VER + __try { +#endif + run_impl(); +#ifdef _MSC_VER + } __except (get_unhandled_structured_exception_filter() ? get_unhandled_structured_exception_filter()(GetExceptionCode(), GetExceptionInformation()) : EXCEPTION_CONTINUE_SEARCH) { + ExitProcess(1); + } +#endif + } + void task_base::run_impl() { try { _run_functor( _functor, _promise_impl ); } diff --git a/src/thread/thread.cpp b/src/thread/thread.cpp index 0a929eb..3ab54f6 100644 --- a/src/thread/thread.cpp +++ b/src/thread/thread.cpp @@ -381,5 +381,19 @@ namespace fc { return this == ¤t(); } - -} +#ifdef _MSC_VER + /* support for providing a structured exception handler for async tasks */ + namespace detail + { + unhandled_exception_filter_type unhandled_structured_exception_filter = nullptr; + } + void set_unhandled_structured_exception_filter(unhandled_exception_filter_type new_filter) + { + detail::unhandled_structured_exception_filter = new_filter; + } + unhandled_exception_filter_type get_unhandled_structured_exception_filter() + { + return detail::unhandled_structured_exception_filter; + } +#endif // _MSC_VER +} // end namespace fc From 8b732263120b10d5246bef64df72efdbef25f820 Mon Sep 17 00:00:00 2001 From: HackFisher Date: Sun, 9 Mar 2014 16:18:00 +0800 Subject: [PATCH 05/14] This should be a typo, fix it. move ">" before #endif --- include/fc/thread/thread.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/fc/thread/thread.hpp b/include/fc/thread/thread.hpp index ec0f029..e95a7d1 100644 --- a/include/fc/thread/thread.hpp +++ b/include/fc/thread/thread.hpp @@ -198,6 +198,6 @@ namespace fc { typedef int (*unhandled_exception_filter_type)(unsigned, _EXCEPTION_POINTERS*); void set_unhandled_structured_exception_filter(unhandled_exception_filter_type new_filter); unhandled_exception_filter_type get_unhandled_structured_exception_filter(); -#endif } +#endif From 4c8b63f834402bba2b14a69347da2c754bec7886 Mon Sep 17 00:00:00 2001 From: Tzadik Vanderhoof Date: Sun, 9 Mar 2014 22:17:10 -0400 Subject: [PATCH 06/14] ignores --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 25103bf..bbccfeb 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,4 @@ libfc_debug.a fc_automoc.cpp *.swp +GitSHA3.cpp From e04d544016a61978ae7ed624058d76e972653df3 Mon Sep 17 00:00:00 2001 From: Eric Frias Date: Mon, 10 Mar 2014 17:37:38 -0400 Subject: [PATCH 07/14] Remove erroneous assert in fc::thread_d::check_for_timeouts() I believe this assert was being triggered when the only task on a thread did a fc::usleep (it might only have been when the sleep was of very short duration). --- src/thread/thread_d.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/thread/thread_d.hpp b/src/thread/thread_d.hpp index 9a93867..a23d922 100644 --- a/src/thread/thread_d.hpp +++ b/src/thread/thread_d.hpp @@ -430,9 +430,9 @@ namespace fc { else { //ilog( "..." ); - FC_ASSERT( c != current ) //ilog( "ready_push_front" ); - ready_push_front( c ); + if (c != current) + ready_push_front( c ); } } return time_point::min(); From a7b579e4e855eff2b330b8304a88f7220fed4231 Mon Sep 17 00:00:00 2001 From: Daniel Larimer Date: Mon, 10 Mar 2014 22:22:31 -0400 Subject: [PATCH 08/14] adding api helper --- include/fc/string.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/include/fc/string.hpp b/include/fc/string.hpp index 5afeb9f..df2cac8 100644 --- a/include/fc/string.hpp +++ b/include/fc/string.hpp @@ -15,6 +15,7 @@ namespace fc fc::string to_string( double ); fc::string to_string( uint64_t ); fc::string to_string( int64_t ); + fc::string to_string( uint16_t ); typedef fc::optional ostring; class variant_object; From b83a49298eeb976ffc7473aa27719aca584d7925 Mon Sep 17 00:00:00 2001 From: Daniel Larimer Date: Tue, 11 Mar 2014 11:29:29 -0400 Subject: [PATCH 09/14] adding extra to_string --- CMakeLists.txt | 4 ++-- src/string.cpp | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c7e2fab..64ffec6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,9 +66,9 @@ ELSE(WIN32) ENDIF(WIN32) -FIND_PACKAGE( OpenSSL ) +find_package( OpenSSL ) -SET (CMAKE_FIND_LIBRARY_SUFFIXES ${ORIGINAL_LIB_SUFFIXES}) +set( CMAKE_FIND_LIBRARY_SUFFIXES ${ORIGINAL_LIB_SUFFIXES} ) option( UNITY_BUILD OFF ) diff --git a/src/string.cpp b/src/string.cpp index ce79a9c..d09ab2f 100644 --- a/src/string.cpp +++ b/src/string.cpp @@ -98,6 +98,10 @@ namespace fc { { return boost::lexical_cast(d); } + fc::string to_string( uint16_t d) + { + return boost::lexical_cast(d); + } std::string trim( const std::string& s ) { std::string cpy(s); From d3c2f60fe0254ff8404506f0478321d56a63d60d Mon Sep 17 00:00:00 2001 From: Daniel Larimer Date: Thu, 13 Mar 2014 20:04:47 -0400 Subject: [PATCH 10/14] adding extra operators --- include/fc/io/varint.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/fc/io/varint.hpp b/include/fc/io/varint.hpp index f3c49ad..ddc1c73 100644 --- a/include/fc/io/varint.hpp +++ b/include/fc/io/varint.hpp @@ -21,6 +21,10 @@ struct unsigned_int { friend bool operator==( const unsigned_int& i, const uint32_t& v ) { return v == i.value; } friend bool operator!=( const unsigned_int& i, const uint32_t& v ) { return v != i.value; } + friend bool operator<( const unsigned_int& i, const uint32_t& v ) { return v < i.value; } + friend bool operator>=( const unsigned_int& i, const uint32_t& v ) { return v >= i.value; } + friend bool operator<( const unsigned_int& i, const unsigned_int& v ) { return v < i.value; } + friend bool operator>=( const unsigned_int& i, const unsigned_int& v ) { return v >= i.value; } }; struct signed_int { From 0e6e86f273ed413b8abc3e510c24c51ecf453f2b Mon Sep 17 00:00:00 2001 From: Eric Frias Date: Fri, 14 Mar 2014 11:04:37 -0400 Subject: [PATCH 11/14] Make FC's CMakeLists.txt provide a list of required DLLs to projects that use it --- CMakeLists.txt | 44 ++++++++++++++-- CMakeModules/ParseLibraryList.cmake | 79 +++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+), 3 deletions(-) create mode 100644 CMakeModules/ParseLibraryList.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 64ffec6..bc73a3f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,7 +48,6 @@ IF( WIN32 ) FIND_PACKAGE(Boost 1.54 REQUIRED COMPONENTS coroutine) SET(Boost_LIBRARIES ${BOOST_LIBRARIES_TEMP} ${Boost_LIBRARIES}) ENDIF() - ELSE(WIN32) MESSAGE(STATUS "Configuring fc to build on Unix/Apple") @@ -65,7 +64,6 @@ ELSE(WIN32) ENDIF(NOT APPLE) ENDIF(WIN32) - find_package( OpenSSL ) set( CMAKE_FIND_LIBRARY_SUFFIXES ${ORIGINAL_LIB_SUFFIXES} ) @@ -162,7 +160,7 @@ list(APPEND sources ${fc_headers}) add_subdirectory( vendor/easylzma ) -setup_library( fc SOURCES ${sources} LIBRARY_TYPE STATIC ) +setup_library( fc SOURCES ${sources} LIBRARY_TYPE STATIC DONT_INSTALL_LIBRARY ) IF(WIN32) target_compile_definitions(fc PUBLIC WIN32 NOMINMAX _WIN32_WINNT=0x0501 _CRT_SECURE_NO_WARNINGS @@ -205,5 +203,45 @@ target_link_libraries( fc easylzma_static ${Boost_LIBRARIES} ${OPENSSL_LIBRARIES #add_executable( test_sleep tests/sleep.cpp ) #target_link_libraries( test_sleep fc ) +if(WIN32) + # now generate a list of the DLLs we're using to use during the install process + include (ParseLibraryList) + PARSE_LIBRARY_LIST(${Boost_LIBRARIES} + FOUND parseOk + DEBUG Boost_LIBRARIES_DEBUG + OPT Boost_LIBRARIES_RELEASE + GENERAL Boost_LIBRARIES_GENERAL) + + set(SHARED_LIBRARIES_RELEASE) + foreach(boost_import_lib ${Boost_LIBRARIES_RELEASE}) + get_filename_component(import_lib_name_root ${boost_import_lib} NAME_WE) + get_filename_component(import_lib_path ${boost_import_lib} PATH) + set(boost_dll "${import_lib_path}/${import_lib_name_root}${CMAKE_SHARED_LIBRARY_SUFFIX}") + set(SHARED_LIBRARIES_RELEASE ${SHARED_LIBRARIES_RELEASE} ${boost_dll}) + endforeach() + + + set(SHARED_LIBRARIES_DEBUG) + foreach(boost_import_lib ${Boost_LIBRARIES_DEBUG}) + get_filename_component(import_lib_name_root ${boost_import_lib} NAME_WE) + get_filename_component(import_lib_path ${boost_import_lib} PATH) + set(boost_dll "${import_lib_path}/${import_lib_name_root}${CMAKE_SHARED_LIBRARY_SUFFIX}") + set(SHARED_LIBRARIES_DEBUG ${SHARED_LIBRARIES_DEBUG} ${boost_dll}) + endforeach() + + foreach(lib ${OPENSSL_LIBRARIES}) + get_filename_component(lib_name ${lib} NAME_WE) + if (${lib_name} STREQUAL "libeay32") + get_filename_component(lib_dir ${lib} DIRECTORY) + get_filename_component(lib_bin_dir "${lib_dir}/../bin" REALPATH) + set(SHARED_LIBRARIES_DEBUG ${SHARED_LIBRARIES_DEBUG} "${lib_bin_dir}/${lib_name}${CMAKE_SHARED_LIBRARY_SUFFIX}") + set(SHARED_LIBRARIES_RELEASE ${SHARED_LIBRARIES_RELEASE} "${lib_bin_dir}/${lib_name}${CMAKE_SHARED_LIBRARY_SUFFIX}") + endif() + endforeach() + + set_property(TARGET fc PROPERTY SHARED_LIBRARIES_DEBUG ${SHARED_LIBRARIES_DEBUG}) + set_property(TARGET fc PROPERTY SHARED_LIBRARIES_RELEASE ${SHARED_LIBRARIES_RELEASE}) +endif(WIN32) + MESSAGE(STATUS "Finished fc module configuration...") diff --git a/CMakeModules/ParseLibraryList.cmake b/CMakeModules/ParseLibraryList.cmake new file mode 100644 index 0000000..e559b9d --- /dev/null +++ b/CMakeModules/ParseLibraryList.cmake @@ -0,0 +1,79 @@ +# -*- mode: cmake -*- + +# +# Shamelessly stolen from MSTK who shamelessly stole from Amanzi open source code https://software.lanl.gov/ascem/trac) +# +# PARSE_LIBRARY_LIST( +# DEBUG +# OPT +# GENERAL ) + +# CMake module +include(CMakeParseArguments) + +function(PARSE_LIBRARY_LIST) + + # Macro: _print_usage + macro(_print_usage) + message("PARSE_LIBRARY_LIST \n" + " FOUND \n" + " DEBUG \n" + " OPT \n" + " GENERAL \n" + "lib_list string to parse\n" + "FOUND flag to indicate if keywords were found\n" + "DEBUG variable containing debug libraries\n" + "OPT variable containing optimized libraries\n" + "GENERAL variable containing debug libraries\n") + + endmacro() + + # Read in args + cmake_parse_arguments(PARSE_ARGS "" "FOUND;DEBUG;OPT;GENERAL" "" ${ARGN}) + set(_parse_list "${PARSE_ARGS_UNPARSED_ARGUMENTS}") + if ( (NOT PARSE_ARGS_FOUND) OR + (NOT PARSE_ARGS_DEBUG) OR + (NOT PARSE_ARGS_OPT) OR + (NOT PARSE_ARGS_GENERAL) OR + (NOT _parse_list ) + ) + _print_usage() + message(FATAL_ERROR "Invalid arguments") + endif() + + # Now split the list + set(_debug_libs "") + set(_opt_libs "") + set(_gen_libs "") + foreach( item ${_parse_list} ) + if( ${item} MATCHES debug OR + ${item} MATCHES optimized OR + ${item} MATCHES general ) + + if( ${item} STREQUAL "debug" ) + set( mylist "_debug_libs" ) + elseif( ${item} STREQUAL "optimized" ) + set( mylist "_opt_libs" ) + elseif( ${item} STREQUAL "general" ) + set( mylist "_gen_libs" ) + endif() + else() + list( APPEND ${mylist} ${item} ) + endif() + endforeach() + + + # Now set output vairables + set(${PARSE_ARGS_DEBUG} "${_debug_libs}" PARENT_SCOPE) + set(${PARSE_ARGS_OPT} "${_opt_libs}" PARENT_SCOPE) + set(${PARSE_ARGS_GENERAL} "${_gen_libs}" PARENT_SCOPE) + + # If any of the lib lists are defined set flag to TRUE + if ( (_debug_libs) OR (_opt_libs) OR (_gen_libs) ) + set(${PARSE_ARGS_FOUND} TRUE PARENT_SCOPE) + else() + set(${PARSE_ARGS_FOUND} FALSE PARENT_SCOPE) + endif() + +endfunction(PARSE_LIBRARY_LIST) + From e4e99f98d9b4eda89507d5f721fc7233811da9c5 Mon Sep 17 00:00:00 2001 From: dnotestein Date: Fri, 14 Mar 2014 17:14:02 -0400 Subject: [PATCH 12/14] changes for installer --- CMakeLists.txt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bc73a3f..f306cee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -229,13 +229,16 @@ if(WIN32) set(SHARED_LIBRARIES_DEBUG ${SHARED_LIBRARIES_DEBUG} ${boost_dll}) endforeach() + message("openssl_libraries=${OPENSSL_LIBRARIES}") foreach(lib ${OPENSSL_LIBRARIES}) get_filename_component(lib_name ${lib} NAME_WE) if (${lib_name} STREQUAL "libeay32") get_filename_component(lib_dir ${lib} DIRECTORY) - get_filename_component(lib_bin_dir "${lib_dir}/../bin" REALPATH) - set(SHARED_LIBRARIES_DEBUG ${SHARED_LIBRARIES_DEBUG} "${lib_bin_dir}/${lib_name}${CMAKE_SHARED_LIBRARY_SUFFIX}") - set(SHARED_LIBRARIES_RELEASE ${SHARED_LIBRARIES_RELEASE} "${lib_bin_dir}/${lib_name}${CMAKE_SHARED_LIBRARY_SUFFIX}") + get_filename_component(openssl_dir "${lib_dir}/.." REALPATH) + set( eaydll "${openssl_dir}/bin/${lib_name}${CMAKE_SHARED_LIBRARY_SUFFIX}") + message( "eay=${eaydll}") + set(SHARED_LIBRARIES_DEBUG ${SHARED_LIBRARIES_DEBUG} "${eaydll}") + set(SHARED_LIBRARIES_RELEASE ${SHARED_LIBRARIES_RELEASE} "${eaydll}") endif() endforeach() From 7506790bee4b7eb9ae1fbc199bea33c0631f53b5 Mon Sep 17 00:00:00 2001 From: alt Date: Thu, 20 Mar 2014 09:27:32 +0800 Subject: [PATCH 13/14] filesystem::rename() can handle file from cross device --- src/filesystem.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/filesystem.cpp b/src/filesystem.cpp index 537706f..a95aae7 100644 --- a/src/filesystem.cpp +++ b/src/filesystem.cpp @@ -234,8 +234,13 @@ namespace fc { try { boost::filesystem::rename( boost::filesystem::path(f), boost::filesystem::path(t) ); } catch ( boost::system::system_error& e ) { - FC_THROW( "Rename from ${srcfile} to ${dstfile} failed because ${reason}", - ("srcfile",f)("dstfile",t)("reason",e.what() ) ); + try{ + boost::filesystem::copy( boost::filesystem::path(f), boost::filesystem::path(t) ); + boost::filesystem::remove( boost::filesystem::path(f)); + } catch ( boost::system::system_error& e ) { + FC_THROW( "Rename from ${srcfile} to ${dstfile} failed because ${reason}", + ("srcfile",f)("dstfile",t)("reason",e.what() ) ); + } } catch ( ... ) { FC_THROW( "Rename from ${srcfile} to ${dstfile} failed", ("srcfile",f)("dstfile",t)("inner", fc::except_str() ) ); From 9561bb651028e4650a48eb45d0ce5b89b8568e5b Mon Sep 17 00:00:00 2001 From: alt Date: Thu, 20 Mar 2014 09:37:59 +0800 Subject: [PATCH 14/14] add depend lib for libcrypt.a: libdl and libz --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f306cee..c44aab8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -194,7 +194,7 @@ target_include_directories(fc ${CMAKE_CURRENT_SOURCE_DIR}/vendor/easylzma/src ) -target_link_libraries( fc easylzma_static ${Boost_LIBRARIES} ${OPENSSL_LIBRARIES} ) +target_link_libraries( fc easylzma_static ${Boost_LIBRARIES} ${OPENSSL_LIBRARIES} ${ZLIB_LIBRARIES} ${CMAKE_DL_LIBS}) #add_executable( test_compress tests/compress.cpp ) #target_link_libraries( test_compress fc )