From 50e23ac6671ea1eb00cde2a2bd1ee5ee69895f3b Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 15 Aug 2022 20:05:21 +0900 Subject: [PATCH] daemon-util: introduce several helper functions for fd store --- src/shared/daemon-util.c | 76 ++++++++++++++++++++++++++++++++++++++++ src/shared/daemon-util.h | 6 ++++ src/shared/meson.build | 1 + 3 files changed, 83 insertions(+) create mode 100644 src/shared/daemon-util.c diff --git a/src/shared/daemon-util.c b/src/shared/daemon-util.c new file mode 100644 index 00000000000..32180a14bb4 --- /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 585e4894a01..711885bba46 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 598a64593b5..426a87b70cf 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',