Commit 9847946e authored by Lennart Poettering's avatar Lennart Poettering
Browse files

login: introduce sd_pid_get_service()

parent b72491a2
......@@ -20,9 +20,9 @@ ACLOCAL_AMFLAGS = -I m4
SUBDIRS = po
LIBSYSTEMD_LOGIN_CURRENT=0
LIBSYSTEMD_LOGIN_REVISION=6
LIBSYSTEMD_LOGIN_AGE=0
LIBSYSTEMD_LOGIN_CURRENT=1
LIBSYSTEMD_LOGIN_REVISION=0
LIBSYSTEMD_LOGIN_AGE=1
LIBSYSTEMD_DAEMON_CURRENT=0
LIBSYSTEMD_DAEMON_REVISION=0
......@@ -1910,6 +1910,7 @@ MANPAGES_ALIAS += \
man/sd_session_get_uid.3 \
man/sd_session_get_seat.3 \
man/sd_pid_get_owner_uid.3 \
man/sd_pid_get_service.3 \
man/sd_uid_is_on_seat.3 \
man/sd_uid_get_sessions.3 \
man/sd_uid_get_seats.3 \
......@@ -1924,6 +1925,7 @@ man/sd_login_monitor_get_fd.3: man/sd_login_monitor_new.3
man/sd_session_get_uid.3: man/sd_session_is_active.3
man/sd_session_get_seat.3: man/sd_session_is_active.3
man/sd_pid_get_owner_uid.3: man/sd_pid_get_session.3
man/sd_pid_get_session.3: man/sd_pid_get_session.3
man/sd_uid_is_on_seat.3: man/sd_uid_get_state.3
man/sd_uid_get_sessions.3: man/sd_uid_get_state.3
man/sd_uid_get_seats.3: man/sd_uid_get_state.3
......
......@@ -44,8 +44,9 @@
<refnamediv>
<refname>sd_pid_get_session</refname>
<refname>sd_pid_get_service</refname>
<refname>sd_pid_get_owner_uid</refname>
<refpurpose>Determine session or owner of a session of a specific PID</refpurpose>
<refpurpose>Determine session, service or owner of a session of a specific PID</refpurpose>
</refnamediv>
<refsynopsisdiv>
......@@ -58,6 +59,12 @@
<paramdef>char** <parameter>session</parameter></paramdef>
</funcprototype>
<funcprototype>
<funcdef>int <function>sd_pid_get_service</function></funcdef>
<paramdef>pid_t <parameter>pid</parameter></paramdef>
<paramdef>char** <parameter>service</parameter></paramdef>
</funcprototype>
<funcprototype>
<funcdef>int <function>sd_pid_get_owner_uid</function></funcdef>
<paramdef>pid_t <parameter>pid</parameter></paramdef>
......@@ -75,11 +82,23 @@
identifier. The session identifier is a short string,
suitable for usage in file system paths. Note that not
all processes are part of a login session (e.g. system
service processes and user processes that are shared
between multiple sessions of the same user). For
processes not being part of a login session this
function will fail. The returned string needs to be
freed with the libc
service processes, user processes that are shared
between multiple sessions of the same user, or kernel
threads). For processes not being part of a login
session this function will fail. The returned string
needs to be freed with the libc
<citerefentry><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry>
call after use.</para>
<para><function>sd_pid_get_service()</function> may be
used to determine the system service identifier of a
process identified by the specified process
identifier. The service name is a short string,
suitable for usage in file system paths. Note that not
all processes are part of a service (e.g. user
processes, or kernel threads). For processes not being
part of a system service this function will fail. The
returned string needs to be freed with the libc
<citerefentry><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry>
call after use.</para>
......@@ -106,10 +125,11 @@
<refsect1>
<title>Notes</title>
<para>The <function>sd_pid_get_session()</function>
and <function>sd_pid_get_owner_uid()</function>
interfaces are available as shared library, which can
be compiled and linked to with the
<para>The <function>sd_pid_get_session()</function>,
<function>sd_pid_get_service()</function>, and
<function>sd_pid_get_owner_uid()</function> interfaces
are available as shared library, which can be compiled
and linked to with the
<literal>libsystemd-login</literal>
<citerefentry><refentrytitle>pkg-config</refentrytitle><manvolnum>1</manvolnum></citerefentry>
file.</para>
......
......@@ -33,3 +33,8 @@ global:
local:
*;
};
LIBSYSTEMD_LOGIN_38 {
global:
sd_pid_get_service;
} LIBSYSTEMD_LOGIN_31;
......@@ -121,6 +121,33 @@ _public_ int sd_pid_get_session(pid_t pid, char **session) {
return 0;
}
_public_ int sd_pid_get_service(pid_t pid, char **service) {
int r;
char *cgroup, *p;
if (!service)
return -EINVAL;
r = pid_get_cgroup(pid, NULL, &cgroup);
if (r < 0)
return r;
if (!startswith(cgroup, "/system/")) {
free(cgroup);
return -ENOENT;
}
p = cgroup + 8;
p = strndup(p, strcspn(p, "/"));
free(cgroup);
if (!p)
return -ENOMEM;
*service = p;
return 0;
}
_public_ int sd_pid_get_owner_uid(pid_t pid, uid_t *uid) {
int r;
char *root, *cgroup, *p, *cc;
......
......@@ -53,6 +53,10 @@ int sd_pid_get_session(pid_t pid, char **session);
* return an error for system processes. */
int sd_pid_get_owner_uid(pid_t pid, uid_t *uid);
/* Get service name from PID. This will return an error for
* non-service processes. */
int sd_pid_get_service(pid_t, char **service);
/* Get state from uid. Possible states: offline, lingering, online, active */
int sd_uid_get_state(uid_t uid, char**state);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment