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 ||
82 m->kill_exclude_users = strv_new("root", NULL);
83 if (!m->kill_exclude_users) {
94 r = sd_event_default(&m->event);
100 sd_event_set_watchdog(m->event, true);
105 void manager_free(Manager *m) {
115 while ((session = hashmap_first(m->sessions)))
116 session_free(session);
118 while ((u = hashmap_first(m->users)))
121 while ((d = hashmap_first(m->devices)))
124 while ((s = hashmap_first(m->seats)))
127 while ((i = hashmap_first(m->inhibitors)))
130 while ((b = hashmap_first(m->buttons)))
133 hashmap_free(m->devices);
134 hashmap_free(m->seats);
135 hashmap_free(m->sessions);
136 hashmap_free(m->users);
137 hashmap_free(m->inhibitors);
138 hashmap_free(m->buttons);
140 hashmap_free(m->user_units);
141 hashmap_free(m->session_units);
143 set_free_free(m->busnames);
145 sd_event_source_unref(m->idle_action_event_source);
147 sd_event_source_unref(m->console_active_event_source);
148 sd_event_source_unref(m->udev_seat_event_source);
149 sd_event_source_unref(m->udev_device_event_source);
150 sd_event_source_unref(m->udev_vcsa_event_source);
151 sd_event_source_unref(m->udev_button_event_source);
153 if (m->console_active_fd >= 0)
154 close_nointr_nofail(m->console_active_fd);
156 if (m->udev_seat_monitor)
157 udev_monitor_unref(m->udev_seat_monitor);
158 if (m->udev_device_monitor)
159 udev_monitor_unref(m->udev_device_monitor);
160 if (m->udev_vcsa_monitor)
161 udev_monitor_unref(m->udev_vcsa_monitor);
162 if (m->udev_button_monitor)
163 udev_monitor_unref(m->udev_button_monitor);
168 bus_verify_polkit_async_registry_free(m->bus, m->polkit_registry);
170 sd_bus_unref(m->bus);
171 sd_event_unref(m->event);
173 if (m->reserve_vt_fd >= 0)
174 close_nointr_nofail(m->reserve_vt_fd);
176 strv_free(m->kill_only_users);
177 strv_free(m->kill_exclude_users);
183 static int manager_enumerate_devices(Manager *m) {
184 struct udev_list_entry *item = NULL, *first = NULL;
185 struct udev_enumerate *e;
190 /* Loads devices from udev and creates seats for them as
193 e = udev_enumerate_new(m->udev);
199 r = udev_enumerate_add_match_tag(e, "master-of-seat");
203 r = udev_enumerate_scan_devices(e);
207 first = udev_enumerate_get_list_entry(e);
208 udev_list_entry_foreach(item, first) {
209 struct udev_device *d;
212 d = udev_device_new_from_syspath(m->udev, udev_list_entry_get_name(item));
218 k = manager_process_seat_device(m, d);
219 udev_device_unref(d);
227 udev_enumerate_unref(e);
232 static int manager_enumerate_buttons(Manager *m) {
233 struct udev_list_entry *item = NULL, *first = NULL;
234 struct udev_enumerate *e;
239 /* Loads buttons from udev */
241 if (m->handle_power_key == HANDLE_IGNORE &&
242 m->handle_suspend_key == HANDLE_IGNORE &&
243 m->handle_hibernate_key == HANDLE_IGNORE &&
244 m->handle_lid_switch == HANDLE_IGNORE)
247 e = udev_enumerate_new(m->udev);
253 r = udev_enumerate_add_match_subsystem(e, "input");
257 r = udev_enumerate_add_match_tag(e, "power-switch");
261 r = udev_enumerate_scan_devices(e);
265 first = udev_enumerate_get_list_entry(e);
266 udev_list_entry_foreach(item, first) {
267 struct udev_device *d;
270 d = udev_device_new_from_syspath(m->udev, udev_list_entry_get_name(item));
276 k = manager_process_button_device(m, d);
277 udev_device_unref(d);
285 udev_enumerate_unref(e);
290 static int manager_enumerate_seats(Manager *m) {
291 _cleanup_closedir_ DIR *d = NULL;
297 /* This loads data about seats stored on disk, but does not
298 * actually create any seats. Removes data of seats that no
301 d = opendir("/run/systemd/seats");
306 log_error("Failed to open /run/systemd/seats: %m");
310 FOREACH_DIRENT(de, d, return -errno) {
314 if (!dirent_is_file(de))
317 s = hashmap_get(m->seats, de->d_name);
319 unlinkat(dirfd(d), de->d_name, 0);
331 static int manager_enumerate_linger_users(Manager *m) {
332 _cleanup_closedir_ DIR *d = NULL;
338 d = opendir("/var/lib/systemd/linger");
343 log_error("Failed to open /var/lib/systemd/linger/: %m");
347 FOREACH_DIRENT(de, d, return -errno) {
350 if (!dirent_is_file(de))
353 k = manager_add_user_by_name(m, de->d_name, NULL);
355 log_notice("Couldn't add lingering user %s: %s", de->d_name, strerror(-k));
363 static int manager_enumerate_users(Manager *m) {
364 _cleanup_closedir_ DIR *d = NULL;
370 /* Add lingering users */
371 r = manager_enumerate_linger_users(m);
373 /* Read in user data stored on disk */
374 d = opendir("/run/systemd/users");
379 log_error("Failed to open /run/systemd/users: %m");
383 FOREACH_DIRENT(de, d, return -errno) {
386 if (!dirent_is_file(de))
389 k = manager_add_user_by_name(m, de->d_name, &u);
391 log_error("Failed to add user by file name %s: %s", de->d_name, strerror(-k));
397 user_add_to_gc_queue(u);
407 static int manager_enumerate_sessions(Manager *m) {
408 _cleanup_closedir_ DIR *d = NULL;
414 /* Read in session data stored on disk */
415 d = opendir("/run/systemd/sessions");
420 log_error("Failed to open /run/systemd/sessions: %m");
424 FOREACH_DIRENT(de, d, return -errno) {
428 if (!dirent_is_file(de))
431 if (!session_id_valid(de->d_name)) {
432 log_warning("Invalid session file name '%s', ignoring.", de->d_name);
437 k = manager_add_session(m, de->d_name, &s);
439 log_error("Failed to add session by file name %s: %s", de->d_name, strerror(-k));
445 session_add_to_gc_queue(s);
455 static int manager_enumerate_inhibitors(Manager *m) {
456 _cleanup_closedir_ DIR *d = NULL;
462 d = opendir("/run/systemd/inhibit");
467 log_error("Failed to open /run/systemd/inhibit: %m");
471 FOREACH_DIRENT(de, d, return -errno) {
475 if (!dirent_is_file(de))
478 k = manager_add_inhibitor(m, de->d_name, &i);
480 log_notice("Couldn't add inhibitor %s: %s", de->d_name, strerror(-k));
485 k = inhibitor_load(i);
493 static int manager_dispatch_seat_udev(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
494 _cleanup_udev_device_unref_ struct udev_device *d = NULL;
495 Manager *m = userdata;
499 d = udev_monitor_receive_device(m->udev_seat_monitor);
503 manager_process_seat_device(m, d);
507 static int manager_dispatch_device_udev(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
508 _cleanup_udev_device_unref_ struct udev_device *d = NULL;
509 Manager *m = userdata;
513 d = udev_monitor_receive_device(m->udev_device_monitor);
517 manager_process_seat_device(m, d);
521 static int manager_dispatch_vcsa_udev(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
522 _cleanup_udev_device_unref_ struct udev_device *d = NULL;
523 Manager *m = userdata;
528 d = udev_monitor_receive_device(m->udev_vcsa_monitor);
532 name = udev_device_get_sysname(d);
534 /* Whenever a VCSA device is removed try to reallocate our
535 * VTs, to make sure our auto VTs never go away. */
537 if (name && startswith(name, "vcsa") && streq_ptr(udev_device_get_action(d), "remove"))
538 seat_preallocate_vts(m->seat0);
543 static int manager_dispatch_button_udev(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
544 _cleanup_udev_device_unref_ struct udev_device *d = NULL;
545 Manager *m = userdata;
549 d = udev_monitor_receive_device(m->udev_button_monitor);
553 manager_process_button_device(m, d);
557 static int manager_dispatch_console(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
558 Manager *m = userdata;
562 assert(m->console_active_fd == fd);
564 seat_read_active_vt(m->seat0);
568 static int manager_reserve_vt(Manager *m) {
569 _cleanup_free_ char *p = NULL;
573 if (m->reserve_vt <= 0)
576 if (asprintf(&p, "/dev/tty%u", m->reserve_vt) < 0)
579 m->reserve_vt_fd = open(p, O_RDWR|O_NOCTTY|O_CLOEXEC|O_NONBLOCK);
580 if (m->reserve_vt_fd < 0) {
582 /* Don't complain on VT-less systems */
584 log_warning("Failed to pin reserved VT: %m");
591 static int manager_connect_bus(Manager *m) {
592 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
598 r = sd_bus_default_system(&m->bus);
600 log_error("Failed to connect to system bus: %s", strerror(-r));
604 r = sd_bus_add_object_vtable(m->bus, "/org/freedesktop/login1", "org.freedesktop.login1.Manager", manager_vtable, m);
606 log_error("Failed to add manager object vtable: %s", strerror(-r));
610 r = sd_bus_add_fallback_vtable(m->bus, "/org/freedesktop/login1/seat", "org.freedesktop.login1.Seat", seat_vtable, seat_object_find, m);
612 log_error("Failed to add seat object vtable: %s", strerror(-r));
616 r = sd_bus_add_node_enumerator(m->bus, "/org/freedesktop/login1/seat", seat_node_enumerator, m);
618 log_error("Failed to add seat enumerator: %s", strerror(-r));
622 r = sd_bus_add_fallback_vtable(m->bus, "/org/freedesktop/login1/session", "org.freedesktop.login1.Session", session_vtable, session_object_find, m);
624 log_error("Failed to add session object vtable: %s", strerror(-r));
628 r = sd_bus_add_node_enumerator(m->bus, "/org/freedesktop/login1/session", session_node_enumerator, m);
630 log_error("Failed to add session enumerator: %s", strerror(-r));
634 r = sd_bus_add_fallback_vtable(m->bus, "/org/freedesktop/login1/user", "org.freedesktop.login1.User", user_vtable, user_object_find, m);
636 log_error("Failed to add user object vtable: %s", strerror(-r));
640 r = sd_bus_add_node_enumerator(m->bus, "/org/freedesktop/login1/user", user_node_enumerator, m);
642 log_error("Failed to add user enumerator: %s", strerror(-r));
646 r = sd_bus_add_match(m->bus,
648 "sender='org.freedesktop.DBus',"
649 "interface='org.freedesktop.DBus',"
650 "member='NameOwnerChanged',"
651 "path='/org/freedesktop/DBus'",
652 match_name_owner_changed, m);
654 log_error("Failed to add match for NameOwnerChanged: %s", strerror(-r));
658 r = sd_bus_add_match(m->bus,
660 "sender='org.freedesktop.systemd1',"
661 "interface='org.freedesktop.systemd1.Manager',"
662 "member='JobRemoved',"
663 "path='/org/freedesktop/systemd1'",
664 match_job_removed, m);
666 log_error("Failed to add match for JobRemoved: %s", strerror(-r));
670 r = sd_bus_add_match(m->bus,
672 "sender='org.freedesktop.systemd1',"
673 "interface='org.freedesktop.systemd1.Manager',"
674 "member='UnitRemoved',"
675 "path='/org/freedesktop/systemd1'",
676 match_unit_removed, m);
678 log_error("Failed to add match for UnitRemoved: %s", strerror(-r));
682 r = sd_bus_add_match(m->bus,
684 "sender='org.freedesktop.systemd1',"
685 "interface='org.freedesktop.DBus.Properties',"
686 "member='PropertiesChanged'",
687 match_properties_changed, m);
689 log_error("Failed to add match for PropertiesChanged: %s", strerror(-r));
693 r = sd_bus_add_match(m->bus,
695 "sender='org.freedesktop.systemd1',"
696 "interface='org.freedesktop.systemd1.Manager',"
697 "member='Reloading',"
698 "path='/org/freedesktop/systemd1'",
701 log_error("Failed to add match for Reloading: %s", strerror(-r));
705 r = sd_bus_call_method(
707 "org.freedesktop.systemd1",
708 "/org/freedesktop/systemd1",
709 "org.freedesktop.systemd1.Manager",
714 log_error("Failed to enable subscription: %s", bus_error_message(&error, r));
718 r = sd_bus_request_name(m->bus, "org.freedesktop.login1", 0);
720 log_error("Failed to register name: %s", strerror(-r));
724 r = sd_bus_attach_event(m->bus, m->event, 0);
726 log_error("Failed to attach bus to event loop: %s", strerror(-r));
733 static int manager_connect_console(Manager *m) {
737 assert(m->console_active_fd < 0);
739 /* On certain architectures (S390 and Xen, and containers),
740 /dev/tty0 does not exist, so don't fail if we can't open
742 if (access("/dev/tty0", F_OK) < 0)
745 m->console_active_fd = open("/sys/class/tty/tty0/active", O_RDONLY|O_NOCTTY|O_CLOEXEC);
746 if (m->console_active_fd < 0) {
748 /* On some systems the device node /dev/tty0 may exist
749 * even though /sys/class/tty/tty0 does not. */
753 log_error("Failed to open /sys/class/tty/tty0/active: %m");
757 r = sd_event_add_io(m->event, m->console_active_fd, 0, manager_dispatch_console, m, &m->console_active_event_source);
759 log_error("Failed to watch foreground console");
766 static int manager_connect_udev(Manager *m) {
770 assert(!m->udev_seat_monitor);
771 assert(!m->udev_device_monitor);
772 assert(!m->udev_vcsa_monitor);
773 assert(!m->udev_button_monitor);
775 m->udev_seat_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
776 if (!m->udev_seat_monitor)
779 r = udev_monitor_filter_add_match_tag(m->udev_seat_monitor, "master-of-seat");
783 r = udev_monitor_enable_receiving(m->udev_seat_monitor);
787 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);
791 m->udev_device_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
792 if (!m->udev_device_monitor)
795 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_device_monitor, "input", NULL);
799 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_device_monitor, "graphics", NULL);
803 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_device_monitor, "drm", NULL);
807 r = udev_monitor_enable_receiving(m->udev_device_monitor);
811 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);
815 /* Don't watch keys if nobody cares */
816 if (m->handle_power_key != HANDLE_IGNORE ||
817 m->handle_suspend_key != HANDLE_IGNORE ||
818 m->handle_hibernate_key != HANDLE_IGNORE ||
819 m->handle_lid_switch != HANDLE_IGNORE) {
821 m->udev_button_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
822 if (!m->udev_button_monitor)
825 r = udev_monitor_filter_add_match_tag(m->udev_button_monitor, "power-switch");
829 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_button_monitor, "input", NULL);
833 r = udev_monitor_enable_receiving(m->udev_button_monitor);
837 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);
842 /* Don't bother watching VCSA devices, if nobody cares */
843 if (m->n_autovts > 0 && m->console_active_fd >= 0) {
845 m->udev_vcsa_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
846 if (!m->udev_vcsa_monitor)
849 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_vcsa_monitor, "vc", NULL);
853 r = udev_monitor_enable_receiving(m->udev_vcsa_monitor);
857 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);
865 void manager_gc(Manager *m, bool drop_not_started) {
872 while ((seat = m->seat_gc_queue)) {
873 LIST_REMOVE(gc_queue, m->seat_gc_queue, seat);
874 seat->in_gc_queue = false;
876 if (!seat_check_gc(seat, drop_not_started)) {
882 while ((session = m->session_gc_queue)) {
883 LIST_REMOVE(gc_queue, m->session_gc_queue, session);
884 session->in_gc_queue = false;
886 if (!session_check_gc(session, drop_not_started)) {
887 session_stop(session);
888 session_finalize(session);
889 session_free(session);
893 while ((user = m->user_gc_queue)) {
894 LIST_REMOVE(gc_queue, m->user_gc_queue, user);
895 user->in_gc_queue = false;
897 if (!user_check_gc(user, drop_not_started)) {
905 static int manager_dispatch_idle_action(sd_event_source *s, uint64_t t, void *userdata) {
906 Manager *m = userdata;
907 struct dual_timestamp since;
913 if (m->idle_action == HANDLE_IGNORE ||
914 m->idle_action_usec <= 0)
917 n = now(CLOCK_MONOTONIC);
919 r = manager_get_idle_hint(m, &since);
921 /* Not idle. Let's check if after a timeout it might be idle then. */
922 elapse = n + m->idle_action_usec;
924 /* Idle! Let's see if it's time to do something, or if
925 * we shall sleep for longer. */
927 if (n >= since.monotonic + m->idle_action_usec &&
928 (m->idle_action_not_before_usec <= 0 || n >= m->idle_action_not_before_usec + m->idle_action_usec)) {
929 log_info("System idle. Taking action.");
931 manager_handle_action(m, 0, m->idle_action, false, false);
932 m->idle_action_not_before_usec = n;
935 elapse = MAX(since.monotonic, m->idle_action_not_before_usec) + m->idle_action_usec;
938 if (!m->idle_action_event_source) {
940 r = sd_event_add_monotonic(m->event, elapse, USEC_PER_SEC*30, manager_dispatch_idle_action, m, &m->idle_action_event_source);
942 log_error("Failed to add idle event source: %s", strerror(-r));
946 r = sd_event_source_set_priority(m->idle_action_event_source, SD_EVENT_PRIORITY_IDLE+10);
948 log_error("Failed to set idle event source priority: %s", strerror(-r));
952 r = sd_event_source_set_time(m->idle_action_event_source, elapse);
954 log_error("Failed to set idle event timer: %s", strerror(-r));
958 r = sd_event_source_set_enabled(m->idle_action_event_source, SD_EVENT_ONESHOT);
960 log_error("Failed to enable idle event timer: %s", strerror(-r));
968 int manager_startup(Manager *m) {
973 Inhibitor *inhibitor;
978 /* Connect to console */
979 r = manager_connect_console(m);
983 /* Connect to udev */
984 r = manager_connect_udev(m);
986 log_error("Failed to create udev watchers: %s", strerror(-r));
990 /* Connect to the bus */
991 r = manager_connect_bus(m);
995 /* Instantiate magic seat 0 */
996 r = manager_add_seat(m, "seat0", &m->seat0);
998 log_error("Failed to add seat0: %s", strerror(-r));
1002 /* Deserialize state */
1003 r = manager_enumerate_devices(m);
1005 log_warning("Device enumeration failed: %s", strerror(-r));
1007 r = manager_enumerate_seats(m);
1009 log_warning("Seat enumeration failed: %s", strerror(-r));
1011 r = manager_enumerate_users(m);
1013 log_warning("User enumeration failed: %s", strerror(-r));
1015 r = manager_enumerate_sessions(m);
1017 log_warning("Session enumeration failed: %s", strerror(-r));
1019 r = manager_enumerate_inhibitors(m);
1021 log_warning("Inhibitor enumeration failed: %s", strerror(-r));
1023 r = manager_enumerate_buttons(m);
1025 log_warning("Button enumeration failed: %s", strerror(-r));
1027 /* Remove stale objects before we start them */
1028 manager_gc(m, false);
1030 /* Reserve the special reserved VT */
1031 manager_reserve_vt(m);
1033 /* And start everything */
1034 HASHMAP_FOREACH(seat, m->seats, i)
1037 HASHMAP_FOREACH(user, m->users, i)
1040 HASHMAP_FOREACH(session, m->sessions, i)
1041 session_start(session);
1043 HASHMAP_FOREACH(inhibitor, m->inhibitors, i)
1044 inhibitor_start(inhibitor);
1046 manager_dispatch_idle_action(NULL, 0, m);
1051 static int manager_recheck_buttons(Manager *m) {
1058 HASHMAP_FOREACH(b, m->buttons, i) {
1061 q = button_recheck(b);
1071 int manager_run(Manager *m) {
1077 usec_t us = (uint64_t) -1;
1079 r = sd_event_get_state(m->event);
1082 if (r == SD_EVENT_FINISHED)
1085 manager_gc(m, true);
1087 if (manager_dispatch_delayed(m) > 0)
1090 if (manager_recheck_buttons(m) > 0)
1093 if (m->action_what != 0 && !m->action_job) {
1096 x = now(CLOCK_MONOTONIC);
1097 y = m->action_timestamp + m->inhibit_delay_max;
1099 us = x >= y ? 0 : y - x;
1102 r = sd_event_run(m->event, us);
1110 static int manager_parse_config_file(Manager *m) {
1111 static const char fn[] = "/etc/systemd/logind.conf";
1112 _cleanup_fclose_ FILE *f = NULL;
1117 f = fopen(fn, "re");
1119 if (errno == ENOENT)
1122 log_warning("Failed to open configuration file %s: %m", fn);
1126 r = config_parse(NULL, fn, f, "Login\0", config_item_perf_lookup,
1127 (void*) logind_gperf_lookup, false, false, m);
1129 log_warning("Failed to parse configuration file: %s", strerror(-r));
1134 int main(int argc, char *argv[]) {
1138 log_set_target(LOG_TARGET_AUTO);
1139 log_set_facility(LOG_AUTH);
1140 log_parse_environment();
1146 log_error("This program takes no arguments.");
1151 /* Always create the directories people can create inotify
1152 * watches in. Note that some applications might check for the
1153 * existence of /run/systemd/seats/ to determine whether
1154 * logind is available, so please always make sure this check
1156 mkdir_label("/run/systemd/seats", 0755);
1157 mkdir_label("/run/systemd/users", 0755);
1158 mkdir_label("/run/systemd/sessions", 0755);
1166 manager_parse_config_file(m);
1168 r = manager_startup(m);
1170 log_error("Failed to fully start up daemon: %s", strerror(-r));
1174 log_debug("systemd-logind running as pid %lu", (unsigned long) getpid());
1178 "STATUS=Processing requests...");
1182 log_debug("systemd-logind stopped as pid %lu", (unsigned long) getpid());
1186 "STATUS=Shutting down...");
1191 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;