Blame SOURCES/0010-Allow-saved-session-directory-to-be-a-symlink.patch

5d36d8
From 6a7054d12d1177184ed20f1d2263eef476d25b8f Mon Sep 17 00:00:00 2001
5d36d8
From: Ray Strode <rstrode@redhat.com>
5d36d8
Date: Fri, 20 Dec 2013 11:22:53 -0500
5d36d8
Subject: [PATCH 10/19] Allow saved-session directory to be a symlink
5d36d8
5d36d8
This gives us the option of adding a rudimentary session
5d36d8
chooser later.
5d36d8
---
5d36d8
 gnome-session/gsm-session-save.c | 36 ++++++++++++++++++++++++++++++------
5d36d8
 gnome-session/gsm-util.c         |  6 ------
5d36d8
 2 files changed, 30 insertions(+), 12 deletions(-)
5d36d8
5d36d8
diff --git a/gnome-session/gsm-session-save.c b/gnome-session/gsm-session-save.c
5d36d8
index eebc5ff1..66914b57 100644
5d36d8
--- a/gnome-session/gsm-session-save.c
5d36d8
+++ b/gnome-session/gsm-session-save.c
5d36d8
@@ -148,67 +148,91 @@ gsm_session_save (GsmStore  *client_store,
5d36d8
          * one shot only)
5d36d8
          */
5d36d8
         settings = g_settings_new (GSM_MANAGER_SCHEMA);
5d36d8
         g_settings_set_boolean (settings, KEY_AUTOSAVE_ONE_SHOT, FALSE);
5d36d8
         g_object_unref (settings);
5d36d8
 
5d36d8
         save_dir = gsm_util_get_saved_session_dir ();
5d36d8
         if (save_dir == NULL) {
5d36d8
                 g_warning ("GsmSessionSave: cannot create saved session directory");
5d36d8
                 return;
5d36d8
         }
5d36d8
 
5d36d8
         tmp_dir = gsm_util_get_empty_tmp_session_dir ();
5d36d8
         if (tmp_dir == NULL) {
5d36d8
                 g_warning ("GsmSessionSave: cannot create new saved session directory");
5d36d8
                 return;
5d36d8
         }
5d36d8
 
5d36d8
         /* save the session in a temp directory, and remember the discard
5d36d8
          * commands */
5d36d8
         data.dir = tmp_dir;
5d36d8
         data.discard_hash = g_hash_table_new_full (g_str_hash, g_str_equal,
5d36d8
                                                    g_free, NULL);
5d36d8
         data.error = error;
5d36d8
 
5d36d8
         gsm_store_foreach (client_store,
5d36d8
                            (GsmStoreFunc) save_one_client,
5d36d8
                            &data);
5d36d8
 
5d36d8
         if (!*error) {
5d36d8
-                /* remove the old saved session */
5d36d8
-                gsm_session_clear_saved_session (save_dir, data.discard_hash);
5d36d8
+                char *session_dir;
5d36d8
 
5d36d8
-                /* rename the temp session dir */
5d36d8
-                if (g_file_test (save_dir, G_FILE_TEST_IS_DIR))
5d36d8
-                        g_rmdir (save_dir);
5d36d8
-                g_rename (tmp_dir, save_dir);
5d36d8
+                if (g_file_test (save_dir, G_FILE_TEST_IS_SYMLINK))
5d36d8
+                        session_dir = g_file_read_link (save_dir, error);
5d36d8
+                else
5d36d8
+                        session_dir = g_strdup (save_dir);
5d36d8
+
5d36d8
+                if (session_dir != NULL) {
5d36d8
+
5d36d8
+                        char *absolute_session_dir;
5d36d8
+
5d36d8
+                        if (g_path_is_absolute (session_dir)) {
5d36d8
+                                absolute_session_dir = g_strdup (session_dir);
5d36d8
+                        } else {
5d36d8
+                                char *parent_dir;
5d36d8
+
5d36d8
+                                parent_dir = g_path_get_dirname (save_dir);
5d36d8
+                                absolute_session_dir = g_build_filename (parent_dir, session_dir, NULL);
5d36d8
+                                g_free (parent_dir);
5d36d8
+                        }
5d36d8
+                        g_free (session_dir);
5d36d8
+
5d36d8
+                        /* remove the old saved session */
5d36d8
+                        gsm_session_clear_saved_session (absolute_session_dir, data.discard_hash);
5d36d8
+
5d36d8
+                        if (g_file_test (absolute_session_dir, G_FILE_TEST_IS_DIR))
5d36d8
+                                g_rmdir (absolute_session_dir);
5d36d8
+                        g_rename (tmp_dir, absolute_session_dir);
5d36d8
+
5d36d8
+                        g_free (absolute_session_dir);
5d36d8
+                }
5d36d8
         } else {
5d36d8
                 g_warning ("GsmSessionSave: error saving session: %s", (*error)->message);
5d36d8
                 /* FIXME: we should create a hash table filled with the discard
5d36d8
                  * commands that are in desktop files from save_dir. */
5d36d8
                 gsm_session_clear_saved_session (tmp_dir, NULL);
5d36d8
                 g_rmdir (tmp_dir);
5d36d8
         }
