]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/login/logind.c
Merge pull request #10088 from keszybz/man-systemctl-return
[thirdparty/systemd.git] / src / login / logind.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2
3 #include <errno.h>
4 #include <fcntl.h>
5 #include <string.h>
6 #include <unistd.h>
7
8 #include "sd-daemon.h"
9 #include "sd-device.h"
10
11 #include "alloc-util.h"
12 #include "bus-error.h"
13 #include "bus-util.h"
14 #include "cgroup-util.h"
15 #include "def.h"
16 #include "device-util.h"
17 #include "dirent-util.h"
18 #include "fd-util.h"
19 #include "format-util.h"
20 #include "fs-util.h"
21 #include "libudev-private.h"
22 #include "logind.h"
23 #include "parse-util.h"
24 #include "process-util.h"
25 #include "selinux-util.h"
26 #include "signal-util.h"
27 #include "strv.h"
28
29 static Manager* manager_unref(Manager *m);
30 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_unref);
31
32 static int manager_new(Manager **ret) {
33 _cleanup_(manager_unrefp) Manager *m = NULL;
34 int r;
35
36 assert(ret);
37
38 m = new0(Manager, 1);
39 if (!m)
40 return -ENOMEM;
41
42 m->console_active_fd = -1;
43 m->reserve_vt_fd = -1;
44
45 m->idle_action_not_before_usec = now(CLOCK_MONOTONIC);
46
47 m->devices = hashmap_new(&string_hash_ops);
48 m->seats = hashmap_new(&string_hash_ops);
49 m->sessions = hashmap_new(&string_hash_ops);
50 m->users = hashmap_new(NULL);
51 m->inhibitors = hashmap_new(&string_hash_ops);
52 m->buttons = hashmap_new(&string_hash_ops);
53
54 m->user_units = hashmap_new(&string_hash_ops);
55 m->session_units = hashmap_new(&string_hash_ops);
56
57 if (!m->devices || !m->seats || !m->sessions || !m->users || !m->inhibitors || !m->buttons || !m->user_units || !m->session_units)
58 return -ENOMEM;
59
60 r = sd_event_default(&m->event);
61 if (r < 0)
62 return r;
63
64 r = sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
65 if (r < 0)
66 return r;
67
68 r = sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL);
69 if (r < 0)
70 return r;
71
72 (void) sd_event_set_watchdog(m->event, true);
73
74 manager_reset_config(m);
75
76 *ret = TAKE_PTR(m);
77 return 0;
78 }
79
80 static Manager* manager_unref(Manager *m) {
81 Session *session;
82 User *u;
83 Device *d;
84 Seat *s;
85 Inhibitor *i;
86 Button *b;
87
88 if (!m)
89 return NULL;
90
91 while ((session = hashmap_first(m->sessions)))
92 session_free(session);
93
94 while ((u = hashmap_first(m->users)))
95 user_free(u);
96
97 while ((d = hashmap_first(m->devices)))
98 device_free(d);
99
100 while ((s = hashmap_first(m->seats)))
101 seat_free(s);
102
103 while ((i = hashmap_first(m->inhibitors)))
104 inhibitor_free(i);
105
106 while ((b = hashmap_first(m->buttons)))
107 button_free(b);
108
109 hashmap_free(m->devices);
110 hashmap_free(m->seats);
111 hashmap_free(m->sessions);
112 hashmap_free(m->users);
113 hashmap_free(m->inhibitors);
114 hashmap_free(m->buttons);
115
116 hashmap_free(m->user_units);
117 hashmap_free(m->session_units);
118
119 sd_event_source_unref(m->idle_action_event_source);
120 sd_event_source_unref(m->inhibit_timeout_source);
121 sd_event_source_unref(m->scheduled_shutdown_timeout_source);
122 sd_event_source_unref(m->nologin_timeout_source);
123 sd_event_source_unref(m->wall_message_timeout_source);
124
125 sd_event_source_unref(m->console_active_event_source);
126 sd_event_source_unref(m->udev_seat_event_source);
127 sd_event_source_unref(m->udev_device_event_source);
128 sd_event_source_unref(m->udev_vcsa_event_source);
129 sd_event_source_unref(m->udev_button_event_source);
130 sd_event_source_unref(m->lid_switch_ignore_event_source);
131
132 safe_close(m->console_active_fd);
133
134 udev_monitor_unref(m->udev_seat_monitor);
135 udev_monitor_unref(m->udev_device_monitor);
136 udev_monitor_unref(m->udev_vcsa_monitor);
137 udev_monitor_unref(m->udev_button_monitor);
138
139 if (m->unlink_nologin)
140 (void) unlink_or_warn("/run/nologin");
141
142 bus_verify_polkit_async_registry_free(m->polkit_registry);
143
144 sd_bus_unref(m->bus);
145 sd_event_unref(m->event);
146
147 safe_close(m->reserve_vt_fd);
148
149 strv_free(m->kill_only_users);
150 strv_free(m->kill_exclude_users);
151
152 free(m->scheduled_shutdown_type);
153 free(m->scheduled_shutdown_tty);
154 free(m->wall_message);
155 free(m->action_job);
156
157 return mfree(m);
158 }
159
160 static int manager_enumerate_devices(Manager *m) {
161 _cleanup_(sd_device_enumerator_unrefp) sd_device_enumerator *e = NULL;
162 sd_device *d;
163 int r;
164
165 assert(m);
166
167 /* Loads devices from udev and creates seats for them as
168 * necessary */
169
170 r = sd_device_enumerator_new(&e);
171 if (r < 0)
172 return r;
173
174 r = sd_device_enumerator_add_match_tag(e, "master-of-seat");
175 if (r < 0)
176 return r;
177
178 FOREACH_DEVICE(e, d) {
179 int k;
180
181 k = manager_process_seat_device(m, d);
182 if (k < 0)
183 r = k;
184 }
185
186 return r;
187 }
188
189 static int manager_enumerate_buttons(Manager *m) {
190 _cleanup_(sd_device_enumerator_unrefp) sd_device_enumerator *e = NULL;
191 sd_device *d;
192 int r;
193
194 assert(m);
195
196 /* Loads buttons from udev */
197
198 if (manager_all_buttons_ignored(m))
199 return 0;
200
201 r = sd_device_enumerator_new(&e);
202 if (r < 0)
203 return r;
204
205 r = sd_device_enumerator_add_match_subsystem(e, "input", true);
206 if (r < 0)
207 return r;
208
209 r = sd_device_enumerator_add_match_tag(e, "power-switch");
210 if (r < 0)
211 return r;
212
213 FOREACH_DEVICE(e, d) {
214 int k;
215
216 k = manager_process_button_device(m, d);
217 if (k < 0)
218 r = k;
219 }
220
221 return r;
222 }
223
224 static int manager_enumerate_seats(Manager *m) {
225 _cleanup_closedir_ DIR *d = NULL;
226 struct dirent *de;
227 int r = 0;
228
229 assert(m);
230
231 /* This loads data about seats stored on disk, but does not
232 * actually create any seats. Removes data of seats that no
233 * longer exist. */
234
235 d = opendir("/run/systemd/seats");
236 if (!d) {
237 if (errno == ENOENT)
238 return 0;
239
240 return log_error_errno(errno, "Failed to open /run/systemd/seats: %m");
241 }
242
243 FOREACH_DIRENT(de, d, return -errno) {
244 Seat *s;
245 int k;
246
247 if (!dirent_is_file(de))
248 continue;
249
250 s = hashmap_get(m->seats, de->d_name);
251 if (!s) {
252 if (unlinkat(dirfd(d), de->d_name, 0) < 0)
253 log_warning("Failed to remove /run/systemd/seats/%s: %m",
254 de->d_name);
255 continue;
256 }
257
258 k = seat_load(s);
259 if (k < 0)
260 r = k;
261 }
262
263 return r;
264 }
265
266 static int manager_enumerate_linger_users(Manager *m) {
267 _cleanup_closedir_ DIR *d = NULL;
268 struct dirent *de;
269 int r = 0;
270
271 assert(m);
272
273 d = opendir("/var/lib/systemd/linger");
274 if (!d) {
275 if (errno == ENOENT)
276 return 0;
277
278 return log_error_errno(errno, "Failed to open /var/lib/systemd/linger/: %m");
279 }
280
281 FOREACH_DIRENT(de, d, return -errno) {
282 int k;
283
284 if (!dirent_is_file(de))
285 continue;
286
287 k = manager_add_user_by_name(m, de->d_name, NULL);
288 if (k < 0) {
289 log_notice_errno(k, "Couldn't add lingering user %s: %m", de->d_name);
290 r = k;
291 }
292 }
293
294 return r;
295 }
296
297 static int manager_enumerate_users(Manager *m) {
298 _cleanup_closedir_ DIR *d = NULL;
299 struct dirent *de;
300 int r, k;
301
302 assert(m);
303
304 /* Add lingering users */
305 r = manager_enumerate_linger_users(m);
306
307 /* Read in user data stored on disk */
308 d = opendir("/run/systemd/users");
309 if (!d) {
310 if (errno == ENOENT)
311 return 0;
312
313 return log_error_errno(errno, "Failed to open /run/systemd/users: %m");
314 }
315
316 FOREACH_DIRENT(de, d, return -errno) {
317 User *u;
318
319 if (!dirent_is_file(de))
320 continue;
321
322 k = manager_add_user_by_name(m, de->d_name, &u);
323 if (k < 0) {
324 log_error_errno(k, "Failed to add user by file name %s: %m", de->d_name);
325
326 r = k;
327 continue;
328 }
329
330 user_add_to_gc_queue(u);
331
332 k = user_load(u);
333 if (k < 0)
334 r = k;
335 }
336
337 return r;
338 }
339
340 static int parse_fdname(const char *fdname, char **session_id, dev_t *dev) {
341 _cleanup_strv_free_ char **parts = NULL;
342 _cleanup_free_ char *id = NULL;
343 unsigned int major, minor;
344 int r;
345
346 parts = strv_split(fdname, "-");
347 if (!parts)
348 return -ENOMEM;
349 if (strv_length(parts) != 5)
350 return -EINVAL;
351
352 if (!streq(parts[0], "session"))
353 return -EINVAL;
354
355 id = strdup(parts[1]);
356 if (!id)
357 return -ENOMEM;
358
359 if (!streq(parts[2], "device"))
360 return -EINVAL;
361
362 r = safe_atou(parts[3], &major);
363 if (r < 0)
364 return r;
365 r = safe_atou(parts[4], &minor);
366 if (r < 0)
367 return r;
368
369 *dev = makedev(major, minor);
370 *session_id = TAKE_PTR(id);
371
372 return 0;
373 }
374
375 static int manager_attach_fds(Manager *m) {
376 _cleanup_strv_free_ char **fdnames = NULL;
377 int n, i, fd;
378
379 /* Upon restart, PID1 will send us back all fds of session devices
380 * that we previously opened. Each file descriptor is associated
381 * with a given session. The session ids are passed through FDNAMES. */
382
383 n = sd_listen_fds_with_names(true, &fdnames);
384 if (n <= 0)
385 return n;
386
387 for (i = 0; i < n; i++) {
388 _cleanup_free_ char *id = NULL;
389 dev_t dev;
390 struct stat st;
391 SessionDevice *sd;
392 Session *s;
393 int r;
394
395 fd = SD_LISTEN_FDS_START + i;
396
397 r = parse_fdname(fdnames[i], &id, &dev);
398 if (r < 0) {
399 log_debug_errno(r, "Failed to parse fd name %s: %m", fdnames[i]);
400 close_nointr(fd);
401 continue;
402 }
403
404 s = hashmap_get(m->sessions, id);
405 if (!s) {
406 /* If the session doesn't exist anymore, the associated session
407 * device attached to this fd doesn't either. Let's simply close
408 * this fd. */
409 log_debug("Failed to attach fd for unknown session: %s", id);
410 close_nointr(fd);
411 continue;
412 }
413
414 if (fstat(fd, &st) < 0) {
415 /* The device is allowed to go away at a random point, in which
416 * case fstat failing is expected. */
417 log_debug_errno(errno, "Failed to stat device fd for session %s: %m", id);
418 close_nointr(fd);
419 continue;
420 }
421
422 if (!S_ISCHR(st.st_mode) || st.st_rdev != dev) {
423 log_debug("Device fd doesn't point to the expected character device node");
424 close_nointr(fd);
425 continue;
426 }
427
428 sd = hashmap_get(s->devices, &dev);
429 if (!sd) {
430 /* Weird, we got an fd for a session device which wasn't
431 * recorded in the session state file... */
432 log_warning("Got fd for missing session device [%u:%u] in session %s",
433 major(dev), minor(dev), s->id);
434 close_nointr(fd);
435 continue;
436 }
437
438 log_debug("Attaching fd to session device [%u:%u] for session %s",
439 major(dev), minor(dev), s->id);
440
441 session_device_attach_fd(sd, fd, s->was_active);
442 }
443
444 return 0;
445 }
446
447 static int manager_enumerate_sessions(Manager *m) {
448 _cleanup_closedir_ DIR *d = NULL;
449 struct dirent *de;
450 int r = 0, k;
451
452 assert(m);
453
454 /* Read in session data stored on disk */
455 d = opendir("/run/systemd/sessions");
456 if (!d) {
457 if (errno == ENOENT)
458 return 0;
459
460 return log_error_errno(errno, "Failed to open /run/systemd/sessions: %m");
461 }
462
463 FOREACH_DIRENT(de, d, return -errno) {
464 struct Session *s;
465
466 if (!dirent_is_file(de))
467 continue;
468
469 if (!session_id_valid(de->d_name)) {
470 log_warning("Invalid session file name '%s', ignoring.", de->d_name);
471 r = -EINVAL;
472 continue;
473 }
474
475 k = manager_add_session(m, de->d_name, &s);
476 if (k < 0) {
477 log_error_errno(k, "Failed to add session by file name %s: %m", de->d_name);
478 r = k;
479 continue;
480 }
481
482 session_add_to_gc_queue(s);
483
484 k = session_load(s);
485 if (k < 0)
486 r = k;
487 }
488
489 /* We might be restarted and PID1 could have sent us back the
490 * session device fds we previously saved. */
491 k = manager_attach_fds(m);
492 if (k < 0)
493 log_warning_errno(k, "Failed to reattach session device fds: %m");
494
495 return r;
496 }
497
498 static int manager_enumerate_inhibitors(Manager *m) {
499 _cleanup_closedir_ DIR *d = NULL;
500 struct dirent *de;
501 int r = 0;
502
503 assert(m);
504
505 d = opendir("/run/systemd/inhibit");
506 if (!d) {
507 if (errno == ENOENT)
508 return 0;
509
510 return log_error_errno(errno, "Failed to open /run/systemd/inhibit: %m");
511 }
512
513 FOREACH_DIRENT(de, d, return -errno) {
514 int k;
515 Inhibitor *i;
516
517 if (!dirent_is_file(de))
518 continue;
519
520 k = manager_add_inhibitor(m, de->d_name, &i);
521 if (k < 0) {
522 log_notice_errno(k, "Couldn't add inhibitor %s: %m", de->d_name);
523 r = k;
524 continue;
525 }
526
527 k = inhibitor_load(i);
528 if (k < 0)
529 r = k;
530 }
531
532 return r;
533 }
534
535 static int manager_dispatch_seat_udev(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
536 _cleanup_(sd_device_unrefp) sd_device *d = NULL;
537 Manager *m = userdata;
538 int r;
539
540 assert(m);
541
542 r = udev_monitor_receive_sd_device(m->udev_seat_monitor, &d);
543 if (r < 0)
544 return r;
545
546 manager_process_seat_device(m, d);
547 return 0;
548 }
549
550 static int manager_dispatch_device_udev(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
551 _cleanup_(sd_device_unrefp) sd_device *d = NULL;
552 Manager *m = userdata;
553 int r;
554
555 assert(m);
556
557 r = udev_monitor_receive_sd_device(m->udev_device_monitor, &d);
558 if (r < 0)
559 return r;
560
561 manager_process_seat_device(m, d);
562 return 0;
563 }
564
565 static int manager_dispatch_vcsa_udev(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
566 _cleanup_(sd_device_unrefp) sd_device *d = NULL;
567 Manager *m = userdata;
568 const char *name, *action;
569 int r;
570
571 assert(m);
572
573 r = udev_monitor_receive_sd_device(m->udev_vcsa_monitor, &d);
574 if (r < 0)
575 return r;
576
577 /* Whenever a VCSA device is removed try to reallocate our
578 * VTs, to make sure our auto VTs never go away. */
579
580 if (sd_device_get_sysname(d, &name) >= 0 &&
581 startswith(name, "vcsa") &&
582 sd_device_get_property_value(d, "ACTION", &action) >= 0 &&
583 streq(action, "remove"))
584 seat_preallocate_vts(m->seat0);
585
586 return 0;
587 }
588
589 static int manager_dispatch_button_udev(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
590 _cleanup_(sd_device_unrefp) sd_device *d = NULL;
591 Manager *m = userdata;
592 int r;
593
594 assert(m);
595
596 r = udev_monitor_receive_sd_device(m->udev_button_monitor, &d);
597 if (r < 0)
598 return r;
599
600 manager_process_button_device(m, d);
601 return 0;
602 }
603
604 static int manager_dispatch_console(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
605 Manager *m = userdata;
606
607 assert(m);
608 assert(m->seat0);
609 assert(m->console_active_fd == fd);
610
611 seat_read_active_vt(m->seat0);
612 return 0;
613 }
614
615 static int manager_reserve_vt(Manager *m) {
616 _cleanup_free_ char *p = NULL;
617
618 assert(m);
619
620 if (m->reserve_vt <= 0)
621 return 0;
622
623 if (asprintf(&p, "/dev/tty%u", m->reserve_vt) < 0)
624 return log_oom();
625
626 m->reserve_vt_fd = open(p, O_RDWR|O_NOCTTY|O_CLOEXEC|O_NONBLOCK);
627 if (m->reserve_vt_fd < 0) {
628
629 /* Don't complain on VT-less systems */
630 if (errno != ENOENT)
631 log_warning_errno(errno, "Failed to pin reserved VT: %m");
632 return -errno;
633 }
634
635 return 0;
636 }
637
638 static int manager_connect_bus(Manager *m) {
639 int r;
640
641 assert(m);
642 assert(!m->bus);
643
644 r = sd_bus_default_system(&m->bus);
645 if (r < 0)
646 return log_error_errno(r, "Failed to connect to system bus: %m");
647
648 r = sd_bus_add_object_vtable(m->bus, NULL, "/org/freedesktop/login1", "org.freedesktop.login1.Manager", manager_vtable, m);
649 if (r < 0)
650 return log_error_errno(r, "Failed to add manager object vtable: %m");
651
652 r = sd_bus_add_fallback_vtable(m->bus, NULL, "/org/freedesktop/login1/seat", "org.freedesktop.login1.Seat", seat_vtable, seat_object_find, m);
653 if (r < 0)
654 return log_error_errno(r, "Failed to add seat object vtable: %m");
655
656 r = sd_bus_add_node_enumerator(m->bus, NULL, "/org/freedesktop/login1/seat", seat_node_enumerator, m);
657 if (r < 0)
658 return log_error_errno(r, "Failed to add seat enumerator: %m");
659
660 r = sd_bus_add_fallback_vtable(m->bus, NULL, "/org/freedesktop/login1/session", "org.freedesktop.login1.Session", session_vtable, session_object_find, m);
661 if (r < 0)
662 return log_error_errno(r, "Failed to add session object vtable: %m");
663
664 r = sd_bus_add_node_enumerator(m->bus, NULL, "/org/freedesktop/login1/session", session_node_enumerator, m);
665 if (r < 0)
666 return log_error_errno(r, "Failed to add session enumerator: %m");
667
668 r = sd_bus_add_fallback_vtable(m->bus, NULL, "/org/freedesktop/login1/user", "org.freedesktop.login1.User", user_vtable, user_object_find, m);
669 if (r < 0)
670 return log_error_errno(r, "Failed to add user object vtable: %m");
671
672 r = sd_bus_add_node_enumerator(m->bus, NULL, "/org/freedesktop/login1/user", user_node_enumerator, m);
673 if (r < 0)
674 return log_error_errno(r, "Failed to add user enumerator: %m");
675
676 r = sd_bus_match_signal_async(
677 m->bus,
678 NULL,
679 "org.freedesktop.systemd1",
680 "/org/freedesktop/systemd1",
681 "org.freedesktop.systemd1.Manager",
682 "JobRemoved",
683 match_job_removed, NULL, m);
684 if (r < 0)
685 return log_error_errno(r, "Failed to request match for JobRemoved: %m");
686
687 r = sd_bus_match_signal_async(
688 m->bus,
689 NULL,
690 "org.freedesktop.systemd1",
691 "/org/freedesktop/systemd1",
692 "org.freedesktop.systemd1.Manager",
693 "UnitRemoved",
694 match_unit_removed, NULL, m);
695 if (r < 0)
696 return log_error_errno(r, "Failed to request match for UnitRemoved: %m");
697
698 r = sd_bus_match_signal_async(
699 m->bus,
700 NULL,
701 "org.freedesktop.systemd1",
702 NULL,
703 "org.freedesktop.DBus.Properties",
704 "PropertiesChanged",
705 match_properties_changed, NULL, m);
706 if (r < 0)
707 return log_error_errno(r, "Failed to request match for PropertiesChanged: %m");
708
709 r = sd_bus_match_signal_async(
710 m->bus,
711 NULL,
712 "org.freedesktop.systemd1",
713 "/org/freedesktop/systemd1",
714 "org.freedesktop.systemd1.Manager",
715 "Reloading",
716 match_reloading, NULL, m);
717 if (r < 0)
718 return log_error_errno(r, "Failed to request match for Reloading: %m");
719
720 r = sd_bus_call_method_async(
721 m->bus,
722 NULL,
723 "org.freedesktop.systemd1",
724 "/org/freedesktop/systemd1",
725 "org.freedesktop.systemd1.Manager",
726 "Subscribe",
727 NULL, NULL,
728 NULL);
729 if (r < 0)
730 return log_error_errno(r, "Failed to enable subscription: %m");
731
732 r = sd_bus_request_name_async(m->bus, NULL, "org.freedesktop.login1", 0, NULL, NULL);
733 if (r < 0)
734 return log_error_errno(r, "Failed to request name: %m");
735
736 r = sd_bus_attach_event(m->bus, m->event, SD_EVENT_PRIORITY_NORMAL);
737 if (r < 0)
738 return log_error_errno(r, "Failed to attach bus to event loop: %m");
739
740 return 0;
741 }
742
743 static int manager_vt_switch(sd_event_source *src, const struct signalfd_siginfo *si, void *data) {
744 Manager *m = data;
745 Session *active, *iter;
746
747 /*
748 * We got a VT-switch signal and we have to acknowledge it immediately.
749 * Preferably, we'd just use m->seat0->active->vtfd, but unfortunately,
750 * old user-space might run multiple sessions on a single VT, *sigh*.
751 * Therefore, we have to iterate all sessions and find one with a vtfd
752 * on the requested VT.
753 * As only VTs with active controllers have VT_PROCESS set, our current
754 * notion of the active VT might be wrong (for instance if the switch
755 * happens while we setup VT_PROCESS). Therefore, read the current VT
756 * first and then use s->active->vtnr as reference. Note that this is
757 * not racy, as no further VT-switch can happen as long as we're in
758 * synchronous VT_PROCESS mode.
759 */
760
761 assert(m->seat0);
762 seat_read_active_vt(m->seat0);
763
764 active = m->seat0->active;
765 if (!active || active->vtnr < 1) {
766 log_warning("Received VT_PROCESS signal without a registered session on that VT.");
767 return 0;
768 }
769
770 if (active->vtfd >= 0) {
771 session_leave_vt(active);
772 } else {
773 LIST_FOREACH(sessions_by_seat, iter, m->seat0->sessions) {
774 if (iter->vtnr == active->vtnr && iter->vtfd >= 0) {
775 session_leave_vt(iter);
776 break;
777 }
778 }
779 }
780
781 return 0;
782 }
783
784 static int manager_connect_console(Manager *m) {
785 int r;
786
787 assert(m);
788 assert(m->console_active_fd < 0);
789
790 /* On certain architectures (S390 and Xen, and containers),
791 /dev/tty0 does not exist, so don't fail if we can't open
792 it. */
793 if (access("/dev/tty0", F_OK) < 0)
794 return 0;
795
796 m->console_active_fd = open("/sys/class/tty/tty0/active", O_RDONLY|O_NOCTTY|O_CLOEXEC);
797 if (m->console_active_fd < 0) {
798
799 /* On some systems the device node /dev/tty0 may exist
800 * even though /sys/class/tty/tty0 does not. */
801 if (errno == ENOENT)
802 return 0;
803
804 return log_error_errno(errno, "Failed to open /sys/class/tty/tty0/active: %m");
805 }
806
807 r = sd_event_add_io(m->event, &m->console_active_event_source, m->console_active_fd, 0, manager_dispatch_console, m);
808 if (r < 0) {
809 log_error("Failed to watch foreground console");
810 return r;
811 }
812
813 /*
814 * SIGRTMIN is used as global VT-release signal, SIGRTMIN + 1 is used
815 * as VT-acquire signal. We ignore any acquire-events (yes, we still
816 * have to provide a valid signal-number for it!) and acknowledge all
817 * release events immediately.
818 */
819
820 if (SIGRTMIN + 1 > SIGRTMAX) {
821 log_error("Not enough real-time signals available: %u-%u", SIGRTMIN, SIGRTMAX);
822 return -EINVAL;
823 }
824
825 assert_se(ignore_signals(SIGRTMIN + 1, -1) >= 0);
826 assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGRTMIN, -1) >= 0);
827
828 r = sd_event_add_signal(m->event, NULL, SIGRTMIN, manager_vt_switch, m);
829 if (r < 0)
830 return r;
831
832 return 0;
833 }
834
835 static int manager_connect_udev(Manager *m) {
836 int r;
837
838 assert(m);
839 assert(!m->udev_seat_monitor);
840 assert(!m->udev_device_monitor);
841 assert(!m->udev_vcsa_monitor);
842 assert(!m->udev_button_monitor);
843
844 m->udev_seat_monitor = udev_monitor_new_from_netlink(NULL, "udev");
845 if (!m->udev_seat_monitor)
846 return -ENOMEM;
847
848 r = udev_monitor_filter_add_match_tag(m->udev_seat_monitor, "master-of-seat");
849 if (r < 0)
850 return r;
851
852 r = udev_monitor_enable_receiving(m->udev_seat_monitor);
853 if (r < 0)
854 return r;
855
856 r = sd_event_add_io(m->event, &m->udev_seat_event_source, udev_monitor_get_fd(m->udev_seat_monitor), EPOLLIN, manager_dispatch_seat_udev, m);
857 if (r < 0)
858 return r;
859
860 m->udev_device_monitor = udev_monitor_new_from_netlink(NULL, "udev");
861 if (!m->udev_device_monitor)
862 return -ENOMEM;
863
864 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_device_monitor, "input", NULL);
865 if (r < 0)
866 return r;
867
868 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_device_monitor, "graphics", NULL);
869 if (r < 0)
870 return r;
871
872 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_device_monitor, "drm", NULL);
873 if (r < 0)
874 return r;
875
876 r = udev_monitor_enable_receiving(m->udev_device_monitor);
877 if (r < 0)
878 return r;
879
880 r = sd_event_add_io(m->event, &m->udev_device_event_source, udev_monitor_get_fd(m->udev_device_monitor), EPOLLIN, manager_dispatch_device_udev, m);
881 if (r < 0)
882 return r;
883
884 /* Don't watch keys if nobody cares */
885 if (!manager_all_buttons_ignored(m)) {
886 m->udev_button_monitor = udev_monitor_new_from_netlink(NULL, "udev");
887 if (!m->udev_button_monitor)
888 return -ENOMEM;
889
890 r = udev_monitor_filter_add_match_tag(m->udev_button_monitor, "power-switch");
891 if (r < 0)
892 return r;
893
894 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_button_monitor, "input", NULL);
895 if (r < 0)
896 return r;
897
898 r = udev_monitor_enable_receiving(m->udev_button_monitor);
899 if (r < 0)
900 return r;
901
902 r = sd_event_add_io(m->event, &m->udev_button_event_source, udev_monitor_get_fd(m->udev_button_monitor), EPOLLIN, manager_dispatch_button_udev, m);
903 if (r < 0)
904 return r;
905 }
906
907 /* Don't bother watching VCSA devices, if nobody cares */
908 if (m->n_autovts > 0 && m->console_active_fd >= 0) {
909
910 m->udev_vcsa_monitor = udev_monitor_new_from_netlink(NULL, "udev");
911 if (!m->udev_vcsa_monitor)
912 return -ENOMEM;
913
914 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_vcsa_monitor, "vc", NULL);
915 if (r < 0)
916 return r;
917
918 r = udev_monitor_enable_receiving(m->udev_vcsa_monitor);
919 if (r < 0)
920 return r;
921
922 r = sd_event_add_io(m->event, &m->udev_vcsa_event_source, udev_monitor_get_fd(m->udev_vcsa_monitor), EPOLLIN, manager_dispatch_vcsa_udev, m);
923 if (r < 0)
924 return r;
925 }
926
927 return 0;
928 }
929
930 static void manager_gc(Manager *m, bool drop_not_started) {
931 Seat *seat;
932 Session *session;
933 User *user;
934
935 assert(m);
936
937 while ((seat = m->seat_gc_queue)) {
938 LIST_REMOVE(gc_queue, m->seat_gc_queue, seat);
939 seat->in_gc_queue = false;
940
941 if (seat_may_gc(seat, drop_not_started)) {
942 seat_stop(seat, false);
943 seat_free(seat);
944 }
945 }
946
947 while ((session = m->session_gc_queue)) {
948 LIST_REMOVE(gc_queue, m->session_gc_queue, session);
949 session->in_gc_queue = false;
950
951 /* First, if we are not closing yet, initiate stopping */
952 if (session_may_gc(session, drop_not_started) &&
953 session_get_state(session) != SESSION_CLOSING)
954 session_stop(session, false);
955
956 /* Normally, this should make the session referenced
957 * again, if it doesn't then let's get rid of it
958 * immediately */
959 if (session_may_gc(session, drop_not_started)) {
960 session_finalize(session);
961 session_free(session);
962 }
963 }
964
965 while ((user = m->user_gc_queue)) {
966 LIST_REMOVE(gc_queue, m->user_gc_queue, user);
967 user->in_gc_queue = false;
968
969 /* First step: queue stop jobs */
970 if (user_may_gc(user, drop_not_started))
971 user_stop(user, false);
972
973 /* Second step: finalize user */
974 if (user_may_gc(user, drop_not_started)) {
975 user_finalize(user);
976 user_free(user);
977 }
978 }
979 }
980
981 static int manager_dispatch_idle_action(sd_event_source *s, uint64_t t, void *userdata) {
982 Manager *m = userdata;
983 struct dual_timestamp since;
984 usec_t n, elapse;
985 int r;
986
987 assert(m);
988
989 if (m->idle_action == HANDLE_IGNORE ||
990 m->idle_action_usec <= 0)
991 return 0;
992
993 n = now(CLOCK_MONOTONIC);
994
995 r = manager_get_idle_hint(m, &since);
996 if (r <= 0)
997 /* Not idle. Let's check if after a timeout it might be idle then. */
998 elapse = n + m->idle_action_usec;
999 else {
1000 /* Idle! Let's see if it's time to do something, or if
1001 * we shall sleep for longer. */
1002
1003 if (n >= since.monotonic + m->idle_action_usec &&
1004 (m->idle_action_not_before_usec <= 0 || n >= m->idle_action_not_before_usec + m->idle_action_usec)) {
1005 log_info("System idle. Taking action.");
1006
1007 manager_handle_action(m, 0, m->idle_action, false, false);
1008 m->idle_action_not_before_usec = n;
1009 }
1010
1011 elapse = MAX(since.monotonic, m->idle_action_not_before_usec) + m->idle_action_usec;
1012 }
1013
1014 if (!m->idle_action_event_source) {
1015
1016 r = sd_event_add_time(
1017 m->event,
1018 &m->idle_action_event_source,
1019 CLOCK_MONOTONIC,
1020 elapse, USEC_PER_SEC*30,
1021 manager_dispatch_idle_action, m);
1022 if (r < 0)
1023 return log_error_errno(r, "Failed to add idle event source: %m");
1024
1025 r = sd_event_source_set_priority(m->idle_action_event_source, SD_EVENT_PRIORITY_IDLE+10);
1026 if (r < 0)
1027 return log_error_errno(r, "Failed to set idle event source priority: %m");
1028 } else {
1029 r = sd_event_source_set_time(m->idle_action_event_source, elapse);
1030 if (r < 0)
1031 return log_error_errno(r, "Failed to set idle event timer: %m");
1032
1033 r = sd_event_source_set_enabled(m->idle_action_event_source, SD_EVENT_ONESHOT);
1034 if (r < 0)
1035 return log_error_errno(r, "Failed to enable idle event timer: %m");
1036 }
1037
1038 return 0;
1039 }
1040
1041 static int manager_dispatch_reload_signal(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
1042 Manager *m = userdata;
1043 int r;
1044
1045 manager_reset_config(m);
1046 r = manager_parse_config_file(m);
1047 if (r < 0)
1048 log_warning_errno(r, "Failed to parse config file, using defaults: %m");
1049 else
1050 log_info("Config file reloaded.");
1051
1052 return 0;
1053 }
1054
1055 static int manager_startup(Manager *m) {
1056 int r;
1057 Seat *seat;
1058 Session *session;
1059 User *user;
1060 Button *button;
1061 Inhibitor *inhibitor;
1062 Iterator i;
1063
1064 assert(m);
1065
1066 r = sd_event_add_signal(m->event, NULL, SIGHUP, manager_dispatch_reload_signal, m);
1067 if (r < 0)
1068 return log_error_errno(r, "Failed to register SIGHUP handler: %m");
1069
1070 /* Connect to console */
1071 r = manager_connect_console(m);
1072 if (r < 0)
1073 return r;
1074
1075 /* Connect to udev */
1076 r = manager_connect_udev(m);
1077 if (r < 0)
1078 return log_error_errno(r, "Failed to create udev watchers: %m");
1079
1080 /* Connect to the bus */
1081 r = manager_connect_bus(m);
1082 if (r < 0)
1083 return r;
1084
1085 /* Instantiate magic seat 0 */
1086 r = manager_add_seat(m, "seat0", &m->seat0);
1087 if (r < 0)
1088 return log_error_errno(r, "Failed to add seat0: %m");
1089
1090 r = manager_set_lid_switch_ignore(m, 0 + m->holdoff_timeout_usec);
1091 if (r < 0)
1092 log_warning_errno(r, "Failed to set up lid switch ignore event source: %m");
1093
1094 /* Deserialize state */
1095 r = manager_enumerate_devices(m);
1096 if (r < 0)
1097 log_warning_errno(r, "Device enumeration failed: %m");
1098
1099 r = manager_enumerate_seats(m);
1100 if (r < 0)
1101 log_warning_errno(r, "Seat enumeration failed: %m");
1102
1103 r = manager_enumerate_users(m);
1104 if (r < 0)
1105 log_warning_errno(r, "User enumeration failed: %m");
1106
1107 r = manager_enumerate_sessions(m);
1108 if (r < 0)
1109 log_warning_errno(r, "Session enumeration failed: %m");
1110
1111 r = manager_enumerate_inhibitors(m);
1112 if (r < 0)
1113 log_warning_errno(r, "Inhibitor enumeration failed: %m");
1114
1115 r = manager_enumerate_buttons(m);
1116 if (r < 0)
1117 log_warning_errno(r, "Button enumeration failed: %m");
1118
1119 /* Remove stale objects before we start them */
1120 manager_gc(m, false);
1121
1122 /* Reserve the special reserved VT */
1123 manager_reserve_vt(m);
1124
1125 /* And start everything */
1126 HASHMAP_FOREACH(seat, m->seats, i)
1127 seat_start(seat);
1128
1129 HASHMAP_FOREACH(user, m->users, i)
1130 user_start(user);
1131
1132 HASHMAP_FOREACH(session, m->sessions, i)
1133 session_start(session, NULL);
1134
1135 HASHMAP_FOREACH(inhibitor, m->inhibitors, i)
1136 inhibitor_start(inhibitor);
1137
1138 HASHMAP_FOREACH(button, m->buttons, i)
1139 button_check_switches(button);
1140
1141 manager_dispatch_idle_action(NULL, 0, m);
1142
1143 return 0;
1144 }
1145
1146 static int manager_run(Manager *m) {
1147 int r;
1148
1149 assert(m);
1150
1151 for (;;) {
1152 r = sd_event_get_state(m->event);
1153 if (r < 0)
1154 return r;
1155 if (r == SD_EVENT_FINISHED)
1156 return 0;
1157
1158 manager_gc(m, true);
1159
1160 r = manager_dispatch_delayed(m, false);
1161 if (r < 0)
1162 return r;
1163 if (r > 0)
1164 continue;
1165
1166 r = sd_event_run(m->event, (uint64_t) -1);
1167 if (r < 0)
1168 return r;
1169 }
1170 }
1171
1172 int main(int argc, char *argv[]) {
1173 _cleanup_(manager_unrefp) Manager *m = NULL;
1174 int r;
1175
1176 log_set_target(LOG_TARGET_AUTO);
1177 log_set_facility(LOG_AUTH);
1178 log_parse_environment();
1179 log_open();
1180
1181 umask(0022);
1182
1183 if (argc != 1) {
1184 log_error("This program takes no arguments.");
1185 r = -EINVAL;
1186 goto finish;
1187 }
1188
1189 r = mac_selinux_init();
1190 if (r < 0) {
1191 log_error_errno(r, "Could not initialize labelling: %m");
1192 goto finish;
1193 }
1194
1195 /* Always create the directories people can create inotify watches in. Note that some applications might check
1196 * for the existence of /run/systemd/seats/ to determine whether logind is available, so please always make
1197 * sure these directories are created early on and unconditionally. */
1198 (void) mkdir_label("/run/systemd/seats", 0755);
1199 (void) mkdir_label("/run/systemd/users", 0755);
1200 (void) mkdir_label("/run/systemd/sessions", 0755);
1201
1202 assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGHUP, SIGTERM, SIGINT, -1) >= 0);
1203
1204 r = manager_new(&m);
1205 if (r < 0) {
1206 log_error_errno(r, "Failed to allocate manager object: %m");
1207 goto finish;
1208 }
1209
1210 (void) manager_parse_config_file(m);
1211
1212 r = manager_startup(m);
1213 if (r < 0) {
1214 log_error_errno(r, "Failed to fully start up daemon: %m");
1215 goto finish;
1216 }
1217
1218 log_debug("systemd-logind running as pid "PID_FMT, getpid_cached());
1219
1220 (void) sd_notify(false,
1221 "READY=1\n"
1222 "STATUS=Processing requests...");
1223
1224 r = manager_run(m);
1225
1226 log_debug("systemd-logind stopped as pid "PID_FMT, getpid_cached());
1227
1228 (void) sd_notify(false,
1229 "STOPPING=1\n"
1230 "STATUS=Shutting down...");
1231
1232 finish:
1233 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
1234 }