]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/login/logind.h
hibernate-resume: add resumeflags= kernel option
[thirdparty/systemd.git] / src / login / logind.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 #pragma once
3
4 #include <stdbool.h>
5
6 #include "sd-bus.h"
7 #include "sd-device.h"
8 #include "sd-event.h"
9
10 #include "conf-parser.h"
11 #include "hashmap.h"
12 #include "list.h"
13 #include "set.h"
14 #include "time-util.h"
15
16 typedef struct Manager Manager;
17
18 #include "logind-action.h"
19 #include "logind-button.h"
20 #include "logind-device.h"
21 #include "logind-inhibit.h"
22
23 struct Manager {
24 sd_event *event;
25 sd_bus *bus;
26
27 Hashmap *devices;
28 Hashmap *seats;
29 Hashmap *sessions;
30 Hashmap *sessions_by_leader;
31 Hashmap *users;
32 Hashmap *inhibitors;
33 Hashmap *buttons;
34
35 LIST_HEAD(Seat, seat_gc_queue);
36 LIST_HEAD(Session, session_gc_queue);
37 LIST_HEAD(User, user_gc_queue);
38
39 sd_device_monitor *device_seat_monitor, *device_monitor, *device_vcsa_monitor, *device_button_monitor;
40
41 sd_event_source *console_active_event_source;
42
43 #if ENABLE_UTMP
44 sd_event_source *utmp_event_source;
45 #endif
46
47 int console_active_fd;
48
49 unsigned n_autovts;
50
51 unsigned reserve_vt;
52 int reserve_vt_fd;
53
54 Seat *seat0;
55
56 char **kill_only_users, **kill_exclude_users;
57 bool kill_user_processes;
58
59 unsigned long session_counter;
60 unsigned long inhibit_counter;
61
62 Hashmap *session_units;
63 Hashmap *user_units;
64
65 usec_t inhibit_delay_max;
66 usec_t user_stop_delay;
67
68 /* If an action is currently being executed or is delayed,
69 * this is != 0 and encodes what is being done */
70 InhibitWhat action_what;
71
72 /* If a shutdown/suspend was delayed due to a inhibitor this
73 contains the unit name we are supposed to start after the
74 delay is over */
75 const char *action_unit;
76
77 /* If a shutdown/suspend is currently executed, then this is
78 * the job of it */
79 char *action_job;
80 sd_event_source *inhibit_timeout_source;
81
82 char *scheduled_shutdown_type;
83 usec_t scheduled_shutdown_timeout;
84 sd_event_source *scheduled_shutdown_timeout_source;
85 uid_t scheduled_shutdown_uid;
86 char *scheduled_shutdown_tty;
87 sd_event_source *nologin_timeout_source;
88 bool unlink_nologin;
89
90 char *wall_message;
91 unsigned enable_wall_messages;
92 sd_event_source *wall_message_timeout_source;
93
94 bool shutdown_dry_run;
95
96 sd_event_source *idle_action_event_source;
97 usec_t idle_action_usec;
98 usec_t idle_action_not_before_usec;
99 HandleAction idle_action;
100
101 HandleAction handle_power_key;
102 HandleAction handle_suspend_key;
103 HandleAction handle_hibernate_key;
104 HandleAction handle_lid_switch;
105 HandleAction handle_lid_switch_ep;
106 HandleAction handle_lid_switch_docked;
107
108 bool power_key_ignore_inhibited;
109 bool suspend_key_ignore_inhibited;
110 bool hibernate_key_ignore_inhibited;
111 bool lid_switch_ignore_inhibited;
112
113 bool remove_ipc;
114
115 Hashmap *polkit_registry;
116
117 usec_t holdoff_timeout_usec;
118 sd_event_source *lid_switch_ignore_event_source;
119
120 uint64_t runtime_dir_size;
121 uint64_t user_tasks_max;
122 uint64_t sessions_max;
123 uint64_t inhibitors_max;
124 };
125
126 void manager_reset_config(Manager *m);
127 int manager_parse_config_file(Manager *m);
128
129 int manager_add_device(Manager *m, const char *sysfs, bool master, Device **_device);
130 int manager_add_button(Manager *m, const char *name, Button **_button);
131 int manager_add_seat(Manager *m, const char *id, Seat **_seat);
132 int manager_add_session(Manager *m, const char *id, Session **_session);
133 int manager_add_user(Manager *m, uid_t uid, gid_t gid, const char *name, const char *home, User **_user);
134 int manager_add_user_by_name(Manager *m, const char *name, User **_user);
135 int manager_add_user_by_uid(Manager *m, uid_t uid, User **_user);
136 int manager_add_inhibitor(Manager *m, const char* id, Inhibitor **_inhibitor);
137
138 int manager_process_seat_device(Manager *m, sd_device *d);
139 int manager_process_button_device(Manager *m, sd_device *d);
140
141 int manager_spawn_autovt(Manager *m, unsigned vtnr);
142
143 bool manager_shall_kill(Manager *m, const char *user);
144
145 int manager_get_idle_hint(Manager *m, dual_timestamp *t);
146
147 int manager_get_user_by_pid(Manager *m, pid_t pid, User **user);
148 int manager_get_session_by_pid(Manager *m, pid_t pid, Session **session);
149
150 bool manager_is_lid_closed(Manager *m);
151 bool manager_is_docked_or_external_displays(Manager *m);
152 bool manager_is_on_external_power(void);
153 bool manager_all_buttons_ignored(Manager *m);
154
155 int manager_read_utmp(Manager *m);
156 void manager_connect_utmp(Manager *m);
157 void manager_reconnect_utmp(Manager *m);
158
159 extern const sd_bus_vtable manager_vtable[];
160
161 int match_job_removed(sd_bus_message *message, void *userdata, sd_bus_error *error);
162 int match_unit_removed(sd_bus_message *message, void *userdata, sd_bus_error *error);
163 int match_properties_changed(sd_bus_message *message, void *userdata, sd_bus_error *error);
164 int match_reloading(sd_bus_message *message, void *userdata, sd_bus_error *error);
165 int match_name_owner_changed(sd_bus_message *message, void *userdata, sd_bus_error *error);
166
167 int bus_manager_shutdown_or_sleep_now_or_later(Manager *m, const char *unit_name, InhibitWhat w, sd_bus_error *error);
168
169 int manager_send_changed(Manager *manager, const char *property, ...) _sentinel_;
170
171 int manager_start_scope(Manager *manager, const char *scope, pid_t pid, const char *slice, const char *description, char **wants, char **after, const char *requires_mounts_for, sd_bus_message *more_properties, sd_bus_error *error, char **job);
172 int manager_start_unit(Manager *manager, const char *unit, sd_bus_error *error, char **job);
173 int manager_stop_unit(Manager *manager, const char *unit, sd_bus_error *error, char **job);
174 int manager_abandon_scope(Manager *manager, const char *scope, sd_bus_error *error);
175 int manager_kill_unit(Manager *manager, const char *unit, KillWho who, int signo, sd_bus_error *error);
176 int manager_unit_is_active(Manager *manager, const char *unit, sd_bus_error *error);
177 int manager_job_is_active(Manager *manager, const char *path, sd_bus_error *error);
178
179 /* gperf lookup function */
180 const struct ConfigPerfItem* logind_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
181
182 int manager_set_lid_switch_ignore(Manager *m, usec_t until);
183
184 CONFIG_PARSER_PROTOTYPE(config_parse_n_autovts);
185 CONFIG_PARSER_PROTOTYPE(config_parse_tmpfs_size);
186
187 int manager_get_session_from_creds(Manager *m, sd_bus_message *message, const char *name, sd_bus_error *error, Session **ret);
188 int manager_get_user_from_creds(Manager *m, sd_bus_message *message, uid_t uid, sd_bus_error *error, User **ret);
189 int manager_get_seat_from_creds(Manager *m, sd_bus_message *message, const char *name, sd_bus_error *error, Seat **ret);
190
191 int manager_setup_wall_message_timer(Manager *m);
192 bool logind_wall_tty_filter(const char *tty, void *userdata);
193
194 int manager_dispatch_delayed(Manager *manager, bool timeout);