mirror of
https://github.com/systemd/systemd.git
synced 2025-08-25 13:49:55 +03:00
pid1: pass pidfdids to invoked services in $MAINPIDFDID and $MANAGERPIDFDID
This commit is contained in:
@ -3886,22 +3886,40 @@ StandardInputData=V2XigLJyZSBubyBzdHJhbmdlcnMgdG8gbG92ZQpZb3Uga25vdyB0aGUgcnVsZX
|
|||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>$MAINPID</varname></term>
|
<term><varname>$MAINPID</varname></term>
|
||||||
|
|
||||||
<listitem><para>The PID of the unit's main process if it is
|
<listitem><para>The UNIX process ID (PID) of the unit's main process if it is known. This is only
|
||||||
known. This is only set for control processes as invoked by
|
set for control processes as invoked by <varname>ExecReload=</varname> and similar.</para>
|
||||||
<varname>ExecReload=</varname> and similar.</para>
|
|
||||||
|
|
||||||
<xi:include href="version-info.xml" xpointer="v209"/></listitem>
|
<xi:include href="version-info.xml" xpointer="v209"/></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>$MAINPIDFDID</varname></term>
|
||||||
|
|
||||||
|
<listitem><para>The 64bit inode ID of the file descriptor returned by <citerefentry
|
||||||
|
project='man-pages'><refentrytitle>pidfd_open</refentrytitle><manvolnum>3</manvolnum></citerefentry>
|
||||||
|
for the main process (if supported). This is only set for control processes as invoked by
|
||||||
|
<varname>ExecReload=</varname> and similar.</para>
|
||||||
|
|
||||||
|
<xi:include href="version-info.xml" xpointer="v258"/></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>$MANAGERPID</varname></term>
|
<term><varname>$MANAGERPID</varname></term>
|
||||||
|
|
||||||
<listitem><para>The PID of the user <command>systemd</command>
|
<listitem><para>The PID of the per-user <command>systemd</command> service manager instance, set
|
||||||
instance, set for processes spawned by it.</para>
|
for processes spawned by it.</para>
|
||||||
|
|
||||||
<xi:include href="version-info.xml" xpointer="v208"/></listitem>
|
<xi:include href="version-info.xml" xpointer="v208"/></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>$MANAGERPIDFDID</varname></term>
|
||||||
|
|
||||||
|
<listitem><para>The <function>pidfd_open()</function> inode ID (see above) of the per-user
|
||||||
|
<command>systemd</command> service manager instance, set for processes spawned by it.</para>
|
||||||
|
|
||||||
|
<xi:include href="version-info.xml" xpointer="v258"/></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>$LISTEN_FDS</varname></term>
|
<term><varname>$LISTEN_FDS</varname></term>
|
||||||
<term><varname>$LISTEN_PID</varname></term>
|
<term><varname>$LISTEN_PID</varname></term>
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
#include "open-file.h"
|
#include "open-file.h"
|
||||||
#include "parse-util.h"
|
#include "parse-util.h"
|
||||||
#include "path-util.h"
|
#include "path-util.h"
|
||||||
|
#include "pidfd-util.h"
|
||||||
#include "process-util.h"
|
#include "process-util.h"
|
||||||
#include "random-util.h"
|
#include "random-util.h"
|
||||||
#include "selinux-util.h"
|
#include "selinux-util.h"
|
||||||
@ -1769,7 +1770,7 @@ static int service_spawn_internal(
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
our_env = new0(char*, 13);
|
our_env = new0(char*, 15);
|
||||||
if (!our_env)
|
if (!our_env)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
@ -1781,14 +1782,25 @@ static int service_spawn_internal(
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pidref_is_set(&s->main_pid))
|
if (pidref_is_set(&s->main_pid)) {
|
||||||
if (asprintf(our_env + n_env++, "MAINPID="PID_FMT, s->main_pid.pid) < 0)
|
if (asprintf(our_env + n_env++, "MAINPID="PID_FMT, s->main_pid.pid) < 0)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
if (MANAGER_IS_USER(UNIT(s)->manager))
|
if (pidref_acquire_pidfd_id(&s->main_pid) >= 0)
|
||||||
|
if (asprintf(our_env + n_env++, "MAINPIDFDID=%" PRIu64, s->main_pid.fd_id) < 0)
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MANAGER_IS_USER(UNIT(s)->manager)) {
|
||||||
if (asprintf(our_env + n_env++, "MANAGERPID="PID_FMT, getpid_cached()) < 0)
|
if (asprintf(our_env + n_env++, "MANAGERPID="PID_FMT, getpid_cached()) < 0)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
uint64_t pidfdid;
|
||||||
|
if (pidfd_get_inode_id_self_cached(&pidfdid) >= 0)
|
||||||
|
if (asprintf(our_env + n_env++, "MANAGERPIDFDID=%" PRIu64, pidfdid) < 0)
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
if (s->pid_file)
|
if (s->pid_file)
|
||||||
if (asprintf(our_env + n_env++, "PIDFILE=%s", s->pid_file) < 0)
|
if (asprintf(our_env + n_env++, "PIDFILE=%s", s->pid_file) < 0)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
Reference in New Issue
Block a user