aboutsummaryrefslogtreecommitdiff
path: root/src/blocks
diff options
context:
space:
mode:
Diffstat (limited to 'src/blocks')
-rw-r--r--src/blocks/CMakeLists.txt35
-rw-r--r--src/blocks/blockexports.c87
-rw-r--r--src/blocks/blocks.cpp31
-rw-r--r--src/blocks/blocks.dat0
-rw-r--r--src/blocks/blocks.h14
5 files changed, 112 insertions, 55 deletions
diff --git a/src/blocks/CMakeLists.txt b/src/blocks/CMakeLists.txt
index bedda3b88..ebb5408cc 100644
--- a/src/blocks/CMakeLists.txt
+++ b/src/blocks/CMakeLists.txt
@@ -26,23 +26,20 @@
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-set(GENERATED_SOURCES "")
+if(APPLE)
+ add_library(blocks STATIC blockexports.c)
+ set_target_properties(blocks PROPERTIES LINKER_LANGUAGE C)
+else()
+ if(LINUX_32)
+ add_custom_command(OUTPUT blocks.o MAIN_DEPENDENCY blocks.dat COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ${CMAKE_LINKER} -m elf_i386 ${LD_RAW_FLAGS} -r -b binary -o ${CMAKE_CURRENT_BINARY_DIR}/blocks.o blocks.dat)
+ add_custom_command(OUTPUT testnet_blocks.o MAIN_DEPENDENCY testnet_blocks.dat COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ${CMAKE_LINKER} -m elf_i386 ${LD_RAW_FLAGS} -r -b binary -o ${CMAKE_CURRENT_BINARY_DIR}/testnet_blocks.o testnet_blocks.dat)
+ add_custom_command(OUTPUT stagenet_blocks.o MAIN_DEPENDENCY stagenet_blocks.dat COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ${CMAKE_LINKER} -m elf_i386 ${LD_RAW_FLAGS} -r -b binary -o ${CMAKE_CURRENT_BINARY_DIR}/stagenet_blocks.o stagenet_blocks.dat)
+ else()
+ add_custom_command(OUTPUT blocks.o MAIN_DEPENDENCY blocks.dat COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ${CMAKE_LINKER} ${LD_RAW_FLAGS} -r -b binary -o ${CMAKE_CURRENT_BINARY_DIR}/blocks.o blocks.dat)
+ add_custom_command(OUTPUT testnet_blocks.o MAIN_DEPENDENCY testnet_blocks.dat COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ${CMAKE_LINKER} ${LD_RAW_FLAGS} -r -b binary -o ${CMAKE_CURRENT_BINARY_DIR}/testnet_blocks.o testnet_blocks.dat)
+ add_custom_command(OUTPUT stagenet_blocks.o MAIN_DEPENDENCY stagenet_blocks.dat COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ${CMAKE_LINKER} ${LD_RAW_FLAGS} -r -b binary -o ${CMAKE_CURRENT_BINARY_DIR}/stagenet_blocks.o stagenet_blocks.dat)
+ endif()
+ add_library(blocks STATIC blocks.o testnet_blocks.o stagenet_blocks.o blockexports.c)
+ set_target_properties(blocks PROPERTIES LINKER_LANGUAGE C)
+endif()
-foreach(BLOB_NAME checkpoints testnet_blocks stagenet_blocks)
- set(OUTPUT_C_SOURCE "generated_${BLOB_NAME}.c")
- list(APPEND GENERATED_SOURCES ${OUTPUT_C_SOURCE})
- set(INPUT_DAT_FILE "${BLOB_NAME}.dat")
- add_custom_command(
- OUTPUT ${OUTPUT_C_SOURCE}
- MAIN_DEPENDENCY ${INPUT_DAT_FILE}
- COMMAND
- cd ${CMAKE_CURRENT_BINARY_DIR} &&
- echo "'#include\t<stddef.h>'" > ${OUTPUT_C_SOURCE} &&
- echo -n "'const\tunsigned\tchar\t${BLOB_NAME}[]={'" >> ${OUTPUT_C_SOURCE} &&
- od -v -An -w1 -tu1 ${CMAKE_CURRENT_SOURCE_DIR}/${INPUT_DAT_FILE} | sed -e "':a;N;$$!ba;s/\\n/,/g'" >> ${OUTPUT_C_SOURCE} &&
- echo "'};'" >> ${OUTPUT_C_SOURCE} &&
- echo "'const\tsize_t\t${BLOB_NAME}_len\t=\tsizeof(${BLOB_NAME});'" >> ${OUTPUT_C_SOURCE}
- )
-endforeach()
-
-add_library(blocks STATIC blocks.cpp ${GENERATED_SOURCES})
diff --git a/src/blocks/blockexports.c b/src/blocks/blockexports.c
new file mode 100644
index 000000000..0154b0413
--- /dev/null
+++ b/src/blocks/blockexports.c
@@ -0,0 +1,87 @@
+#include <stddef.h>
+
+#if defined(__APPLE__)
+#include <mach-o/getsect.h>
+#ifdef BUILD_SHARED_LIBS
+#if !defined(__LP64__)
+const struct mach_header _mh_execute_header;
+#else
+const struct mach_header_64 _mh_execute_header;
+#endif
+#else
+#if !defined(__LP64__)
+extern const struct mach_header _mh_execute_header;
+#else
+extern const struct mach_header_64 _mh_execute_header;
+#endif
+#endif
+
+const unsigned char *get_blocks_dat_start(int testnet, int stagenet)
+{
+ size_t size;
+ if (testnet)
+ return getsectiondata(&_mh_execute_header, "__DATA", "__testnet_blocks_dat", &size);
+ else if (stagenet)
+ return getsectiondata(&_mh_execute_header, "__DATA", "__stagenet_blocks_dat", &size);
+ else
+ return getsectiondata(&_mh_execute_header, "__DATA", "__blocks_dat", &size);
+}
+
+size_t get_blocks_dat_size(int testnet, int stagenet)
+{
+ size_t size;
+ if (testnet)
+ getsectiondata(&_mh_execute_header, "__DATA", "__testnet_blocks_dat", &size);
+ else if (stagenet)
+ getsectiondata(&_mh_execute_header, "__DATA", "__stagenet_blocks_dat", &size);
+ else
+ getsectiondata(&_mh_execute_header, "__DATA", "__blocks_dat", &size);
+ return size;
+}
+
+#else
+
+#if defined(_WIN32) && !defined(_WIN64)
+#define _binary_blocks_start binary_blocks_dat_start
+#define _binary_blocks_end binary_blocks_dat_end
+#define _binary_testnet_blocks_start binary_testnet_blocks_dat_start
+#define _binary_testnet_blocks_end binary_testnet_blocks_dat_end
+#define _binary_stagenet_blocks_start binary_stagenet_blocks_dat_start
+#define _binary_stagenet_blocks_end binary_stagenet_blocks_dat_end
+#else
+#define _binary_blocks_start _binary_blocks_dat_start
+#define _binary_blocks_end _binary_blocks_dat_end
+#define _binary_testnet_blocks_start _binary_testnet_blocks_dat_start
+#define _binary_testnet_blocks_end _binary_testnet_blocks_dat_end
+#define _binary_stagenet_blocks_start _binary_stagenet_blocks_dat_start
+#define _binary_stagenet_blocks_end _binary_stagenet_blocks_dat_end
+#endif
+
+extern const unsigned char _binary_blocks_start[];
+extern const unsigned char _binary_blocks_end[];
+extern const unsigned char _binary_testnet_blocks_start[];
+extern const unsigned char _binary_testnet_blocks_end[];
+extern const unsigned char _binary_stagenet_blocks_start[];
+extern const unsigned char _binary_stagenet_blocks_end[];
+
+const unsigned char *get_blocks_dat_start(int testnet, int stagenet)
+{
+ if (testnet)
+ return _binary_testnet_blocks_start;
+ else if (stagenet)
+ return _binary_stagenet_blocks_start;
+ else
+ return _binary_blocks_start;
+}
+
+size_t get_blocks_dat_size(int testnet, int stagenet)
+{
+ if (testnet)
+ return (size_t) (_binary_testnet_blocks_end - _binary_testnet_blocks_start);
+ else if (stagenet)
+ return (size_t) (_binary_stagenet_blocks_end - _binary_stagenet_blocks_start);
+ else
+ return (size_t) (_binary_blocks_end - _binary_blocks_start);
+}
+
+#endif
diff --git a/src/blocks/blocks.cpp b/src/blocks/blocks.cpp
deleted file mode 100644
index 0661f8448..000000000
--- a/src/blocks/blocks.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-#include "blocks.h"
-
-#include <unordered_map>
-
-extern const unsigned char checkpoints[];
-extern const size_t checkpoints_len;
-extern const unsigned char stagenet_blocks[];
-extern const size_t stagenet_blocks_len;
-extern const unsigned char testnet_blocks[];
-extern const size_t testnet_blocks_len;
-
-namespace blocks
-{
-
- const std::unordered_map<cryptonote::network_type, const epee::span<const unsigned char>, std::hash<size_t>> CheckpointsByNetwork = {
- {cryptonote::network_type::MAINNET, {checkpoints, checkpoints_len}},
- {cryptonote::network_type::STAGENET, {stagenet_blocks, stagenet_blocks_len}},
- {cryptonote::network_type::TESTNET, {testnet_blocks, testnet_blocks_len}}
- };
-
- const epee::span<const unsigned char> GetCheckpointsData(cryptonote::network_type network)
- {
- const auto it = CheckpointsByNetwork.find(network);
- if (it != CheckpointsByNetwork.end())
- {
- return it->second;
- }
- return nullptr;
- }
-
-}
diff --git a/src/blocks/blocks.dat b/src/blocks/blocks.dat
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/src/blocks/blocks.dat
diff --git a/src/blocks/blocks.h b/src/blocks/blocks.h
index 14e391319..ec683f47e 100644
--- a/src/blocks/blocks.h
+++ b/src/blocks/blocks.h
@@ -1,12 +1,16 @@
#ifndef SRC_BLOCKS_BLOCKS_H_
#define SRC_BLOCKS_BLOCKS_H_
-#include "cryptonote_config.h"
-#include "span.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
-namespace blocks
-{
- const epee::span<const unsigned char> GetCheckpointsData(cryptonote::network_type network);
+const unsigned char *get_blocks_dat_start(int testnet, int stagenet);
+size_t get_blocks_dat_size(int testnet, int stagenet);
+
+#ifdef __cplusplus
}
+#endif
+
#endif /* SRC_BLOCKS_BLOCKS_H_ */