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
반응형