From 3c92e9206dc2e17fa5dc13f37be2926e9131ce94 Mon Sep 17 00:00:00 2001 From: Pier Luigi Fiorini Date: Sun, 7 Mar 2021 17:36:11 +0100 Subject: [PATCH] Stop the helper process Make sure the helper process is stopped when shutting down. --- src/auth/Auth.cpp | 9 +++++++++ src/auth/Auth.h | 5 +++++ src/{daemon => common}/SignalHandler.cpp | 0 src/{daemon => common}/SignalHandler.h | 0 src/daemon/CMakeLists.txt | 3 ++- src/daemon/Greeter.cpp | 2 ++ src/helper/CMakeLists.txt | 2 ++ src/helper/HelperApp.cpp | 14 +++++++++++++- src/helper/HelperApp.h | 2 ++ 9 files changed, 35 insertions(+), 2 deletions(-) rename src/{daemon => common}/SignalHandler.cpp (100%) rename src/{daemon => common}/SignalHandler.h (100%) diff --git a/src/auth/Auth.cpp b/src/auth/Auth.cpp index caca3146..042d938b 100644 --- a/src/auth/Auth.cpp +++ b/src/auth/Auth.cpp @@ -358,6 +358,15 @@ namespace SDDM { args << QStringLiteral("--greeter"); d->child->start(QStringLiteral("%1/sddm-helper").arg(QStringLiteral(LIBEXEC_INSTALL_DIR)), args); } + + void Auth::stop() + { + if (d->child->state() != QProcess::NotRunning) { + d->child->terminate(); + if (!d->child->waitForFinished(5000)) + d->child->kill(); + } + } } #include "Auth.moc" diff --git a/src/auth/Auth.h b/src/auth/Auth.h index 87f5f440..c3ce1a62 100644 --- a/src/auth/Auth.h +++ b/src/auth/Auth.h @@ -157,6 +157,11 @@ namespace SDDM { */ void start(); + /** + * Stops the process. + */ + void stop(); + Q_SIGNALS: void autologinChanged(); void greeterChanged(); diff --git a/src/daemon/SignalHandler.cpp b/src/common/SignalHandler.cpp similarity index 100% rename from src/daemon/SignalHandler.cpp rename to src/common/SignalHandler.cpp diff --git a/src/daemon/SignalHandler.h b/src/common/SignalHandler.h similarity index 100% rename from src/daemon/SignalHandler.h rename to src/common/SignalHandler.h diff --git a/src/daemon/CMakeLists.txt b/src/daemon/CMakeLists.txt index 86d014be..4660a2f2 100644 --- a/src/daemon/CMakeLists.txt +++ b/src/daemon/CMakeLists.txt @@ -13,6 +13,8 @@ set(DAEMON_SOURCES ${CMAKE_SOURCE_DIR}/src/common/Session.cpp ${CMAKE_SOURCE_DIR}/src/common/SocketWriter.cpp + ${CMAKE_SOURCE_DIR}/src/common/SignalHandler.cpp + ${CMAKE_SOURCE_DIR}/src/common/SignalHandler.h ${CMAKE_SOURCE_DIR}/src/common/XauthUtils.cpp ${CMAKE_SOURCE_DIR}/src/auth/Auth.cpp ${CMAKE_SOURCE_DIR}/src/auth/AuthPrompt.cpp ${CMAKE_SOURCE_DIR}/src/auth/AuthRequest.cpp @@ -27,7 +29,6 @@ set(DAEMON_SOURCES PowerManager.cpp Seat.cpp SeatManager.cpp - SignalHandler.cpp SocketServer.cpp ) diff --git a/src/daemon/Greeter.cpp b/src/daemon/Greeter.cpp index 436ecc3d..3b0ab2c3 100644 --- a/src/daemon/Greeter.cpp +++ b/src/daemon/Greeter.cpp @@ -225,6 +225,8 @@ namespace SDDM { // wait for finished if (!m_process->waitForFinished(5000)) m_process->kill(); + } else { + m_auth->stop(); } } diff --git a/src/helper/CMakeLists.txt b/src/helper/CMakeLists.txt index 8914ea75..f63dcc92 100644 --- a/src/helper/CMakeLists.txt +++ b/src/helper/CMakeLists.txt @@ -10,6 +10,8 @@ set(HELPER_SOURCES ${CMAKE_SOURCE_DIR}/src/common/ConfigReader.cpp ${CMAKE_SOURCE_DIR}/src/common/SafeDataStream.cpp + ${CMAKE_SOURCE_DIR}/src/common/SignalHandler.cpp + ${CMAKE_SOURCE_DIR}/src/common/SignalHandler.h ${CMAKE_SOURCE_DIR}/src/common/XauthUtils.cpp Backend.cpp HelperApp.cpp UserSession.cpp diff --git a/src/helper/HelperApp.cpp b/src/helper/HelperApp.cpp index 672359ae..12c3206e 100644 --- a/src/helper/HelperApp.cpp +++ b/src/helper/HelperApp.cpp @@ -22,7 +22,7 @@ #include "Backend.h" #include "UserSession.h" #include "SafeDataStream.h" - +#include "SignalHandler.h" #include "MessageHandler.h" #include "VirtualTerminal.h" @@ -50,6 +50,18 @@ namespace SDDM { , m_socket(new QLocalSocket(this)) { qInstallMessageHandler(HelperMessageHandler); + m_signalHandler = new SignalHandler(this); + m_signalHandler->initialize(); + connect(m_signalHandler, &SignalHandler::sigintReceived, this, &HelperApp::quit); + connect(m_signalHandler, &SignalHandler::sigtermReceived, this, &HelperApp::quit); + + connect(this, &QCoreApplication::aboutToQuit, this, [this] { + m_session->terminate(); + if (!m_session->waitForFinished(5000)) + m_session->kill(); + m_backend->closeSession(); + }); + QTimer::singleShot(0, this, SLOT(setUp())); } diff --git a/src/helper/HelperApp.h b/src/helper/HelperApp.h index 3742df12..d08fd37b 100644 --- a/src/helper/HelperApp.h +++ b/src/helper/HelperApp.h @@ -31,6 +31,7 @@ class QLocalSocket; namespace SDDM { class Backend; class UserSession; + class SignalHandler; class HelperApp : public QCoreApplication { Q_OBJECT @@ -63,6 +64,7 @@ namespace SDDM { QString m_user { }; // TODO: get rid of this in a nice clean way along the way with moving to user session X server QByteArray m_cookie { }; + SignalHandler *m_signalHandler = nullptr; /*! \brief Write utmp/wtmp/btmp records when a user logs in