]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Unset environment variables when switch display servers
authorRobert Ancell <robert.ancell@canonical.com>
Fri, 26 Jul 2013 01:31:52 +0000 (13:31 +1200)
committerRobert Ancell <robert.ancell@canonical.com>
Fri, 26 Jul 2013 01:31:52 +0000 (13:31 +1200)
src/display-server.c
src/display-server.h
src/session.c
src/session.h
src/x-server.c

index fd9dac4f94c5ad623ce2443d687c64c81f71fbcb..fc7eec92a61c0549d83c58bd5da58d1a8907f742 100644 (file)
@@ -76,13 +76,24 @@ display_server_real_start (DisplayServer *server)
 }
 
 void
-display_server_setup_session (DisplayServer *server, Session *session)
+display_server_connect_session (DisplayServer *server, Session *session)
 {
-    return DISPLAY_SERVER_GET_CLASS (server)->setup_session (server, session);
+    return DISPLAY_SERVER_GET_CLASS (server)->connect_session (server, session);
 }
 
 static void
-display_server_real_setup_session (DisplayServer *server, Session *session)
+display_server_real_connect_session (DisplayServer *server, Session *session)
+{
+}
+
+void
+display_server_disconnect_session (DisplayServer *server, Session *session)
+{
+    return DISPLAY_SERVER_GET_CLASS (server)->disconnect_session (server, session);
+}
+
+static void
+display_server_real_disconnect_session (DisplayServer *server, Session *session)
 {
 }
 
@@ -122,7 +133,8 @@ display_server_class_init (DisplayServerClass *klass)
 {
     klass->get_vt = display_server_real_get_vt;
     klass->start = display_server_real_start;
-    klass->setup_session = display_server_real_setup_session;
+    klass->connect_session = display_server_real_connect_session;
+    klass->disconnect_session = display_server_real_disconnect_session;
     klass->stop = display_server_real_stop;
 
     g_type_class_add_private (klass, sizeof (DisplayServerPrivate));
index d8551067f97a1d0b91cfa6cae8bbbcf28faca8f5..27fdc1c09d7b99937295fff106b923d48c4117ee 100644 (file)
@@ -42,7 +42,8 @@ typedef struct
 
     gint (*get_vt)(DisplayServer *server);
     gboolean (*start)(DisplayServer *server);
-    void (*setup_session)(DisplayServer *server, Session *session);
+    void (*connect_session)(DisplayServer *server, Session *session);
+    void (*disconnect_session)(DisplayServer *server, Session *session);
     void (*stop)(DisplayServer *server);
 } DisplayServerClass;
 
@@ -56,7 +57,9 @@ gint display_server_get_vt (DisplayServer *server);
 
 gboolean display_server_start (DisplayServer *server);
 
-void display_server_setup_session (DisplayServer *server, Session *session);
+void display_server_connect_session (DisplayServer *server, Session *session);
+
+void display_server_disconnect_session (DisplayServer *server, Session *session);
 
 void display_server_stop (DisplayServer *server);
 
index 22a11cd303e5a0e1ac88c178dbb5dcfe1130f662..c736129b3b23cac8133a36addb635ca7e59e540d 100644 (file)
@@ -191,7 +191,10 @@ session_set_display_server (Session *session, DisplayServer *display_server)
     g_return_if_fail (session != NULL);
     g_return_if_fail (display_server != NULL);
     if (session->priv->display_server)
+    {
+        display_server_disconnect_session (session->priv->display_server, session);
         g_object_unref (session->priv->display_server);
+    }
     session->priv->display_server = g_object_ref (display_server);
 }
 
@@ -240,11 +243,56 @@ session_set_remote_host_name (Session *session, const gchar *remote_host_name)
     session->priv->remote_host_name = g_strdup (remote_host_name);
 }
 
