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"
38 Manager *manager_new(void) {
46 m->console_active_fd = -1;
47 m->reserve_vt_fd = -1;
51 m->inhibit_delay_max = 5 * USEC_PER_SEC;
52 m->handle_power_key = HANDLE_POWEROFF;
53 m->handle_suspend_key = HANDLE_SUSPEND;
54 m->handle_hibernate_key = HANDLE_HIBERNATE;
55 m->handle_lid_switch = HANDLE_SUSPEND;
56 m->lid_switch_ignore_inhibited = true;
58 m->idle_action_usec = 30 * USEC_PER_MINUTE;
59 m->idle_action = HANDLE_IGNORE;
60 m->idle_action_not_before_usec = now(CLOCK_MONOTONIC);
62 m->devices = hashmap_new(string_hash_func, string_compare_func);
63 m->seats = hashmap_new(string_hash_func, string_compare_func);
64 m->sessions = hashmap_new(string_hash_func, string_compare_func);
65 m->users = hashmap_new(trivial_hash_func, trivial_compare_func);
66 m->inhibitors = hashmap_new(string_hash_func, string_compare_func);
67 m->buttons = hashmap_new(string_hash_func, string_compare_func);
69 m->user_units = hashmap_new(string_hash_func, string_compare_func);
70 m->session_units = hashmap_new(string_hash_func, string_compare_func);
72 m->busnames = set_new(string_hash_func, string_compare_func);
74 if (!m->devices || !m->seats || !m->sessions || !m->users || !m->inhibitors || !m->buttons || !m->busnames ||
75 !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 struct udev_enumerate *e;
189 /* Loads devices from udev and creates seats for them as
192 e = udev_enumerate_new(m->udev);
198 r = udev_enumerate_add_match_tag(e, "master-of-seat");
202 r = udev_enumerate_scan_devices(e);
206 first = udev_enumerate_get_list_entry(e);
207 udev_list_entry_foreach(item, first) {
208 struct udev_device *d;
211 d = udev_device_new_from_syspath(m->udev, udev_list_entry_get_name(item));
217 k = manager_process_seat_device(m, d);
218 udev_device_unref(d);
226 udev_enumerate_unref(e);
231 static int manager_enumerate_buttons(Manager *m) {
232 struct udev_list_entry *item = NULL, *first = NULL;
233 struct udev_enumerate *e;
238 /* Loads buttons from udev */
240 if (m->handle_power_key == HANDLE_IGNORE &&
241 m->handle_suspend_key == HANDLE_IGNORE &&
242 m->handle_hibernate_key == HANDLE_IGNORE &&
243 m->handle_lid_switch == HANDLE_IGNORE)
246 e = udev_enumerate_new(m->udev);
252 r = udev_enumerate_add_match_subsystem(e, "input");
256 r = udev_enumerate_add_match_tag(e, "power-switch");
260 r = udev_enumerate_scan_devices(e);
264 first = udev_enumerate_get_list_entry(e);
265 udev_list_entry_foreach(item, first) {
266 struct udev_device *d;
269 d = udev_device_new_from_syspath(m->udev, udev_list_entry_get_name(item));
275 k = manager_process_button_device(m, d);
276 udev_device_unref(d);
284 udev_enumerate_unref(e);
289 static int manager_enumerate_seats(Manager *m) {
290 _cleanup_closedir_ DIR *d = NULL;
296 /* This loads data about seats stored on disk, but does not
297 * actually create any seats. Removes data of seats that no
300 d = opendir("/run/systemd/seats");
305 log_error("Failed to open /run/systemd/seats: %m");
309 FOREACH_DIRENT(de, d, return -errno) {
313 if (!dirent_is_file(de))
316 s = hashmap_get(m->seats, de->d_name);
318 unlinkat(dirfd(d), de->d_name, 0);
330 static int manager_enumerate_linger_users(Manager *m) {
331 _cleanup_closedir_ DIR *d = NULL;
337 d = opendir("/var/lib/systemd/linger");
342 log_error("Failed to open /var/lib/systemd/linger/: %m");
346 FOREACH_DIRENT(de, d, return -errno) {
349 if (!dirent_is_file(de))
352 k = manager_add_user_by_name(m, de->d_name, NULL);
354 log_notice("Couldn't add lingering user %s: %s", de->d_name, strerror(-k));
362 static int manager_enumerate_users(Manager *m) {
363 _cleanup_closedir_ DIR *d = NULL;
369 /* Add lingering users */
370 r = manager_enumerate_linger_users(m);
372 /* Read in user data stored on disk */
373 d = opendir("/run/systemd/users");
378 log_error("Failed to open /run/systemd/users: %m");
382 FOREACH_DIRENT(de, d, return -errno) {
385 if (!dirent_is_file(de))
388 k = manager_add_user_by_name(m, de->d_name, &u);
390 log_error("Failed to add user by file name %s: %s", de->d_name, strerror(-k));
396 user_add_to_gc_queue(u);
406 static int manager_enumerate_sessions(Manager *m) {
407 _cleanup_closedir_ DIR *d = NULL;
413 /* Read in session data stored on disk */
414 d = opendir("/run/systemd/sessions");
419 log_error("Failed to open /run/systemd/sessions: %m");
423 FOREACH_DIRENT(de, d, return -errno) {
427 if (!dirent_is_file(de))
430 if (!session_id_valid(de->d_name)) {
431 log_warning("Invalid session file name '%s', ignoring.", de->d_name);
436 k = manager_add_session(m, de->d_name, &s);
438 log_error("Failed to add session by file name %s: %s", de->d_name, strerror(-k));
444 session_add_to_gc_queue(s);
454 static int manager_enumerate_inhibitors(Manager *m) {
455 _cleanup_closedir_ DIR *d = NULL;
461 d = opendir("/run/systemd/inhibit");
466 log_error("Failed to open /run/systemd/inhibit: %m");
470 FOREACH_DIRENT(de, d, return -errno) {
474 if (!dirent_is_file(de))
477 k = manager_add_inhibitor(m, de->d_name, &i);
479 log_notice("Couldn't add inhibitor %s: %s", de->d_name, strerror(-k));
484 k = inhibitor_load(i);
492 static int manager_dispatch_seat_udev(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
493 Manager *m = userdata;
494 struct udev_device *d;
499 d = udev_monitor_receive_device(m->udev_seat_monitor);
503 r = manager_process_seat_device(m, d);
504 udev_device_unref(d);
509 static int manager_dispatch_device_udev(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
510 Manager *m = userdata;
511 struct udev_device *d;
516 d = udev_monitor_receive_device(m->udev_device_monitor);
520 r = manager_process_seat_device(m, d);
521 udev_device_unref(d);
526 static int manager_dispatch_vcsa_udev(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
527 Manager *m = userdata;
528 struct udev_device *d;
534 d = udev_monitor_receive_device(m->udev_vcsa_monitor);
538 name = udev_device_get_sysname(d);
540 /* Whenever a VCSA device is removed try to reallocate our
541 * VTs, to make sure our auto VTs never go away. */
543 if (name && startswith(name, "vcsa") && streq_ptr(udev_device_get_action(d), "remove"))
544 r = seat_preallocate_vts(m->seat0);
546 udev_device_unref(d);
551 static int manager_dispatch_button_udev(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
552 Manager *m = userdata;
553 struct udev_device *d;
558 d = udev_monitor_receive_device(m->udev_button_monitor);
562 r = manager_process_button_device(m, d);
563 udev_device_unref(d);
568 static int manager_dispatch_console(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
569 Manager *m = userdata;
573 assert(m->console_active_fd == fd);
575 seat_read_active_vt(m->seat0);
580 static int manager_reserve_vt(Manager *m) {
581 _cleanup_free_ char *p = NULL;
585 if (m->reserve_vt <= 0)
588 if (asprintf(&p, "/dev/tty%u", m->reserve_vt) < 0)
591 m->reserve_vt_fd = open(p, O_RDWR|O_NOCTTY|O_CLOEXEC|O_NONBLOCK);
592 if (m->reserve_vt_fd < 0) {
594 /* Don't complain on VT-less systems */
596 log_warning("Failed to pin reserved VT: %m");
603 static int manager_connect_bus(Manager *m) {
604 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
610 r = sd_bus_default_system(&m->bus);
612 log_error("Failed to connect to system bus: %s", strerror(-r));
616 r = sd_bus_add_object_vtable(m->bus, "/org/freedesktop/login1", "org.freedesktop.login1.Manager", manager_vtable, m);
618 log_error("Failed to add manager object vtable: %s", strerror(-r));
622 r = sd_bus_add_fallback_vtable(m->bus, "/org/freedesktop/login1/seat", "org.freedesktop.login1.Seat", seat_vtable, seat_object_find, m);
624 log_error("Failed to add seat object vtable: %s", strerror(-r));
628 r = sd_bus_add_node_enumerator(m->bus, "/org/freedesktop/login1/seat", seat_node_enumerator, m);
630 log_error("Failed to add seat enumerator: %s", strerror(-r));
634 r = sd_bus_add_fallback_vtable(m->bus, "/org/freedesktop/login1/session", "org.freedesktop.login1.Session", session_vtable, session_object_find, m);
636 log_error("Failed to add session object vtable: %s", strerror(-r));
640 r = sd_bus_add_node_enumerator(m->bus, "/org/freedesktop/login1/session", session_node_enumerator, m);
642 log_error("Failed to add session enumerator: %s", strerror(-r));
646 r = sd_bus_add_fallback_vtable(m->bus, "/org/freedesktop/login1/user", "org.freedesktop.login1.User", user_vtable, user_object_find, m);
648 log_error("Failed to add user object vtable: %s", strerror(-r));
652 r = sd_bus_add_node_enumerator(m->bus, "/org/freedesktop/login1/user", user_node_enumerator, m);
654 log_error("Failed to add user enumerator: %s", strerror(-r));
658 r = sd_bus_add_match(m->bus,
660 "sender='org.freedesktop.DBus',"
661 "interface='org.freedesktop.DBus',"
662 "member='NameOwnerChanged',"
663 "path='/org/freedesktop/DBus'",
664 match_name_owner_changed, m);
666 log_error("Failed to add match for NameOwnerChanged: %s", strerror(-r));
670 r = sd_bus_add_match(m->bus,
672 "sender='org.freedesktop.systemd1',"
673 "interface='org.freedesktop.systemd1.Manager',"
674 "member='JobRemoved',"
675 "path='/org/freedesktop/systemd1'",
676 match_job_removed, m);
678 log_error("Failed to add match for JobRemoved: %s", strerror(-r));
682 r = sd_bus_add_match(m->bus,
684 "sender='org.freedesktop.systemd1',"
685 "interface='org.freedesktop.systemd1.Manager',"
686 "member='UnitRemoved',"
687 "path='/org/freedesktop/systemd1'",
688 match_unit_removed, m);
690 log_error("Failed to add match for UnitRemoved: %s", strerror(-r));
694 r = sd_bus_add_match(m->bus,
696 "sender='org.freedesktop.systemd1',"
697 "interface='org.freedesktop.DBus.Properties',"
698 "member='PropertiesChanged'",
699 match_properties_changed, m);
701 log_error("Failed to add match for PropertiesChanged: %s", strerror(-r));
705 r = sd_bus_add_match(m->bus,
707 "sender='org.freedesktop.systemd1',"
708 "interface='org.freedesktop.systemd1.Manager',"
709 "member='Reloading',"
710 "path='/org/freedesktop/systemd1'",
713 log_error("Failed to add match for Reloading: %s", strerror(-r));
717 r = sd_bus_call_method(
719 "org.freedesktop.systemd1",
720 "/org/freedesktop/systemd1",
721 "org.freedesktop.systemd1.Manager",
726 log_error("Failed to enable subscription: %s", bus_error_message(&error, r));
730 r = sd_bus_request_name(m->bus, "org.freedesktop.login1", SD_BUS_NAME_REPLACE_EXISTING|SD_BUS_NAME_DO_NOT_QUEUE);
732 log_error("Failed to register name: %s", strerror(-r));
736 r = sd_bus_attach_event(m->bus, m->event, 0);
738 log_error("Failed to attach bus to event loop: %s", strerror(-r));
745 static int manager_connect_console(Manager *m) {
749 assert(m->console_active_fd < 0);
751 /* On certain architectures (S390 and Xen, and containers),
752 /dev/tty0 does not exist, so don't fail if we can't open
754 if (access("/dev/tty0", F_OK) < 0)
757 m->console_active_fd = open("/sys/class/tty/tty0/active", O_RDONLY|O_NOCTTY|O_CLOEXEC);
758 if (m->console_active_fd < 0) {
760 /* On some systems the device node /dev/tty0 may exist
761 * even though /sys/class/tty/tty0 does not. */
765 log_error("Failed to open /sys/class/tty/tty0/active: %m");
769 r = sd_event_add_io(m->event, m->console_active_fd, 0, manager_dispatch_console, m, &m->console_active_event_source);
771 log_error("Failed to watch foreground console");
778 static int manager_connect_udev(Manager *m) {
782 assert(!m->udev_seat_monitor);
783 assert(!m->udev_device_monitor);
784 assert(!m->udev_vcsa_monitor);
785 assert(!m->udev_button_monitor);
787 m->udev_seat_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
788 if (!m->udev_seat_monitor)
791 r = udev_monitor_filter_add_match_tag(m->udev_seat_monitor, "master-of-seat");
795 r = udev_monitor_enable_receiving(m->udev_seat_monitor);
799 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);
803 m->udev_device_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
804 if (!m->udev_device_monitor)
807 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_device_monitor, "input", NULL);
811 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_device_monitor, "graphics", NULL);
815 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_device_monitor, "drm", NULL);
819 r = udev_monitor_enable_receiving(m->udev_device_monitor);
823 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);
827 /* Don't watch keys if nobody cares */
828 if (m->handle_power_key != HANDLE_IGNORE ||
829 m->handle_suspend_key != HANDLE_IGNORE ||
830 m->handle_hibernate_key != HANDLE_IGNORE ||
831 m->handle_lid_switch != HANDLE_IGNORE) {
833 m->udev_button_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
834 if (!m->udev_button_monitor)
837 r = udev_monitor_filter_add_match_tag(m->udev_button_monitor, "power-switch");
841 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_button_monitor, "input", NULL);
845 r = udev_monitor_enable_receiving(m->udev_button_monitor);
849 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);
854 /* Don't bother watching VCSA devices, if nobody cares */
855 if (m->n_autovts > 0 && m->console_active_fd >= 0) {
857 m->udev_vcsa_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
858 if (!m->udev_vcsa_monitor)
861 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_vcsa_monitor, "vc", NULL);
865 r = udev_monitor_enable_receiving(m->udev_vcsa_monitor);
869 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);
877 void manager_gc(Manager *m, bool drop_not_started) {
884 while ((seat = m->seat_gc_queue)) {
885 LIST_REMOVE(gc_queue, m->seat_gc_queue, seat);
886 seat->in_gc_queue = false;
888 if (!seat_check_gc(seat, drop_not_started)) {
894 while ((session = m->session_gc_queue)) {
895 LIST_REMOVE(gc_queue, m->session_gc_queue, session);
896 session->in_gc_queue = false;
898 if (!session_check_gc(session, drop_not_started)) {
899 session_stop(session);
900 session_finalize(session);
901 session_free(session);
905 while ((user = m->user_gc_queue)) {
906 LIST_REMOVE(gc_queue, m->user_gc_queue, user);
907 user->in_gc_queue = false;
909 if (!user_check_gc(user, drop_not_started)) {
917 static int manager_dispatch_idle_action(sd_event_source *s, uint64_t t, void *userdata) {
918 Manager *m = userdata;
919 struct dual_timestamp since;
925 if (m->idle_action == HANDLE_IGNORE ||
926 m->idle_action_usec <= 0)
929 n = now(CLOCK_MONOTONIC);
931 r = manager_get_idle_hint(m, &since);
933 /* Not idle. Let's check if after a timeout it might be idle then. */
934 elapse = n + m->idle_action_usec;
936 /* Idle! Let's see if it's time to do something, or if
937 * we shall sleep for longer. */
939 if (n >= since.monotonic + m->idle_action_usec &&
940 (m->idle_action_not_before_usec <= 0 || n >= m->idle_action_not_before_usec + m->idle_action_usec)) {
941 log_info("System idle. Taking action.");
943 manager_handle_action(m, 0, m->idle_action, false, false);
944 m->idle_action_not_before_usec = n;
947 elapse = MAX(since.monotonic, m->idle_action_not_before_usec) + m->idle_action_usec;
950 if (!m->idle_action_event_source) {
952 r = sd_event_add_monotonic(m->event, elapse, USEC_PER_SEC*30, manager_dispatch_idle_action, m, &m->idle_action_event_source);
954 log_error("Failed to add idle event source: %s", strerror(-r));
958 r = sd_event_source_set_priority(m->idle_action_event_source, SD_EVENT_PRIORITY_IDLE+10);
960 log_error("Failed to set idle event source priority: %s", strerror(-r));
964 r = sd_event_source_set_time(m->idle_action_event_source, elapse);
966 log_error("Failed to set idle event timer: %s", strerror(-r));
970 r = sd_event_source_set_enabled(m->idle_action_event_source, SD_EVENT_ONESHOT);
972 log_error("Failed to enable idle event timer: %s", strerror(-r));
980 int manager_startup(Manager *m) {
985 Inhibitor *inhibitor;
990 /* Connect to console */
991 r = manager_connect_console(m);
995 /* Connect to udev */
996 r = manager_connect_udev(m);
998 log_error("Failed to create udev watchers: %s", strerror(-r));
1002 /* Connect to the bus */
1003 r = manager_connect_bus(m);
1007 /* Instantiate magic seat 0 */
1008 r = manager_add_seat(m, "seat0", &m->seat0);
1010 log_error("Failed to add seat0: %s", strerror(-r));
1014 /* Deserialize state */
1015 r = manager_enumerate_devices(m);
1017 log_warning("Device enumeration failed: %s", strerror(-r));
1019 r = manager_enumerate_seats(m);
1021 log_warning("Seat enumeration failed: %s", strerror(-r));
1023 r = manager_enumerate_users(m);
1025 log_warning("User enumeration failed: %s", strerror(-r));
1027 r = manager_enumerate_sessions(m);
1029 log_warning("Session enumeration failed: %s", strerror(-r));
1031 r = manager_enumerate_inhibitors(m);
1033 log_warning("Inhibitor enumeration failed: %s", strerror(-r));
1035 r = manager_enumerate_buttons(m);
1037 log_warning("Button enumeration failed: %s", strerror(-r));
1039 /* Remove stale objects before we start them */
1040 manager_gc(m, false);
1042 /* Reserve the special reserved VT */
1043 manager_reserve_vt(m);
1045 /* And start everything */
1046 HASHMAP_FOREACH(seat, m->seats, i)
1049 HASHMAP_FOREACH(user, m->users, i)
1052 HASHMAP_FOREACH(session, m->sessions, i)
1053 session_start(session);
1055 HASHMAP_FOREACH(inhibitor, m->inhibitors, i)
1056 inhibitor_start(inhibitor);
1058 manager_dispatch_idle_action(NULL, 0, m);
1063 static int manager_recheck_buttons(Manager *m) {
1070 HASHMAP_FOREACH(b, m->buttons, i) {
1073 q = button_recheck(b);
1083 int manager_run(Manager *m) {
1089 usec_t us = (uint64_t) -1;
1091 r = sd_event_get_state(m->event);
1094 if (r == SD_EVENT_FINISHED)
1097 manager_gc(m, true);
1099 if (manager_dispatch_delayed(m) > 0)
1102 if (manager_recheck_buttons(m) > 0)
1105 if (m->action_what != 0 && !m->action_job) {
1108 x = now(CLOCK_MONOTONIC);
1109 y = m->action_timestamp + m->inhibit_delay_max;
1111 us = x >= y ? 0 : y - x;
1114 r = sd_event_run(m->event, us);
1122 static int manager_parse_config_file(Manager *m) {
1123 static const char fn[] = "/etc/systemd/logind.conf";
1124 _cleanup_fclose_ FILE *f = NULL;
1129 f = fopen(fn, "re");
1131 if (errno == ENOENT)
1134 log_warning("Failed to open configuration file %s: %m", fn);
1138 r = config_parse(NULL, fn, f, "Login\0", config_item_perf_lookup,
1139 (void*) logind_gperf_lookup, false, false, m);
1141 log_warning("Failed to parse configuration file: %s", strerror(-r));
1146 int main(int argc, char *argv[]) {
1150 log_set_target(LOG_TARGET_AUTO);
1151 log_set_facility(LOG_AUTH);
1152 log_parse_environment();
1158 log_error("This program takes no arguments.");
1163 /* Always create the directories people can create inotify
1164 * watches in. Note that some applications might check for the
1165 * existence of /run/systemd/seats/ to determine whether
1166 * logind is available, so please always make sure this check
1168 mkdir_label("/run/systemd/seats", 0755);
1169 mkdir_label("/run/systemd/users", 0755);
1170 mkdir_label("/run/systemd/sessions", 0755);
1178 manager_parse_config_file(m);
1180 r = manager_startup(m);
1182 log_error("Failed to fully start up daemon: %s", strerror(-r));
1186 log_debug("systemd-logind running as pid %lu", (unsigned long) getpid());
1190 "STATUS=Processing requests...");
1194 log_debug("systemd-logind stopped as pid %lu", (unsigned long) getpid());
1198 "STATUS=Shutting down...");
1203 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;