From 3ecc4bf1b660dfff5e7b7a69f38d80a5d579918a Mon Sep 17 00:00:00 2001 From: Jindrich Makovicka Date: Sun, 6 Oct 2019 10:38:05 +0200 Subject: Fix timeout with gnome-keyring 3.34 Launch gnome-keyring-daemon asynchronously, and remove the GNOME_KEYRING_PID reading code. GNOME_KEYRING_PID exposure was removed from gnome-keyring in 2014. --- mate-session/msm-gnome.c | 85 ++++++++++++------------------------------------ 1 file changed, 20 insertions(+), 65 deletions(-) diff --git a/mate-session/msm-gnome.c b/mate-session/msm-gnome.c index 97e08b8..b43f1ad 100644 --- a/mate-session/msm-gnome.c +++ b/mate-session/msm-gnome.c @@ -48,88 +48,46 @@ static gboolean gnome_compat_started = FALSE; -static pid_t gnome_keyring_daemon_pid = 0; static Window gnome_smproxy_window = None; +static void +gnome_keyring_daemon_finished (GPid pid, + gint status, + gpointer user_data) +{ + if (WEXITSTATUS (status) != 0) + { + /* daemon failed for some reason */ + g_printerr ("gnome-keyring-daemon failed to start correctly, " + "exit code: %d\n", WEXITSTATUS (status)); + } +} static void gnome_keyring_daemon_startup (void) { GError *error = NULL; - gchar *sout; - gchar **lines; - gsize lineno; - gint status; - glong pid; - gchar *end; + GPid pid; gchar *argv[3]; - gchar *p; - gchar *name; - const gchar *value; error = NULL; argv[0] = GNOME_KEYRING_DAEMON; argv[1] = "--start"; argv[2] = NULL; - g_spawn_sync (NULL, argv, NULL, - G_SPAWN_SEARCH_PATH, - NULL, NULL, - &sout, NULL, &status, &error); + g_spawn_async (NULL, argv, NULL, + G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, + NULL, NULL, &pid, + &error); if (error != NULL) { - g_printerr ("Failed to run gnome-keyring-daemon: %s\n", + g_printerr ("Failed to spawn gnome-keyring-daemon: %s\n", error->message); g_error_free (error); + return; } - else - { - if (WIFEXITED (status) && WEXITSTATUS (status) == 0 && sout != NULL) - { - lines = g_strsplit (sout, "\n", 0); - - for (lineno = 0; lines[lineno] != NULL; lineno++) - { - p = strchr (lines[lineno], '='); - if (p == NULL) - continue; - - name = g_strndup (lines[lineno], p - lines[lineno]); - value = p + 1; - - g_setenv (name, value, TRUE); - - if (g_strcmp0 (name, "GNOME_KEYRING_PID") == 0) - { - pid = strtol (value, &end, 10); - if (end != value) - gnome_keyring_daemon_pid = pid; - } - - g_free (name); - } - - g_strfreev (lines); - } - else - { - /* daemon failed for some reason */ - g_printerr ("gnome-keyring-daemon failed to start correctly, " - "exit code: %d\n", WEXITSTATUS (status)); - } - - g_free (sout); - } -} -static void -gnome_keyring_daemon_shutdown (void) -{ - if (gnome_keyring_daemon_pid != 0) - { - kill (gnome_keyring_daemon_pid, SIGTERM); - gnome_keyring_daemon_pid = 0; - } + g_child_watch_add (pid, gnome_keyring_daemon_finished, NULL); } @@ -232,9 +190,6 @@ msm_gnome_stop (void) g_debug ("MsmGnome: stopping"); - /* shutdown the keyring daemon */ - gnome_keyring_daemon_shutdown (); - msm_compat_gnome_smproxy_shutdown (); gnome_compat_started = FALSE; -- cgit v1.2.1