]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - src/greeter-session.c
Be more careful about closing uninitialized memory.
[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
17 #include "greeter-session.h"
18
19 struct GreeterSessionPrivate
20 {
21     /* Greeter running inside this session */
22     Greeter *greeter;
23 };
24
25 G_DEFINE_TYPE (GreeterSession, greeter_session, SESSION_TYPE);
26
27 GreeterSession *
28 greeter_session_new (void)
29 {
30     return g_object_new (GREETER_SESSION_TYPE, NULL);
31 }
32
33 Greeter *
34 greeter_session_get_greeter (GreeterSession *session)
35 {
36     g_return_val_if_fail (session != NULL, NULL);
37     return session->priv->greeter;
38 }
39
40 static gboolean
41 setup_cb (Greeter *greeter, int input_fd, int output_fd, gpointer user_data)
42 {
43     Session *session = user_data;
44     gchar *value;
45
46     /* Let the greeter session know how to communicate with the daemon */
47     value = g_strdup_printf ("%d", input_fd);
48     session_set_env (session, "LIGHTDM_TO_SERVER_FD", value);
49     g_free (value);
50     value = g_strdup_printf ("%d", output_fd);
51     session_set_env (session, "LIGHTDM_FROM_SERVER_FD", value);
52     g_free (value);
53
54     return SESSION_CLASS (greeter_session_parent_class)->start (session);
55 }
56
57 static gboolean
58 greeter_session_start (Session *session)
59 {
60     GreeterSession *s = GREETER_SESSION (session);
61     return greeter_start (s->priv->greeter, setup_cb, session);
62 }
63
64 static void
65 greeter_session_stop (Session *session)
66 {
67     GreeterSession *s = GREETER_SESSION (session);
68
69     greeter_stop (s->priv->greeter);
70
71     SESSION_CLASS (greeter_session_parent_class)->stop (session);
72 }
73
74 static void
75 greeter_session_init (GreeterSession *session)
76 {
77     session->priv = G_TYPE_INSTANCE_GET_PRIVATE (session, GREETER_SESSION_TYPE, GreeterSessionPrivate);
78     session->priv->greeter = greeter_new ();
79 }
80
81 static void
82 greeter_session_finalize (GObject *object)
83 {
84     GreeterSession *self = GREETER_SESSION (object);
85
86     g_clear_object (&self->priv->greeter);
87
88     G_OBJECT_CLASS (greeter_session_parent_class)->finalize (object);
89 }
90
91 static void
92 greeter_session_class_init (GreeterSessionClass *klass)
93 {
94     SessionClass *session_class = SESSION_CLASS (klass);
95     GObjectClass *object_class = G_OBJECT_CLASS (klass);
96
97     session_class->start = greeter_session_start;
98     session_class->stop = greeter_session_stop;  
99     object_class->finalize = greeter_session_finalize;
100
101     g_type_class_add_private (klass, sizeof (GreeterSessionPrivate));
102 }