#pragma once
#include <stdbool.h>
#include <inttypes.h>
#include <stdio.h>
#include "sd-bus.h"
#include "sd-event.h"
#include "fdset.h"
#include "cgroup-util.h"
#define MANAGER_MAX_NAMES 131072
typedef struct Manager Manager;
typedef enum ManagerState {
MANAGER_INITIALIZING,
MANAGER_STARTING,
MANAGER_RUNNING,
MANAGER_DEGRADED,
MANAGER_MAINTENANCE,
MANAGER_STOPPING,
_MANAGER_STATE_MAX,
_MANAGER_STATE_INVALID = -1
} ManagerState;
typedef enum ManagerExitCode {
MANAGER_OK,
MANAGER_EXIT,
MANAGER_RELOAD,
MANAGER_REEXECUTE,
MANAGER_REBOOT,
MANAGER_POWEROFF,
MANAGER_HALT,
MANAGER_KEXEC,
MANAGER_SWITCH_ROOT,
_MANAGER_EXIT_CODE_MAX,
_MANAGER_EXIT_CODE_INVALID = -1
} ManagerExitCode;
typedef enum StatusType {
STATUS_TYPE_EPHEMERAL,
STATUS_TYPE_NORMAL,
STATUS_TYPE_EMERGENCY,
} StatusType;
#include "unit.h"
#include "job.h"
#include "hashmap.h"
#include "list.h"
#include "set.h"
#include "path-lookup.h"
#include "execute.h"
#include "unit-name.h"
#include "exit-status.h"
#include "show-status.h"
#include "failure-action.h"
struct Manager {
Hashmap *units;
Hashmap *jobs;
LIST_HEAD(Unit, units_by_type[_UNIT_TYPE_MAX]);
LIST_HEAD(Unit, load_queue);
LIST_HEAD(Job, run_queue);
LIST_HEAD(Unit, dbus_unit_queue);
LIST_HEAD(Job, dbus_job_queue);
LIST_HEAD(Unit, cleanup_queue);
LIST_HEAD(Unit, gc_queue);
LIST_HEAD(Unit, cgroup_queue);
sd_event *event;
Hashmap *watch_pids1;
Hashmap *watch_pids2;
Set *startup_units;
Set *failed_units;
sd_event_source *run_queue_event_source;
char *notify_socket;
int notify_fd;
sd_event_source *notify_event_source;
int signal_fd;
sd_event_source *signal_event_source;
int time_change_fd;
sd_event_source *time_change_event_source;
sd_event_source *jobs_in_progress_event_source;
unsigned n_snapshots;
LookupPaths lookup_paths;
Set *unit_path_cache;
char **environment;
usec_t runtime_watchdog;
usec_t shutdown_watchdog;
dual_timestamp firmware_timestamp;
dual_timestamp loader_timestamp;
dual_timestamp kernel_timestamp;
dual_timestamp initrd_timestamp;
dual_timestamp userspace_timestamp;
dual_timestamp finish_timestamp;
dual_timestamp security_start_timestamp;
dual_timestamp security_finish_timestamp;
dual_timestamp generators_start_timestamp;
dual_timestamp generators_finish_timestamp;
dual_timestamp units_load_start_timestamp;
dual_timestamp units_load_finish_timestamp;
char *generator_unit_path;
char *generator_unit_path_early;
char *generator_unit_path_late;
struct udev* udev;
struct udev_monitor* udev_monitor;
sd_event_source *udev_event_source;
Hashmap *devices_by_sysfs;
FILE *proc_self_mountinfo;
sd_event_source *mount_event_source;
FILE *proc_swaps;
sd_event_source *swap_event_source;
Hashmap *swaps_by_devnode;
sd_bus *api_bus, *system_bus;
Set *private_buses;
int private_listen_fd;
sd_event_source *private_listen_event_source;
sd_bus_track *subscribed;
char **deserialized_subscribed;
sd_bus_message *queued_message;
sd_bus *queued_message_bus;
Hashmap *watch_bus;
bool send_reloading_done;
uint32_t current_job_id;
uint32_t default_unit_job_id;
int dev_autofs_fd;
Hashmap *cgroup_unit;
CGroupControllerMask cgroup_supported;
char *cgroup_root;
int gc_marker;
unsigned n_in_gc_queue;
int pin_cgroupfs_fd;
SystemdRunningAs running_as;
ManagerExitCode exit_code:5;
bool dispatching_load_queue:1;
bool dispatching_dbus_queue:1;
bool taint_usr:1;
bool first_boot:1;
bool test_run:1;
ShowStatus show_status;
bool confirm_spawn;
bool no_console_output;
ExecOutput default_std_output, default_std_error;
usec_t default_restart_usec, default_timeout_start_usec, default_timeout_stop_usec;
usec_t default_start_limit_interval;
unsigned default_start_limit_burst;
bool default_cpu_accounting;
bool default_memory_accounting;
bool default_blockio_accounting;
usec_t default_timer_accuracy_usec;
struct rlimit *rlimit[_RLIMIT_MAX];
int n_reloading;
unsigned n_installed_jobs;
unsigned n_failed_jobs;
unsigned n_running_jobs;
unsigned n_on_console;
unsigned jobs_in_progress_iteration;
int have_ask_password;
int ask_password_inotify_fd;
sd_event_source *ask_password_event_source;
int idle_pipe[4];
sd_event_source *idle_pipe_event_source;
char *switch_root;
char *switch_root_init;
Hashmap *units_requiring_mounts_for;
int kdbus_fd;
Hashmap *polkit_registry;
};
int manager_new(SystemdRunningAs running_as, bool test_run, Manager **m);
void manager_free(Manager *m);
int manager_enumerate(Manager *m);
int manager_startup(Manager *m, FILE *serialization, FDSet *fds);
Job *manager_get_job(Manager *m, uint32_t id);
Unit *manager_get_unit(Manager *m, const char *name);
int manager_get_unit_by_path(Manager *m, const char *path, const char *suffix, Unit **_found);
int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j);
int manager_load_unit_prepare(Manager *m, const char *name, const char *path, sd_bus_error *e, Unit **_ret);
int manager_load_unit(Manager *m, const char *name, const char *path, sd_bus_error *e, Unit **_ret);
int manager_load_unit_from_dbus_path(Manager *m, const char *s, sd_bus_error *e, Unit **_u);
int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool force, sd_bus_error *e, Job **_ret);
int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, bool force, sd_bus_error *e, Job **_ret);
void manager_dump_units(Manager *s, FILE *f, const char *prefix);
void manager_dump_jobs(Manager *s, FILE *f, const char *prefix);
void manager_clear_jobs(Manager *m);
unsigned manager_dispatch_load_queue(Manager *m);
int manager_environment_add(Manager *m, char **minus, char **plus);
int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit);
int manager_loop(Manager *m);
void manager_dispatch_bus_name_owner_changed(Manager *m, const char *name, const char* old_owner, const char *new_owner);
int manager_open_serialization(Manager *m, FILE **_f);
int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root);
int manager_deserialize(Manager *m, FILE *f, FDSet *fds);
int manager_reload(Manager *m);
bool manager_is_reloading_or_reexecuting(Manager *m) _pure_;
void manager_reset_failed(Manager *m);
void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success);
void manager_send_unit_plymouth(Manager *m, Unit *u);
bool manager_unit_inactive_or_pending(Manager *m, const char *name);
void manager_check_finished(Manager *m);
void manager_run_generators(Manager *m);
void manager_undo_generators(Manager *m);
void manager_recheck_journal(Manager *m);
void manager_set_show_status(Manager *m, ShowStatus mode);
void manager_set_first_boot(Manager *m, bool b);
void manager_status_printf(Manager *m, StatusType type, const char *status, const char *format, ...) _printf_(4,5);
void manager_flip_auto_status(Manager *m, bool enable);
Set *manager_get_units_requiring_mounts_for(Manager *m, const char *path);
const char *manager_get_runtime_prefix(Manager *m);
ManagerState manager_state(Manager *m);
const char *manager_state_to_string(ManagerState m) _const_;
ManagerState manager_state_from_string(const char *s) _pure_;