+static GList *
+find_env_entry (Session *session, const gchar *name)
+{
+    GList *link;
+
+    for (link = session->priv->env; link; link = link->next)
+    {
+        const gchar *entry = link->data;
+
+        if (g_str_has_prefix (entry, name) && entry[strlen (name)] == '=')
+            return link;
+    }
+
+    return NULL;
+}
+
 void
 session_set_env (Session *session, const gchar *name, const gchar *value)
 {
+    GList *link;
+    gchar *entry;
+
+    g_return_if_fail (session != NULL);
+    g_return_if_fail (value != NULL);
+
+    entry = g_strdup_printf ("%s=%s", name, value);
+
+    link = find_env_entry (session, name);
+    if (link)
+    {
+        g_free (link->data);
+        link->data = entry;
+    }
+    else
+        session->priv->env = g_list_append (session->priv->env, entry);
+}
+
+void
+session_unset_env (Session *session, const gchar *name)
+{
+    GList *link;
+
     g_return_if_fail (session != NULL);
-    session->priv->env = g_list_append (session->priv->env, g_strdup_printf ("%s=%s", name, value));
+  
+    link = find_env_entry (session, name);
+    if (!link)
+        return;
+
+    g_free (link->data);
+    session->priv->env = g_list_remove_link (session->priv->env, link);
 }
 
 void
@@ -475,7 +523,7 @@ session_real_start (Session *session)
 
     g_return_val_if_fail (session->priv->pid == 0, FALSE);
 
-    display_server_setup_session (session->priv->display_server, session);
+    display_server_connect_session (session->priv->display_server, session);
 
     /* Create pipes to talk to the child */
     if (pipe (to_child_pipe) < 0 || pipe (from_child_pipe) < 0)
@@ -656,7 +704,7 @@ session_real_run (Session *session)
     g_return_if_fail (session->priv->argv != NULL);
     g_return_if_fail (session->priv->pid != 0);
 
-    display_server_setup_session (session->priv->display_server, session);
+    display_server_connect_session (session->priv->display_server, session);
 
     session->priv->command_run = TRUE;
 
index 6e2b2e77a0adfeda4c4e8f6e9c669291306b55e7..a74b40989d9a1900a0abbafa89a50123b7d5d050 100644 (file)
@@ -94,6 +94,8 @@ void session_set_remote_host_name (Session *session, const gchar *remote_host_na
 
 void session_set_env (Session *session, const gchar *name, const gchar *value);
 
+void session_unset_env (Session *session, const gchar *name);
+
 void session_set_argv (Session *session, gchar **argv);
 
 // FIXME: Remove
index 8bc14dc4868ad125d82acbfb7a9d25f46bcd2eac..c8960ceb449662aeeff3b42c698a55856fec9c09 100644 (file)
@@ -133,7 +133,7 @@ x_server_start (DisplayServer *display_server)
 }
 
 static void
-x_server_setup_session (DisplayServer *display_server, Session *session)
+x_server_connect_session (DisplayServer *display_server, Session *session)
 {
     gint vt;
 
@@ -162,6 +162,17 @@ x_server_setup_session (DisplayServer *display_server, Session *session)
                              config_get_boolean (config_get_instance (), "LightDM", "user-authority-in-system-dir"));
 }
 
+static void
+x_server_disconnect_session (DisplayServer *display_server, Session *session)
+{
+    session_set_tty (session, NULL);
+    session_unset_env (session, "XDG_VTNR");
+    session_unset_env (session, "DISPLAY");
+    session_set_xdisplay (session, NULL);
+    session_set_remote_host_name (session, NULL);
+    session_set_x_authority (session, NULL, FALSE);
+}
+
 void
 x_server_init (XServer *server)
 {
@@ -192,7 +203,8 @@ x_server_class_init (XServerClass *klass)
     DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
 
     display_server_class->start = x_server_start;
-    display_server_class->setup_session = x_server_setup_session;
+    display_server_class->connect_session = x_server_connect_session;
+    display_server_class->disconnect_session = x_server_disconnect_session;
     object_class->finalize = x_server_finalize;
 
     g_type_class_add_private (klass, sizeof (XServerPrivate));