summaryrefslogtreecommitdiff
path: root/libck-connector/ck-connector.c
diff options
context:
space:
mode:
Diffstat (limited to 'libck-connector/ck-connector.c')
-rw-r--r--libck-connector/ck-connector.c188
1 files changed, 188 insertions, 0 deletions
diff --git a/libck-connector/ck-connector.c b/libck-connector/ck-connector.c
index 7f6f87f..416b28f 100644
--- a/libck-connector/ck-connector.c
+++ b/libck-connector/ck-connector.c
@@ -65,6 +65,8 @@ struct _CkConnector
{
int refcount;
char *cookie;
+ char *ssid;
+ char *runtime_dir;
dbus_bool_t session_created;
DBusConnection *connection;
};
@@ -181,6 +183,14 @@ _ck_connector_free (CkConnector *connector)
free (connector->cookie);
}
+ if (connector->ssid != NULL) {
+ free (connector->ssid);
+ }
+
+ if (connector->runtime_dir != NULL) {
+ free (connector->runtime_dir);
+ }
+
free (connector);
}
@@ -242,6 +252,8 @@ ck_connector_new (void)
connector->connection = NULL;
connector->cookie = NULL;
connector->session_created = FALSE;
+ connector->ssid = NULL;
+ connector->runtime_dir = NULL;
oom:
return connector;
}
@@ -589,6 +601,182 @@ ck_connector_get_cookie (CkConnector *connector)
}
}
+static dbus_bool_t
+ck_connector_get_ssid (CkConnector *connector,
+ DBusError *error)
+{
+ DBusError local_error;
+ DBusMessage *message;
+ DBusMessage *reply;
+ char *ssid;
+ dbus_bool_t ret;
+
+ _ck_return_val_if_fail (connector != NULL, FALSE);
+
+ reply = NULL;
+ message = NULL;
+ ssid = NULL;
+ ret = FALSE;
+
+ if (!connector->session_created || connector->cookie == NULL) {
+ return ret;
+ }
+
+ dbus_error_init (&local_error);
+ message = dbus_message_new_method_call ("org.freedesktop.ConsoleKit",
+ "/org/freedesktop/ConsoleKit/Manager",
+ "org.freedesktop.ConsoleKit.Manager",
+ "GetSessionForCookie");
+ if (message == NULL) {
+ goto out;
+ }
+
+ if (!dbus_message_append_args (message,
+ DBUS_TYPE_STRING, &(connector->cookie),
+ DBUS_TYPE_INVALID)) {
+ goto out;
+ }
+
+ 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 get session for cookie: %s, no reply from dbus",
+ local_error.message);
+ dbus_error_free (&local_error);
+ goto out;
+ }
+ }
+
+ if (!dbus_message_get_args (reply, error,
+ DBUS_TYPE_OBJECT_PATH, &ssid,
+ DBUS_TYPE_INVALID)) {
+ dbus_set_error (error,
+ CK_CONNECTOR_ERROR,
+ "Unable to get session for cookie: %s",
+ local_error.message);
+ dbus_error_free (&local_error);
+ goto out;
+ }
+
+ connector->ssid = strdup (ssid);
+ if (connector->ssid == NULL) {
+ goto out;
+ }
+
+ ret = TRUE;
+
+out:
+ if (reply != NULL) {
+ dbus_message_unref (reply);
+ }
+
+ if (message != NULL) {
+ dbus_message_unref (message);
+ }
+
+ return ret;
+}
+
+/**
+ * Gets the XDG_RUNTIME_DIR for the current open session.
+ * Returns #NULL if no session is open.
+ *
+ * @returns a constant string with the XDG_RUNTIME_DIR.
+ */
+const char *
+ck_connector_get_runtime_dir (CkConnector *connector,
+ DBusError *error)
+{
+ DBusError local_error;
+ DBusMessage *message;
+ char *runtime_dir;
+ DBusMessage *reply;
+
+ _ck_return_val_if_fail (connector != NULL, NULL);
+
+ if (!connector->session_created || connector->cookie == NULL) {
+ return NULL;
+ }
+
+ /* If we already have the runtime dir, supply it again */
+ if (connector->runtime_dir != NULL) {
+ return connector->runtime_dir;
+ }
+
+ /* get the ssid if we don't already have it */
+ if (connector->ssid == NULL) {
+ if (ck_connector_get_ssid (connector, error) == FALSE) {
+ return NULL;
+ }
+ }
+
+ reply = NULL;
+ message = NULL;
+ runtime_dir = NULL;
+
+ if (!connector->session_created || connector->cookie == NULL) {
+ return NULL;
+ }
+
+ dbus_error_init (&local_error);
+ message = dbus_message_new_method_call ("org.freedesktop.ConsoleKit",
+ connector->ssid,
+ "org.freedesktop.ConsoleKit.Session",
+ "GetXDGRuntimeDir");
+ if (message == NULL) {
+ goto out;
+ }
+
+ 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 get runtime dir for session: %s",
+ local_error.message);
+ dbus_error_free (&local_error);
+ goto out;
+ }
+ }
+
+ if (!dbus_message_get_args (reply, error,
+ DBUS_TYPE_STRING, &runtime_dir,
+ DBUS_TYPE_INVALID)) {
+ dbus_set_error (error,
+ CK_CONNECTOR_ERROR,
+ "Unable to get runtime dir for session: %s",
+ local_error.message);
+ dbus_error_free (&local_error);
+ goto out;
+ }
+
+ connector->runtime_dir = strdup (runtime_dir);
+ if (connector->runtime_dir == NULL) {
+ goto out;
+ }
+
+out:
+ if (reply != NULL) {
+ dbus_message_unref (reply);
+ }
+
+ if (message != NULL) {
+ dbus_message_unref (message);
+ }
+
+ return connector->runtime_dir;
+}
+
/**
* Issues the CloseSession method call on the ConsoleKit manager
* interface.