/
githubmirror
/
fwupd
Обзор
Документация
Войти
/
githubmirror
/
fwupd
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/fu-systemd.c
126 строк
3 KB
Richard Hughes
trivial: Add a unit test for the systemd integration
03 июн 2026, 09:41
03 июн 2026, 09:41
112f1fb
Код
Авторство
О чём код?
/* * Copyright 2017 Richard Hughes <richard@hughsie.com> * * SPDX-License-Identifier: LGPL-2.1-or-later */ #include "config.h" #include <fwupd.h> #include <gio/gio.h> #include <glib/gi18n.h> #include <stdio.h> #include "fu-systemd.h" #define SYSTEMD_SERVICE "org.freedesktop.systemd1" #define SYSTEMD_OBJECT_PATH "/org/freedesktop/systemd1" #define SYSTEMD_INTERFACE "org.freedesktop.systemd1" #define SYSTEMD_MANAGER_INTERFACE "org.freedesktop.systemd1.Manager" #define SYSTEMD_UNIT_INTERFACE "org.freedesktop.systemd1.Unit" static GDBusProxy * fu_systemd_get_manager(GError **error) { g_autoptr(GDBusConnection) connection = NULL; g_autoptr(GDBusProxy) proxy = NULL; connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, error); if (connection == NULL) { g_prefix_error_literal(error, "failed to get bus: "); fwupd_error_convert(error); return NULL; } proxy = g_dbus_proxy_new_sync(connection, G_DBUS_PROXY_FLAGS_NONE, NULL, SYSTEMD_SERVICE, SYSTEMD_OBJECT_PATH, SYSTEMD_MANAGER_INTERFACE, NULL, error); if (proxy == NULL) { g_prefix_error(error, "failed to find %s: ", SYSTEMD_SERVICE); fwupd_error_convert(error); return NULL; } return g_steal_pointer(&proxy); } static gchar * fu_systemd_unit_get_path(GDBusProxy *proxy_manager, const gchar *unit, GError **error) { g_autofree gchar *path = NULL; g_autoptr(GVariant) val = NULL; val = g_dbus_proxy_call_sync(proxy_manager, "GetUnit", g_variant_new("(s)", unit), G_DBUS_CALL_FLAGS_NONE, -1, NULL, error); if (val == NULL) { g_prefix_error(error, "failed to find %s: ", unit); fwupd_error_convert(error); return NULL; } g_variant_get(val, "(o)", &path); return g_steal_pointer(&path); } static GDBusProxy * fu_systemd_unit_get_proxy(GDBusProxy *proxy_manager, const gchar *unit, GError **error) { g_autofree gchar *path = NULL; g_autoptr(GDBusProxy) proxy_unit = NULL; path = fu_systemd_unit_get_path(proxy_manager, unit, error); if (path == NULL) return NULL; proxy_unit = g_dbus_proxy_new_sync(g_dbus_proxy_get_connection(proxy_manager), G_DBUS_PROXY_FLAGS_NONE, NULL, SYSTEMD_SERVICE, path, SYSTEMD_UNIT_INTERFACE, NULL, error); if (proxy_unit == NULL) { g_prefix_error(error, "failed to register proxy for %s: ", path); fwupd_error_convert(error); return NULL; } return g_steal_pointer(&proxy_unit); } gboolean fu_systemd_unit_stop(const gchar *unit, GError **error) { g_autoptr(GDBusProxy) proxy_manager = NULL; g_autoptr(GDBusProxy) proxy_unit = NULL; g_autoptr(GVariant) val = NULL; g_return_val_if_fail(unit != NULL, FALSE); proxy_manager = fu_systemd_get_manager(error); if (proxy_manager == NULL) return FALSE; proxy_unit = fu_systemd_unit_get_proxy(proxy_manager, unit, error); if (proxy_unit == NULL) return FALSE; val = g_dbus_proxy_call_sync(proxy_unit, "Stop", g_variant_new("(s)", "replace"), G_DBUS_CALL_FLAGS_NONE, -1, NULL, error); if (val == NULL) { fwupd_error_convert(error); return FALSE; } /* success */ return TRUE; }