Blame SOURCES/0003-Revert-sharing-Use-systemd-to-track-running-services.patch

c8e532
From 9b03a1eb04442c74dd990cda0f44ccf283413a75 Mon Sep 17 00:00:00 2001
c8e532
From: Rui Matos <tiagomatos@gmail.com>
c8e532
Date: Wed, 11 Oct 2017 18:10:54 +0200
c8e532
Subject: [PATCH 3/3] Revert "sharing: Use systemd to track running services"
c8e532
c8e532
This reverts commit e0b7f4143bdd201c824499dd09159f5890a07c6a.
c8e532
---
c8e532
 plugins/sharing/gsd-sharing-manager.c | 114 +++++++++++++-------------
c8e532
 1 file changed, 55 insertions(+), 59 deletions(-)
c8e532
c8e532
diff --git a/plugins/sharing/gsd-sharing-manager.c b/plugins/sharing/gsd-sharing-manager.c
c8e532
index 26663442..b24c4814 100644
c8e532
--- a/plugins/sharing/gsd-sharing-manager.c
c8e532
+++ b/plugins/sharing/gsd-sharing-manager.c
c8e532
@@ -11,60 +11,62 @@
c8e532
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
c8e532
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
c8e532
  * GNU General Public License for more details.
c8e532
  *
c8e532
  * You should have received a copy of the GNU General Public License
c8e532
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
c8e532
  *
c8e532
  */
c8e532
 
c8e532
 #include "config.h"
c8e532
 
c8e532
 #include <locale.h>
c8e532
 #include <glib.h>
c8e532
 #include <gio/gio.h>
c8e532
 #include <gio/gdesktopappinfo.h>
c8e532
 #include <glib/gstdio.h>
c8e532
 
c8e532
 #ifdef HAVE_NETWORK_MANAGER
c8e532
 #include <NetworkManager.h>
c8e532
 #endif /* HAVE_NETWORK_MANAGER */
c8e532
 
c8e532
 #include "gnome-settings-profile.h"
c8e532
 #include "gsd-sharing-manager.h"
c8e532
 #include "gsd-sharing-enums.h"
c8e532
 
c8e532
 #define GSD_SHARING_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_SHARING_MANAGER, GsdSharingManagerPrivate))
c8e532
 
c8e532
 typedef struct {
c8e532
         const char  *name;
c8e532
         GSettings   *settings;
c8e532
+        gboolean     started;
c8e532
+        GSubprocess *process;
c8e532
 } ServiceInfo;
c8e532
 
c8e532
 struct GsdSharingManagerPrivate
c8e532
 {
c8e532
         GDBusNodeInfo           *introspection_data;
c8e532
         guint                    name_id;
c8e532
         GDBusConnection         *connection;
c8e532
 
c8e532
         GCancellable            *cancellable;
c8e532
 #ifdef HAVE_NETWORK_MANAGER
c8e532
         NMClient                *client;
c8e532
 #endif /* HAVE_NETWORK_MANAGER */
c8e532
 
c8e532
         GHashTable              *services;
c8e532
 
c8e532
         char                    *current_network;
c8e532
         char                    *current_network_name;
c8e532
         char                    *carrier_type;
c8e532
         GsdSharingStatus         sharing_status;
c8e532
 };
c8e532
 
c8e532
 #define GSD_DBUS_NAME "org.gnome.SettingsDaemon"
c8e532
 #define GSD_DBUS_PATH "/org/gnome/SettingsDaemon"
c8e532
 #define GSD_DBUS_BASE_INTERFACE "org.gnome.SettingsDaemon"
c8e532
 
c8e532
 #define GSD_SHARING_DBUS_NAME GSD_DBUS_NAME ".Sharing"
c8e532
 #define GSD_SHARING_DBUS_PATH GSD_DBUS_PATH "/Sharing"
c8e532
 
c8e532
 static const gchar introspection_xml[] =
c8e532
 "<node>"
c8e532
@@ -77,176 +79,170 @@ static const gchar introspection_xml[] =
c8e532
 "    <method name='EnableService'>"
c8e532
 "      <arg name='service-name' direction='in' type='s'/>"
c8e532
 "    </method>"
c8e532
 "    <method name='DisableService'>"
c8e532
 "      <arg name='service-name' direction='in' type='s'/>"
c8e532
 "      <arg name='network' direction='in' type='s'/>"
c8e532
 "    </method>"
c8e532
 "    <method name='ListNetworks'>"
c8e532
 "      <arg name='service-name' direction='in' type='s'/>"
c8e532
 "      <arg name='networks' direction='out' type='a(sss)'/>"
c8e532
 "    </method>"
c8e532
 "  </interface>"
c8e532
 "</node>";
c8e532
 
c8e532
 static void     gsd_sharing_manager_class_init  (GsdSharingManagerClass *klass);
c8e532
 static void     gsd_sharing_manager_init        (GsdSharingManager      *manager);
