|
|
244a5d |
From abf8b3509a0debaf124669d9626a6d9883a1a0d3 Mon Sep 17 00:00:00 2001
|
|
|
5d36d8 |
From: Ray Strode <rstrode@redhat.com>
|
|
|
5d36d8 |
Date: Fri, 20 Dec 2013 11:22:07 -0500
|
|
|
5d36d8 |
Subject: [PATCH 09/19] Revert "Allow saved-session to be a symlink"
|
|
|
5d36d8 |
|
|
|
5d36d8 |
This reverts commit b733c2ee519b65c3c4eab0d0e93056412f995f3f.
|
|
|
5d36d8 |
---
|
|
|
5d36d8 |
gnome-session/gsm-session-save.c | 32 ++++++++++++++++++++++++++++----
|
|
|
5d36d8 |
gnome-session/gsm-util.c | 6 ++++++
|
|
|
5d36d8 |
2 files changed, 34 insertions(+), 4 deletions(-)
|
|
|
5d36d8 |
|
|
|
5d36d8 |
diff --git a/gnome-session/gsm-session-save.c b/gnome-session/gsm-session-save.c
|
|
|
5d36d8 |
index d6000e09..eebc5ff1 100644
|
|
|
5d36d8 |
--- a/gnome-session/gsm-session-save.c
|
|
|
5d36d8 |
+++ b/gnome-session/gsm-session-save.c
|
|
|
5d36d8 |
@@ -9,61 +9,61 @@
|
|
|
5d36d8 |
*
|
|
|
5d36d8 |
* This program is distributed in the hope that it will be useful, but
|
|
|
5d36d8 |
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
5d36d8 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
5d36d8 |
* Lesser General Public License for more details.
|
|
|
5d36d8 |
*
|
|
|
5d36d8 |
* You should have received a copy of the GNU General Public License
|
|
|
5d36d8 |
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
|
5d36d8 |
*/
|
|
|
5d36d8 |
|
|
|
5d36d8 |
#include <config.h>
|
|
|
5d36d8 |
|
|
|
5d36d8 |
#include <glib.h>
|
|
|
5d36d8 |
#include <glib/gstdio.h>
|
|
|
5d36d8 |
#include <gio/gio.h>
|
|
|
5d36d8 |
|
|
|
5d36d8 |
#include "gsm-util.h"
|
|
|
5d36d8 |
#include "gsm-autostart-app.h"
|
|
|
5d36d8 |
#include "gsm-client.h"
|
|
|
5d36d8 |
|
|
|
5d36d8 |
#include "gsm-session-save.h"
|
|
|
5d36d8 |
|
|
|
5d36d8 |
#define GSM_MANAGER_SCHEMA "org.gnome.SessionManager"
|
|
|
5d36d8 |
#define KEY_AUTOSAVE_ONE_SHOT "auto-save-session-one-shot"
|
|
|
5d36d8 |
|
|
|
5d36d8 |
|
|
|
5d36d8 |
static gboolean gsm_session_clear_saved_session (const char *directory,
|
|
|
5d36d8 |
GHashTable *discard_hash);
|
|
|
5d36d8 |
|
|
|
5d36d8 |
typedef struct {
|
|
|
5d36d8 |
- const char *dir;
|
|
|
5d36d8 |
+ char *dir;
|
|
|
5d36d8 |
GHashTable *discard_hash;
|
|
|
5d36d8 |
GError **error;
|
|
|
5d36d8 |
} SessionSaveData;
|
|
|
5d36d8 |
|
|
|
5d36d8 |
static gboolean
|
|
|
5d36d8 |
save_one_client (char *id,
|
|
|
5d36d8 |
GObject *object,
|
|
|
5d36d8 |
SessionSaveData *data)
|
|
|
5d36d8 |
{
|
|
|
5d36d8 |
GsmClient *client;
|
|
|
5d36d8 |
GKeyFile *keyfile;
|
|
|
5d36d8 |
const char *app_id;
|
|
|
5d36d8 |
char *path = NULL;
|
|
|
5d36d8 |
char *filename = NULL;
|
|
|
5d36d8 |
char *contents = NULL;
|
|
|
5d36d8 |
gsize length = 0;
|
|
|
5d36d8 |
char *discard_exec;
|
|
|
5d36d8 |
GError *local_error;
|
|
|
5d36d8 |
|
|
|
5d36d8 |
client = GSM_CLIENT (object);
|
|
|
5d36d8 |
|
|
|
5d36d8 |
local_error = NULL;
|
|
|
5d36d8 |
|
|
|
5d36d8 |
keyfile = gsm_client_save (client, &local_error);
|
|
|
5d36d8 |
|
|
|
5d36d8 |
if (keyfile == NULL || local_error) {
|
|
|
5d36d8 |
goto out;
|
|
|
5d36d8 |
}
|
|
|
5d36d8 |
|
|
|
5d36d8 |
contents = g_key_file_to_data (keyfile, &length, &local_error);
|
|
|
5d36d8 |
@@ -112,89 +112,113 @@ save_one_client (char *id,
|
|
|
5d36d8 |
}
|
|
|
5d36d8 |
|
|
|
5d36d8 |
g_debug ("GsmSessionSave: saved client %s to %s", id, filename);
|
|
|
5d36d8 |
|
|
|
5d36d8 |
out:
|
|
|
5d36d8 |
if (keyfile != NULL) {
|
|
|
5d36d8 |
g_key_file_free (keyfile);
|
|
|
5d36d8 |
}
|
|
|
5d36d8 |
|
|
|
5d36d8 |
g_free (contents);
|
|
|
5d36d8 |
g_free (filename);
|
|
|
5d36d8 |
g_free (path);
|
|
|
5d36d8 |
|
|
|
5d36d8 |
/* in case of any error, stop saving session */
|
|
|
5d36d8 |
if (local_error) {
|
|
|
5d36d8 |
g_propagate_error (data->error, local_error);
|
|
|
5d36d8 |
g_error_free (local_error);
|
|
|
5d36d8 |
|
|
|
5d36d8 |
return TRUE;
|
|
|
5d36d8 |
}
|
|
|
5d36d8 |
|
|
|
5d36d8 |
return FALSE;
|
|
|
5d36d8 |
}
|
|
|
5d36d8 |
|
|
|
5d36d8 |
void
|
|
|
5d36d8 |
gsm_session_save (GsmStore *client_store,
|
|
|
5d36d8 |
GError **error)
|
|
|
5d36d8 |
{
|
|
|
5d36d8 |
GSettings *settings;
|
|
|
5d36d8 |
const char *save_dir;
|
|
|
5d36d8 |
+ char *tmp_dir;
|
|
|
5d36d8 |
SessionSaveData data;
|
|
|
5d36d8 |
|
|
|
5d36d8 |
g_debug ("GsmSessionSave: Saving session");
|
|
|
5d36d8 |
|
|
|
5d36d8 |
/* Clear one shot key autosave in the event its set (so that it's actually
|
|
|
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 |
- data.dir = save_dir;
|
|
|
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 |
- /* remove old saved session */
|
|
|
5d36d8 |
- gsm_session_clear_saved_session (save_dir, data.discard_hash);
|
|
|
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 |
+
|
|
|
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 |
+ } 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 |
discard_exec = g_key_file_get_string (key_file,
|
|
|
5d36d8 |
G_KEY_FILE_DESKTOP_GROUP,
|
|
|
5d36d8 |
GSM_AUTOSTART_APP_DISCARD_KEY,
|
|
|
5d36d8 |
NULL);
|
|
|
5d36d8 |
if (!discard_exec)
|
|
|
5d36d8 |
goto out;
|
|
|
5d36d8 |
|
|
|
5d36d8 |
if (discard_hash && g_hash_table_lookup (discard_hash, discard_exec))
|
|
|
5d36d8 |
goto out;
|
|
|
5d36d8 |
|
|
|
5d36d8 |
diff --git a/gnome-session/gsm-util.c b/gnome-session/gsm-util.c
|
|
|
244a5d |
index 4772c6e6..30edb577 100644
|
|
|
5d36d8 |
--- a/gnome-session/gsm-util.c
|
|
|
5d36d8 |
+++ b/gnome-session/gsm-util.c
|
|
|
5d36d8 |
@@ -71,63 +71,69 @@ 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 |
--
|
|
|
244a5d |
2.14.2
|
|
|
5d36d8 |
|