-
- if (handle == HANDLE_NO_SESSION) {
- if (hashmap_size(b->manager->sessions) > 0) {
- log_error("Refusing power-off, user is logged in.");
- warn_melody();
- return -EPERM;
- }
-
- } else if (handle == HANDLE_TTY_SESSION ||
- handle == HANDLE_ANY_SESSION) {
- unsigned n;
- Session *s;
-
- n = hashmap_size(b->manager->sessions);
- s = button_get_session(b);
-
- /* Silently ignore events of graphical sessions */
- if (handle == HANDLE_TTY_SESSION &&
- s && s->type == SESSION_X11)
- return 0;
-
- if (n > 1 || (n == 1 && !s)) {
- log_error("Refusing power-off, other user is logged in.");
- warn_melody();
- return -EPERM;
- }
-
- }
-
- if (handle != HANDLE_ALWAYS) {
- if (manager_is_inhibited(b->manager, INHIBIT_SHUTDOWN, INHIBIT_BLOCK, NULL)) {
- log_error("Refusing power-off, shutdown is inhibited.");
- warn_melody();
- return -EPERM;
- }
- }
-
- log_info("Powering off...");
-
- dbus_error_init(&error);
- r = bus_manager_shutdown_or_sleep_now_or_later(b->manager, SPECIAL_POWEROFF_TARGET, INHIBIT_SHUTDOWN, &error);
- if (r < 0) {
- log_error("Failed to power off: %s", bus_error_message(&error));
- dbus_error_free(&error);