summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2023-05-03 14:13:58 +0200
committerLennart Poettering <lennart@poettering.net>2023-05-03 18:21:42 +0200
commit0de343187127f6a5a93602608812e60fc4092c9a (patch)
treeaf1d8c130a51efa6b0009d0ee47d3813eb97369d
parentca71b1d9669ee572ed122c627bf58a7b12ea7677 (diff)
downloadsystemd-0de343187127f6a5a93602608812e60fc4092c9a.tar.gz
sd-daemon: add sd_pid_notify_barrier() call and use it in systemd-notify
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.
-rw-r--r--man/sd_notify.xml14
-rw-r--r--src/libsystemd/libsystemd.sym1
-rw-r--r--src/libsystemd/sd-daemon/sd-daemon.c8
-rw-r--r--src/notify/notify.c2
-rw-r--r--src/systemd/sd-daemon.h5
5 files changed, 25 insertions, 5 deletions
diff --git a/man/sd_notify.xml b/man/sd_notify.xml
index b82d145860..89f1729b13 100644
--- a/man/sd_notify.xml
+++ b/man/sd_notify.xml
@@ -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>
@@ -83,6 +84,13 @@
<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>
@@ -372,8 +380,10 @@
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>
diff --git a/src/libsystemd/libsystemd.sym b/src/libsystemd/libsystemd.sym
index 75c8f2225b..8b99d0a7aa 100644
--- a/src/libsystemd/libsystemd.sym
+++ b/src/libsystemd/libsystemd.sym
@@ -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;
diff --git a/src/libsystemd/sd-daemon/sd-daemon.c b/src/libsystemd/sd-daemon/sd-daemon.c
index 34525b0a7b..8538b7ab82 100644
--- a/src/libsystemd/sd-daemon/sd-daemon.c
+++ b/src/libsystemd/sd-daemon/sd-daemon.c
@@ -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);
}
diff --git a/src/notify/notify.c b/src/notify/notify.c
index 21e004e417..8a551a9399 100644
--- a/src/notify/notify.c
+++ b/src/notify/notify.c
@@ -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)
diff --git a/src/systemd/sd-daemon.h b/src/systemd/sd-daemon.h
index a8b40ff1f8..2d095f72df 100644
--- a/src/systemd/sd-daemon.h
+++ b/src/systemd/sd-daemon.h
@@ -309,6 +309,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
that all of the functions above handle non-systemd boots just