Fix to stop user session 91/188891/6
authorseolheui, kim <s414.kim@samsung.com>
Tue, 11 Sep 2018 10:09:15 +0000 (19:09 +0900)
committerseolheui, kim <s414.kim@samsung.com>
Thu, 13 Sep 2018 06:04:51 +0000 (15:04 +0900)
Change-Id: I3ac1317b762978372ce7857a8aa45df83f49d4fc
Signed-off-by: seolheui, kim <s414.kim@samsung.com>
server/internal-encryption.cpp

index e17a2e0..d29d876 100644 (file)
@@ -167,9 +167,65 @@ std::string getDecodedPath(const std::string &path, const std::string &prefix)
 void stopSystemdUnits()
 {
        dbus::Connection& systemDBus = dbus::Connection::getSystem();
-       std::set<std::string> preprocessUnits;
+       dbus::VariantIterator iter;
+       std::vector<std::string> preprocessUnits;
        std::set<std::string> unitsToStop;
 
+       auto stopUnit = [&systemDBus](const std::string &unit) {
+               JobWatch watch(systemDBus);
+               INFO(SINK, "Stopping unit: " + unit);
+               const char* job = NULL;
+               try {
+                       systemDBus.methodcall("org.freedesktop.systemd1",
+                                                                       "/org/freedesktop/systemd1",
+                                                                       "org.freedesktop.systemd1.Manager",
+                                                                       "StopUnit",
+                                                                       -1, "(o)", "(ss)", unit.c_str(), "flush").get("(o)", &job);
+                       INFO(SINK, "Waiting for job: " + std::string(job));
+                       if (!watch.waitForJob(job))
+                               ERROR(SINK, "Stopping unit: " + unit + " failed");
+               } catch (runtime::Exception &e) {
+                       ERROR(SINK, std::string(e.what()));
+               }
+       };
+
+       try {
+               systemDBus.methodcall("org.freedesktop.systemd1",
+                                                               "/org/freedesktop/systemd1",
+                                                               "org.freedesktop.systemd1.Manager",
+                                                               "ListUnits",
+                                                               -1, "(a(ssssssouso))", "").get("(a(ssssssouso))", &iter);
+       } catch (runtime::Exception &e) {
+               INFO(SINK, "Get list of systemd unit : " + std::string(e.what()));
+       }
+
+       while (1) {
+               unsigned int dataUnit;
+               char *dataStr[9];
+               int ret;
+               ret = iter.get("(ssssssouso)", dataStr, dataStr + 1, dataStr + 2,
+                                               dataStr + 3, dataStr + 4, dataStr + 5,
+                                               dataStr + 6, &dataUnit, dataStr + 7, dataStr + 8);
+               if (!ret)
+                       break;
+
+               std::string unitName(dataStr[0]);
+               if (unitName == "security-manager.socket" ||
+                               unitName == "connman.socket" ||
+                               unitName == "msg-server.socket") {
+                       preprocessUnits.insert(preprocessUnits.begin(), unitName);
+               } else if (unitName.compare(0, 5, "user@") == 0 ||
+                               unitName == "tlm.service" ||
+                               unitName == "resourced.service" ||
+                               unitName == "security-manager.service") {
+                       preprocessUnits.push_back(unitName);
+               }
+       }
+
+       for (auto unit : preprocessUnits) {
+               stopUnit(unit);
+       }
+
        for (pid_t pid : runtime::FileUser::getList(INTERNAL_PATH, true)) {
                try {
                        char *unit = nullptr;
@@ -181,36 +237,14 @@ void stopSystemdUnits()
                                                                                .get("(o)", &unit);
 
                        auto unescapedName = getDecodedPath(unit, "/org/freedesktop/systemd1/unit/");
-                       if (unescapedName.compare(0, 5, "user@") == 0)
-                               preprocessUnits.insert(unescapedName);
-                       else
-                               unitsToStop.insert(unescapedName);
+                       unitsToStop.insert(unescapedName);
                } catch (runtime::Exception &e) {
                        INFO(SINK, "Killing process: " + std::to_string(pid));
                        ::kill(pid, SIGKILL);
                }
        }
 
-       JobWatch watch(systemDBus);
-
-       auto stopUnit = [&watch, &systemDBus](const std::string &unit) {
-               INFO(SINK, "Stopping unit: " + unit);
-               const char* job = NULL;
-               systemDBus.methodcall("org.freedesktop.systemd1",
-                                                               "/org/freedesktop/systemd1",
-                                                               "org.freedesktop.systemd1.Manager",
-                                                               "StopUnit",
-                                                               -1, "(o)", "(ss)", unit.c_str(), "flush").get("(o)", &job);
-               INFO(SINK, "Waiting for job: " + std::string(job));
-               if (!watch.waitForJob(job))
-                       ERROR(SINK, "Stopping unit: " + unit + " failed");
-       };
-
-       for (const std::string &unit : preprocessUnits) {
-               stopUnit(unit);
-       }
-
-       for (const std::string &unit : unitsToStop) {
+       for (auto unit : unitsToStop) {
                stopUnit(unit);
        }
 }