IT/Unix
dbus 로 서비스 실행하기
SpringUpOhWell!
2023. 12. 27. 14:08
반응형
inline static int freeDbusValue(int ret, sd_bus_error error, sd_bus_message *m, sd_bus *bus) {
sd_bus_error_free(&error);
sd_bus_message_unref(m);
sd_bus_unref(bus);
return ret;
}
int DBusUtility::executeService(const std::string &serviceName) {
if (serviceName.empty()) {
ERROR_PRINT("DBusUtility::executeService Failed: serviceName is empty");
return EXIT_FAILURE;
}
DEBUG_PRINT("DBusUtility::executeService serviceName: %s", serviceName.c_str());
sd_bus_error error = SD_BUS_ERROR_NULL;
sd_bus_message *m = NULL;
sd_bus *bus = NULL;
const char *path = NULL;
int r;
/* Connect to the system bus */
r = sd_bus_open_system(&bus);
if (r < 0) {
ERROR_PRINT("DBusUtility::executeService Failed to connect to system bus: %s", strerror(-r));
return freeDbusValue(r, error, m, bus);
}
/* Issue the method call and store the respons message in m */
r = sd_bus_call_method(bus,
"org.freedesktop.systemd1", /* service to contact */
"/org/freedesktop/systemd1", /* object path */
"org.freedesktop.systemd1.Manager", /* interface name */
"StartUnit", /* method name */
&error, /* object to return error in */
&m, /* return message on success */
"ss", /* input signature */
serviceName.c_str(), /* first argument */
"replace"); /* second argument */
if (r < 0) {
ERROR_PRINT("DBusUtility::executeService Failed to issue method call: %s", error.message);
return freeDbusValue(r, error, m, bus);
}
/* Parse the response message */
r = sd_bus_message_read(m, "o", &path);
if (r < 0) {
ERROR_PRINT("DBusUtility::executeService Failed to parse response message: %s", strerror(-r));
return freeDbusValue(r, error, m, bus);
}
else {
INFO_PRINT("DBusUtility::executeService Queued service job as %s", path);
return freeDbusValue(r, error, m, bus);
}
}
728x90
반응형