From d3101e094d71b0c8e7422e73cb9af4fb9fb71c03 Mon Sep 17 00:00:00 2001 From: Puru Date: Thu, 30 Sep 2021 19:27:10 -0300 Subject: [PATCH 01/10] bitcoin-cli.cpp: Use symbolic constant for exit code --- src/pivx-cli.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pivx-cli.cpp b/src/pivx-cli.cpp index d815df8d73a5f..b5f8cfa020f3f 100644 --- a/src/pivx-cli.cpp +++ b/src/pivx-cli.cpp @@ -335,7 +335,7 @@ int main(int argc, char* argv[]) SetupEnvironment(); if (!SetupNetworking()) { fprintf(stderr, "Error: Initializing networking failed\n"); - exit(1); + return EXIT_FAILURE; } try { From c3d4575f6425549710d935aa51b6fe274be45a0c Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Thu, 30 Sep 2021 19:34:20 -0300 Subject: [PATCH 02/10] bitcoin-cli: More detailed error reporting Register a evhttp error handler to get a more detailed error message if the HTTP request fails. Coming from btc@381826dfee6258accafac29eef93ad264a90aaf6 --- src/pivx-cli.cpp | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/src/pivx-cli.cpp b/src/pivx-cli.cpp index b5f8cfa020f3f..af14e573db737 100644 --- a/src/pivx-cli.cpp +++ b/src/pivx-cli.cpp @@ -119,17 +119,40 @@ static bool AppInitRPC(int argc, char* argv[]) /** Reply structure for request_done to fill in */ struct HTTPReply { + HTTPReply(): status(0), error(-1) {} + int status; + int error; std::string body; }; +const char *http_errorstring(int code) +{ + switch(code) { + case EVREQ_HTTP_TIMEOUT: + return "timeout reached"; + case EVREQ_HTTP_EOF: + return "EOF reached"; + case EVREQ_HTTP_INVALID_HEADER: + return "error while reading header, or invalid header"; + case EVREQ_HTTP_BUFFER_ERROR: + return "error encountered while reading or writing"; + case EVREQ_HTTP_REQUEST_CANCEL: + return "request was canceled"; + case EVREQ_HTTP_DATA_TOO_LONG: + return "response body is larger than allowed"; + default: + return "unknown"; + } +} + static void http_request_done(struct evhttp_request *req, void *ctx) { HTTPReply *reply = static_cast(ctx); if (req == NULL) { - /* If req is NULL, it means an error occurred while connecting, but - * I'm not sure how to find out which one. We also don't really care. + /* If req is NULL, it means an error occurred while connecting: the + * error code will have been passed to http_error_cb. */ reply->status = 0; return; @@ -148,6 +171,12 @@ static void http_request_done(struct evhttp_request *req, void *ctx) } } +static void http_error_cb(enum evhttp_request_error err, void *ctx) +{ + HTTPReply *reply = static_cast(ctx); + reply->error = err; +} + UniValue CallRPC(const std::string& strMethod, const UniValue& params) { std::string host = gArgs.GetArg("-rpcconnect", DEFAULT_RPCCONNECT); @@ -168,6 +197,7 @@ UniValue CallRPC(const std::string& strMethod, const UniValue& params) struct evhttp_request *req = evhttp_request_new(http_request_done, (void*)&response); // TODO RAII if (req == NULL) throw std::runtime_error("create http request failed"); + evhttp_request_set_error_cb(req, http_error_cb); // Get credentials std::string strRPCUserColonPass; @@ -219,7 +249,7 @@ UniValue CallRPC(const std::string& strMethod, const UniValue& params) event_base_free(base); if (response.status == 0) - throw CConnectionFailed("couldn't connect to server"); + throw CConnectionFailed(strprintf("couldn't connect to server (%d %s)", response.error, http_errorstring(response.error))); else if (response.status == HTTP_UNAUTHORIZED) throw std::runtime_error("incorrect rpcuser or rpcpassword (authorization failed)"); else if (response.status >= 400 && response.status != HTTP_BAD_REQUEST && response.status != HTTP_NOT_FOUND && response.status != HTTP_INTERNAL_SERVER_ERROR) From 78584a8f5c5d0189f63c2c07bb43279ee6974750 Mon Sep 17 00:00:00 2001 From: furszy Date: Thu, 30 Sep 2021 19:38:11 -0300 Subject: [PATCH 03/10] pivx-cli: Make error message less confusing Mix of btc@8f329f991bc81ddcfb4f51574e2003edde14e996 and btc@fe37fbe606f099e81c693fae248c23c8f8fd5735 --- src/pivx-cli.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pivx-cli.cpp b/src/pivx-cli.cpp index af14e573db737..63a772e79ba73 100644 --- a/src/pivx-cli.cpp +++ b/src/pivx-cli.cpp @@ -249,7 +249,7 @@ UniValue CallRPC(const std::string& strMethod, const UniValue& params) event_base_free(base); if (response.status == 0) - throw CConnectionFailed(strprintf("couldn't connect to server (%d %s)", response.error, http_errorstring(response.error))); + throw CConnectionFailed(strprintf("couldn't connect to server: %s (code %d)\n(make sure server is running and you are connecting to the correct RPC port)", http_errorstring(response.error), response.error)); else if (response.status == HTTP_UNAUTHORIZED) throw std::runtime_error("incorrect rpcuser or rpcpassword (authorization failed)"); else if (response.status >= 400 && response.status != HTTP_BAD_REQUEST && response.status != HTTP_NOT_FOUND && response.status != HTTP_INTERNAL_SERVER_ERROR) From fdc0ee2cc1cce2739f6a0e67b651105c7056c573 Mon Sep 17 00:00:00 2001 From: Karl-Johan Alm Date: Tue, 20 Dec 2016 15:59:42 +0900 Subject: [PATCH 04/10] Added std::unique_ptr<> wrappers with deleters for libevent modules. --- CMakeLists.txt | 1 + src/Makefile.am | 1 + src/support/events.h | 55 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 src/support/events.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 78917f71531ba..82d8307fa545e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -180,6 +180,7 @@ source_group("BitcoinHeaders" FILES ${IMMER_HEADERS} ${EVO_HEADERS} ./src/support/cleanse.h + ./src/support/events.h ) set(SERVER_SOURCES diff --git a/src/Makefile.am b/src/Makefile.am index 354a66027a035..05965af15be57 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -273,6 +273,7 @@ BITCOIN_CORE_H = \ support/allocators/secure.h \ support/allocators/zeroafterfree.h \ support/cleanse.h \ + support/events.h \ support/lockedpool.h \ sync.h \ threadsafety.h \ diff --git a/src/support/events.h b/src/support/events.h new file mode 100644 index 0000000000000..16378086fa6ee --- /dev/null +++ b/src/support/events.h @@ -0,0 +1,55 @@ +// Copyright (c) 2016 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_SUPPORT_EVENTS_H +#define BITCOIN_SUPPORT_EVENTS_H + +#include + +#include +#include + +#define MAKE_RAII(type) \ +/* deleter */\ +struct type##_deleter {\ + void operator()(struct type* ob) {\ + type##_free(ob);\ + }\ +};\ +/* unique ptr typedef */\ +typedef std::unique_ptr raii_##type + +MAKE_RAII(event_base); +MAKE_RAII(event); +MAKE_RAII(evhttp); +MAKE_RAII(evhttp_request); +MAKE_RAII(evhttp_connection); + +raii_event_base obtain_event_base() { + auto result = raii_event_base(event_base_new()); + if (!result.get()) + throw std::runtime_error("cannot create event_base"); + return result; +} + +raii_event obtain_event(struct event_base* base, evutil_socket_t s, short events, event_callback_fn cb, void* arg) { + return raii_event(event_new(base, s, events, cb, arg)); +} + +raii_evhttp obtain_evhttp(struct event_base* base) { + return raii_evhttp(evhttp_new(base)); +} + +raii_evhttp_request obtain_evhttp_request(void(*cb)(struct evhttp_request *, void *), void *arg) { + return raii_evhttp_request(evhttp_request_new(cb, arg)); +} + +raii_evhttp_connection obtain_evhttp_connection_base(struct event_base* base, std::string host, uint16_t port) { + auto result = raii_evhttp_connection(evhttp_connection_base_new(base, NULL, host.c_str(), port)); + if (!result.get()) + throw std::runtime_error("create connection failed"); + return result; +} + +#endif // BITCOIN_SUPPORT_EVENTS_H From 2974828ebfd5994800f78d1c6b4e3e2bb813b4a9 Mon Sep 17 00:00:00 2001 From: furszy Date: Thu, 30 Sep 2021 22:13:51 -0300 Subject: [PATCH 05/10] Switched bitcoin-cli.cpp to use RAII unique pointers with deleters. Coming from btc@7f7f102b8d5024cc702e308f2ad86a4137d790f7 --- src/pivx-cli.cpp | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/src/pivx-cli.cpp b/src/pivx-cli.cpp index 63a772e79ba73..0463539958349 100644 --- a/src/pivx-cli.cpp +++ b/src/pivx-cli.cpp @@ -20,10 +20,9 @@ #include #include -#include -#include #include #include +#include "support/events.h" #include @@ -182,22 +181,18 @@ UniValue CallRPC(const std::string& strMethod, const UniValue& params) std::string host = gArgs.GetArg("-rpcconnect", DEFAULT_RPCCONNECT); int port = gArgs.GetArg("-rpcport", BaseParams().RPCPort()); - // Create event base - struct event_base *base = event_base_new(); // TODO RAII - if (!base) - throw std::runtime_error("cannot create event_base"); + // Obtain event base + raii_event_base base = obtain_event_base(); // Synchronously look up hostname - struct evhttp_connection *evcon = evhttp_connection_base_new(base, NULL, host.c_str(), port); // TODO RAII - if (evcon == NULL) - throw std::runtime_error("create connection failed"); - evhttp_connection_set_timeout(evcon, gArgs.GetArg("-rpcclienttimeout", DEFAULT_HTTP_CLIENT_TIMEOUT)); + raii_evhttp_connection evcon = obtain_evhttp_connection_base(base.get(), host, port); + evhttp_connection_set_timeout(evcon.get(), gArgs.GetArg("-rpcclienttimeout", DEFAULT_HTTP_CLIENT_TIMEOUT)); HTTPReply response; - struct evhttp_request *req = evhttp_request_new(http_request_done, (void*)&response); // TODO RAII + raii_evhttp_request req = obtain_evhttp_request(http_request_done, (void*)&response); if (req == NULL) throw std::runtime_error("create http request failed"); - evhttp_request_set_error_cb(req, http_error_cb); + evhttp_request_set_error_cb(req.get(), http_error_cb); // Get credentials std::string strRPCUserColonPass; @@ -213,7 +208,7 @@ UniValue CallRPC(const std::string& strMethod, const UniValue& params) strRPCUserColonPass = gArgs.GetArg("-rpcuser", "") + ":" + gArgs.GetArg("-rpcpassword", ""); } - struct evkeyvalq *output_headers = evhttp_request_get_output_headers(req); + struct evkeyvalq* output_headers = evhttp_request_get_output_headers(req.get()); assert(output_headers); evhttp_add_header(output_headers, "Host", host.c_str()); evhttp_add_header(output_headers, "Connection", "close"); @@ -221,7 +216,7 @@ UniValue CallRPC(const std::string& strMethod, const UniValue& params) // Attach request data std::string strRequest = JSONRPCRequestObj(strMethod, params, 1).write() + "\n"; - struct evbuffer * output_buffer = evhttp_request_get_output_buffer(req); + struct evbuffer* output_buffer = evhttp_request_get_output_buffer(req.get()); assert(output_buffer); evbuffer_add(output_buffer, strRequest.data(), strRequest.size()); @@ -237,16 +232,13 @@ UniValue CallRPC(const std::string& strMethod, const UniValue& params) throw CConnectionFailed("uri-encode failed"); } } - int r = evhttp_make_request(evcon, req, EVHTTP_REQ_POST, endpoint.c_str()); + int r = evhttp_make_request(evcon.get(), req.get(), EVHTTP_REQ_POST, "/"); + req.release(); // ownership moved to evcon in above call if (r != 0) { - evhttp_connection_free(evcon); - event_base_free(base); throw CConnectionFailed("send http request failed"); } - event_base_dispatch(base); - evhttp_connection_free(evcon); - event_base_free(base); + event_base_dispatch(base.get()); if (response.status == 0) throw CConnectionFailed(strprintf("couldn't connect to server: %s (code %d)\n(make sure server is running and you are connecting to the correct RPC port)", http_errorstring(response.error), response.error)); From 0d4e7aec9ce0228448c8ad8304bc5daaa4eff3d7 Mon Sep 17 00:00:00 2001 From: Karl-Johan Alm Date: Wed, 21 Dec 2016 13:43:49 +0900 Subject: [PATCH 06/10] Added some simple tests for the RAII-style events. --- src/Makefile.test.include | 1 + src/support/events.h | 1 + src/test/CMakeLists.txt | 1 + src/test/raii_event_tests.cpp | 86 +++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+) create mode 100644 src/test/raii_event_tests.cpp diff --git a/src/Makefile.test.include b/src/Makefile.test.include index e904d5a1ea4d8..b90631b6062bd 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -128,6 +128,7 @@ BITCOIN_TESTS =\ test/pmt_tests.cpp \ test/policyestimator_tests.cpp \ test/prevector_tests.cpp \ + test/raii_event_tests.cpp \ test/random_tests.cpp \ test/reverselock_tests.cpp \ test/rpc_tests.cpp \ diff --git a/src/support/events.h b/src/support/events.h index 16378086fa6ee..4f2f3cf9ef760 100644 --- a/src/support/events.h +++ b/src/support/events.h @@ -6,6 +6,7 @@ #define BITCOIN_SUPPORT_EVENTS_H #include +#include #include #include diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index 6345f4981ec27..5d4b726fea4dc 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -145,6 +145,7 @@ set(BITCOIN_TESTS ${CMAKE_CURRENT_SOURCE_DIR}/pmt_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/policyestimator_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/prevector_tests.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/raii_event_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/random_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/reverselock_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/rpc_tests.cpp diff --git a/src/test/raii_event_tests.cpp b/src/test/raii_event_tests.cpp new file mode 100644 index 0000000000000..14a61c9a26359 --- /dev/null +++ b/src/test/raii_event_tests.cpp @@ -0,0 +1,86 @@ +// Copyright (c) 2016 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include +#include +#include + +#include "support/events.h" + +#include "test/test_pivx.h" + +#include + +static std::map tags; +static std::map orders; +static uint16_t tagSequence = 0; + +static void* tag_malloc(size_t sz) { + void* mem = malloc(sz); + if (!mem) return mem; + tags[mem]++; + orders[mem] = tagSequence++; + return mem; +} + +static void tag_free(void* mem) { + tags[mem]--; + orders[mem] = tagSequence++; + free(mem); +} + +BOOST_FIXTURE_TEST_SUITE(raii_event_tests, BasicTestingSetup) + +BOOST_AUTO_TEST_CASE(raii_event_creation) +{ + event_set_mem_functions(tag_malloc, realloc, tag_free); + + void* base_ptr = nullptr; + { + auto base = obtain_event_base(); + base_ptr = (void*)base.get(); + BOOST_CHECK(tags[base_ptr] == 1); + } + BOOST_CHECK(tags[base_ptr] == 0); + + void* event_ptr = nullptr; + { + auto base = obtain_event_base(); + auto event = obtain_event(base.get(), -1, 0, nullptr, nullptr); + + base_ptr = (void*)base.get(); + event_ptr = (void*)event.get(); + + BOOST_CHECK(tags[base_ptr] == 1); + BOOST_CHECK(tags[event_ptr] == 1); + } + BOOST_CHECK(tags[base_ptr] == 0); + BOOST_CHECK(tags[event_ptr] == 0); + + event_set_mem_functions(malloc, realloc, free); +} + +BOOST_AUTO_TEST_CASE(raii_event_order) +{ + event_set_mem_functions(tag_malloc, realloc, tag_free); + + void* base_ptr = nullptr; + void* event_ptr = nullptr; + { + auto base = obtain_event_base(); + auto event = obtain_event(base.get(), -1, 0, nullptr, nullptr); + + base_ptr = (void*)base.get(); + event_ptr = (void*)event.get(); + + // base should have allocated before event + BOOST_CHECK(orders[base_ptr] < orders[event_ptr]); + } + // base should be freed after event + BOOST_CHECK(orders[base_ptr] > orders[event_ptr]); + + event_set_mem_functions(malloc, realloc, free); +} + +BOOST_AUTO_TEST_SUITE_END() From df47dd342eb63cb312de5368dafbdcceecfe19a9 Mon Sep 17 00:00:00 2001 From: Kalle Alm Date: Wed, 11 Jan 2017 22:50:00 +0900 Subject: [PATCH 07/10] Switched httpserver.cpp to use RAII wrapped libevents. --- src/httpserver.cpp | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/src/httpserver.cpp b/src/httpserver.cpp index 65418238a6844..54ff92d4bdfb3 100644 --- a/src/httpserver.cpp +++ b/src/httpserver.cpp @@ -22,14 +22,14 @@ #include #include -#include -#include #include #include #include #include #include +#include "support/events.h" + #ifdef EVENT__HAVE_NETINET_IN_H #include #ifdef _XOPEN_SOURCE_EXTENDED @@ -354,9 +354,6 @@ static void libevent_log_cb(int severity, const char *msg) bool InitHTTPServer() { - struct evhttp* http = 0; - struct event_base* base = 0; - if (!InitHTTPAllowList()) return false; @@ -382,17 +379,13 @@ bool InitHTTPServer() evthread_use_pthreads(); #endif - base = event_base_new(); // XXX RAII - if (!base) { - LogPrintf("Couldn't create an event_base: exiting\n"); - return false; - } + raii_event_base base_ctr = obtain_event_base(); /* Create a new evhttp object to handle requests. */ - http = evhttp_new(base); // XXX RAII + raii_evhttp http_ctr = obtain_evhttp(base_ctr.get()); + struct evhttp* http = http_ctr.get(); if (!http) { LogPrintf("couldn't create evhttp. Exiting.\n"); - event_base_free(base); return false; } @@ -403,8 +396,6 @@ bool InitHTTPServer() if (!HTTPBindAddresses(http)) { LogPrintf("Unable to bind any endpoint for RPC server\n"); - evhttp_free(http); - event_base_free(base); return false; } @@ -413,8 +404,9 @@ bool InitHTTPServer() LogPrintf("HTTP: creating work queue of depth %d\n", workQueueDepth); workQueue = new WorkQueue(workQueueDepth); - eventBase = base; - eventHTTP = http; + // tranfer ownership to eventBase/HTTP via .release() + eventBase = base_ctr.release(); + eventHTTP = http_ctr.release(); return true; } From e370b123a66977f177acefc04c52c22295078d8a Mon Sep 17 00:00:00 2001 From: Karl-Johan Alm Date: Fri, 14 Apr 2017 13:40:07 +0900 Subject: [PATCH 08/10] Changed event RAII helper functions to inline to deal with duplicate symbol linker errors. --- src/support/events.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/support/events.h b/src/support/events.h index 4f2f3cf9ef760..90690876eee05 100644 --- a/src/support/events.h +++ b/src/support/events.h @@ -27,26 +27,26 @@ MAKE_RAII(evhttp); MAKE_RAII(evhttp_request); MAKE_RAII(evhttp_connection); -raii_event_base obtain_event_base() { +inline raii_event_base obtain_event_base() { auto result = raii_event_base(event_base_new()); if (!result.get()) throw std::runtime_error("cannot create event_base"); return result; } -raii_event obtain_event(struct event_base* base, evutil_socket_t s, short events, event_callback_fn cb, void* arg) { +inline raii_event obtain_event(struct event_base* base, evutil_socket_t s, short events, event_callback_fn cb, void* arg) { return raii_event(event_new(base, s, events, cb, arg)); } -raii_evhttp obtain_evhttp(struct event_base* base) { +inline raii_evhttp obtain_evhttp(struct event_base* base) { return raii_evhttp(evhttp_new(base)); } -raii_evhttp_request obtain_evhttp_request(void(*cb)(struct evhttp_request *, void *), void *arg) { +inline raii_evhttp_request obtain_evhttp_request(void(*cb)(struct evhttp_request *, void *), void *arg) { return raii_evhttp_request(evhttp_request_new(cb, arg)); } -raii_evhttp_connection obtain_evhttp_connection_base(struct event_base* base, std::string host, uint16_t port) { +inline raii_evhttp_connection obtain_evhttp_connection_base(struct event_base* base, std::string host, uint16_t port) { auto result = raii_evhttp_connection(evhttp_connection_base_new(base, NULL, host.c_str(), port)); if (!result.get()) throw std::runtime_error("create connection failed"); From 3b8077e016403aeb215cdcc77adf8e653b89f865 Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Sat, 28 Jan 2017 08:03:57 +0000 Subject: [PATCH 09/10] Skip RAII event tests if libevent is built without event_set_mem_functions --- src/test/raii_event_tests.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test/raii_event_tests.cpp b/src/test/raii_event_tests.cpp index 14a61c9a26359..036c42e24d447 100644 --- a/src/test/raii_event_tests.cpp +++ b/src/test/raii_event_tests.cpp @@ -3,6 +3,10 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include + +#ifdef EVENT_SET_MEM_FUNCTIONS_IMPLEMENTED +// It would probably be ideal to define dummy test(s) that report skipped, but boost::test doesn't seem to make that practical (at least not in versions available with common distros) + #include #include @@ -84,3 +88,5 @@ BOOST_AUTO_TEST_CASE(raii_event_order) } BOOST_AUTO_TEST_SUITE_END() + +#endif // EVENT_SET_MEM_FUNCTIONS_IMPLEMENTED From b4de8aa9998a7542cd33463122c5734be64c9662 Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Thu, 30 Sep 2021 22:38:11 -0300 Subject: [PATCH 10/10] cli: Ignore libevent warnings --- src/pivx-cli.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/pivx-cli.cpp b/src/pivx-cli.cpp index 0463539958349..80d68c03a3836 100644 --- a/src/pivx-cli.cpp +++ b/src/pivx-cli.cpp @@ -52,6 +52,18 @@ std::string HelpMessageCli() return strUsage; } +/** libevent event log callback */ +static void libevent_log_cb(int severity, const char *msg) +{ +#ifndef EVENT_LOG_ERR // EVENT_LOG_ERR was added in 2.0.19; but before then _EVENT_LOG_ERR existed. +# define EVENT_LOG_ERR _EVENT_LOG_ERR +#endif + // Ignore everything other than errors + if (severity >= EVENT_LOG_ERR) { + throw std::runtime_error(strprintf("libevent error: %s", msg)); + } +} + ////////////////////////////////////////////////////////////////////////////// // // Start @@ -359,6 +371,7 @@ int main(int argc, char* argv[]) fprintf(stderr, "Error: Initializing networking failed\n"); return EXIT_FAILURE; } + event_set_log_callback(&libevent_log_cb); try { if (!AppInitRPC(argc, argv))