[gdm/display-configuration] Set remove-on-close as TRUE to the session associated with gdm-session-worker process.
- From: Halton Huo <haltonhuo src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gdm/display-configuration] Set remove-on-close as TRUE to the session associated with gdm-session-worker process.
- Date: Fri, 4 Sep 2009 08:43:55 +0000 (UTC)
commit a90619f9ab25805fd8abf052bbb69c00fafcca43
Author: Halton Huo <halton huo sun com>
Date: Fri Sep 4 16:35:55 2009 +0800
Set remove-on-close as TRUE to the session associated with gdm-session-worker process.
This allow user session quit completely.
daemon/ck-connector.c | 101 +++++++++++++++++++++++++++++++++++++++++++
daemon/ck-connector.h | 4 ++
daemon/gdm-session-worker.c | 7 +++-
3 files changed, 111 insertions(+), 1 deletions(-)
---
diff --git a/daemon/ck-connector.c b/daemon/ck-connector.c
index 8bd83fc..14f0527 100644
--- a/daemon/ck-connector.c
+++ b/daemon/ck-connector.c
@@ -430,6 +430,7 @@ ck_connector_open_session_with_parameters_valist (CkConnector *connector,
DBusMessageIter iter_array;
dbus_bool_t ret;
char *cookie;
+ char *session_id;
const char *name;
_ck_return_val_if_fail (connector != NULL, FALSE);
@@ -538,6 +539,57 @@ ck_connector_open_session_with_parameters_valist (CkConnector *connector,
goto out;
}
+ dbus_message_unref (message);
+ dbus_message_unref (reply);
+
+ message = dbus_message_new_method_call ("org.freedesktop.ConsoleKit",
+ "/org/freedesktop/ConsoleKit/Manager",
+ "org.freedesktop.ConsoleKit.Manager",
+ "GetSessionForCookie");
+ if (message == NULL) {
+ goto out;
+ }
+
+ dbus_message_append_args (message, DBUS_TYPE_STRING, &connector->cookie,
+ DBUS_TYPE_INVALID);
+
+ dbus_error_init (&local_error);
+
+ reply = dbus_connection_send_with_reply_and_block (connector->connection,
+ message,
+ -1,
+ &local_error);
+ if (reply == NULL) {
+ if (dbus_error_is_set (&local_error)) {
+ dbus_set_error (error,
+ CK_CONNECTOR_ERROR,
+ "Unable to open session: %s",
+ local_error.message);
+ dbus_error_free (&local_error);
+ goto out;
+ }
+ }
+
+ dbus_error_init (&local_error);
+ if (! dbus_message_get_args (reply,
+ &local_error,
+ DBUS_TYPE_OBJECT_PATH, &session_id,
+ DBUS_TYPE_INVALID)) {
+ if (dbus_error_is_set (&local_error)) {
+ dbus_set_error (error,
+ CK_CONNECTOR_ERROR,
+ "Unable to open session: %s",
+ local_error.message);
+ dbus_error_free (&local_error);
+ goto out;
+ }
+ }
+
+ connector->session_id = strdup (session_id);
+ if (connector->session_id == NULL) {
+ goto out;
+ }
+
connector->session_created = TRUE;
ret = TRUE;
@@ -675,6 +727,55 @@ ck_connector_get_session_id (CkConnector *connector)
}
}
+dbus_bool_t
+ck_connector_set_remove_on_close (CkConnector *connector,
+ gboolean remove_on_close,
+ DBusError *error)
+{
+ DBusMessage *message;
+ dbus_bool_t ret;
+ const char *ssid = ck_connector_get_session_id (connector);
+
+ _ck_return_val_if_fail (connector != NULL, FALSE);
+ _ck_return_val_if_fail ((error) == NULL || !dbus_error_is_set ((error)), FALSE);
+ _ck_return_val_if_fail (ssid != NULL, FALSE);
+
+ message = NULL;
+ ret = FALSE;
+
+ if (!connector->session_created || connector->cookie == NULL) {
+ dbus_set_error (error,
+ CK_CONNECTOR_ERROR,
+ "Unable to close session: %s",
+ "no session open");
+ goto out;
+ }
+
+ message = dbus_message_new_method_call ("org.freedesktop.ConsoleKit",
+ ssid,
+ "org.freedesktop.ConsoleKit.Session",
+ "SetRemoveOnClose");
+ if (message == NULL) {
+ goto out;
+ }
+
+ if (! dbus_message_append_args (message,
+ DBUS_TYPE_BOOLEAN, &remove_on_close,
+ DBUS_TYPE_INVALID)) {
+ goto out;
+ }
+
+ ret = dbus_connection_send (connector->connection,
+ message,
+ NULL);
+out:
+ if (message != NULL) {
+ dbus_message_unref (message);
+ }
+
+ return ret;
+}
+
/**
* Issues the CloseSession method call on the ConsoleKit manager
* interface.
diff --git a/daemon/ck-connector.h b/daemon/ck-connector.h
index 181ffdf..e0a35d8 100644
--- a/daemon/ck-connector.h
+++ b/daemon/ck-connector.h
@@ -32,6 +32,7 @@
#include <sys/types.h>
#include <dbus/dbus.h>
+#include <glib.h>
DBUS_BEGIN_DECLS
@@ -57,6 +58,9 @@ dbus_bool_t ck_connector_open_session (CkConnector *ckc,
const char *ck_connector_get_cookie (CkConnector *ckc);
const char *ck_connector_get_session_id (CkConnector *ckc);
+dbus_bool_t ck_connector_set_remove_on_close (CkConnector *ckc,
+ gboolean remove_on_close,
+ DBusError *error);
dbus_bool_t ck_connector_close_session (CkConnector *ckc,
DBusError *error);
diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c
index 0d27982..02f548c 100644
--- a/daemon/gdm-session-worker.c
+++ b/daemon/gdm-session-worker.c
@@ -1607,19 +1607,24 @@ session_worker_child_watch (GPid pid,
if (WIFEXITED (status)) {
int code = WEXITSTATUS (status);
+ ck_connector_set_remove_on_close (worker->priv->ckc,
+ TRUE,
+ NULL);
send_dbus_int_method (worker->priv->connection,
"SessionExited",
code);
} else if (WIFSIGNALED (status)) {
int num = WTERMSIG (status);
+ ck_connector_set_remove_on_close (worker->priv->ckc,
+ TRUE,
+ NULL);
send_dbus_int_method (worker->priv->connection,
"SessionDied",
num);
}
if (worker->priv->ckc != NULL) {
- ck_connector_close_session (worker->priv->ckc, NULL);
ck_connector_unref (worker->priv->ckc);
worker->priv->ckc = NULL;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]