#include "logind-action.h"
#include "musl_missing.h"
#include "sd-login.h"
-#include "stdio-util.h"
#include "virt.h"
static char **arg_property = NULL;
char *seat;
char *tty;
char *display;
- bool remote;
+ int remote;
char *remote_host;
char *remote_user;
char *service;
typedef struct UserStatusInfo {
uid_t uid;
- bool linger;
+ int linger;
char *name;
struct dual_timestamp timestamp;
char *state;
return 0;
}
-static int elogind_cancel_shutdown(sd_bus *bus, enum action a) {
+static int elogind_cancel_shutdown(sd_bus *bus) {
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
int r;
- static const char *table[_ACTION_MAX] = {
- [ACTION_REBOOT] = "The system reboot has been cancelled!",
- [ACTION_POWEROFF] = "The system shutdown has been cancelled!"
- };
-
- r = logind_set_wall_message(bus, table[a]);
-
- if (r < 0) {
- log_warning_errno(r, "Failed to set wall message, ignoring: %s",
- bus_error_message(&error, r));
- sd_bus_error_free(&error);
- }
r = sd_bus_call_method(
bus,
&error,
NULL, NULL);
if (r < 0)
- return log_warning_errno(r, "Failed to talk to logind, shutdown hasn't been cancelled: %s", bus_error_message(&error, r));
+ return log_warning_errno(r, "Failed to talk to elogind, shutdown hasn't been cancelled: %s", bus_error_message(&error, r));
return 0;
}
static int elogind_schedule_shutdown(sd_bus *bus, enum action a) {
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
const char *method = NULL;
- char date[FORMAT_TIMESTAMP_MAX];
- char sched_wall[128] = { 0x0 };
int r;
if (!bus)
return -EINVAL;
}
- xsprintf(sched_wall,
- "%s scheduled for %s, use 'loginctl -c' to cancel.",
- ACTION_POWEROFF == a ? "Shutdown" : "Reboot",
- format_timestamp(date, sizeof(date), arg_when));
- r = logind_set_wall_message(bus, sched_wall);
+ r = logind_set_wall_message(bus, NULL);
if (r < 0) {
log_warning_errno(r, "Failed to set wall message, ignoring: %s",
sd_bus_error_free(&error);
}
+ /* Now call elogind itself to request the operation */
r = sd_bus_call_method(
bus,
"org.freedesktop.login1",
if (c <= 0)
return 0;
- log_error("Please retry operation after closing inhibitors and logging out other users.\nAlternatively, ignore inhibitors and users with 'systemctl %s -i'.",
+ log_error("Please retry operation after closing inhibitors and logging out other users.\nAlternatively, ignore inhibitors and users with 'loginctl -i %s'.",
action_table[a].verb);
return -EPERM;
and the option to cancel it was set: */
if ( IN_SET(a, ACTION_POWEROFF, ACTION_REBOOT)
&& (arg_action == ACTION_CANCEL_SHUTDOWN) )
- return elogind_cancel_shutdown(bus, a);
+ return elogind_cancel_shutdown(bus);
r = check_inhibitors(bus, a);
if (r < 0)
" -o --output=STRING Change journal output mode (short, short-monotonic,\n"
" verbose, export, json, json-pretty, json-sse, cat)\n\n"
#endif // 0
- " -c Cancel a pending shutdown\n"
- " -i --ignore-inhibitors When shutting down or sleeping, ignore inhibitors\n"
+ " -c Cancel a pending shutdown or reboot\n"
+ " -i --ignore-inhibitors When shutting down or sleeping, ignore inhibitors\n"
"Session Commands:\n"
- " list-sessions List sessions\n"
- " session-status [ID...] Show session status\n"
- " show-session [ID...] Show properties of sessions or the manager\n"
- " activate [ID] Activate a session\n"
- " lock-session [ID...] Screen lock one or more sessions\n"
- " unlock-session [ID...] Screen unlock one or more sessions\n"
- " lock-sessions Screen lock all current sessions\n"
- " unlock-sessions Screen unlock all current sessions\n"
- " terminate-session ID... Terminate one or more sessions\n"
- " kill-session ID... Send signal to processes of a session\n\n"
+ " list-sessions List sessions\n"
+ " session-status [ID...] Show session status\n"
+ " show-session [ID...] Show properties of sessions or the manager\n"
+ " activate [ID] Activate a session\n"
+ " lock-session [ID...] Screen lock one or more sessions\n"
+ " unlock-session [ID...] Screen unlock one or more sessions\n"
+ " lock-sessions Screen lock all current sessions\n"
+ " unlock-sessions Screen unlock all current sessions\n"
+ " terminate-session ID... Terminate one or more sessions\n"
+ " kill-session ID... Send signal to processes of a session\n\n"
"User Commands:\n"
- " list-users List users\n"
- " user-status [USER...] Show user status\n"
- " show-user [USER...] Show properties of users or the manager\n"
- " enable-linger [USER...] Enable linger state of one or more users\n"
- " disable-linger [USER...] Disable linger state of one or more users\n"
- " terminate-user USER... Terminate all sessions of one or more users\n"
- " kill-user USER... Send signal to processes of a user\n\n"
+ " list-users List users\n"
+ " user-status [USER...] Show user status\n"
+ " show-user [USER...] Show properties of users or the manager\n"
+ " enable-linger [USER...] Enable linger state of one or more users\n"
+ " disable-linger [USER...] Disable linger state of one or more users\n"
+ " terminate-user USER... Terminate all sessions of one or more users\n"
+ " kill-user USER... Send signal to processes of a user\n\n"
"Seat Commands:\n"
- " list-seats List seats\n"
- " seat-status [NAME...] Show seat status\n"
- " show-seat [NAME...] Show properties of seats or the manager\n"
- " attach NAME DEVICE... Attach one or more devices to a seat\n"
- " flush-devices Flush all device associations\n"
- " terminate-seat NAME... Terminate all sessions on one or more seats\n"
+ " list-seats List seats\n"
+ " seat-status [NAME...] Show seat status\n"
+ " show-seat [NAME...] Show properties of seats or the manager\n"
+ " attach NAME DEVICE... Attach one or more devices to a seat\n"
+ " flush-devices Flush all device associations\n"
+ " terminate-seat NAME... Terminate all sessions on one or more seats\n"
"System Commands:\n"
- " poweroff Turn off the machine\n"
- " reboot Reboot the machine\n"
- " suspend Suspend the machine to memory\n"
- " hibernate Suspend the machine to disk\n"
- " hybrid-sleep Suspend the machine to memory and disk\n"
+ " poweroff [TIME] [WALL...] Turn off the machine\n"
+ " reboot [TIME] [WALL...] Reboot the machine\n"
+ " suspend Suspend the machine to memory\n"
+ " hibernate Suspend the machine to disk\n"
+ " hybrid-sleep Suspend the machine to memory and disk\n"
, program_invocation_short_name);
return 0;
};
if ((argc == optind) && (ACTION_CANCEL_SHUTDOWN == arg_action))
- return elogind_cancel_shutdown(bus, ACTION_POWEROFF);
+ return elogind_cancel_shutdown(bus);
return dispatch_verb(argc, argv, verbs, bus);
}
int main(int argc, char *argv[]) {
- _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
+ sd_bus *bus = NULL;
int r;
setlocale(LC_ALL, "");
r = loginctl_main(argc, argv, bus);
finish:
+ sd_bus_flush_close_unref(bus);
+
pager_close();
polkit_agent_close();