Blame SOURCES/revert-sharing-use-systemd-to-track-running-services.patch

dce4b5
From a03367dfd70133a39b5bb35f1718053b2c55d1e7 Mon Sep 17 00:00:00 2001
dce4b5
From: Ondrej Holy <oholy@redhat.com>
dce4b5
Date: Wed, 26 Apr 2017 15:01:09 +0200
dce4b5
Subject: [PATCH 2/2] Revert "sharing: Use systemd to track running services"
dce4b5
dce4b5
This reverts commit e0b7f4143bdd201c824499dd09159f5890a07c6a.
dce4b5
---
dce4b5
 plugins/sharing/gsd-sharing-manager.c | 114 ++++++++++++++++------------------
dce4b5
 1 file changed, 55 insertions(+), 59 deletions(-)
dce4b5
dce4b5
diff --git a/plugins/sharing/gsd-sharing-manager.c b/plugins/sharing/gsd-sharing-manager.c
dce4b5
index 0c38a916..c8a81823 100644
dce4b5
--- a/plugins/sharing/gsd-sharing-manager.c
dce4b5
+++ b/plugins/sharing/gsd-sharing-manager.c
dce4b5
@@ -39,6 +39,8 @@
dce4b5
 typedef struct {
dce4b5
         const char  *name;
dce4b5
         GSettings   *settings;
dce4b5
+        gboolean     started;
dce4b5
+        GSubprocess *process;
dce4b5
 } ServiceInfo;
dce4b5
 
dce4b5
 struct GsdSharingManagerPrivate
dce4b5
@@ -100,72 +102,48 @@ static const char * const services[] = {
dce4b5
 };
dce4b5
 
dce4b5
 static void
dce4b5
-handle_unit_cb (GObject      *source_object,
dce4b5
-                GAsyncResult *res,
dce4b5
-                gpointer      user_data)
dce4b5
+gsd_sharing_manager_start_service (GsdSharingManager *manager,
dce4b5
+                                   ServiceInfo       *service)
dce4b5
 {
dce4b5
+        GDesktopAppInfo *app;
dce4b5
+        const char *exec;
dce4b5
+        char *desktop, **argvp;
dce4b5
         GError *error = NULL;
dce4b5
-        GVariant *ret;
dce4b5
-        const char *operation = user_data;
dce4b5
 
dce4b5
-        ret = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object),
dce4b5
-                                             res, &error);
dce4b5
-        if (!ret) {
dce4b5
-                if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
dce4b5
-                        g_warning ("Failed to %s service: %s", operation, error->message);
dce4b5
-                g_error_free (error);
dce4b5
+        if (service->started)
dce4b5
                 return;
dce4b5
-        }
dce4b5
+        g_debug ("About to start %s", service->name);
dce4b5
 
dce4b5
-        g_variant_unref (ret);
dce4b5
+        desktop = g_strdup_printf ("%s.desktop", service->name);
dce4b5
+        app = g_desktop_app_info_new (desktop);
dce4b5
+        g_free (desktop);
dce4b5
 
dce4b5
-}
dce4b5
+        if (!app) {
dce4b5
+                g_warning ("Could not find desktop file for service '%s'", service->name);
dce4b5
+                return;
dce4b5
+        }
dce4b5
 
dce4b5
-static void
dce4b5
-gsd_sharing_manager_handle_service (GsdSharingManager   *manager,
dce4b5
-                                    const char          *method,
dce4b5
-                                    GAsyncReadyCallback  callback,
dce4b5
-                                    ServiceInfo         *service)
dce4b5
-{
dce4b5
-        char *service_file;
dce4b5
-
dce4b5
-        service_file = g_strdup_printf ("%s.service", service->name);
dce4b5
-        g_dbus_connection_call (manager->priv->connection,
dce4b5
-                                "org.freedesktop.systemd1",
dce4b5
-                                "/org/freedesktop/systemd1",
dce4b5
-                                "org.freedesktop.systemd1.Manager",
dce4b5
-                                method,
dce4b5
-                                g_variant_new ("(ss)", service_file, "replace"),
dce4b5
-                                NULL,
dce4b5
-                                G_DBUS_CALL_FLAGS_NONE,
dce4b5
-                                -1,
dce4b5
-                                manager->priv->cancellable,
dce4b5
-                                callback,
dce4b5
-                                manager);
dce4b5
-        g_free (service_file);
dce4b5
-}
dce4b5
+        exec = g_app_info_get_commandline (G_APP_INFO (app));
dce4b5
 
