]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blobdiff - src/greeter-session.c
Allow greeters to run in-session
[sojka/lightdm.git] / src / greeter-session.c
index 0241dbdfb8f3aed9c4f6a584f6f21bb24e011a22..8ebac6f26f55baf9c2ad4d3ff2b355a5da68cbd1 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <string.h>
 #include <errno.h>
+#include <fcntl.h>
 
 #include "greeter-session.h"
 
@@ -20,10 +21,6 @@ struct GreeterSessionPrivate
 {
     /* Greeter running inside this session */
     Greeter *greeter;
-
-    /* Communication channels to communicate with */
-    int to_greeter_input;
-    int from_greeter_output;
 };
 
 G_DEFINE_TYPE (GreeterSession, greeter_session, SESSION_TYPE);
@@ -42,27 +39,46 @@ greeter_session_get_greeter (GreeterSession *session)
 }
 
 static gboolean
-setup_cb (Greeter *greeter, int input_fd, int output_fd, gpointer user_data)
+greeter_session_start (Session *session)
 {
-    Session *session = user_data;
+    GreeterSession *s = GREETER_SESSION (session);
+    int to_greeter_pipe[2], from_greeter_pipe[2];
+    int to_greeter_input, to_greeter_output, from_greeter_input, from_greeter_output;
     gchar *value;
+    gboolean result;
+
+    /* Create a pipe to talk with the greeter */
+    if (pipe (to_greeter_pipe) != 0 || pipe (from_greeter_pipe) != 0)
+    {
+        g_warning ("Failed to create pipes: %s", strerror (errno));
+        return FALSE;
+    }
+
+    to_greeter_input = to_greeter_pipe[1];  
+    to_greeter_output = to_greeter_pipe[0];
+    from_greeter_input = from_greeter_pipe[1];
+    from_greeter_output = from_greeter_pipe[0];  
+    greeter_set_file_descriptors (s->priv->greeter, to_greeter_input, from_greeter_output);
+
+    /* Don't allow the daemon end of the pipes to be accessed in child processes */
+    fcntl (to_greeter_input, F_SETFD, FD_CLOEXEC);
+    fcntl (from_greeter_output, F_SETFD, FD_CLOEXEC);
 
     /* Let the greeter session know how to communicate with the daemon */
-    value = g_strdup_printf ("%d", input_fd);
+    value = g_strdup_printf ("%d", from_greeter_input);
     session_set_env (session, "LIGHTDM_TO_SERVER_FD", value);
     g_free (value);
-    value = g_strdup_printf ("%d", output_fd);
+    value = g_strdup_printf ("%d", to_greeter_output);
     session_set_env (session, "LIGHTDM_FROM_SERVER_FD", value);
     g_free (value);
 
-    return SESSION_CLASS (greeter_session_parent_class)->start (session);
-}
+    result = SESSION_CLASS (greeter_session_parent_class)->start (session);
 
-static gboolean
-greeter_session_start (Session *session)
-{
-    GreeterSession *s = GREETER_SESSION (session);
-    return greeter_start (s->priv->greeter, setup_cb, session);
+    /* Close the session ends of the pipe */
+    close (from_greeter_input);
+    close (to_greeter_output);
+
+    return result;
 }
 
 static void
@@ -88,8 +104,6 @@ greeter_session_finalize (GObject *object)
     GreeterSession *self = GREETER_SESSION (object);
 
     g_clear_object (&self->priv->greeter);
-    close (self->priv->to_greeter_input);
-    close (self->priv->from_greeter_output);
 
     G_OBJECT_CLASS (greeter_session_parent_class)->finalize (object);
 }