]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blobdiff - src/session.c
Make an XServerXmir object
[sojka/lightdm.git] / src / session.c
index 1ec2c3e55b8b3c934fbb19b5ab78f63b95b8555f..3c7a34bd91dde310ce83f0865596429a2779e583 100644 (file)
@@ -38,8 +38,8 @@ static guint signals[LAST_SIGNAL] = { 0 };
 
 struct SessionPrivate
 {
-    /* Session type */
-    gchar *session_type;
+    /* Configuration for this session */
+    SessionConfig *config;
 
     /* Display server running on */
     DisplayServer *display_server;
@@ -84,6 +84,7 @@ struct SessionPrivate
 
     /* File to log to */
     gchar *log_filename;
+    LogMode log_mode;
 
     /* tty this session is running on */
     gchar *tty;
@@ -99,8 +100,8 @@ struct SessionPrivate
     /* Console kit cookie */
     gchar *console_kit_cookie;
 
-    /* login1 session */
-    gchar *login1_session;
+    /* login1 session ID */
+    gchar *login1_session_id;
 
     /* Environment to set in child */
     GList *env;
@@ -131,18 +132,26 @@ session_new (void)
 }
 
 void
-session_set_session_type (Session *session, const gchar *session_type)
+session_set_config (Session *session, SessionConfig *config)
 {
     g_return_if_fail (session != NULL);
-    g_free (session->priv->session_type);
-    session->priv->session_type = g_strdup (session_type);
+
+    g_clear_object (&session->priv->config);
+    session->priv->config = g_object_ref (config);
+}
+
+SessionConfig *
+session_get_config (Session *session)
+{
+    g_return_val_if_fail (session != NULL, NULL);
+    return session->priv->config;
 }
 
 const gchar *
 session_get_session_type (Session *session)
 {
     g_return_val_if_fail (session != NULL, NULL);
-    return session->priv->session_type;
+    return session_config_get_session_type (session_get_config (session));
 }
 
 void
@@ -190,11 +199,12 @@ session_get_is_guest (Session *session)
 }
 
 void
-session_set_log_file (Session *session, const gchar *filename)
+session_set_log_file (Session *session, const gchar *filename, LogMode log_mode)
 {
     g_return_if_fail (session != NULL);
     g_free (session->priv->log_filename);
     session->priv->log_filename = g_strdup (filename);
+    session->priv->log_mode = log_mode;
 }
 
 void
