cpp: Do not close stdout/stderr when destroying EditInteractor

* lang/cpp/src/editinteractor.cpp (EditInteractor::Private): Initialize
members 'state' and 'debug' in-class. Add member 'debugNeedsClosing'.
(EditInteractor::Private::Private): Remove members initializers.
Remember if 'debug' needs to be closed.
(EditInteractor::Private::~Private): Only close 'debug' if it needs to
be closed.
--

This fixes the problem that after destroying an edit interactor all
debug output went to /dev/null instead of stderr (or stdout) if one
enabled debugging of the edit interactors with GPGMEPP_INTERACTOR_DEBUG
set to stderr (or stdout).
This commit is contained in:
Ingo Klöcker 2021-05-05 18:52:18 +02:00
parent f0858e45b0
commit 58a217b108

View File

@ -62,9 +62,10 @@ public:
~Private(); ~Private();
private: private:
unsigned int state; unsigned int state = StartState;
Error error; Error error;
std::FILE *debug; std::FILE *debug = nullptr;
bool debugNeedsClosing = false;
}; };
class GpgME::CallbackHelper class GpgME::CallbackHelper
@ -174,10 +175,7 @@ static gpgme_error_t edit_interactor_callback(void *opaque, gpgme_status_code_t
const gpgme_edit_cb_t GpgME::edit_interactor_callback = ::edit_interactor_callback; const gpgme_edit_cb_t GpgME::edit_interactor_callback = ::edit_interactor_callback;
EditInteractor::Private::Private(EditInteractor *qq) EditInteractor::Private::Private(EditInteractor *qq)
: q(qq), : q(qq)
state(StartState),
error(),
debug(nullptr)
{ {
const char *debug_env = std::getenv("GPGMEPP_INTERACTOR_DEBUG"); const char *debug_env = std::getenv("GPGMEPP_INTERACTOR_DEBUG");
if (!debug_env) { if (!debug_env) {
@ -189,12 +187,13 @@ EditInteractor::Private::Private(EditInteractor *qq)
debug = stderr; debug = stderr;
} else if (debug_env) { } else if (debug_env) {
debug = std::fopen(debug_env, "a+"); debug = std::fopen(debug_env, "a+");
debugNeedsClosing = true;
} }
} }
EditInteractor::Private::~Private() EditInteractor::Private::~Private()
{ {
if (debug) { if (debug && debugNeedsClosing) {
std::fclose(debug); std::fclose(debug);
} }
} }