In order to allow FD Stores of user units to survive a user
session restart, propagate FDs received via the protocol up one
level from user to system manager via sd_notify.
And the other way around, propagate them down via LISTEN_FDS
tagging them with the unit name so that the child manager can
inject them in the appropriate unit.
Ensure units that are dead or not loaded can get FDs added to
their stores, and that they are correctly propagated once the
unit is started or loaded. When the unit is not loaded we don't
know what the FD max limit is, so simply increase it for each FD
injected, and then when the unit is realised prune it down to
match the unit's now available config in case the limit is lower
than the number of FDs in the store.
Each FD sent up or down is assigned a monotonic index, and the manager
also sends a JSON map that associates the index with the original
unit and FDNAME:
{
"unit-name.service": [
{ "name": "fdname1", "index": 1 },
{ "name": "fdname2", "index": 2 }
],
...
}
This allows the manager to assign back the FDs to the appropriate
unit using the appropriate name, given the FDNAMEs are not unique.
36 lines
1.1 KiB
C
36 lines
1.1 KiB
C
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
#pragma once
|
|
|
|
#include "sd-daemon.h" /* IWYU pragma: export */
|
|
|
|
#include "shared-forward.h"
|
|
|
|
#define NOTIFY_READY_MESSAGE "READY=1\n" "STATUS=Processing requests..."
|
|
#define NOTIFY_STOPPING_MESSAGE "STOPPING=1\n" "STATUS=Shutting down..."
|
|
|
|
static inline const char* notify_start(const char *start, const char *stop) {
|
|
if (start)
|
|
(void) sd_notify(false, start);
|
|
|
|
return stop;
|
|
}
|
|
|
|
/* This is intended to be used with _cleanup_ attribute. */
|
|
static inline void notify_on_cleanup(const char **p) {
|
|
if (*p)
|
|
(void) sd_notify(false, *p);
|
|
}
|
|
|
|
int notify_remove_fd_warn(const char *name);
|
|
int notify_remove_fd_warnf(const char *format, ...) _printf_(1, 2);
|
|
int close_and_notify_warn(int fd, const char *name);
|
|
int notify_push_fd(int fd, const char *name);
|
|
int notify_push_fdf(int fd, const char *format, ...) _printf_(2, 3);
|
|
|
|
bool fdstore_detected(void);
|
|
|
|
int notify_reloading_full(const char *status);
|
|
static inline int notify_reloading(void) {
|
|
return notify_reloading_full("Reloading configuration...");
|
|
}
|