blob: 08f6217070483a739dd40dca9af91404755401eb [file] [log] [blame]
/*
* Copyright 2017 Richard Hughes <richard@hughsie.com>
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*/
#include "config.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: ");
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);
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);
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);
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);
return val != NULL;
}