147 lines
6.3 KiB
Diff
147 lines
6.3 KiB
Diff
From c72d5456e2d6a6c8cefbfc16a542ae03a769397f Mon Sep 17 00:00:00 2001
|
|
From: David Herrmann <dh.herrmann@gmail.com>
|
|
Date: Sat, 20 Sep 2014 18:42:29 +0200
|
|
Subject: [PATCH] login: add public sd_session_get_desktop() API
|
|
|
|
The desktop brand is stored as DESKTOP variable for sessions. It can be
|
|
set arbitrarily by the session owner and identifies the desktop
|
|
environment that is running on that session.
|
|
---
|
|
man/pam_systemd.xml | 4 +++-
|
|
man/sd_session_is_active.xml | 23 +++++++++++++++++++++++
|
|
src/libsystemd/libsystemd.sym.m4 | 7 ++++++-
|
|
src/libsystemd/sd-login/sd-login.c | 19 +++++++++++++++++++
|
|
src/systemd/sd-login.h | 3 +++
|
|
5 files changed, 54 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/man/pam_systemd.xml b/man/pam_systemd.xml
|
|
index 52dfe9df43..4df26a3f2b 100644
|
|
--- a/man/pam_systemd.xml
|
|
+++ b/man/pam_systemd.xml
|
|
@@ -268,7 +268,9 @@
|
|
as defined by the <ulink
|
|
url="http://standards.freedesktop.org/desktop-entry-spec/latest/">Desktop
|
|
Entry
|
|
- Specification</ulink>.</para></listitem>
|
|
+ Specification</ulink>. See
|
|
+ <citerefentry><refentrytitle>sd_session_get_desktop</refentrytitle><manvolnum>3</manvolnum></citerefentry>
|
|
+ for more details.</para></listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
diff --git a/man/sd_session_is_active.xml b/man/sd_session_is_active.xml
|
|
index 5006be4df5..e9840669c2 100644
|
|
--- a/man/sd_session_is_active.xml
|
|
+++ b/man/sd_session_is_active.xml
|
|
@@ -51,6 +51,7 @@
|
|
<refname>sd_session_get_service</refname>
|
|
<refname>sd_session_get_type</refname>
|
|
<refname>sd_session_get_class</refname>
|
|
+ <refname>sd_session_get_desktop</refname>
|
|
<refname>sd_session_get_display</refname>
|
|
<refname>sd_session_get_tty</refname>
|
|
<refname>sd_session_get_vt</refname>
|
|
@@ -110,6 +111,12 @@
|
|
</funcprototype>
|
|
|
|
<funcprototype>
|
|
+ <funcdef>int <function>sd_session_get_desktop</function></funcdef>
|
|
+ <paramdef>const char *<parameter>session</parameter></paramdef>
|
|
+ <paramdef>char **<parameter>desktop</parameter></paramdef>
|
|
+ </funcprototype>
|
|
+
|
|
+ <funcprototype>
|
|
<funcdef>int <function>sd_session_get_display</function></funcdef>
|
|
<paramdef>const char *<parameter>session</parameter></paramdef>
|
|
<paramdef>char **<parameter>display</parameter></paramdef>
|
|
@@ -218,6 +225,22 @@
|
|
<citerefentry project='man-pages'><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry>
|
|
call after use.</para>
|
|
|
|
+ <para><function>sd_session_get_desktop()</function> may
|
|
+ be used to determine the brand of the desktop running on
|
|
+ the session identified by the specified session identifier.
|
|
+ This field can be set freely by desktop environments and
|
|
+ does not follow any special formatting. However, desktops
|
|
+ are strongly recommended to use the same identifiers and
|
|
+ capitalization as for
|
|
+ <varname>$XDG_CURRENT_DESKTOP</varname>, as defined by
|
|
+ the <ulink
|
|
+ url="http://standards.freedesktop.org/desktop-entry-spec/latest/">Desktop
|
|
+ Entry
|
|
+ Specification</ulink>. The returned string needs to be
|
|
+ freed with the libc
|
|
+ <citerefentry project='man-pages'><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry>
|
|
+ call after use.</para>
|
|
+
|
|
<para><function>sd_session_get_display()</function>
|
|
may be used to determine the X11 display of the
|
|
session identified by the specified session
|
|
diff --git a/src/libsystemd/libsystemd.sym.m4 b/src/libsystemd/libsystemd.sym.m4
|
|
index d1450fbb26..87da7ac021 100644
|
|
--- a/src/libsystemd/libsystemd.sym.m4
|
|
+++ b/src/libsystemd/libsystemd.sym.m4
|
|
@@ -153,6 +153,11 @@ global:
|
|
sd_machine_get_ifindices;
|
|
} LIBSYSTEMD_214;
|
|
|
|
+LIBSYSTEMD_217 {
|
|
+global:
|
|
+ sd_session_get_desktop;
|
|
+} LIBSYSTEMD_216;
|
|
+
|
|
m4_ifdef(`ENABLE_KDBUS',
|
|
LIBSYSTEMD_FUTURE {
|
|
global:
|
|
@@ -438,5 +443,5 @@ global:
|
|
/* sd-path */
|
|
sd_path_home;
|
|
sd_path_search;
|
|
-} LIBSYSTEMD_216;
|
|
+} LIBSYSTEMD_217;
|
|
)
|
|
diff --git a/src/libsystemd/sd-login/sd-login.c b/src/libsystemd/sd-login/sd-login.c
|
|
index 95cb6ff581..c72d23ed53 100644
|
|
--- a/src/libsystemd/sd-login/sd-login.c
|
|
+++ b/src/libsystemd/sd-login/sd-login.c
|
|
@@ -485,6 +485,25 @@ _public_ int sd_session_get_class(const char *session, char **class) {
|
|
return session_get_string(session, "CLASS", class);
|
|
}
|
|
|
|
+_public_ int sd_session_get_desktop(const char *session, char **desktop) {
|
|
+ _cleanup_free_ char *escaped = NULL;
|
|
+ char *t;
|
|
+ int r;
|
|
+
|
|
+ assert_return(desktop, -EINVAL);
|
|
+
|
|
+ r = session_get_string(session, "DESKTOP", &escaped);
|
|
+ if (r < 0)
|
|
+ return r;
|
|
+
|
|
+ t = cunescape(escaped);
|
|
+ if (!t)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ *desktop = t;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
_public_ int sd_session_get_display(const char *session, char **display) {
|
|
return session_get_string(session, "DISPLAY", display);
|
|
}
|
|
diff --git a/src/systemd/sd-login.h b/src/systemd/sd-login.h
|
|
index 1eb3be30b5..93af19709b 100644
|
|
--- a/src/systemd/sd-login.h
|
|
+++ b/src/systemd/sd-login.h
|
|
@@ -147,6 +147,9 @@ int sd_session_get_type(const char *session, char **type);
|
|
/* Determine the class of this session, i.e. one of "user", "greeter" or "lock-screen". */
|
|
int sd_session_get_class(const char *session, char **clazz);
|
|
|
|
+/* Determine the desktop brand of this session, i.e. something like "GNOME", "KDE" or "SYSTEMD-CONSOLE". */
|
|
+int sd_session_get_desktop(const char *session, char **desktop);
|
|
+
|
|
/* Determine the X11 display of this session. */
|
|
int sd_session_get_display(const char *session, char **display);
|
|
|