X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fsystemctl%2Fsystemctl.c;h=681ad8c2116a0f6a8c12f22a88abbe47ad5b5544;hp=28bdfa96a4e06d9b9c393e7b3357dd96b28f79e8;hb=3beddc7861783347eb0aaf5fa492e8b2aef9e691;hpb=dce818b390a857a11f7dd634684500675cf79833 diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index 28bdfa96a..681ad8c21 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -67,7 +67,6 @@ static char **arg_property = NULL; static bool arg_all = false; static const char *arg_job_mode = "replace"; static UnitFileScope arg_scope = UNIT_FILE_SYSTEM; -static bool arg_immediate = false; static bool arg_no_block = false; static bool arg_no_legend = false; static bool arg_no_pager = false; @@ -1784,11 +1783,15 @@ static int start_special(DBusConnection *bus, char **args) { enum action a; int r; - assert(bus); assert(args); a = verb_to_action(args[0]); + if (arg_force >= 2 && geteuid() != 0) { + log_error("Must be root."); + return -EPERM; + } + if (arg_force >= 2 && (a == ACTION_HALT || a == ACTION_POWEROFF || @@ -2378,12 +2381,22 @@ static void print_status_info(UnitStatusInfo *i) { printf("\t CGroup: %s\n", i->default_control_group); if (arg_transport != TRANSPORT_SSH) { - if ((c = columns()) > 18) + unsigned k = 0; + pid_t extra[2]; + + c = columns(); + if (c > 18) c -= 18; else c = 0; - show_cgroup_by_path(i->default_control_group, "\t\t ", c, false); + if (i->main_pid > 0) + extra[k++] = i->main_pid; + + if (i->control_pid > 0) + extra[k++] = i->control_pid; + + show_cgroup_and_extra_by_spec(i->default_control_group, "\t\t ", c, false, arg_all, extra, k); } } @@ -4515,7 +4528,7 @@ static int halt_parse_argv(int argc, char *argv[]) { if (utmp_get_runlevel(&runlevel, NULL) >= 0) if (runlevel == '0' || runlevel == '6') - arg_immediate = true; + arg_force = 2; while ((c = getopt_long(argc, argv, "pfwdnih", options, NULL)) >= 0) { switch (c) { @@ -4538,7 +4551,7 @@ static int halt_parse_argv(int argc, char *argv[]) { break; case 'f': - arg_immediate = true; + arg_force = 2; break; case 'w': @@ -5190,7 +5203,9 @@ static int systemctl_main(DBusConnection *bus, int argc, char *argv[], DBusError return 0; } - if (!bus) { + if (((!streq(verbs[i].verb, "reboot") && + !streq(verbs[i].verb, "halt") && + !streq(verbs[i].verb, "reboot")) || arg_force <= 0) && !bus) { log_error("Failed to get D-Bus connection: %s", dbus_error_is_set(error) ? error->message : "No connection to service manager."); return -EIO; @@ -5340,7 +5355,7 @@ static int halt_main(DBusConnection *bus) { if (arg_when <= 0 && !arg_dry && - !arg_immediate && + !arg_force && (arg_action == ACTION_POWEROFF || arg_action == ACTION_REBOOT)) { r = reboot_with_logind(bus, arg_action); @@ -5377,7 +5392,7 @@ static int halt_main(DBusConnection *bus) { } } - if (!arg_dry && !arg_immediate) + if (!arg_dry && !arg_force) return start_with_fallback(bus); if (!arg_no_wtmp) {