c8e532
 static void     gsd_sharing_manager_finalize    (GObject                *object);
c8e532
 
c8e532
 G_DEFINE_TYPE (GsdSharingManager, gsd_sharing_manager, G_TYPE_OBJECT)
c8e532
 
c8e532
 static gpointer manager_object = NULL;
c8e532
 
c8e532
 static const char * const services[] = {
c8e532
         "rygel",
c8e532
         "vino-server",
c8e532
         "gnome-remote-desktop",
c8e532
         "gnome-user-share-webdav"
c8e532
 };
c8e532
 
c8e532
 static void
c8e532
-handle_unit_cb (GObject      *source_object,
c8e532
-                GAsyncResult *res,
c8e532
-                gpointer      user_data)
c8e532
+gsd_sharing_manager_start_service (GsdSharingManager *manager,
c8e532
+                                   ServiceInfo       *service)
c8e532
 {
c8e532
+        GDesktopAppInfo *app;
c8e532
+        const char *exec;
c8e532
+        char *desktop, **argvp;
c8e532
         GError *error = NULL;
c8e532
-        GVariant *ret;
c8e532
-        const char *operation = user_data;
c8e532
 
c8e532
-        ret = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object),
c8e532
-                                             res, &error);
c8e532
-        if (!ret) {
c8e532
-                if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
c8e532
-                        g_warning ("Failed to %s service: %s", operation, error->message);
c8e532
-                g_error_free (error);
c8e532
+        if (service->started)
c8e532
                 return;
c8e532
-        }
c8e532
+        g_debug ("About to start %s", service->name);
c8e532
 
c8e532
-        g_variant_unref (ret);
c8e532
+        desktop = g_strdup_printf ("%s.desktop", service->name);
c8e532
+        app = g_desktop_app_info_new (desktop);
c8e532
+        g_free (desktop);
c8e532
 
c8e532
-}
c8e532
+        if (!app) {
c8e532
+                g_warning ("Could not find desktop file for service '%s'", service->name);
c8e532
+                return;
c8e532
+        }
c8e532
 
c8e532
-static void
c8e532
-gsd_sharing_manager_handle_service (GsdSharingManager   *manager,
c8e532
-                                    const char          *method,
c8e532
-                                    GAsyncReadyCallback  callback,
c8e532
-                                    ServiceInfo         *service)
c8e532
-{
c8e532
-        char *service_file;
c8e532
-
c8e532
-        service_file = g_strdup_printf ("%s.service", service->name);
c8e532
-        g_dbus_connection_call (manager->priv->connection,
c8e532
-                                "org.freedesktop.systemd1",
c8e532
-                                "/org/freedesktop/systemd1",
c8e532
-                                "org.freedesktop.systemd1.Manager",
c8e532
-                                method,
c8e532
-                                g_variant_new ("(ss)", service_file, "replace"),
c8e532
-                                NULL,
c8e532
-                                G_DBUS_CALL_FLAGS_NONE,
c8e532
-                                -1,
c8e532
-                                manager->priv->cancellable,
c8e532
-                                callback,
c8e532
-                                manager);
c8e532
-        g_free (service_file);
c8e532
-}
c8e532
+        exec = g_app_info_get_commandline (G_APP_INFO (app));
c8e532
 
c8e532
-static void
c8e532
-gsd_sharing_manager_start_service (GsdSharingManager *manager,
c8e532
-                                   ServiceInfo       *service)
c8e532
-{
c8e532
-        g_debug ("About to start %s", service->name);
c8e532
+        if (!g_shell_parse_argv (exec, NULL, &argvp, &error)) {
c8e532
+                g_warning ("Could not parse command-line '%s': %s", exec, error->message);
c8e532
+                g_error_free (error);
c8e532
+                g_object_unref (app);
c8e532
+                return;
c8e532
+        }
c8e532
 
c8e532
-        /* We use StartUnit, not StartUnitReplace, since the latter would
c8e532
-         * cancel any pending start we already have going from an
c8e532
-         * earlier _start_service() call */
c8e532
-        gsd_sharing_manager_handle_service (manager, "StartUnit",
c8e532
-                                            handle_unit_cb, "start");
c8e532
-}
c8e532
+        service->process = g_subprocess_newv ((const gchar * const*) argvp, G_SUBPROCESS_FLAGS_NONE, &error);
c8e532
 
c8e532
-static void
c8e532
-gsd_sharing_manager_stop_service (GsdSharingManager *manager,
c8e532
-                                  ServiceInfo       *service)
c8e532
-{
c8e532
-        g_debug ("About to stop %s", service->name);
c8e532
+        if (!service->process) {
c8e532
+                g_warning ("Could not start command-line '%s': %s", exec, error->message);
c8e532
+                g_error_free (error);
c8e532
+                service->started = FALSE;
c8e532
+        } else {
c8e532
+                service->started = TRUE;
c8e532
+        }
c8e532
 
c8e532
-        gsd_sharing_manager_handle_service (manager, "StopUnit",
c8e532
-                                            handle_unit_cb, "stop");
c8e532
+        g_strfreev (argvp);
c8e532
+        g_object_unref (app);
c8e532
 }
