login: introduce sd_pid_get_service()

This commit is contained in:
Lennart Poettering 2012-01-03 20:51:38 +01:00
parent b72491a2fd
commit 9847946e12
5 changed files with 71 additions and 13 deletions

View File

@ -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

View File

@ -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>

View File

@ -33,3 +33,8 @@ global:
local:
*;
};
LIBSYSTEMD_LOGIN_38 {
global:
sd_pid_get_service;
} LIBSYSTEMD_LOGIN_31;

View File

@ -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;

View File

@ -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);