summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2011-09-22 12:47:22 +1000
committerRobert Ancell <robert.ancell@canonical.com>2011-09-22 12:47:22 +1000
commit658561cb603b5accde340725f6013e3a79e4f237 (patch)
treed1e28da0cbbfa327e6d876cef2bfd23bb978ae74
parent7c11dac48b906f49370d78d43dc14e00a5744479 (diff)
downloadlightdm-658561cb603b5accde340725f6013e3a79e4f237.tar.gz
Split session setup into pre and post PAM session sections
-rw-r--r--src/session.c18
-rw-r--r--src/session.h3
-rw-r--r--src/xsession.c21
3 files changed, 31 insertions, 11 deletions
diff --git a/src/session.c b/src/session.c
index c538ac35..78bbca54 100644
--- a/src/session.c
+++ b/src/session.c
@@ -326,6 +326,9 @@ session_real_start (Session *session)
if (session->priv->console_kit_cookie)
session_set_env (session, "XDG_SESSION_COOKIE", session->priv->console_kit_cookie);
+ if (!SESSION_GET_CLASS (session)->setup (session))
+ return FALSE;
+
user = pam_session_get_user (session->priv->authentication);
process_set_user (PROCESS (session), user);
process_set_working_directory (PROCESS (session), user_get_home_directory (user));
@@ -353,13 +356,19 @@ void
session_stop (Session *session)
{
g_return_if_fail (session != NULL);
- SESSION_GET_CLASS (session)->stop (session);
+ SESSION_GET_CLASS (session)->cleanup (session);
+ process_signal (PROCESS (session), SIGTERM);
+}
+
+static gboolean
+session_setup (Session *session)
+{
+ return TRUE;
}
static void
-session_real_stop (Session *session)
+session_cleanup (Session *session)
{
- process_signal (PROCESS (session), SIGTERM);
}
static void
@@ -417,7 +426,8 @@ session_class_init (SessionClass *klass)
ProcessClass *process_class = PROCESS_CLASS (klass);
klass->start = session_real_start;
- klass->stop = session_real_stop;
+ klass->setup = session_setup;
+ klass->cleanup = session_cleanup;
process_class->run = session_run;
process_class->stopped = session_stopped;
object_class->finalize = session_finalize;
diff --git a/src/session.h b/src/session.h
index bfda1792..892bd0f5 100644
--- a/src/session.h
+++ b/src/session.h
@@ -36,7 +36,8 @@ typedef struct
ProcessClass parent_class;
gboolean (*start)(Session *session);
- void (*stop)(Session *session);
+ gboolean (*setup)(Session *session);
+ void (*cleanup)(Session *session);
} SessionClass;
GType session_get_type (void);
diff --git a/src/xsession.c b/src/xsession.c
index 86567a82..e1e75022 100644
--- a/src/xsession.c
+++ b/src/xsession.c
@@ -59,6 +59,16 @@ xsession_start (Session *session)
session_set_console_kit_parameter (session, "is-local", g_variant_new_boolean (FALSE));
}
+ session_set_env (session, "DISPLAY", xserver_get_address (xsession->priv->xserver));
+
+ return SESSION_CLASS (xsession_parent_class)->start (session);
+}
+
+static gboolean
+xsession_setup (Session *session)
+{
+ XSession *xsession = XSESSION (session);
+
if (xserver_get_authority (xsession->priv->xserver))
{
gchar *path;
@@ -108,9 +118,7 @@ xsession_start (Session *session)
return FALSE;
}
- session_set_env (session, "DISPLAY", xserver_get_address (xsession->priv->xserver));
-
- return SESSION_CLASS (xsession_parent_class)->start (session);
+ return SESSION_CLASS (xsession_parent_class)->setup (session);
}
static void
@@ -139,10 +147,10 @@ xsession_remove_authority (XSession *session)
}
static void
-xsession_stop (Session *session)
+xsession_cleanup (Session *session)
{
xsession_remove_authority (XSESSION (session));
- SESSION_CLASS (xsession_parent_class)->stop (session);
+ SESSION_CLASS (xsession_parent_class)->cleanup (session);
}
static void
@@ -172,7 +180,8 @@ xsession_class_init (XSessionClass *klass)
SessionClass *session_class = SESSION_CLASS (klass);
session_class->start = xsession_start;
- session_class->stop = xsession_stop;
+ session_class->setup = xsession_setup;
+ session_class->cleanup = xsession_cleanup;
object_class->finalize = xsession_finalize;
g_type_class_add_private (klass, sizeof (XSessionPrivate));