본문 바로가기
IT/Unix

dbus 로 서비스 실행하기

by Spring Up!! 2023. 12. 27.
반응형
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

댓글