sd_bus_get_property_string эквивалент для gdbus? - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь прочитать свойство ActiveState системного блока с gdbus / glib-2.0. Для sd-bus существует удобная функция sd_bus_get_property_string. Что бы эквивалентно позвонить, если используется gdbus . Я знаю команду gdbus introspect, но мне нужно реализовать это в C / C ++.

Мне уже удалось запустить и остановить модули. Теперь мне нужно убедиться, что юнит был успешно запущен / остановлен. Я новичок в dbus и несколько часов искал в inte rnet пример, но не нашел ничего полезного.

1 Ответ

0 голосов
/ 16 марта 2020

Я также реализовал некоторые системные вещи в C ++. Вот мое решение:

std::string Unit::GetPropertyString(const std::string& property) const
{
    sd_bus_error err = SD_BUS_ERROR_NULL;
    char* msg = nullptr;
    int r;

    r = sd_bus_get_property_string(m_bus,
        "org.freedesktop.systemd1",
        ("/org/freedesktop/systemd1/unit/" + m_unit).c_str(),
        "org.freedesktop.systemd1.Unit",
        property.c_str(),
        &err,
        &msg);

    if (r < 0)
    {
        std::string err_msg(err.message);
        sd_bus_error_free(&err);

        std::string err_str("Failed to get " + property + " for service "
                            + m_name + ". Error: " + err_msg);

        throw slib_exception(err_str);
    }

    sd_bus_error_free(&err);

    // Free memory (avoid leaking)
    std::string ret(msg);
    free (msg);

    return ret;
}

Исходя из этого, вы можете позвонить

activestate = GetPropertyString("ActiveState");
substate = GetPropertyString("SubState");

Я обнаружил, что многие из <systemd/sd-bus.h> не были хорошо документированы. Здесь есть фантастическое объяснение c, сделанное автором: http://0pointer.net/blog/the-new-sd-bus-api-of-systemd.html

Но за исключением нескольких примеров, которые он приводит, я обнаружил, что было легче проверить исходный код. В частности, мне было приятно посмотреть исходный код приложений systemctl и journalctl, чтобы увидеть, как sd-bus использовался в этих контекстах.

...