[mate-session-manager] add mate-session-manager_switch-to-gnome-keyring.patch

Wolfgang Ulbrich raveit65 at fedoraproject.org
Sat Oct 19 17:09:07 UTC 2013


commit 245a7c57feb9860b0878cd54e53581b8121a2aec
Author: raveit65 <chat-to-me at raveit.de>
Date:   Sat Oct 19 19:09:01 2013 +0200

    add mate-session-manager_switch-to-gnome-keyring.patch

 mate-session-manager_switch-to-gnome-keyring.patch |  333 ++++++++++++++++++++
 1 files changed, 333 insertions(+), 0 deletions(-)
---
diff --git a/mate-session-manager_switch-to-gnome-keyring.patch b/mate-session-manager_switch-to-gnome-keyring.patch
new file mode 100644
index 0000000..f909300
--- /dev/null
+++ b/mate-session-manager_switch-to-gnome-keyring.patch
@@ -0,0 +1,333 @@
+diff --git a/mate-session/Makefile.am b/mate-session/Makefile.am
+index f37a0e2..2c73d63 100644
+--- a/mate-session/Makefile.am
++++ b/mate-session/Makefile.am
+@@ -42,6 +42,8 @@ mate_session_SOURCES =				\
+ 	mdm-signal-handler.c			\
+ 	mdm-log.h				\
+ 	mdm-log.c				\
++	msm-gnome.c				\
++	msm-gnome.h				\
+ 	main.c					\
+ 	gsm-store.h				\
+ 	gsm-store.c				\
+diff --git a/mate-session/main.c b/mate-session/main.c
+index 6cfbbe6..8608852 100644
+--- a/mate-session/main.c
++++ b/mate-session/main.c
+@@ -51,6 +51,8 @@
+ #include "gsm-xsmp-server.h"
+ #include "gsm-store.h"
+ 
++#include "msm-gnome.h"
++
+ #define GSM_SCHEMA "org.mate.session"
+ #define GSM_DEFAULT_SESSION_KEY "default-session"
+ #define GSM_REQUIRED_COMPONENTS_SCHEMA GSM_SCHEMA ".required-components"
+@@ -542,6 +544,9 @@ int main(int argc, char** argv)
+ 	 */
+ 	acquire_name();
+ 
++	/* Starts gnome compat mode */
++	msm_gnome_start();
++
+ 	manager = gsm_manager_new(client_store, failsafe);
+ 
+ 	signal_handler = mdm_signal_handler_new();
+@@ -583,6 +588,7 @@ int main(int argc, char** argv)
+ 		g_object_unref(client_store);
+ 	}
+ 
++	msm_gnome_stop();
+ 	mdm_log_shutdown();
+ 
+ 	return 0;
+diff --git a/mate-session/msm-gnome.c b/mate-session/msm-gnome.c
+new file mode 100644
+index 0000000..1043a35
+--- /dev/null
++++ b/mate-session/msm-gnome.c
+@@ -0,0 +1,246 @@
++/*
++ * Copyright (c) 2004-2005 Benedikt Meurer <benny at xfce.org>
++ *               2013 Stefano Karapetsas <stefano at karapetsas.com>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
++ * MA 02110-1301 USA.
++ *
++ * Most parts of this file where taken from xfce4-session and
++ * gnome-session.
++ */
++
++#include "config.h"
++
++#include <sys/types.h>
++#include <sys/wait.h>
++#include <signal.h>
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++#include <fcntl.h>
++#include <errno.h>
++
++#include <X11/Xatom.h>
++#include <X11/Xlib.h>
++
++#include <gdk/gdkx.h>
++
++#include "msm-gnome.h"
++
++#define GNOME_KEYRING_DAEMON "gnome-keyring-daemon"
++
++
++static gboolean gnome_compat_started = FALSE;
++static int keyring_lifetime_pipe[2];
++static pid_t gnome_keyring_daemon_pid = 0;
++static Window gnome_smproxy_window = None;
++
++static void
++child_setup (gpointer user_data)
++{
++  gint open_max;
++  gint fd;
++  char *fd_str;
++
++  open_max = sysconf (_SC_OPEN_MAX);
++  for (fd = 3; fd < open_max; fd++)
++    {
++      if (fd != keyring_lifetime_pipe[0])
++        fcntl (fd, F_SETFD, FD_CLOEXEC);
++    }
++
++  fd_str = g_strdup_printf ("%d", keyring_lifetime_pipe[0]);
++  g_setenv ("GNOME_KEYRING_LIFETIME_FD", fd_str, TRUE);
++  g_free (fd_str);
++}
++
++
++static void
++gnome_keyring_daemon_startup (void)
++{
++  GError      *error = NULL;
++  gchar       *sout;
++  gchar      **lines;
++  gsize        lineno;
++  gint         status;
++  glong        pid;
++  gchar       *end;
++  gchar       *argv[3];
++  gchar       *p;
++  gchar       *name;
++  const gchar *value;
++
++  /* Pipe to slave keyring lifetime to */
++  if (pipe (keyring_lifetime_pipe))
++    {
++      g_warning ("Failed to set up pipe for gnome-keyring: %s", strerror (errno));
++      return;
++    }
++
++  error = NULL;
++  argv[0] = GNOME_KEYRING_DAEMON;
++  argv[1] = "--start";
++  argv[2] = NULL;
++  g_spawn_sync (NULL, argv, NULL,
++                G_SPAWN_SEARCH_PATH | G_SPAWN_LEAVE_DESCRIPTORS_OPEN,
++                child_setup, NULL,
++                &sout, NULL, &status, &error);
++
++  close (keyring_lifetime_pipe[0]);
++  /* We leave keyring_lifetime_pipe[1] open for the lifetime of the session,
++     in order to slave the keyring daemon lifecycle to the session. */
++
++  if (error != NULL)
++    {
++      g_printerr ("Failed to run gnome-keyring-daemon: %s\n",
++                  error->message);
++      g_error_free (error);
++    }
++  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;
++    }
++}
++
++
++
++static void
++msm_compat_gnome_smproxy_startup (void)
++{
++  Atom gnome_sm_proxy;
++  Display *dpy;
++  Window root;
++
++  gdk_error_trap_push ();
++
++  /* Set GNOME_SM_PROXY property, since some apps (like OOo) seem to require
++   * it to behave properly. Thanks to Jasper/Francois for reporting this.
++   * This has another advantage, since it prevents people from running
++   * gnome-smproxy in xfce4, which would cause trouble otherwise.
++   */
++  dpy = gdk_display;
++  root = RootWindow (dpy, 0);
++
++  if (gnome_smproxy_window != None)
++    XDestroyWindow (dpy, gnome_smproxy_window);
++
++  gnome_sm_proxy = XInternAtom (dpy, "GNOME_SM_PROXY", False);
++  gnome_smproxy_window = XCreateSimpleWindow (dpy, root, 1, 1, 1, 1, 0, 0, 0);
++
++  XChangeProperty (dpy, gnome_smproxy_window, gnome_sm_proxy,
++                   XA_CARDINAL, 32, PropModeReplace,
++                   (unsigned char *) (void *) &gnome_smproxy_window, 1);
++  XChangeProperty (dpy, root, gnome_sm_proxy,
++                   XA_CARDINAL, 32, PropModeReplace,
++                   (unsigned char *) (void *) &gnome_smproxy_window, 1);
++
++  XSync (dpy, False);
++
++  gdk_error_trap_pop ();
++}
++
++
++static void
++msm_compat_gnome_smproxy_shutdown (void)
++{
++  gdk_error_trap_push ();
++
++  if (gnome_smproxy_window != None)
++    {
++      XDestroyWindow (gdk_display, gnome_smproxy_window);
++      XSync (gdk_display, False);
++      gnome_smproxy_window = None;
++    }
++
++  gdk_error_trap_pop ();
++}
++
++
++void
++msm_gnome_start (void)
++{
++  if (gnome_compat_started == TRUE)
++    return;
++
++  g_debug ("MsmGnome: starting");
++
++  msm_compat_gnome_smproxy_startup ();
++
++  gnome_keyring_daemon_startup ();
++
++  gnome_compat_started = TRUE;
++}
++
++
++void
++msm_gnome_stop (void)
++{
++  if (gnome_compat_started == FALSE)
++    return;
++
++  g_debug ("MsmGnome: stopping");
++
++  /* shutdown the keyring daemon */
++  gnome_keyring_daemon_shutdown ();
++
++  msm_compat_gnome_smproxy_shutdown ();
++
++  gnome_compat_started = FALSE;
++}
++
+diff --git a/mate-session/msm-gnome.h b/mate-session/msm-gnome.h
+new file mode 100644
+index 0000000..e3c2e60
+--- /dev/null
++++ b/mate-session/msm-gnome.h
+@@ -0,0 +1,30 @@
++/*
++ * Copyright (c) 2004 Benedikt Meurer <benny at xfce.org>
++ *               2013 Stefano Karapetsas <stefano at karapetsas.com>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
++ * MA 02110-1301 USA.
++ *
++ * Most parts of this file where taken from xfce4-session and
++ * gnome-session.
++ */
++
++#ifndef __MSM_GNOME_H__
++#define __MSM_GNOME_H__
++
++void msm_gnome_start (void);
++void msm_gnome_stop (void);
++
++#endif /* !__MSM_GNOME_H__ */
+


More information about the scm-commits mailing list