diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/Makefile.in | 10 | ||||
-rw-r--r-- | src/ck-log-event.c | 42 | ||||
-rw-r--r-- | src/ck-log-event.h | 3 | ||||
-rw-r--r-- | src/ck-manager-glue.h | 10 | ||||
-rw-r--r-- | src/ck-manager.c | 94 | ||||
-rw-r--r-- | src/ck-marshal.c | 37 | ||||
-rw-r--r-- | src/ck-marshal.h | 8 | ||||
-rw-r--r-- | src/ck-marshal.list | 1 | ||||
-rw-r--r-- | src/ck-run-programs.h | 3 | ||||
-rw-r--r-- | src/ck-seat-glue.h | 4 | ||||
-rw-r--r-- | src/ck-seat.c | 196 | ||||
-rw-r--r-- | src/ck-seat.h | 10 | ||||
-rw-r--r-- | src/ck-session-glue.h | 6 | ||||
-rw-r--r-- | src/ck-session-leader.c | 1 | ||||
-rw-r--r-- | src/ck-session.c | 8 | ||||
-rw-r--r-- | src/ck-session.h | 3 | ||||
-rw-r--r-- | src/ck-sysdeps-solaris.c | 1 |
18 files changed, 345 insertions, 94 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index cbe8a09..6ab05c8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -205,5 +205,7 @@ MAINTAINERCLEANFILES = \ install-data-local: -mkdir -p $(DESTDIR)$(sysconfdir)/ConsoleKit/run-session.d -mkdir -p $(DESTDIR)$(prefix)/lib/ConsoleKit/run-session.d + -mkdir -p $(DESTDIR)$(sysconfdir)/ConsoleKit/run-seat.d + -mkdir -p $(DESTDIR)$(prefix)/lib/ConsoleKit/run-seat.d -mkdir -p $(DESTDIR)$(localstatedir)/run/ConsoleKit -mkdir -p $(DESTDIR)$(localstatedir)/log/ConsoleKit diff --git a/src/Makefile.in b/src/Makefile.in index 36bd4a2..c979ab3 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.10.2 from Makefile.am. +# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -469,8 +469,8 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ exit 1;; \ esac; \ done; \ @@ -703,7 +703,7 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS @@ -936,6 +936,8 @@ ck-marshal.h: ck-marshal.list install-data-local: -mkdir -p $(DESTDIR)$(sysconfdir)/ConsoleKit/run-session.d -mkdir -p $(DESTDIR)$(prefix)/lib/ConsoleKit/run-session.d + -mkdir -p $(DESTDIR)$(sysconfdir)/ConsoleKit/run-seat.d + -mkdir -p $(DESTDIR)$(prefix)/lib/ConsoleKit/run-seat.d -mkdir -p $(DESTDIR)$(localstatedir)/run/ConsoleKit -mkdir -p $(DESTDIR)$(localstatedir)/log/ConsoleKit # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/src/ck-log-event.c b/src/ck-log-event.c index 965a036..66f439c 100644 --- a/src/ck-log-event.c +++ b/src/ck-log-event.c @@ -63,6 +63,8 @@ static void event_system_start_free (CkLogSystemStartEvent *event) { g_assert (event != NULL); + g_free (event->kernel_release); + g_free (event->boot_arguments); } static void @@ -196,6 +198,9 @@ event_system_start_copy (CkLogSystemStartEvent *event, { g_assert (event != NULL); g_assert (event_copy != NULL); + + event_copy->kernel_release = g_strdup (event->kernel_release); + event_copy->boot_arguments = g_strdup (event->boot_arguments); } static void @@ -470,6 +475,10 @@ add_log_for_system_start (GString *str, CkLogSystemStartEvent *e; e = (CkLogSystemStartEvent *)event; + g_string_append_printf (str, + "kernel-release='%s' boot-arguments='%s'", + e->kernel_release ? e->kernel_release : "", + e->boot_arguments ? e->boot_arguments : ""); } static void @@ -855,23 +864,54 @@ parse_log_for_system_restart (const GString *str, static gboolean parse_log_for_system_start (const GString *str, - CkLogEvent *event) + CkLogEvent *event) { gboolean ret; const char *s; + GRegex *re; + GMatchInfo *match_info; + gboolean res; + GError *error; CkLogSystemStartEvent *e; ret = FALSE; + re = NULL; + match_info = NULL; s = skip_header (str->str, str->len); if (s == NULL) { goto out; } + /* kernel-release and boot-arguments are attributes added in 0.4 */ + error = NULL; + re = g_regex_new ("(kernel-release='(?P<release>[^']+)')?[ ]?(boot-arguments='(?P<arguments>.*)')?", 0, 0, &error); + if (re == NULL) { + g_warning (error->message); + goto out; + } + + g_regex_match (re, s, 0, &match_info); + + res = g_match_info_matches (match_info); + if (! res) { + g_warning ("Unable to parse system start event: %s", s); + goto out; + } + e = (CkLogSystemStartEvent *)event; + e->kernel_release = g_match_info_fetch_named (match_info, "release"); + e->boot_arguments = g_match_info_fetch_named (match_info, "arguments"); + ret = TRUE; out: + if (match_info != NULL) { + g_match_info_free (match_info); + } + if (re != NULL) { + g_regex_unref (re); + } return ret; } diff --git a/src/ck-log-event.h b/src/ck-log-event.h index 0c04c1d..65571f0 100644 --- a/src/ck-log-event.h +++ b/src/ck-log-event.h @@ -60,7 +60,8 @@ typedef struct typedef struct { - gpointer dummy; + char *kernel_release; + char *boot_arguments; } CkLogSystemStartEvent; typedef struct diff --git a/src/ck-manager-glue.h b/src/ck-manager-glue.h index a60d5c9..aa360ee 100644 --- a/src/ck-manager-glue.h +++ b/src/ck-manager-glue.h @@ -53,7 +53,7 @@ G_BEGIN_DECLS #endif /* !G_ENABLE_DEBUG */ -/* NONE:STRING,POINTER (/tmp/dbus-binding-tool-c-marshallers.2MBKXU:1) */ +/* NONE:STRING,POINTER (/tmp/dbus-binding-tool-c-marshallers.CGY3YU:1) */ extern void dbus_glib_marshal_ck_manager_VOID__STRING_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, @@ -97,7 +97,7 @@ dbus_glib_marshal_ck_manager_VOID__STRING_POINTER (GClosure *closure, } #define dbus_glib_marshal_ck_manager_NONE__STRING_POINTER dbus_glib_marshal_ck_manager_VOID__STRING_POINTER -/* BOOLEAN:POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.2MBKXU:2) */ +/* BOOLEAN:POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.CGY3YU:2) */ extern void dbus_glib_marshal_ck_manager_BOOLEAN__POINTER_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, @@ -144,15 +144,15 @@ dbus_glib_marshal_ck_manager_BOOLEAN__POINTER_POINTER (GClosure *closure, g_value_set_boolean (return_value, v_return); } -/* NONE:UINT,POINTER (/tmp/dbus-binding-tool-c-marshallers.2MBKXU:3) */ +/* NONE:UINT,POINTER (/tmp/dbus-binding-tool-c-marshallers.CGY3YU:3) */ #define dbus_glib_marshal_ck_manager_VOID__UINT_POINTER g_cclosure_marshal_VOID__UINT_POINTER #define dbus_glib_marshal_ck_manager_NONE__UINT_POINTER dbus_glib_marshal_ck_manager_VOID__UINT_POINTER -/* NONE:POINTER (/tmp/dbus-binding-tool-c-marshallers.2MBKXU:4) */ +/* NONE:POINTER (/tmp/dbus-binding-tool-c-marshallers.CGY3YU:4) */ #define dbus_glib_marshal_ck_manager_VOID__POINTER g_cclosure_marshal_VOID__POINTER #define dbus_glib_marshal_ck_manager_NONE__POINTER dbus_glib_marshal_ck_manager_VOID__POINTER -/* NONE:BOXED,POINTER (/tmp/dbus-binding-tool-c-marshallers.2MBKXU:5) */ +/* NONE:BOXED,POINTER (/tmp/dbus-binding-tool-c-marshallers.CGY3YU:5) */ extern void dbus_glib_marshal_ck_manager_VOID__BOXED_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, diff --git a/src/ck-manager.c b/src/ck-manager.c index bb65d73..99693a3 100644 --- a/src/ck-manager.c +++ b/src/ck-manager.c @@ -200,7 +200,7 @@ ck_manager_dump (CkManager *manager) return; } - fd = g_open (filename_tmp, O_CREAT | O_WRONLY, 0600); + fd = g_open (filename_tmp, O_CREAT | O_WRONLY, 0644); if (fd == -1) { g_warning ("Cannot create file %s: %s", filename_tmp, g_strerror (errno)); goto error; @@ -810,12 +810,9 @@ check_polkit_permissions (CkManager *manager, AuthorizedCallback callback) { const char *sender; - GError *error; PolkitSubject *subject; AuthorizedCallbackData *data; - error = NULL; - g_debug ("constructing polkit data"); /* Check that caller is privileged */ @@ -837,6 +834,7 @@ check_polkit_permissions (CkManager *manager, NULL, (GAsyncReadyCallback)auth_ready_callback, data); + g_object_unref (subject); } static void @@ -873,14 +871,12 @@ get_polkit_permissions (CkManager *manager, { const char *sender; PolkitSubject *subject; - GError *error; g_debug ("get permissions for action %s", action); sender = dbus_g_method_get_sender (context); subject = polkit_system_bus_name_new (sender); - error = NULL; polkit_authority_check_authorization (manager->priv->pol_ctx, subject, action, @@ -890,7 +886,6 @@ get_polkit_permissions (CkManager *manager, (GAsyncReadyCallback) ready_cb, context); g_object_unref (subject); - } #endif @@ -1228,29 +1223,50 @@ ck_manager_can_stop (CkManager *manager, } static void -on_seat_active_session_changed (CkSeat *seat, - const char *ssid, - CkManager *manager) +on_seat_active_session_changed_full (CkSeat *seat, + CkSession *old_session, + CkSession *session, + CkManager *manager) { + char *ssid = NULL; + + if (session != NULL) { + ck_session_get_id (session, &ssid, NULL); + } + ck_manager_dump (manager); + ck_seat_run_programs (seat, old_session, session, "seat_active_session_changed"); + log_seat_active_session_changed_event (manager, seat, ssid); } static void -on_seat_session_added (CkSeat *seat, - const char *ssid, - CkManager *manager) +on_seat_session_added_full (CkSeat *seat, + CkSession *session, + CkManager *manager) { + char *ssid = NULL; + + ck_session_get_id (session, &ssid, NULL); + ck_manager_dump (manager); + ck_session_run_programs (session, "session_added"); + log_seat_session_added_event (manager, seat, ssid); } static void -on_seat_session_removed (CkSeat *seat, - const char *ssid, - CkManager *manager) +on_seat_session_removed_full (CkSeat *seat, + CkSession *session, + CkManager *manager) { + char *ssid = NULL; + + ck_session_get_id (session, &ssid, NULL); + ck_manager_dump (manager); + ck_session_run_programs (session, "session_removed"); + log_seat_session_removed_event (manager, seat, ssid); } @@ -1276,9 +1292,9 @@ static void connect_seat_signals (CkManager *manager, CkSeat *seat) { - g_signal_connect (seat, "active-session-changed", G_CALLBACK (on_seat_active_session_changed), manager); - g_signal_connect (seat, "session-added", G_CALLBACK (on_seat_session_added), manager); - g_signal_connect (seat, "session-removed", G_CALLBACK (on_seat_session_removed), manager); + g_signal_connect (seat, "active-session-changed-full", G_CALLBACK (on_seat_active_session_changed_full), manager); + g_signal_connect (seat, "session-added-full", G_CALLBACK (on_seat_session_added_full), manager); + g_signal_connect (seat, "session-removed-full", G_CALLBACK (on_seat_session_removed_full), manager); g_signal_connect (seat, "device-added", G_CALLBACK (on_seat_device_added), manager); g_signal_connect (seat, "device-removed", G_CALLBACK (on_seat_device_removed), manager); } @@ -1287,9 +1303,9 @@ static void disconnect_seat_signals (CkManager *manager, CkSeat *seat) { - g_signal_handlers_disconnect_by_func (seat, on_seat_active_session_changed, manager); - g_signal_handlers_disconnect_by_func (seat, on_seat_session_added, manager); - g_signal_handlers_disconnect_by_func (seat, on_seat_session_removed, manager); + g_signal_handlers_disconnect_by_func (seat, on_seat_active_session_changed_full, manager); + g_signal_handlers_disconnect_by_func (seat, on_seat_session_added_full, manager); + g_signal_handlers_disconnect_by_func (seat, on_seat_session_removed_full, manager); g_signal_handlers_disconnect_by_func (seat, on_seat_device_added, manager); g_signal_handlers_disconnect_by_func (seat, on_seat_device_removed, manager); } @@ -1304,25 +1320,34 @@ add_new_seat (CkManager *manager, sid = generate_seat_id (manager); seat = ck_seat_new (sid, kind); - if (seat == NULL) { - /* returns null if connection to bus fails */ - g_free (sid); - goto out; - } + + /* First we connect our own signals to the seat, followed by + * the D-Bus signal hookup to make sure we can first dump the + * database and only then send out the D-Bus signals for + * it. GObject guarantees us that the signal handlers are + * called in the same order as they are registered. */ connect_seat_signals (manager, seat); + if (!ck_seat_register (seat)) { + /* returns false if connection to bus fails */ + disconnect_seat_signals (manager, seat); + g_object_unref (seat); + g_free (sid); + return NULL; + } g_hash_table_insert (manager->priv->seats, sid, seat); g_debug ("Added seat: %s kind:%d", sid, kind); ck_manager_dump (manager); + ck_seat_run_programs (seat, NULL, NULL, "seat_added"); + g_debug ("Emitting seat-added: %s", sid); g_signal_emit (manager, signals [SEAT_ADDED], 0, sid); log_seat_added_event (manager, seat); - out: return seat; } @@ -1359,6 +1384,7 @@ remove_seat (CkManager *manager, } ck_manager_dump (manager); + ck_seat_run_programs (seat, NULL, NULL, "seat_removed"); g_debug ("Emitting seat-removed: %s", sid); g_signal_emit (manager, signals [SEAT_REMOVED], 0, sid); @@ -2407,20 +2433,24 @@ add_seat_for_file (CkManager *manager, sid = generate_seat_id (manager); seat = ck_seat_new_from_file (sid, filename); - if (seat == NULL) { - /* returns null if connection to bus fails */ + + connect_seat_signals (manager, seat); + if (!ck_seat_register (seat)) { + /* returns false if connection to bus fails */ + disconnect_seat_signals (manager, seat); + g_object_unref (seat); g_free (sid); return; } - connect_seat_signals (manager, seat); - g_hash_table_insert (manager->priv->seats, sid, seat); g_debug ("Added seat: %s", sid); ck_manager_dump (manager); + ck_seat_run_programs (seat, NULL, NULL, "seat_added"); + g_debug ("Emitting seat-added: %s", sid); g_signal_emit (manager, signals [SEAT_ADDED], 0, sid); log_seat_added_event (manager, seat); diff --git a/src/ck-marshal.c b/src/ck-marshal.c index 8b08794..06dc9b3 100644 --- a/src/ck-marshal.c +++ b/src/ck-marshal.c @@ -124,3 +124,40 @@ ck_marshal_BOOLEAN__POINTER (GClosure *closure, g_value_set_boolean (return_value, v_return); } +/* VOID:OBJECT,OBJECT (ck-marshal.list:3) */ +void +ck_marshal_VOID__OBJECT_OBJECT (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__OBJECT_OBJECT) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_VOID__OBJECT_OBJECT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__OBJECT_OBJECT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_object (param_values + 1), + g_marshal_value_peek_object (param_values + 2), + data2); +} + diff --git a/src/ck-marshal.h b/src/ck-marshal.h index 7553810..e817ae0 100644 --- a/src/ck-marshal.h +++ b/src/ck-marshal.h @@ -22,6 +22,14 @@ extern void ck_marshal_BOOLEAN__POINTER (GClosure *closure, gpointer invocation_hint, gpointer marshal_data); +/* VOID:OBJECT,OBJECT (ck-marshal.list:3) */ +extern void ck_marshal_VOID__OBJECT_OBJECT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + G_END_DECLS #endif /* __ck_marshal_MARSHAL_H__ */ diff --git a/src/ck-marshal.list b/src/ck-marshal.list index f9eed10..7f60efc 100644 --- a/src/ck-marshal.list +++ b/src/ck-marshal.list @@ -1,2 +1,3 @@ VOID:UINT,STRING BOOLEAN:POINTER +VOID:OBJECT,OBJECT diff --git a/src/ck-run-programs.h b/src/ck-run-programs.h index 77cdf48..07f4086 100644 --- a/src/ck-run-programs.h +++ b/src/ck-run-programs.h @@ -30,9 +30,6 @@ G_BEGIN_DECLS void ck_run_programs (const char *dirpath, const char *action, char **extra_env); -void ck_session_run_programs (CkSession *session, const char *action); - - G_END_DECLS #endif /* __CK_RUN_PROGRAMS_H */ diff --git a/src/ck-seat-glue.h b/src/ck-seat-glue.h index a9db6f2..316d929 100644 --- a/src/ck-seat-glue.h +++ b/src/ck-seat-glue.h @@ -53,7 +53,7 @@ G_BEGIN_DECLS #endif /* !G_ENABLE_DEBUG */ -/* BOOLEAN:POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.RK8LXU:1) */ +/* BOOLEAN:POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.SGA4YU:1) */ extern void dbus_glib_marshal_ck_seat_BOOLEAN__POINTER_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, @@ -100,7 +100,7 @@ dbus_glib_marshal_ck_seat_BOOLEAN__POINTER_POINTER (GClosure *closure, g_value_set_boolean (return_value, v_return); } -/* NONE:BOXED,POINTER (/tmp/dbus-binding-tool-c-marshallers.RK8LXU:2) */ +/* NONE:BOXED,POINTER (/tmp/dbus-binding-tool-c-marshallers.SGA4YU:2) */ extern void dbus_glib_marshal_ck_seat_VOID__BOXED_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, diff --git a/src/ck-seat.c b/src/ck-seat.c index c2f70da..fedd900 100644 --- a/src/ck-seat.c +++ b/src/ck-seat.c @@ -67,8 +67,11 @@ struct CkSeatPrivate enum { ACTIVE_SESSION_CHANGED, - SESSION_ADDED, + ACTIVE_SESSION_CHANGED_FULL, + SESSION_ADDED, /* Carries the session as path for D-Bus */ + SESSION_ADDED_FULL, /* Carries the session as CkSession for other uses */ SESSION_REMOVED, + SESSION_REMOVED_FULL, DEVICE_ADDED, DEVICE_REMOVED, LAST_SIGNAL @@ -480,15 +483,17 @@ static void change_active_session (CkSeat *seat, CkSession *session) { - char *ssid; + char *ssid; + CkSession *old_session; if (seat->priv->active_session == session) { return; } - if (seat->priv->active_session != NULL) { - ck_session_set_active (seat->priv->active_session, FALSE, NULL); - g_object_unref (seat->priv->active_session); + old_session = seat->priv->active_session; + + if (old_session != NULL) { + ck_session_set_active (old_session, FALSE, NULL); } seat->priv->active_session = session; @@ -502,8 +507,21 @@ change_active_session (CkSeat *seat, g_debug ("Active session changed: %s", ssid ? ssid : "(null)"); + /* The order of signal emission matters here. The manager + * dumps the database when receiving the + * 'active-session-changed-full' signal and does callout + * handling. dbus-glib will then send out a D-Bus on the + * 'active-session-changed' signal. Since the D-Bus signal + * must be sent when the database dump is finished it is + * important that the '-full' signalled is emitted first. */ + + g_signal_emit (seat, signals [ACTIVE_SESSION_CHANGED_FULL], 0, old_session, session); g_signal_emit (seat, signals [ACTIVE_SESSION_CHANGED], 0, ssid); + if (old_session != NULL) { + g_object_unref (old_session); + } + g_free (ssid); } @@ -586,9 +604,13 @@ ck_seat_remove_session (CkSeat *seat, * unref until the signal is emitted */ g_hash_table_steal (seat->priv->sessions, ssid); - ck_session_run_programs (session, "session_removed"); - g_debug ("Emitting session-removed: %s", ssid); + + /* The order of signal emission matters here, too, for similar + * reasons as for 'session-added'/'session-added-full'. See + * above. */ + + g_signal_emit (seat, signals [SESSION_REMOVED_FULL], 0, session); g_signal_emit (seat, signals [SESSION_REMOVED], 0, ssid); /* try to change the active session */ @@ -624,10 +646,12 @@ ck_seat_add_session (CkSeat *seat, g_signal_connect_object (session, "activate", G_CALLBACK (session_activate), seat, 0); /* FIXME: attach to property notify signals? */ - ck_session_run_programs (session, "session_added"); - g_debug ("Emitting added signal: %s", ssid); + /* The order of signal emission matters here, too. See + * above. */ + + g_signal_emit (seat, signals [SESSION_ADDED_FULL], 0, session); g_signal_emit (seat, signals [SESSION_ADDED], 0, ssid); maybe_update_active_session (seat); @@ -741,8 +765,8 @@ active_vt_changed (CkVtMonitor *vt_monitor, update_active_vt (seat, num); } -static gboolean -register_seat (CkSeat *seat) +gboolean +ck_seat_register (CkSeat *seat) { GError *error = NULL; @@ -920,6 +944,15 @@ ck_seat_class_init (CkSeatClass *klass) g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); + signals [ACTIVE_SESSION_CHANGED_FULL] = g_signal_new ("active-session-changed-full", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + 0, + NULL, + NULL, + ck_marshal_VOID__OBJECT_OBJECT, + G_TYPE_NONE, + 2, CK_TYPE_SESSION, CK_TYPE_SESSION); signals [SESSION_ADDED] = g_signal_new ("session-added", G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, @@ -929,6 +962,15 @@ ck_seat_class_init (CkSeatClass *klass) g_cclosure_marshal_VOID__BOXED, G_TYPE_NONE, 1, DBUS_TYPE_G_OBJECT_PATH); + signals [SESSION_ADDED_FULL] = g_signal_new ("session-added-full", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + 0, + NULL, + NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, + 1, CK_TYPE_SESSION); signals [SESSION_REMOVED] = g_signal_new ("session-removed", G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, @@ -938,7 +980,15 @@ ck_seat_class_init (CkSeatClass *klass) g_cclosure_marshal_VOID__BOXED, G_TYPE_NONE, 1, DBUS_TYPE_G_OBJECT_PATH); - + signals [SESSION_REMOVED_FULL] = g_signal_new ("session-removed-full", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + 0, + NULL, + NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, + 1, CK_TYPE_SESSION); signals [DEVICE_ADDED] = g_signal_new ("device-added", G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, @@ -1023,19 +1073,12 @@ ck_seat_new (const char *sid, CkSeatKind kind) { GObject *object; - gboolean res; object = g_object_new (CK_TYPE_SEAT, "id", sid, "kind", kind, NULL); - res = register_seat (CK_SEAT (object)); - if (! res) { - g_object_unref (object); - return NULL; - } - return CK_SEAT (object); } @@ -1045,7 +1088,6 @@ ck_seat_new_with_devices (const char *sid, GPtrArray *devices) { GObject *object; - gboolean res; int i; object = g_object_new (CK_TYPE_SEAT, @@ -1059,12 +1101,6 @@ ck_seat_new_with_devices (const char *sid, } } - res = register_seat (CK_SEAT (object)); - if (! res) { - g_object_unref (object); - return NULL; - } - return CK_SEAT (object); } @@ -1083,6 +1119,8 @@ ck_seat_new_from_file (const char *sid, gsize ndevices; gsize i; + seat = NULL; + key_file = g_key_file_new (); error = NULL; res = g_key_file_load_from_file (key_file, @@ -1092,24 +1130,24 @@ ck_seat_new_from_file (const char *sid, if (! res) { g_warning ("Unable to load seats from file %s: %s", path, error->message); g_error_free (error); - return NULL; + goto out; } group = g_key_file_get_start_group (key_file); if (group == NULL || strcmp (group, "Seat Entry") != 0) { g_warning ("Not a seat file: %s", path); - return NULL; + goto out; } hidden = g_key_file_get_boolean (key_file, group, "Hidden", NULL); if (hidden) { g_debug ("Seat is hidden"); - return NULL; + goto out; } device_list = g_key_file_get_string_list (key_file, group, "Devices", &ndevices, NULL); - g_debug ("Creating seat %s with %d devices", sid, ndevices); + g_debug ("Creating seat %s with %zd devices", sid, ndevices); devices = g_ptr_array_sized_new (ndevices); @@ -1137,17 +1175,110 @@ ck_seat_new_from_file (const char *sid, g_strfreev (split); } - + g_strfreev (device_list); g_free (group); seat = ck_seat_new_with_devices (sid, CK_SEAT_KIND_STATIC, devices); - g_ptr_array_free (devices, TRUE); +out: + + g_key_file_free (key_file); + return seat; } static void +env_add_session_info (CkSession *session, + const char *prefix, + char **extra_env, + int *n) +{ + char *s; + gboolean b; + guint u; + + if (session == NULL) { + return; + } + + if (ck_session_get_id (session, &s, NULL) && s != NULL && *s != '\0') { + extra_env[(*n)++] = g_strdup_printf ("%sID=%s", prefix, s); + g_free (s); + } + + if (ck_session_get_session_type (session, &s, NULL) && s != NULL && *s != '\0') { + extra_env[(*n)++] = g_strdup_printf ("%sTYPE=%s", prefix, s); + g_free (s); + } + + if (ck_session_get_unix_user (session, &u, NULL)) { + extra_env[(*n)++] = g_strdup_printf ("%sUSER_UID=%u", prefix, u); + } + + if (ck_session_get_display_device (session, &s, NULL) && s != NULL && *s != '\0') { + extra_env[(*n)++] = g_strdup_printf ("%sDISPLAY_DEVICE=%s", prefix, s); + g_free (s); + } + + if (ck_session_get_x11_display_device (session, &s, NULL) && s != NULL && *s != '\0') { + extra_env[(*n)++] = g_strdup_printf ("%sX11_DISPLAY_DEVICE=%s", prefix, s); + g_free (s); + } + + if (ck_session_get_x11_display (session, &s, NULL) && s != NULL && *s != '\0') { + extra_env[(*n)++] = g_strdup_printf ("%sX11_DISPLAY=%s", prefix, s); + g_free (s); + } + + if (ck_session_get_remote_host_name (session, &s, NULL) && s != NULL && *s != '\0') { + extra_env[(*n)++] = g_strdup_printf ("%sREMOTE_HOST_NAME=%s", prefix, s); + g_free (s); + } + + if (ck_session_is_local (session, &b, NULL)) + extra_env[(*n)++] = g_strdup_printf ("%sIS_LOCAL=%s", prefix, b ? "true" : "false"); +} + +void +ck_seat_run_programs (CkSeat *seat, + CkSession *old_session, + CkSession *new_session, + const char *action) +{ + int n; + char *extra_env[18]; /* be sure to adjust this as needed when + * you add more variables to the callout's + * environment */ + + n = 0; + + extra_env[n++] = g_strdup_printf ("CK_SEAT_ID=%s", seat->priv->id); + + /* Callout scripts/binaries should check if CK_SEAT_SESSION_ID + * resp. CK_SEAT_OLD_SESSON_ID is set to figure out if there + * will be an active session after the switch, or if there was + * one before. At least one of those environment variables + * will be set, possibly both. Only after checking these + * variables the script should check for the other session + * property variables. */ + + env_add_session_info (old_session, "CK_SEAT_OLD_SESSION_", extra_env, &n); + env_add_session_info (new_session, "CK_SEAT_SESSION_", extra_env, &n); + + extra_env[n++] = NULL; + + g_assert(n <= G_N_ELEMENTS(extra_env)); + + ck_run_programs (SYSCONFDIR "/ConsoleKit/run-seat.d", action, extra_env); + ck_run_programs (PREFIX "/lib/ConsoleKit/run-seat.d", action, extra_env); + + for (n = 0; extra_env[n] != NULL; n++) { + g_free (extra_env[n]); + } +} + +static void dump_seat_session_iter (char *id, CkSession *session, GString *str) @@ -1232,4 +1363,3 @@ ck_seat_dump (CkSeat *seat, g_free (group_name); } - diff --git a/src/ck-seat.h b/src/ck-seat.h index 5977781..fb9a955 100644 --- a/src/ck-seat.h +++ b/src/ck-seat.h @@ -91,6 +91,13 @@ CkSeat * ck_seat_new_with_devices (const char *sid, CkSeatKind kind, GPtrArray *devices); +gboolean ck_seat_register (CkSeat *seat); + +void ck_seat_run_programs (CkSeat *seat, + CkSession *old_session, + CkSession *new_session, + const char *action); + void ck_seat_dump (CkSeat *seat, GKeyFile *key_file); @@ -103,9 +110,6 @@ gboolean ck_seat_add_session (CkSeat *seat, gboolean ck_seat_remove_session (CkSeat *seat, CkSession *session, GError **error); -gboolean ck_seat_set_active_session (CkSeat *seat, - CkSession *session, - GError **error); gboolean ck_seat_add_device (CkSeat *seat, GValueArray *device, GError **error); diff --git a/src/ck-session-glue.h b/src/ck-session-glue.h index b121358..2984bda 100644 --- a/src/ck-session-glue.h +++ b/src/ck-session-glue.h @@ -53,7 +53,7 @@ G_BEGIN_DECLS #endif /* !G_ENABLE_DEBUG */ -/* NONE:BOOLEAN,POINTER (/tmp/dbus-binding-tool-c-marshallers.CAALXU:1) */ +/* NONE:BOOLEAN,POINTER (/tmp/dbus-binding-tool-c-marshallers.3QM4YU:1) */ extern void dbus_glib_marshal_ck_session_VOID__BOOLEAN_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, @@ -97,7 +97,7 @@ dbus_glib_marshal_ck_session_VOID__BOOLEAN_POINTER (GClosure *closure, } #define dbus_glib_marshal_ck_session_NONE__BOOLEAN_POINTER dbus_glib_marshal_ck_session_VOID__BOOLEAN_POINTER -/* BOOLEAN:POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.CAALXU:2) */ +/* BOOLEAN:POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.3QM4YU:2) */ extern void dbus_glib_marshal_ck_session_BOOLEAN__POINTER_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, @@ -144,7 +144,7 @@ dbus_glib_marshal_ck_session_BOOLEAN__POINTER_POINTER (GClosure *closure, g_value_set_boolean (return_value, v_return); } -/* NONE:POINTER (/tmp/dbus-binding-tool-c-marshallers.CAALXU:3) */ +/* NONE:POINTER (/tmp/dbus-binding-tool-c-marshallers.3QM4YU:3) */ #define dbus_glib_marshal_ck_session_VOID__POINTER g_cclosure_marshal_VOID__POINTER #define dbus_glib_marshal_ck_session_NONE__POINTER dbus_glib_marshal_ck_session_VOID__POINTER diff --git a/src/ck-session-leader.c b/src/ck-session-leader.c index 322b7fd..3702602 100644 --- a/src/ck-session-leader.c +++ b/src/ck-session-leader.c @@ -689,7 +689,6 @@ ck_session_leader_dump (CkSessionLeader *session_leader, g_key_file_set_string (key_file, group_name, "session", session_leader->priv->session_id); g_key_file_set_integer (key_file, group_name, "uid", session_leader->priv->uid); g_key_file_set_integer (key_file, group_name, "pid", session_leader->priv->pid); - g_key_file_set_string (key_file, group_name, "cookie", session_leader->priv->cookie); g_key_file_set_string (key_file, group_name, "service_name", session_leader->priv->service_name); g_free (group_name); diff --git a/src/ck-session.c b/src/ck-session.c index 4009ee1..d8db9dd 100644 --- a/src/ck-session.c +++ b/src/ck-session.c @@ -399,7 +399,6 @@ ck_session_set_active (CkSession *session, if (session->priv->active != active) { session->priv->active = active; - ck_session_run_programs (session, "session_active_changed"); g_signal_emit (session, signals [ACTIVE_CHANGED], 0, active); } @@ -1285,6 +1284,8 @@ ck_session_run_programs (CkSession *session, extra_env[n++] = g_strdup_printf ("CK_SESSION_IS_LOCAL=%s", session->priv->is_local ? "true" : "false"); extra_env[n++] = NULL; + g_assert(n <= G_N_ELEMENTS(extra_env)); + ck_run_programs (SYSCONFDIR "/ConsoleKit/run-session.d", action, extra_env); ck_run_programs (PREFIX "/lib/ConsoleKit/run-session.d", action, extra_env); @@ -1306,10 +1307,6 @@ ck_session_dump (CkSession *session, group_name, "seat", NONULL_STRING (session->priv->seat_id)); - g_key_file_set_string (key_file, - group_name, - "cookie", - NONULL_STRING (session->priv->cookie)); if (session->priv->session_type != NULL) { g_key_file_set_string (key_file, group_name, @@ -1362,4 +1359,3 @@ ck_session_dump (CkSession *session, g_free (group_name); } - diff --git a/src/ck-session.h b/src/ck-session.h index c9ebd08..b6b565b 100644 --- a/src/ck-session.h +++ b/src/ck-session.h @@ -76,6 +76,9 @@ CkSession * ck_session_new_with_parameters (const char *ss void ck_session_dump (CkSession *session, GKeyFile *key_file); +void ck_session_run_programs (CkSession *session, + const char *action); + gboolean ck_session_set_active (CkSession *session, gboolean active, diff --git a/src/ck-sysdeps-solaris.c b/src/ck-sysdeps-solaris.c index cd17bf7..bc3b695 100644 --- a/src/ck-sysdeps-solaris.c +++ b/src/ck-sysdeps-solaris.c @@ -286,6 +286,7 @@ ck_unix_pid_get_env_hash (pid_t pid) } out: + pclose (fp); return hash; } |