dce4b5
-static void
dce4b5
-gsd_sharing_manager_start_service (GsdSharingManager *manager,
dce4b5
-                                   ServiceInfo       *service)
dce4b5
-{
dce4b5
-        g_debug ("About to start %s", service->name);
dce4b5
+        if (!g_shell_parse_argv (exec, NULL, &argvp, &error)) {
dce4b5
+                g_warning ("Could not parse command-line '%s': %s", exec, error->message);
dce4b5
+                g_error_free (error);
dce4b5
+                g_object_unref (app);
dce4b5
+                return;
dce4b5
+        }
dce4b5
 
dce4b5
-        /* We use StartUnit, not StartUnitReplace, since the latter would
dce4b5
-         * cancel any pending start we already have going from an
dce4b5
-         * earlier _start_service() call */
dce4b5
-        gsd_sharing_manager_handle_service (manager, "StartUnit",
dce4b5
-                                            handle_unit_cb, "start");
dce4b5
-}
dce4b5
+        service->process = g_subprocess_newv ((const gchar * const*) argvp, G_SUBPROCESS_FLAGS_NONE, &error);
dce4b5
 
dce4b5
-static void
dce4b5
-gsd_sharing_manager_stop_service (GsdSharingManager *manager,
dce4b5
-                                  ServiceInfo       *service)
dce4b5
-{
dce4b5
-        g_debug ("About to stop %s", service->name);
dce4b5
+        if (!service->process) {
dce4b5
+                g_warning ("Could not start command-line '%s': %s", exec, error->message);
dce4b5
+                g_error_free (error);
dce4b5
+                service->started = FALSE;
dce4b5
+        } else {
dce4b5
+                service->started = TRUE;
dce4b5
+        }
dce4b5
 
dce4b5
-        gsd_sharing_manager_handle_service (manager, "StopUnit",
dce4b5
-                                            handle_unit_cb, "stop");
dce4b5
+        g_strfreev (argvp);
dce4b5
+        g_object_unref (app);
dce4b5
 }
dce4b5
 
dce4b5
 #ifdef HAVE_NETWORK_MANAGER
dce4b5
@@ -198,6 +176,22 @@ service_is_enabled_on_current_connection (GsdSharingManager *manager,
dce4b5
 #endif /* HAVE_NETWORK_MANAGER */
dce4b5
 
dce4b5
 static void
dce4b5
+gsd_sharing_manager_stop_service (GsdSharingManager *manager,
dce4b5
+                                  ServiceInfo       *service)
dce4b5
+{
dce4b5
+        if (!service->started ||
dce4b5
+            service->process == NULL) {
dce4b5
+                    return;
dce4b5
+        }
dce4b5
+
dce4b5
+        g_debug ("About to stop %s", service->name);
dce4b5
+
dce4b5
+        g_subprocess_send_signal (service->process, SIGTERM);
dce4b5
+        g_clear_object (&service->process);
dce4b5
+        service->started = FALSE;
dce4b5
+}
dce4b5
+
dce4b5
+static void
dce4b5
 gsd_sharing_manager_sync_services (GsdSharingManager *manager)
dce4b5
 {
dce4b5
         GList *services, *l;
dce4b5
@@ -212,10 +206,12 @@ gsd_sharing_manager_sync_services (GsdSharingManager *manager)
dce4b5
                     service_is_enabled_on_current_connection (manager, service))
dce4b5
                         should_be_started = TRUE;
dce4b5
 
dce4b5
-                if (should_be_started)
dce4b5
-                        gsd_sharing_manager_start_service (manager, service);
dce4b5
-                else
dce4b5
-                        gsd_sharing_manager_stop_service (manager, service);
dce4b5
+                if (service->started != should_be_started) {
dce4b5
+                        if (service->started)
dce4b5
+                                gsd_sharing_manager_stop_service (manager, service);
dce4b5
+                        else
dce4b5
+                                gsd_sharing_manager_start_service (manager, service);
dce4b5
+                }
dce4b5
         }
dce4b5
         g_list_free (services);
dce4b5
 }
dce4b5
-- 
dce4b5
2.12.2
dce4b5