| /* 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); |
| } |