5d36d8
 
5d36d8
         g_hash_table_destroy (data.discard_hash);
5d36d8
         g_free (tmp_dir);
5d36d8
 }
5d36d8
 
5d36d8
 static gboolean
5d36d8
 gsm_session_clear_one_client (const char *filename,
5d36d8
                               GHashTable *discard_hash)
5d36d8
 {
5d36d8
         gboolean  result = TRUE;
5d36d8
         GKeyFile *key_file;
5d36d8
         char     *discard_exec = NULL;
5d36d8
         char    **envp;
5d36d8
 
5d36d8
         g_debug ("GsmSessionSave: removing '%s' from saved session", filename);
5d36d8
 
5d36d8
         envp = (char **) gsm_util_listenv ();
5d36d8
         key_file = g_key_file_new ();
5d36d8
         if (g_key_file_load_from_file (key_file, filename,
5d36d8
                                        G_KEY_FILE_NONE, NULL)) {
5d36d8
                 char **argv;
5d36d8
                 int    argc;
5d36d8
 
5d36d8
diff --git a/gnome-session/gsm-util.c b/gnome-session/gsm-util.c
5d36d8
index 13f674cb..e30cf912 100644
5d36d8
--- a/gnome-session/gsm-util.c
5d36d8
+++ b/gnome-session/gsm-util.c
5d36d8
@@ -71,69 +71,63 @@ gsm_util_find_desktop_file_for_app_name (const char *name,
5d36d8
                 g_debug ("GsmUtil: found in XDG dirs: '%s'", app_path);
5d36d8
         }
5d36d8
 
5d36d8
         /* look for gnome vendor prefix */
5d36d8
         if (app_path == NULL) {
5d36d8
                 g_free (desktop_file);
5d36d8
                 desktop_file = g_strdup_printf ("gnome-%s.desktop", name);
5d36d8
 
5d36d8
                 g_key_file_load_from_dirs (key_file,
5d36d8
                                            desktop_file,
5d36d8
                                            (const char **) app_dirs,
5d36d8
                                            &app_path,
5d36d8
                                            G_KEY_FILE_NONE,
5d36d8
                                            NULL);
5d36d8
                 if (app_path != NULL) {
5d36d8
                         g_debug ("GsmUtil: found in XDG dirs: '%s'", app_path);
5d36d8
                 }
5d36d8
         }
5d36d8
 
5d36d8
         g_free (desktop_file);
5d36d8
         g_key_file_free (key_file);
5d36d8
 
5d36d8
         g_strfreev (app_dirs);
5d36d8
 
5d36d8
         return app_path;
5d36d8
 }
5d36d8
 
5d36d8
 static gboolean
5d36d8
 ensure_dir_exists (const char *dir)
5d36d8
 {
5d36d8
-        if (g_file_test (dir, G_FILE_TEST_IS_DIR))
5d36d8
-                return TRUE;
5d36d8
-
5d36d8
         if (g_mkdir_with_parents (dir, 0755) == 0)
5d36d8
                 return TRUE;
5d36d8
 
5d36d8
-        if (errno == EEXIST)
5d36d8
-                return g_file_test (dir, G_FILE_TEST_IS_DIR);
5d36d8
-
5d36d8
         g_warning ("GsmSessionSave: Failed to create directory %s: %s", dir, strerror (errno));
5d36d8
 
5d36d8
         return FALSE;
5d36d8
 }
5d36d8
 
5d36d8
 gchar *
5d36d8
 gsm_util_get_empty_tmp_session_dir (void)
5d36d8
 {
5d36d8
         char *tmp;
5d36d8
         gboolean exists;
5d36d8
 
5d36d8
         tmp = g_build_filename (g_get_user_config_dir (),
5d36d8
                                 "gnome-session",
5d36d8
                                 "saved-session.new",
5d36d8
                                 NULL);
5d36d8
 
5d36d8
         exists = ensure_dir_exists (tmp);
5d36d8
 
5d36d8
         if (G_UNLIKELY (!exists)) {
5d36d8
                 g_warning ("GsmSessionSave: could not create directory for saved session: %s", tmp);
5d36d8
                 g_free (tmp);
5d36d8
                 return NULL;
5d36d8
         } else {
5d36d8
                 /* make sure it's empty */
5d36d8
                 GDir       *dir;
5d36d8
                 const char *filename;
5d36d8
 
5d36d8
                 dir = g_dir_open (tmp, 0, NULL);
5d36d8
                 if (dir) {
5d36d8
                         while ((filename = g_dir_read_name (dir))) {
5d36d8
-- 
5d36d8
2.12.0
5d36d8