From 4b245b3113480d495440e1b7d32eb4dc6d564c8c Mon Sep 17 00:00:00 2001 From: William Jon McCann Date: Mon, 5 Mar 2007 12:12:59 -0500 Subject: add x11-display-device attribute In certain cases it is necessary to distinguish the display-device (tty of session leader) from the x11-display-device (tty of xorg process). --- src/ck-session.c | 60 ++++++++++-- src/ck-session.h | 172 ++++++++++++++++++---------------- src/ck-session.xml | 3 + tools/linux/ck-collect-session-info.c | 29 ++++-- 4 files changed, 164 insertions(+), 100 deletions(-) diff --git a/src/ck-session.c b/src/ck-session.c index 44eaa2f..9d53072 100644 --- a/src/ck-session.c +++ b/src/ck-session.c @@ -51,7 +51,8 @@ struct CkSessionPrivate char *session_type; char *display_device; - char *xdisplay; + char *x11_display_device; + char *x11_display; char *host_name; guint uid; @@ -82,6 +83,7 @@ enum { PROP_COOKIE, PROP_USER, PROP_X11_DISPLAY, + PROP_X11_DISPLAY_DEVICE, PROP_DISPLAY_DEVICE, PROP_SESSION_TYPE, PROP_HOST_NAME, @@ -449,13 +451,13 @@ ck_session_get_user (CkSession *session, gboolean ck_session_get_x11_display (CkSession *session, - char **xdisplay, + char **x11_display, GError **error) { g_return_val_if_fail (CK_IS_SESSION (session), FALSE); - if (xdisplay != NULL) { - *xdisplay = g_strdup (session->priv->xdisplay); + if (x11_display != NULL) { + *x11_display = g_strdup (session->priv->x11_display); } return TRUE; @@ -475,6 +477,20 @@ ck_session_get_display_device (CkSession *session, return TRUE; } +gboolean +ck_session_get_x11_display_device (CkSession *session, + char **x11_display_device, + GError **error) +{ + g_return_val_if_fail (CK_IS_SESSION (session), FALSE); + + if (x11_display_device != NULL) { + *x11_display_device = g_strdup (session->priv->x11_display_device); + } + + return TRUE; +} + gboolean ck_session_get_host_name (CkSession *session, char **host_name, @@ -598,13 +614,13 @@ ck_session_set_user (CkSession *session, gboolean ck_session_set_x11_display (CkSession *session, - const char *xdisplay, + const char *x11_display, GError **error) { g_return_val_if_fail (CK_IS_SESSION (session), FALSE); - g_free (session->priv->xdisplay); - session->priv->xdisplay = g_strdup (xdisplay); + g_free (session->priv->x11_display); + session->priv->x11_display = g_strdup (x11_display); return TRUE; } @@ -622,6 +638,19 @@ ck_session_set_display_device (CkSession *session, return TRUE; } +gboolean +ck_session_set_x11_display_device (CkSession *session, + const char *x11_display_device, + GError **error) +{ + g_return_val_if_fail (CK_IS_SESSION (session), FALSE); + + g_free (session->priv->x11_display_device); + session->priv->x11_display_device = g_strdup (x11_display_device); + + return TRUE; +} + gboolean ck_session_set_host_name (CkSession *session, const char *host_name, @@ -677,6 +706,9 @@ ck_session_set_property (GObject *object, case PROP_X11_DISPLAY: ck_session_set_x11_display (self, g_value_get_string (value), NULL); break; + case PROP_X11_DISPLAY_DEVICE: + ck_session_set_x11_display_device (self, g_value_get_string (value), NULL); + break; case PROP_DISPLAY_DEVICE: ck_session_set_display_device (self, g_value_get_string (value), NULL); break; @@ -722,7 +754,10 @@ ck_session_get_property (GObject *object, g_value_set_string (value, self->priv->session_type); break; case PROP_X11_DISPLAY: - g_value_set_string (value, self->priv->xdisplay); + g_value_set_string (value, self->priv->x11_display); + break; + case PROP_X11_DISPLAY_DEVICE: + g_value_set_string (value, self->priv->x11_display_device); break; case PROP_DISPLAY_DEVICE: g_value_set_string (value, self->priv->display_device); @@ -845,6 +880,13 @@ ck_session_class_init (CkSessionClass *klass) "X11 Display", NULL, G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_X11_DISPLAY_DEVICE, + g_param_spec_string ("x11-display-device", + "x11-display-device", + "X11 Display device", + NULL, + G_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_DISPLAY_DEVICE, g_param_spec_string ("display-device", @@ -907,7 +949,7 @@ ck_session_finalize (GObject *object) g_free (session->priv->cookie); g_free (session->priv->seat_id); g_free (session->priv->session_type); - g_free (session->priv->xdisplay); + g_free (session->priv->x11_display); g_free (session->priv->host_name); G_OBJECT_CLASS (ck_session_parent_class)->finalize (object); diff --git a/src/ck-session.h b/src/ck-session.h index 2486371..392e219 100644 --- a/src/ck-session.h +++ b/src/ck-session.h @@ -66,97 +66,103 @@ typedef enum #define CK_SESSION_ERROR ck_session_error_quark () -GQuark ck_session_error_quark (void); -GType ck_session_get_type (void); -CkSession * ck_session_new (const char *ssid, - const char *cookie); -CkSession * ck_session_new_with_parameters (const char *ssid, - const char *cookie, - const GPtrArray *parameters); - -gboolean ck_session_set_active (CkSession *session, - gboolean active, - GError **error); -gboolean ck_session_set_is_local (CkSession *session, - gboolean is_local, - GError **error); -gboolean ck_session_set_id (CkSession *session, - const char *ssid, - GError **error); -gboolean ck_session_set_cookie (CkSession *session, - const char *cookie, - GError **error); -gboolean ck_session_set_seat_id (CkSession *session, - const char *sid, - GError **error); -gboolean ck_session_set_user (CkSession *session, - guint uid, - GError **error); -gboolean ck_session_set_x11_display (CkSession *session, - const char *xdisplay, - GError **error); -gboolean ck_session_set_display_device (CkSession *session, - const char *device, - GError **error); -gboolean ck_session_set_host_name (CkSession *session, - const char *host_name, - GError **error); -gboolean ck_session_set_session_type (CkSession *session, - const char *type, - GError **error); +GQuark ck_session_error_quark (void); +GType ck_session_get_type (void); +CkSession * ck_session_new (const char *ssid, + const char *cookie); +CkSession * ck_session_new_with_parameters (const char *ssid, + const char *cookie, + const GPtrArray *parameters); + +gboolean ck_session_set_active (CkSession *session, + gboolean active, + GError **error); +gboolean ck_session_set_is_local (CkSession *session, + gboolean is_local, + GError **error); +gboolean ck_session_set_id (CkSession *session, + const char *ssid, + GError **error); +gboolean ck_session_set_cookie (CkSession *session, + const char *cookie, + GError **error); +gboolean ck_session_set_seat_id (CkSession *session, + const char *sid, + GError **error); +gboolean ck_session_set_user (CkSession *session, + guint uid, + GError **error); +gboolean ck_session_set_x11_display (CkSession *session, + const char *xdisplay, + GError **error); +gboolean ck_session_set_x11_display_device (CkSession *session, + const char *xdisplay, + GError **error); +gboolean ck_session_set_display_device (CkSession *session, + const char *device, + GError **error); +gboolean ck_session_set_host_name (CkSession *session, + const char *host_name, + GError **error); +gboolean ck_session_set_session_type (CkSession *session, + const char *type, + GError **error); /* Exported methods */ /* Authoritative properties */ -gboolean ck_session_get_id (CkSession *session, - char **ssid, - GError **error); -gboolean ck_session_get_seat_id (CkSession *session, - char **sid, - GError **error); -gboolean ck_session_is_active (CkSession *session, - gboolean *active, - GError **error); -gboolean ck_session_is_local (CkSession *session, - gboolean *local, - GError **error); -gboolean ck_session_get_user (CkSession *session, - guint *uid, - GError **error); -gboolean ck_session_get_x11_display (CkSession *session, - char **display, - GError **error); -gboolean ck_session_get_display_device (CkSession *session, - char **display, - GError **error); -gboolean ck_session_get_session_type (CkSession *session, - char **type, - GError **error); -gboolean ck_session_get_host_name (CkSession *session, - char **host_name, - GError **error); -gboolean ck_session_get_creation_time (CkSession *session, - char **iso8601_datetime, - GError **error); +gboolean ck_session_get_id (CkSession *session, + char **ssid, + GError **error); +gboolean ck_session_get_seat_id (CkSession *session, + char **sid, + GError **error); +gboolean ck_session_is_active (CkSession *session, + gboolean *active, + GError **error); +gboolean ck_session_is_local (CkSession *session, + gboolean *local, + GError **error); +gboolean ck_session_get_user (CkSession *session, + guint *uid, + GError **error); +gboolean ck_session_get_x11_display (CkSession *session, + char **display, + GError **error); +gboolean ck_session_get_x11_display_device (CkSession *session, + char **display, + GError **error); +gboolean ck_session_get_display_device (CkSession *session, + char **display, + GError **error); +gboolean ck_session_get_session_type (CkSession *session, + char **type, + GError **error); +gboolean ck_session_get_host_name (CkSession *session, + char **host_name, + GError **error); +gboolean ck_session_get_creation_time (CkSession *session, + char **iso8601_datetime, + GError **error); /* Non-authoritative properties */ -gboolean ck_session_get_idle_hint (CkSession *session, - gboolean *idle_hint, - GError **error); -gboolean ck_session_get_idle_since_hint (CkSession *session, - char **iso8601_datetime, - GError **error); -gboolean ck_session_set_idle_hint (CkSession *session, - gboolean idle_hint, - DBusGMethodInvocation *context); +gboolean ck_session_get_idle_hint (CkSession *session, + gboolean *idle_hint, + GError **error); +gboolean ck_session_get_idle_since_hint (CkSession *session, + char **iso8601_datetime, + GError **error); +gboolean ck_session_set_idle_hint (CkSession *session, + gboolean idle_hint, + DBusGMethodInvocation *context); /* Privileged actions */ -gboolean ck_session_activate (CkSession *session, - DBusGMethodInvocation *context); -gboolean ck_session_lock (CkSession *session, - DBusGMethodInvocation *context); -gboolean ck_session_unlock (CkSession *session, - DBusGMethodInvocation *context); +gboolean ck_session_activate (CkSession *session, + DBusGMethodInvocation *context); +gboolean ck_session_lock (CkSession *session, + DBusGMethodInvocation *context); +gboolean ck_session_unlock (CkSession *session, + DBusGMethodInvocation *context); G_END_DECLS diff --git a/src/ck-session.xml b/src/ck-session.xml index 71ba983..5a993cb 100644 --- a/src/ck-session.xml +++ b/src/ck-session.xml @@ -18,6 +18,9 @@ + + + diff --git a/tools/linux/ck-collect-session-info.c b/tools/linux/ck-collect-session-info.c index 66ecd26..cee5ccc 100644 --- a/tools/linux/ck-collect-session-info.c +++ b/tools/linux/ck-collect-session-info.c @@ -38,6 +38,7 @@ typedef struct { uid_t uid; pid_t pid; char *display_device; + char *x11_display_device; char *x11_display; gboolean x11_can_connect; char *hostname; @@ -50,6 +51,7 @@ static void session_info_free (SessionInfo *si) { g_free (si->display_device); + g_free (si->x11_display_device); g_free (si->x11_display); g_free (si->hostname); g_free (si->session_type); @@ -252,6 +254,9 @@ fill_x11_info (SessionInfo *si) si->is_local = FALSE; si->is_local_is_set = TRUE; + + /* FIXME: get the remote hostname */ + return; } @@ -266,9 +271,7 @@ fill_x11_info (SessionInfo *si) return; } - /* overwrite the tty value */ - g_free (si->display_device); - si->display_device = proc_stat_get_tty (xorg_stat); + si->x11_display_device = proc_stat_get_tty (xorg_stat); proc_stat_free (xorg_stat); si->is_local = TRUE; @@ -302,6 +305,13 @@ fill_session_info (SessionInfo *si) fill_x11_info (si); + if (! si->is_local_is_set) { + /* FIXME: how should we set this? */ + /* non x11 sessions must be local I guess */ + si->is_local = TRUE; + si->is_local_is_set = TRUE; + } + return TRUE; } @@ -309,12 +319,15 @@ static void print_session_info (SessionInfo *si) { printf ("user = %u\n", si->uid); - if (si->display_device != NULL) { - printf ("display-device = %s\n", si->display_device); - } if (si->x11_display != NULL) { printf ("x11-display = %s\n", si->x11_display); } + if (si->x11_display_device != NULL) { + printf ("x11-display-device = %s\n", si->x11_display_device); + } + if (si->display_device != NULL) { + printf ("display-device = %s\n", si->display_device); + } if (si->session_type != NULL) { printf ("session-type = %s\n", si->session_type); } @@ -355,8 +368,8 @@ main (int argc, GOptionContext *context; gboolean ret; GError *error; - static int user_id; - static int process_id; + static int user_id = -1; + static int process_id = -1; static GOptionEntry entries [] = { { "uid", 0, 0, G_OPTION_ARG_INT, &user_id, "User ID", NULL }, { "pid", 0, 0, G_OPTION_ARG_INT, &process_id, "Process ID", NULL }, -- cgit