|
William Jon McCann |
32ed7aa |
Index: gdm/daemon/gdm-session-direct.c
|
|
William Jon McCann |
32ed7aa |
===================================================================
|
|
William Jon McCann |
32ed7aa |
--- gdm/daemon/gdm-session-direct.c (revision 5874)
|
|
William Jon McCann |
32ed7aa |
+++ gdm/daemon/gdm-session-direct.c (working copy)
|
|
William Jon McCann |
32ed7aa |
@@ -842,6 +842,130 @@ gdm_session_direct_handle_saved_language
|
|
William Jon McCann |
32ed7aa |
return DBUS_HANDLER_RESULT_HANDLED;
|
|
William Jon McCann |
32ed7aa |
}
|
|
William Jon McCann |
32ed7aa |
|
|
William Jon McCann |
32ed7aa |
+static gboolean
|
|
William Jon McCann |
32ed7aa |
+is_prog_in_path (const char *prog)
|
|
William Jon McCann |
32ed7aa |
+{
|
|
William Jon McCann |
32ed7aa |
+ char *f;
|
|
William Jon McCann |
32ed7aa |
+ gboolean ret;
|
|
William Jon McCann |
32ed7aa |
+
|
|
William Jon McCann |
32ed7aa |
+ f = g_find_program_in_path (prog);
|
|
William Jon McCann |
32ed7aa |
+ ret = (f != NULL);
|
|
William Jon McCann |
32ed7aa |
+ g_free (f);
|
|
William Jon McCann |
32ed7aa |
+ return ret;
|
|
William Jon McCann |
32ed7aa |
+}
|
|
William Jon McCann |
32ed7aa |
+
|
|
William Jon McCann |
32ed7aa |
+static gboolean
|
|
William Jon McCann |
32ed7aa |
+get_session_command_for_file (const char *file,
|
|
William Jon McCann |
32ed7aa |
+ char **command)
|
|
William Jon McCann |
32ed7aa |
+{
|
|
William Jon McCann |
32ed7aa |
+ GKeyFile *key_file;
|
|
William Jon McCann |
32ed7aa |
+ GError *error;
|
|
William Jon McCann |
32ed7aa |
+ char *full_path;
|
|
William Jon McCann |
32ed7aa |
+ char *exec;
|
|
William Jon McCann |
32ed7aa |
+ gboolean ret;
|
|
William Jon McCann |
32ed7aa |
+ gboolean res;
|
|
William Jon McCann |
32ed7aa |
+ const char *search_dirs[] = {
|
|
William Jon McCann |
32ed7aa |
+ "/etc/X11/sessions/",
|
|
William Jon McCann |
32ed7aa |
+ DMCONFDIR "/Sessions/",
|
|
William Jon McCann |
32ed7aa |
+ DATADIR "/gdm/BuiltInSessions/",
|
|
William Jon McCann |
32ed7aa |
+ DATADIR "/xsessions/",
|
|
William Jon McCann |
32ed7aa |
+ NULL
|
|
William Jon McCann |
32ed7aa |
+ };
|
|
William Jon McCann |
32ed7aa |
+
|
|
William Jon McCann |
32ed7aa |
+ exec = NULL;
|
|
William Jon McCann |
32ed7aa |
+ ret = FALSE;
|
|
William Jon McCann |
32ed7aa |
+ if (command != NULL) {
|
|
William Jon McCann |
32ed7aa |
+ *command = NULL;
|
|
William Jon McCann |
32ed7aa |
+ }
|
|
William Jon McCann |
32ed7aa |
+
|
|
William Jon McCann |
32ed7aa |
+ key_file = g_key_file_new ();
|
|
William Jon McCann |
32ed7aa |
+
|
|
William Jon McCann |
32ed7aa |
+ g_debug ("GdmSessionDirect: looking for session file '%s'", file);
|
|
William Jon McCann |
32ed7aa |
+
|
|
William Jon McCann |
32ed7aa |
+ error = NULL;
|
|
William Jon McCann |
32ed7aa |
+ full_path = NULL;
|
|
William Jon McCann |
32ed7aa |
+ res = g_key_file_load_from_dirs (key_file,
|
|
William Jon McCann |
32ed7aa |
+ file,
|
|
William Jon McCann |
32ed7aa |
+ search_dirs,
|
|
William Jon McCann |
32ed7aa |
+ &full_path,
|
|
William Jon McCann |
32ed7aa |
+ G_KEY_FILE_NONE,
|
|
William Jon McCann |
32ed7aa |
+ &error);
|
|
William Jon McCann |
32ed7aa |
+ if (! res) {
|
|
William Jon McCann |
32ed7aa |
+ g_debug ("GdmSessionDirect: File '%s' not found: %s", file, error->message);
|
|
William Jon McCann |
32ed7aa |
+ g_error_free (error);
|
|
William Jon McCann |
32ed7aa |
+ if (command != NULL) {
|
|
William Jon McCann |
32ed7aa |
+ *command = NULL;
|
|
William Jon McCann |
32ed7aa |
+ }
|
|
William Jon McCann |
32ed7aa |
+ goto out;
|
|
William Jon McCann |
32ed7aa |
+ }
|
|
William Jon McCann |
32ed7aa |
+
|
|
William Jon McCann |
32ed7aa |
+ error = NULL;
|
|
William Jon McCann |
32ed7aa |
+ res = g_key_file_get_boolean (key_file,
|
|
William Jon McCann |
32ed7aa |
+ G_KEY_FILE_DESKTOP_GROUP,
|
|
William Jon McCann |
32ed7aa |
+ G_KEY_FILE_DESKTOP_KEY_HIDDEN,
|
|
William Jon McCann |
32ed7aa |
+ &error);
|
|
William Jon McCann |
32ed7aa |
+ if (error == NULL && res) {
|
|
William Jon McCann |
32ed7aa |
+ g_debug ("GdmSessionDirect: Session %s is marked as hidden", file);
|
|
William Jon McCann |
32ed7aa |
+ goto out;
|
|
William Jon McCann |
32ed7aa |
+ }
|
|
William Jon McCann |
32ed7aa |
+
|
|
William Jon McCann |
32ed7aa |
+ error = NULL;
|
|
William Jon McCann |
32ed7aa |
+ exec = g_key_file_get_string (key_file,
|
|
William Jon McCann |
32ed7aa |
+ G_KEY_FILE_DESKTOP_GROUP,
|
|
William Jon McCann |
32ed7aa |
+ G_KEY_FILE_DESKTOP_KEY_TRY_EXEC,
|
|
William Jon McCann |
32ed7aa |
+ &error);
|
|
William Jon McCann |
32ed7aa |
+ if (exec == NULL) {
|
|
William Jon McCann |
32ed7aa |
+ g_debug ("GdmSessionDirect: %s key not found", G_KEY_FILE_DESKTOP_KEY_TRY_EXEC);
|
|
William Jon McCann |
32ed7aa |
+ goto out;
|
|
William Jon McCann |
32ed7aa |
+ }
|
|
William Jon McCann |
32ed7aa |
+
|
|
William Jon McCann |
32ed7aa |
+ res = is_prog_in_path (exec);
|
|
William Jon McCann |
32ed7aa |
+ g_free (exec);
|
|
William Jon McCann |
32ed7aa |
+
|
|
William Jon McCann |
32ed7aa |
+ if (! res) {
|
|
William Jon McCann |
32ed7aa |
+ g_debug ("GdmSessionDirect: Command not found: %s", G_KEY_FILE_DESKTOP_KEY_TRY_EXEC);
|
|
William Jon McCann |
32ed7aa |
+ goto out;
|
|
William Jon McCann |
32ed7aa |
+ }
|
|
William Jon McCann |
32ed7aa |
+
|
|
William Jon McCann |
32ed7aa |
+ error = NULL;
|
|
William Jon McCann |
32ed7aa |
+ exec = g_key_file_get_string (key_file,
|
|
William Jon McCann |
32ed7aa |
+ G_KEY_FILE_DESKTOP_GROUP,
|
|
William Jon McCann |
32ed7aa |
+ G_KEY_FILE_DESKTOP_KEY_EXEC,
|
|
William Jon McCann |
32ed7aa |
+ &error);
|
|
William Jon McCann |
32ed7aa |
+ if (error != NULL) {
|
|
William Jon McCann |
32ed7aa |
+ g_debug ("GdmSessionDirect: %s key not found: %s",
|
|
William Jon McCann |
32ed7aa |
+ G_KEY_FILE_DESKTOP_KEY_EXEC,
|
|
William Jon McCann |
32ed7aa |
+ error->message);
|
|
William Jon McCann |
32ed7aa |
+ g_error_free (error);
|
|
William Jon McCann |
32ed7aa |
+ goto out;
|
|
William Jon McCann |
32ed7aa |
+ }
|
|
William Jon McCann |
32ed7aa |
+
|
|
William Jon McCann |
32ed7aa |
+ if (command != NULL) {
|
|
William Jon McCann |
32ed7aa |
+ *command = g_strdup (exec);
|
|
William Jon McCann |
32ed7aa |
+ }
|
|
William Jon McCann |
32ed7aa |
+ ret = TRUE;
|
|
William Jon McCann |
32ed7aa |
+
|
|
William Jon McCann |
32ed7aa |
+out:
|
|
William Jon McCann |
32ed7aa |
+ g_free (exec);
|
|
William Jon McCann |
32ed7aa |
+
|
|
William Jon McCann |
32ed7aa |
+ return ret;
|
|
William Jon McCann |
32ed7aa |
+}
|
|
William Jon McCann |
32ed7aa |
+
|
|
William Jon McCann |
32ed7aa |
+static gboolean
|
|
William Jon McCann |
32ed7aa |
+get_session_command_for_name (const char *name,
|
|
William Jon McCann |
32ed7aa |
+ char **command)
|
|
William Jon McCann |
32ed7aa |
+{
|
|
William Jon McCann |
32ed7aa |
+ gboolean res;
|
|
William Jon McCann |
32ed7aa |
+ char *filename;
|
|
William Jon McCann |
32ed7aa |
+
|
|
William Jon McCann |
32ed7aa |
+ filename = g_strdup_printf ("%s.desktop", name);
|
|
William Jon McCann |
32ed7aa |
+
|
|
William Jon McCann |
32ed7aa |
+ command = NULL;
|
|
William Jon McCann |
32ed7aa |
+ res = get_session_command_for_file (filename, command);
|
|
William Jon McCann |
32ed7aa |
+
|
|
William Jon McCann |
32ed7aa |
+ return res;
|
|
William Jon McCann |
32ed7aa |
+}
|
|
William Jon McCann |
32ed7aa |
+
|
|
William Jon McCann |
32ed7aa |
static DBusHandlerResult
|
|
William Jon McCann |
32ed7aa |
gdm_session_direct_handle_saved_session_name_read (GdmSessionDirect *session,
|
|
William Jon McCann |
32ed7aa |
DBusConnection *connection,
|
|
William Jon McCann |
32ed7aa |
@@ -862,6 +986,14 @@ gdm_session_direct_handle_saved_session_
|
|
William Jon McCann |
32ed7aa |
dbus_connection_send (connection, reply, NULL);
|
|
William Jon McCann |
32ed7aa |
dbus_message_unref (reply);
|
|
William Jon McCann |
32ed7aa |
|
|
William Jon McCann |
32ed7aa |
+ if (! get_session_command_for_name (session_name, NULL)) {
|
|
William Jon McCann |
32ed7aa |
+ /* ignore sessions that don't exist */
|
|
William Jon McCann |
32ed7aa |
+ g_debug ("GdmSessionDirect: not using invalid .dmrc session: %s", session_name);
|
|
William Jon McCann |
32ed7aa |
+ g_free (session->priv->saved_session);
|
|
William Jon McCann |
32ed7aa |
+ session->priv->saved_session = NULL;
|
|
William Jon McCann |
32ed7aa |
+ goto out;
|
|
William Jon McCann |
32ed7aa |
+ }
|
|
William Jon McCann |
32ed7aa |
+
|
|
William Jon McCann |
32ed7aa |
if (strcmp (session_name,
|
|
William Jon McCann |
32ed7aa |
get_default_session_name (session)) != 0) {
|
|
William Jon McCann |
32ed7aa |
g_free (session->priv->saved_session);
|
|
William Jon McCann |
32ed7aa |
@@ -870,7 +1002,7 @@ gdm_session_direct_handle_saved_session_
|
|
William Jon McCann |
32ed7aa |
_gdm_session_default_session_name_changed (GDM_SESSION (session),
|
|
William Jon McCann |
32ed7aa |
session_name);
|
|
William Jon McCann |
32ed7aa |
}
|
|
William Jon McCann |
32ed7aa |
-
|
|
William Jon McCann |
32ed7aa |
+ out:
|
|
William Jon McCann |
32ed7aa |
return DBUS_HANDLER_RESULT_HANDLED;
|
|
William Jon McCann |
32ed7aa |
}
|
|
William Jon McCann |
32ed7aa |
|
|
William Jon McCann |
32ed7aa |
@@ -1603,115 +1735,6 @@ send_environment (GdmSessionDirect *sess
|
|
William Jon McCann |
32ed7aa |
session);
|
|
William Jon McCann |
32ed7aa |
}
|
|
William Jon McCann |
32ed7aa |
|
|
William Jon McCann |
32ed7aa |
-static gboolean
|
|
William Jon McCann |
32ed7aa |
-is_prog_in_path (const char *prog)
|
|
William Jon McCann |
32ed7aa |
-{
|
|
William Jon McCann |
32ed7aa |
- char *f;
|
|
William Jon McCann |
32ed7aa |
- gboolean ret;
|
|
William Jon McCann |
32ed7aa |
-
|
|
William Jon McCann |
32ed7aa |
- f = g_find_program_in_path (prog);
|
|
William Jon McCann |
32ed7aa |
- ret = (f != NULL);
|
|
William Jon McCann |
32ed7aa |
- g_free (f);
|
|
William Jon McCann |
32ed7aa |
- return ret;
|
|
William Jon McCann |
32ed7aa |
-}
|
|
William Jon McCann |
32ed7aa |
-
|
|
William Jon McCann |
32ed7aa |
-static gboolean
|
|
William Jon McCann |
32ed7aa |
-get_session_command_for_file (const char *file,
|
|
William Jon McCann |
32ed7aa |
- char **command)
|
|
William Jon McCann |
32ed7aa |
-{
|
|
William Jon McCann |
32ed7aa |
- GKeyFile *key_file;
|
|
William Jon McCann |
32ed7aa |
- GError *error;
|
|
William Jon McCann |
32ed7aa |
- char *full_path;
|
|
William Jon McCann |
32ed7aa |
- char *exec;
|
|
William Jon McCann |
32ed7aa |
- gboolean ret;
|
|
William Jon McCann |
32ed7aa |
- gboolean res;
|
|
William Jon McCann |
32ed7aa |
- const char *search_dirs[] = {
|
|
William Jon McCann |
32ed7aa |
- "/etc/X11/sessions/",
|
|
William Jon McCann |
32ed7aa |
- DMCONFDIR "/Sessions/",
|
|
William Jon McCann |
32ed7aa |
- DATADIR "/gdm/BuiltInSessions/",
|
|
William Jon McCann |
32ed7aa |
- DATADIR "/xsessions/",
|
|
William Jon McCann |
32ed7aa |
- NULL
|
|
William Jon McCann |
32ed7aa |
- };
|
|
William Jon McCann |
32ed7aa |
-
|
|
William Jon McCann |
32ed7aa |
- exec = NULL;
|
|
William Jon McCann |
32ed7aa |
- ret = FALSE;
|
|
William Jon McCann |
32ed7aa |
- if (command != NULL) {
|
|
William Jon McCann |
32ed7aa |
- *command = NULL;
|
|
William Jon McCann |
32ed7aa |
- }
|
|
William Jon McCann |
32ed7aa |
-
|
|
William Jon McCann |
32ed7aa |
- key_file = g_key_file_new ();
|
|
William Jon McCann |
32ed7aa |
-
|
|
William Jon McCann |
32ed7aa |
- g_debug ("GdmSessionDirect: looking for session file '%s'", file);
|
|
William Jon McCann |
32ed7aa |
-
|
|
William Jon McCann |
32ed7aa |
- error = NULL;
|
|
William Jon McCann |
32ed7aa |
- full_path = NULL;
|
|
William Jon McCann |
32ed7aa |
- res = g_key_file_load_from_dirs (key_file,
|
|
William Jon McCann |
32ed7aa |
- file,
|
|
William Jon McCann |
32ed7aa |
- search_dirs,
|
|
William Jon McCann |
32ed7aa |
- &full_path,
|
|
William Jon McCann |
32ed7aa |
- G_KEY_FILE_NONE,
|
|
William Jon McCann |
32ed7aa |
- &error);
|
|
William Jon McCann |
32ed7aa |
- if (! res) {
|
|
William Jon McCann |
32ed7aa |
- g_debug ("GdmSessionDirect: File '%s' not found: %s", file, error->message);
|
|
William Jon McCann |
32ed7aa |
- g_error_free (error);
|
|
William Jon McCann |
32ed7aa |
- if (command != NULL) {
|
|
William Jon McCann |
32ed7aa |
- *command = NULL;
|
|
William Jon McCann |
32ed7aa |
- }
|
|
William Jon McCann |
32ed7aa |
- goto out;
|
|
William Jon McCann |
32ed7aa |
- }
|
|
William Jon McCann |
32ed7aa |
-
|
|
William Jon McCann |
32ed7aa |
- error = NULL;
|
|
William Jon McCann |
32ed7aa |
- res = g_key_file_get_boolean (key_file,
|
|
William Jon McCann |
32ed7aa |
- G_KEY_FILE_DESKTOP_GROUP,
|
|
William Jon McCann |
32ed7aa |
- G_KEY_FILE_DESKTOP_KEY_HIDDEN,
|
|
William Jon McCann |
32ed7aa |
- &error);
|
|
William Jon McCann |
32ed7aa |
- if (error == NULL && res) {
|
|
William Jon McCann |
32ed7aa |
- g_debug ("GdmSessionDirect: Session %s is marked as hidden", file);
|
|
William Jon McCann |
32ed7aa |
- goto out;
|
|
William Jon McCann |
32ed7aa |
- }
|
|
William Jon McCann |
32ed7aa |
-
|
|
William Jon McCann |
32ed7aa |
- error = NULL;
|
|
William Jon McCann |
32ed7aa |
- exec = g_key_file_get_string (key_file,
|
|
William Jon McCann |
32ed7aa |
- G_KEY_FILE_DESKTOP_GROUP,
|
|
William Jon McCann |
32ed7aa |
- G_KEY_FILE_DESKTOP_KEY_TRY_EXEC,
|
|
William Jon McCann |
32ed7aa |
- &error);
|
|
William Jon McCann |
32ed7aa |
- if (exec == NULL) {
|
|
William Jon McCann |
32ed7aa |
- g_debug ("GdmSessionDirect: %s key not found", G_KEY_FILE_DESKTOP_KEY_TRY_EXEC);
|
|
William Jon McCann |
32ed7aa |
- goto out;
|
|
William Jon McCann |
32ed7aa |
- }
|
|
William Jon McCann |
32ed7aa |
-
|
|
William Jon McCann |
32ed7aa |
- res = is_prog_in_path (exec);
|
|
William Jon McCann |
32ed7aa |
- g_free (exec);
|
|
William Jon McCann |
32ed7aa |
-
|
|
William Jon McCann |
32ed7aa |
- if (! res) {
|
|
William Jon McCann |
32ed7aa |
- g_debug ("GdmSessionDirect: Command not found: %s", G_KEY_FILE_DESKTOP_KEY_TRY_EXEC);
|
|
William Jon McCann |
32ed7aa |
- goto out;
|
|
William Jon McCann |
32ed7aa |
- }
|
|
William Jon McCann |
32ed7aa |
-
|
|
William Jon McCann |
32ed7aa |
- error = NULL;
|
|
William Jon McCann |
32ed7aa |
- exec = g_key_file_get_string (key_file,
|
|
William Jon McCann |
32ed7aa |
- G_KEY_FILE_DESKTOP_GROUP,
|
|
William Jon McCann |
32ed7aa |
- G_KEY_FILE_DESKTOP_KEY_EXEC,
|
|
William Jon McCann |
32ed7aa |
- &error);
|
|
William Jon McCann |
32ed7aa |
- if (error != NULL) {
|
|
William Jon McCann |
32ed7aa |
- g_debug ("GdmSessionDirect: %s key not found: %s",
|
|
William Jon McCann |
32ed7aa |
- G_KEY_FILE_DESKTOP_KEY_EXEC,
|
|
William Jon McCann |
32ed7aa |
- error->message);
|
|
William Jon McCann |
32ed7aa |
- g_error_free (error);
|
|
William Jon McCann |
32ed7aa |
- goto out;
|
|
William Jon McCann |
32ed7aa |
- }
|
|
William Jon McCann |
32ed7aa |
-
|
|
William Jon McCann |
32ed7aa |
- if (command != NULL) {
|
|
William Jon McCann |
32ed7aa |
- *command = g_strdup (exec);
|
|
William Jon McCann |
32ed7aa |
- }
|
|
William Jon McCann |
32ed7aa |
- ret = TRUE;
|
|
William Jon McCann |
32ed7aa |
-
|
|
William Jon McCann |
32ed7aa |
-out:
|
|
William Jon McCann |
32ed7aa |
- g_free (exec);
|
|
William Jon McCann |
32ed7aa |
-
|
|
William Jon McCann |
32ed7aa |
- return ret;
|
|
William Jon McCann |
32ed7aa |
-}
|
|
William Jon McCann |
32ed7aa |
-
|
|
William Jon McCann |
32ed7aa |
static const char *
|
|
William Jon McCann |
32ed7aa |
get_language_name (GdmSessionDirect *session)
|
|
William Jon McCann |
32ed7aa |
{
|
|
William Jon McCann |
32ed7aa |
@@ -1725,6 +1748,8 @@ get_language_name (GdmSessionDirect *ses
|
|
William Jon McCann |
32ed7aa |
static const char *
|
|
William Jon McCann |
32ed7aa |
get_session_name (GdmSessionDirect *session)
|
|
William Jon McCann |
32ed7aa |
{
|
|
William Jon McCann |
32ed7aa |
+ /* FIXME: test the session names before we use them? */
|
|
William Jon McCann |
32ed7aa |
+
|
|
William Jon McCann |
32ed7aa |
if (session->priv->selected_session != NULL) {
|
|
William Jon McCann |
32ed7aa |
return session->priv->selected_session;
|
|
William Jon McCann |
32ed7aa |
}
|