Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
systemctl: simplify halt_main()
The code at this point is not able to tell whether it was called as
halt/poweroff/reboot or shutdown with time "now".
The code also takes a shortcut to skip logind if called as root.
That however means asking shutdown for immediate action won't trigger a
wall message.
As per #8424 (comment)
all commands should trigger a wall message.
That simplifies the code as we can try logind first always.
  • Loading branch information
lnussel committed Jan 25, 2022
1 parent 90b1ec0 commit adefc87
Showing 1 changed file with 19 additions and 28 deletions.
47 changes: 19 additions & 28 deletions src/systemctl/systemctl-compat-halt.c
Expand Up @@ -144,35 +144,23 @@ int halt_parse_argv(int argc, char *argv[]) {
int halt_main(void) {
int r;

r = logind_check_inhibitors(arg_action);
if (r < 0)
return r;

/* Delayed shutdown requested, and was successful */
if (arg_when > 0 && logind_schedule_shutdown() == 0)
return 0;

/* No delay, or logind failed or is not at all available */
if (geteuid() != 0) {
if (arg_dry_run || arg_force > 0) {
(void) must_be_root();
return -EPERM;
}
/* always try logind first */
if (arg_when > 0)
r = logind_schedule_shutdown();
else {
r = logind_check_inhibitors(arg_action);
if (r < 0)
return r;

/* Try logind if we are a normal user and no special mode applies. Maybe polkit allows us to
* shutdown the machine. */
if (IN_SET(arg_action, ACTION_POWEROFF, ACTION_REBOOT, ACTION_KEXEC, ACTION_HALT)) {
r = logind_reboot(arg_action);
if (r >= 0)
return r;
if (IN_SET(r, -EOPNOTSUPP, -EINPROGRESS))
/* Requested operation is not supported on the local system or already in
* progress */
return r;

/* on all other errors, try low-level operation */
}
r = logind_reboot(arg_action);
}
if (r >= 0)
return r;
if (IN_SET(r, -EOPNOTSUPP, -EINPROGRESS))
/* Requested operation is not supported on the local system or already in
* progress */
return r;
/* on all other errors, try low-level operation */

/* In order to minimize the difference between operation with and without logind, we explicitly
* enable non-blocking mode for this, as logind's shutdown operations are always non-blocking. */
Expand All @@ -181,7 +169,10 @@ int halt_main(void) {
if (!arg_dry_run && !arg_force)
return start_with_fallback();

assert(geteuid() == 0);
if (geteuid() != 0) {
(void) must_be_root();
return -EPERM;
}

if (!arg_no_wtmp) {
if (sd_booted() > 0)
Expand Down

0 comments on commit adefc87

Please sign in to comment.