From 9194de84606c1f143c2a7f0c244e8914c60cdabf Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Thu, 15 Aug 2019 13:22:24 +0200 Subject: [PATCH] shell: Add helpers to start/stop systemd units These just send the respective DBus message to the systemd user service. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/680 --- src/shell-util.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ src/shell-util.h | 7 ++++++ 2 files changed, 66 insertions(+) diff --git a/src/shell-util.c b/src/shell-util.c index 01be73b0b..d38c5ab98 100644 --- a/src/shell-util.c +++ b/src/shell-util.c @@ -609,3 +609,62 @@ shell_util_check_cloexec_fds (void) fdwalk (check_cloexec, NULL); g_info ("Open fd CLOEXEC check complete"); } + +static void +on_systemd_call_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + g_autoptr (GVariant) reply = NULL; + g_autoptr (GError) error = NULL; + const gchar *command = user_data; + + reply = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source), + res, &error); + if (error) + g_warning ("Could not issue '%s' systemd call", command); +} + +static gboolean +shell_util_systemd_call (const char *command, + const char *unit, + const char *mode, + GError **error) +{ + g_autoptr (GDBusConnection) connection = NULL; + + connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, error); + + if (connection == NULL) + return FALSE; + + g_dbus_connection_call (connection, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + command, + g_variant_new ("(ss)", + unit, mode), + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, + on_systemd_call_cb, + (gpointer) command); + return TRUE; +} + +gboolean +shell_util_start_systemd_unit (const char *unit, + const char *mode, + GError **error) +{ + return shell_util_systemd_call ("StartUnit", unit, mode, error); +} + +gboolean +shell_util_stop_systemd_unit (const char *unit, + const char *mode, + GError **error) +{ + return shell_util_systemd_call ("StopUnit", unit, mode, error); +} diff --git a/src/shell-util.h b/src/shell-util.h index 6904f43bc..c41e02c79 100644 --- a/src/shell-util.h +++ b/src/shell-util.h @@ -59,6 +59,13 @@ cairo_surface_t * shell_util_composite_capture_images (ClutterCapture *captures void shell_util_check_cloexec_fds (void); +gboolean shell_util_start_systemd_unit (const char *unit, + const char *mode, + GError **error); +gboolean shell_util_stop_systemd_unit (const char *unit, + const char *mode, + GError **error); + G_END_DECLS #endif /* __SHELL_UTIL_H__ */