]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blobdiff - src/session.c
Make an XServerXmir object
[sojka/lightdm.git] / src / session.c
index 5169bbdaa759ad1aa64979750085483fc6f1d48a..3c7a34bd91dde310ce83f0865596429a2779e583 100644 (file)
@@ -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;
@@ -135,8 +136,7 @@ session_set_config (Session *session, SessionConfig *config)
 {
     g_return_if_fail (session != NULL);
 
-    if (session->priv->config)
-        g_object_unref (session->priv->config);
+    g_clear_object (&session->priv->config);
     session->priv->config = g_object_ref (config);
 }
 
@@ -199,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
@@ -211,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);
@@ -246,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;
@@ -310,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;
@@ -322,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;
@@ -484,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);
@@ -626,7 +625,7 @@ session_real_start (Session *session)
     close (from_child_input);
 
     /* Indicate what version of the protocol we are using */
-    version = 2;
+    version = 3;
     write_data (session, &version, sizeof (version));
 
     /* Send configuration */
@@ -652,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)
 {
@@ -791,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);
@@ -800,12 +807,13 @@ 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]);
 
-    session->priv->login1_session = 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);
 }
 
@@ -815,8 +823,8 @@ session_lock (Session *session)
     g_return_if_fail (session != NULL);
     if (getuid () == 0)
     {
-        if (session->priv->login1_session)
-            login1_service_lock_session (login1_service_get_instance (), 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);
     }
@@ -828,8 +836,8 @@ session_unlock (Session *session)
     g_return_if_fail (session != NULL);
     if (getuid () == 0)
     {
-        if (session->priv->login1_session)
-            login1_service_unlock_session (login1_service_get_instance (), 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);
     }
@@ -841,8 +849,8 @@ session_activate (Session *session)
     g_return_if_fail (session != NULL);
     if (getuid () == 0)
     {
-        if (session->priv->login1_session)
-            login1_service_activate_session (login1_service_get_instance (), 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);
     }
@@ -857,9 +865,11 @@ session_stop (Session *session)
     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
@@ -903,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
@@ -911,12 +924,12 @@ session_finalize (GObject *object)
     Session *self = SESSION (object);
     int i;
 
-    if (self->priv->config)
-        g_object_unref (self->priv->config);
-    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)
@@ -924,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);
@@ -934,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);
@@ -958,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),
@@ -967,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),
@@ -976,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),