]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - src/greeter-session.c
Load all users only when really needed
[sojka/lightdm.git] / src / greeter-session.c
1 /*
2  * Copyright (C) 2010-2011 Robert Ancell.
3  * Author: Robert Ancell <robert.ancell@canonical.com>
4  *
5  * This program is free software: you can redistribute it and/or modify it under
6  * the terms of the GNU General Public License as published by the Free Software
7  * Foundation, either version 3 of the License, or (at your option) any later
8  * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
9  * license.
10  */
11
12 #include <config.h>
13
14 #include <string.h>
15 #include <errno.h>
16 #include <fcntl.h>
17
18 #include "greeter-session.h"
19
20 struct GreeterSessionPrivate
21 {
22     /* Greeter running inside this session */
23     Greeter *greeter;
24 };
25
26 G_DEFINE_TYPE (GreeterSession, greeter_session, SESSION_TYPE);
27
28 GreeterSession *
29 greeter_session_new (void)
30 {
31     return g_object_new (GREETER_SESSION_TYPE, NULL);
32 }
33
34 Greeter *
35 greeter_session_get_greeter (GreeterSession *session)
36 {
37     g_return_val_if_fail (session != NULL, NULL);
38     return session->priv->greeter;
39 }
40
41 static gboolean
42 greeter_session_start (Session *session)
43 {
44     GreeterSession *s = GREETER_SESSION (session);
45     int to_greeter_pipe[2], from_greeter_pipe[2];
46     int to_greeter_input, to_greeter_output, from_greeter_input, from_greeter_output;
47     gchar *value;
48     gboolean result;
49
50     /* Create a pipe to talk with the greeter */
51     if (pipe (to_greeter_pipe) != 0 || pipe (from_greeter_pipe) != 0)
52     {
53         g_warning ("Failed to create pipes: %s", strerror (errno));
54         return FALSE;
55     }
56
57     to_greeter_input = to_greeter_pipe[1];  
58     to_greeter_output = to_greeter_pipe[0];
59     from_greeter_input = from_greeter_pipe[1];
60     from_greeter_output = from_greeter_pipe[0];  
61     greeter_set_file_descriptors (s->priv->greeter, to_greeter_input, from_greeter_output);
62
63     /* Don't allow the daemon end of the pipes to be accessed in child processes */
64     fcntl (to_greeter_input, F_SETFD, FD_CLOEXEC);
65     fcntl (from_greeter_output, F_SETFD, FD_CLOEXEC);
66
67     /* Let the greeter session know how to communicate with the daemon */
68     value = g_strdup_printf ("%d", from_greeter_input);
69     session_set_env (session, "LIGHTDM_TO_SERVER_FD", value);
70     g_free (value);
71     value = g_strdup_printf ("%d", to_greeter_output);
72     session_set_env (session, "LIGHTDM_FROM_SERVER_FD", value);
73     g_free (value);
74
75     result = SESSION_CLASS (greeter_session_parent_class)->start (session);
76
77     /* Close the session ends of the pipe */
78     close (from_greeter_input);
79     close (to_greeter_output);
80
81     return result;
82 }
83
84 static void
85 greeter_session_stop (Session *session)
86 {
87     GreeterSession *s = GREETER_SESSION (session);
88
89     greeter_stop (s->priv->greeter);
90
91     SESSION_CLASS (greeter_session_parent_class)->stop (session);
92 }
93
94 static void
95 greeter_session_init (GreeterSession *session)
96 {
97     session->priv = G_TYPE_INSTANCE_GET_PRIVATE (session, GREETER_SESSION_TYPE, GreeterSessionPrivate);
98     session->priv->greeter = greeter_new ();
99 }
100
101 static void
102 greeter_session_finalize (GObject *object)
103 {
104     GreeterSession *self = GREETER_SESSION (object);
105
106     g_clear_object (&self->priv->greeter);
107
108     G_OBJECT_CLASS (greeter_session_parent_class)->finalize (object);
109 }
110
111 static void
112 greeter_session_class_init (GreeterSessionClass *klass)
113 {
114     SessionClass *session_class = SESSION_CLASS (klass);
115     GObjectClass *object_class = G_OBJECT_CLASS (klass);
116
117     session_class->start = greeter_session_start;
118     session_class->stop = greeter_session_stop;  
119     object_class->finalize = greeter_session_finalize;
120
121     g_type_class_add_private (klass, sizeof (GreeterSessionPrivate));
122 }