c8e532
 
c8e532
 #ifdef HAVE_NETWORK_MANAGER
c8e532
 static gboolean
c8e532
 service_is_enabled_on_current_connection (GsdSharingManager *manager,
c8e532
                                           ServiceInfo       *service)
c8e532
 {
c8e532
         char **connections;
c8e532
         int j;
c8e532
         gboolean ret;
c8e532
         connections = g_settings_get_strv (service->settings, "enabled-connections");
c8e532
         ret = FALSE;
c8e532
         for (j = 0; connections[j] != NULL; j++) {
c8e532
                 if (g_strcmp0 (connections[j], manager->priv->current_network) == 0) {
c8e532
                         ret = TRUE;
c8e532
                         break;
c8e532
                 }
c8e532
         }
c8e532
 
c8e532
         g_strfreev (connections);
c8e532
         return ret;
c8e532
 }
c8e532
 #else
c8e532
 static gboolean
c8e532
 service_is_enabled_on_current_connection (GsdSharingManager *manager,
c8e532
                                           ServiceInfo       *service)
c8e532
 {
c8e532
         return FALSE;
c8e532
 }
c8e532
 #endif /* HAVE_NETWORK_MANAGER */
c8e532
 
c8e532
+static void
c8e532
+gsd_sharing_manager_stop_service (GsdSharingManager *manager,
c8e532
+                                  ServiceInfo       *service)
c8e532
+{
c8e532
+        if (!service->started ||
c8e532
+            service->process == NULL) {
c8e532
+                    return;
c8e532
+        }
c8e532
+
c8e532
+        g_debug ("About to stop %s", service->name);
c8e532
+
c8e532
+        g_subprocess_send_signal (service->process, SIGTERM);
c8e532
+        g_clear_object (&service->process);
c8e532
+        service->started = FALSE;
c8e532
+}
c8e532
+
c8e532
 static void
c8e532
 gsd_sharing_manager_sync_services (GsdSharingManager *manager)
c8e532
 {
c8e532
         GList *services, *l;
c8e532
 
c8e532
         services = g_hash_table_get_values (manager->priv->services);
c8e532
 
c8e532
         for (l = services; l != NULL; l = l->next) {
c8e532
                 ServiceInfo *service = l->data;
c8e532
                 gboolean should_be_started = FALSE;
c8e532
 
c8e532
                 if (manager->priv->sharing_status == GSD_SHARING_STATUS_AVAILABLE &&
c8e532
                     service_is_enabled_on_current_connection (manager, service))
c8e532
                         should_be_started = TRUE;
c8e532
 
c8e532
-                if (should_be_started)
c8e532
-                        gsd_sharing_manager_start_service (manager, service);
c8e532
-                else
c8e532
-                        gsd_sharing_manager_stop_service (manager, service);
c8e532
+                if (service->started != should_be_started) {
c8e532
+                        if (service->started)
c8e532
+                                gsd_sharing_manager_stop_service (manager, service);
c8e532
+                        else
c8e532
+                                gsd_sharing_manager_start_service (manager, service);
c8e532
+                }
c8e532
         }
c8e532
         g_list_free (services);
c8e532
 }
c8e532
 
c8e532
 #ifdef HAVE_NETWORK_MANAGER
c8e532
 static void
c8e532
 properties_changed (GsdSharingManager *manager)
c8e532
 {
c8e532
         GVariantBuilder props_builder;
c8e532
         GVariant *props_changed = NULL;
c8e532
 
c8e532
         /* not yet connected to the session bus */
c8e532
         if (manager->priv->connection == NULL)
c8e532
                 return;
c8e532
 
c8e532
         g_variant_builder_init (&props_builder, G_VARIANT_TYPE ("a{sv}"));
c8e532
 
c8e532
         g_variant_builder_add (&props_builder, "{sv}", "CurrentNetwork",
c8e532
                                g_variant_new_string (manager->priv->current_network));
c8e532
         g_variant_builder_add (&props_builder, "{sv}", "CurrentNetworkName",
c8e532
                                g_variant_new_string (manager->priv->current_network_name));
c8e532
         g_variant_builder_add (&props_builder, "{sv}", "CarrierType",
c8e532
                                g_variant_new_string (manager->priv->carrier_type));
c8e532
         g_variant_builder_add (&props_builder, "{sv}", "SharingStatus",
c8e532
                                g_variant_new_uint32 (manager->priv->sharing_status));
c8e532
 
c8e532
         props_changed = g_variant_new ("(s@a{sv}@as)", GSD_SHARING_DBUS_NAME,
c8e532
                                        g_variant_builder_end (&props_builder),
c8e532
                                        g_variant_new_strv (NULL, 0));
c8e532
 
c8e532
-- 
c8e532
2.17.0
c8e532