/bitcoin/src/node/kernel_notifications.cpp
Line | Count | Source |
1 | | // Copyright (c) 2023 The Bitcoin Core developers |
2 | | // Distributed under the MIT software license, see the accompanying |
3 | | // file COPYING or http://www.opensource.org/licenses/mit-license.php. |
4 | | |
5 | | #include <node/kernel_notifications.h> |
6 | | |
7 | | #include <bitcoin-build-config.h> // IWYU pragma: keep |
8 | | |
9 | | #include <chain.h> |
10 | | #include <common/args.h> |
11 | | #include <common/system.h> |
12 | | #include <kernel/context.h> |
13 | | #include <kernel/warning.h> |
14 | | #include <logging.h> |
15 | | #include <node/abort.h> |
16 | | #include <node/interface_ui.h> |
17 | | #include <node/warnings.h> |
18 | | #include <util/check.h> |
19 | | #include <util/signalinterrupt.h> |
20 | | #include <util/strencodings.h> |
21 | | #include <util/string.h> |
22 | | #include <util/translation.h> |
23 | | |
24 | | #include <cstdint> |
25 | | #include <string> |
26 | | #include <thread> |
27 | | |
28 | | using util::ReplaceAll; |
29 | | |
30 | | static void AlertNotify(const std::string& strMessage) |
31 | 10 | { |
32 | 10 | #if HAVE_SYSTEM |
33 | 10 | std::string strCmd = gArgs.GetArg("-alertnotify", ""); |
34 | 10 | if (strCmd.empty()) return; Branch (34:9): [True: 10, False: 0]
|
35 | | |
36 | | // Alert text should be plain ascii coming from a trusted source, but to |
37 | | // be safe we first strip anything not in safeChars, then add single quotes around |
38 | | // the whole string before passing it to the shell: |
39 | 0 | std::string singleQuote("'"); |
40 | 0 | std::string safeStatus = SanitizeString(strMessage); |
41 | 0 | safeStatus = singleQuote+safeStatus+singleQuote; |
42 | 0 | ReplaceAll(strCmd, "%s", safeStatus); |
43 | |
|
44 | 0 | std::thread t(runCommand, strCmd); |
45 | 0 | t.detach(); // thread runs free |
46 | 0 | #endif |
47 | 0 | } |
48 | | |
49 | | namespace node { |
50 | | |
51 | | kernel::InterruptResult KernelNotifications::blockTip(SynchronizationState state, CBlockIndex& index) |
52 | 2.23M | { |
53 | 2.23M | { |
54 | 2.23M | LOCK(m_tip_block_mutex); |
55 | 2.23M | Assume(index.GetBlockHash() != uint256::ZERO); |
56 | 2.23M | m_tip_block = index.GetBlockHash(); |
57 | 2.23M | m_tip_block_cv.notify_all(); |
58 | 2.23M | } |
59 | | |
60 | 2.23M | uiInterface.NotifyBlockTip(state, &index); |
61 | 2.23M | if (m_stop_at_height && index.nHeight >= m_stop_at_height) { Branch (61:9): [True: 0, False: 2.23M]
Branch (61:29): [True: 0, False: 0]
|
62 | 0 | if (!m_shutdown_request()) { Branch (62:13): [True: 0, False: 0]
|
63 | 0 | LogError("Failed to send shutdown signal after reaching stop height\n"); |
64 | 0 | } |
65 | 0 | return kernel::Interrupted{}; |
66 | 0 | } |
67 | 2.23M | return {}; |
68 | 2.23M | } |
69 | | |
70 | | void KernelNotifications::headerTip(SynchronizationState state, int64_t height, int64_t timestamp, bool presync) |
71 | 2.22M | { |
72 | 2.22M | uiInterface.NotifyHeaderTip(state, height, timestamp, presync); |
73 | 2.22M | } |
74 | | |
75 | | void KernelNotifications::progress(const bilingual_str& title, int progress_percent, bool resume_possible) |
76 | 0 | { |
77 | 0 | uiInterface.ShowProgress(title.translated, progress_percent, resume_possible); |
78 | 0 | } |
79 | | |
80 | | void KernelNotifications::warningSet(kernel::Warning id, const bilingual_str& message) |
81 | 39 | { |
82 | 39 | if (m_warnings.Set(id, message)) { Branch (82:9): [True: 10, False: 29]
|
83 | 10 | AlertNotify(message.original); |
84 | 10 | } |
85 | 39 | } |
86 | | |
87 | | void KernelNotifications::warningUnset(kernel::Warning id) |
88 | 2.22M | { |
89 | 2.22M | m_warnings.Unset(id); |
90 | 2.22M | } |
91 | | |
92 | | void KernelNotifications::flushError(const bilingual_str& message) |
93 | 0 | { |
94 | 0 | AbortNode(m_shutdown_request, m_exit_status, message, &m_warnings); |
95 | 0 | } |
96 | | |
97 | | void KernelNotifications::fatalError(const bilingual_str& message) |
98 | 0 | { |
99 | 0 | node::AbortNode(m_shutdown_on_fatal_error ? m_shutdown_request : nullptr, Branch (99:21): [True: 0, False: 0]
|
100 | 0 | m_exit_status, message, &m_warnings); |
101 | 0 | } |
102 | | |
103 | | std::optional<uint256> KernelNotifications::TipBlock() |
104 | 22.1k | { |
105 | 22.1k | AssertLockHeld(m_tip_block_mutex); |
106 | 22.1k | return m_tip_block; |
107 | 22.1k | }; |
108 | | |
109 | | |
110 | | void ReadNotificationArgs(const ArgsManager& args, KernelNotifications& notifications) |
111 | 11.0k | { |
112 | 11.0k | if (auto value{args.GetIntArg("-stopatheight")}) notifications.m_stop_at_height = *value; Branch (112:14): [True: 0, False: 11.0k]
|
113 | 11.0k | } |
114 | | |
115 | | } // namespace node |