Blob Blame History Raw
From 3c92e9206dc2e17fa5dc13f37be2926e9131ce94 Mon Sep 17 00:00:00 2001
From: Pier Luigi Fiorini <pierluigi.fiorini@liri.io>
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