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=e2550adb58edd045c713efd8315d831ba25bba01;hb=3beddc7861783347eb0aaf5fa492e8b2aef9e691;hpb=65491fd8c993a0e5cbc275613babcac98f4cd7bd;ds=sidebyside diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index e2550adb5..681ad8c21 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -1783,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 || @@ -5199,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;