반응형
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);
}
}
반응형
'IT > Unix' 카테고리의 다른 글
git cimmit 간의 변경 파일 리스트 뽑기 (0) | 2023.03.07 |
---|---|
unix 파일 내용 지우기 (0) | 2017.09.08 |
make 모든 파일을 컴파일 하는 예제 (0) | 2017.06.01 |
특정 포트로 SSH 접속 (0) | 2017.05.24 |
유용한 vi 명령어 (0) | 2017.05.08 |
Unix 기본 명령어 (0) | 2017.05.06 |
댓글