chiark / gitweb /
login: introduce sd_pid_get_service()
authorLennart Poettering <lennart@poettering.net>
Tue, 3 Jan 2012 19:51:38 +0000 (20:51 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 3 Jan 2012 20:08:58 +0000 (21:08 +0100)
Makefile.am
man/sd_pid_get_session.xml
src/login/libsystemd-login.sym
src/login/sd-login.c
src/login/sd-login.h

index 225c6fc363fb8cd7fb7a354124a827a057c81ae1..651b37df0c0fb0c4dd798f8db74a97e2f4f33997 100644 (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
index 24e468015f42769324aade5e427ae1c2634e3462..4086c5a826e270c0a028dc0c4037a3b4b7fd2d84 100644 (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>
                                 <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>
                 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>
 
         <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>
index 0d51fa76e76189a9335c79d56a3a7fa48c52f057..bac46f4064c9f87086f39134d223da3f7f9e6d23 100644 (file)
@@ -33,3 +33,8 @@ global:
 local:
         *;
 };
+
+LIBSYSTEMD_LOGIN_38 {
+global:
+        sd_pid_get_service;
+} LIBSYSTEMD_LOGIN_31;
index a0a56c49526ebdf2fb85a83137418b2e8c77d679..1d4368187f5f430de16a692f69279714aeccef84 100644 (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;
index 0cb0bf06bbee4c12ea8bc633da80e2eaeca1bc97..1d8a55e906e6f2fa902a4765ff6ad5d908ce1961 100644 (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);