summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/sd_session_is_active.xml22
-rw-r--r--src/login/libsystemd-login.sym1
-rw-r--r--src/login/sd-login.c28
-rw-r--r--src/systemd/sd-login.h3
4 files changed, 52 insertions, 2 deletions
diff --git a/man/sd_session_is_active.xml b/man/sd_session_is_active.xml
index 88b22fd9f8..516275ea9f 100644
--- a/man/sd_session_is_active.xml
+++ b/man/sd_session_is_active.xml
@@ -46,6 +46,7 @@
<refname>sd_session_is_active</refname>
<refname>sd_session_get_uid</refname>
<refname>sd_session_get_seat</refname>
+ <refname>sd_session_get_service</refname>
<refpurpose>Determine state of a specific session</refpurpose>
</refnamediv>
@@ -69,6 +70,12 @@
<paramdef>const char* <parameter>session</parameter></paramdef>
<paramdef>char** <parameter>seat</parameter></paramdef>
</funcprototype>
+
+ <funcprototype>
+ <funcdef>int <function>sd_session_get_service</function></funcdef>
+ <paramdef>const char* <parameter>session</parameter></paramdef>
+ <paramdef>char** <parameter>service</parameter></paramdef>
+ </funcprototype>
</funcsynopsis>
</refsynopsisdiv>
@@ -94,6 +101,15 @@
returned string needs to be freed with the libc
<citerefentry><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry>
call after use.</para>
+
+ <para><function>sd_session_get_service()</function>
+ may be used to determine the name of the service (as
+ passed during PAM session setup) that registered the
+ session identified by the specified session
+ identifier. The returned string needs to be freed with
+ the libc
+ <citerefentry><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry>
+ call after use.</para>
</refsect1>
<refsect1>
@@ -102,7 +118,8 @@
<para>If the test succeeds
<function>sd_session_is_active()</function> returns a
positive integer, if it fails 0. On success
- <function>sd_session_get_uid()</function> and
+ <function>sd_session_get_uid()</function>,
+ <function>sd_session_get_service()</function> and
<function>sd_session_get_seat()</function> return 0 or
a positive integer. On failure, these calls return a
negative errno-style error code.</para>
@@ -112,7 +129,8 @@
<title>Notes</title>
<para>The <function>sd_session_is_active()</function>,
- <function>sd_session_get_uid()</function>, and
+ <function>sd_session_get_uid()</function>,
+ <function>sd_session_get_service()</function> and
<function>sd_session_get_seat()</function> interfaces
are available as shared library, which can be compiled
and linked to with the
diff --git a/src/login/libsystemd-login.sym b/src/login/libsystemd-login.sym
index 15e505e83b..3100c17662 100644
--- a/src/login/libsystemd-login.sym
+++ b/src/login/libsystemd-login.sym
@@ -37,4 +37,5 @@ local:
LIBSYSTEMD_LOGIN_38 {
global:
sd_pid_get_unit;
+ sd_session_get_service;
} LIBSYSTEMD_LOGIN_31;
diff --git a/src/login/sd-login.c b/src/login/sd-login.c
index 8893b1de80..ed98412266 100644
--- a/src/login/sd-login.c
+++ b/src/login/sd-login.c
@@ -415,6 +415,34 @@ _public_ int sd_session_get_seat(const char *session, char **seat) {
return 0;
}
+_public_ int sd_session_get_service(const char *session, char **service) {
+ char *p, *s = NULL;
+ int r;
+
+ if (!session)
+ return -EINVAL;
+ if (!service)
+ return -EINVAL;
+
+ p = strappend("/run/systemd/sessions/", session);
+ if (!p)
+ return -ENOMEM;
+
+ r = parse_env_file(p, NEWLINE, "SERVICE", &s, NULL);
+ free(p);
+
+ if (r < 0) {
+ free(s);
+ return r;
+ }
+
+ if (isempty(s))
+ return -ENOENT;
+
+ *service = s;
+ return 0;
+}
+
_public_ int sd_seat_get_active(const char *seat, char **session, uid_t *uid) {
char *p, *s = NULL, *t = NULL;
int r;
diff --git a/src/systemd/sd-login.h b/src/systemd/sd-login.h
index 00de6716b0..7d76f9a44e 100644
--- a/src/systemd/sd-login.h
+++ b/src/systemd/sd-login.h
@@ -83,6 +83,9 @@ int sd_session_get_uid(const char *session, uid_t *uid);
/* Determine seat of session */
int sd_session_get_seat(const char *session, char **seat);
+/* Determine the (PAM) service name this session was registered by. */
+int sd_session_get_service(const char *session, char **service);
+
/* Return active session and user of seat */
int sd_seat_get_active(const char *seat, char **session, uid_t *uid);