@@ -202,6 +212,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)
+        return;
+
     if (session->priv->display_server)
     {
         display_server_disconnect_session (session->priv->display_server, session);
@@ -237,11 +251,7 @@ void
 session_set_x_authority (Session *session, XAuthority *authority, gboolean use_system_location)
 {
     g_return_if_fail (session != NULL);
-    if (session->priv->x_authority)
-    {
-        g_object_unref (session->priv->x_authority);
-        session->priv->x_authority = NULL;
-    }
+    g_clear_object (&session->priv->x_authority);
     if (authority)
         session->priv->x_authority = g_object_ref (authority);
     session->priv->x_authority_use_system_location = use_system_location;
@@ -301,7 +311,7 @@ session_get_env (Session *session, const gchar *name)
     link = find_env_entry (session, name);
     if (!link)
         return NULL;
-  
+
     entry = link->data;
 
     return entry + strlen (name) + 1;
@@ -313,7 +323,7 @@ session_unset_env (Session *session, const gchar *name)
     GList *link;
 
     g_return_if_fail (session != NULL);
-  
+
     link = find_env_entry (session, name);
     if (!link)
         return;
@@ -475,9 +485,7 @@ from_child_cb (GIOChannel *source, GIOCondition condition, gpointer data)
     {
         g_free (session->priv->username);
         session->priv->username = username;
-        if (session->priv->user)
-            g_object_unref (session->priv->user);
-        session->priv->user = NULL;
+        g_clear_object (&session->priv->user);
     }
     else
         g_free (username);
@@ -617,7 +625,7 @@ session_real_start (Session *session)
     close (from_child_input);
 
     /* Indicate what version of the protocol we are using */
-    version = 1;
+    version = 3;
     write_data (session, &version, sizeof (version));
 
     /* Send configuration */
@@ -643,6 +651,13 @@ session_get_username (Session *session)
     return session->priv->username;
 }
 
+const gchar *
+session_get_login1_session_id (Session *session)
+{
+    g_return_val_if_fail (session != NULL, NULL);
+    return session->priv->login1_session_id;
+}
+
 const gchar *
 session_get_console_kit_cookie (Session *session)
 {
@@ -782,6 +797,7 @@ session_real_run (Session *session)
     if (session->priv->log_filename)
         l_debug (session, "Logging to %s", session->priv->log_filename);
     write_string (session, session->priv->log_filename);
+    write_data (session, &session->priv->log_mode, sizeof (session->priv->log_mode));
     write_string (session, session->priv->tty);
     write_string (session, x_authority_filename);
     g_free (x_authority_filename);
@@ -791,15 +807,14 @@ session_real_run (Session *session)
     write_data (session, &argc, sizeof (argc));
     for (link = session->priv->env; link; link = link->next)
         write_string (session, (gchar *) link->data);
+
     argc = g_strv_length (session->priv->argv);
     write_data (session, &argc, sizeof (argc));
     for (i = 0; i < argc; i++)
         write_string (session, session->priv->argv[i]);
 
-    if (login1_is_running ())
-        session->priv->login1_session = read_string_from_child (session);
-    if (!session->priv->login1_session)
-        session->priv->console_kit_cookie = read_string_from_child (session);
+    session->priv->login1_session_id = read_string_from_child (session);
+    session->priv->console_kit_cookie = read_string_from_child (session);
 }
 
 void
@@ -808,8 +823,8 @@ session_lock (Session *session)
     g_return_if_fail (session != NULL);
     if (getuid () == 0)
     {
-        if (session->priv->login1_session)
-            login1_lock_session (session->priv->login1_session);
+        if (session->priv->login1_session_id)
+            login1_service_lock_session (login1_service_get_instance (), session->priv->login1_session_id);
         else if (session->priv->console_kit_cookie)
             ck_lock_session (session->priv->console_kit_cookie);
     }
@@ -821,8 +836,8 @@ session_unlock (Session *session)
     g_return_if_fail (session != NULL);
     if (getuid () == 0)
     {
-        if (session->priv->login1_session)
-            login1_unlock_session (session->priv->login1_session);
+        if (session->priv->login1_session_id)
+            login1_service_unlock_session (login1_service_get_instance (), session->priv->login1_session_id);
         else if (session->priv->console_kit_cookie)
             ck_unlock_session (session->priv->console_kit_cookie);
     }
@@ -834,8 +849,8 @@ session_activate (Session *session)
     g_return_if_fail (session != NULL);
     if (getuid () == 0)
     {
-        if (session->priv->login1_session)
-            login1_activate_session (session->priv->login1_session);
+        if (session->priv->login1_session_id)
+            login1_service_activate_session (login1_service_get_instance (), session->priv->login1_session_id);
         else if (session->priv->console_kit_cookie)
             ck_activate_session (session->priv->console_kit_cookie);
     }
@@ -846,6 +861,24 @@ session_stop (Session *session)
 {
     g_return_if_fail (session != NULL);
 
+    /* If can cleanly stop then do that */
+    if (session_get_is_authenticated (session) && !session->priv->command_run)
+    {
+        gsize n = 0;
+        LogMode log_mode = LOG_MODE_INVALID;
+
+        session->priv->command_run = TRUE;
+        write_string (session, NULL); // log filename
+        write_data (session, &log_mode, sizeof (log_mode)); // log mode
+        write_string (session, NULL); // tty
+        write_string (session, NULL); // xauth filename
+        write_string (session, NULL); // xdisplay
+        write_xauth (session, NULL); // xauth
+        write_data (session, &n, sizeof (n)); // environment
+        write_data (session, &n, sizeof (n)); // command
+        return;
+    }
+
     if (session->priv->stopping)
         return;
     session->priv->stopping = TRUE;
@@ -880,6 +913,9 @@ session_init (Session *session)
 {
     session->priv = G_TYPE_INSTANCE_GET_PRIVATE (session, SESSION_TYPE, SessionPrivate);
     session->priv->log_filename = g_strdup (".xsession-errors");
+    session->priv->log_mode = LOG_MODE_BACKUP_AND_TRUNCATE;
+    session->priv->to_child_input = -1;
+    session->priv->from_child_output = -1;
 }
 
 static void
@@ -888,11 +924,12 @@ session_finalize (GObject *object)
     Session *self = SESSION (object);
     int i;
 
-    g_free (self->priv->session_type);
-    if (self->priv->display_server)
-        g_object_unref (self->priv->display_server);
+    g_clear_object (&self->priv->config);
+    g_clear_object (&self->priv->display_server);
     if (self->priv->pid)
         kill (self->priv->pid, SIGKILL);
+    close (self->priv->to_child_input);
+    close (self->priv->from_child_output);
     if (self->priv->from_child_channel)
         g_io_channel_unref (self->priv->from_child_channel);
     if (self->priv->from_child_watch)
@@ -900,8 +937,7 @@ session_finalize (GObject *object)
     if (self->priv->child_watch)
         g_source_remove (self->priv->child_watch);
     g_free (self->priv->username);
-    if (self->priv->user)
-        g_object_unref (self->priv->user);
+    g_clear_object (&self->priv->user);
     g_free (self->priv->pam_service);
     for (i = 0; i < self->priv->messages_length; i++)
         g_free ((char *) self->priv->messages[i].msg);
@@ -910,10 +946,9 @@ session_finalize (GObject *object)
     g_free (self->priv->log_filename);
     g_free (self->priv->tty);
     g_free (self->priv->xdisplay);
-    if (self->priv->x_authority)
-        g_object_unref (self->priv->x_authority);
+    g_clear_object (&self->priv->x_authority);
     g_free (self->priv->remote_host_name);
-    g_free (self->priv->login1_session);
+    g_free (self->priv->login1_session_id);
     g_free (self->priv->console_kit_cookie);
     g_list_free_full (self->priv->env, g_free);
     g_strfreev (self->priv->argv);
@@ -934,7 +969,7 @@ session_class_init (SessionClass *klass)
     g_type_class_add_private (klass, sizeof (SessionPrivate));
 
     signals[GOT_MESSAGES] =
-        g_signal_new ("got-messages",
+        g_signal_new (SESSION_SIGNAL_GOT_MESSAGES,
                       G_TYPE_FROM_CLASS (klass),
                       G_SIGNAL_RUN_LAST,
                       G_STRUCT_OFFSET (SessionClass, got_messages),
@@ -943,7 +978,7 @@ session_class_init (SessionClass *klass)
                       G_TYPE_NONE, 0);
 
     signals[AUTHENTICATION_COMPLETE] =
-        g_signal_new ("authentication-complete",
+        g_signal_new (SESSION_SIGNAL_AUTHENTICATION_COMPLETE,
                       G_TYPE_FROM_CLASS (klass),
                       G_SIGNAL_RUN_LAST,
                       G_STRUCT_OFFSET (SessionClass, authentication_complete),
@@ -952,7 +987,7 @@ session_class_init (SessionClass *klass)
                       G_TYPE_NONE, 0);
 
     signals[STOPPED] =
-        g_signal_new ("stopped",
+        g_signal_new (SESSION_SIGNAL_STOPPED,
                       G_TYPE_FROM_CLASS (klass),
                       G_SIGNAL_RUN_LAST,
                       G_STRUCT_OFFSET (SessionClass, stopped),