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;
.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);
}
}