]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/login/logind-session.h
Merge pull request #12753 from jrouleau/fix/hibernate-resume-timeout
[thirdparty/systemd.git] / src / login / logind-session.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 #pragma once
3
4 typedef struct Session Session;
5 typedef enum KillWho KillWho;
6
7 #include "list.h"
8 #include "login-util.h"
9 #include "logind-user.h"
10 #include "string-util.h"
11
12 typedef enum SessionState {
13 SESSION_OPENING, /* Session scope is being created */
14 SESSION_ONLINE, /* Logged in */
15 SESSION_ACTIVE, /* Logged in and in the fg */
16 SESSION_CLOSING, /* Logged out, but scope is still there */
17 _SESSION_STATE_MAX,
18 _SESSION_STATE_INVALID = -1
19 } SessionState;
20
21 typedef enum SessionClass {
22 SESSION_USER,
23 SESSION_GREETER,
24 SESSION_LOCK_SCREEN,
25 SESSION_BACKGROUND,
26 _SESSION_CLASS_MAX,
27 _SESSION_CLASS_INVALID = -1
28 } SessionClass;
29
30 typedef enum SessionType {
31 SESSION_UNSPECIFIED,
32 SESSION_TTY,
33 SESSION_X11,
34 SESSION_WAYLAND,
35 SESSION_MIR,
36 SESSION_WEB,
37 _SESSION_TYPE_MAX,
38 _SESSION_TYPE_INVALID = -1
39 } SessionType;
40
41 #define SESSION_TYPE_IS_GRAPHICAL(type) IN_SET(type, SESSION_X11, SESSION_WAYLAND, SESSION_MIR)
42
43 enum KillWho {
44 KILL_LEADER,
45 KILL_ALL,
46 _KILL_WHO_MAX,
47 _KILL_WHO_INVALID = -1
48 };
49
50 typedef enum TTYValidity {
51 TTY_FROM_PAM,
52 TTY_FROM_UTMP,
53 TTY_UTMP_INCONSISTENT, /* may happen on ssh sessions with multiplexed TTYs */
54 _TTY_VALIDITY_MAX,
55 _TTY_VALIDITY_INVALID = -1,
56 } TTYValidity;
57
58 struct Session {
59 Manager *manager;
60
61 const char *id;
62 unsigned position;
63 SessionType type;
64 SessionClass class;
65
66 char *state_file;
67
68 User *user;
69
70 dual_timestamp timestamp;
71
72 char *display;
73 char *tty;
74 TTYValidity tty_validity;
75
76 bool remote;
77 char *remote_user;
78 char *remote_host;
79 char *service;
80 char *desktop;
81
82 char *scope;
83 char *scope_job;
84
85 Seat *seat;
86 unsigned vtnr;
87 int vtfd;
88
89 pid_t leader;
90 uint32_t audit_id;
91
92 int fifo_fd;
93 char *fifo_path;
94
95 sd_event_source *fifo_event_source;
96
97 bool idle_hint;
98 dual_timestamp idle_hint_timestamp;
99
100 bool locked_hint;
101
102 bool in_gc_queue:1;
103 bool started:1;
104 bool stopping:1;
105
106 bool was_active:1;
107
108 sd_bus_message *create_message;
109
110 /* Set up when a client requested to release the session via the bus */
111 sd_event_source *timer_event_source;
112
113 char *controller;
114 Hashmap *devices;
115 sd_bus_track *track;
116
117 LIST_FIELDS(Session, sessions_by_user);
118 LIST_FIELDS(Session, sessions_by_seat);
119
120 LIST_FIELDS(Session, gc_queue);
121 };
122
123 int session_new(Session **ret, Manager *m, const char *id);
124 Session* session_free(Session *s);
125
126 DEFINE_TRIVIAL_CLEANUP_FUNC(Session *, session_free);
127
128 void session_set_user(Session *s, User *u);
129 int session_set_leader(Session *s, pid_t pid);
130 bool session_may_gc(Session *s, bool drop_not_started);
131 void session_add_to_gc_queue(Session *s);
132 int session_activate(Session *s);
133 bool session_is_active(Session *s);
134 int session_get_idle_hint(Session *s, dual_timestamp *t);
135 void session_set_idle_hint(Session *s, bool b);
136 int session_get_locked_hint(Session *s);
137 void session_set_locked_hint(Session *s, bool b);
138 int session_create_fifo(Session *s);
139 int session_start(Session *s, sd_bus_message *properties, sd_bus_error *error);
140 int session_stop(Session *s, bool force);
141 int session_finalize(Session *s);
142 int session_release(Session *s);
143 int session_save(Session *s);
144 int session_load(Session *s);
145 int session_kill(Session *s, KillWho who, int signo);
146
147 SessionState session_get_state(Session *u);
148
149 const char* session_state_to_string(SessionState t) _const_;
150 SessionState session_state_from_string(const char *s) _pure_;
151
152 const char* session_type_to_string(SessionType t) _const_;
153 SessionType session_type_from_string(const char *s) _pure_;
154
155 const char* session_class_to_string(SessionClass t) _const_;
156 SessionClass session_class_from_string(const char *s) _pure_;
157
158 const char *kill_who_to_string(KillWho k) _const_;
159 KillWho kill_who_from_string(const char *s) _pure_;
160
161 const char* tty_validity_to_string(TTYValidity t) _const_;
162 TTYValidity tty_validity_from_string(const char *s) _pure_;
163
164 int session_prepare_vt(Session *s);
165 void session_leave_vt(Session *s);
166
167 bool session_is_controller(Session *s, const char *sender);
168 int session_set_controller(Session *s, const char *sender, bool force, bool prepare);
169 void session_drop_controller(Session *s);
170
171 static inline bool SESSION_IS_SELF(const char *name) {
172 return isempty(name) || streq(name, "self");
173 }
174
175 static inline bool SESSION_IS_AUTO(const char *name) {
176 return streq_ptr(name, "auto");
177 }