]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core/socket: add PassPIDFD=
authorMike Yuan <me@yhndnzj.com>
Tue, 10 Jun 2025 09:27:44 +0000 (11:27 +0200)
committerMike Yuan <me@yhndnzj.com>
Tue, 17 Jun 2025 11:16:41 +0000 (13:16 +0200)
TODO
man/org.freedesktop.systemd1.xml
man/systemd.socket.xml
src/core/dbus-socket.c
src/core/load-fragment-gperf.gperf.in
src/core/socket.c
src/core/socket.h
src/shared/bus-unit-util.c

diff --git a/TODO b/TODO
index 252d25afd6a26e72a75d209761b628bdb1cfb968..4f77391f62d953efbe71b4ddaf8af00406df5ef9 100644 (file)
--- a/TODO
+++ b/TODO
@@ -128,9 +128,6 @@ Features:
   also raises the question whether such sessions shall be considered active or
   not
 
-* Add PassPidFileDescriptor= similar in style to PassCredentials= to .socket
-  units
-
 * automatically reset specific EFI vars on factory reset (make this generic
   enough so that infrac can be used to erase shim's mok vars?)
 
index fd7bbab513ce3837558354c21b856d68584987aa..814400ad43e8e76181ab59a48af3138fc97dc824 100644 (file)
@@ -4907,6 +4907,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket {
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly b PassCredentials = ...;
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+      readonly b PassPIDFD = ...;
+      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly b PassSecurity = ...;
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly b PassPacketInfo = ...;
@@ -5576,6 +5578,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket {
 
     <!--property PassCredentials is not documented!-->
 
+    <!--property PassPIDFD is not documented!-->
+
     <!--property PassSecurity is not documented!-->
 
     <!--property PassPacketInfo is not documented!-->
@@ -6178,6 +6182,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket {
 
     <variablelist class="dbus-property" generated="True" extra-ref="PassCredentials"/>
 
+    <variablelist class="dbus-property" generated="True" extra-ref="PassPIDFD"/>
+
     <variablelist class="dbus-property" generated="True" extra-ref="PassSecurity"/>
 
     <variablelist class="dbus-property" generated="True" extra-ref="PassPacketInfo"/>
@@ -12092,6 +12098,7 @@ $ gdbus introspect --system --dest org.freedesktop.systemd1 \
       <varname>ProtectControlGroupsEx</varname>, and
       <varname>PrivatePIDs</varname> were added in version 257.</para>
       <para><varname>ProtectHostnameEx</varname>,
+      <varname>PassPIDFD</varname>,
       <varname>DelegateNamespaces</varname>, and
       <function>RemoveSubgroup()</function> were added in version 258.</para>
     </refsect2>
index b2779e84a2f68d96258f52a04942a3bcfacdf80d..b43f8e685bfaa8a7a7b78848d9eb7181328c54d6 100644 (file)
         process in an ancillary message. Defaults to <option>false</option>.</para></listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>PassPIDFD=</varname></term>
+
+        <listitem><para>Takes a boolean value. This controls the <constant>SO_PASSPIDFD</constant> socket
+        option, which allows <constant>AF_UNIX</constant> sockets to receive the pidfd of the sending
+        process in an ancillary message. Defaults to <option>false</option>.</para>
+
+        <xi:include href="version-info.xml" xpointer="v258"/></listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><varname>PassSecurity=</varname></term>
         <listitem><para>Takes a boolean value. This controls the <constant>SO_PASSSEC</constant> socket
index aeb6ae5fe11dedb9ff1758daca3d0208d9085084..b07b3c93c539935203f0f9524840c3e9fc2e517d 100644 (file)
@@ -86,6 +86,7 @@ const sd_bus_vtable bus_socket_vtable[] = {
         SD_BUS_PROPERTY("Transparent", "b", bus_property_get_bool, offsetof(Socket, transparent), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("Broadcast", "b", bus_property_get_bool, offsetof(Socket, broadcast), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("PassCredentials", "b", bus_property_get_bool, offsetof(Socket, pass_cred), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("PassPIDFD", "b", bus_property_get_bool, offsetof(Socket, pass_pidfd), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("PassSecurity", "b", bus_property_get_bool, offsetof(Socket, pass_sec), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("PassPacketInfo", "b", bus_property_get_bool, offsetof(Socket, pass_pktinfo), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("Timestamping", "s", property_get_timestamping, offsetof(Socket, timestamping), SD_BUS_VTABLE_PROPERTY_CONST),
@@ -191,6 +192,9 @@ static int bus_socket_set_transient_property(
         if (streq(name, "PassCredentials"))
                 return bus_set_transient_bool(u, name, &s->pass_cred, message, flags, error);
 
+        if (streq(name, "PassPIDFD"))
+                return bus_set_transient_bool(u, name, &s->pass_pidfd, message, flags, error);
+
         if (streq(name, "PassSecurity"))
                 return bus_set_transient_bool(u, name, &s->pass_sec, message, flags, error);
 
index 2330bc0f4cf89c1721692f73d033e7b74bc414b2..e3c23337319b5cbcf21c133f1e22953df6658cb4 100644 (file)
@@ -510,6 +510,7 @@ Socket.FreeBind,                              config_parse_bool,
 Socket.Transparent,                           config_parse_bool,                                  0,                                  offsetof(Socket, transparent)
 Socket.Broadcast,                             config_parse_bool,                                  0,                                  offsetof(Socket, broadcast)
 Socket.PassCredentials,                       config_parse_bool,                                  0,                                  offsetof(Socket, pass_cred)
+Socket.PassPIDFD,                             config_parse_bool,                                  0,                                  offsetof(Socket, pass_pidfd)
 Socket.PassSecurity,                          config_parse_bool,                                  0,                                  offsetof(Socket, pass_sec)
 Socket.PassPacketInfo,                        config_parse_bool,                                  0,                                  offsetof(Socket, pass_pktinfo)
 Socket.Timestamping,                          config_parse_socket_timestamping,                   0,                                  offsetof(Socket, timestamping)
index 0b7228a86cdea45201a1c169a513292492de913f..6d69d6cb4254279603cc76f063994727cdd53ec1 100644 (file)
@@ -610,6 +610,7 @@ static void socket_dump(Unit *u, FILE *f, const char *prefix) {
                 "%sTransparent: %s\n"
                 "%sBroadcast: %s\n"
                 "%sPassCredentials: %s\n"
+                "%sPassPIDFD: %s\n"
                 "%sPassSecurity: %s\n"
                 "%sPassPacketInfo: %s\n"
                 "%sTCPCongestion: %s\n"
@@ -631,6 +632,7 @@ static void socket_dump(Unit *u, FILE *f, const char *prefix) {
                 prefix, yes_no(s->transparent),
                 prefix, yes_no(s->broadcast),
                 prefix, yes_no(s->pass_cred),
+                prefix, yes_no(s->pass_pidfd),
                 prefix, yes_no(s->pass_sec),
                 prefix, yes_no(s->pass_pktinfo),
                 prefix, strna(s->tcp_congestion),
@@ -1076,6 +1078,13 @@ static void socket_apply_socket_options(Socket *s, SocketPort *p, int fd) {
                         log_socket_option_warning_errno(s, r, SO_PASSCRED);
         }
 
+        if (s->pass_pidfd) {
+                r = setsockopt_int(fd, SOL_SOCKET, SO_PASSPIDFD, true);
+                if (r < 0)
+                        log_unit_full_errno(UNIT(s), ERRNO_IS_NEG_NOT_SUPPORTED(r) ? LOG_DEBUG : LOG_WARNING, r,
+                                            SOCKET_OPTION_WARNING_FORMAT_STR, "SO_PASSPIDFD");
+        }
+
         if (s->pass_sec) {
                 r = setsockopt_int(fd, SOL_SOCKET, SO_PASSSEC, true);
                 if (r < 0)
index f85448c484067ceb9ea15ad67a1a6ee504a76bd8..99fcc0cbe659788f22ccfbf964f2262813c2e551 100644 (file)
@@ -131,6 +131,7 @@ typedef struct Socket {
         bool transparent;
         bool broadcast;
         bool pass_cred;
+        bool pass_pidfd;
         bool pass_sec;
         bool pass_pktinfo;
         SocketTimestamping timestamping;
index d18a9088d4d45759acd7395f84c7b784b6091650..aebeaa15ced1b53c5d8bef2976dcf75c3ab40f3d 100644 (file)
@@ -2583,6 +2583,7 @@ static int bus_append_socket_property(sd_bus_message *m, const char *field, cons
                               "Transparent",
                               "Broadcast",
                               "PassCredentials",
+                              "PassPIDFD",
                               "PassSecurity",
                               "PassPacketInfo",
                               "ReusePort",