@@ -174,21 +174,25 @@ class KernelNotifications : public kernel::Notifications
174174 {
175175 if (m_cbs.header_tip ) m_cbs.header_tip ((void *) m_cbs.user_data , cast_state (state), height, timestamp, presync);
176176 }
177+ void progress (const bilingual_str& title, int progress_percent, bool resume_possible) override
178+ {
179+ if (m_cbs.progress ) m_cbs.progress ((void *) m_cbs.user_data , title.original .c_str (), title.original .length (), progress_percent, resume_possible);
180+ }
177181 void warningSet (kernel::Warning id, const bilingual_str& message) override
178182 {
179- if (m_cbs.warning_set ) m_cbs.warning_set ((void *) m_cbs.user_data , cast_kernel_warning (id), message.original .c_str ());
183+ if (m_cbs.warning_set ) m_cbs.warning_set ((void *) m_cbs.user_data , cast_kernel_warning (id), message.original .c_str (), message. original . length () );
180184 }
181185 void warningUnset (kernel::Warning id) override
182186 {
183187 if (m_cbs.warning_unset ) m_cbs.warning_unset ((void *) m_cbs.user_data , cast_kernel_warning (id));
184188 }
185189 void flushError (const bilingual_str& message) override
186190 {
187- if (m_cbs.flush_error ) m_cbs.flush_error ((void *) m_cbs.user_data , message.original .c_str ());
191+ if (m_cbs.flush_error ) m_cbs.flush_error ((void *) m_cbs.user_data , message.original .c_str (), message. original . length () );
188192 }
189193 void fatalError (const bilingual_str& message) override
190194 {
191- if (m_cbs.fatal_error ) m_cbs.fatal_error ((void *) m_cbs.user_data , message.original .c_str ());
195+ if (m_cbs.fatal_error ) m_cbs.fatal_error ((void *) m_cbs.user_data , message.original .c_str (), message. original . length () );
192196 }
193197};
194198
@@ -533,22 +537,22 @@ kernel_LoggingConnection* kernel_logging_connection_create(kernel_LogCallback ca
533537 LogInstance ().m_log_sourcelocations = options.log_sourcelocations ;
534538 LogInstance ().m_always_print_category_level = options.always_print_category_levels ;
535539
536- auto connection{LogInstance ().PushBackCallback ([callback, user_data](const std::string& str) { callback ((void *) user_data, str.c_str ()); })};
540+ auto connection{LogInstance ().PushBackCallback ([callback, user_data](const std::string& str) { callback ((void *) user_data, str.c_str (), str. length () ); })};
537541
538542 try {
539543 // Only start logging if we just added the connection.
540544 if (LogInstance ().NumConnections () == 1 && !LogInstance ().StartLogging ()) {
541- LogError (" Logger start failed.\n " );
545+ LogError (" Logger start failed." );
542546 LogInstance ().DeleteCallback (connection);
543547 return nullptr ;
544548 }
545549 } catch (std::exception& e) {
546- LogError (" Logger start failed.\n " );
550+ LogError (" Logger start failed." );
547551 LogInstance ().DeleteCallback (connection);
548552 return nullptr ;
549553 }
550554
551- LogDebug (BCLog::KERNEL, " Logger connected.\n " );
555+ LogDebug (BCLog::KERNEL, " Logger connected." );
552556
553557 auto heap_connection{new std::list<std::function<void (const std::string&)>>::iterator (connection)};
554558 return reinterpret_cast <kernel_LoggingConnection*>(heap_connection);
@@ -561,7 +565,7 @@ void kernel_logging_connection_destroy(kernel_LoggingConnection* connection_)
561565 return ;
562566 }
563567
564- LogDebug (BCLog::KERNEL, " Logger disconnected.\n " );
568+ LogDebug (BCLog::KERNEL, " Logger disconnected." );
565569 LogInstance ().DeleteCallback (*connection);
566570 delete connection;
567571
@@ -641,7 +645,7 @@ kernel_Context* kernel_context_create(const kernel_ContextOptions* options_)
641645 bool sane{true };
642646 auto context{new Context{options, sane}};
643647 if (!sane) {
644- LogError (" Kernel context sanity check failed.\n " );
648+ LogError (" Kernel context sanity check failed." );
645649 delete context;
646650 return nullptr ;
647651 }
@@ -697,10 +701,10 @@ kernel_BlockValidationResult kernel_get_block_validation_result_from_block_valid
697701 assert (false );
698702}
699703
700- kernel_ChainstateManagerOptions* kernel_chainstate_manager_options_create (const kernel_Context* context_, const char * data_dir)
704+ kernel_ChainstateManagerOptions* kernel_chainstate_manager_options_create (const kernel_Context* context_, const char * data_dir, size_t data_dir_len )
701705{
702706 try {
703- fs::path abs_data_dir{fs::absolute (fs::PathFromString (data_dir))};
707+ fs::path abs_data_dir{fs::absolute (fs::PathFromString ({ data_dir, data_dir_len} ))};
704708 fs::create_directories (abs_data_dir);
705709 auto context{cast_const_context (context_)};
706710 return reinterpret_cast <kernel_ChainstateManagerOptions*>(new ChainstateManager::Options{
@@ -709,7 +713,7 @@ kernel_ChainstateManagerOptions* kernel_chainstate_manager_options_create(const
709713 .notifications = *context->m_notifications ,
710714 .signals = context->m_signals .get ()});
711715 } catch (const std::exception& e) {
712- LogError (" Failed to create chainstate manager options: %s\n " , e.what ());
716+ LogError (" Failed to create chainstate manager options: %s" , e.what ());
713717 return nullptr ;
714718 }
715719}
@@ -727,10 +731,10 @@ void kernel_chainstate_manager_options_destroy(kernel_ChainstateManagerOptions*
727731 }
728732}
729733
730- kernel_BlockManagerOptions* kernel_block_manager_options_create (const kernel_Context* context_, const char * blocks_dir)
734+ kernel_BlockManagerOptions* kernel_block_manager_options_create (const kernel_Context* context_, const char * blocks_dir, size_t blocks_dir_len )
731735{
732736 try {
733- fs::path abs_blocks_dir{fs::absolute (fs::PathFromString (blocks_dir))};
737+ fs::path abs_blocks_dir{fs::absolute (fs::PathFromString ({ blocks_dir, blocks_dir_len} ))};
734738 fs::create_directories (abs_blocks_dir);
735739 auto context{cast_const_context (context_)};
736740 if (!context) {
@@ -741,7 +745,7 @@ kernel_BlockManagerOptions* kernel_block_manager_options_create(const kernel_Con
741745 .blocks_dir = abs_blocks_dir,
742746 .notifications = *context->m_notifications });
743747 } catch (const std::exception& e) {
744- LogError (" Failed to create block manager options; %s\n " , e.what ());
748+ LogError (" Failed to create block manager options; %s" , e.what ());
745749 return nullptr ;
746750 }
747751}
@@ -765,7 +769,7 @@ kernel_ChainstateManager* kernel_chainstate_manager_create(
765769 try {
766770 return reinterpret_cast <kernel_ChainstateManager*>(new ChainstateManager{*context->m_interrupt , *chainman_opts, *blockman_opts});
767771 } catch (const std::exception& e) {
768- LogError (" Failed to create chainstate manager: %s\n " , e.what ());
772+ LogError (" Failed to create chainstate manager: %s" , e.what ());
769773 return nullptr ;
770774 }
771775}
@@ -824,7 +828,7 @@ bool kernel_chainstate_manager_load_chainstate(const kernel_Context* context_,
824828 auto & chainman{*cast_chainstate_manager (chainman_)};
825829
826830 if (chainstate_load_opts.wipe_block_tree_db && !chainstate_load_opts.wipe_chainstate_db ) {
827- LogError (" Wiping the block tree db without also wiping the chainstate db is currently unsupported.\n " );
831+ LogWarning (" Wiping the block tree db without also wiping the chainstate db is currently unsupported." );
828832 return false ;
829833 }
830834
@@ -834,24 +838,24 @@ bool kernel_chainstate_manager_load_chainstate(const kernel_Context* context_,
834838 cache_sizes.coins = (450 << 20 ) - (2 << 20 ) - (2 << 22 );
835839 auto [status, chainstate_err]{node::LoadChainstate (chainman, cache_sizes, chainstate_load_opts)};
836840 if (status != node::ChainstateLoadStatus::SUCCESS) {
837- LogError (" Failed to load chain state from your data directory: %s\n " , chainstate_err.original );
841+ LogError (" Failed to load chain state from your data directory: %s" , chainstate_err.original );
838842 return false ;
839843 }
840844 std::tie (status, chainstate_err) = node::VerifyLoadedChainstate (chainman, chainstate_load_opts);
841845 if (status != node::ChainstateLoadStatus::SUCCESS) {
842- LogError (" Failed to verify loaded chain state from your datadir: %s\n " , chainstate_err.original );
846+ LogError (" Failed to verify loaded chain state from your datadir: %s" , chainstate_err.original );
843847 return false ;
844848 }
845849
846850 for (Chainstate* chainstate : WITH_LOCK (::cs_main, return chainman.GetAll ())) {
847851 BlockValidationState state;
848852 if (!chainstate->ActivateBestChain (state, nullptr )) {
849- LogError (" Failed to connect best block: %s\n " , state.ToString ());
853+ LogError (" Failed to connect best block: %s" , state.ToString ());
850854 return false ;
851855 }
852856 }
853857 } catch (const std::exception& e) {
854- LogError (" Failed to load chainstate: %s\n " , e.what ());
858+ LogError (" Failed to load chainstate: %s" , e.what ());
855859 return false ;
856860 }
857861 return true ;
@@ -880,6 +884,7 @@ void kernel_chainstate_manager_destroy(kernel_ChainstateManager* chainman_, cons
880884bool kernel_import_blocks (const kernel_Context* context_,
881885 kernel_ChainstateManager* chainman_,
882886 const char ** block_file_paths,
887+ size_t * block_file_paths_lens,
883888 size_t block_file_paths_len)
884889{
885890 try {
@@ -888,13 +893,13 @@ bool kernel_import_blocks(const kernel_Context* context_,
888893 import_files.reserve (block_file_paths_len);
889894 for (uint32_t i = 0 ; i < block_file_paths_len; i++) {
890895 if (block_file_paths[i] != nullptr ) {
891- import_files.emplace_back (block_file_paths[i]);
896+ import_files.emplace_back (std::string{ block_file_paths[i], block_file_paths_lens[i]}. c_str () );
892897 }
893898 }
894899 node::ImportBlocks (*chainman, import_files);
895900 chainman->ActiveChainstate ().ForceFlushStateToDisk ();
896901 } catch (const std::exception& e) {
897- LogError (" Failed to import blocks: %s\n " , e.what ());
902+ LogError (" Failed to import blocks: %s" , e.what ());
898903 return false ;
899904 }
900905 return true ;
@@ -910,7 +915,7 @@ kernel_Block* kernel_block_create(const unsigned char* raw_block, size_t raw_blo
910915 stream >> TX_WITH_WITNESS (*block);
911916 } catch (const std::exception& e) {
912917 delete block;
913- LogDebug (BCLog::KERNEL, " Block decode failed.\n " );
918+ LogDebug (BCLog::KERNEL, " Block decode failed." );
914919 return nullptr ;
915920 }
916921
@@ -1001,7 +1006,7 @@ kernel_BlockIndex* kernel_get_block_index_from_hash(const kernel_Context* contex
10011006 auto hash = uint256{Span<const unsigned char >{(*block_hash).hash , 32 }};
10021007 auto block_index = WITH_LOCK (::cs_main, return chainman->m_blockman .LookupBlockIndex (hash));
10031008 if (!block_index) {
1004- LogDebug (BCLog::KERNEL, " A block with the given hash is not indexed.\n " );
1009+ LogDebug (BCLog::KERNEL, " A block with the given hash is not indexed." );
10051010 return nullptr ;
10061011 }
10071012 return reinterpret_cast <kernel_BlockIndex*>(block_index);
@@ -1014,7 +1019,7 @@ kernel_BlockIndex* kernel_get_block_index_from_height(const kernel_Context* cont
10141019 LOCK (cs_main);
10151020
10161021 if (height < 0 || height > chainman->ActiveChain ().Height ()) {
1017- LogDebug (BCLog::KERNEL, " Block height is out of range.\n " );
1022+ LogDebug (BCLog::KERNEL, " Block height is out of range." );
10181023 return nullptr ;
10191024 }
10201025 return reinterpret_cast <kernel_BlockIndex*>(chainman->ActiveChain ()[height]);
@@ -1028,7 +1033,7 @@ kernel_BlockIndex* kernel_get_next_block_index(const kernel_Context* context_, k
10281033 auto next_block_index{WITH_LOCK (::cs_main, return chainman->ActiveChain ().Next (block_index))};
10291034
10301035 if (!next_block_index) {
1031- LogTrace (BCLog::KERNEL, " The block index is the tip of the current chain, it does not have a next.\n " );
1036+ LogTrace (BCLog::KERNEL, " The block index is the tip of the current chain, it does not have a next." );
10321037 }
10331038
10341039 return reinterpret_cast <kernel_BlockIndex*>(next_block_index);
@@ -1039,7 +1044,7 @@ kernel_BlockIndex* kernel_get_previous_block_index(const kernel_BlockIndex* bloc
10391044 const CBlockIndex* block_index{cast_const_block_index (block_index_)};
10401045
10411046 if (!block_index->pprev ) {
1042- LogTrace (BCLog::KERNEL, " The block index is the genesis, it has no previous.\n " );
1047+ LogTrace (BCLog::KERNEL, " The block index is the genesis, it has no previous." );
10431048 return nullptr ;
10441049 }
10451050
@@ -1055,7 +1060,7 @@ kernel_Block* kernel_read_block_from_disk(const kernel_Context* context_,
10551060
10561061 auto block{new std::shared_ptr<CBlock>(new CBlock{})};
10571062 if (!chainman->m_blockman .ReadBlockFromDisk (**block, *block_index)) {
1058- LogError (" Failed to read block from disk.\n " );
1063+ LogError (" Failed to read block from disk." );
10591064 return nullptr ;
10601065 }
10611066 return reinterpret_cast <kernel_Block*>(block);
@@ -1069,12 +1074,12 @@ kernel_BlockUndo* kernel_read_block_undo_from_disk(const kernel_Context* context
10691074 const auto block_index{cast_const_block_index (block_index_)};
10701075
10711076 if (block_index->nHeight < 1 ) {
1072- LogError ( " The genesis block does not have undo data.\n " );
1077+ LogDebug (BCLog::KERNEL, " The genesis block does not have undo data." );
10731078 return nullptr ;
10741079 }
10751080 auto block_undo{new CBlockUndo{}};
10761081 if (!chainman->m_blockman .UndoReadFromDisk (*block_undo, *block_index)) {
1077- LogError (" Failed to read undo data from disk.\n " );
1082+ LogError (" Failed to read undo data from disk." );
10781083 return nullptr ;
10791084 }
10801085 return reinterpret_cast <kernel_BlockUndo*>(block_undo);
@@ -1112,14 +1117,14 @@ kernel_TransactionOutput* kernel_get_undo_output_by_index(const kernel_BlockUndo
11121117 const auto block_undo{cast_const_block_undo (block_undo_)};
11131118
11141119 if (transaction_undo_index >= block_undo->vtxundo .size ()) {
1115- LogInfo (" transaction undo index is out of bounds.\n " );
1120+ LogInfo (" transaction undo index is out of bounds." );
11161121 return nullptr ;
11171122 }
11181123
11191124 const auto & tx_undo = block_undo->vtxundo [transaction_undo_index];
11201125
11211126 if (output_index >= tx_undo.vprevout .size ()) {
1122- LogInfo (" previous output index is out of bounds.\n " );
1127+ LogInfo (" previous output index is out of bounds." );
11231128 return nullptr ;
11241129 }
11251130
0 commit comments