std::unique_ptr<INTERNAL_ENGINE> engine;
+void stopSystemdUserSessions() {
+ std::vector<std::string> userSessionServices;
+ dbus::Connection& systemDBus = dbus::Connection::getSystem();
+ dbus::VariantIterator iter;
+
+ systemDBus.methodcall("org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "ListUnits",
+ -1, "(a(ssssssouso))", "")
+ .get("(a(ssssssouso))", &iter);
+
+ while (1) {
+ unsigned int dataUint;
+ char *dataStr[9];
+ int ret;
+
+ ret = iter.get("(ssssssouso)", dataStr, dataStr + 1, dataStr + 2,
+ dataStr + 3, dataStr + 4, dataStr + 5,
+ dataStr + 6, &dataUint, dataStr + 7,
+ dataStr + 8);
+
+ if (!ret) {
+ break;
+ }
+
+ std::string service(dataStr[0]);
+ if (service.compare(0, 5, "user@") == 0) {
+ userSessionServices.push_back(service);
+ }
+ }
+
+ for (const std::string& service : userSessionServices) {
+ INFO("Stop service - " + service);
+ systemDBus.methodcall("org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "StopUnit",
+ -1, "", "(ss)", service.c_str(), "flush");
+ }
+}
+
void stopDependedSystemdServices()
{
dbus::Connection& systemDBus = dbus::Connection::getSystem();
try {
showProgressUI("Encrypting");
+ INFO("Close all user sessions...");
+ stopSystemdUserSessions();
INFO("Close all processes using internal storage...");
stopDependedSystemdServices();
INFO("Umount internal storage...");