diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2022-08-15 13:05:21 +0200 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2022-08-16 14:49:00 +0200 |
commit | 50e23ac6671ea1eb00cde2a2bd1ee5ee69895f3b (patch) | |
tree | e71d119e026e7d9db31fa8b7fc97a9107f967f10 | |
parent | tpm-util: use trial session where appropriate (diff) | |
download | systemd-50e23ac6671ea1eb00cde2a2bd1ee5ee69895f3b.tar.xz systemd-50e23ac6671ea1eb00cde2a2bd1ee5ee69895f3b.zip |
daemon-util: introduce several helper functions for fd store
-rw-r--r-- | src/shared/daemon-util.c | 76 | ||||
-rw-r--r-- | src/shared/daemon-util.h | 6 | ||||
-rw-r--r-- | src/shared/meson.build | 1 |
3 files changed, 83 insertions, 0 deletions
diff --git a/src/shared/daemon-util.c b/src/shared/daemon-util.c new file mode 100644 index 0000000000..32180a14bb --- /dev/null +++ b/src/shared/daemon-util.c @@ -0,0 +1,76 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include "daemon-util.h" +#include "fd-util.h" +#include "log.h" +#include "string-util.h" + +static int notify_remove_fd_warn(const char *name) { + int r; + + assert(name); + + r = sd_notifyf(/* unset_environment = */ false, + "FDSTOREREMOVE=1\n" + "FDNAME=%s", name); + if (r < 0) + return log_warning_errno(r, + "Failed to remove file descriptor \"%s\" from the store, ignoring: %m", + name); + + return 0; +} + +int notify_remove_fd_warnf(const char *format, ...) { + _cleanup_free_ char *p = NULL; + va_list ap; + int r; + + assert(format); + + va_start(ap, format); + r = vasprintf(&p, format, ap); + va_end(ap); + if (r < 0) + return log_oom(); + + return notify_remove_fd_warn(p); +} + +int close_and_notify_warn(int fd, const char *name) { + if (name) + (void) notify_remove_fd_warn(name); + + return safe_close(fd); +} + +static int notify_push_fd(int fd, const char *name) { + _cleanup_free_ char *state = NULL; + + assert(fd >= 0); + assert(name); + + state = strjoin("FDSTORE=1\n" + "FDNAME=", name); + if (!state) + return -ENOMEM; + + return sd_pid_notify_with_fds(0, /* unset_environment = */ false, state, &fd, 1); +} + +int notify_push_fdf(int fd, const char *format, ...) { + _cleanup_free_ char *name = NULL; + va_list ap; + int r; + + assert(fd >= 0); + assert(format); + + va_start(ap, format); + r = vasprintf(&name, format, ap); + va_end(ap); + if (r < 0) + return -ENOMEM; + + return notify_push_fd(fd, name); +} diff --git a/src/shared/daemon-util.h b/src/shared/daemon-util.h index 585e4894a0..711885bba4 100644 --- a/src/shared/daemon-util.h +++ b/src/shared/daemon-util.h @@ -5,6 +5,8 @@ #include "sd-daemon.h" +#include "macro.h" + #define NOTIFY_READY "READY=1\n" "STATUS=Processing requests..." #define NOTIFY_STOPPING "STOPPING=1\n" "STATUS=Shutting down..." @@ -20,3 +22,7 @@ static inline void notify_on_cleanup(const char **p) { if (*p) (void) sd_notify(false, *p); } + +int notify_remove_fd_warnf(const char *format, ...) _printf_(1, 2); +int close_and_notify_warn(int fd, const char *name); +int notify_push_fdf(int fd, const char *format, ...) _printf_(2, 3); diff --git a/src/shared/meson.build b/src/shared/meson.build index 598a64593b..426a87b70c 100644 --- a/src/shared/meson.build +++ b/src/shared/meson.build @@ -85,6 +85,7 @@ shared_sources = files( 'creds-util.h', 'cryptsetup-util.c', 'cryptsetup-util.h', + 'daemon-util.c', 'daemon-util.h', 'data-fd-util.c', 'data-fd-util.h', |