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