diff options
author | Halton Huo <halton.huo@sun.com> | 2010-01-15 14:06:32 +0800 |
---|---|---|
committer | Halton Huo <halton.huo@sun.com> | 2010-04-19 16:07:11 +0800 |
commit | b2e65a0ab7f4c417c85433e3e9bf97befbe6da3b (patch) | |
tree | 11f825e73fc96e9e651b14935601d5d203506a31 | |
parent | e7f3952632f077ff647e303bd08950085c293297 (diff) |
Enhancement CanActivateSessions for OpenSolaris.
VT switching is always enabled on Linux, but for OpenSolaris VT switching
can be truned of by 'svcadm disable vtdaemon'. So we should also check
whether the service vtdaemon is online on OpenSolaris.
https://bugs.freedesktop.org/show_bug.cgi?id=26055
-rw-r--r-- | configure.ac | 13 | ||||
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/ck-seat.c | 26 |
3 files changed, 39 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac index 117d788..8619f31 100644 --- a/configure.ac +++ b/configure.ac @@ -320,6 +320,19 @@ fi AC_SUBST(RBAC_LIBS) dnl --------------------------------------------------------------------------- +dnl check for SCF (Only avail on solaris) +dnl --------------------------------------------------------------------------- + +AC_CHECK_LIB(scf, smf_get_state, + [SCF_LIBS=-lscf + AC_DEFINE(HAVE_SCF,1,[Define to 1 if the libscf library is present.])], + [AC_MSG_WARN([[ +*** +*** libscf was not found. +]])]) +AC_SUBST(SCF_LIBS) + +dnl --------------------------------------------------------------------------- dnl Finish dnl --------------------------------------------------------------------------- diff --git a/src/Makefile.am b/src/Makefile.am index 6ab05c8..4788fe1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -139,6 +139,7 @@ console_kit_daemon_LDADD = \ $(CONSOLE_KIT_LIBS) \ $(POLKIT_LIBS) \ $(RBAC_LIBS) \ + $(SCF_LIBS) \ libck.la \ libck-event-log.la \ $(NULL) diff --git a/src/ck-seat.c b/src/ck-seat.c index af7db59..b2e5628 100644 --- a/src/ck-seat.c +++ b/src/ck-seat.c @@ -25,6 +25,9 @@ #include <fcntl.h> #include <unistd.h> #include <string.h> +#ifdef HAVE_SCF +#include <libscf.h> +#endif #include <glib.h> #include <glib/gi18n.h> @@ -661,6 +664,26 @@ ck_seat_add_session (CkSeat *seat, return TRUE; } +is_VT_enabled () +{ +#ifdef HAVE_SYS_VT_H + char *state = NULL; + gboolean vt_enabled; + + state = smf_get_state ("svc:/system/vtdaemon:default"); + if (state && g_str_equal (state, SCF_STATE_STRING_ONLINE)) { + vt_enabled = TRUE; + } else { + vt_enabled = FALSE; + } + + g_free (state); + return vt_enabled; +#else + return FALSE; +#endif /* HAVE_SYS_VT_H */ +} + gboolean ck_seat_can_activate_sessions (CkSeat *seat, gboolean *can_activate, @@ -669,7 +692,8 @@ ck_seat_can_activate_sessions (CkSeat *seat, g_return_val_if_fail (CK_IS_SEAT (seat), FALSE); if (can_activate != NULL) { - *can_activate = (seat->priv->kind == CK_SEAT_KIND_STATIC); + *can_activate = (seat->priv->kind == CK_SEAT_KIND_STATIC) + && is_VT_enabled (); } return TRUE; |