1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2011 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
28 #include <sys/timerfd.h>
30 #include "sd-daemon.h"
32 #include "conf-parser.h"
35 #include "bus-error.h"
37 #include "udev-util.h"
39 Manager *manager_new(void) {
47 m->console_active_fd = -1;
48 m->reserve_vt_fd = -1;
52 m->inhibit_delay_max = 5 * USEC_PER_SEC;
53 m->handle_power_key = HANDLE_POWEROFF;
54 m->handle_suspend_key = HANDLE_SUSPEND;
55 m->handle_hibernate_key = HANDLE_HIBERNATE;
56 m->handle_lid_switch = HANDLE_SUSPEND;
57 m->lid_switch_ignore_inhibited = true;
59 m->idle_action_usec = 30 * USEC_PER_MINUTE;
60 m->idle_action = HANDLE_IGNORE;
61 m->idle_action_not_before_usec = now(CLOCK_MONOTONIC);
63 m->devices = hashmap_new(string_hash_func, string_compare_func);
64 m->seats = hashmap_new(string_hash_func, string_compare_func);
65 m->sessions = hashmap_new(string_hash_func, string_compare_func);
66 m->users = hashmap_new(trivial_hash_func, trivial_compare_func);
67 m->inhibitors = hashmap_new(string_hash_func, string_compare_func);
68 m->buttons = hashmap_new(string_hash_func, string_compare_func);
70 m->user_units = hashmap_new(string_hash_func, string_compare_func);
71 m->session_units = hashmap_new(string_hash_func, string_compare_func);
73 m->busnames = set_new(string_hash_func, string_compare_func);
75 if (!m->devices || !m->seats || !m->sessions || !m->users || !m->inhibitors || !m->buttons || !m->busnames ||
76 !m->user_units || !m->session_units) {
81 m->kill_exclude_users = strv_new("root", NULL);
82 if (!m->kill_exclude_users) {
93 r = sd_event_default(&m->event);
99 sd_event_set_watchdog(m->event, true);
104 void manager_free(Manager *m) {
114 while ((session = hashmap_first(m->sessions)))
115 session_free(session);
117 while ((u = hashmap_first(m->users)))
120 while ((d = hashmap_first(m->devices)))
123 while ((s = hashmap_first(m->seats)))
126 while ((i = hashmap_first(m->inhibitors)))
129 while ((b = hashmap_first(m->buttons)))
132 hashmap_free(m->devices);
133 hashmap_free(m->seats);
134 hashmap_free(m->sessions);
135 hashmap_free(m->users);
136 hashmap_free(m->inhibitors);
137 hashmap_free(m->buttons);
139 hashmap_free(m->user_units);
140 hashmap_free(m->session_units);
142 set_free_free(m->busnames);
144 sd_event_source_unref(m->idle_action_event_source);
146 sd_event_source_unref(m->console_active_event_source);
147 sd_event_source_unref(m->udev_seat_event_source);
148 sd_event_source_unref(m->udev_device_event_source);
149 sd_event_source_unref(m->udev_vcsa_event_source);
150 sd_event_source_unref(m->udev_button_event_source);
152 if (m->console_active_fd >= 0)
153 close_nointr_nofail(m->console_active_fd);
155 if (m->udev_seat_monitor)
156 udev_monitor_unref(m->udev_seat_monitor);
157 if (m->udev_device_monitor)
158 udev_monitor_unref(m->udev_device_monitor);
159 if (m->udev_vcsa_monitor)
160 udev_monitor_unref(m->udev_vcsa_monitor);
161 if (m->udev_button_monitor)
162 udev_monitor_unref(m->udev_button_monitor);
167 bus_verify_polkit_async_registry_free(m->bus, m->polkit_registry);
169 sd_bus_unref(m->bus);
170 sd_event_unref(m->event);
172 if (m->reserve_vt_fd >= 0)
173 close_nointr_nofail(m->reserve_vt_fd);
175 strv_free(m->kill_only_users);
176 strv_free(m->kill_exclude_users);
182 static int manager_enumerate_devices(Manager *m) {
183 struct udev_list_entry *item = NULL, *first = NULL;
184 _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL;
189 /* Loads devices from udev and creates seats for them as
192 e = udev_enumerate_new(m->udev);
196 r = udev_enumerate_add_match_tag(e, "master-of-seat");
200 r = udev_enumerate_add_match_is_initialized(e);
204 r = udev_enumerate_scan_devices(e);
208 first = udev_enumerate_get_list_entry(e);
209 udev_list_entry_foreach(item, first) {
210 _cleanup_udev_device_unref_ struct udev_device *d = NULL;
213 d = udev_device_new_from_syspath(m->udev, udev_list_entry_get_name(item));
217 k = manager_process_seat_device(m, d);
225 static int manager_enumerate_buttons(Manager *m) {
226 _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL;
227 struct udev_list_entry *item = NULL, *first = NULL;
232 /* Loads buttons from udev */
234 if (m->handle_power_key == HANDLE_IGNORE &&
235 m->handle_suspend_key == HANDLE_IGNORE &&
236 m->handle_hibernate_key == HANDLE_IGNORE &&
237 m->handle_lid_switch == HANDLE_IGNORE)
240 e = udev_enumerate_new(m->udev);
244 r = udev_enumerate_add_match_subsystem(e, "input");
248 r = udev_enumerate_add_match_tag(e, "power-switch");
252 r = udev_enumerate_add_match_is_initialized(e);
256 r = udev_enumerate_scan_devices(e);
260 first = udev_enumerate_get_list_entry(e);
261 udev_list_entry_foreach(item, first) {
262 _cleanup_udev_device_unref_ struct udev_device *d = NULL;
265 d = udev_device_new_from_syspath(m->udev, udev_list_entry_get_name(item));
269 k = manager_process_button_device(m, d);
277 static int manager_enumerate_seats(Manager *m) {
278 _cleanup_closedir_ DIR *d = NULL;
284 /* This loads data about seats stored on disk, but does not
285 * actually create any seats. Removes data of seats that no
288 d = opendir("/run/systemd/seats");
293 log_error("Failed to open /run/systemd/seats: %m");
297 FOREACH_DIRENT(de, d, return -errno) {
301 if (!dirent_is_file(de))
304 s = hashmap_get(m->seats, de->d_name);
306 unlinkat(dirfd(d), de->d_name, 0);
318 static int manager_enumerate_linger_users(Manager *m) {
319 _cleanup_closedir_ DIR *d = NULL;
325 d = opendir("/var/lib/systemd/linger");
330 log_error("Failed to open /var/lib/systemd/linger/: %m");
334 FOREACH_DIRENT(de, d, return -errno) {
337 if (!dirent_is_file(de))
340 k = manager_add_user_by_name(m, de->d_name, NULL);
342 log_notice("Couldn't add lingering user %s: %s", de->d_name, strerror(-k));
350 static int manager_enumerate_users(Manager *m) {
351 _cleanup_closedir_ DIR *d = NULL;
357 /* Add lingering users */
358 r = manager_enumerate_linger_users(m);
360 /* Read in user data stored on disk */
361 d = opendir("/run/systemd/users");
366 log_error("Failed to open /run/systemd/users: %m");
370 FOREACH_DIRENT(de, d, return -errno) {
373 if (!dirent_is_file(de))
376 k = manager_add_user_by_name(m, de->d_name, &u);
378 log_error("Failed to add user by file name %s: %s", de->d_name, strerror(-k));
384 user_add_to_gc_queue(u);
394 static int manager_enumerate_sessions(Manager *m) {
395 _cleanup_closedir_ DIR *d = NULL;
401 /* Read in session data stored on disk */
402 d = opendir("/run/systemd/sessions");
407 log_error("Failed to open /run/systemd/sessions: %m");
411 FOREACH_DIRENT(de, d, return -errno) {
415 if (!dirent_is_file(de))
418 if (!session_id_valid(de->d_name)) {
419 log_warning("Invalid session file name '%s', ignoring.", de->d_name);
424 k = manager_add_session(m, de->d_name, &s);
426 log_error("Failed to add session by file name %s: %s", de->d_name, strerror(-k));
432 session_add_to_gc_queue(s);
442 static int manager_enumerate_inhibitors(Manager *m) {
443 _cleanup_closedir_ DIR *d = NULL;
449 d = opendir("/run/systemd/inhibit");
454 log_error("Failed to open /run/systemd/inhibit: %m");
458 FOREACH_DIRENT(de, d, return -errno) {
462 if (!dirent_is_file(de))
465 k = manager_add_inhibitor(m, de->d_name, &i);
467 log_notice("Couldn't add inhibitor %s: %s", de->d_name, strerror(-k));
472 k = inhibitor_load(i);
480 static int manager_dispatch_seat_udev(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
481 _cleanup_udev_device_unref_ struct udev_device *d = NULL;
482 Manager *m = userdata;
486 d = udev_monitor_receive_device(m->udev_seat_monitor);
490 manager_process_seat_device(m, d);
494 static int manager_dispatch_device_udev(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
495 _cleanup_udev_device_unref_ struct udev_device *d = NULL;
496 Manager *m = userdata;
500 d = udev_monitor_receive_device(m->udev_device_monitor);
504 manager_process_seat_device(m, d);
508 static int manager_dispatch_vcsa_udev(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
509 _cleanup_udev_device_unref_ struct udev_device *d = NULL;
510 Manager *m = userdata;
515 d = udev_monitor_receive_device(m->udev_vcsa_monitor);
519 name = udev_device_get_sysname(d);
521 /* Whenever a VCSA device is removed try to reallocate our
522 * VTs, to make sure our auto VTs never go away. */
524 if (name && startswith(name, "vcsa") && streq_ptr(udev_device_get_action(d), "remove"))
525 seat_preallocate_vts(m->seat0);
530 static int manager_dispatch_button_udev(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
531 _cleanup_udev_device_unref_ struct udev_device *d = NULL;
532 Manager *m = userdata;
536 d = udev_monitor_receive_device(m->udev_button_monitor);
540 manager_process_button_device(m, d);
544 static int manager_dispatch_console(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
545 Manager *m = userdata;
549 assert(m->console_active_fd == fd);
551 seat_read_active_vt(m->seat0);
555 static int manager_reserve_vt(Manager *m) {
556 _cleanup_free_ char *p = NULL;
560 if (m->reserve_vt <= 0)
563 if (asprintf(&p, "/dev/tty%u", m->reserve_vt) < 0)
566 m->reserve_vt_fd = open(p, O_RDWR|O_NOCTTY|O_CLOEXEC|O_NONBLOCK);
567 if (m->reserve_vt_fd < 0) {
569 /* Don't complain on VT-less systems */
571 log_warning("Failed to pin reserved VT: %m");
578 static int manager_connect_bus(Manager *m) {
579 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
585 r = sd_bus_default_system(&m->bus);
587 log_error("Failed to connect to system bus: %s", strerror(-r));
591 r = sd_bus_add_object_vtable(m->bus, "/org/freedesktop/login1", "org.freedesktop.login1.Manager", manager_vtable, m);
593 log_error("Failed to add manager object vtable: %s", strerror(-r));
597 r = sd_bus_add_fallback_vtable(m->bus, "/org/freedesktop/login1/seat", "org.freedesktop.login1.Seat", seat_vtable, seat_object_find, m);
599 log_error("Failed to add seat object vtable: %s", strerror(-r));
603 r = sd_bus_add_node_enumerator(m->bus, "/org/freedesktop/login1/seat", seat_node_enumerator, m);
605 log_error("Failed to add seat enumerator: %s", strerror(-r));
609 r = sd_bus_add_fallback_vtable(m->bus, "/org/freedesktop/login1/session", "org.freedesktop.login1.Session", session_vtable, session_object_find, m);
611 log_error("Failed to add session object vtable: %s", strerror(-r));
615 r = sd_bus_add_node_enumerator(m->bus, "/org/freedesktop/login1/session", session_node_enumerator, m);
617 log_error("Failed to add session enumerator: %s", strerror(-r));
621 r = sd_bus_add_fallback_vtable(m->bus, "/org/freedesktop/login1/user", "org.freedesktop.login1.User", user_vtable, user_object_find, m);
623 log_error("Failed to add user object vtable: %s", strerror(-r));
627 r = sd_bus_add_node_enumerator(m->bus, "/org/freedesktop/login1/user", user_node_enumerator, m);
629 log_error("Failed to add user enumerator: %s", strerror(-r));
633 r = sd_bus_add_match(m->bus,
635 "sender='org.freedesktop.DBus',"
636 "interface='org.freedesktop.DBus',"
637 "member='NameOwnerChanged',"
638 "path='/org/freedesktop/DBus'",
639 match_name_owner_changed, m);
641 log_error("Failed to add match for NameOwnerChanged: %s", strerror(-r));
645 r = sd_bus_add_match(m->bus,
647 "sender='org.freedesktop.systemd1',"
648 "interface='org.freedesktop.systemd1.Manager',"
649 "member='JobRemoved',"
650 "path='/org/freedesktop/systemd1'",
651 match_job_removed, m);
653 log_error("Failed to add match for JobRemoved: %s", strerror(-r));
657 r = sd_bus_add_match(m->bus,
659 "sender='org.freedesktop.systemd1',"
660 "interface='org.freedesktop.systemd1.Manager',"
661 "member='UnitRemoved',"
662 "path='/org/freedesktop/systemd1'",
663 match_unit_removed, m);
665 log_error("Failed to add match for UnitRemoved: %s", strerror(-r));
669 r = sd_bus_add_match(m->bus,
671 "sender='org.freedesktop.systemd1',"
672 "interface='org.freedesktop.DBus.Properties',"
673 "member='PropertiesChanged'",
674 match_properties_changed, m);
676 log_error("Failed to add match for PropertiesChanged: %s", strerror(-r));
680 r = sd_bus_add_match(m->bus,
682 "sender='org.freedesktop.systemd1',"
683 "interface='org.freedesktop.systemd1.Manager',"
684 "member='Reloading',"
685 "path='/org/freedesktop/systemd1'",
688 log_error("Failed to add match for Reloading: %s", strerror(-r));
692 r = sd_bus_call_method(
694 "org.freedesktop.systemd1",
695 "/org/freedesktop/systemd1",
696 "org.freedesktop.systemd1.Manager",
701 log_error("Failed to enable subscription: %s", bus_error_message(&error, r));
705 r = sd_bus_request_name(m->bus, "org.freedesktop.login1", 0);
707 log_error("Failed to register name: %s", strerror(-r));
711 r = sd_bus_attach_event(m->bus, m->event, 0);
713 log_error("Failed to attach bus to event loop: %s", strerror(-r));
720 static int manager_connect_console(Manager *m) {
724 assert(m->console_active_fd < 0);
726 /* On certain architectures (S390 and Xen, and containers),
727 /dev/tty0 does not exist, so don't fail if we can't open
729 if (access("/dev/tty0", F_OK) < 0)
732 m->console_active_fd = open("/sys/class/tty/tty0/active", O_RDONLY|O_NOCTTY|O_CLOEXEC);
733 if (m->console_active_fd < 0) {
735 /* On some systems the device node /dev/tty0 may exist
736 * even though /sys/class/tty/tty0 does not. */
740 log_error("Failed to open /sys/class/tty/tty0/active: %m");
744 r = sd_event_add_io(m->event, m->console_active_fd, 0, manager_dispatch_console, m, &m->console_active_event_source);
746 log_error("Failed to watch foreground console");
753 static int manager_connect_udev(Manager *m) {
757 assert(!m->udev_seat_monitor);
758 assert(!m->udev_device_monitor);
759 assert(!m->udev_vcsa_monitor);
760 assert(!m->udev_button_monitor);
762 m->udev_seat_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
763 if (!m->udev_seat_monitor)
766 r = udev_monitor_filter_add_match_tag(m->udev_seat_monitor, "master-of-seat");
770 r = udev_monitor_enable_receiving(m->udev_seat_monitor);
774 r = sd_event_add_io(m->event, udev_monitor_get_fd(m->udev_seat_monitor), EPOLLIN, manager_dispatch_seat_udev, m, &m->udev_seat_event_source);
778 m->udev_device_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
779 if (!m->udev_device_monitor)
782 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_device_monitor, "input", NULL);
786 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_device_monitor, "graphics", NULL);
790 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_device_monitor, "drm", NULL);
794 r = udev_monitor_enable_receiving(m->udev_device_monitor);
798 r = sd_event_add_io(m->event, udev_monitor_get_fd(m->udev_device_monitor), EPOLLIN, manager_dispatch_device_udev, m, &m->udev_device_event_source);
802 /* Don't watch keys if nobody cares */
803 if (m->handle_power_key != HANDLE_IGNORE ||
804 m->handle_suspend_key != HANDLE_IGNORE ||
805 m->handle_hibernate_key != HANDLE_IGNORE ||
806 m->handle_lid_switch != HANDLE_IGNORE) {
808 m->udev_button_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
809 if (!m->udev_button_monitor)
812 r = udev_monitor_filter_add_match_tag(m->udev_button_monitor, "power-switch");
816 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_button_monitor, "input", NULL);
820 r = udev_monitor_enable_receiving(m->udev_button_monitor);
824 r = sd_event_add_io(m->event, udev_monitor_get_fd(m->udev_button_monitor), EPOLLIN, manager_dispatch_button_udev, m, &m->udev_button_event_source);
829 /* Don't bother watching VCSA devices, if nobody cares */
830 if (m->n_autovts > 0 && m->console_active_fd >= 0) {
832 m->udev_vcsa_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
833 if (!m->udev_vcsa_monitor)
836 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_vcsa_monitor, "vc", NULL);
840 r = udev_monitor_enable_receiving(m->udev_vcsa_monitor);
844 r = sd_event_add_io(m->event, udev_monitor_get_fd(m->udev_vcsa_monitor), EPOLLIN, manager_dispatch_vcsa_udev, m, &m->udev_vcsa_event_source);
852 void manager_gc(Manager *m, bool drop_not_started) {
859 while ((seat = m->seat_gc_queue)) {
860 LIST_REMOVE(gc_queue, m->seat_gc_queue, seat);
861 seat->in_gc_queue = false;
863 if (!seat_check_gc(seat, drop_not_started)) {
864 seat_stop(seat, false);
869 while ((session = m->session_gc_queue)) {
870 LIST_REMOVE(gc_queue, m->session_gc_queue, session);
871 session->in_gc_queue = false;
873 /* First, if we are not closing yet, initiate stopping */
874 if (!session_check_gc(session, drop_not_started) &&
875 session_get_state(session) != SESSION_CLOSING)
876 session_stop(session, false);
878 /* Normally, this should make the session busy again,
879 * if it doesn't then let's get rid of it
881 if (!session_check_gc(session, drop_not_started)) {
882 session_finalize(session);
883 session_free(session);
887 while ((user = m->user_gc_queue)) {
888 LIST_REMOVE(gc_queue, m->user_gc_queue, user);
889 user->in_gc_queue = false;
891 /* First step: queue stop jobs */
892 if (!user_check_gc(user, drop_not_started))
893 user_stop(user, false);
895 /* Second step: finalize user */
896 if (!user_check_gc(user, drop_not_started)) {
903 static int manager_dispatch_idle_action(sd_event_source *s, uint64_t t, void *userdata) {
904 Manager *m = userdata;
905 struct dual_timestamp since;
911 if (m->idle_action == HANDLE_IGNORE ||
912 m->idle_action_usec <= 0)
915 n = now(CLOCK_MONOTONIC);
917 r = manager_get_idle_hint(m, &since);
919 /* Not idle. Let's check if after a timeout it might be idle then. */
920 elapse = n + m->idle_action_usec;
922 /* Idle! Let's see if it's time to do something, or if
923 * we shall sleep for longer. */
925 if (n >= since.monotonic + m->idle_action_usec &&
926 (m->idle_action_not_before_usec <= 0 || n >= m->idle_action_not_before_usec + m->idle_action_usec)) {
927 log_info("System idle. Taking action.");
929 manager_handle_action(m, 0, m->idle_action, false, false);
930 m->idle_action_not_before_usec = n;
933 elapse = MAX(since.monotonic, m->idle_action_not_before_usec) + m->idle_action_usec;
936 if (!m->idle_action_event_source) {
938 r = sd_event_add_monotonic(m->event, elapse, USEC_PER_SEC*30, manager_dispatch_idle_action, m, &m->idle_action_event_source);
940 log_error("Failed to add idle event source: %s", strerror(-r));
944 r = sd_event_source_set_priority(m->idle_action_event_source, SD_EVENT_PRIORITY_IDLE+10);
946 log_error("Failed to set idle event source priority: %s", strerror(-r));
950 r = sd_event_source_set_time(m->idle_action_event_source, elapse);
952 log_error("Failed to set idle event timer: %s", strerror(-r));
956 r = sd_event_source_set_enabled(m->idle_action_event_source, SD_EVENT_ONESHOT);
958 log_error("Failed to enable idle event timer: %s", strerror(-r));
966 int manager_startup(Manager *m) {
971 Inhibitor *inhibitor;
976 /* Connect to console */
977 r = manager_connect_console(m);
981 /* Connect to udev */
982 r = manager_connect_udev(m);
984 log_error("Failed to create udev watchers: %s", strerror(-r));
988 /* Connect to the bus */
989 r = manager_connect_bus(m);
993 /* Instantiate magic seat 0 */
994 r = manager_add_seat(m, "seat0", &m->seat0);
996 log_error("Failed to add seat0: %s", strerror(-r));
1000 /* Deserialize state */
1001 r = manager_enumerate_devices(m);
1003 log_warning("Device enumeration failed: %s", strerror(-r));
1005 r = manager_enumerate_seats(m);
1007 log_warning("Seat enumeration failed: %s", strerror(-r));
1009 r = manager_enumerate_users(m);
1011 log_warning("User enumeration failed: %s", strerror(-r));
1013 r = manager_enumerate_sessions(m);
1015 log_warning("Session enumeration failed: %s", strerror(-r));
1017 r = manager_enumerate_inhibitors(m);
1019 log_warning("Inhibitor enumeration failed: %s", strerror(-r));
1021 r = manager_enumerate_buttons(m);
1023 log_warning("Button enumeration failed: %s", strerror(-r));
1025 /* Remove stale objects before we start them */
1026 manager_gc(m, false);
1028 /* Reserve the special reserved VT */
1029 manager_reserve_vt(m);
1031 /* And start everything */
1032 HASHMAP_FOREACH(seat, m->seats, i)
1035 HASHMAP_FOREACH(user, m->users, i)
1038 HASHMAP_FOREACH(session, m->sessions, i)
1039 session_start(session);
1041 HASHMAP_FOREACH(inhibitor, m->inhibitors, i)
1042 inhibitor_start(inhibitor);
1044 manager_dispatch_idle_action(NULL, 0, m);
1049 static int manager_recheck_buttons(Manager *m) {
1056 HASHMAP_FOREACH(b, m->buttons, i) {
1059 q = button_recheck(b);
1069 int manager_run(Manager *m) {
1075 usec_t us = (uint64_t) -1;
1077 r = sd_event_get_state(m->event);
1080 if (r == SD_EVENT_FINISHED)
1083 manager_gc(m, true);
1085 if (manager_dispatch_delayed(m) > 0)
1088 if (manager_recheck_buttons(m) > 0)
1091 if (m->action_what != 0 && !m->action_job) {
1094 x = now(CLOCK_MONOTONIC);
1095 y = m->action_timestamp + m->inhibit_delay_max;
1097 us = x >= y ? 0 : y - x;
1100 r = sd_event_run(m->event, us);
1108 static int manager_parse_config_file(Manager *m) {
1109 static const char fn[] = "/etc/systemd/logind.conf";
1110 _cleanup_fclose_ FILE *f = NULL;
1115 f = fopen(fn, "re");
1117 if (errno == ENOENT)
1120 log_warning("Failed to open configuration file %s: %m", fn);
1124 r = config_parse(NULL, fn, f, "Login\0", config_item_perf_lookup,
1125 (void*) logind_gperf_lookup, false, false, m);
1127 log_warning("Failed to parse configuration file: %s", strerror(-r));
1132 int main(int argc, char *argv[]) {
1136 log_set_target(LOG_TARGET_AUTO);
1137 log_set_facility(LOG_AUTH);
1138 log_parse_environment();
1144 log_error("This program takes no arguments.");
1149 /* Always create the directories people can create inotify
1150 * watches in. Note that some applications might check for the
1151 * existence of /run/systemd/seats/ to determine whether
1152 * logind is available, so please always make sure this check
1154 mkdir_label("/run/systemd/seats", 0755);
1155 mkdir_label("/run/systemd/users", 0755);
1156 mkdir_label("/run/systemd/sessions", 0755);
1164 manager_parse_config_file(m);
1166 r = manager_startup(m);
1168 log_error("Failed to fully start up daemon: %s", strerror(-r));
1172 log_debug("systemd-logind running as pid %lu", (unsigned long) getpid());
1176 "STATUS=Processing requests...");
1180 log_debug("systemd-logind stopped as pid %lu", (unsigned long) getpid());
1184 "STATUS=Shutting down...");
1189 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;