]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-daemon: add sd_pid_notify_barrier() call and use it in systemd-notify
authorLennart Poettering <lennart@poettering.net>
Wed, 3 May 2023 12:13:58 +0000 (14:13 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 3 May 2023 16:21:42 +0000 (18:21 +0200)
Previously we'd honour --pid= from the main notification we send, but
not from the barrier. This is confusing at best. Let's fix that.

man/sd_notify.xml
src/libsystemd/libsystemd.sym
src/libsystemd/sd-daemon/sd-daemon.c
src/notify/notify.c
src/systemd/sd-daemon.h

index b82d145860abbe23fd6667f54c180203a8aa437d..89f1729b13f0d835f7783a7d789cbc81c1f1691e 100644 (file)
@@ -24,6 +24,7 @@
     <refname>sd_pid_notify_with_fds</refname>
     <refname>sd_pid_notifyf_with_fds</refname>
     <refname>sd_notify_barrier</refname>
+    <refname>sd_pid_notify_barrier</refname>
     <refpurpose>Notify service manager about start-up completion and other service status changes</refpurpose>
   </refnamediv>
 
         <paramdef>int <parameter>unset_environment</parameter></paramdef>
         <paramdef>uint64_t <parameter>timeout</parameter></paramdef>
       </funcprototype>
+
+      <funcprototype>
+        <funcdef>int <function>sd_pid_notify_barrier</function></funcdef>
+        <paramdef>pid_t <parameter>pid</parameter></paramdef>
+        <paramdef>int <parameter>unset_environment</parameter></paramdef>
+        <paramdef>uint64_t <parameter>timeout</parameter></paramdef>
+      </funcprototype>
     </funcsynopsis>
   </refsynopsisdiv>
 
     previously sent notification messages and uses the <varname>BARRIER=1</varname> command. It takes a
     relative <varname>timeout</varname> value in microseconds which is passed to
     <citerefentry><refentrytitle>ppoll</refentrytitle><manvolnum>2</manvolnum>
-    </citerefentry>. A value of UINT64_MAX is interpreted as infinite timeout.
-    </para>
+    </citerefentry>. A value of UINT64_MAX is interpreted as infinite timeout.</para>
+
+    <para><function>sd_pid_notify_barrier()</function> is just like <function>sd_notify_barrier()</function>,
+    but allows specifying the originating PID for the notification message.</para>
   </refsect1>
 
   <refsect1>
index 75c8f2225b0b34b83e49d4a4dd262dee6574bb5e..8b99d0a7aabae76b90994c1f74ecfd81833287d6 100644 (file)
@@ -823,4 +823,5 @@ global:
         sd_event_source_set_memory_pressure_type;
         sd_event_source_set_memory_pressure_period;
         sd_event_trim_memory;
+        sd_pid_notify_barrier;
 } LIBSYSTEMD_253;
index 34525b0a7b73ae7a054661c1c67748732510765b..8538b7ab82d9ffb189008e37456f1e5f67495cb3 100644 (file)
@@ -601,14 +601,14 @@ finish:
         return r;
 }
 
-_public_ int sd_notify_barrier(int unset_environment, uint64_t timeout) {
+_public_ int sd_pid_notify_barrier(pid_t pid, int unset_environment, uint64_t timeout) {
         _cleanup_close_pair_ int pipe_fd[2] = PIPE_EBADF;
         int r;
 
         if (pipe2(pipe_fd, O_CLOEXEC) < 0)
                 return -errno;
 
-        r = sd_pid_notify_with_fds(0, unset_environment, "BARRIER=1", &pipe_fd[1], 1);
+        r = sd_pid_notify_with_fds(pid, unset_environment, "BARRIER=1", &pipe_fd[1], 1);
         if (r <= 0)
                 return r;
 
@@ -623,6 +623,10 @@ _public_ int sd_notify_barrier(int unset_environment, uint64_t timeout) {
         return 1;
 }
 
+_public_ int sd_notify_barrier(int unset_environment, uint64_t timeout) {
+        return sd_pid_notify_barrier(0, unset_environment, timeout);
+}
+
 _public_ int sd_pid_notify(pid_t pid, int unset_environment, const char *state) {
         return sd_pid_notify_with_fds(pid, unset_environment, state, NULL, 0);
 }
index 21e004e4171a10ad77076a60686d4dd433eb8f2d..8a551a9399cf2c4a2f1b54c1005385f19e1e8322 100644 (file)
@@ -447,7 +447,7 @@ static int run(int argc, char* argv[]) {
         arg_fds = fdset_free(arg_fds); /* Close before we execute anything */
 
         if (!arg_no_block) {
-                r = sd_notify_barrier(0, 5 * USEC_PER_SEC);
+                r = sd_pid_notify_barrier(source_pid, /* unset_environment= */ false, 5 * USEC_PER_SEC);
                 if (r < 0)
                         return log_error_errno(r, "Failed to invoke barrier: %m");
                 if (r == 0)
index a8b40ff1f8c2c23f431d5868f25df69238713147..2d095f72df4cf269c27597423f64c91849776bcd 100644 (file)
@@ -308,6 +308,11 @@ int sd_pid_notifyf_with_fds(pid_t pid, int unset_environment, const int *fds, si
 */
 int sd_notify_barrier(int unset_environment, uint64_t timeout);
 
+/*
+  Just like sd_notify_barrier() but also takes a PID to send the barrier message from.
+*/
+int sd_pid_notify_barrier(pid_t pid, int unset_environment, uint64_t timeout);
+
 /*
   Returns > 0 if the system was booted with systemd. Returns < 0 on
   error. Returns 0 if the system was not booted with systemd. Note