summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/pam_systemd.xml4
-rw-r--r--man/sd_session_is_active.xml23
-rw-r--r--src/libsystemd/libsystemd.sym.m47
-rw-r--r--src/libsystemd/sd-login/sd-login.c19
-rw-r--r--src/systemd/sd-login.h3
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);