From 4ea4abb6518638087ed8beb0e1a2486d97b4fd18 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Fri, 18 Apr 2025 20:53:51 +0200 Subject: [PATCH] core: Remove circular dependencies between headers Currently there are various circular dependencies between headers in core/. Let's get rid of these by making judicious use of forward declarations and moving includes into implementation files instead of having them in header files. Getting rid of circular header includes simplifies the code and makes various clang based tooling such as iwyu work much better on our code. The most important change is getting rid of the manager.h include in unit.h which is possible thanks to the previous commits. We also move the OOMPolicy and StatusType enums to unit.h to remove the need for other unit headers to include manager.h to get access to these enums. --- src/core/all-units.h | 1 + src/core/automount.c | 1 + src/core/automount.h | 6 ++-- src/core/bpf-firewall.c | 1 + src/core/bpf-restrict-ifaces.c | 1 + src/core/bpf-restrict-ifaces.h | 1 - src/core/bpf-socket-bind.c | 1 + src/core/bpf-socket-bind.h | 3 +- src/core/cgroup.c | 1 + src/core/core-varlink.c | 3 ++ src/core/core-varlink.h | 3 +- src/core/dbus-cgroup.c | 1 + src/core/dbus-execute.h | 1 + src/core/dbus-job.h | 3 +- src/core/dbus-manager.c | 1 + src/core/dbus-manager.h | 4 ++- src/core/dbus-scope.h | 3 +- src/core/dbus-util.c | 1 + src/core/dbus.h | 4 ++- src/core/device.c | 1 + src/core/device.h | 6 ++-- src/core/dynamic-user.c | 1 + src/core/dynamic-user.h | 10 +++++-- src/core/emergency-action.c | 1 + src/core/emergency-action.h | 6 ++-- src/core/exec-invoke.c | 4 +++ src/core/execute-serialize.c | 2 ++ src/core/execute.c | 1 + src/core/execute.h | 25 ++++++++-------- src/core/executor.c | 2 ++ src/core/fuzz-execute-serialize.c | 1 + src/core/fuzz-unit-file.c | 1 + src/core/job.c | 1 + src/core/job.h | 2 ++ src/core/kill.h | 6 ++-- src/core/load-dropin.c | 13 +++++++++ src/core/load-dropin.h | 16 +++-------- src/core/load-fragment.h | 3 +- src/core/manager-dump.c | 1 + src/core/manager-dump.h | 2 +- src/core/manager-serialize.c | 1 + src/core/manager-serialize.h | 4 ++- src/core/manager.c | 9 +----- src/core/manager.h | 36 ++++++----------------- src/core/mount.h | 7 ++--- src/core/path.c | 1 + src/core/path.h | 12 +++----- src/core/scope.c | 1 + src/core/scope.h | 6 ++-- src/core/service.h | 17 ++++++----- src/core/slice.c | 1 + src/core/slice.h | 6 ++-- src/core/socket.c | 1 + src/core/socket.h | 7 ++--- src/core/swap.c | 1 + src/core/swap.h | 6 ++-- src/core/target.h | 6 ++-- src/core/timer.c | 1 + src/core/timer.h | 11 +++---- src/core/transaction.c | 1 + src/core/transaction.h | 9 ++---- src/core/unit-printf.c | 1 + src/core/unit-serialize.c | 1 + src/core/unit-serialize.h | 4 ++- src/core/unit.c | 9 ++++++ src/core/unit.h | 48 +++++++++++++++++++++---------- 66 files changed, 194 insertions(+), 158 deletions(-) diff --git a/src/core/all-units.h b/src/core/all-units.h index fad814bf20..cb2563d2c8 100644 --- a/src/core/all-units.h +++ b/src/core/all-units.h @@ -5,6 +5,7 @@ #include "automount.h" #include "device.h" +#include "mount.h" #include "path.h" #include "scope.h" #include "service.h" diff --git a/src/core/automount.c b/src/core/automount.c index b4611981f2..ef5db87a7e 100644 --- a/src/core/automount.c +++ b/src/core/automount.c @@ -22,6 +22,7 @@ #include "io-util.h" #include "label-util.h" #include "mkdir-label.h" +#include "manager.h" #include "mount-util.h" #include "mount.h" #include "mountpoint-util.h" diff --git a/src/core/automount.h b/src/core/automount.h index e413f237ca..6f2ca7657b 100644 --- a/src/core/automount.h +++ b/src/core/automount.h @@ -1,8 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -typedef struct Automount Automount; - #include "unit.h" typedef enum AutomountResult { @@ -15,7 +13,7 @@ typedef enum AutomountResult { _AUTOMOUNT_RESULT_INVALID = -EINVAL, } AutomountResult; -struct Automount { +typedef struct Automount { Unit meta; AutomountState state, deserialized_state; @@ -35,7 +33,7 @@ struct Automount { sd_event_source *expire_event_source; AutomountResult result; -}; +} Automount; extern const UnitVTable automount_vtable; diff --git a/src/core/bpf-firewall.c b/src/core/bpf-firewall.c index 69000c1389..85fce6f32a 100644 --- a/src/core/bpf-firewall.c +++ b/src/core/bpf-firewall.c @@ -20,6 +20,7 @@ #include "bpf-program.h" #include "fd-util.h" #include "in-addr-prefix-util.h" +#include "manager.h" #include "memory-util.h" #include "missing_syscall.h" #include "unit.h" diff --git a/src/core/bpf-restrict-ifaces.c b/src/core/bpf-restrict-ifaces.c index af49abd677..a9066ee2a9 100644 --- a/src/core/bpf-restrict-ifaces.c +++ b/src/core/bpf-restrict-ifaces.c @@ -3,6 +3,7 @@ #include "fd-util.h" #include "bpf-restrict-ifaces.h" #include "netlink-util.h" +#include "unit.h" #if BPF_FRAMEWORK /* libbpf, clang and llc compile time dependencies are satisfied */ diff --git a/src/core/bpf-restrict-ifaces.h b/src/core/bpf-restrict-ifaces.h index 28f74279f5..80af1f3e5b 100644 --- a/src/core/bpf-restrict-ifaces.h +++ b/src/core/bpf-restrict-ifaces.h @@ -2,7 +2,6 @@ #pragma once #include "fdset.h" -#include "unit.h" typedef struct Unit Unit; diff --git a/src/core/bpf-socket-bind.c b/src/core/bpf-socket-bind.c index 8853f3eecc..437b084392 100644 --- a/src/core/bpf-socket-bind.c +++ b/src/core/bpf-socket-bind.c @@ -6,6 +6,7 @@ #include "fd-util.h" #include "bpf-socket-bind.h" +#include "unit.h" #if BPF_FRAMEWORK /* libbpf, clang, llvm and bpftool compile time dependencies are satisfied */ diff --git a/src/core/bpf-socket-bind.h b/src/core/bpf-socket-bind.h index 28b25f6872..13a0fc1521 100644 --- a/src/core/bpf-socket-bind.h +++ b/src/core/bpf-socket-bind.h @@ -2,7 +2,8 @@ #pragma once #include "fdset.h" -#include "unit.h" + +typedef struct Unit Unit; int bpf_socket_bind_supported(void); diff --git a/src/core/cgroup.c b/src/core/cgroup.c index 7e4f7efa5e..27d81b0b85 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -27,6 +27,7 @@ #include "io-util.h" #include "ip-protocol-list.h" #include "limits-util.h" +#include "manager.h" #include "nulstr-util.h" #include "parse-util.h" #include "path-util.h" diff --git a/src/core/core-varlink.c b/src/core/core-varlink.c index c5735d0eaa..0dee43c01b 100644 --- a/src/core/core-varlink.c +++ b/src/core/core-varlink.c @@ -3,9 +3,12 @@ #include "sd-varlink.h" #include "core-varlink.h" +#include "dynamic-user.h" #include "json-util.h" +#include "manager.h" #include "mkdir-label.h" #include "strv.h" +#include "unit.h" #include "user-util.h" #include "varlink-internal.h" #include "varlink-io.systemd.UserDatabase.h" diff --git a/src/core/core-varlink.h b/src/core/core-varlink.h index 4b77620028..e4996f01ad 100644 --- a/src/core/core-varlink.h +++ b/src/core/core-varlink.h @@ -1,7 +1,8 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -#include "manager.h" +typedef struct Manager Manager; +typedef struct Unit Unit; int manager_setup_varlink_server(Manager *m); diff --git a/src/core/dbus-cgroup.c b/src/core/dbus-cgroup.c index 882c916c10..09692a93ec 100644 --- a/src/core/dbus-cgroup.c +++ b/src/core/dbus-cgroup.c @@ -22,6 +22,7 @@ #include "in-addr-prefix-util.h" #include "ip-protocol-list.h" #include "limits-util.h" +#include "manager.h" #include "memstream-util.h" #include "parse-util.h" #include "path-util.h" diff --git a/src/core/dbus-execute.h b/src/core/dbus-execute.h index 4b7cb86d3e..4ad7dd27a9 100644 --- a/src/core/dbus-execute.h +++ b/src/core/dbus-execute.h @@ -5,6 +5,7 @@ #include "sd-bus-vtable.h" #include "execute.h" +#include "unit.h" #define BUS_EXEC_STATUS_VTABLE(prefix, offset, flags) \ BUS_PROPERTY_DUAL_TIMESTAMP(prefix "StartTimestamp", (offset) + offsetof(ExecStatus, start_timestamp), flags), \ diff --git a/src/core/dbus-job.h b/src/core/dbus-job.h index 6f005811cb..50957303de 100644 --- a/src/core/dbus-job.h +++ b/src/core/dbus-job.h @@ -3,9 +3,10 @@ #include "sd-bus.h" -#include "unit.h" #include "bus-object.h" +typedef struct Job Job; + extern const sd_bus_vtable bus_job_vtable[]; extern const BusObjectImplementation job_object; diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c index 6320e267a1..903f45d102 100644 --- a/src/core/dbus-manager.c +++ b/src/core/dbus-manager.c @@ -25,6 +25,7 @@ #include "dbus-unit.h" #include "dbus-util.h" #include "dbus.h" +#include "dynamic-user.h" #include "env-util.h" #include "fd-util.h" #include "fileio.h" diff --git a/src/core/dbus-manager.h b/src/core/dbus-manager.h index 9b050801a7..fcabca57c9 100644 --- a/src/core/dbus-manager.h +++ b/src/core/dbus-manager.h @@ -3,7 +3,9 @@ #include "sd-bus-vtable.h" -#include "manager.h" +#include "time-util.h" + +typedef struct Manager Manager; extern const sd_bus_vtable bus_manager_vtable[]; extern const sd_bus_vtable bus_manager_log_control_vtable[]; diff --git a/src/core/dbus-scope.h b/src/core/dbus-scope.h index 8f1bc02e31..fb7467a0f5 100644 --- a/src/core/dbus-scope.h +++ b/src/core/dbus-scope.h @@ -4,9 +4,10 @@ #include "sd-bus.h" #include "sd-bus-vtable.h" -#include "scope.h" #include "unit.h" +typedef struct Scope Scope; + extern const sd_bus_vtable bus_scope_vtable[]; int bus_scope_set_property(Unit *u, const char *name, sd_bus_message *i, UnitWriteFlags flags, sd_bus_error *error); diff --git a/src/core/dbus-util.c b/src/core/dbus-util.c index b44afc4258..e1a4cf0bdc 100644 --- a/src/core/dbus-util.c +++ b/src/core/dbus-util.c @@ -4,6 +4,7 @@ #include "bus-util.h" #include "dbus-util.h" #include "escape.h" +#include "manager.h" #include "parse-util.h" #include "path-util.h" #include "reboot-util.h" diff --git a/src/core/dbus.h b/src/core/dbus.h index bfd4c8ea4e..a362a652af 100644 --- a/src/core/dbus.h +++ b/src/core/dbus.h @@ -3,7 +3,9 @@ #include "sd-bus.h" -#include "manager.h" +#include "fdset.h" + +typedef struct Manager Manager; void bus_send_pending_reload_message(Manager *m); diff --git a/src/core/device.c b/src/core/device.c index b6cdee73d4..08235caa42 100644 --- a/src/core/device.c +++ b/src/core/device.c @@ -13,6 +13,7 @@ #include "device-util.h" #include "device.h" #include "log.h" +#include "manager.h" #include "parse-util.h" #include "path-util.h" #include "ratelimit.h" diff --git a/src/core/device.h b/src/core/device.h index 631f45d45e..6f42cfa93a 100644 --- a/src/core/device.h +++ b/src/core/device.h @@ -3,8 +3,6 @@ #include "unit.h" -typedef struct Device Device; - /* A mask specifying where we have seen the device currently. This is a bitmask because the device might show up * asynchronously from each other at various places. For example, in very common case a device might already be mounted * before udev finished probing it (think: a script setting up a loopback block device, formatting it and mounting it @@ -17,7 +15,7 @@ typedef enum DeviceFound { _DEVICE_FOUND_MASK = DEVICE_FOUND_UDEV|DEVICE_FOUND_MOUNT|DEVICE_FOUND_SWAP, } DeviceFound; -struct Device { +typedef struct Device { Unit meta; char *sysfs, *deserialized_sysfs; @@ -36,7 +34,7 @@ struct Device { /* The SYSTEMD_WANTS udev property for this device the last time we saw it */ char **wants_property; -}; +} Device; extern const UnitVTable device_vtable; diff --git a/src/core/dynamic-user.c b/src/core/dynamic-user.c index acfa1f52af..d21c709de7 100644 --- a/src/core/dynamic-user.c +++ b/src/core/dynamic-user.c @@ -12,6 +12,7 @@ #include "fs-util.h" #include "iovec-util.h" #include "lock-util.h" +#include "manager.h" #include "parse-util.h" #include "random-util.h" #include "serialize.h" diff --git a/src/core/dynamic-user.h b/src/core/dynamic-user.h index 303a7d081c..594595038d 100644 --- a/src/core/dynamic-user.h +++ b/src/core/dynamic-user.h @@ -1,7 +1,15 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once +#include +#include +#include + +#include "fdset.h" +#include "memory-util.h" + typedef struct DynamicUser DynamicUser; +typedef struct Manager Manager; typedef struct DynamicCreds { /* A combination of a dynamic user and group */ @@ -9,8 +17,6 @@ typedef struct DynamicCreds { DynamicUser *group; } DynamicCreds; -#include "manager.h" - /* Note that this object always allocates a pair of user and group under the same name, even if one of them isn't * used. This means, if you want to allocate a group and user pair, and they might have two different names, then you * need to allocated two of these objects. DynamicCreds below makes that easy. */ diff --git a/src/core/emergency-action.c b/src/core/emergency-action.c index 2d756b306c..6752926bd9 100644 --- a/src/core/emergency-action.c +++ b/src/core/emergency-action.c @@ -6,6 +6,7 @@ #include "bus-error.h" #include "bus-util.h" #include "emergency-action.h" +#include "manager.h" #include "raw-reboot.h" #include "reboot-util.h" #include "special.h" diff --git a/src/core/emergency-action.h b/src/core/emergency-action.h index 5f7b0b4bc9..d0f1898a60 100644 --- a/src/core/emergency-action.h +++ b/src/core/emergency-action.h @@ -3,8 +3,11 @@ #include +#include "macro.h" #include "runtime-scope.h" +typedef struct Manager Manager; + typedef enum EmergencyAction { EMERGENCY_ACTION_NONE, EMERGENCY_ACTION_EXIT, @@ -34,9 +37,6 @@ typedef enum EmergencyActionFlags { _EMERGENCY_ACTION_FLAGS_MAX = (1 << 3) - 1, } EmergencyActionFlags; -#include "macro.h" -#include "manager.h" - void emergency_action( Manager *m, EmergencyAction action, diff --git a/src/core/exec-invoke.c b/src/core/exec-invoke.c index f22aad76d2..fcbd62744b 100644 --- a/src/core/exec-invoke.c +++ b/src/core/exec-invoke.c @@ -24,11 +24,13 @@ #include "bpf-restrict-fs.h" #include "btrfs-util.h" #include "capability-util.h" +#include "cgroup.h" #include "cgroup-setup.h" #include "chase.h" #include "chattr-util.h" #include "chown-recursive.h" #include "copy.h" +#include "dynamic-user.h" #include "env-util.h" #include "escape.h" #include "exec-credential.h" @@ -43,10 +45,12 @@ #include "ioprio-util.h" #include "iovec-util.h" #include "journal-send.h" +#include "manager.h" #include "memfd-util.h" #include "missing_sched.h" #include "missing_syscall.h" #include "mkdir-label.h" +#include "mount-util.h" #include "osc-context.h" #include "proc-cmdline.h" #include "process-util.h" diff --git a/src/core/execute-serialize.c b/src/core/execute-serialize.c index 380d6fa6bb..0aea6fe804 100644 --- a/src/core/execute-serialize.c +++ b/src/core/execute-serialize.c @@ -2,7 +2,9 @@ #include "af-list.h" #include "capability-util.h" +#include "cgroup.h" #include "cgroup-setup.h" +#include "dynamic-user.h" #include "escape.h" #include "exec-credential.h" #include "execute-serialize.h" diff --git a/src/core/execute.c b/src/core/execute.c index 76ad7345ca..4aef0ad819 100644 --- a/src/core/execute.c +++ b/src/core/execute.c @@ -25,6 +25,7 @@ #include "cgroup-setup.h" #include "constants.h" #include "cpu-set-util.h" +#include "dynamic-user.h" #include "env-file.h" #include "env-util.h" #include "errno-list.h" diff --git a/src/core/execute.h b/src/core/execute.h index 63d5b448de..9b449012b2 100644 --- a/src/core/execute.h +++ b/src/core/execute.h @@ -1,19 +1,11 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -typedef struct ExecStatus ExecStatus; -typedef struct ExecCommand ExecCommand; -typedef struct ExecContext ExecContext; -typedef struct ExecSharedRuntime ExecSharedRuntime; -typedef struct DynamicCreds DynamicCreds; -typedef struct ExecRuntime ExecRuntime; -typedef struct ExecParameters ExecParameters; -typedef struct Manager Manager; - #include #include #include #include +#include #include "bus-unit-util.h" #include "cgroup-util.h" @@ -22,6 +14,7 @@ typedef struct Manager Manager; #include "exec-util.h" #include "fdset.h" #include "list.h" +#include "log-context.h" #include "namespace.h" #include "nsflags.h" #include "numa-util.h" @@ -34,6 +27,17 @@ typedef struct Manager Manager; #include "set.h" #include "time-util.h" +typedef struct CGroupContext CGroupContext; +typedef struct ExecStatus ExecStatus; +typedef struct ExecCommand ExecCommand; +typedef struct ExecContext ExecContext; +typedef struct ExecSharedRuntime ExecSharedRuntime; +typedef struct DynamicCreds DynamicCreds; +typedef struct ExecRuntime ExecRuntime; +typedef struct ExecParameters ExecParameters; +typedef struct Manager Manager; +typedef struct Unit Unit; + #define EXEC_STDIN_DATA_MAX (64U*1024U*1024U) typedef enum ExecUtmpMode { @@ -494,9 +498,6 @@ struct ExecParameters { .pidref_transport_fd = -EBADF, \ } -#include "unit.h" -#include "dynamic-user.h" - int exec_spawn( Unit *unit, ExecCommand *command, diff --git a/src/core/executor.c b/src/core/executor.c index bc3566a9fc..daee9ea955 100644 --- a/src/core/executor.c +++ b/src/core/executor.c @@ -9,6 +9,8 @@ #include "argv-util.h" #include "build.h" #include "capability-util.h" +#include "cgroup.h" +#include "dynamic-user.h" #include "exec-invoke.h" #include "execute-serialize.h" #include "execute.h" diff --git a/src/core/fuzz-execute-serialize.c b/src/core/fuzz-execute-serialize.c index 05abee5a4e..67437549ea 100644 --- a/src/core/fuzz-execute-serialize.c +++ b/src/core/fuzz-execute-serialize.c @@ -20,6 +20,7 @@ #include #include "alloc-util.h" +#include "dynamic-user.h" #include "execute-serialize.h" #include "fd-util.h" #include "fuzz.h" diff --git a/src/core/fuzz-unit-file.c b/src/core/fuzz-unit-file.c index 57480cf766..d8987c9648 100644 --- a/src/core/fuzz-unit-file.c +++ b/src/core/fuzz-unit-file.c @@ -5,6 +5,7 @@ #include "fuzz.h" #include "install.h" #include "load-fragment.h" +#include "manager.h" #include "manager-dump.h" #include "memstream-util.h" #include "string-util.h" diff --git a/src/core/job.c b/src/core/job.c index 4209a7c8d4..d051b3db6d 100644 --- a/src/core/job.c +++ b/src/core/job.c @@ -16,6 +16,7 @@ #include "job.h" #include "log.h" #include "macro.h" +#include "manager.h" #include "parse-util.h" #include "serialize.h" #include "set.h" diff --git a/src/core/job.h b/src/core/job.h index 388890e368..3c1e861bbc 100644 --- a/src/core/job.h +++ b/src/core/job.h @@ -7,6 +7,8 @@ #include "sd-event.h" #include "list.h" +#include "memory-util.h" +#include "time-util.h" #include "unit-dependency-atom.h" typedef struct ActivationDetails ActivationDetails; diff --git a/src/core/kill.h b/src/core/kill.h index 3add663d71..97a295e1e5 100644 --- a/src/core/kill.h +++ b/src/core/kill.h @@ -1,8 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -typedef struct KillContext KillContext; - #include #include @@ -18,7 +16,7 @@ typedef enum KillMode { _KILL_MODE_INVALID = -EINVAL, } KillMode; -struct KillContext { +typedef struct KillContext { KillMode kill_mode; int kill_signal; int restart_kill_signal; @@ -26,7 +24,7 @@ struct KillContext { int watchdog_signal; bool send_sigkill; bool send_sighup; -}; +} KillContext; typedef enum KillWhom { /* Kill whom is a property of an operation */ diff --git a/src/core/load-dropin.c b/src/core/load-dropin.c index 5c1ccc966f..0256f70635 100644 --- a/src/core/load-dropin.c +++ b/src/core/load-dropin.c @@ -1,16 +1,29 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include "conf-parser.h" +#include "dropin.h" #include "fs-util.h" #include "load-dropin.h" #include "load-fragment.h" #include "log.h" +#include "manager.h" #include "stat-util.h" #include "string-util.h" #include "strv.h" #include "unit-name.h" #include "unit.h" +int unit_find_dropin_paths(Unit *u, bool use_unit_path_cache, char ***paths) { + assert(u); + + return unit_file_find_dropin_paths(NULL, + u->manager->lookup_paths.search_path, + use_unit_path_cache ? u->manager->unit_path_cache : NULL, + ".d", ".conf", + u->id, u->aliases, + paths); +} + static int process_deps(Unit *u, UnitDependency dependency, const char *dir_suffix) { _cleanup_strv_free_ char **paths = NULL; int r; diff --git a/src/core/load-dropin.h b/src/core/load-dropin.h index 141bc7dd0f..864ea4f083 100644 --- a/src/core/load-dropin.h +++ b/src/core/load-dropin.h @@ -1,20 +1,12 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -#include "dropin.h" -#include "unit.h" +#include + +typedef struct Unit Unit; /* Read service data supplementary drop-in directories */ -static inline int unit_find_dropin_paths(Unit *u, bool use_unit_path_cache, char ***paths) { - assert(u); - - return unit_file_find_dropin_paths(NULL, - u->manager->lookup_paths.search_path, - use_unit_path_cache ? u->manager->unit_path_cache : NULL, - ".d", ".conf", - u->id, u->aliases, - paths); -} +int unit_find_dropin_paths(Unit *u, bool use_unit_path_cache, char ***paths); int unit_load_dropin(Unit *u); diff --git a/src/core/load-fragment.h b/src/core/load-fragment.h index 0e68d1bb84..6aa8f479f5 100644 --- a/src/core/load-fragment.h +++ b/src/core/load-fragment.h @@ -2,7 +2,8 @@ #pragma once #include "conf-parser.h" -#include "unit.h" + +typedef struct Unit Unit; /* These functions are declared in the header to make them accessible to unit tests. */ bool contains_instance_specifier_superset(const char *s); diff --git a/src/core/manager-dump.c b/src/core/manager-dump.c index 7e678fa03e..9cb184b4d2 100644 --- a/src/core/manager-dump.c +++ b/src/core/manager-dump.c @@ -4,6 +4,7 @@ #include "fd-util.h" #include "fileio.h" #include "hashmap.h" +#include "manager.h" #include "manager-dump.h" #include "memstream-util.h" #include "unit-serialize.h" diff --git a/src/core/manager-dump.h b/src/core/manager-dump.h index 5b96f26f54..a02c29ad68 100644 --- a/src/core/manager-dump.h +++ b/src/core/manager-dump.h @@ -3,7 +3,7 @@ #include -#include "manager.h" +typedef struct Manager Manager; void manager_dump_jobs(Manager *s, FILE *f, char **patterns, const char *prefix); int manager_get_dump_jobs_string(Manager *m, char **patterns, const char *prefix, char **ret); diff --git a/src/core/manager-serialize.c b/src/core/manager-serialize.c index c5cb82e8d5..ae4472b38b 100644 --- a/src/core/manager-serialize.c +++ b/src/core/manager-serialize.c @@ -5,6 +5,7 @@ #include "clean-ipc.h" #include "core-varlink.h" #include "dbus.h" +#include "dynamic-user.h" #include "fd-util.h" #include "fileio.h" #include "format-util.h" diff --git a/src/core/manager-serialize.h b/src/core/manager-serialize.h index c52261e378..7d4e8effb2 100644 --- a/src/core/manager-serialize.h +++ b/src/core/manager-serialize.h @@ -2,10 +2,12 @@ #pragma once #include +#include -#include "manager.h" #include "fdset.h" +typedef struct Manager Manager; + #define DESTROY_IPC_FLAG (UINT32_C(1) << 31) int manager_open_serialization(Manager *m, FILE **ret_f); diff --git a/src/core/manager.c b/src/core/manager.c index cf000d8f21..15c8f2b90d 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -42,6 +42,7 @@ #include "dbus-unit.h" #include "dbus.h" #include "dirent-util.h" +#include "dynamic-user.h" #include "env-util.h" #include "escape.h" #include "event-util.h" @@ -5182,11 +5183,3 @@ static const char* const manager_timestamp_table[_MANAGER_TIMESTAMP_MAX] = { }; DEFINE_STRING_TABLE_LOOKUP(manager_timestamp, ManagerTimestamp); - -static const char* const oom_policy_table[_OOM_POLICY_MAX] = { - [OOM_CONTINUE] = "continue", - [OOM_STOP] = "stop", - [OOM_KILL] = "kill", -}; - -DEFINE_STRING_TABLE_LOOKUP(oom_policy, OOMPolicy); diff --git a/src/core/manager.h b/src/core/manager.h index a07c665e5b..cbad223d1b 100644 --- a/src/core/manager.h +++ b/src/core/manager.h @@ -9,14 +9,22 @@ #include "sd-event.h" #include "sd-varlink.h" -#include "common-signal.h" #include "cgroup-util.h" #include "cgroup.h" +#include "common-signal.h" +#include "emergency-action.h" +#include "execute.h" #include "fdset.h" #include "hashmap.h" +#include "job.h" #include "list.h" +#include "path-lookup.h" #include "prioq.h" #include "ratelimit.h" +#include "show-status.h" +#include "transaction.h" +#include "unit-name.h" +#include "unit.h" struct libmnt_monitor; typedef struct Unit Unit; @@ -62,21 +70,6 @@ typedef enum ManagerObjective { _MANAGER_OBJECTIVE_INVALID = -EINVAL, } ManagerObjective; -typedef enum StatusType { - STATUS_TYPE_EPHEMERAL, - STATUS_TYPE_NORMAL, - STATUS_TYPE_NOTICE, - STATUS_TYPE_EMERGENCY, -} StatusType; - -typedef enum OOMPolicy { - OOM_CONTINUE, /* The kernel or systemd-oomd kills the process it wants to kill, and that's it */ - OOM_STOP, /* The kernel or systemd-oomd kills the process it wants to kill, and we stop the unit */ - OOM_KILL, /* The kernel or systemd-oomd kills the process it wants to kill, and all others in the unit, and we stop the unit */ - _OOM_POLICY_MAX, - _OOM_POLICY_INVALID = -EINVAL, -} OOMPolicy; - /* Notes: * 1. TIMESTAMP_FIRMWARE, TIMESTAMP_LOADER, TIMESTAMP_KERNEL, TIMESTAMP_INITRD, * TIMESTAMP_SECURITY_START, and TIMESTAMP_SECURITY_FINISH are set only when @@ -135,14 +128,6 @@ typedef enum WatchdogType { _WATCHDOG_TYPE_MAX, } WatchdogType; -#include "execute.h" -#include "job.h" -#include "path-lookup.h" -#include "show-status.h" -#include "transaction.h" -#include "unit-name.h" -#include "unit.h" - typedef enum ManagerTestRunFlags { MANAGER_TEST_NORMAL = 0, /* run normally */ MANAGER_TEST_RUN_MINIMAL = 1 << 0, /* create basic data structures */ @@ -670,9 +655,6 @@ LogTarget manager_get_executor_log_target(Manager *m); int manager_allocate_idle_pipe(Manager *m); -const char* oom_policy_to_string(OOMPolicy i) _const_; -OOMPolicy oom_policy_from_string(const char *s) _pure_; - void unit_defaults_init(UnitDefaults *defaults, RuntimeScope scope); void unit_defaults_done(UnitDefaults *defaults); diff --git a/src/core/mount.h b/src/core/mount.h index 7fd643f6fa..c754ae7933 100644 --- a/src/core/mount.h +++ b/src/core/mount.h @@ -1,9 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -typedef struct Mount Mount; - -#include "dynamic-user.h" #include "kill.h" #include "pidref.h" #include "unit.h" @@ -42,7 +39,7 @@ typedef enum MountProcFlags { MOUNT_PROC_JUST_CHANGED = 1 << 2, } MountProcFlags; -struct Mount { +typedef struct Mount { Unit meta; char *where; @@ -88,7 +85,7 @@ struct Mount { sd_event_source *timer_event_source; unsigned n_retry_umount; -}; +} Mount; extern const UnitVTable mount_vtable; diff --git a/src/core/path.c b/src/core/path.c index 4556dbfc71..364d94f528 100644 --- a/src/core/path.c +++ b/src/core/path.c @@ -16,6 +16,7 @@ #include "glob-util.h" #include "inotify-util.h" #include "macro.h" +#include "manager.h" #include "mkdir-label.h" #include "path.h" #include "path-util.h" diff --git a/src/core/path.h b/src/core/path.h index cb5b662911..8a3b8b3592 100644 --- a/src/core/path.h +++ b/src/core/path.h @@ -1,10 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -typedef struct Path Path; -typedef struct PathSpec PathSpec; -typedef struct ActivationDetailsPath ActivationDetailsPath; - #include "unit.h" typedef enum PathType { @@ -52,7 +48,7 @@ typedef enum PathResult { _PATH_RESULT_INVALID = -EINVAL, } PathResult; -struct Path { +typedef struct Path { Unit meta; LIST_HEAD(PathSpec, specs); @@ -67,12 +63,12 @@ struct Path { RateLimit trigger_limit; sd_event_source *trigger_notify_event_source; -}; +} Path; -struct ActivationDetailsPath { +typedef struct ActivationDetailsPath { ActivationDetails meta; char *trigger_path_filename; -}; +} ActivationDetailsPath; void path_free_specs(Path *p); diff --git a/src/core/scope.c b/src/core/scope.c index 208716ea07..caeadd7e23 100644 --- a/src/core/scope.c +++ b/src/core/scope.c @@ -10,6 +10,7 @@ #include "exit-status.h" #include "load-dropin.h" #include "log.h" +#include "manager.h" #include "process-util.h" #include "random-util.h" #include "scope.h" diff --git a/src/core/scope.h b/src/core/scope.h index 1090431c13..27f2c83b23 100644 --- a/src/core/scope.h +++ b/src/core/scope.h @@ -1,8 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -typedef struct Scope Scope; - #include "cgroup.h" #include "kill.h" #include "unit.h" @@ -16,7 +14,7 @@ typedef enum ScopeResult { _SCOPE_RESULT_INVALID = -EINVAL, } ScopeResult; -struct Scope { +typedef struct Scope { Unit meta; CGroupContext cgroup_context; @@ -41,7 +39,7 @@ struct Scope { char *group; OOMPolicy oom_policy; -}; +} Scope; extern const UnitVTable scope_vtable; diff --git a/src/core/service.h b/src/core/service.h index 68be9075c1..a542c0fb11 100644 --- a/src/core/service.h +++ b/src/core/service.h @@ -1,12 +1,9 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -typedef struct Service Service; -typedef struct ServiceFDStore ServiceFDStore; -typedef struct ServiceExtraFD ServiceExtraFD; - #include "exit-status.h" #include "kill.h" +#include "manager.h" #include "open-file.h" #include "path.h" #include "pidref.h" @@ -14,6 +11,8 @@ typedef struct ServiceExtraFD ServiceExtraFD; #include "socket.h" #include "unit.h" +typedef struct Service Service; + typedef enum ServiceRestart { SERVICE_RESTART_NO, SERVICE_RESTART_ON_SUCCESS, @@ -101,7 +100,7 @@ typedef enum ServiceRestartMode { _SERVICE_RESTART_MODE_INVALID = -EINVAL, } ServiceRestartMode; -struct ServiceFDStore { +typedef struct ServiceFDStore { Service *service; int fd; @@ -109,13 +108,13 @@ struct ServiceFDStore { sd_event_source *event_source; bool do_poll; - LIST_FIELDS(ServiceFDStore, fd_store); -}; + LIST_FIELDS(struct ServiceFDStore, fd_store); +} ServiceFDStore; -struct ServiceExtraFD { +typedef struct ServiceExtraFD { int fd; char *fdname; -}; +} ServiceExtraFD; struct Service { Unit meta; diff --git a/src/core/slice.c b/src/core/slice.c index ba6f2fb9c5..4a9ff98ee9 100644 --- a/src/core/slice.c +++ b/src/core/slice.c @@ -7,6 +7,7 @@ #include "dbus-unit.h" #include "fd-util.h" #include "log.h" +#include "manager.h" #include "serialize.h" #include "slice.h" #include "special.h" diff --git a/src/core/slice.h b/src/core/slice.h index 37e1f700f8..46faecc030 100644 --- a/src/core/slice.h +++ b/src/core/slice.h @@ -3,9 +3,7 @@ #include "unit.h" -typedef struct Slice Slice; - -struct Slice { +typedef struct Slice { Unit meta; SliceState state, deserialized_state; @@ -16,7 +14,7 @@ struct Slice { CGroupContext cgroup_context; CGroupRuntime *cgroup_runtime; -}; +} Slice; extern const UnitVTable slice_vtable; diff --git a/src/core/socket.c b/src/core/socket.c index 861aaba3d4..bb1db8e90e 100644 --- a/src/core/socket.c +++ b/src/core/socket.c @@ -28,6 +28,7 @@ #include "ip-protocol-list.h" #include "label-util.h" #include "log.h" +#include "manager.h" #include "mkdir-label.h" #include "parse-util.h" #include "path-util.h" diff --git a/src/core/socket.h b/src/core/socket.h index 51fc96280b..240a9ac965 100644 --- a/src/core/socket.h +++ b/src/core/socket.h @@ -1,14 +1,13 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -typedef struct Socket Socket; -typedef struct SocketPeer SocketPeer; - -#include "mount.h" #include "pidref.h" #include "socket-util.h" #include "unit.h" +typedef struct Socket Socket; +typedef struct SocketPeer SocketPeer; + typedef enum SocketExecCommand { SOCKET_EXEC_START_PRE, SOCKET_EXEC_START_CHOWN, diff --git a/src/core/swap.c b/src/core/swap.c index cc5a21ee78..a8549699ff 100644 --- a/src/core/swap.c +++ b/src/core/swap.c @@ -17,6 +17,7 @@ #include "fd-util.h" #include "format-util.h" #include "fstab-util.h" +#include "manager.h" #include "parse-util.h" #include "path-util.h" #include "process-util.h" diff --git a/src/core/swap.h b/src/core/swap.h index d9bbd377f0..fce7ea5e56 100644 --- a/src/core/swap.h +++ b/src/core/swap.h @@ -10,8 +10,6 @@ #include "pidref.h" #include "unit.h" -typedef struct Swap Swap; - typedef enum SwapExecCommand { SWAP_EXEC_ACTIVATE, SWAP_EXEC_DEACTIVATE, @@ -38,7 +36,7 @@ typedef struct SwapParameters { bool priority_set; } SwapParameters; -struct Swap { +typedef struct Swap { Unit meta; char *what; @@ -85,7 +83,7 @@ struct Swap { devices for the same swap. We chain them up here. */ LIST_FIELDS(struct Swap, same_devnode); -}; +} Swap; extern const UnitVTable swap_vtable; diff --git a/src/core/target.h b/src/core/target.h index bb909d664f..9e7c77c027 100644 --- a/src/core/target.h +++ b/src/core/target.h @@ -3,13 +3,11 @@ #include "unit.h" -typedef struct Target Target; - -struct Target { +typedef struct Target { Unit meta; TargetState state, deserialized_state; -}; +} Target; extern const UnitVTable target_vtable; diff --git a/src/core/timer.c b/src/core/timer.c index b37a67f310..d69e229922 100644 --- a/src/core/timer.c +++ b/src/core/timer.c @@ -12,6 +12,7 @@ #include "dbus-timer.h" #include "dbus-unit.h" #include "fs-util.h" +#include "manager.h" #include "parse-util.h" #include "random-util.h" #include "serialize.h" diff --git a/src/core/timer.h b/src/core/timer.h index 14a9931dff..90f19a7cf4 100644 --- a/src/core/timer.h +++ b/src/core/timer.h @@ -1,9 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -typedef struct Timer Timer; -typedef struct ActivationDetailsTimer ActivationDetailsTimer; - #include "calendarspec.h" #include "unit.h" @@ -37,7 +34,7 @@ typedef enum TimerResult { _TIMER_RESULT_INVALID = -EINVAL, } TimerResult; -struct Timer { +typedef struct Timer { Unit meta; usec_t accuracy_usec; @@ -64,12 +61,12 @@ struct Timer { bool defer_reactivation; char *stamp_path; -}; +} Timer; -struct ActivationDetailsTimer { +typedef struct ActivationDetailsTimer { ActivationDetails meta; dual_timestamp last_trigger; -}; +} ActivationDetailsTimer; #define TIMER_MONOTONIC_CLOCK(t) ((t)->wake_system ? CLOCK_BOOTTIME_ALARM : CLOCK_MONOTONIC) diff --git a/src/core/transaction.c b/src/core/transaction.c index 07fd612d91..6d0d7e73be 100644 --- a/src/core/transaction.c +++ b/src/core/transaction.c @@ -8,6 +8,7 @@ #include "bus-common-errors.h" #include "bus-error.h" #include "dbus-unit.h" +#include "manager.h" #include "slice.h" #include "strv.h" #include "terminal-util.h" diff --git a/src/core/transaction.h b/src/core/transaction.h index b6728a35d7..1f58fcebcc 100644 --- a/src/core/transaction.h +++ b/src/core/transaction.h @@ -1,20 +1,15 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -typedef struct Transaction Transaction; -typedef enum TransactionAddFlags TransactionAddFlags; - #include "hashmap.h" #include "job.h" -#include "manager.h" -#include "unit.h" -struct Transaction { +typedef struct Transaction { /* Jobs to be added */ Hashmap *jobs; /* Unit object => Job object list 1:1 */ Job *anchor_job; /* The job the user asked for */ bool irreversible; -}; +} Transaction; Transaction* transaction_new(bool irreversible); Transaction* transaction_free(Transaction *tr); diff --git a/src/core/unit-printf.c b/src/core/unit-printf.c index f25e2e3986..0bdacfc3c0 100644 --- a/src/core/unit-printf.c +++ b/src/core/unit-printf.c @@ -4,6 +4,7 @@ #include "cgroup-util.h" #include "format-util.h" #include "macro.h" +#include "manager.h" #include "sd-path.h" #include "specifier.h" #include "string-util.h" diff --git a/src/core/unit-serialize.c b/src/core/unit-serialize.c index 13aea615dd..a38b38590a 100644 --- a/src/core/unit-serialize.c +++ b/src/core/unit-serialize.c @@ -10,6 +10,7 @@ #include "parse-util.h" #include "serialize.h" #include "string-table.h" +#include "unit.h" #include "unit-serialize.h" #include "user-util.h" diff --git a/src/core/unit-serialize.h b/src/core/unit-serialize.h index ab8a8e3be9..a7ac03cf82 100644 --- a/src/core/unit-serialize.h +++ b/src/core/unit-serialize.h @@ -1,11 +1,13 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once +#include #include -#include "unit.h" #include "fdset.h" +typedef struct Unit Unit; + /* These functions serialize state for our own usage, i.e.: across a reload/reexec, rather than for being * passed to a child process. */ diff --git a/src/core/unit.c b/src/core/unit.c index c25777671d..db14297622 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -24,6 +24,7 @@ #include "dbus-unit.h" #include "dbus.h" #include "dropin.h" +#include "dynamic-user.h" #include "env-util.h" #include "escape.h" #include "exec-credential.h" @@ -6810,6 +6811,14 @@ static const char* const unit_mount_dependency_type_table[_UNIT_MOUNT_DEPENDENCY DEFINE_STRING_TABLE_LOOKUP(unit_mount_dependency_type, UnitMountDependencyType); +static const char* const oom_policy_table[_OOM_POLICY_MAX] = { + [OOM_CONTINUE] = "continue", + [OOM_STOP] = "stop", + [OOM_KILL] = "kill", +}; + +DEFINE_STRING_TABLE_LOOKUP(oom_policy, OOMPolicy); + UnitDependency unit_mount_dependency_type_to_dependency_type(UnitMountDependencyType t) { switch (t) { diff --git a/src/core/unit.h b/src/core/unit.h index 6a46cbda0a..5bf52f5f6d 100644 --- a/src/core/unit.h +++ b/src/core/unit.h @@ -9,7 +9,21 @@ #include "sd-id128.h" -/* Circular dependency with manager.h, needs to be defined before local includes */ +#include "cgroup.h" +#include "condition.h" +#include "emergency-action.h" +#include "execute.h" +#include "install.h" +#include "job.h" +#include "list.h" +#include "log-context.h" +#include "mount-util.h" +#include "pidref.h" +#include "ratelimit.h" +#include "unit-file.h" + +typedef struct UnitRef UnitRef; + typedef enum UnitMountDependencyType { UNIT_MOUNT_WANTS, UNIT_MOUNT_REQUIRES, @@ -17,18 +31,6 @@ typedef enum UnitMountDependencyType { _UNIT_MOUNT_DEPENDENCY_TYPE_INVALID = -EINVAL, } UnitMountDependencyType; -#include "cgroup.h" -#include "condition.h" -#include "emergency-action.h" -#include "install.h" -#include "list.h" -#include "log-context.h" -#include "mount-util.h" -#include "pidref.h" -#include "unit-file.h" - -typedef struct UnitRef UnitRef; - typedef enum KillOperation { KILL_TERMINATE, KILL_TERMINATE_AND_LOG, @@ -46,6 +48,21 @@ typedef enum CollectMode { _COLLECT_MODE_INVALID = -EINVAL, } CollectMode; +typedef enum OOMPolicy { + OOM_CONTINUE, /* The kernel or systemd-oomd kills the process it wants to kill, and that's it */ + OOM_STOP, /* The kernel or systemd-oomd kills the process it wants to kill, and we stop the unit */ + OOM_KILL, /* The kernel or systemd-oomd kills the process it wants to kill, and all others in the unit, and we stop the unit */ + _OOM_POLICY_MAX, + _OOM_POLICY_INVALID = -EINVAL, +} OOMPolicy; + +typedef enum StatusType { + STATUS_TYPE_EPHEMERAL, + STATUS_TYPE_NORMAL, + STATUS_TYPE_NOTICE, + STATUS_TYPE_EMERGENCY, +} StatusType; + static inline bool UNIT_IS_ACTIVE_OR_RELOADING(UnitActiveState t) { return IN_SET(t, UNIT_ACTIVE, UNIT_RELOADING, UNIT_REFRESHING); } @@ -200,8 +217,6 @@ static inline void* UNIT_DEPENDENCY_TO_PTR(UnitDependency d) { return INT_TO_PTR(d); } -#include "job.h" - struct UnitRef { /* Keeps tracks of references to a unit. This is useful so * that we can merge two units if necessary and correct all @@ -1061,6 +1076,9 @@ UnitMountDependencyType unit_mount_dependency_type_from_string(const char *s) _c const char* unit_mount_dependency_type_to_string(UnitMountDependencyType t) _const_; UnitDependency unit_mount_dependency_type_to_dependency_type(UnitMountDependencyType t) _pure_; +const char* oom_policy_to_string(OOMPolicy i) _const_; +OOMPolicy oom_policy_from_string(const char *s) _pure_; + /* Macros which append UNIT= or USER_UNIT= to the message */ #define log_unit_full_errno_zerook(unit, level, error, ...) \