chiark / gitweb /
caed149ad682ebdb9197264753de4cf4cb226f63
[elogind.git] / src / login / logind.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2011 Lennart Poettering
7
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.
12
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.
17
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/>.
20 ***/
21
22 #include <errno.h>
23 #include <pwd.h>
24 #include <libudev.h>
25 #include <fcntl.h>
26 #include <string.h>
27 #include <unistd.h>
28 #include <sys/epoll.h>
29 #include <sys/ioctl.h>
30 #include <linux/vt.h>
31 #include <sys/timerfd.h>
32
33 #include <systemd/sd-daemon.h>
34
35 #include "logind.h"
36 #include "dbus-common.h"
37 #include "dbus-loop.h"
38 #include "strv.h"
39 #include "conf-parser.h"
40 #include "mkdir.h"
41
42 Manager *manager_new(void) {
43         Manager *m;
44
45         m = new0(Manager, 1);
46         if (!m)
47                 return NULL;
48
49         m->console_active_fd = -1;
50         m->bus_fd = -1;
51         m->udev_seat_fd = -1;
52         m->udev_vcsa_fd = -1;
53         m->udev_button_fd = -1;
54         m->epoll_fd = -1;
55         m->reserve_vt_fd = -1;
56
57         m->n_autovts = 6;
58         m->reserve_vt = 6;
59         m->inhibit_delay_max = 5 * USEC_PER_SEC;
60         m->handle_power_key = HANDLE_POWEROFF;
61         m->handle_suspend_key = HANDLE_SUSPEND;
62         m->handle_hibernate_key = HANDLE_HIBERNATE;
63         m->handle_lid_switch = HANDLE_SUSPEND;
64         m->lid_switch_ignore_inhibited = true;
65
66         m->idle_action_fd = -1;
67         m->idle_action_usec = 30 * USEC_PER_MINUTE;
68         m->idle_action = HANDLE_IGNORE;
69         m->idle_action_not_before_usec = now(CLOCK_MONOTONIC);
70
71         m->devices = hashmap_new(string_hash_func, string_compare_func);
72         m->seats = hashmap_new(string_hash_func, string_compare_func);
73         m->sessions = hashmap_new(string_hash_func, string_compare_func);
74         m->users = hashmap_new(trivial_hash_func, trivial_compare_func);
75         m->inhibitors = hashmap_new(string_hash_func, string_compare_func);
76         m->buttons = hashmap_new(string_hash_func, string_compare_func);
77
78         m->user_cgroups = hashmap_new(string_hash_func, string_compare_func);
79         m->session_cgroups = hashmap_new(string_hash_func, string_compare_func);
80
81         m->session_fds = hashmap_new(trivial_hash_func, trivial_compare_func);
82         m->inhibitor_fds = hashmap_new(trivial_hash_func, trivial_compare_func);
83         m->button_fds = hashmap_new(trivial_hash_func, trivial_compare_func);
84
85         if (!m->devices || !m->seats || !m->sessions || !m->users || !m->inhibitors || !m->buttons ||
86             !m->user_cgroups || !m->session_cgroups ||
87             !m->session_fds || !m->inhibitor_fds || !m->button_fds) {
88                 manager_free(m);
89                 return NULL;
90         }
91
92         m->reset_controllers = strv_new("cpu", NULL);
93         m->kill_exclude_users = strv_new("root", NULL);
94         if (!m->reset_controllers || !m->kill_exclude_users) {
95                 manager_free(m);
96                 return NULL;
97         }
98
99         m->udev = udev_new();
100         if (!m->udev) {
101                 manager_free(m);
102                 return NULL;
103         }
104
105         if (cg_get_user_path(&m->cgroup_path) < 0) {
106                 manager_free(m);
107                 return NULL;
108         }
109
110         return m;
111 }
112
113 void manager_free(Manager *m) {
114         Session *session;
115         User *u;
116         Device *d;
117         Seat *s;
118         Inhibitor *i;
119         Button *b;
120
121         assert(m);
122
123         while ((session = hashmap_first(m->sessions)))
124                 session_free(session);
125
126         while ((u = hashmap_first(m->users)))
127                 user_free(u);
128
129         while ((d = hashmap_first(m->devices)))
130                 device_free(d);
131
132         while ((s = hashmap_first(m->seats)))
133                 seat_free(s);
134
135         while ((i = hashmap_first(m->inhibitors)))
136                 inhibitor_free(i);
137
138         while ((b = hashmap_first(m->buttons)))
139                 button_free(b);
140
141         hashmap_free(m->devices);
142         hashmap_free(m->seats);
143         hashmap_free(m->sessions);
144         hashmap_free(m->users);
145         hashmap_free(m->inhibitors);
146         hashmap_free(m->buttons);
147
148         hashmap_free(m->user_cgroups);
149         hashmap_free(m->session_cgroups);
150
151         hashmap_free(m->session_fds);
152         hashmap_free(m->inhibitor_fds);
153         hashmap_free(m->button_fds);
154
155         if (m->console_active_fd >= 0)
156                 close_nointr_nofail(m->console_active_fd);
157
158         if (m->udev_seat_monitor)
159                 udev_monitor_unref(m->udev_seat_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);
164
165         if (m->udev)
166                 udev_unref(m->udev);
167
168         if (m->bus) {
169                 dbus_connection_flush(m->bus);
170                 dbus_connection_close(m->bus);
171                 dbus_connection_unref(m->bus);
172         }
173
174         if (m->bus_fd >= 0)
175                 close_nointr_nofail(m->bus_fd);
176
177         if (m->epoll_fd >= 0)
178                 close_nointr_nofail(m->epoll_fd);
179
180         if (m->reserve_vt_fd >= 0)
181                 close_nointr_nofail(m->reserve_vt_fd);
182
183         if (m->idle_action_fd >= 0)
184                 close_nointr_nofail(m->idle_action_fd);
185
186         strv_free(m->controllers);
187         strv_free(m->reset_controllers);
188         strv_free(m->kill_only_users);
189         strv_free(m->kill_exclude_users);
190
191         free(m->action_job);
192
193         free(m->cgroup_path);
194         free(m);
195 }
196
197 int manager_add_device(Manager *m, const char *sysfs, Device **_device) {
198         Device *d;
199
200         assert(m);
201         assert(sysfs);
202
203         d = hashmap_get(m->devices, sysfs);
204         if (d) {
205                 if (_device)
206                         *_device = d;
207
208                 return 0;
209         }
210
211         d = device_new(m, sysfs);
212         if (!d)
213                 return -ENOMEM;
214
215         if (_device)
216                 *_device = d;
217
218         return 0;
219 }
220
221 int manager_add_seat(Manager *m, const char *id, Seat **_seat) {
222         Seat *s;
223
224         assert(m);
225         assert(id);
226
227         s = hashmap_get(m->seats, id);
228         if (s) {
229                 if (_seat)
230                         *_seat = s;
231
232                 return 0;
233         }
234
235         s = seat_new(m, id);
236         if (!s)
237                 return -ENOMEM;
238
239         if (_seat)
240                 *_seat = s;
241
242         return 0;
243 }
244
245 int manager_add_session(Manager *m, User *u, const char *id, Session **_session) {
246         Session *s;
247
248         assert(m);
249         assert(id);
250
251         s = hashmap_get(m->sessions, id);
252         if (s) {
253                 if (_session)
254                         *_session = s;
255
256                 return 0;
257         }
258
259         s = session_new(m, u, id);
260         if (!s)
261                 return -ENOMEM;
262
263         if (_session)
264                 *_session = s;
265
266         return 0;
267 }
268
269 int manager_add_user(Manager *m, uid_t uid, gid_t gid, const char *name, User **_user) {
270         User *u;
271
272         assert(m);
273         assert(name);
274
275         u = hashmap_get(m->users, ULONG_TO_PTR((unsigned long) uid));
276         if (u) {
277                 if (_user)
278                         *_user = u;
279
280                 return 0;
281         }
282
283         u = user_new(m, uid, gid, name);
284         if (!u)
285                 return -ENOMEM;
286
287         if (_user)
288                 *_user = u;
289
290         return 0;
291 }
292
293 int manager_add_user_by_name(Manager *m, const char *name, User **_user) {
294         uid_t uid;
295         gid_t gid;
296         int r;
297
298         assert(m);
299         assert(name);
300
301         r = get_user_creds(&name, &uid, &gid, NULL, NULL);
302         if (r < 0)
303                 return r;
304
305         return manager_add_user(m, uid, gid, name, _user);
306 }
307
308 int manager_add_user_by_uid(Manager *m, uid_t uid, User **_user) {
309         struct passwd *p;
310
311         assert(m);
312
313         errno = 0;
314         p = getpwuid(uid);
315         if (!p)
316                 return errno ? -errno : -ENOENT;
317
318         return manager_add_user(m, uid, p->pw_gid, p->pw_name, _user);
319 }
320
321 int manager_add_inhibitor(Manager *m, const char* id, Inhibitor **_inhibitor) {
322         Inhibitor *i;
323
324         assert(m);
325         assert(id);
326
327         i = hashmap_get(m->inhibitors, id);
328         if (i) {
329                 if (_inhibitor)
330                         *_inhibitor = i;
331
332                 return 0;
333         }
334
335         i = inhibitor_new(m, id);
336         if (!i)
337                 return -ENOMEM;
338
339         if (_inhibitor)
340                 *_inhibitor = i;
341
342         return 0;
343 }
344
345 int manager_add_button(Manager *m, const char *name, Button **_button) {
346         Button *b;
347
348         assert(m);
349         assert(name);
350
351         b = hashmap_get(m->buttons, name);
352         if (b) {
353                 if (_button)
354                         *_button = b;
355
356                 return 0;
357         }
358
359         b = button_new(m, name);
360         if (!b)
361                 return -ENOMEM;
362
363         if (_button)
364                 *_button = b;
365
366         return 0;
367 }
368
369 int manager_process_seat_device(Manager *m, struct udev_device *d) {
370         Device *device;
371         int r;
372
373         assert(m);
374
375         if (streq_ptr(udev_device_get_action(d), "remove")) {
376
377                 device = hashmap_get(m->devices, udev_device_get_syspath(d));
378                 if (!device)
379                         return 0;
380
381                 seat_add_to_gc_queue(device->seat);
382                 device_free(device);
383
384         } else {
385                 const char *sn;
386                 Seat *seat;
387
388                 sn = udev_device_get_property_value(d, "ID_SEAT");
389                 if (isempty(sn))
390                         sn = "seat0";
391
392                 if (!seat_name_is_valid(sn)) {
393                         log_warning("Device with invalid seat name %s found, ignoring.", sn);
394                         return 0;
395                 }
396
397                 r = manager_add_device(m, udev_device_get_syspath(d), &device);
398                 if (r < 0)
399                         return r;
400
401                 r = manager_add_seat(m, sn, &seat);
402                 if (r < 0) {
403                         if (!device->seat)
404                                 device_free(device);
405
406                         return r;
407                 }
408
409                 device_attach(device, seat);
410                 seat_start(seat);
411         }
412
413         return 0;
414 }
415
416 int manager_process_button_device(Manager *m, struct udev_device *d) {
417         Button *b;
418
419         int r;
420
421         assert(m);
422
423         if (streq_ptr(udev_device_get_action(d), "remove")) {
424
425                 b = hashmap_get(m->buttons, udev_device_get_sysname(d));
426                 if (!b)
427                         return 0;
428
429                 button_free(b);
430
431         } else {
432                 const char *sn;
433
434                 r = manager_add_button(m, udev_device_get_sysname(d), &b);
435                 if (r < 0)
436                         return r;
437
438                 sn = udev_device_get_property_value(d, "ID_SEAT");
439                 if (isempty(sn))
440                         sn = "seat0";
441
442                 button_set_seat(b, sn);
443                 button_open(b);
444         }
445
446         return 0;
447 }
448
449 int manager_enumerate_devices(Manager *m) {
450         struct udev_list_entry *item = NULL, *first = NULL;
451         struct udev_enumerate *e;
452         int r;
453
454         assert(m);
455
456         /* Loads devices from udev and creates seats for them as
457          * necessary */
458
459         e = udev_enumerate_new(m->udev);
460         if (!e) {
461                 r = -ENOMEM;
462                 goto finish;
463         }
464
465         r = udev_enumerate_add_match_tag(e, "master-of-seat");
466         if (r < 0)
467                 goto finish;
468
469         r = udev_enumerate_scan_devices(e);
470         if (r < 0)
471                 goto finish;
472
473         first = udev_enumerate_get_list_entry(e);
474         udev_list_entry_foreach(item, first) {
475                 struct udev_device *d;
476                 int k;
477
478                 d = udev_device_new_from_syspath(m->udev, udev_list_entry_get_name(item));
479                 if (!d) {
480                         r = -ENOMEM;
481                         goto finish;
482                 }
483
484                 k = manager_process_seat_device(m, d);
485                 udev_device_unref(d);
486
487                 if (k < 0)
488                         r = k;
489         }
490
491 finish:
492         if (e)
493                 udev_enumerate_unref(e);
494
495         return r;
496 }
497
498 int manager_enumerate_buttons(Manager *m) {
499         struct udev_list_entry *item = NULL, *first = NULL;
500         struct udev_enumerate *e;
501         int r;
502
503         assert(m);
504
505         /* Loads buttons from udev */
506
507         if (m->handle_power_key == HANDLE_IGNORE &&
508             m->handle_suspend_key == HANDLE_IGNORE &&
509             m->handle_hibernate_key == HANDLE_IGNORE &&
510             m->handle_lid_switch == HANDLE_IGNORE)
511                 return 0;
512
513         e = udev_enumerate_new(m->udev);
514         if (!e) {
515                 r = -ENOMEM;
516                 goto finish;
517         }
518
519         r = udev_enumerate_add_match_subsystem(e, "input");
520         if (r < 0)
521                 goto finish;
522
523         r = udev_enumerate_add_match_tag(e, "power-switch");
524         if (r < 0)
525                 goto finish;
526
527         r = udev_enumerate_scan_devices(e);
528         if (r < 0)
529                 goto finish;
530
531         first = udev_enumerate_get_list_entry(e);
532         udev_list_entry_foreach(item, first) {
533                 struct udev_device *d;
534                 int k;
535
536                 d = udev_device_new_from_syspath(m->udev, udev_list_entry_get_name(item));
537                 if (!d) {
538                         r = -ENOMEM;
539                         goto finish;
540                 }
541
542                 k = manager_process_button_device(m, d);
543                 udev_device_unref(d);
544
545                 if (k < 0)
546                         r = k;
547         }
548
549 finish:
550         if (e)
551                 udev_enumerate_unref(e);
552
553         return r;
554 }
555
556 int manager_enumerate_seats(Manager *m) {
557         DIR *d;
558         struct dirent *de;
559         int r = 0;
560
561         assert(m);
562
563         /* This loads data about seats stored on disk, but does not
564          * actually create any seats. Removes data of seats that no
565          * longer exist. */
566
567         d = opendir("/run/systemd/seats");
568         if (!d) {
569                 if (errno == ENOENT)
570                         return 0;
571
572                 log_error("Failed to open /run/systemd/seats: %m");
573                 return -errno;
574         }
575
576         while ((de = readdir(d))) {
577                 Seat *s;
578                 int k;
579
580                 if (!dirent_is_file(de))
581                         continue;
582
583                 s = hashmap_get(m->seats, de->d_name);
584                 if (!s) {
585                         unlinkat(dirfd(d), de->d_name, 0);
586                         continue;
587                 }
588
589                 k = seat_load(s);
590                 if (k < 0)
591                         r = k;
592         }
593
594         closedir(d);
595
596         return r;
597 }
598
599 static int manager_enumerate_users_from_cgroup(Manager *m) {
600         int r = 0, k;
601         char *name;
602         DIR *d;
603
604         r = cg_enumerate_subgroups(SYSTEMD_CGROUP_CONTROLLER, m->cgroup_path, &d);
605         if (r < 0) {
606                 if (r == -ENOENT)
607                         return 0;
608
609                 log_error("Failed to open %s: %s", m->cgroup_path, strerror(-r));
610                 return r;
611         }
612
613         while ((k = cg_read_subgroup(d, &name)) > 0) {
614                 User *user;
615
616                 k = manager_add_user_by_name(m, name, &user);
617                 if (k < 0) {
618                         free(name);
619                         r = k;
620                         continue;
621                 }
622
623                 user_add_to_gc_queue(user);
624
625                 if (!user->cgroup_path)
626                         if (asprintf(&user->cgroup_path, "%s/%s", m->cgroup_path, name) < 0) {
627                                 r = -ENOMEM;
628                                 free(name);
629                                 break;
630                         }
631
632                 free(name);
633         }
634
635         if (r >= 0 && k < 0)
636                 r = k;
637
638         closedir(d);
639
640         return r;
641 }
642
643 static int manager_enumerate_linger_users(Manager *m) {
644         DIR *d;
645         struct dirent *de;
646         int r = 0;
647
648         d = opendir("/var/lib/systemd/linger");
649         if (!d) {
650                 if (errno == ENOENT)
651                         return 0;
652
653                 log_error("Failed to open /var/lib/systemd/linger/: %m");
654                 return -errno;
655         }
656
657         while ((de = readdir(d))) {
658                 int k;
659
660                 if (!dirent_is_file(de))
661                         continue;
662
663                 k = manager_add_user_by_name(m, de->d_name, NULL);
664                 if (k < 0) {
665                         log_notice("Couldn't add lingering user %s: %s", de->d_name, strerror(-k));
666                         r = k;
667                 }
668         }
669
670         closedir(d);
671
672         return r;
673 }
674
675 int manager_enumerate_users(Manager *m) {
676         DIR *d;
677         struct dirent *de;
678         int r, k;
679
680         assert(m);
681
682         /* First, enumerate user cgroups */
683         r = manager_enumerate_users_from_cgroup(m);
684
685         /* Second, add lingering users on top */
686         k = manager_enumerate_linger_users(m);
687         if (k < 0)
688                 r = k;
689
690         /* Third, read in user data stored on disk */
691         d = opendir("/run/systemd/users");
692         if (!d) {
693                 if (errno == ENOENT)
694                         return 0;
695
696                 log_error("Failed to open /run/systemd/users: %m");
697                 return -errno;
698         }
699
700         while ((de = readdir(d))) {
701                 uid_t uid;
702                 User *u;
703
704                 if (!dirent_is_file(de))
705                         continue;
706
707                 k = parse_uid(de->d_name, &uid);
708                 if (k < 0) {
709                         log_error("Failed to parse file name %s: %s", de->d_name, strerror(-k));
710                         continue;
711                 }
712
713                 u = hashmap_get(m->users, ULONG_TO_PTR(uid));
714                 if (!u) {
715                         unlinkat(dirfd(d), de->d_name, 0);
716                         continue;
717                 }
718
719                 k = user_load(u);
720                 if (k < 0)
721                         r = k;
722         }
723
724         closedir(d);
725
726         return r;
727 }
728
729 static int manager_enumerate_sessions_from_cgroup(Manager *m) {
730         User *u;
731         Iterator i;
732         int r = 0;
733
734         HASHMAP_FOREACH(u, m->users, i) {
735                 DIR *d;
736                 char *name;
737                 int k;
738
739                 if (!u->cgroup_path)
740                         continue;
741
742                 k = cg_enumerate_subgroups(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, &d);
743                 if (k < 0) {
744                         if (k == -ENOENT)
745                                 continue;
746
747                         log_error("Failed to open %s: %s", u->cgroup_path, strerror(-k));
748                         r = k;
749                         continue;
750                 }
751
752                 while ((k = cg_read_subgroup(d, &name)) > 0) {
753                         Session *session;
754
755                         if (streq(name, "shared"))
756                                 continue;
757
758                         k = manager_add_session(m, u, name, &session);
759                         if (k < 0) {
760                                 free(name);
761                                 break;
762                         }
763
764                         session_add_to_gc_queue(session);
765
766                         if (!session->cgroup_path)
767                                 if (asprintf(&session->cgroup_path, "%s/%s", u->cgroup_path, name) < 0) {
768                                         k = -ENOMEM;
769                                         free(name);
770                                         break;
771                                 }
772
773                         free(name);
774                 }
775
776                 closedir(d);
777
778                 if (k < 0)
779                         r = k;
780         }
781
782         return r;
783 }
784
785 int manager_enumerate_sessions(Manager *m) {
786         DIR *d;
787         struct dirent *de;
788         int r = 0;
789
790         assert(m);
791
792         /* First enumerate session cgroups */
793         r = manager_enumerate_sessions_from_cgroup(m);
794
795         /* Second, read in session data stored on disk */
796         d = opendir("/run/systemd/sessions");
797         if (!d) {
798                 if (errno == ENOENT)
799                         return 0;
800
801                 log_error("Failed to open /run/systemd/sessions: %m");
802                 return -errno;
803         }
804
805         while ((de = readdir(d))) {
806                 struct Session *s;
807                 int k;
808
809                 if (!dirent_is_file(de))
810                         continue;
811
812                 s = hashmap_get(m->sessions, de->d_name);
813                 if (!s) {
814                         unlinkat(dirfd(d), de->d_name, 0);
815                         continue;
816                 }
817
818                 k = session_load(s);
819                 if (k < 0)
820                         r = k;
821         }
822
823         closedir(d);
824
825         return r;
826 }
827
828 int manager_enumerate_inhibitors(Manager *m) {
829         DIR *d;
830         struct dirent *de;
831         int r = 0;
832
833         assert(m);
834
835         d = opendir("/run/systemd/inhibit");
836         if (!d) {
837                 if (errno == ENOENT)
838                         return 0;
839
840                 log_error("Failed to open /run/systemd/inhibit: %m");
841                 return -errno;
842         }
843
844         while ((de = readdir(d))) {
845                 int k;
846                 Inhibitor *i;
847
848                 if (!dirent_is_file(de))
849                         continue;
850
851                 k = manager_add_inhibitor(m, de->d_name, &i);
852                 if (k < 0) {
853                         log_notice("Couldn't add inhibitor %s: %s", de->d_name, strerror(-k));
854                         r = k;
855                         continue;
856                 }
857
858                 k = inhibitor_load(i);
859                 if (k < 0)
860                         r = k;
861         }
862
863         closedir(d);
864
865         return r;
866 }
867
868 int manager_dispatch_seat_udev(Manager *m) {
869         struct udev_device *d;
870         int r;
871
872         assert(m);
873
874         d = udev_monitor_receive_device(m->udev_seat_monitor);
875         if (!d)
876                 return -ENOMEM;
877
878         r = manager_process_seat_device(m, d);
879         udev_device_unref(d);
880
881         return r;
882 }
883
884 int manager_dispatch_vcsa_udev(Manager *m) {
885         struct udev_device *d;
886         int r = 0;
887         const char *name;
888
889         assert(m);
890
891         d = udev_monitor_receive_device(m->udev_vcsa_monitor);
892         if (!d)
893                 return -ENOMEM;
894
895         name = udev_device_get_sysname(d);
896
897         /* Whenever a VCSA device is removed try to reallocate our
898          * VTs, to make sure our auto VTs never go away. */
899
900         if (name && startswith(name, "vcsa") && streq_ptr(udev_device_get_action(d), "remove"))
901                 r = seat_preallocate_vts(m->vtconsole);
902
903         udev_device_unref(d);
904
905         return r;
906 }
907
908 int manager_dispatch_button_udev(Manager *m) {
909         struct udev_device *d;
910         int r;
911
912         assert(m);
913
914         d = udev_monitor_receive_device(m->udev_button_monitor);
915         if (!d)
916                 return -ENOMEM;
917
918         r = manager_process_button_device(m, d);
919         udev_device_unref(d);
920
921         return r;
922 }
923
924 int manager_dispatch_console(Manager *m) {
925         assert(m);
926
927         if (m->vtconsole)
928                 seat_read_active_vt(m->vtconsole);
929
930         return 0;
931 }
932
933 static int vt_is_busy(int vtnr) {
934         struct vt_stat vt_stat;
935         int r = 0, fd;
936
937         assert(vtnr >= 1);
938
939         /* We explicitly open /dev/tty1 here instead of /dev/tty0. If
940          * we'd open the latter we'd open the foreground tty which
941          * hence would be unconditionally busy. By opening /dev/tty1
942          * we avoid this. Since tty1 is special and needs to be an
943          * explicitly loaded getty or DM this is safe. */
944
945         fd = open_terminal("/dev/tty1", O_RDWR|O_NOCTTY|O_CLOEXEC);
946         if (fd < 0)
947                 return -errno;
948
949         if (ioctl(fd, VT_GETSTATE, &vt_stat) < 0)
950                 r = -errno;
951         else
952                 r = !!(vt_stat.v_state & (1 << vtnr));
953
954         close_nointr_nofail(fd);
955
956         return r;
957 }
958
959 int manager_spawn_autovt(Manager *m, int vtnr) {
960         int r;
961         char *name = NULL;
962         const char *mode = "fail";
963
964         assert(m);
965         assert(vtnr >= 1);
966
967         if ((unsigned) vtnr > m->n_autovts &&
968             (unsigned) vtnr != m->reserve_vt)
969                 return 0;
970
971         if ((unsigned) vtnr != m->reserve_vt) {
972                 /* If this is the reserved TTY, we'll start the getty
973                  * on it in any case, but otherwise only if it is not
974                  * busy. */
975
976                 r = vt_is_busy(vtnr);
977                 if (r < 0)
978                         return r;
979                 else if (r > 0)
980                         return -EBUSY;
981         }
982
983         if (asprintf(&name, "autovt@tty%i.service", vtnr) < 0) {
984                 log_error("Could not allocate service name.");
985                 r = -ENOMEM;
986                 goto finish;
987         }
988
989         r = bus_method_call_with_reply (
990                         m->bus,
991                         "org.freedesktop.systemd1",
992                         "/org/freedesktop/systemd1",
993                         "org.freedesktop.systemd1.Manager",
994                         "StartUnit",
995                         NULL,
996                         NULL,
997                         DBUS_TYPE_STRING, &name,
998                         DBUS_TYPE_STRING, &mode,
999                         DBUS_TYPE_INVALID);
1000
1001 finish:
1002         free(name);
1003
1004         return r;
1005 }
1006
1007 static int manager_reserve_vt(Manager *m) {
1008         _cleanup_free_ char *p = NULL;
1009
1010         assert(m);
1011
1012         if (m->reserve_vt <= 0)
1013                 return 0;
1014
1015         if (asprintf(&p, "/dev/tty%u", m->reserve_vt) < 0)
1016                 return log_oom();
1017
1018         m->reserve_vt_fd = open(p, O_RDWR|O_NOCTTY|O_CLOEXEC|O_NONBLOCK);
1019         if (m->reserve_vt_fd < 0) {
1020
1021                 /* Don't complain on VT-less systems */
1022                 if (errno != ENOENT)
1023                         log_warning("Failed to pin reserved VT: %m");
1024                 return -errno;
1025         }
1026
1027         return 0;
1028 }
1029
1030 int manager_get_session_by_cgroup(Manager *m, const char *cgroup, Session **session) {
1031         Session *s;
1032         char *p;
1033
1034         assert(m);
1035         assert(cgroup);
1036         assert(session);
1037
1038         s = hashmap_get(m->session_cgroups, cgroup);
1039         if (s) {
1040                 *session = s;
1041                 return 1;
1042         }
1043
1044         p = strdupa(cgroup);
1045
1046         for (;;) {
1047                 char *e;
1048
1049                 e = strrchr(p, '/');
1050                 if (!e || e == p) {
1051                         *session = NULL;
1052                         return 0;
1053                 }
1054
1055                 *e = 0;
1056
1057                 s = hashmap_get(m->session_cgroups, p);
1058                 if (s) {
1059                         *session = s;
1060                         return 1;
1061                 }
1062         }
1063 }
1064
1065 int manager_get_user_by_cgroup(Manager *m, const char *cgroup, User **user) {
1066         User *u;
1067         char *p;
1068
1069         assert(m);
1070         assert(cgroup);
1071         assert(user);
1072
1073         u = hashmap_get(m->user_cgroups, cgroup);
1074         if (u) {
1075                 *user = u;
1076                 return 1;
1077         }
1078
1079         p = strdupa(cgroup);
1080         if (!p)
1081                 return log_oom();
1082
1083         for (;;) {
1084                 char *e;
1085
1086                 e = strrchr(p, '/');
1087                 if (!e || e == p) {
1088                         *user = NULL;
1089                         return 0;
1090                 }
1091
1092                 *e = 0;
1093
1094                 u = hashmap_get(m->user_cgroups, p);
1095                 if (u) {
1096                         *user = u;
1097                         return 1;
1098                 }
1099         }
1100 }
1101
1102 int manager_get_session_by_pid(Manager *m, pid_t pid, Session **session) {
1103         _cleanup_free_ char *p = NULL;
1104         int r;
1105
1106         assert(m);
1107         assert(pid >= 1);
1108         assert(session);
1109
1110         r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &p);
1111         if (r < 0)
1112                 return r;
1113
1114         return manager_get_session_by_cgroup(m, p, session);
1115 }
1116
1117 void manager_cgroup_notify_empty(Manager *m, const char *cgroup) {
1118         Session *s;
1119         User *u;
1120         int r;
1121
1122         r = manager_get_session_by_cgroup(m, cgroup, &s);
1123         if (r > 0)
1124                 session_add_to_gc_queue(s);
1125
1126         r = manager_get_user_by_cgroup(m, cgroup, &u);
1127         if (r > 0)
1128                 user_add_to_gc_queue(u);
1129 }
1130
1131 static void manager_dispatch_other(Manager *m, int fd) {
1132         Session *s;
1133         Inhibitor *i;
1134         Button *b;
1135
1136         assert_se(m);
1137         assert_se(fd >= 0);
1138
1139         s = hashmap_get(m->session_fds, INT_TO_PTR(fd + 1));
1140         if (s) {
1141                 assert(s->fifo_fd == fd);
1142                 session_remove_fifo(s);
1143                 session_stop(s);
1144                 return;
1145         }
1146
1147         i = hashmap_get(m->inhibitor_fds, INT_TO_PTR(fd + 1));
1148         if (i) {
1149                 assert(i->fifo_fd == fd);
1150                 inhibitor_stop(i);
1151                 inhibitor_free(i);
1152                 return;
1153         }
1154
1155         b = hashmap_get(m->button_fds, INT_TO_PTR(fd + 1));
1156         if (b) {
1157                 assert(b->fd == fd);
1158                 button_process(b);
1159                 return;
1160         }
1161
1162         assert_not_reached("Got event for unknown fd");
1163 }
1164
1165 static int manager_connect_bus(Manager *m) {
1166         DBusError error;
1167         int r;
1168         struct epoll_event ev = {
1169                 .events = EPOLLIN,
1170                 .data.u32 = FD_BUS,
1171         };
1172
1173         assert(m);
1174         assert(!m->bus);
1175         assert(m->bus_fd < 0);
1176
1177         dbus_error_init(&error);
1178
1179         m->bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
1180         if (!m->bus) {
1181                 log_error("Failed to get system D-Bus connection: %s", bus_error_message(&error));
1182                 r = -ECONNREFUSED;
1183                 goto fail;
1184         }
1185
1186         if (!dbus_connection_register_object_path(m->bus, "/org/freedesktop/login1", &bus_manager_vtable, m) ||
1187             !dbus_connection_register_fallback(m->bus, "/org/freedesktop/login1/seat", &bus_seat_vtable, m) ||
1188             !dbus_connection_register_fallback(m->bus, "/org/freedesktop/login1/session", &bus_session_vtable, m) ||
1189             !dbus_connection_register_fallback(m->bus, "/org/freedesktop/login1/user", &bus_user_vtable, m) ||
1190             !dbus_connection_add_filter(m->bus, bus_message_filter, m, NULL)) {
1191                 r = log_oom();
1192                 goto fail;
1193         }
1194
1195         dbus_bus_add_match(m->bus,
1196                            "type='signal',"
1197                            "interface='org.freedesktop.systemd1.Agent',"
1198                            "member='Released',"
1199                            "path='/org/freedesktop/systemd1/agent'",
1200                            &error);
1201
1202         if (dbus_error_is_set(&error)) {
1203                 log_error("Failed to register match: %s", bus_error_message(&error));
1204                 r = -EIO;
1205                 goto fail;
1206         }
1207
1208         r = dbus_bus_request_name(m->bus, "org.freedesktop.login1", DBUS_NAME_FLAG_DO_NOT_QUEUE, &error);
1209         if (dbus_error_is_set(&error)) {
1210                 log_error("Failed to register name on bus: %s", bus_error_message(&error));
1211                 r = -EIO;
1212                 goto fail;
1213         }
1214
1215         if (r != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)  {
1216                 log_error("Failed to acquire name.");
1217                 r = -EEXIST;
1218                 goto fail;
1219         }
1220
1221         m->bus_fd = bus_loop_open(m->bus);
1222         if (m->bus_fd < 0) {
1223                 r = m->bus_fd;
1224                 goto fail;
1225         }
1226
1227         if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->bus_fd, &ev) < 0)
1228                 goto fail;
1229
1230         return 0;
1231
1232 fail:
1233         dbus_error_free(&error);
1234
1235         return r;
1236 }
1237
1238 static int manager_connect_console(Manager *m) {
1239         struct epoll_event ev = {
1240                 .events = 0,
1241                 .data.u32 = FD_CONSOLE,
1242         };
1243
1244         assert(m);
1245         assert(m->console_active_fd < 0);
1246
1247         /* On certain architectures (S390 and Xen, and containers),
1248            /dev/tty0 does not exist, so don't fail if we can't open
1249            it. */
1250         if (access("/dev/tty0", F_OK) < 0) {
1251                 m->console_active_fd = -1;
1252                 return 0;
1253         }
1254
1255         m->console_active_fd = open("/sys/class/tty/tty0/active", O_RDONLY|O_NOCTTY|O_CLOEXEC);
1256         if (m->console_active_fd < 0) {
1257
1258                 /* On some systems the device node /dev/tty0 may exist
1259                  * even though /sys/class/tty/tty0 does not. */
1260                 if (errno == ENOENT)
1261                         return 0;
1262
1263                 log_error("Failed to open /sys/class/tty/tty0/active: %m");
1264                 return -errno;
1265         }
1266
1267         if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->console_active_fd, &ev) < 0)
1268                 return -errno;
1269
1270         return 0;
1271 }
1272
1273 static int manager_connect_udev(Manager *m) {
1274         int r;
1275         struct epoll_event ev = {
1276                 .events = EPOLLIN,
1277                 .data.u32 = FD_SEAT_UDEV,
1278         };
1279
1280         assert(m);
1281         assert(!m->udev_seat_monitor);
1282         assert(!m->udev_vcsa_monitor);
1283         assert(!m->udev_button_monitor);
1284
1285         m->udev_seat_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
1286         if (!m->udev_seat_monitor)
1287                 return -ENOMEM;
1288
1289         r = udev_monitor_filter_add_match_tag(m->udev_seat_monitor, "master-of-seat");
1290         if (r < 0)
1291                 return r;
1292
1293         r = udev_monitor_enable_receiving(m->udev_seat_monitor);
1294         if (r < 0)
1295                 return r;
1296
1297         m->udev_seat_fd = udev_monitor_get_fd(m->udev_seat_monitor);
1298
1299         if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->udev_seat_fd, &ev) < 0)
1300                 return -errno;
1301
1302         /* Don't watch keys if nobody cares */
1303         if (m->handle_power_key != HANDLE_IGNORE ||
1304             m->handle_suspend_key != HANDLE_IGNORE ||
1305             m->handle_hibernate_key != HANDLE_IGNORE ||
1306             m->handle_lid_switch != HANDLE_IGNORE) {
1307
1308                 m->udev_button_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
1309                 if (!m->udev_button_monitor)
1310                         return -ENOMEM;
1311
1312                 r = udev_monitor_filter_add_match_tag(m->udev_button_monitor, "power-switch");
1313                 if (r < 0)
1314                         return r;
1315
1316                 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_button_monitor, "input", NULL);
1317                 if (r < 0)
1318                         return r;
1319
1320                 r = udev_monitor_enable_receiving(m->udev_button_monitor);
1321                 if (r < 0)
1322                         return r;
1323
1324                 m->udev_button_fd = udev_monitor_get_fd(m->udev_button_monitor);
1325
1326                 zero(ev);
1327                 ev.events = EPOLLIN;
1328                 ev.data.u32 = FD_BUTTON_UDEV;
1329                 if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->udev_button_fd, &ev) < 0)
1330                         return -errno;
1331         }
1332
1333         /* Don't bother watching VCSA devices, if nobody cares */
1334         if (m->n_autovts > 0 && m->console_active_fd >= 0) {
1335
1336                 m->udev_vcsa_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
1337                 if (!m->udev_vcsa_monitor)
1338                         return -ENOMEM;
1339
1340                 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_vcsa_monitor, "vc", NULL);
1341                 if (r < 0)
1342                         return r;
1343
1344                 r = udev_monitor_enable_receiving(m->udev_vcsa_monitor);
1345                 if (r < 0)
1346                         return r;
1347
1348                 m->udev_vcsa_fd = udev_monitor_get_fd(m->udev_vcsa_monitor);
1349
1350                 zero(ev);
1351                 ev.events = EPOLLIN;
1352                 ev.data.u32 = FD_VCSA_UDEV;
1353                 if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->udev_vcsa_fd, &ev) < 0)
1354                         return -errno;
1355         }
1356
1357         return 0;
1358 }
1359
1360 void manager_gc(Manager *m, bool drop_not_started) {
1361         Seat *seat;
1362         Session *session;
1363         User *user;
1364
1365         assert(m);
1366
1367         while ((seat = m->seat_gc_queue)) {
1368                 LIST_REMOVE(Seat, gc_queue, m->seat_gc_queue, seat);
1369                 seat->in_gc_queue = false;
1370
1371                 if (seat_check_gc(seat, drop_not_started) == 0) {
1372                         seat_stop(seat);
1373                         seat_free(seat);
1374                 }
1375         }
1376
1377         while ((session = m->session_gc_queue)) {
1378                 LIST_REMOVE(Session, gc_queue, m->session_gc_queue, session);
1379                 session->in_gc_queue = false;
1380
1381                 if (session_check_gc(session, drop_not_started) == 0) {
1382                         session_stop(session);
1383                         session_free(session);
1384                 }
1385         }
1386
1387         while ((user = m->user_gc_queue)) {
1388                 LIST_REMOVE(User, gc_queue, m->user_gc_queue, user);
1389                 user->in_gc_queue = false;
1390
1391                 if (user_check_gc(user, drop_not_started) == 0) {
1392                         user_stop(user);
1393                         user_free(user);
1394                 }
1395         }
1396 }
1397
1398 int manager_get_idle_hint(Manager *m, dual_timestamp *t) {
1399         Session *s;
1400         bool idle_hint;
1401         dual_timestamp ts = { 0, 0 };
1402         Iterator i;
1403
1404         assert(m);
1405
1406         idle_hint = !manager_is_inhibited(m, INHIBIT_IDLE, INHIBIT_BLOCK, t, false, false, 0);
1407
1408         HASHMAP_FOREACH(s, m->sessions, i) {
1409                 dual_timestamp k;
1410                 int ih;
1411
1412                 ih = session_get_idle_hint(s, &k);
1413                 if (ih < 0)
1414                         return ih;
1415
1416                 if (!ih) {
1417                         if (!idle_hint) {
1418                                 if (k.monotonic < ts.monotonic)
1419                                         ts = k;
1420                         } else {
1421                                 idle_hint = false;
1422                                 ts = k;
1423                         }
1424                 } else if (idle_hint) {
1425
1426                         if (k.monotonic > ts.monotonic)
1427                                 ts = k;
1428                 }
1429         }
1430
1431         if (t)
1432                 *t = ts;
1433
1434         return idle_hint;
1435 }
1436
1437 int manager_dispatch_idle_action(Manager *m) {
1438         struct dual_timestamp since;
1439         struct itimerspec its = {};
1440         int r;
1441         usec_t n;
1442
1443         assert(m);
1444
1445         if (m->idle_action == HANDLE_IGNORE ||
1446             m->idle_action_usec <= 0) {
1447                 r = 0;
1448                 goto finish;
1449         }
1450
1451         n = now(CLOCK_MONOTONIC);
1452
1453         r = manager_get_idle_hint(m, &since);
1454         if (r <= 0)
1455                 /* Not idle. Let's check if after a timeout it might be idle then. */
1456                 timespec_store(&its.it_value, n + m->idle_action_usec);
1457         else {
1458                 /* Idle! Let's see if it's time to do something, or if
1459                  * we shall sleep for longer. */
1460
1461                 if (n >= since.monotonic + m->idle_action_usec &&
1462                     (m->idle_action_not_before_usec <= 0 || n >= m->idle_action_not_before_usec + m->idle_action_usec)) {
1463                         log_info("System idle. Taking action.");
1464
1465                         manager_handle_action(m, 0, m->idle_action, false, false);
1466                         m->idle_action_not_before_usec = n;
1467                 }
1468
1469                 timespec_store(&its.it_value, MAX(since.monotonic, m->idle_action_not_before_usec) + m->idle_action_usec);
1470         }
1471
1472         if (m->idle_action_fd < 0) {
1473                 struct epoll_event ev = {
1474                         .events = EPOLLIN,
1475                         .data.u32 = FD_IDLE_ACTION,
1476                 };
1477
1478                 m->idle_action_fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK|TFD_CLOEXEC);
1479                 if (m->idle_action_fd < 0) {
1480                         log_error("Failed to create idle action timer: %m");
1481                         r = -errno;
1482                         goto finish;
1483                 }
1484
1485                 if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->idle_action_fd, &ev) < 0) {
1486                         log_error("Failed to add idle action timer to epoll: %m");
1487                         r = -errno;
1488                         goto finish;
1489                 }
1490         }
1491
1492         if (timerfd_settime(m->idle_action_fd, TFD_TIMER_ABSTIME, &its, NULL) < 0) {
1493                 log_error("Failed to reset timerfd: %m");
1494                 r = -errno;
1495                 goto finish;
1496         }
1497
1498         return 0;
1499
1500 finish:
1501         if (m->idle_action_fd >= 0) {
1502                 close_nointr_nofail(m->idle_action_fd);
1503                 m->idle_action_fd = -1;
1504         }
1505
1506         return r;
1507 }
1508 int manager_startup(Manager *m) {
1509         int r;
1510         Seat *seat;
1511         Session *session;
1512         User *user;
1513         Inhibitor *inhibitor;
1514         Iterator i;
1515
1516         assert(m);
1517         assert(m->epoll_fd <= 0);
1518
1519         cg_shorten_controllers(m->reset_controllers);
1520         cg_shorten_controllers(m->controllers);
1521
1522         m->epoll_fd = epoll_create1(EPOLL_CLOEXEC);
1523         if (m->epoll_fd < 0)
1524                 return -errno;
1525
1526         /* Connect to console */
1527         r = manager_connect_console(m);
1528         if (r < 0)
1529                 return r;
1530
1531         /* Connect to udev */
1532         r = manager_connect_udev(m);
1533         if (r < 0)
1534                 return r;
1535
1536         /* Connect to the bus */
1537         r = manager_connect_bus(m);
1538         if (r < 0)
1539                 return r;
1540
1541         /* Instantiate magic seat 0 */
1542         r = manager_add_seat(m, "seat0", &m->vtconsole);
1543         if (r < 0)
1544                 return r;
1545
1546         /* Deserialize state */
1547         manager_enumerate_devices(m);
1548         manager_enumerate_seats(m);
1549         manager_enumerate_users(m);
1550         manager_enumerate_sessions(m);
1551         manager_enumerate_inhibitors(m);
1552         manager_enumerate_buttons(m);
1553
1554         /* Remove stale objects before we start them */
1555         manager_gc(m, false);
1556
1557         /* Reserve the special reserved VT */
1558         manager_reserve_vt(m);
1559
1560         /* And start everything */
1561         HASHMAP_FOREACH(seat, m->seats, i)
1562                 seat_start(seat);
1563
1564         HASHMAP_FOREACH(user, m->users, i)
1565                 user_start(user);
1566
1567         HASHMAP_FOREACH(session, m->sessions, i)
1568                 session_start(session);
1569
1570         HASHMAP_FOREACH(inhibitor, m->inhibitors, i)
1571                 inhibitor_start(inhibitor);
1572
1573         manager_dispatch_idle_action(m);
1574
1575         return 0;
1576 }
1577
1578 static int manager_recheck_buttons(Manager *m) {
1579         Iterator i;
1580         Button *b;
1581         int r = 0;
1582
1583         assert(m);
1584
1585         HASHMAP_FOREACH(b, m->buttons, i) {
1586                 int q;
1587
1588                 q = button_recheck(b);
1589                 if (q > 0)
1590                         return 1;
1591                 if (q < 0)
1592                         r = q;
1593         }
1594
1595         return r;
1596 }
1597
1598 int manager_run(Manager *m) {
1599         assert(m);
1600
1601         for (;;) {
1602                 struct epoll_event event;
1603                 int n;
1604                 int msec = -1;
1605
1606                 manager_gc(m, true);
1607
1608                 if (manager_dispatch_delayed(m) > 0)
1609                         continue;
1610
1611                 if (manager_recheck_buttons(m) > 0)
1612                         continue;
1613
1614                 if (dbus_connection_dispatch(m->bus) != DBUS_DISPATCH_COMPLETE)
1615                         continue;
1616
1617                 manager_gc(m, true);
1618
1619                 if (m->action_what != 0) {
1620                         usec_t x, y;
1621
1622                         x = now(CLOCK_MONOTONIC);
1623                         y = m->action_timestamp + m->inhibit_delay_max;
1624
1625                         msec = x >= y ? 0 : (int) ((y - x) / USEC_PER_MSEC);
1626                 }
1627
1628                 n = epoll_wait(m->epoll_fd, &event, 1, msec);
1629                 if (n < 0) {
1630                         if (errno == EINTR || errno == EAGAIN)
1631                                 continue;
1632
1633                         log_error("epoll() failed: %m");
1634                         return -errno;
1635                 }
1636
1637                 if (n == 0)
1638                         continue;
1639
1640                 switch (event.data.u32) {
1641
1642                 case FD_SEAT_UDEV:
1643                         manager_dispatch_seat_udev(m);
1644                         break;
1645
1646                 case FD_VCSA_UDEV:
1647                         manager_dispatch_vcsa_udev(m);
1648                         break;
1649
1650                 case FD_BUTTON_UDEV:
1651                         manager_dispatch_button_udev(m);
1652                         break;
1653
1654                 case FD_CONSOLE:
1655                         manager_dispatch_console(m);
1656                         break;
1657
1658                 case FD_IDLE_ACTION:
1659                         manager_dispatch_idle_action(m);
1660                         break;
1661
1662                 case FD_BUS:
1663                         bus_loop_dispatch(m->bus_fd);
1664                         break;
1665
1666                 default:
1667                         if (event.data.u32 >= FD_OTHER_BASE)
1668                                 manager_dispatch_other(m, event.data.u32 - FD_OTHER_BASE);
1669                 }
1670         }
1671
1672         return 0;
1673 }
1674
1675 static int manager_parse_config_file(Manager *m) {
1676         FILE *f;
1677         const char *fn;
1678         int r;
1679
1680         assert(m);
1681
1682         fn = "/etc/systemd/logind.conf";
1683         f = fopen(fn, "re");
1684         if (!f) {
1685                 if (errno == ENOENT)
1686                         return 0;
1687
1688                 log_warning("Failed to open configuration file %s: %m", fn);
1689                 return -errno;
1690         }
1691
1692         r = config_parse(fn, f, "Login\0", config_item_perf_lookup, (void*) logind_gperf_lookup, false, m);
1693         if (r < 0)
1694                 log_warning("Failed to parse configuration file: %s", strerror(-r));
1695
1696         fclose(f);
1697
1698         return r;
1699 }
1700
1701 int main(int argc, char *argv[]) {
1702         Manager *m = NULL;
1703         int r;
1704
1705         log_set_target(LOG_TARGET_AUTO);
1706         log_set_facility(LOG_AUTH);
1707         log_parse_environment();
1708         log_open();
1709
1710         umask(0022);
1711
1712         if (argc != 1) {
1713                 log_error("This program takes no arguments.");
1714                 r = -EINVAL;
1715                 goto finish;
1716         }
1717
1718         /* Always create the directories people can create inotify
1719          * watches in. Note that some applications might check for the
1720          * existence of /run/systemd/seats/ to determine whether
1721          * logind is available, so please always make sure this check
1722          * stays in. */
1723         mkdir_label("/run/systemd/seats", 0755);
1724         mkdir_label("/run/systemd/users", 0755);
1725         mkdir_label("/run/systemd/sessions", 0755);
1726
1727         m = manager_new();
1728         if (!m) {
1729                 r = log_oom();
1730                 goto finish;
1731         }
1732
1733         manager_parse_config_file(m);
1734
1735         r = manager_startup(m);
1736         if (r < 0) {
1737                 log_error("Failed to fully start up daemon: %s", strerror(-r));
1738                 goto finish;
1739         }
1740
1741         log_debug("systemd-logind running as pid %lu", (unsigned long) getpid());
1742
1743         sd_notify(false,
1744                   "READY=1\n"
1745                   "STATUS=Processing requests...");
1746
1747         r = manager_run(m);
1748
1749         log_debug("systemd-logind stopped as pid %lu", (unsigned long) getpid());
1750
1751 finish:
1752         sd_notify(false,
1753                   "STATUS=Shutting down...");
1754
1755         if (m)
1756                 manager_free(m);
1757
1758         return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
1759 }